craig-cli 0.20.0 → 0.20.1
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.
- package/dist/cli.js +141 -138
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`;await i.writeFile(o,"utf8"),await i.sync(),await i.close(),await
|
|
4
|
-
`)};var
|
|
5
|
-
`,"utf8")},
|
|
6
|
-
`).filter(i=>i.length>0).map(Wk);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Kk(n))return{path:e.logFile,lines:[],empty:!0};throw n}},$a=async(e,t)=>ni(e,{level:"error",component:"application",event:Vk(t.context),message:t.message,...t.details?{details:t.details}:{}}),tp=async(e,t)=>{try{await $a(e,t)}catch{}},np=ri,rp=async(e,t=Zu)=>ri(e,t);function Wk(e){try{let t=JSON.parse(e);if(!t.timestamp||!t.level||!t.component||!t.event||!t.message)return e;let n=[t.taskId,t.tabId].filter(Boolean).join("/");return`[${t.timestamp}] ${t.level.toUpperCase().padEnd(5)} ${t.component}.${t.event}${n?` ${n}`:""} \u2014 ${t.message}`}catch{return e}}function Vk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Kk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var pe={appendErrorLog:$a,appendErrorLogBestEffort:tp,appendLog:ni,appendLogBestEffort:ep,readLog:ri,readErrorLog:np,readRecentErrorLines:rp};function ap(e){let{commandTokens:t,options:n,help:r}=Hk(e);if(r)return ip({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Fr(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Na(o,"Repo path")};break;case"repo:list":Fr(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:se(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Na(o,"Workspace path")};break;case"workspace:list":a=Yk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:se(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:se(o,"File path")};break;case"task:new":a=Jk(o);break;case"task:create-child":a=Xk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:list":a=zk(o);break;case"task:current":Fr(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Na(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:se(o,"Task id")};break;case"task:pr":a=Qk(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);ii(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:si(o,1,"Task id"),repoId:si(o,2,"Repo id")};break;case"task:wait":a=iT(o);break;case"agent:list":Fr(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=tT(o);break;case"agent:send":a=nT(o);break;case"command:show":a={kind:"showPromptCommand",commandId:se(o,"Command id")};break;case"command:list":Fr(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:se(o,"Command id")};break;case"command:wait":a=rT(o);break;case"events:list":a=sp(o,!1);break;case"events:watch":a=sp(o,!0);break;case"fury:validate":a={kind:"validateFury",file:se(o,"Fury file")};break;case"fury:plan":a=oT(o);break;case"fury:approve":a={kind:"approveFury",planId:se(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:se(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:se(o,"Fury run id")};break;case"fury:watch":a=aT(o);break;case"fury:cancel":a={kind:"cancelFury",runId:se(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:se(o,"Fury run id")};break;case"fury:step":a=lT(o);break;case"fury:reviews":a=cT(o);break;case"fury:review":a=dT(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:se(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:se(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:se(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:se(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:se(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:si(o,0,"Task id"),repoId:si(o,1,"Repo id")},ii(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:se(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return ip(a,n)}function lp(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 Gk(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 Da(){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 Hk(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||!op(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==="--"||op(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 Yk(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 zk(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 Jk(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw I(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw I(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw I("Task option --repo may only be provided once.");t=M(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw I("Task option --workspace may only be provided once.");n=M(c,"Workspace id")}else{if(r!==void 0)throw I("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw I(u instanceof Error?u.message:"Unsupported runner.")}}}if(!t&&!n)throw I("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw I("Task creation accepts either '--repo' or '--workspace', not both.");let o=M(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Xk(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw I(`Unsupported task create-child option: ${c}`);o.push(c);continue}let u=e[l+1];if(u===void 0||u==="--")throw I(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw I("Task option --parent may only be provided once.");t=M(u,"Parent task id")}else if(c==="--repo"){if(n)throw I("Task option --repo may only be provided once.");n=M(u,"Repo id")}else if(c==="--workspace"){if(r)throw I("Task option --workspace may only be provided once.");r=M(u,"Workspace id")}else if(c==="--runner"){if(s)throw I("Task option --runner may only be provided once.");try{s=k.runners.parse(u)}catch(d){throw I(d instanceof Error?d.message:"Unsupported runner.")}}else{if(i)throw I("Task option --idempotency-key may only be provided once.");i=M(u,"Idempotency key")}}if(n&&r)throw I("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:M(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function Qk(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 _a=300*1e3,Zk=new Set(["idle","working","ready","error"]),eT=new Set(["queued","delivering","delivered","failed","cancelled"]);function tT(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 nT(e){let t,n,r="when-ready",s=_a,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=xa(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 rT(e){let t=M(e[0]??"","Command id"),n,r=_a,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=sT(a):r=xa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function sT(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!eT.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function sp(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 iT(e){let t,n,r,s=_a,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=uT(l):a==="--tab"?r=M(l,"Agent tab id"):s=xa(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 oT(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 aT(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 lT(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=Fa(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 cT(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=Fa(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 dT(e){let t=e[0],n=M(e[1]??"","Fury review id");if(t==="show")return ii(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw I("Unsupported fury review action.");let r=Fa(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 Fa(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 uT(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Zk.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function xa(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 ip(e,t){return{mode:"command",command:e,commandName:Gk(e),options:t}}function op(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Fr(e,t){ii(e,0,t)}function ii(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function se(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return M(e[0],t)}function Na(e,t){return M(e.join(" "),t)}function si(e,t,n){return M(e[t]??"",n)}function M(e,t){let n=e.trim();if(n.length===0)throw I(`${t} cannot be empty.`);return n}function I(e){return new g("CLI_USAGE",`${e}
|
|
2
|
+
var Ak=Object.defineProperty;var zs=(e,t)=>{for(var n in t)Ak(e,n,{get:t[n],enumerable:!0})};import{realpath as sO}from"node:fs/promises";import Te from"node:path";function Ne(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 Ed from"node:path";import{readFile as Kv}from"node:fs/promises";import{readFile as xk}from"node:fs/promises";import{randomUUID as Ek}from"node:crypto";import{chmod as Ok,open as $k,readFile as Nk,rename as _k,rm as Dk}from"node:fs/promises";import Ia from"node:path";async function q(e,t,n={}){let r=Ia.dirname(e),s=Ia.join(r,`.${Ia.basename(e)}.${process.pid}.${Date.now()}.${Ek()}.tmp`),i=await $k(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 _k(s,e),n.mode!==void 0&&await Ok(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await Dk(s,{force:!0}).catch(()=>{}),o}}async function Js(e){try{let t=await Nk(e,"utf8");return JSON.parse(t)}catch(t){if(Fk(t))return null;throw t}}function Fk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Vn(e){try{let t=await xk(e.uiStateFile,"utf8"),n=JSON.parse(t);return Lk(n,e.uiStateFile)}catch(t){if(Mk(t))return null;throw t}}async function yt(e,t){await q(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Qs(){return{version:1,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null,selectedPtyTabId:null,inputMode:"control",focusedRegion:"tasks",activeTab:"agent",inspectorSection:"task",inspectionMode:"files",openInspectionKind:null,selectedFileTreePath:null,selectedFilePath:null,selectedDiffPath:null,collapsedFileTreePaths:[],selectedActionId:"commit",updatedAt:new Date().toISOString()}}function Lk(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")||!Xs(e,"openInspectionKind")||!Xs(e,"selectedFileTreePath")||!Xs(e,"selectedFilePath")||!Xs(e,"selectedDiffPath")||!Uu(e,"collapsedFileTreePaths")||!wn(e,"ignoredUpdateVersion")||!Uu(e,"seenPreviewIds")||!wn(e,"selectedActionId")||!jk(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 Xs(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Uu(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 jk(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 va={};zs(va,{RUNNER_IDS:()=>me,STABLE_RUNNER_IDS:()=>wt,assertEnabled:()=>Vu,buildCommand:()=>Hu,getConfiguredProfile:()=>Zs,getDefault:()=>Wu,getDisplayName:()=>Gu,getEnabled:()=>ei,getProfile:()=>Kn,isRunnerType:()=>ti,parse:()=>Ku,setRunnerEnabled:()=>Yu,setRunnerPath:()=>zu});var wt=["codex","cursor","claude"],me=[...wt,"pi"];var Bu={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 Kn=e=>Bu[e];var Zs=(e,t={})=>{let n=Kn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var ei=(e={})=>me.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var Wu=(e={})=>{let t=ei(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 Vu=(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 ti=e=>me.includes(e);var Ku=e=>{if(!e||e.length===0)return"codex";if(!ti(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${me.join(", ")}.`);return e};var Gu=e=>Kn(e).displayName;var Hu=(e,t,n={})=>{let r=[Zs(e,n).executable];return t&&t.length>0&&r.push(t),r};var Yu=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var zu=(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 Ca={};zs(Ca,{PREVIEW_FEATURE_IDS:()=>kt,isEnabled:()=>Ju,setEnabled:()=>Xu});var kt=["agentOrchestration","piRunner","fileOpen","panelPolish"];function Ju(e,t){return e.previews?.[t]===!0}function Xu(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as qk,readFile as Uk,writeFile as Bk}from"node:fs/promises";import Wk from"node:path";var Vk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Qu=async e=>{try{return await Uk(e,"utf8")}catch(t){if(Vk(t))return null;throw t}},Zu=async(e,t)=>{await qk(Wk.dirname(e),{recursive:!0}),await Bk(e,t,"utf8")};var ni=(e,t)=>{if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!me.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${me.join(", ")}.`);if(typeof s!="object"||s===null||Array.isArray(s))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" must be an object.`);let i=s;if(i.enabled!==void 0&&typeof i.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${r}.enabled" must be a boolean.`);if(i.path!==void 0&&(typeof i.path!="string"||i.path.trim().length===0))throw new Error(`Craig config at ${t} is invalid. "runners.${r}.path" must be a non-empty string.`)}}if(n.checks!==void 0&&(typeof n.checks!="object"||n.checks===null||!Array.isArray(n.checks.commands)||!n.checks.commands.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "checks.commands" must be an array of strings.`);if(n.open!==void 0&&(typeof n.open!="object"||n.open===null||!Array.isArray(n.open.command)||!n.open.command.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "open.command" must be an array of strings.`);if(n.github!==void 0){if(typeof n.github!="object"||n.github===null)throw new Error(`Craig config at ${t} is invalid. "github" must be an object.`);if(n.github.mergeMethod!==void 0&&n.github.mergeMethod!=="merge"&&n.github.mergeMethod!=="rebase"&&n.github.mergeMethod!=="squash")throw new Error(`Craig config at ${t} is invalid. "github.mergeMethod" must be "merge", "rebase", or "squash".`);if(n.github.watchIntervalSeconds!==void 0&&(!Number.isInteger(n.github.watchIntervalSeconds)||n.github.watchIntervalSeconds<=0))throw new Error(`Craig config at ${t} is invalid. "github.watchIntervalSeconds" must be a positive integer.`)}if(n.previews!==void 0){if(typeof n.previews!="object"||n.previews===null||Array.isArray(n.previews))throw new Error(`Craig config at ${t} is invalid. "previews" must be an object.`);for(let[r,s]of Object.entries(n.previews))if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}return n};var Aa=async(e,t={readConfigFile:Qu})=>{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 ni(r,e.configFile)};var Ea=async(e,t,n={writeConfigFile:Zu})=>{ni(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`)};var $a={};zs($a,{checkForUpdate:()=>tp,getCurrent:()=>ri,isNewer:()=>Oa});var ri=()=>{try{return"0.20.1"}catch{return"unknown"}};var Kk="https://registry.npmjs.org/craig-cli/latest",Gk=3600*1e3,Hk={value:null},ep=/^\d+\.\d+\.\d+$/,Oa=(e,t)=>{if(!ep.test(e)||!ep.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},tp=async(e={fetch:globalThis.fetch,getCurrent:ri,cache:Hk})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Gk)return e.cache.value.result;let r=null;try{let i=await e.fetch(Kk,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&Oa(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:Aa,save:Ea,previews:Ca,runners:va,version:$a};var np={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=np[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function Na(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Yk,mkdir as zk,readFile as Jk}from"node:fs/promises";import Xk from"node:path";var rp=80,si=async(e,t)=>{await zk(Xk.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Yk(e.logFile,`${JSON.stringify(n)}
|
|
5
|
+
`,"utf8")},sp=async(e,t)=>{try{await si(e,t)}catch{}},ii=async(e,t=rp)=>{try{let s=(await Jk(e.logFile,"utf8")).trimEnd().split(`
|
|
6
|
+
`).filter(i=>i.length>0).map(Qk);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(eT(n))return{path:e.logFile,lines:[],empty:!0};throw n}},_a=async(e,t)=>si(e,{level:"error",component:"application",event:Zk(t.context),message:t.message,...t.details?{details:t.details}:{}}),ip=async(e,t)=>{try{await _a(e,t)}catch{}},op=ii,ap=async(e,t=rp)=>ii(e,t);function Qk(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 Zk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function eT(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var pe={appendErrorLog:_a,appendErrorLogBestEffort:ip,appendLog:si,appendLogBestEffort:sp,readLog:ii,readErrorLog:op,readRecentErrorLines:ap};function up(e){let{commandTokens:t,options:n,help:r}=nT(e);if(r)return cp({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Lr(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Da(o,"Repo path")};break;case"repo:list":Lr(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:se(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Da(o,"Workspace path")};break;case"workspace:list":a=rT(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:se(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:se(o,"File path")};break;case"task:new":a=iT(o);break;case"task:create-child":a=oT(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:list":a=sT(o);break;case"task:current":Lr(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Da(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:se(o,"Task id")};break;case"task:pr":a=aT(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);ai(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:oi(o,1,"Task id"),repoId:oi(o,2,"Repo id")};break;case"task:wait":a=mT(o);break;case"agent:list":Lr(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=dT(o);break;case"agent:send":a=uT(o);break;case"command:show":a={kind:"showPromptCommand",commandId:se(o,"Command id")};break;case"command:list":Lr(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:se(o,"Command id")};break;case"command:wait":a=pT(o);break;case"events:list":a=lp(o,!1);break;case"events:watch":a=lp(o,!0);break;case"fury:validate":a={kind:"validateFury",file:se(o,"Fury file")};break;case"fury:plan":a=hT(o);break;case"fury:approve":a={kind:"approveFury",planId:se(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:se(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:se(o,"Fury run id")};break;case"fury:watch":a=gT(o);break;case"fury:cancel":a={kind:"cancelFury",runId:se(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:se(o,"Fury run id")};break;case"fury:step":a=yT(o);break;case"fury:reviews":a=wT(o);break;case"fury:review":a=kT(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:se(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:se(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:se(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:se(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:se(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:oi(o,0,"Task id"),repoId:oi(o,1,"Repo id")},ai(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:se(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return cp(a,n)}function pp(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 tT(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 Fa(){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 nT(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||!dp(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==="--"||dp(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 rT(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 sT(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 iT(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw I(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw I(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw I("Task option --repo may only be provided once.");t=M(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw I("Task option --workspace may only be provided once.");n=M(c,"Workspace id")}else{if(r!==void 0)throw I("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw I(u instanceof Error?u.message:"Unsupported runner.")}}}if(!t&&!n)throw I("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw I("Task creation accepts either '--repo' or '--workspace', not both.");let o=M(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function oT(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw I(`Unsupported task create-child option: ${c}`);o.push(c);continue}let u=e[l+1];if(u===void 0||u==="--")throw I(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw I("Task option --parent may only be provided once.");t=M(u,"Parent task id")}else if(c==="--repo"){if(n)throw I("Task option --repo may only be provided once.");n=M(u,"Repo id")}else if(c==="--workspace"){if(r)throw I("Task option --workspace may only be provided once.");r=M(u,"Workspace id")}else if(c==="--runner"){if(s)throw I("Task option --runner may only be provided once.");try{s=k.runners.parse(u)}catch(d){throw I(d instanceof Error?d.message:"Unsupported runner.")}}else{if(i)throw I("Task option --idempotency-key may only be provided once.");i=M(u,"Idempotency key")}}if(n&&r)throw I("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:M(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function aT(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 xa=300*1e3,lT=new Set(["idle","working","ready","error"]),cT=new Set(["queued","delivering","delivered","failed","cancelled"]);function dT(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 uT(e){let t,n,r="when-ready",s=xa,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=Ma(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 pT(e){let t=M(e[0]??"","Command id"),n,r=xa,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=fT(a):r=Ma(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function fT(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!cT.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function lp(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 mT(e){let t,n,r,s=xa,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw I(`Unsupported task wait option: ${a}`);if(t!==void 0)throw I("task wait accepts at most one task id.");t=M(a,"Task id");continue}if(i.has(a))throw I(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw I(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=TT(l):a==="--tab"?r=M(l,"Agent tab id"):s=Ma(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 hT(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 gT(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 yT(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=La(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 wT(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=La(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 kT(e){let t=e[0],n=M(e[1]??"","Fury review id");if(t==="show")return ai(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=La(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 La(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw I(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw I(`Option ${s} requires a value.`);n.set(s,M(i,s))}return n}function TT(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!lT.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Ma(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 cp(e,t){return{mode:"command",command:e,commandName:tT(e),options:t}}function dp(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Lr(e,t){ai(e,0,t)}function ai(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function se(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return M(e[0],t)}function Da(e,t){return M(e.join(" "),t)}function oi(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
|
-
${Da()}`,{})}var Ge=(e,t)=>{let n=La(e);if(!fT(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},La=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:Ma(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:gT(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:mT(t.repoTargets),runnerSession:t.runnerSession??pT(t),checks:PT(t),lastCommit:t.lastCommit??null,prs:ST(t),artifacts:AT(t),cleanup:ET(t)}},pT=e=>{if(typeof e.title!="string")return null;let t=Ma(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},fT=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"&&dp(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||hT(t.repoTargets))&&wT(t.runnerSession)&&kT(t.prompt)&&up(t.checks)&&pp(t.lastCommit)&&bT(t.prs)&&RT(t.artifacts)&&mp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},mT=e=>{if(Array.isArray(e))return e.filter(cp)},hT=e=>Array.isArray(e)&&e.every(cp),cp=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)&&up(t.checks)&&pp(t.lastCommit)&&fp(t.pullRequest)&&mp(t.cleanup)},gT=e=>{if(dp(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 yT(e.id,e.title,t,Ma(e.runner))},yT=(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}]},Ma=e=>e&&k.runners.isRunnerType(e)?e:"codex",dp=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"),wT=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),kT=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",up=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"),pp=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",fp=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&TT(e.requiredChecks),TT=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)),bT=e=>Array.isArray(e)&&e.every(fp),RT=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),mp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),PT=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:hp(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:gp(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:hp(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:vT(t.reviewDecision),requiredChecks:gp(t.requiredChecks),comments:CT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},hp=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,vT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,CT=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}]}):[],gp=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})):[],AT=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},ET=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as fb}from"node:fs/promises";import{readFile as OT,readdir as $T,rm as NT}from"node:fs/promises";import yp from"node:path";var ja=(e,t)=>yp.join(e.workspacesDir,`${t}.json`),DT=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"):[]}},wp=(e,t)=>{let n=DT(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=ja(e,t);try{let r=await OT(n,"utf8");return wp(JSON.parse(r),n)}catch(r){throw _T(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(ja(e,t.id),{...t,updatedAt:new Date().toISOString()})},ve=async e=>{let t=await $T(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>kn(e,yp.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},kp=async(e,t)=>{await NT(ja(e,t),{force:!0})},_T=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as FT,readdir as xT,rm as LT}from"node:fs/promises";import Tp from"node:path";var qa=(e,t)=>Tp.join(e.reposDir,`${t}.json`),bp=(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=qa(e,t);try{let r=await FT(n,"utf8");return bp(JSON.parse(r),n)}catch(r){throw MT(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}},Ua=async(e,t)=>{await U(qa(e,t.id),{...t,updatedAt:new Date().toISOString()})},xr=async e=>{let t=await xT(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>xe(e,Tp.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},Rp=async(e,t)=>{await LT(qa(e,t),{force:!0})},MT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as jT}from"node:fs/promises";var qT=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Vn=(e,t,n)=>{if(!qT(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 jT(e.indexFile,"utf8");return Vn(JSON.parse(t),e.workspaceRoot,e.indexFile)},$t=async(e,t)=>{await U(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as KT,stat as GT}from"node:fs/promises";import Gn from"node:path";import{realpath as Ip}from"node:fs/promises";import oi from"node:path";import{execFile as UT}from"node:child_process";import{promisify as BT}from"node:util";var Pp=BT(UT);async function W(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(Sp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function Q(e,t,n={}){try{let r=await Pp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Sp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Sp(e){return e instanceof Error}var Ba=async e=>{try{let n=(await W("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Ip(n).catch(()=>oi.resolve(n)),Ip(e).catch(()=>oi.resolve(e))]);return r===s}catch{return!1}},Wa=async e=>{let t=await Q("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await Q("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await W("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},vp=async e=>{let t=await Q("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=oi.resolve(e,n);return oi.dirname(r)};import{mkdir as He,readFile as WT}from"node:fs/promises";var VT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Kn=async e=>{let t=$e(e);await He(t.craigDir,{recursive:!0}),await Promise.all([He(t.reposDir,{recursive:!0}),He(t.workspacesDir,{recursive:!0}),He(t.runtimeDir,{recursive:!0}),He(t.tasksDir,{recursive:!0}),He(t.jobsDir,{recursive:!0}),He(t.commandsDir,{recursive:!0}),He(t.eventsDir,{recursive:!0}),He(t.orchestrationDir,{recursive:!0}),He(t.logsDir,{recursive:!0}),He(t.artifactsDir,{recursive:!0}),He(t.worktreesDir,{recursive:!0})]);try{let s=await WT(t.indexFile,"utf8"),i=JSON.parse(s);return Vn(i,e,t.indexFile)}catch(s){if(!VT(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await U(t.indexFile,r),r};var Cp=(e,t,n)=>{let r=new Date().toISOString();return{id:HT(e,Gn.basename(t)),name:Gn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Ap=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},HT=(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},YT=(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},Ep=async(e,t)=>{let n=await Ne(e);await $t(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},zT=async(e,t)=>{let n=await KT(t,{withFileTypes:!0}),r=await xr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Gn.join(t,i.name);if(!await Ba(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Wa(o);s.push(a?Ap(a,l):Cp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},JT=async(e,t)=>{let n=await Wa(t),r=await xr(e),s=r.find(d=>d.rootPath===t)??null,i=s?Ap(s,n):Cp(r,t,n),o=`workspace_${i.id}`,l=(await ve(e)).find(d=>d.id===o)??null,c=new Date().toISOString(),u=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await Ua(e,i),l||await Tn(e,u),await Ep(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},XT=async(e,t)=>{let n=await zT(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=YT(r,Gn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Gn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>Ua(e,c))),await Tn(e,l),await Ep(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Lr=async(e,t)=>{await Kn(e.workspaceRoot);let n=Gn.resolve(e.workspaceRoot,t);if(!(await GT(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Ba(n)?JT(e,n):XT(e,n)};var Va=async(e,t,n={listWorkspaceRecords:ve,ensureCraigState:Kn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Ka=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 Ga=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:kp,readCraigIndex:Ne,writeCraigIndex:$t})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Ha=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 QT,realpath as Np,stat as ZT}from"node:fs/promises";import ai from"node:path";async function Ya(e){let t=await _p(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Op(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Op(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await $p(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await vp(t);if(r){let s=await $p(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 Op(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await _p(ai.resolve(n,e),s),o=await Dp(i);if(o)return{workspaceRoot:o,source:t,initialized:!0};if(r)return{workspaceRoot:i,source:t,initialized:!1};throw new g("WORKSPACE_CONTEXT_NOT_FOUND",`${s} ${i} is not an initialized Craig workspace.`,{details:{workspaceRoot:i,source:t}})}async function $p(e){let t=e;for(;;){let n=await Dp(t);if(n)return n;let r=ai.dirname(t);if(r===t)return null;t=r}}async function Dp(e){let t=$e(e);try{let n=await QT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Vn(r,s,t.indexFile);if(await Np(i.workspaceRoot).catch(()=>ai.resolve(i.workspaceRoot))!==e)throw new Error(`Craig index at ${t.indexFile} belongs to ${i.workspaceRoot}, not ${e}. Remove or repair the file before rerunning Craig.`);return i.workspaceRoot}catch(n){if(eb(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 _p(e,t){let n=ai.resolve(e);try{if(!(await ZT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Np(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 eb(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var za={};Hs(za,{addRepo:()=>Fp,listRegisteredRepos:()=>xp,removeRepo:()=>Lp});import tb from"node:path";import{stat as nb}from"node:fs/promises";var Fp=async(e,t)=>{let n=tb.resolve(e.workspaceRoot,t);if(!(await nb(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Lr(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var xp=async(e,t={listRepos:xr,ensureCraigState:Kn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Lp=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 Rp(e,t);let l=await Ne(e);return await $t(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var be={addWorkspace:Lr,listWorkspaces:Va,archiveWorkspace:Ka,restoreWorkspace:Ga,removeWorkspace:Ha,removeWorkspaceRecord:bn,resolveContext:Ya,repos:za};import{mkdir as Mp,readFile as rb,rm as ci,stat as sb,writeFile as ib}from"node:fs/promises";import li from"node:path";var ob=25,ab=3e4,lb=5e3;async function tt(e,t,n){let r=li.join(e.runtimeDir,"task-locks"),s=li.join(r,`${t}.lock`);await Mp(r,{recursive:!0});let i=Date.now();for(;;)try{await Mp(s);try{await ib(li.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ci(s,{recursive:!0,force:!0}),o}break}catch(o){if(!ub(o))throw o;if(await cb(s))continue;if(Date.now()-i>=ab)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await pb(ob)}try{return await n()}finally{await ci(s,{recursive:!0,force:!0})}}async function cb(e){let t=await rb(li.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return db(t.pid)?!1:(await ci(e,{recursive:!0,force:!0}),!0);let n=await sb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<lb?!1:(await ci(e,{recursive:!0,force:!0}),!0)}function db(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 ub=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",pb=e=>new Promise(t=>setTimeout(t,e));var Nt=async(e,t)=>{let n=await fb(di(e,t),"utf8");return JSON.parse(n)},Mr=async(e,t)=>{let n=await Nt(e,t);return Ge(n,di(e,t))},nt=async(e,t)=>{let n=jp(t);await U(di(e,t.id),n)},H=async(e,t,n)=>tt(e,t,async()=>{let r=await Mr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=jp(s);return await U(di(e,t),i),i}),Ja=async(e,t)=>{let n=await Ne(e);n.taskIds.includes(t)||await $t(e,{...n,taskIds:[...n.taskIds,t]})},di=(e,t)=>`${e.tasksDir}/${t}.json`,jp=e=>({...e,updatedAt:new Date().toISOString()});var Y=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Xt=e=>e.status==="merged"||e.status==="closed",Dt=(e,t)=>{let n=e.prs.findIndex(s=>Hn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Hn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),Rn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return pi(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},pi=e=>e.mergeable&&!mb(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),mb=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Xa=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),_t=(e,t,n)=>{let r=e.isDraft??!1,s=hb(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:gb(e.reviewDecision??null),requiredChecks:Qa(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:Tb(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}},hb=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,gb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Qa=e=>{let t=e.map(r=>yb(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||wb(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},yb=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:Up(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:kb(t)}:null},wb=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):ui(e)&&!ui(t)?!0:!ui(e)&&ui(t)?!1:qp(t.status)>=qp(e.status),ui=e=>e.conclusion?.toUpperCase()==="CANCELLED",qp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},kb=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},Tb=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(bb).filter(n=>n!==null).slice(-4):[]},bb=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=Rb(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},Rb=e=>e.replace(/\s+/g," ").trim(),Up=(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?Up(r,r):"unknown"};var Ye=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as Pb}from"node:fs/promises";import Bp from"node:path";var x=async(e,t,n={readRawTask:Nt,validateTaskRecord:Ge})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw Ab(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):Eb(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},we=async e=>{if(!await Za(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Yn=(e,t)=>t.artifacts.logPath?Bp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Bp.join(e.workspaceRoot,t.artifacts.logPath):null,jr=async(e,t)=>{let n=await Za(t.worktreePath),r=Yn(e,t),s=r?await Za(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:Sb(t),lastCommitSummary:Ib(t),prSummary:vb(t),cleanupSummary:Cb(t)}},Za=async e=>{try{return await Pb(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",vb=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
|
+
${Fa()}`,{})}var He=(e,t)=>{let n=ja(e);if(!RT(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},ja=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:qa(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:IT(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:PT(t.repoTargets),runnerSession:t.runnerSession??bT(t),checks:NT(t),lastCommit:t.lastCommit??null,prs:_T(t),artifacts:LT(t),cleanup:MT(t)}},bT=e=>{if(typeof e.title!="string")return null;let t=qa(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},RT=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&mp(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||ST(t.repoTargets))&&CT(t.runnerSession)&&AT(t.prompt)&&hp(t.checks)&&gp(t.lastCommit)&&OT(t.prs)&&$T(t.artifacts)&&wp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},PT=e=>{if(Array.isArray(e))return e.filter(fp)},ST=e=>Array.isArray(e)&&e.every(fp),fp=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)&&hp(t.checks)&&gp(t.lastCommit)&&yp(t.pullRequest)&&wp(t.cleanup)},IT=e=>{if(mp(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 vT(e.id,e.title,t,qa(e.runner))},vT=(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}]},qa=e=>e&&k.runners.isRunnerType(e)?e:"codex",mp=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"),CT=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),AT=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",hp=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"),gp=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",yp=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)),OT=e=>Array.isArray(e)&&e.every(yp),$T=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),wp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),NT=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},_T=e=>{if(Array.isArray(e.prs))return e.prs.map(DT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:kp(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Tp(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},DT=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:kp(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:FT(t.reviewDecision),requiredChecks:Tp(t.requiredChecks),comments:xT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},kp=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,FT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,xT=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}]}):[],Tp=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}},MT=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as Rb}from"node:fs/promises";import{readFile as jT,readdir as qT,rm as UT}from"node:fs/promises";import bp from"node:path";var Ua=(e,t)=>bp.join(e.workspacesDir,`${t}.json`),BT=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"):[]}},Rp=(e,t)=>{let n=BT(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=Ua(e,t);try{let r=await jT(n,"utf8");return Rp(JSON.parse(r),n)}catch(r){throw WT(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 q(Ua(e,t.id),{...t,updatedAt:new Date().toISOString()})},ve=async e=>{let t=await qT(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>kn(e,bp.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Pp=async(e,t)=>{await UT(Ua(e,t),{force:!0})},WT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as VT,readdir as KT,rm as GT}from"node:fs/promises";import Sp from"node:path";var Ba=(e,t)=>Sp.join(e.reposDir,`${t}.json`),Ip=(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},Me=async(e,t)=>{let n=Ba(e,t);try{let r=await VT(n,"utf8");return Ip(JSON.parse(r),n)}catch(r){throw HT(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}},Wa=async(e,t)=>{await q(Ba(e,t.id),{...t,updatedAt:new Date().toISOString()})},Mr=async e=>{let t=await KT(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Me(e,Sp.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},vp=async(e,t)=>{await GT(Ba(e,t),{force:!0})},HT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as YT}from"node:fs/promises";var zT=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"},Gn=(e,t,n)=>{if(!zT(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},_e=async e=>{let t=await YT(e.indexFile,"utf8");return Gn(JSON.parse(t),e.workspaceRoot,e.indexFile)},Nt=async(e,t)=>{await q(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as eb,stat as tb}from"node:fs/promises";import Yn from"node:path";import{realpath as Ep}from"node:fs/promises";import li from"node:path";import{execFile as JT}from"node:child_process";import{promisify as XT}from"node:util";var Cp=XT(JT);async function W(e,t,n={}){try{let r=await Cp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Ap(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function Q(e,t,n={}){try{let r=await Cp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Ap(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Ap(e){return e instanceof Error}var Va=async e=>{try{let n=(await W("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Ep(n).catch(()=>li.resolve(n)),Ep(e).catch(()=>li.resolve(e))]);return r===s}catch{return!1}},Ka=async e=>{let t=await Q("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await Q("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await W("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},Op=async e=>{let t=await Q("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=li.resolve(e,n);return li.dirname(r)};import{mkdir as Ye,readFile as QT}from"node:fs/promises";var ZT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Hn=async e=>{let t=Ne(e);await Ye(t.craigDir,{recursive:!0}),await Promise.all([Ye(t.reposDir,{recursive:!0}),Ye(t.workspacesDir,{recursive:!0}),Ye(t.runtimeDir,{recursive:!0}),Ye(t.tasksDir,{recursive:!0}),Ye(t.jobsDir,{recursive:!0}),Ye(t.commandsDir,{recursive:!0}),Ye(t.eventsDir,{recursive:!0}),Ye(t.orchestrationDir,{recursive:!0}),Ye(t.logsDir,{recursive:!0}),Ye(t.artifactsDir,{recursive:!0}),Ye(t.worktreesDir,{recursive:!0})]);try{let s=await QT(t.indexFile,"utf8"),i=JSON.parse(s);return Gn(i,e,t.indexFile)}catch(s){if(!ZT(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await q(t.indexFile,r),r};var $p=(e,t,n)=>{let r=new Date().toISOString();return{id:nb(e,Yn.basename(t)),name:Yn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Np=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},nb=(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},rb=(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},_p=async(e,t)=>{let n=await _e(e);await Nt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},sb=async(e,t)=>{let n=await eb(t,{withFileTypes:!0}),r=await Mr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Yn.join(t,i.name);if(!await Va(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Ka(o);s.push(a?Np(a,l):$p([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},ib=async(e,t)=>{let n=await Ka(t),r=await Mr(e),s=r.find(d=>d.rootPath===t)??null,i=s?Np(s,n):$p(r,t,n),o=`workspace_${i.id}`,l=(await ve(e)).find(d=>d.id===o)??null,c=new Date().toISOString(),u=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await Wa(e,i),l||await Tn(e,u),await _p(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},ob=async(e,t)=>{let n=await sb(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=rb(r,Yn.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:Yn.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=>Wa(e,c))),await Tn(e,l),await _p(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},jr=async(e,t)=>{await Hn(e.workspaceRoot);let n=Yn.resolve(e.workspaceRoot,t);if(!(await tb(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Va(n)?ib(e,n):ob(e,n)};var Ga=async(e,t,n={listWorkspaceRecords:ve,ensureCraigState:Hn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Ha=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 Ya=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:_e,writeCraigIndex:Nt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var za=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 ab,realpath as xp,stat as lb}from"node:fs/promises";import ci from"node:path";async function Ja(e){let t=await Mp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Dp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Dp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Fp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Op(t);if(r){let s=await Fp(r);if(s)return{workspaceRoot:s,source:"git_common_dir",initialized:!0}}if(e.allowUninitializedCwd)return{workspaceRoot:t,source:"cwd",initialized:!1};throw new g("WORKSPACE_CONTEXT_NOT_FOUND",`No Craig workspace was found from ${t}. Use --workspace-root <path> or run Craig inside an initialized workspace.`,{details:{cwd:t}})}async function Dp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Mp(ci.resolve(n,e),s),o=await Lp(i);if(o)return{workspaceRoot:o,source:t,initialized:!0};if(r)return{workspaceRoot:i,source:t,initialized:!1};throw new g("WORKSPACE_CONTEXT_NOT_FOUND",`${s} ${i} is not an initialized Craig workspace.`,{details:{workspaceRoot:i,source:t}})}async function Fp(e){let t=e;for(;;){let n=await Lp(t);if(n)return n;let r=ci.dirname(t);if(r===t)return null;t=r}}async function Lp(e){let t=Ne(e);try{let n=await ab(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Gn(r,s,t.indexFile);if(await xp(i.workspaceRoot).catch(()=>ci.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(cb(n))return null;throw n instanceof g?n:new g("WORKSPACE_CONTEXT_INVALID",n instanceof Error?n.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:n})}}async function Mp(e,t){let n=ci.resolve(e);try{if(!(await lb(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await xp(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 cb(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Xa={};zs(Xa,{addRepo:()=>jp,listRegisteredRepos:()=>qp,removeRepo:()=>Up});import db from"node:path";import{stat as ub}from"node:fs/promises";var jp=async(e,t)=>{let n=db.resolve(e.workspaceRoot,t);if(!(await ub(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await jr(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 qp=async(e,t={listRepos:Mr,ensureCraigState:Hn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Up=async(e,t,n)=>{let r=await Me(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 vp(e,t);let l=await _e(e);return await Nt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var be={addWorkspace:jr,listWorkspaces:Ga,archiveWorkspace:Ha,restoreWorkspace:Ya,removeWorkspace:za,removeWorkspaceRecord:bn,resolveContext:Ja,repos:Xa};import{mkdir as Bp,readFile as pb,rm as ui,stat as fb,writeFile as mb}from"node:fs/promises";import di from"node:path";var hb=25,gb=3e4,yb=5e3;async function De(e,t,n,r={}){let s=di.join(e.runtimeDir,"task-locks"),i=di.join(s,`${t}.lock`);await Bp(s,{recursive:!0});let o=Date.now();for(;;)try{await Bp(i);try{await mb(di.join(i,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(a){throw await ui(i,{recursive:!0,force:!0}),a}break}catch(a){if(!Tb(a))throw a;if(await wb(i))continue;if(Date.now()-o>=(r.timeoutMs??gb))throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await bb(hb)}try{return await n()}finally{await ui(i,{recursive:!0,force:!0})}}async function wb(e){let t=await pb(di.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return kb(t.pid)?!1:(await ui(e,{recursive:!0,force:!0}),!0);let n=await fb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<yb?!1:(await ui(e,{recursive:!0,force:!0}),!0)}function kb(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Tb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",bb=e=>new Promise(t=>setTimeout(t,e));var _t=async(e,t)=>{let n=await Rb(pi(e,t),"utf8");return JSON.parse(n)},qr=async(e,t)=>{let n=await _t(e,t);return He(n,pi(e,t))},nt=async(e,t)=>{let n=Wp(t);await q(pi(e,t.id),n)},H=async(e,t,n)=>De(e,t,async()=>{let r=await qr(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=Wp(s);return await q(pi(e,t),i),i}),Qa=async(e,t)=>{let n=await _e(e);n.taskIds.includes(t)||await Nt(e,{...n,taskIds:[...n.taskIds,t]})},pi=(e,t)=>`${e.tasksDir}/${t}.json`,Wp=e=>({...e,updatedAt:new Date().toISOString()});var Y=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Qt=e=>e.status==="merged"||e.status==="closed",Dt=(e,t)=>{let n=e.prs.findIndex(s=>zn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},zn=(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 mi(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},mi=e=>e.mergeable&&!Pb(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Pb=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Za=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Ft=(e,t,n)=>{let r=e.isDraft??!1,s=Sb(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:Ib(e.reviewDecision??null),requiredChecks:el(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}},Sb=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Ib=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,el=e=>{let t=e.map(r=>vb(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||Cb(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},vb=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=t.name??t.context,r=t.state??t.status??t.conclusion;return n?{name:n,status:Kp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:Ab(t)}:null},Cb=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):fi(e)&&!fi(t)?!0:!fi(e)&&fi(t)?!1:Vp(t.status)>=Vp(e.status),fi=e=>e.conclusion?.toUpperCase()==="CANCELLED",Vp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},Ab=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(Ob).filter(n=>n!==null).slice(-4):[]},Ob=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=$b(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},$b=e=>e.replace(/\s+/g," ").trim(),Kp=(e,t)=>{let n=e?.toUpperCase()??null,r=t?.toUpperCase()??null;return r==="SKIPPED"||n==="SKIPPED"?"skipped":n==="SUCCESS"||r==="SUCCESS"||r==="NEUTRAL"?"success":n==="PENDING"||n==="EXPECTED"||n==="IN_PROGRESS"||n==="QUEUED"||n==="REQUESTED"||n==="WAITING"?"pending":n==="FAILURE"||n==="FAILED"||n==="ERROR"||n==="TIMED_OUT"||n==="CANCELLED"||n==="ACTION_REQUIRED"||n==="STARTUP_FAILURE"||r==="FAILURE"||r==="FAILED"||r==="ERROR"||r==="TIMED_OUT"||r==="CANCELLED"||r==="ACTION_REQUIRED"||r==="STARTUP_FAILURE"?"failed":n==="COMPLETED"&&r===null?"unknown":n==="COMPLETED"&&r!==null?Kp(r,r):"unknown"};var ze=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as Nb}from"node:fs/promises";import Gp from"node:path";var x=async(e,t,n={readRawTask:_t,validateTaskRecord:He})=>{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}}):Mb(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},we=async e=>{if(!await tl(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Jn=(e,t)=>t.artifacts.logPath?Gp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Gp.join(e.workspaceRoot,t.artifacts.logPath):null,Ur=async(e,t)=>{let n=await tl(t.worktreePath),r=Jn(e,t),s=r?await tl(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:_b(t),lastCommitSummary:Db(t),prSummary:Fb(t),cleanupSummary:xb(t)}},tl=async e=>{try{return await Nb(e),!0}catch{return!1}},_b=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}`},Db=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",Fb=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let u=c.pullRequest.status??"unknown";return l[u]=(l[u]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
|
|
10
10
|
${i.join(`
|
|
11
|
-
`)}`}let t=Y(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},
|
|
12
|
-
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},
|
|
11
|
+
`)}`}let t=Y(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},xb=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",Mb=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var Br=async(e,t)=>{let n=await Q("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},nl=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await Q("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await jb(e,s);await W("git",["worktree","add","-b",t,n,o],{cwd:e})},jb=async(e,t)=>(await Q("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await Q("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await Q("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,hi=async e=>{let t=await Q("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},Hp=async e=>{await W("git",["add","-A"],{cwd:e})},Yp=async(e,t)=>{await W("git",["commit","-m",t],{cwd:e})},zp=async e=>{let t=await W("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 Q("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var gi=async(e,t)=>{await W("git",["worktree","remove","--force",t],{cwd:e})},Xp=async(e,t)=>{await W("git",["branch","-D",t],{cwd:e})};var rl=async e=>Xn(e,e.repoRoot),Xn=async(e,t)=>{let n=await _e(e),r=Qp(new Date),s=Zp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await Br(t,o))return i;s+=1}},Wr=async e=>{let t=await _e(e),n=Qp(new Date),r=Zp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Qp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Zp=(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 Vr=async(e,t,n={readRawTask:_t,validateTaskRecord:He})=>{let r=await _e(e),s=[],i=[];await Promise.all(r.taskIds.map(async l=>{try{let c=await n.readRawTask(e,l);s.push(n.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(qb(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}},qb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var ef=["merge_ready","pr_open","checked","review","running","draft"],sl=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),il=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(Ub)[0]?.id??null,Ub=(e,t)=>{let n=tf(e.status),r=tf(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},tf=e=>{let t=ef.indexOf(e);return t>=0?t:ef.length};import nf from"node:path";var Pn=(e,t)=>t?nf.isAbsolute(t)?t:nf.join(e.repoRoot,t):null;import{randomUUID as Bb}from"node:crypto";import{mkdir as Gr,rm as Wb,writeFile as yi}from"node:fs/promises";import J from"node:path";var Kr=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var rf=["AGENTS","md"].join("."),Qn=async(e,t,n,r={})=>{let s=await Me(e,t),[i,o]=await Promise.all([Yb(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Xn(e,s.rootPath)]),a=`craig/${o}`,l=J.join(e.worktreesDir,s.id,o),c=J.join(e.logsDir,`${o}.log`),u=J.join(e.artifactsDir,o);await Promise.all([Gr(J.dirname(l),{recursive:!0}),Gr(u,{recursive:!0}),yi(c,"","utf8")]);let d=Vb(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 Qa(e,o),await nl(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:d}},Hr=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 Qn(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 Wr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,u=J.join(e.craigDir,"task-bundles",o),d=J.join(e.logsDir,`${o}.log`),p=J.join(e.artifactsDir,o);await Gr(u,{recursive:!0}),await Gr(p,{recursive:!0}),await yi(d,"","utf8");let h=await Promise.all(i.map(b=>Me(e,b))),f=Gb(h),m=await Promise.all(h.map(b=>Kb(e,b,o,c,J.join(u,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await Wb(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 al({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:m,bundlePath:u});let T=Yr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Kr(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),...of(o,r.lineage),repoRoot:u,worktreePath:u,branch:c,bundlePath:u,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:J.relative(e.workspaceRoot,d),checkSummaryPath:J.relative(e.workspaceRoot,J.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:J.relative(e.workspaceRoot,J.join(p,"pr-status.json"))},cleanup:wi(),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 Qa(e,o),{repoId:y.repoId,repoRoot:u,workspaceId:s.id,task:R,bundlePath:u,repoTargets:m}},Yr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${Bb()}`}:{},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}]},Vb=(e,t)=>{let n=new Date().toISOString(),r=Yr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Kr(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...of(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:{...ll(J.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:J.relative(e.workspaceRoot,J.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:J.relative(e.workspaceRoot,J.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:J.relative(e.workspaceRoot,J.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:wi(),lastFailureReason:null,createdAt:n,updatedAt:n}},Kb=async(e,t,n,r,s)=>{try{return await ol(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:ll(J.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:sf(),cleanup:wi()}}},ol=async(e,t,n,r)=>(await Gr(J.dirname(r),{recursive:!0}),await nl(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:ll(J.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:sf(),cleanup:wi()}),Gb=e=>{let t=new Set(["manifest.json",rf]),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},Hb=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=J.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
|
|
13
13
|
`);return["# Craig Project Task Bundle","","This directory is a Craig project task bundle. Repo work must happen inside the child repo worktrees listed below.","","Run repo Git commands from a repo worktree directory, not from the bundle root. Use `manifest.json` as the machine-readable source of truth for this bundle.","",`Task: \`${e.taskId}\``,`Workspace: \`${e.workspaceId}\``,`Prompt: ${e.prompt}`,"","## Repo Worktrees","",n,""].join(`
|
|
14
|
-
`)},
|
|
14
|
+
`)},al=async e=>{await yi(J.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:J.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await yi(J.join(e.bundlePath,rf),Hb(e),"utf8")},ll=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),sf=()=>({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}),wi=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),of=(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}),Yb=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 cl=async(e,t,n)=>{await H(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},zr=async(e,t,n)=>H(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Jr=async(e,t)=>H(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});var dl=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 Hr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Qn(e,t,s,{runner:o,config:i,...r.owningWorkspaceId?{workspaceId:r.owningWorkspaceId,allowLinkedProjectRepo:r.allowLinkedProjectRepo??!1}:{},...r.lineage?{lineage:r.lineage}:{}})).task;try{let c=await r.onProvisioned?.(l);if(!r.launchProvisioned)throw new Error("Craig task creation requires the PTY daemon launcher.");await r.launchProvisioned(l,c||void 0);let u=r.markStartedAfterLaunch===!1?await x(e,l.id):await Jr(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 zr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as Zb}from"node:fs/promises";import eR from"node:path";var xt=async e=>{let t=await Q("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var af=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await W("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Zn=async(e,t)=>{let n=await W("gh",ul(e),{cwd:t});return JSON.parse(n.stdout)},er=async(e,t)=>{let n=await Q("gh",ul(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(df(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},lf=async(e,t)=>{let n=await Q("gh",ul(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(df(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},cf=async(e,t,n)=>{if(n.length===0)return[];let r=Xb(n),s;try{s=await W("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw zb(a)?new ze(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=Qb(c);return{id:a.id,found:u!==null,view:u}})},ki=async e=>{let t=await Q("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:Jb(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])}},zb=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")},df=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},ul=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],Jb=e=>{let t=e.replace(/\.git$/,""),n=t.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)$/);if(n?.[1]&&n[2])return{owner:n[1],name:n[2]};let r=t.match(/^git@github\.com:([^/]+)\/([^/]+)$/);if(r?.[1]&&r[2])return{owner:r[1],name:r[2]};let s=t.match(/^ssh:\/\/git@github\.com\/([^/]+)\/([^/]+)$/);return s?.[1]&&s[2]?{owner:s[1],name:s[2]}:null},Xb=e=>`
|
|
15
15
|
query CraigPullRequestBatch($owner: String!, $name: String!) {
|
|
16
16
|
repository(owner: $owner, name: $name) {
|
|
17
17
|
${e.map((n,r)=>{let s=`item${r}`;return n.mode==="number"?`${s}: pullRequest(number: ${Number(n.selector)}) { ...PrFields }`:`${s}: pullRequests(headRefName: ${JSON.stringify(n.selector)}, states: OPEN, first: 1, orderBy: { field: UPDATED_AT, direction: DESC }) { nodes { ...PrFields } }`}).join(`
|
|
@@ -65,85 +65,85 @@ fragment PrFields on PullRequest {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
`,
|
|
68
|
+
`,Qb=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 Zb(eR.dirname(n),{recursive:!0}),await q(n,{taskId:t.id,prs:t.prs}))},tr=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},Xr=async(e,t,n,r,s={readRawTask:_t,validateTaskRecord:He,writeTask:nt,writePrStatusArtifact:Sn,withTaskLock:De})=>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=Ft(n,a),c=Dt(o,l),u=o.status==="closed"?o.status:Rn(c.prs),d={...c,status:u};return tr(e,d,s)}),Qr=async(e,t)=>{let n=Y(t),r=n?.number?String(n.number):t.branch,s=await Zn(r,t.worktreePath);return Xr(e,t,s,n)},Zr=async(e,t)=>{for(let n of await pl(t)){let r=await er(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Xr(e,t,r,null)}}return{discovered:!1,task:t}},pl=async e=>{let t=await Jp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function es(e,t,n,r){return De(e,t,async()=>{let s=await x(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Zt(r.url),a=s.prs.find(h=>o?zn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=Ft(r,a,o??void 0),c=tR(r),u=Dt(s,l),d={...u,repoTargets:(u.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:nr(h)?h.pullRequest:uf(h.pullRequest)}:h)},p={...d,status:d.status==="closed"?d.status:bi(d)};return tr(e,p)})}async function Ti(e,t,n){return De(e,t,async()=>{let r=await x(e,t),s=r.repoTargets?.find(a=>a.repoId===n);if(!s)throw new Error(`Project task ${t} has no repo target ${n}.`);if(s.pullRequest.number===null||nr(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:uf(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:bi(i)};return tr(e,o)})}function nr(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function tR(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:nR(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:rR(e.reviewDecision??null),requiredChecks:el(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function bi(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 nR=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,rR=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,uf=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 rr=async(e,t,n)=>{if(nr(n)){let s=String(n.pullRequest.number),i=await Zn(s,n.worktreePath);return await es(e,t.id,n.repoId,i),"synced"}let r=await er(n.branch,n.worktreePath);return r?(await es(e,t.id,n.repoId,r),"discovered"):(await Ti(e,t.id,n.repoId),"not_found")};var ts=async(e,t)=>{let n=await x(e,t),r=Y(n);return r?.number?(await xt(n.worktreePath),Qt(r)?(await Zr(e,n)).task:Qr(e,n)):n},ml=async(e,t)=>{let n=await x(e,t);if(n.type==="project"&&n.repoTargets?.length)return await sr(e,t),x(e,t);let r=Y(n);if(await we(n),await xt(n.worktreePath),!r?.number||Qt(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 Qr(e,n)},sr=async(e,t)=>{let n=await x(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await xt(i.worktreePath);let o=i.pullRequest.number?await rr(e,n,i):await rr(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},hl=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=fl(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let d of i.repoTargets.filter(p=>p.status==="ready")){let p=nr(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 pf(r,h).catch(async()=>{try{await xt(d.worktreePath);let f=d.pullRequest.number?await rr(e,i,d):await rr(e,i,d);Ri(o,f,d.pullRequest.number??null,d.pullRequest.url??null)}catch(f){if(f instanceof ze)throw f;s.push(f)}})}continue}let a=Y(i),l=a?.number&&!Qt(a),c=l?[]:await pl(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 pf(r,u).catch(async()=>{try{let{disposition:d,task:p}=await Pi(e,i.id),h=Y(p);Ri(o,d,h?.number??null,h?.url??null)}catch(d){if(d instanceof ze)throw d;s.push(d)}})}for(let i of r.values())try{await xt(i.worktreePath);let o=await cf(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=fl(n,l.task),d=a.get(l.id)?.view??await sR(i.worktreePath,l);if(!d){l.targetRepoId&&l.mode==="head"&&await Ti(e,l.task.id,l.targetRepoId),Ri(c,"not_found",null,null);continue}if(l.targetRepoId)await es(e,l.task.id,l.targetRepoId,d);else{let p=await _t(e,l.task.id),h=He(p,`${e.tasksDir}/${l.task.id}.json`);await Xr(e,h,d,l.mode==="number"?Y(h):null)}Ri(c,l.mode==="number"?"synced":"discovered",d.number,d.url)}}catch(o){if(o instanceof ze)throw o;s.push(o)}return iR(s),t.map(i=>fl(n,i))},Pi=async(e,t)=>{let n=await x(e,t);await we(n),await xt(n.worktreePath);let r=Y(n);if(r?.number&&!Qt(r))return{disposition:"synced",task:await Qr(e,n)};let s=await Zr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},sR=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await er(n,e);if(r)return r}return null},pf=async(e,t)=>{let n=await ki(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]})},fl=(e,t)=>{let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!Y(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},Ri=(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},iR=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var gl=async(e,t)=>{let n=await x(e,t);try{n.type==="project"&&n.repoTargets?.length?(await sr(e,t),n=await x(e,t)):n.prs.some(s=>s.number)&&(n=await ts(e,t))}catch{}let r=await Ur(e,n);return{kind:"showTask",task:n,inspection:r}};var yl=async(e,t)=>{let n=await x(e,t);if(await we(n),(await W("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await oR(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},oR=async e=>{let t=[],n=await W("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await aR(e);for(let s of r){let i=await Q("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
|
|
69
69
|
|
|
70
|
-
`)},
|
|
71
|
-
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as Zb}from"node:child_process";import{access as eR}from"node:fs/promises";var gl=async(e,t)=>{let n=await x(e,t),r=Yn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await eR(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},yl=async e=>{await new Promise((t,n)=>{let r=!1,s=Zb("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 tR}from"node:fs/promises";import nR from"node:path";var wl=async(e,t)=>{let n=await x(e,t);if(await we(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await fi(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await H(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await Q("sh",["-lc",a],{cwd:n.worktreePath}),u=new Date().toISOString(),d=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:u,exitCode:d}),d!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await H(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await cf(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await H(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await cf(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},cf=async(e,t)=>{let n=Pn(e,t.artifacts.checkSummaryPath);n&&(await tR(nR.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 kl=async(e,t)=>{let n=await x(e,t);await we(n);let r=await fi(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.title.trim();await Wp(n.worktreePath),await Vp(n.worktreePath,s);let i=await Kp(n.worktreePath),o=new Date().toISOString(),a=await H(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as rR}from"node:fs/promises";var Tl=async(e,t)=>{let n=await x(e,t),r=await sR(n.worktreePath);return H(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},sR=async e=>{try{return await rR(e),!0}catch{return!1}};var bl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await mi(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await H(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Rl=async(e,t,n)=>{let r=await xe(e,n),s=await H(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},Pl=async(e,t)=>{let n=await x(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>xe(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as iR,readFile as df,rm as oR,writeFile as uf}from"node:fs/promises";import Ri from"node:path";var ff=["AGENTS","md"].join("."),Sl=async(e,t,n)=>tt(e,t,async()=>{let r=await x(e,t);aR(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return pf(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([xe(e,n),ve(e).then(f=>f.find(m=>m.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=Ri.join(a,lR(i.name,r)),c=Ri.join(a,"manifest.json"),u=Ri.join(a,ff),[d,p,h]=await Promise.all([df(c,"utf8"),df(u,"utf8"),qr(i.rootPath,r.branch)]);try{let f=await sl(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 il({taskId:r.id,workspaceId:r.workspaceId,prompt:cR(d)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await nt(e,m),pf(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await dR({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}}),aR=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}})},lR=(e,t)=>{let n=new Set(["manifest.json",ff,...(t.repoTargets??[]).map(o=>Ri.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},cR=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},dR=async e=>{let t=[];return await uf(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await uf(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await iR(e.worktreePath).then(()=>!0).catch(()=>!1)&&await mi(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await oR(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await qr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Hp(e.repoRoot,e.branch).catch(s=>t.push(s)),t},pf=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as uR}from"node:child_process";var Il=async(e,t)=>{let n=await x(e,t);await we(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await pR(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},pR=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=uR(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 hf}from"node:fs/promises";import es from"node:path";async function Cl(e,t){if(t.explicitTaskId!==void 0){let l=await mf(e,t.explicitTaskId,"explicit");return vl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await mf(e,t.environmentTaskId,"environment");return vl(l,"environment",t.environmentAgentTabId)}let n=await hf(t.cwd).catch(()=>es.resolve(t.cwd)),r=await Br(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await mR(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 vl(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 mf(e,t,n){try{return await x(e,t)}catch(r){throw!(r instanceof g)||r.code!=="TASK_NOT_FOUND"?r:new g("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function vl(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 fR(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function mR(e,t){return(await Promise.all(fR(e).map(r=>hf(r).catch(()=>es.resolve(r))))).some(r=>hR(r,t))}function hR(e,t){let n=es.relative(es.resolve(e),t);return n===""||!n.startsWith("..")&&!es.isAbsolute(n)}var Al=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await H(e,t,o=>(s=o.title,{...o,title:r,slug:Wr(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var El=async(e,t,n="merge",r)=>{let s=await x(e,t),i=r??Y(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await nf(s.worktreePath,i,n)};var ts={readTask:x,writeTask:nt,withTaskLock:tt,ensureGhAuthenticated:Ft,fetchPrView:Xn,discoverPrView:rf,getGitHubRepositoryLocator:yi,writePrStatusArtifact:Sn};async function $l(e,t,n,r=ts){let s=await r.readTask(e,t),i=await yR(s,n,r);return Zt(s,i,"showTaskPr","shown",[])}async function Nl(e,t,n,r=ts){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Ll(s,n,null,r);await Ml(i,r);let o=await Si(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Zt(s,i,"discoverTaskPr","not_found",[]);jl(o,i);let a=Ii(s,i,o.number),l=await ql(e,s,i,o,r);return Zt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function Dl(e,t,n,r,s=ts){let i=xl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Ll(o,r,i.repository,s);yf(i.repository,a),await Ml(a,s);let l=await Si(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));wR(l,i),jl(l,a);let c=Ii(o,a,l.number),u=Ul(o,a),d=u&&!Hn(u,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&u.status!=="closed"&&u.status!=="merged"?[`Pull request #${l.number} becomes active; #${u.number} remains in task history.`]:[],p=await ql(e,o,a,l,s);return Zt(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function gR(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let o=e.prs.find(a=>a.number===n.number)??Y(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await Pi(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw rr(e,t);let a=gf(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&Tt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await Pi(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&Tt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&Tt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function _l(e,t,n,r=ts){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Ll(s,n,null,r),o=Ul(s,i);if(!o?.number)return Zt(s,i,"refreshTaskPr","not_found",[]);await Ml(i,r);let a=await Si(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));jl(a,i);let l=await ql(e,s,i,a,r);return Zt(l,i,"refreshTaskPr","synced",[])})}async function Fl(e,t,n,r,s=ts){let i=xl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await gR(o,r,i,s);if(yf(i.repository,a),!Ii(o,a,i.number))return Zt(o,a,"unlinkTaskPr","unchanged",[]);let c=kR(o,a,i.number),u=await kf(e,c,s);return Zt(u,a,"unlinkTaskPr","unlinked",[])})}function xl(e){let t=e.trim(),n=Qt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new g("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function Ll(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);return Ol(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw rr(e,t);return Ol(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 Ol(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&Tt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function yR(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let s=Y(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await Pi(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw rr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await Pi(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function Pi(e,t,n,r){let s=gf(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function gf(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Qt(e.url):null}async function Ol(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 Ml(e,t){await Si("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function Si(e,t){try{return await t()}catch(n){throw n instanceof g?n:new g("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function yf(e,t){if(e&&!Tt(e,t.repository))throw wf(e,t)}function wR(e,t){let n=Qt(e.url);if(!n||n.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!Tt(t.repository,n))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function jl(e,t){let n=Qt(e.url);if(!n||!Tt(n,t.repository))throw wf(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 wf(e,t){return new g("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function rr(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function Tt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function ql(e,t,n,r,s){let i=Ii(t,n,r.number),o=_t(r,i,n.repository),a=Dt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:Rf(o)}:l)}),kf(e,a,s)}function kR(e,t,n){let r=e.prs.filter(i=>!bf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Tf(r.filter(o=>o.owner&&o.repo&&Tt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?Rf(i):bR(t.repository)}:o)}}return s}async function kf(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?ki(t):Rn(t.prs),s={...t,status:r};return Zn(e,s,n)}function Ii(e,t,n){return Bl(e,t).find(r=>bf(r,t,n))??null}function Ul(e,t){if(!t.projectTarget)return Y(e);let n=Bl(e,t);return Tf(n)}function Tf(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Bl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&Tt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?TR(r.pullRequest,t.repository):null;return s&&!n.some(i=>Hn(i,s))?[...n,s]:n}function bf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||Tt({owner:e.owner,name:e.repo},t.repository)}function Zt(e,t,n,r,s){let i=Bl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Ul(e,t),warnings:s}}function Rf(e){return{provider:"github",owner:e.owner,repo:e.repo,number:e.number,url:e.url,baseBranch:e.baseBranch,headBranch:e.headBranch,status:e.status==="draft"?"open":e.status,draft:e.draft,mergeable:e.mergeable,mergeStateStatus:e.mergeStateStatus,reviewDecision:e.reviewDecision??null,requiredChecks:e.requiredChecks,comments:e.comments??[],lastSyncedAt:e.lastSyncedAt,lastSyncedHeadSha:e.lastSyncedHeadSha}}function TR(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 bR(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var S={listTasks:Br,getTask:x,provisionTask:Jn,provisionProjectTask:Kr,createTask:ll,showTask:ml,showTaskDiff:hl,prepareTaskLogs:gl,streamTaskLogs:yl,runChecks:wl,commitTask:kl,closeTask:Tl,cleanupTask:bl,addTaskLink:Rl,addTaskRepoTarget:Sl,listTaskLinks:Pl,sortTasksForDisplay:nl,resolveSelectedTaskId:rl,allocateTaskId:tl,allocateTaskIdForRepo:zn,allocateProjectTaskId:Ur,createDefaultTaskPtyTabs:Gr,assertTaskWorktreeExists:we,resolveTaskLogPath:Yn,buildTaskInspection:jr,resolveArtifactPath:Pn,openTask:Il,markRunnerFailed:al,recordStartupFailure:Hr,markTaskStarted:Yr,renameTask:Al,resolveContext:Cl,prs:{refresh:Zr,refreshChecks:pl,discoverOrRefresh:bi,discoverOrRefreshAll:nr,discoverOrRefreshMany:fl,show:$l,discover:Nl,link:Dl,refreshAssociation:_l,unlink:Fl,merge:El,getPrimaryPr:Y,isPrTerminal:Xt,isMergeReady:pi,deriveTaskStatus:Rn,upsertPr:Dt,normalizePr:_t,summarizeRequiredChecks:Xa,writePrStatusArtifact:Sn}};var Pf={idle:0,ready:1,working:2,error:3};function ze(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function bt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return ze(t,n,r,i)}function sr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=bt(e,s.id,t,n);Pf[i]>Pf[r]&&(r=i)}return r}function vi(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&ze(s.id,t,n)==="working"))}function Rt(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=bt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:sr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function Wl(e,t,n){let r=n.now??Date.now;if(n.tabId&&!e.ptyTabs.some(l=>l.kind==="agent"&&l.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:n.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=r()+n.timeoutMs;try{for(;;){let l=r(),c=Rt([e],t.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw Sf(e.id);let d=a-r();if(d<=0)throw RR(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(Sf(e.id))},T=setTimeout(m,d);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var RR=(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}}),Sf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as vR}from"node:net";import{createHash as PR}from"node:crypto";import{tmpdir as SR}from"node:os";import If from"node:path";var Pt=10,IR=new Set([6,7,8,9,Pt]);function en(e){return e!==void 0&&IR.has(e)}function Le(e){let t=PR("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:If.join(SR(),`craig-${t}.sock`),pidPath:If.join(e.runtimeDir,"pty-daemon.pid")}}async function vf(e){let t=null;try{let n=await CR(Le(e.paths).socketPath);return t=new Kl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Kl=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Pt)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
|
|
70
|
+
`)},aR=async e=>(await W("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
|
|
71
|
+
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as lR}from"node:child_process";import{access as cR}from"node:fs/promises";var wl=async(e,t)=>{let n=await x(e,t),r=Jn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await cR(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},kl=async e=>{await new Promise((t,n)=>{let r=!1,s=lR("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 dR}from"node:fs/promises";import uR from"node:path";var Tl=async(e,t)=>{let n=await x(e,t);if(await we(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await hi(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await H(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await Q("sh",["-lc",a],{cwd:n.worktreePath}),u=new Date().toISOString(),d=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:u,exitCode:d}),d!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await H(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await ff(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await H(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await ff(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},ff=async(e,t)=>{let n=Pn(e,t.artifacts.checkSummaryPath);n&&(await dR(uR.dirname(n),{recursive:!0}),await q(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var bl=async(e,t)=>{let n=await x(e,t);await we(n);let r=await hi(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 Hp(n.worktreePath),await Yp(n.worktreePath,s);let i=await zp(n.worktreePath),o=new Date().toISOString(),a=await H(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as pR}from"node:fs/promises";var Rl=async(e,t)=>{let n=await x(e,t),r=await fR(n.worktreePath);return H(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},fR=async e=>{try{return await pR(e),!0}catch{return!1}};var Pl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await gi(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await H(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Sl=async(e,t,n)=>{let r=await Me(e,n),s=await H(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},Il=async(e,t)=>{let n=await x(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>Me(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as mR,readFile as mf,rm as hR,writeFile as hf}from"node:fs/promises";import Si from"node:path";var yf=["AGENTS","md"].join("."),vl=async(e,t,n)=>De(e,t,async()=>{let r=await x(e,t);gR(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return gf(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([Me(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=Si.join(a,yR(i.name,r)),c=Si.join(a,"manifest.json"),u=Si.join(a,yf),[d,p,h]=await Promise.all([mf(c,"utf8"),mf(u,"utf8"),Br(i.rootPath,r.branch)]);try{let f=await ol(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=>Me(e,T.repoId)));return await al({taskId:r.id,workspaceId:r.workspaceId,prompt:wR(d)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await nt(e,m),gf(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await kR({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}}),gR=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}})},yR=(e,t)=>{let n=new Set(["manifest.json",yf,...(t.repoTargets??[]).map(o=>Si.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},wR=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},kR=async e=>{let t=[];return await hf(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await hf(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await mR(e.worktreePath).then(()=>!0).catch(()=>!1)&&await gi(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await hR(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await Br(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Xp(e.repoRoot,e.branch).catch(s=>t.push(s)),t},gf=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as TR}from"node:child_process";var Cl=async(e,t)=>{let n=await x(e,t);await we(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await bR(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},bR=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=TR(s,i,{cwd:t,stdio:"inherit"});o.on("error",r),o.on("exit",a=>{if(a===0){n();return}r(new Error(`${e.join(" ")} failed with exit code ${a??"unknown"}.`))})})};import{realpath as kf}from"node:fs/promises";import ns from"node:path";async function El(e,t){if(t.explicitTaskId!==void 0){let l=await wf(e,t.explicitTaskId,"explicit");return Al(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await wf(e,t.environmentTaskId,"environment");return Al(l,"environment",t.environmentAgentTabId)}let n=await kf(t.cwd).catch(()=>ns.resolve(t.cwd)),r=await Vr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await PR(l,n)})))).filter(l=>l.matches).map(l=>l.task),o=[...new Map(i.map(l=>[l.id,l])).values()];if(o.length>1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Multiple Craig tasks match ${n}: ${o.map(l=>l.id).join(", ")}. Use --task <id>.`,{details:{cwd:n,taskIds:o.map(l=>l.id)}});let a=o[0];if(a)return Al(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 wf(e,t,n){try{return await x(e,t)}catch(r){throw!(r instanceof g)||r.code!=="TASK_NOT_FOUND"?r:new g("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function Al(e,t,n){let r=n??null;if(r!==null){let s=e.ptyTabs.find(i=>i.id===r);if(!s||s.kind!=="agent")throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${r} does not belong to Craig task ${e.id}.`,{details:{taskId:e.id,agentTabId:r}})}return{task:e,source:t,agentTabId:r}}function RR(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function PR(e,t){return(await Promise.all(RR(e).map(r=>kf(r).catch(()=>ns.resolve(r))))).some(r=>SR(r,t))}function SR(e,t){let n=ns.relative(ns.resolve(e),t);return n===""||!n.startsWith("..")&&!ns.isAbsolute(n)}var Ol=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await H(e,t,o=>(s=o.title,{...o,title:r,slug:Kr(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var $l=async(e,t,n="merge",r)=>{let s=await x(e,t),i=r??Y(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await af(s.worktreePath,i,n)};var rs={readTask:x,writeTask:nt,withTaskLock:De,ensureGhAuthenticated:xt,fetchPrView:Zn,discoverPrView:lf,getGitHubRepositoryLocator:ki,writePrStatusArtifact:Sn};async function _l(e,t,n,r=rs){let s=await r.readTask(e,t),i=await vR(s,n,r);return en(s,i,"showTaskPr","shown",[])}async function Dl(e,t,n,r=rs){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await jl(s,n,null,r);await ql(i,r);let o=await vi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return en(s,i,"discoverTaskPr","not_found",[]);Ul(o,i);let a=Ci(s,i,o.number),l=await Bl(e,s,i,o,r);return en(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function Fl(e,t,n,r,s=rs){let i=Ml(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await jl(o,r,i.repository,s);bf(i.repository,a),await ql(a,s);let l=await vi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));CR(l,i),Ul(l,a);let c=Ci(o,a,l.number),u=Wl(o,a),d=u&&!zn(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 Bl(e,o,a,l,s);return en(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function IR(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw ir(e,t);let o=e.prs.find(a=>a.number===n.number)??Y(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await Ii(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw ir(e,t);let a=Tf(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&Tt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await Ii(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&Tt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&Tt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function xl(e,t,n,r=rs){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await jl(s,n,null,r),o=Wl(s,i);if(!o?.number)return en(s,i,"refreshTaskPr","not_found",[]);await ql(i,r);let a=await vi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));Ul(a,i);let l=await Bl(e,s,i,a,r);return en(l,i,"refreshTaskPr","synced",[])})}async function Ll(e,t,n,r,s=rs){let i=Ml(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await IR(o,r,i,s);if(bf(i.repository,a),!Ci(o,a,i.number))return en(o,a,"unlinkTaskPr","unchanged",[]);let c=AR(o,a,i.number),u=await Pf(e,c,s);return en(u,a,"unlinkTaskPr","unlinked",[])})}function Ml(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 jl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw ir(e,t);return Nl(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 ir(e,t);return Nl(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 Nl(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&Tt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function vR(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw ir(e,t);let s=Y(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await Ii(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 ir(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await Ii(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function Ii(e,t,n,r){let s=Tf(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Tf(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Zt(e.url):null}async function Nl(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 ql(e,t){await vi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function vi(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 bf(e,t){if(e&&!Tt(e,t.repository))throw Rf(e,t)}function CR(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&&!Tt(t.repository,n))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function Ul(e,t){let n=Zt(e.url);if(!n||!Tt(n,t.repository))throw Rf(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 Rf(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 ir(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function Tt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Bl(e,t,n,r,s){let i=Ci(t,n,r.number),o=Ft(r,i,n.repository),a=Dt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:vf(o)}:l)}),Pf(e,a,s)}function AR(e,t,n){let r=e.prs.filter(i=>!If(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Sf(r.filter(o=>o.owner&&o.repo&&Tt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?vf(i):OR(t.repository)}:o)}}return s}async function Pf(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?bi(t):Rn(t.prs),s={...t,status:r};return tr(e,s,n)}function Ci(e,t,n){return Vl(e,t).find(r=>If(r,t,n))??null}function Wl(e,t){if(!t.projectTarget)return Y(e);let n=Vl(e,t);return Sf(n)}function Sf(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Vl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&Tt({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=>zn(i,s))?[...n,s]:n}function If(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||Tt({owner:e.owner,name:e.repo},t.repository)}function en(e,t,n,r,s){let i=Vl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Wl(e,t),warnings:s}}function vf(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 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:Vr,getTask:x,provisionTask:Qn,provisionProjectTask:Hr,createTask:dl,showTask:gl,showTaskDiff:yl,prepareTaskLogs:wl,streamTaskLogs:kl,runChecks:Tl,commitTask:bl,closeTask:Rl,cleanupTask:Pl,addTaskLink:Sl,addTaskRepoTarget:vl,listTaskLinks:Il,sortTasksForDisplay:sl,resolveSelectedTaskId:il,allocateTaskId:rl,allocateTaskIdForRepo:Xn,allocateProjectTaskId:Wr,createDefaultTaskPtyTabs:Yr,assertTaskWorktreeExists:we,resolveTaskLogPath:Jn,buildTaskInspection:Ur,resolveArtifactPath:Pn,openTask:Cl,markRunnerFailed:cl,recordStartupFailure:zr,markTaskStarted:Jr,renameTask:Ol,resolveContext:El,prs:{refresh:ts,refreshChecks:ml,discoverOrRefresh:Pi,discoverOrRefreshAll:sr,discoverOrRefreshMany:hl,show:_l,discover:Dl,link:Fl,refreshAssociation:xl,unlink:Ll,merge:$l,getPrimaryPr:Y,isPrTerminal:Qt,isMergeReady:mi,deriveTaskStatus:Rn,upsertPr:Dt,normalizePr:Ft,summarizeRequiredChecks:Za,writePrStatusArtifact:Sn}};var Cf={idle:0,ready:1,working:2,error:3};function Je(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function bt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Je(t,n,r,i)}function or(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=bt(e,s.id,t,n);Cf[i]>Cf[r]&&(r=i)}return r}function Ai(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Je(s.id,t,n)==="working"))}function Rt(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=bt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:or(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function Kl(e,t,n){let r=n.now??Date.now;if(n.tabId&&!e.ptyTabs.some(l=>l.kind==="agent"&&l.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:n.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=r()+n.timeoutMs;try{for(;;){let l=r(),c=Rt([e],t.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw Af(e.id);let d=a-r();if(d<=0)throw $R(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(Af(e.id))},T=setTimeout(m,d);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var $R=(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}}),Af=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as FR}from"node:net";import{createHash as NR}from"node:crypto";import{tmpdir as _R}from"node:os";import Ef from"node:path";var Pt=10,DR=new Set([6,7,8,9,Pt]);function St(e){return e!==void 0&&DR.has(e)}function Ce(e){let t=NR("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Ef.join(_R(),`craig-${t}.sock`),pidPath:Ef.join(e.runtimeDir,"pty-daemon.pid")}}async function Of(e){let t=null;try{let n=await xR(Ce(e.paths).socketPath);return t=new Hl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Hl=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Pt)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
|
|
72
72
|
`);let s=await r;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
73
73
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
74
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="activity"?(this.recordSnapshot(n.snapshot),this.options.onActivity?.(n.snapshot)):n.type==="activityRemoved"&&(this.removeSnapshot(n.tabId),this.options.onActivityRemoved?.(n.tabId))}replaceSnapshots(t,n){let r=new Map;for(let[s,i]of this.revisionByTabId)i>n&&r.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of r)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let n of this.snapshots.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(r),this.options.onActivity?.(r)}this.options.onDaemonClose?.()}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}};function CR(e){return new Promise((t,n)=>{let r=vR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Hl={openObserver:Af,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function AR(e,t,n=Hl){let r=await Cf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...Rt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function ER(e,t,n=Hl){let r=await Cf(e,t.taskId,n),s=await n.openObserver(e);try{let i=Rt(r,s.getSnapshots(),n.now()),o=t.tabId?i.agents.filter(l=>l.tabId===t.tabId):i.agents;if(t.tabId&&o.length===0)throw new g("TASK_CONTEXT_NOT_FOUND",`Agent tab ${t.tabId} was not found${t.taskId?` in task ${t.taskId}`:""}.`,{details:{taskId:t.taskId??null,tabId:t.tabId}});let a=new Set(o.map(l=>l.taskId));return{kind:"showAgentStatus",agents:o,tasks:t.tabId?i.tasks.filter(l=>a.has(l.taskId)):i.tasks,daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function OR(e,t,n,r=Hl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await Wl(s,i,{...n,now:r.now})}finally{i.close()}}async function Cf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Af(e){return Gl.open(e)}async function $R(e){return Af(e)}var Gl=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 vf({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},xt={listAgents:AR,showAgentStatus:ER,waitForTask:OR,openObserver:$R};import{randomUUID as QR}from"node:crypto";import{mkdir as Yf,open as sc,readdir as ic,readFile as ls,rm as ZR,stat as eP}from"node:fs/promises";import Oi from"node:path";import{createHash as xR}from"node:crypto";import{mkdir as ns,readdir as Jl,readFile as rs,writeFile as LR}from"node:fs/promises";import Je from"node:path";import{mkdir as Ef,readFile as NR,rm as Yl,stat as DR,writeFile as _R}from"node:fs/promises";import zl from"node:path";async function ir(e,t){let n=zl.join(e.runtimeDir,"fury-store.lock");await Ef(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Ef(n);try{await _R(zl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Yl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Of(s,"EEXIST"))throw s;let i=await NR(zl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await DR(n).catch(()=>null);if(typeof i?.pid=="number"&&!FR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Yl(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 Yl(n,{recursive:!0,force:!0})}}function FR(e){try{return process.kill(e,0),!0}catch(t){return Of(t,"EPERM")}}var Of=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ke=e=>({root:Je.join(e.craigDir,"fury"),definitions:Je.join(e.craigDir,"fury","definitions"),plans:Je.join(e.craigDir,"fury","plans"),approvals:Je.join(e.craigDir,"fury","approvals"),runs:Je.join(e.craigDir,"fury","runs"),reviews:Je.join(e.craigDir,"fury","reviews")});function Xl(e){return xR("sha256").update(JSON.stringify(e)).digest("hex")}async function Nf(e,t,n){let r=ke(e);await ns(r.definitions,{recursive:!0});let s=Je.join(r.definitions,`${t}.yaml`);await LR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!tn(i,"EEXIST"))throw i})}async function Df(e,t){return ir(e,async()=>{let n=await _f(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await ns(ke(e).plans,{recursive:!0}),await U(Bf(e,i.id),i),i})}async function ss(e,t){Ai(t,"plan");try{return MR(JSON.parse(await rs(Bf(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function _f(e){let t=ke(e).plans,n=await Jl(t).catch(s=>tn(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>ss(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function is(e){let t=await _f(e),n=await Promise.all(t.map(s=>ec(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 Ff(e,t){return ir(e,async()=>{if((await ss(e,t.planId)).planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed before approval.`,{});let r=await ec(e,t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:r,created:!1}}return await ns(ke(e).approvals,{recursive:!0}),await U(Wf(e,t.planId),t),{approval:t,created:!0}})}async function xf(e,t){Ai(t,"plan");let n=await ec(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Lf(e,t){return ir(e,async()=>{let r=(await Mf(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await ns(ke(e).runs,{recursive:!0}),await U(Ql(e,t.id),t),{run:t,created:!0}})}async function te(e,t){Ai(t,"run");try{return qf(JSON.parse(await rs(Ql(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Ci(e){return Mf(e)}async function Mf(e){let t=ke(e).runs,n=await Jl(t).catch(s=>tn(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return qf(JSON.parse(await rs(Je.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ce(e,t,n){return ir(e,async()=>{let r=await te(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await U(Ql(e,t),s),s})}async function jf(e,t){await ns(ke(e).reviews,{recursive:!0}),await U(Zl(e,t.id),t)}async function or(e,t,n){return ir(e,async()=>{let r=await rt(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await U(Zl(e,t),s),s})}async function rt(e,t){Ai(t,"review");try{return jR(JSON.parse(await rs(Zl(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function os(e){let t=ke(e).reviews,n=await Jl(t).catch(r=>tn(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rt(e,r.slice(0,-5))))}function qf(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)||!Uf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!qR(e.stepRuns,e.order)||!as(e.actor)||e.cleanupPending!==void 0&&typeof e.cleanupPending!="boolean"||e.cleanupError!==void 0&&e.cleanupError!==null&&typeof e.cleanupError!="string"||!Xe(e.createdAt)||!Xe(e.updatedAt)||!Xe(e.stateChangedAt)||!Xe(e.deadlineAt)||e.completedAt!==null&&!Xe(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function MR(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)||!Uf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||!Array.isArray(e.waves)||e.waves.some(r=>!Array.isArray(r)||r.some(s=>typeof s!="string"))||!Array.isArray(e.steps)||e.steps.length!==e.order.length||!as(e.createdBy)||!Xe(e.createdAt))throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} is invalid.`,{});let n={...e};if(delete n.id,delete n.planHash,delete n.createdBy,delete n.createdAt,Xl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function jR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!De(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!De(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Xe(e.requestedAt)||!Xe(e.deadlineAt)||!Xe(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!$f(r))||e.lastDecision!==null&&!$f(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function qR(e,t){return De(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&UR(e[n],n))}function UR(e,t){return!De(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!De(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Xe(n))&&(e.completedBy===null||as(e.completedBy))}function $f(e){return De(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&as(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Xe(e.occurredAt)}function Uf(e){return De(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function as(e){return De(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}var Ql=(e,t)=>Je.join(ke(e).runs,`${t}.json`),Bf=(e,t)=>Je.join(ke(e).plans,`${t}.json`),Wf=(e,t)=>Je.join(ke(e).approvals,`${t}.json`),Zl=(e,t)=>Je.join(ke(e).reviews,`${t}.json`),Ai=(e,t)=>{if(!(t==="plan"?/^fury_plan_[A-Za-z0-9_-]+$/:t==="run"?/^fury_[A-Za-z0-9_-]+$/:/^review_[A-Za-z0-9_-]+$/).test(e))throw new g("CLI_USAGE",`Invalid fury ${t} id "${e}".`,{})};async function ec(e,t){try{let n=JSON.parse(await rs(Wf(e,t),"utf8"));if(!De(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!as(n.approvedBy)||!De(n.approvedBy)||n.approvedBy.type!=="human"||!Xe(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(tn(n,"ENOENT"))return null;throw n}}var De=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Xe=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),tn=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Vf,readFile as BR,rm as Ei,stat as WR,writeFile as VR}from"node:fs/promises";import tc from"node:path";var KR=20,GR=3e4,HR=5e3;async function Kf(e,t){let n=tc.join(e.runtimeDir,"event-journal.lock");await Vf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Vf(n);try{await VR(tc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ei(n,{recursive:!0,force:!0}),s}break}catch(s){if(!JR(s))throw s;if(await YR(n))continue;if(Date.now()-r>=GR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await XR(KR)}try{return await t()}finally{await Ei(n,{recursive:!0,force:!0})}}async function YR(e){let t=await BR(tc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return zR(t.pid)?!1:(await Ei(e,{recursive:!0,force:!0}),!0);let n=await WR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<HR?!1:(await Ei(e,{recursive:!0,force:!0}),!0)}function zR(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 JR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",XR=e=>new Promise(t=>setTimeout(t,e));var tP=256*1024,nP=16,rP=64*1024;async function Me(e,t,n={}){let r=rc(n.maxSegmentBytes??tP,"Event journal segment size"),s=rc(n.maxSegments??nP,"Event journal retention"),i=rc(n.maxRecordBytes??rP,"Event record size");return Kf(e,async()=>{await Yf(e.eventsDir,{recursive:!0}),await cP(e);let o=await oc(e),a=t.id??QR(),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:pP(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
|
|
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 xR(e){return new Promise((t,n)=>{let r=FR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var zl={openObserver:Nf,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function LR(e,t,n=zl){let r=await $f(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...Rt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function MR(e,t,n=zl){let r=await $f(e,t.taskId,n),s=await n.openObserver(e);try{let i=Rt(r,s.getSnapshots(),n.now()),o=t.tabId?i.agents.filter(l=>l.tabId===t.tabId):i.agents;if(t.tabId&&o.length===0)throw new g("TASK_CONTEXT_NOT_FOUND",`Agent tab ${t.tabId} was not found${t.taskId?` in task ${t.taskId}`:""}.`,{details:{taskId:t.taskId??null,tabId:t.tabId}});let a=new Set(o.map(l=>l.taskId));return{kind:"showAgentStatus",agents:o,tasks:t.tabId?i.tasks.filter(l=>a.has(l.taskId)):i.tasks,daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function jR(e,t,n,r=zl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await Kl(s,i,{...n,now:r.now})}finally{i.close()}}async function $f(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Nf(e){return Yl.open(e)}async function qR(e){return Nf(e)}var Yl=class e{listeners=new Set;snapshots=new Map;client=null;reconnectTimer=null;reconnectDelayMs=250;closed=!1;paths;constructor(t){this.paths=t}static async open(t){let n=new e(t);return await n.connect(),n}get daemonAvailable(){return this.client!==null}getSnapshots(){return[...this.snapshots.values()]}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}close(){this.closed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.client?.close(),this.client=null}async connect(){if(this.closed)return;let t=await Of({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},Lt={listAgents:LR,showAgentStatus:MR,waitForTask:jR,openObserver:qR};import{randomUUID as aP}from"node:crypto";import{mkdir as Qf,open as oc,readdir as ac,readFile as ds,rm as lP,stat as cP}from"node:fs/promises";import Ni from"node:path";import{createHash as KR}from"node:crypto";import{mkdir as ss,readdir as Ql,readFile as is,writeFile as GR}from"node:fs/promises";import Xe from"node:path";import{mkdir as _f,readFile as UR,rm as Jl,stat as BR,writeFile as WR}from"node:fs/promises";import Xl from"node:path";async function ar(e,t){let n=Xl.join(e.runtimeDir,"fury-store.lock");await _f(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await _f(n);try{await WR(Xl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Jl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Df(s,"EEXIST"))throw s;let i=await UR(Xl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await BR(n).catch(()=>null);if(typeof i?.pid=="number"&&!VR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Jl(n,{recursive:!0,force:!0});continue}if(Date.now()-r>3e4)throw new g("OPERATION_TIMEOUT","Timed out waiting for the fury store lock.",{retryable:!0});await new Promise(a=>setTimeout(a,20))}try{return await t()}finally{await Jl(n,{recursive:!0,force:!0})}}function VR(e){try{return process.kill(e,0),!0}catch(t){return Df(t,"EPERM")}}var Df=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ke=e=>({root:Xe.join(e.craigDir,"fury"),definitions:Xe.join(e.craigDir,"fury","definitions"),plans:Xe.join(e.craigDir,"fury","plans"),approvals:Xe.join(e.craigDir,"fury","approvals"),runs:Xe.join(e.craigDir,"fury","runs"),reviews:Xe.join(e.craigDir,"fury","reviews")});function Zl(e){return KR("sha256").update(JSON.stringify(e)).digest("hex")}async function xf(e,t,n){let r=ke(e);await ss(r.definitions,{recursive:!0});let s=Xe.join(r.definitions,`${t}.yaml`);await GR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!tn(i,"EEXIST"))throw i})}async function Lf(e,t){return ar(e,async()=>{let n=await Mf(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await ss(ke(e).plans,{recursive:!0}),await q(Gf(e,i.id),i),i})}async function os(e,t){Oi(t,"plan");try{return HR(JSON.parse(await is(Gf(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Mf(e){let t=ke(e).plans,n=await Ql(t).catch(s=>tn(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>os(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function as(e){let t=await Mf(e),n=await Promise.all(t.map(s=>nc(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 jf(e,t){return ar(e,async()=>{if((await os(e,t.planId)).planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed before approval.`,{});let r=await nc(e,t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:r,created:!1}}return await ss(ke(e).approvals,{recursive:!0}),await q(Hf(e,t.planId),t),{approval:t,created:!0}})}async function qf(e,t){Oi(t,"plan");let n=await nc(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Uf(e,t){return ar(e,async()=>{let r=(await Bf(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 ss(ke(e).runs,{recursive:!0}),await q(ec(e,t.id),t),{run:t,created:!0}})}async function te(e,t){Oi(t,"run");try{return Vf(JSON.parse(await is(ec(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Ei(e){return Bf(e)}async function Bf(e){let t=ke(e).runs,n=await Ql(t).catch(s=>tn(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return Vf(JSON.parse(await is(Xe.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ae(e,t,n){return ar(e,async()=>{let r=await te(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await q(ec(e,t),s),s})}async function Wf(e,t){await ss(ke(e).reviews,{recursive:!0}),await q(tc(e,t.id),t)}async function lr(e,t,n){return ar(e,async()=>{let r=await rt(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await q(tc(e,t),s),s})}async function rt(e,t){Oi(t,"review");try{return YR(JSON.parse(await is(tc(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function ls(e){let t=ke(e).reviews,n=await Ql(t).catch(r=>tn(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rt(e,r.slice(0,-5))))}function Vf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Fe(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))||!Fe(e.inputs)||!Kf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!zR(e.stepRuns,e.order)||!cs(e.actor)||e.cleanupPending!==void 0&&typeof e.cleanupPending!="boolean"||e.cleanupError!==void 0&&e.cleanupError!==null&&typeof e.cleanupError!="string"||!Qe(e.createdAt)||!Qe(e.updatedAt)||!Qe(e.stateChangedAt)||!Qe(e.deadlineAt)||e.completedAt!==null&&!Qe(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function HR(e,t){if(!Fe(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||!Fe(e.inputs)||!Kf(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||!cs(e.createdBy)||!Qe(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,Zl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function YR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Fe(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&&(!Fe(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||!Qe(e.requestedAt)||!Qe(e.deadlineAt)||!Qe(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!Ff(r))||e.lastDecision!==null&&!Ff(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function zR(e,t){return Fe(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&JR(e[n],n))}function JR(e,t){return!Fe(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")||!Fe(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||Qe(n))&&(e.completedBy===null||cs(e.completedBy))}function Ff(e){return Fe(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")&&cs(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Qe(e.occurredAt)}function Kf(e){return Fe(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 cs(e){return Fe(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 ec=(e,t)=>Xe.join(ke(e).runs,`${t}.json`),Gf=(e,t)=>Xe.join(ke(e).plans,`${t}.json`),Hf=(e,t)=>Xe.join(ke(e).approvals,`${t}.json`),tc=(e,t)=>Xe.join(ke(e).reviews,`${t}.json`),Oi=(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 nc(e,t){try{let n=JSON.parse(await is(Hf(e,t),"utf8"));if(!Fe(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!cs(n.approvedBy)||!Fe(n.approvedBy)||n.approvedBy.type!=="human"||!Qe(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(tn(n,"ENOENT"))return null;throw n}}var Fe=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Qe=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),tn=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Yf,readFile as XR,rm as $i,stat as QR,writeFile as ZR}from"node:fs/promises";import rc from"node:path";var eP=20,tP=3e4,nP=5e3;async function zf(e,t){let n=rc.join(e.runtimeDir,"event-journal.lock");await Yf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Yf(n);try{await ZR(rc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await $i(n,{recursive:!0,force:!0}),s}break}catch(s){if(!iP(s))throw s;if(await rP(n))continue;if(Date.now()-r>=tP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await oP(eP)}try{return await t()}finally{await $i(n,{recursive:!0,force:!0})}}async function rP(e){let t=await XR(rc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return sP(t.pid)?!1:(await $i(e,{recursive:!0,force:!0}),!0);let n=await QR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<nP?!1:(await $i(e,{recursive:!0,force:!0}),!0)}function sP(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 iP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",oP=e=>new Promise(t=>setTimeout(t,e));var dP=256*1024,uP=16,pP=64*1024;async function je(e,t,n={}){let r=ic(n.maxSegmentBytes??dP,"Event journal segment size"),s=ic(n.maxSegments??uP,"Event journal retention"),i=ic(n.maxRecordBytes??pP,"Event record size");return zf(e,async()=>{await Qf(e.eventsDir,{recursive:!0}),await wP(e);let o=await lc(e),a=t.id??aP(),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:bP(t.data)},d=`${JSON.stringify(u)}
|
|
75
|
+
`;if(Buffer.byteLength(d)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let h=(await _i(e)).at(-1),f=!h||await fP(h.path,d,r);if(f&&(h={name:Xf(c),path:Ni.join(e.eventsDir,Xf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await oc(h.path,"a");try{await m.writeFile(d,"utf8"),await m.sync()}finally{await m.close()}return f&&await em(e.eventsDir),await mP(e,s),u})}async function In(e,t={}){let n=await lc(e),r=kP(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?TP(t.typeGlob):null,i=n.events.filter(l=>l.sequence>r&&(!t.taskId||l.taskId===t.taskId)&&(!s||s.test(l.type))),o=n.events.at(-1)?.sequence??null,a=n.events.filter(l=>l.sequence>r).at(-1);return{kind:"listEvents",events:i,cursor:{after:a?.id??t.after??null,sequence:a?.sequence??r,earliestAvailableSequence:n.earliestSequence,latestSequence:o}}}async function Zf(e){return(await lc(e)).events}async function lc(e){await Qf(e.eventsDir,{recursive:!0});let t=await _i(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await ds(i.path,"utf8"),a=s===t.length-1,l=o.split(`
|
|
76
76
|
`);if(o.endsWith(`
|
|
77
|
-
`))l.pop();else{if(!a)throw nn(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let u=l[c];if(u.length===0)throw nn(i.name,`empty record at line ${c+1}`);let d;try{d=JSON.parse(u)}catch{throw nn(i.name,`invalid JSON at line ${c+1}`)}let p=
|
|
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 cP(e){let t=(await $i(e)).at(-1);if(!t)return;let n=await ls(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await sc(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function dP(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 nc(t);return Gf(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}}):nc(t);return Gf(t,s.sequence,n),s.sequence}function Gf(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 uP(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 pP(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 fP(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw nn(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!ar(i.workspaceId)||!ar(i.taskId)||!ar(i.agentTabId)||!ar(i.commandId)||!ar(i.furyRunId)||!ar(i.furyStepId)||!mP(i.actor)||!("data"in i))throw nn(t,`record at line ${n} has an invalid schema`);return i}function mP(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var ar=e=>e===null||typeof e=="string",Hf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,nn=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),nc=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),ac=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function rc(e,t){if(!Number.isSafeInteger(e)||e<1)throw new g("CLI_USAGE",`${t} must be a positive integer.`,{details:{value:e}});return e}async function Jf(e){let t=await sc(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Zf,readdir as IP,readFile as em}from"node:fs/promises";import tm from"node:path";import{mkdir as Xf,readFile as hP,rm as Ni,stat as gP,writeFile as yP}from"node:fs/promises";import lc from"node:path";var wP=20,kP=3e4,TP=5e3;async function cc(e,t){let n=lc.join(e.runtimeDir,"command-store.lock");await Xf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Xf(n);try{await yP(lc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ni(n,{recursive:!0,force:!0}),s}break}catch(s){if(!PP(s))throw s;if(await bP(n))continue;if(Date.now()-r>=kP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await SP(wP)}try{return await t()}finally{await Ni(n,{recursive:!0,force:!0})}}async function bP(e){let t=await hP(lc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return RP(t.pid)?!1:(await Ni(e,{recursive:!0,force:!0}),!0);let n=await gP(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<TP?!1:(await Ni(e,{recursive:!0,force:!0}),!0)}function RP(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 PP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",SP=e=>new Promise(t=>setTimeout(t,e));async function Fi(e,t){dc(t);try{let n=JSON.parse(await em(cs(e,t),"utf8"));return rm(n,cs(e,t),t)}catch(n){throw EP(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?_i(t,cs(e,t),n):n}}async function je(e){await Zf(e.commandsDir,{recursive:!0});let t=await IP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=tm.join(e.commandsDir,r);try{n.push(rm(JSON.parse(await em(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:_i(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function nm(e,t){return dc(t.id),cc(e,async()=>{await Zf(e.commandsDir,{recursive:!0});let n=await je(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!vP(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await U(cs(e,t.id),t),{command:t,created:!0}})}async function ds(e,t,n){return dc(t),cc(e,async()=>{let r=await Fi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await U(cs(e,t),s),s})}function vP(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 rm(e,t,n){if(!Di(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw _i("unknown",t);let r=e.id,s=["queued","delivering","delivered","failed","cancelled"];if(r!==n||e.idempotencyKey!==null&&(typeof e.idempotencyKey!="string"||e.idempotencyKey.length>256)||typeof e.taskId!="string"||e.taskId.length===0||typeof e.agentTabId!="string"||e.agentTabId.length===0||!Di(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!AP(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!lr(e.expiresAt)||!lr(e.createdAt)||!lr(e.updatedAt)||e.deliveryStartedAt!==null&&!lr(e.deliveryStartedAt)||e.deliveredAt!==null&&!lr(e.deliveredAt)||e.cancelledAt!==null&&!lr(e.cancelledAt)||e.cancelledBy!==null&&!Qf(e.cancelledBy)||!Qf(e.actor)||!CP(e.lastError)||e.state==="delivered"!=(e.deliveredAt!==null)||e.state==="failed"!=(e.lastError!==null)||Number(e.attempts)>0!=(e.deliveryStartedAt!==null)||e.state==="cancelled"!=(e.cancelledAt!==null&&e.cancelledBy!==null))throw _i(r,t);return e}function Qf(e){return!Di(e)||typeof e.type!="string"?!1:e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component))}function CP(e){return e===null||Di(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var cs=(e,t)=>tm.join(e.commandsDir,`${t}.json`),dc=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},lr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),AP=e=>e.trim().length>0&&Buffer.byteLength(e)<=32*1024&&![...e].some(t=>{let n=t.charCodeAt(0);return n<=8||n>=11&&n<=31||n>=127&&n<=159}),Di=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),EP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",_i=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function sm(e,t=new Date){return xi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function im(e,t=new Date){return e.state==="delivered"?e:(xi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function om(e,t,n=new Date){return e.state==="failed"?e:(xi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function am(e,t,n=new Date){return e.state==="cancelled"?e:(xi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function xi(e,t,n){if(!t.includes(e.state))throw new g("COMMAND_STATE_CONFLICT",`Cannot ${n} command ${e.id} while it is ${e.state}.`,{details:{commandId:e.id,state:e.state,allowedStates:t}})}import{randomUUID as OP}from"node:crypto";var uc=32*1024,lm=1440*60*1e3,pc=256,$P=["delivered","failed","cancelled"],fc={type:"system",component:"orchestration-supervisor"};async function NP(e,t){if(qP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>lm)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:lm}});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)>pc)throw new g("CLI_USAGE",`Idempotency key exceeds ${pc} characters.`,{details:{maxIdempotencyKeyLength:pc}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${OP()}`,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 nm(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw cm(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function DP(e,t){return{kind:"showPromptCommand",command:await Fi(e,t)}}async function _P(e,t){let n=await je(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function FP(e,t,n){let r=!1,s=await ds(e,t,i=>{if(i.state==="cancelled")return i;let o=am(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw cm(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function xP(e,t){let n=await ds(e,t,r=>sm(r));return await vn(e,n,"command.delivering",fc),n}async function LP(e,t){let n=await ds(e,t,r=>im(r));return await vn(e,n,"command.delivered",fc),n}async function MP(e,t,n){let r=await ds(e,t,s=>om(s,n));return await vn(e,r,"command.failed",fc),r}async function jP(e,t,n){let r=[...n.states??$P],s=Date.now()+n.timeoutMs;for(;;){let i=await Fi(e,t);if(r.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:r};if(n.signal?.aborted)throw new g("OPERATION_CANCELLED",`Cancelled while waiting for command ${t}.`,{retryable:!0,details:{commandId:t,cancelled:!0}});let o=s-Date.now();if(o<=0)throw new g("OPERATION_TIMEOUT",`Timed out after ${n.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:r,timeoutMs:n.timeoutMs}});await UP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function qP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>uc)throw new g("CLI_USAGE",`Prompt exceeds the ${uc}-byte limit.`,{details:{maxPromptBytes:uc,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new g("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await Me(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function UP(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 cm=(e,t)=>new g("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),ue={create:NP,show:DP,list:_P,cancel:FP,wait:jP,beginDelivery:xP,completeDelivery:LP,fail:MP};import{randomUUID as um,timingSafeEqual as BP}from"node:crypto";import{mkdir as WP,readFile as VP,readdir as KP}from"node:fs/promises";import pm from"node:path";var GP=10080*60*1e3,HP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},YP=["task.create-child","task.children","task.cancel-tree"],zP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function st(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await WP(yc(e),{recursive:!0,mode:448}),await H(e,t.id,async o=>{let a=o.ptyTabs.find(d=>d.id===s.id&&d.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${um()}`,c=await Li(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new g("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await JP(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 JP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${um()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...YP],targetPolicy:"children-only",limits:{...HP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+GP).toISOString(),revokedAt:null,revokedBy:null};return await U(wc(e,o.id),o,{mode:384}),o}async function Qe(e,t,n,r){let s=await QP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!zP.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await XP(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 XP(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 fm(e,t,n){let r=await Li(e,t);r&&(r.revokedAt||await U(wc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function gc(e,t,n){let r=await KP(yc(e)).catch(i=>mm(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await Li(e,o[1]);!a||!t.has(a.taskId)||(await fm(e,a.id,n),s.push(a.id))}return s}async function QP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Cn("<redacted>","token is invalid");let s=await Li(e,r);if(!s)throw new g("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!BP(i,o))&&Cn(r,"token is invalid"),s}async function Li(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await VP(wc(e,t),"utf8"));if(!ZP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(mm(n))return null;throw n}}function ZP(e,t){if(!hc(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"&&eS(r))&&e.targetPolicy==="children-only"&&hc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&mc(e.createdAt)&&mc(e.expiresAt)&&dm(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||mc(e.revokedAt)&&dm(e.revokedBy))}function dm(e){return hc(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 yc=e=>pm.join(e.orchestrationDir,"capabilities"),wc=(e,t)=>pm.join(yc(e),`${t}.json`),eS=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),hc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),mc=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),mm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as hm,readFile as tS,rm as kc,stat as nS,writeFile as rS}from"node:fs/promises";import Tc from"node:path";var sS=20,iS=3e4,oS=5e3;async function bc(e,t){let n=Tc.join(e.runtimeDir,"delegation.lock");await hm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await hm(n);try{await rS(Tc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await kc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!cS(s))throw s;if(await aS(n))continue;if(Date.now()-r>=iS)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,sS))}try{return await t()}finally{await kc(n,{recursive:!0,force:!0})}}async function aS(e){let t=await tS(Tc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&lS(t.pid))return!1;let n=await nS(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<oS?!1:(await kc(e,{recursive:!0,force:!0}),!0)}function lS(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 cS=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var dS={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Rc(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await st(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function Pc(e,t,n={}){return bc(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await Qe(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??dS,a=uS(r,t),l=t.prompt.trim();if(l.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});Buffer.byteLength(l)>o.maxPromptBytes&&Mi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Mi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let d=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=d.find(T=>T.delegationIdempotencyKey===p);if(y){if(!pS(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 gm(y,!0)}}d.length>=o.maxChildren&&Mi("children",o.maxChildren),d.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Mi("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await st(e,y,i)})}),m=await S.getTask(e,f.taskId);try{await Me(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return gm(m,!1)})}async function Sc(e,t,n){n&&await Qe(e,n,"task.children",t),await S.getTask(e,t);let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function Ic(e,t,n){return bc(e,async()=>{let s=(n?await Qe(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,u=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))u(y.id)}};u(t);let d=[],p=[],h=[];try{await gc(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){d.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,f,{preserveWorktree:!0});let y=await S.closeTask(e,f.id);d.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await Me(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:d,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:d}})}function gm(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 uS(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 pS(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Mi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var ji=Symbol.for("yaml.alias"),qi=Symbol.for("yaml.document"),it=Symbol.for("yaml.map"),vc=Symbol.for("yaml.pair"),qe=Symbol.for("yaml.scalar"),Lt=Symbol.for("yaml.seq"),Ae=Symbol.for("yaml.node.type"),Ue=e=>!!e&&typeof e=="object"&&e[Ae]===ji,St=e=>!!e&&typeof e=="object"&&e[Ae]===qi,ot=e=>!!e&&typeof e=="object"&&e[Ae]===it,j=e=>!!e&&typeof e=="object"&&e[Ae]===vc,F=e=>!!e&&typeof e=="object"&&e[Ae]===qe,at=e=>!!e&&typeof e=="object"&&e[Ae]===Lt;function V(e){if(e&&typeof e=="object")switch(e[Ae]){case it:case Lt:return!0}return!1}function q(e){if(e&&typeof e=="object")switch(e[Ae]){case ji:case it:case qe:case Lt:return!0}return!1}var Ui=e=>(F(e)||V(e))&&!!e.anchor;var _e=Symbol("break visit"),ym=Symbol("skip children"),It=Symbol("remove node");function Ze(e,t){let n=wm(t);St(e)?cr(null,e.contents,n,Object.freeze([e]))===It&&(e.contents=null):cr(null,e,n,Object.freeze([]))}Ze.BREAK=_e;Ze.SKIP=ym;Ze.REMOVE=It;function cr(e,t,n,r){let s=km(e,t,n,r);if(q(s)||j(s))return Tm(e,r,s),cr(e,s,n,r);if(typeof s!="symbol"){if(V(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=cr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===_e)return _e;o===It&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=cr("key",t.key,n,r);if(i===_e)return _e;i===It&&(t.key=null);let o=cr("value",t.value,n,r);if(o===_e)return _e;o===It&&(t.value=null)}}return s}async function Bi(e,t){let n=wm(t);St(e)?await dr(null,e.contents,n,Object.freeze([e]))===It&&(e.contents=null):await dr(null,e,n,Object.freeze([]))}Bi.BREAK=_e;Bi.SKIP=ym;Bi.REMOVE=It;async function dr(e,t,n,r){let s=await km(e,t,n,r);if(q(s)||j(s))return Tm(e,r,s),dr(e,s,n,r);if(typeof s!="symbol"){if(V(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await dr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===_e)return _e;o===It&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=await dr("key",t.key,n,r);if(i===_e)return _e;i===It&&(t.key=null);let o=await dr("value",t.value,n,r);if(o===_e)return _e;o===It&&(t.value=null)}}return s}function wm(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 km(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(ot(t))return n.Map?.(e,t,r);if(at(t))return n.Seq?.(e,t,r);if(j(t))return n.Pair?.(e,t,r);if(F(t))return n.Scalar?.(e,t,r);if(Ue(t))return n.Alias?.(e,t,r)}function Tm(e,t,n){let r=t[t.length-1];if(V(r))r.items[e]=n;else if(j(r))e==="key"?r.key=n:r.value=n;else if(St(r))r.contents=n;else{let s=Ue(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var fS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},mS=e=>e.replace(/[!,[\]{}]/g,t=>fS[t]),vt=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&(this.yaml={explicit:e.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},e.defaultTags),this.atNextDocument=!1);let r=t.trim().split(/[ \t]+/),s=r.shift();switch(s){case"%TAG":{if(r.length!==2&&(n(0,"%TAG directive should contain exactly two parts"),r.length<2))return!1;let[i,o]=r;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,r.length!==1)return n(0,"%YAML directive should contain exactly one part"),!1;let[i]=r;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{let o=/^\d+\.\d+$/.test(i);return n(6,`Unsupported YAML version ${i}`,o),!1}}default:return n(0,`Unknown directive ${s}`,!0),!1}}tagName(t,n){if(t==="!")return"!";if(t[0]!=="!")return n(`Not a valid tag: ${t}`),null;if(t[1]==="<"){let o=t.slice(2,-1);return o==="!"||o==="!!"?(n(`Verbatim tags aren't resolved, so ${t} is invalid.`),null):(t[t.length-1]!==">"&&n("Verbatim tags must end with a >"),o)}let[,r,s]=t.match(/^(.*!)([^!]*)$/s);s||n(`The ${t} tag has no suffix`);let i=this.tags[r];if(i)try{return i+decodeURIComponent(s)}catch(o){return n(String(o)),null}return r==="!"?t:(n(`Could not resolve tag: ${t}`),null)}tagString(t){for(let[n,r]of Object.entries(this.tags))if(t.startsWith(r))return n+mS(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&q(t.contents)){let i={};Ze(t.contents,(o,a)=>{q(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
|
|
79
|
-
`)}};
|
|
80
|
-
`)?
|
|
77
|
+
`))l.pop();else{if(!a)throw nn(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let u=l[c];if(u.length===0)throw nn(i.name,`empty record at line ${c+1}`);let d;try{d=JSON.parse(u)}catch{throw nn(i.name,`invalid JSON at line ${c+1}`)}let p=RP(d,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw nn(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw nn(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw nn(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function _i(e){return(await ac(e.eventsDir).catch(n=>{if(cc(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Ni.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function fP(e,t,n){let r=await cP(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function mP(e,t){let n=await _i(e),r=Math.max(0,n.length-t),s=await gP(e),i=await hP(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await yP(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await lP(a.path,{force:!0});o.length>0&&await em(e.eventsDir)}async function hP(e){let t=ke(e).runs,n=await ac(t).catch(s=>{if(cc(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await ds(Ni.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 gP(e){let t=await ac(e.commandsDir).catch(r=>{if(cc(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await ds(Ni.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 yP(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await ds(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 wP(e){let t=(await _i(e)).at(-1);if(!t)return;let n=await ds(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await oc(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function kP(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 sc(t);return Jf(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}}):sc(t);return Jf(t,s.sequence,n),s.sequence}function Jf(e,t,n){if(n!==null&&t<n-1)throw new g("EVENT_CURSOR_EXPIRED",`Event cursor ${e} has expired.`,{details:{cursor:e,earliestAvailableSequence:n,resumeAfter:n-1}})}function TP(e){if(e.length===0||e.length>256)throw new g("CLI_USAGE","Event type glob must contain between 1 and 256 characters.",{});let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`)}function bP(e){let t=JSON.stringify(e,(n,r)=>/prompt|token|secret|password|authorization|capability/i.test(n)?"[REDACTED]":r);return t===void 0?null:JSON.parse(t)}function RP(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw nn(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!cr(i.workspaceId)||!cr(i.taskId)||!cr(i.agentTabId)||!cr(i.commandId)||!cr(i.furyRunId)||!cr(i.furyStepId)||!PP(i.actor)||!("data"in i))throw nn(t,`record at line ${n} has an invalid schema`);return i}function PP(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var cr=e=>e===null||typeof e=="string",Xf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,nn=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),sc=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),cc=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function ic(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 em(e){let t=await oc(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as rm,readdir as DP,readFile as sm}from"node:fs/promises";import im from"node:path";import{mkdir as tm,readFile as SP,rm as Di,stat as IP,writeFile as vP}from"node:fs/promises";import dc from"node:path";var CP=20,AP=3e4,EP=5e3;async function uc(e,t){let n=dc.join(e.runtimeDir,"command-store.lock");await tm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await tm(n);try{await vP(dc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Di(n,{recursive:!0,force:!0}),s}break}catch(s){if(!NP(s))throw s;if(await OP(n))continue;if(Date.now()-r>=AP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await _P(CP)}try{return await t()}finally{await Di(n,{recursive:!0,force:!0})}}async function OP(e){let t=await SP(dc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return $P(t.pid)?!1:(await Di(e,{recursive:!0,force:!0}),!0);let n=await IP(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<EP?!1:(await Di(e,{recursive:!0,force:!0}),!0)}function $P(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 NP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",_P=e=>new Promise(t=>setTimeout(t,e));async function Li(e,t){pc(t);try{let n=JSON.parse(await sm(us(e,t),"utf8"));return am(n,us(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?xi(t,us(e,t),n):n}}async function qe(e){await rm(e.commandsDir,{recursive:!0});let t=await DP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=im.join(e.commandsDir,r);try{n.push(am(JSON.parse(await sm(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:xi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function om(e,t){return pc(t.id),uc(e,async()=>{await rm(e.commandsDir,{recursive:!0});let n=await qe(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!FP(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await q(us(e,t.id),t),{command:t,created:!0}})}async function ps(e,t,n){return pc(t),uc(e,async()=>{let r=await Li(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await q(us(e,t),s),s})}function FP(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 am(e,t,n){if(!Fi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw xi("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||!Fi(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||!dr(e.expiresAt)||!dr(e.createdAt)||!dr(e.updatedAt)||e.deliveryStartedAt!==null&&!dr(e.deliveryStartedAt)||e.deliveredAt!==null&&!dr(e.deliveredAt)||e.cancelledAt!==null&&!dr(e.cancelledAt)||e.cancelledBy!==null&&!nm(e.cancelledBy)||!nm(e.actor)||!xP(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 xi(r,t);return e}function nm(e){return!Fi(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 xP(e){return e===null||Fi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var us=(e,t)=>im.join(e.commandsDir,`${t}.json`),pc=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},dr=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}),Fi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),MP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",xi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function lm(e,t=new Date){return Mi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function cm(e,t=new Date){return e.state==="delivered"?e:(Mi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function dm(e,t,n=new Date){return e.state==="failed"?e:(Mi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function um(e,t,n=new Date){return e.state==="cancelled"?e:(Mi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Mi(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 jP}from"node:crypto";var fc=32*1024,pm=1440*60*1e3,mc=256,qP=["delivered","failed","cancelled"],hc={type:"system",component:"orchestration-supervisor"};async function UP(e,t){if(zP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>pm)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:pm}});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)>mc)throw new g("CLI_USAGE",`Idempotency key exceeds ${mc} characters.`,{details:{maxIdempotencyKeyLength:mc}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${jP()}`,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 om(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw fm(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function BP(e,t){return{kind:"showPromptCommand",command:await Li(e,t)}}async function WP(e,t){let n=await qe(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function VP(e,t,n){let r=!1,s=await ps(e,t,i=>{if(i.state==="cancelled")return i;let o=um(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw fm(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function KP(e,t){let n=await ps(e,t,r=>lm(r));return await vn(e,n,"command.delivering",hc),n}async function GP(e,t){let n=await ps(e,t,r=>cm(r));return await vn(e,n,"command.delivered",hc),n}async function HP(e,t,n){let r=await ps(e,t,s=>dm(s,n));return await vn(e,r,"command.failed",hc),r}async function YP(e,t,n){let r=[...n.states??qP],s=Date.now()+n.timeoutMs;for(;;){let i=await Li(e,t);if(r.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:r};if(n.signal?.aborted)throw new g("OPERATION_CANCELLED",`Cancelled while waiting for command ${t}.`,{retryable:!0,details:{commandId:t,cancelled:!0}});let o=s-Date.now();if(o<=0)throw new g("OPERATION_TIMEOUT",`Timed out after ${n.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:r,timeoutMs:n.timeoutMs}});await JP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function zP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>fc)throw new g("CLI_USAGE",`Prompt exceeds the ${fc}-byte limit.`,{details:{maxPromptBytes:fc,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 je(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function JP(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var fm=(e,t)=>new g("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),ue={create:UP,show:BP,list:WP,cancel:VP,wait:YP,beginDelivery:KP,completeDelivery:GP,fail:HP};import{randomUUID as hm,timingSafeEqual as gm}from"node:crypto";import{mkdir as XP,readFile as QP,readdir as ZP}from"node:fs/promises";import ym from"node:path";var wm=10080*60*1e3,eS=1440*60*1e3,tS={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},nS=["task.create-child","task.children","task.cancel-tree"],rS=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function st(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await XP(bc(e),{recursive:!0,mode:448}),await H(e,t.id,async o=>{let a=o.ptyTabs.find(d=>d.id===s.id&&d.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${hm()}`,c=await An(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 sS(e,l,o.id,a.id,n)).token,a.capabilityId===l?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 sS(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${hm()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...nS],targetPolicy:"children-only",limits:{...tS},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+wm).toISOString(),revokedAt:null,revokedBy:null};return await q(ji(e,o.id),o,{mode:384}),o}async function wc(e,t){let n=await km(e,t);return n!==null&&kc(n)}async function En(e,t){let n=await km(e,t);if(!n||!kc(n))return;let r=n.id;await De(e,t.taskId,async()=>{let s=await S.getTask(e,t.taskId).catch(a=>{if(a instanceof g&&a.code==="TASK_NOT_FOUND")return null;throw a});if(!s||s.status==="closed"||s.ptyTabs.find(a=>a.id===t.agentTabId&&a.kind==="agent")?.capabilityId!==r)return;let o=await An(e,r);Tm(o,t)&&await iS(e,o)},{timeoutMs:1e3})}async function km(e,t){let n=t.capabilityToken.split(".")[0];if(!/^capability_[A-Za-z0-9-]+$/.test(n))return null;let r=await An(e,n);return Tm(r,t)?r:null}function Tm(e,t){if(!e||e.revokedAt||e.taskId!==t.taskId||e.agentTabId!==t.agentTabId)return!1;let n=Buffer.from(e.token),r=Buffer.from(t.capabilityToken);return n.length===r.length&&gm(n,r)}var kc=e=>!e.revokedAt&&Date.parse(e.expiresAt)<=Date.now()+eS;async function iS(e,t){if(!kc(t))return t;let n={...t,expiresAt:new Date(Date.now()+wm).toISOString()};return await q(ji(e,t.id),n,{mode:384}),n}async function Ze(e,t,n,r){let s=await aS(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!rS.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await oS(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 oS(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 bm(e,t,n){let r=await An(e,t);r&&await De(e,r.taskId,async()=>{let s=await An(e,t);!s||s.revokedAt||await q(ji(e,t),{...s,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384})})}async function Tc(e,t,n){let r=await ZP(bc(e)).catch(i=>Rm(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await An(e,o[1]);!a||!t.has(a.taskId)||(await bm(e,a.id,n),s.push(a.id))}return s}async function aS(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 An(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||!gm(i,o))&&Cn(r,"token is invalid"),s}async function An(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await QP(ji(e,t),"utf8"));if(!lS(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Rm(n))return null;throw n}}function lS(e,t){if(!yc(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"&&cS(r))&&e.targetPolicy==="children-only"&&yc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&gc(e.createdAt)&&gc(e.expiresAt)&&mm(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||gc(e.revokedAt)&&mm(e.revokedBy))}function mm(e){return yc(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){let n=t==="expired"?" Craig's daemon refreshes active sessions automatically. Restart the agent tab if its session is no longer running.":"";throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.${n}`,{details:{capabilityId:e,reason:t}})}var bc=e=>ym.join(e.orchestrationDir,"capabilities"),ji=(e,t)=>ym.join(bc(e),`${t}.json`),cS=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),yc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),gc=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Rm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Pm,readFile as dS,rm as Rc,stat as uS,writeFile as pS}from"node:fs/promises";import Pc from"node:path";var fS=20,mS=3e4,hS=5e3;async function Sc(e,t){let n=Pc.join(e.runtimeDir,"delegation.lock");await Pm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Pm(n);try{await pS(Pc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Rc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!wS(s))throw s;if(await gS(n))continue;if(Date.now()-r>=mS)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,fS))}try{return await t()}finally{await Rc(n,{recursive:!0,force:!0})}}async function gS(e){let t=await dS(Pc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&yS(t.pid))return!1;let n=await uS(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<hS?!1:(await Rc(e,{recursive:!0,force:!0}),!0)}function yS(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 wS=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var kS={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Ic(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await st(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function vc(e,t,n={}){return Sc(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await Ze(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??kS,a=TS(r,t),l=t.prompt.trim();if(l.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});Buffer.byteLength(l)>o.maxPromptBytes&&qi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&qi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let d=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=d.find(T=>T.delegationIdempotencyKey===p);if(y){if(!bS(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 Sm(y,!0)}}d.length>=o.maxChildren&&qi("children",o.maxChildren),d.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&qi("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await st(e,y,i)})}),m=await S.getTask(e,f.taskId);try{await je(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 Sm(m,!1)})}async function Cc(e,t,n){n&&await Ze(e,n,"task.children",t),await S.getTask(e,t);let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function Ac(e,t,n){return Sc(e,async()=>{let s=(n?await Ze(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,u=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))u(y.id)}};u(t);let d=[],p=[],h=[];try{await Tc(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 je(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 Sm(e,t){let n=e.type==="project"?"workspace":"repo",r=e.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new g("TASK_RECORD_INVALID",`Child task ${e.id} has no agent tab.`,{});return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,targetType:n,targetId:n==="workspace"?e.workspaceId:e.repoId,repoId:e.repoId,workspaceId:e.workspaceId,agentTabId:r.id,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function TS(e,t){if(t.repoId&&t.workspaceId)throw new g("CLI_USAGE","Child task creation accepts only one of repoId or workspaceId.",{});if(t.workspaceId){if(e.type!=="project"||t.workspaceId!==e.workspaceId)throw new g("CAPABILITY_DENIED",`Workspace ${t.workspaceId} is outside parent task ${e.id}.`,{details:{parentTaskId:e.id,workspaceId:t.workspaceId}});return{type:"workspace",id:t.workspaceId}}return t.repoId?{type:"repo",id:t.repoId}:e.type==="project"?{type:"workspace",id:e.workspaceId}:{type:"repo",id:e.repoId}}function bS(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function qi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ui=Symbol.for("yaml.alias"),Bi=Symbol.for("yaml.document"),it=Symbol.for("yaml.map"),Ec=Symbol.for("yaml.pair"),Ue=Symbol.for("yaml.scalar"),Mt=Symbol.for("yaml.seq"),Ee=Symbol.for("yaml.node.type"),Be=e=>!!e&&typeof e=="object"&&e[Ee]===Ui,It=e=>!!e&&typeof e=="object"&&e[Ee]===Bi,ot=e=>!!e&&typeof e=="object"&&e[Ee]===it,j=e=>!!e&&typeof e=="object"&&e[Ee]===Ec,F=e=>!!e&&typeof e=="object"&&e[Ee]===Ue,at=e=>!!e&&typeof e=="object"&&e[Ee]===Mt;function V(e){if(e&&typeof e=="object")switch(e[Ee]){case it:case Mt:return!0}return!1}function U(e){if(e&&typeof e=="object")switch(e[Ee]){case Ui:case it:case Ue:case Mt:return!0}return!1}var Wi=e=>(F(e)||V(e))&&!!e.anchor;var xe=Symbol("break visit"),Im=Symbol("skip children"),vt=Symbol("remove node");function et(e,t){let n=vm(t);It(e)?ur(null,e.contents,n,Object.freeze([e]))===vt&&(e.contents=null):ur(null,e,n,Object.freeze([]))}et.BREAK=xe;et.SKIP=Im;et.REMOVE=vt;function ur(e,t,n,r){let s=Cm(e,t,n,r);if(U(s)||j(s))return Am(e,r,s),ur(e,s,n,r);if(typeof s!="symbol"){if(V(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=ur(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===xe)return xe;o===vt&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=ur("key",t.key,n,r);if(i===xe)return xe;i===vt&&(t.key=null);let o=ur("value",t.value,n,r);if(o===xe)return xe;o===vt&&(t.value=null)}}return s}async function Vi(e,t){let n=vm(t);It(e)?await pr(null,e.contents,n,Object.freeze([e]))===vt&&(e.contents=null):await pr(null,e,n,Object.freeze([]))}Vi.BREAK=xe;Vi.SKIP=Im;Vi.REMOVE=vt;async function pr(e,t,n,r){let s=await Cm(e,t,n,r);if(U(s)||j(s))return Am(e,r,s),pr(e,s,n,r);if(typeof s!="symbol"){if(V(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await pr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===xe)return xe;o===vt&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=await pr("key",t.key,n,r);if(i===xe)return xe;i===vt&&(t.key=null);let o=await pr("value",t.value,n,r);if(o===xe)return xe;o===vt&&(t.value=null)}}return s}function vm(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 Cm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(ot(t))return n.Map?.(e,t,r);if(at(t))return n.Seq?.(e,t,r);if(j(t))return n.Pair?.(e,t,r);if(F(t))return n.Scalar?.(e,t,r);if(Be(t))return n.Alias?.(e,t,r)}function Am(e,t,n){let r=t[t.length-1];if(V(r))r.items[e]=n;else if(j(r))e==="key"?r.key=n:r.value=n;else if(It(r))r.contents=n;else{let s=Be(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var RS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},PS=e=>e.replace(/[!,[\]{}]/g,t=>RS[t]),Ct=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&(this.yaml={explicit:e.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},e.defaultTags),this.atNextDocument=!1);let r=t.trim().split(/[ \t]+/),s=r.shift();switch(s){case"%TAG":{if(r.length!==2&&(n(0,"%TAG directive should contain exactly two parts"),r.length<2))return!1;let[i,o]=r;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,r.length!==1)return n(0,"%YAML directive should contain exactly one part"),!1;let[i]=r;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{let o=/^\d+\.\d+$/.test(i);return n(6,`Unsupported YAML version ${i}`,o),!1}}default:return n(0,`Unknown directive ${s}`,!0),!1}}tagName(t,n){if(t==="!")return"!";if(t[0]!=="!")return n(`Not a valid tag: ${t}`),null;if(t[1]==="<"){let o=t.slice(2,-1);return o==="!"||o==="!!"?(n(`Verbatim tags aren't resolved, so ${t} is invalid.`),null):(t[t.length-1]!==">"&&n("Verbatim tags must end with a >"),o)}let[,r,s]=t.match(/^(.*!)([^!]*)$/s);s||n(`The ${t} tag has no suffix`);let i=this.tags[r];if(i)try{return i+decodeURIComponent(s)}catch(o){return n(String(o)),null}return r==="!"?t:(n(`Could not resolve tag: ${t}`),null)}tagString(t){for(let[n,r]of Object.entries(this.tags))if(t.startsWith(r))return n+PS(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&U(t.contents)){let i={};et(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
|
+
`)}};Ct.defaultYaml={explicit:!1,version:"1.2"};Ct.defaultTags={"!!":"tag:yaml.org,2002:"};function Ki(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 Oc(e){let t=new Set;return et(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function $c(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function Em(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Oc(e));let o=$c(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(F(o.node)||V(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function rn(e,t,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s<i;++s){let o=r[s],a=rn(e,r,String(s),o);a===void 0?delete r[s]:a!==o&&(r[s]=a)}else if(r instanceof Map)for(let s of Array.from(r.keys())){let i=r.get(s),o=rn(e,r,s,i);o===void 0?r.delete(s):o!==i&&r.set(s,o)}else if(r instanceof Set)for(let s of Array.from(r)){let i=rn(e,r,s,s);i===void 0?r.delete(s):i!==s&&(r.delete(s),r.add(i))}else for(let[s,i]of Object.entries(r)){let o=rn(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function fe(e,t,n){if(Array.isArray(e))return e.map((r,s)=>fe(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Wi(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=e.toJSON(t,n);return n.onCreate&&n.onCreate(s),s}return typeof e=="bigint"&&!n?.keep?Number(e):e}var sn=class{constructor(t){Object.defineProperty(this,Ee,{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(!It(t))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:t,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=fe(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?rn(i,{"":a},"",a):a}};var jt=class extends sn{constructor(t){super(Ui),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=[],et(t,{Node:(i,o)=>{(Be(o)||Wi(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(t,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=r.get(o);if(a||(fe(o,null,n),a=r.get(o)),a?.res===void 0){let l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Gi(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(Ki(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 Gi(e,t,n){if(Be(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(V(t)){let r=0;for(let s of t.items){let i=Gi(e,s,n);i>r&&(r=i)}return r}else if(j(t)){let r=Gi(e,t.key,n),s=Gi(e,t.value,n);return Math.max(r,s)}return 1}var Hi=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends sn{constructor(t){super(Ue),this.value=t}toJSON(t,n){return n?.keep?this.value:fe(this.value,t,n)}toString(){return String(this.value)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var SS="tag:yaml.org,2002:";function IS(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 qt(e,t,n){if(It(e)&&(e=e.contents),U(e))return e;if(j(e)){let d=n.schema[it].createNode?.(n.schema,null,n);return d.items.push(e),d}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<"u"&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,l;if(r&&e&&typeof e=="object"){if(l=a.get(e),l)return l.anchor??(l.anchor=s(e)),new jt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=SS+t.slice(2));let c=IS(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let d=new O(e);return l&&(l.node=d),d}c=e instanceof Map?o[it]:Symbol.iterator in Object(e)?o[Mt]:o[it]}i&&(i(c),delete n.onTagObj);let u=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new O(e);return t?u.tag=t:c.default||(u.tag=c.tag),l&&(l.node=u),u}function fs(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 qt(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 mr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,fr=class extends sn{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>U(r)||j(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(mr(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(V(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,fs(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(V(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&F(i)?i.value:i:V(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!j(n))return!1;let r=n.value;return r==null||t&&F(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(t){let[n,...r]=t;if(r.length===0)return this.has(n);let s=this.get(n,!0);return V(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(V(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,fs(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var Om=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function tt(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var At=(e,t,n)=>e.endsWith(`
|
|
80
|
+
`)?tt(n,t):n.includes(`
|
|
81
81
|
`)?`
|
|
82
|
-
`+
|
|
83
|
-
`)n===
|
|
82
|
+
`+tt(n,t):(e.endsWith(" ")?"":" ")+n;var Nc="flow",Yi="block",ms="quoted";function hs(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],u={},d=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):d=s-r);let p,h,f=!1,m=-1,y=-1,T=-1;n===Yi&&(m=$m(e,m,t.length),m!==-1&&(d=m+l));for(let b;b=e[m+=1];){if(n===ms&&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===Yi&&(m=$m(e,m,t.length)),d=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
|
|
84
84
|
`&&h!==" "){let $=e[m+1];$&&$!==" "&&$!==`
|
|
85
|
-
`&&$!==" "&&(p=m)}if(m>=d)if(p)c.push(p),d=p+l,p=void 0;else if(n===
|
|
86
|
-
${t}${e.slice(0,N)}`:(n===
|
|
87
|
-
${t}${e.slice($+1,N)}`)}return R}function
|
|
88
|
-
`);r=t,s=t+1,i=e[s]}return r}var
|
|
89
|
-
`){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function
|
|
85
|
+
`&&$!==" "&&(p=m)}if(m>=d)if(p)c.push(p),d=p+l,p=void 0;else if(n===ms){for(;h===" "||h===" ";)h=b,b=e[m+=1],f=!0;let $=m>T+1?m-2:y-1;if(u[$])return e;c.push($),u[$]=!0,d=$+l,p=void 0}else f=!0}h=b}if(f&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let b=0;b<c.length;++b){let $=c[b],N=c[b+1]||e.length;$===0?R=`
|
|
86
|
+
${t}${e.slice(0,N)}`:(n===ms&&u[$]&&(R+=`${e[$]}\\`),R+=`
|
|
87
|
+
${t}${e.slice($+1,N)}`)}return R}function $m(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 Ji=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Xi=e=>/^(%|---|\.\.\.)/m.test(e);function vS(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 gs(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Xi(e)?" ":""),o="",a=0;for(let l=0,c=n[l];c;c=n[++l])if(c===" "&&n[l+1]==="\\"&&n[l+2]==="n"&&(o+=n.slice(a,l)+"\\ ",l+=1,a=l,c="\\"),c==="\\")switch(n[l+1]){case"u":{o+=n.slice(a,l);let u=n.substr(l+2,4);switch(u){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:u.substr(0,2)==="00"?o+="\\x"+u.substr(2):o+=n.substr(l,6)}l+=5,a=l+1}break;case"n":if(r||n[l+2]==='"'||n.length<s)l+=1;else{for(o+=n.slice(a,l)+`
|
|
90
90
|
|
|
91
91
|
`;n[l+2]==="\\"&&n[l+3]==="n"&&n[l+4]!=='"';)o+=`
|
|
92
|
-
`,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:
|
|
93
|
-
`)||/[ \t]\n|\n[ \t]/.test(e))return
|
|
94
|
-
${n}`)+"'";return t.implicitKey?r:
|
|
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:hs(o,i,ms,Ji(t,!1))}function _c(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
|
|
93
|
+
`)||/[ \t]\n|\n[ \t]/.test(e))return gs(e,t);let n=t.indent||(Xi(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
|
|
94
|
+
${n}`)+"'";return t.implicitKey?r:hs(r,n,Nc,Ji(t,!1))}function hr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=gs;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=_c:i&&!s?r=gs:r=n?_c:gs}return r(e,t)}var Dc;try{Dc=new RegExp(`(^|(?<!
|
|
95
95
|
))
|
|
96
96
|
+(?!
|
|
97
|
-
|$)`,"g")}catch{
|
|
97
|
+
|$)`,"g")}catch{Dc=/\n+(?!\n|$)/g}function zi({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 hr(n,r);let c=r.indent||(r.forceBlockIndent||Xi(n)?" ":""),u=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!vS(n,l,c.length);if(!n)return u?`|
|
|
98
98
|
`:`>
|
|
99
99
|
`;let d,p;for(p=n.length;p>0;--p){let N=n[p-1];if(N!==`
|
|
100
100
|
`&&N!==" "&&N!==" ")break}let h=n.substring(p),f=h.indexOf(`
|
|
101
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(
|
|
102
|
+
`&&(h=h.slice(0,-1)),h=h.replace(Dc,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let N=n[y];if(N===" ")m=!0;else if(N===`
|
|
103
103
|
`)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let $=(m?c?"2":"1":"")+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}`),
|
|
104
|
+
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),_=!1,D=Ji(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(D.onOverflow=()=>{_=!0});let A=hs(`${R}${N}${h}`,c,Yi,D);if(!_)return`>${$}
|
|
105
105
|
${c}${A}`}return n=n.replace(/\n+/g,`$&${c}`),`|${$}
|
|
106
|
-
${c}${R}${n}${h}`}function
|
|
107
|
-
`)||u&&/[[\]{},]/.test(i))return
|
|
108
|
-
`)?
|
|
109
|
-
`))return
|
|
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
|
|
111
|
-
${t.indent}${a}`:a}function
|
|
112
|
-
${a}:`):(y=`${y}:`,p&&(y+=
|
|
113
|
-
`:"",R){let
|
|
114
|
-
${
|
|
115
|
-
`&&b&&(
|
|
106
|
+
${c}${R}${n}${h}`}function CS(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 hr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||u||!i.includes(`
|
|
108
|
+
`)?hr(i,t):zi(e,t,n,r);if(!a&&!u&&s!==O.PLAIN&&i.includes(`
|
|
109
|
+
`))return zi(e,t,n,r);if(Xi(i)){if(l==="")return t.forceBlockIndent=!0,zi(e,t,n,r);if(a&&l===c)return hr(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 hr(i,t)}return a?d:hs(d,l,Nc,Ji(t,!1))}function On(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?hr(o.value,t):zi(o,t,n,r);case O.QUOTE_DOUBLE:return gs(o.value,t);case O.QUOTE_SINGLE:return _c(o.value,t);case O.PLAIN:return CS(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 Qi(e,t){let n=Object.assign({blockQuote:!0,commentString:Om,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trailingComma:!1,trueStr:"true",verifyAliasOrder:!0},e.schema.toStringOptions,t),r;switch(n.collectionStyle){case"block":r=!1;break;case"flow":r=!0;break;default:r=null}return{anchors:new Set,doc:e,flowCollectionPadding:n.flowCollectionPadding?" ":"",indent:"",indentStep:typeof n.indent=="number"?" ".repeat(n.indent):" ",inFlow:r,options:n}}function AS(e,t){if(t.tag){let s=e.filter(i=>i.tag===t.tag);if(s.length>0)return s.find(i=>i.format===t.format)??s[0]}let n,r;if(F(t)){r=t.value;let s=e.filter(i=>i.identify?.(r));if(s.length>1){let i=s.filter(o=>o.test);i.length>0&&(s=i)}n=s.find(i=>i.format===t.format)??s.find(i=>!i.format)}else r=t,n=e.find(s=>s.nodeClass&&r instanceof s.nodeClass);if(!n){let s=r?.constructor?.name??(r===null?"null":typeof r);throw new Error(`Tag not resolved for ${s} value`)}return n}function ES(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(F(e)||V(e))&&e.anchor;i&&Ki(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 Ut(e,t,n,r){if(j(e))return e.toString(t,n,r);if(Be(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=AS(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):F(i)?On(i,t,n,r):i.toString(t,n,r);return o?F(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
|
|
111
|
+
${t.indent}${a}`:a}function Nm({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(V(e)||!U(e)&&typeof e=="object"){let D="With simple keys, collection cannot be used as a key value";throw new Error(D)}}let h=!d&&(!e||p&&t==null&&!n.inFlow||V(e)||(F(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(d||!i),indent:a+l});let f=!1,m=!1,y=Ut(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+=At(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=At(y,n.indent,c(p))),y=`? ${y}
|
|
112
|
+
${a}:`):(y=`${y}:`,p&&(y+=At(y,n.indent,c(p))));let T,R,b;U(t)?(T=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(T=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&F(t)&&(n.indentAtStart=y.length+1),m=!1,!u&&l.length>=2&&!n.inFlow&&!h&&at(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=Ut(t,n,()=>$=!0,()=>m=!0),_=" ";if(p||T||R){if(_=T?`
|
|
113
|
+
`:"",R){let D=c(R);_+=`
|
|
114
|
+
${tt(D,n.indent)}`}N===""&&!n.inFlow?_===`
|
|
115
|
+
`&&b&&(_=`
|
|
116
116
|
|
|
117
|
-
`):
|
|
118
|
-
${n.indent}`}else if(!h&&V(t)){let
|
|
119
|
-
`),z=A!==-1,
|
|
117
|
+
`):_+=`
|
|
118
|
+
${n.indent}`}else if(!h&&V(t)){let D=N[0],A=N.indexOf(`
|
|
119
|
+
`),z=A!==-1,Le=n.inFlow??t.flow??t.items.length===0;if(z||!Le){let w=!1;if(z&&(D==="&"||D==="!")){let G=N.indexOf(" ");D==="&"&&G!==-1&&G<A&&N[G+1]==="!"&&(G=N.indexOf(" ",G+1)),(G===-1||A<G)&&(w=!0)}w||(_=`
|
|
120
120
|
${n.indent}`)}}else(N===""||N[0]===`
|
|
121
|
-
`)&&(
|
|
121
|
+
`)&&(_="");return y+=_+N,n.inFlow?$&&r&&r():b&&!$?y+=At(y,n.indent,c(b)):m&&s&&s(),y}function Fc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Zi="<<",lt={identify:e=>e===Zi||typeof e=="symbol"&&e.description===Zi,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Zi)),{addToJSMap:Lc}),stringify:()=>Zi},_m=(e,t)=>(lt.identify(t)||F(t)&&(!t.type||t.type===O.PLAIN)&<.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===lt.tag&&n.default);function Lc(e,t,n){let r=Dm(e,n);if(at(r))for(let s of r.items)xc(e,t,s);else if(Array.isArray(r))for(let s of r)xc(e,t,s);else xc(e,t,r)}function xc(e,t,n){let r=Dm(e,n);if(!ot(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,e,Map);for(let[i,o]of s)t instanceof Map?t.has(i)||t.set(i,o):t instanceof Set?t.add(i):Object.prototype.hasOwnProperty.call(t,i)||Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return t}function Dm(e,t){return e&&Be(t)?t.resolve(e.doc,e):t}function eo(e,t,{key:n,value:r}){if(U(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(_m(e,n))Lc(e,t,r);else{let s=fe(n,"",e);if(t instanceof Map)t.set(s,fe(r,s,e));else if(t instanceof Set)t.add(s);else{let i=OS(n,s,e),o=fe(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function OS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(U(e)&&n?.doc){let r=Qi(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)+'..."'),Fc(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 gr(e,t,n){let r=qt(e,void 0,n),s=qt(t,void 0,n);return new ie(r,s)}var ie=class e{constructor(t,n=null){Object.defineProperty(this,Ee,{value:Ec}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return U(n)&&(n=n.clone(t)),U(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return eo(n,r,this)}toString(t,n,r){return t?.doc?Nm(this,t,n,r):JSON.stringify(this)}};function no(e,t,n){return(t.inFlow??e.flow?NS:$S)(e,t,n)}function $S({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(""),to(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(""),to(n,p,R.commentBefore,d))}d=!1;let T=Ut(m,u,()=>y=null,()=>d=!0);y&&(T+=At(T,i,c(y))),d&&y&&(d=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
|
|
122
122
|
${l}${m}`:`
|
|
123
123
|
`}}return e?(h+=`
|
|
124
|
-
`+
|
|
125
|
-
`)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=d.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=
|
|
124
|
+
`+tt(c(e),l),a&&a()):d&&o&&o(),h}function NS({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(""),to(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(""),to(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 T=Ut(m,l,()=>y=null);c||(c=d.length>u||T.includes(`
|
|
125
|
+
`)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=d.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=At(T,r,a(y))),d.push(T),u=d.length}let{start:p,end:h}=n;if(d.length===0)return p+h;if(!c){let f=d.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of d)f+=m?`
|
|
126
126
|
${i}${s}${m}`:`
|
|
127
127
|
`;return`${f}
|
|
128
|
-
${s}${h}`}else return`${p}${o}${d.join(" ")}${o}${h}`}function
|
|
129
|
-
`:" ")}return
|
|
128
|
+
${s}${h}`}else return`${p}${o}${d.join(" ")}${o}${h}`}function to({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=tt(t(r),e);n.push(i.trimStart())}}function on(e,t){let n=F(t)?t.value:t;for(let r of e)if(j(r)&&(r.key===t||r.key===n||F(r.key)&&r.key.value===n))return r}var ae=class extends fr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(it,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(gr(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;j(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new ie(t,t?.value):r=new ie(t.key,t.value);let s=on(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);F(s.value)&&Hi(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=on(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=on(this.items,t)?.value;return(!n&&F(s)?s.value:s)??void 0}has(t){return!!on(this.items,t)}set(t,n){this.add(new ie(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)eo(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})),no(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var ct={collection:"map",default:!0,nodeClass:ae,tag:"tag:yaml.org,2002:map",resolve(e,t){return ot(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>ae.from(e,t,n)};var Re=class extends fr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Mt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=ro(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=ro(t);if(typeof r!="number")return;let s=this.items[r];return!n&&F(s)?s.value:s}has(t){let n=ro(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=ro(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];F(s)&&Hi(n)?s.value=n:this.items[r]=n}toJSON(t,n){let r=[];n?.onCreate&&n.onCreate(r);let s=0;for(let i of this.items)r.push(fe(i,String(s++),n));return r}toString(t,n,r){return t?no(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(qt(a,void 0,r))}}return i}};function ro(e){let t=F(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var dt={collection:"seq",default:!0,nodeClass:Re,tag:"tag:yaml.org,2002:seq",resolve(e,t){return at(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>Re.from(e,t,n)};var an={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),On(e,t,n,r)}};var $n={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"&&$n.test.test(e)?e:t.options.nullStr};var ys={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&&ys.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 so={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},io={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)}},oo={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 ao=e=>typeof e=="bigint"||Number.isInteger(e),Mc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function Fm(e,t,n){let{value:r}=e;return ao(r)&&r>=0?n+r.toString(t):Pe(e)}var lo={identify:e=>ao(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>Mc(e,2,8,n),stringify:e=>Fm(e,8,"0o")},co={identify:ao,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>Mc(e,0,10,n),stringify:Pe},uo={identify:e=>ao(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>Mc(e,2,16,n),stringify:e=>Fm(e,16,"0x")};var xm=[ct,dt,an,$n,ys,lo,co,uo,so,io,oo];function Lm(e){return typeof e=="bigint"||Number.isInteger(e)}var po=({value:e})=>JSON.stringify(e),_S=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:po},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:po},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:po},{identify:Lm,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})=>Lm(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:po}],DS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},Mm=[ct,dt].concat(_S,DS);var ws={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 On({comment:e,type:t,value:a},r,s,i)}};function jc(e,t){if(at(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!j(r)){if(ot(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new ie(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
|
|
130
130
|
${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment}
|
|
131
|
-
${i.comment}`:r.comment}r=s}e.items[n]=j(r)?r:new ie(r)}}else t("Expected a sequence for this tag");return e}function
|
|
132
|
-
`)?(n.push("..."),n.push(
|
|
131
|
+
${i.comment}`:r.comment}r=s}e.items[n]=j(r)?r:new ie(r)}}else t("Expected a sequence for this tag");return e}function qc(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(gr(a,l,n))}return s}var ks={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:jc,createNode:qc};var yr=class e extends Re{constructor(){super(),this.add=ae.prototype.add.bind(this),this.delete=ae.prototype.delete.bind(this),this.get=ae.prototype.get.bind(this),this.has=ae.prototype.has.bind(this),this.set=ae.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(j(s)?(i=fe(s.key,"",n),o=fe(s.value,i,n)):i=fe(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=qc(t,n,r),i=new this;return i.items=s.items,i}};yr.tag="tag:yaml.org,2002:omap";var Ts={collection:"seq",identify:e=>e instanceof Map,nodeClass:yr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=jc(e,t),r=[];for(let{key:s}of n.items)F(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new yr,n)},createNode:(e,t,n)=>yr.from(e,t,n)};function jm({value:e,source:t},n){return t&&(e?Uc:Bc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Uc={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:jm},Bc={identify:e=>e===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new O(!1),stringify:jm};var qm={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},Um={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)}},Bm={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 bs=e=>typeof e=="bigint"||Number.isInteger(e);function fo(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 Wc(e,t,n){let{value:r}=e;if(bs(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Pe(e)}var Wm={identify:bs,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>fo(e,2,2,n),stringify:e=>Wc(e,2,"0b")},Vm={identify:bs,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>fo(e,1,8,n),stringify:e=>Wc(e,8,"0")},Km={identify:bs,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>fo(e,0,10,n),stringify:Pe},Gm={identify:bs,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>fo(e,2,16,n),stringify:e=>Wc(e,16,"0x")};var wr=class e extends ae{constructor(t){super(t),this.tag=e.tag}add(t){let n;j(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new ie(t.key,null):n=new ie(t,null),on(this.items,n.key)||this.items.push(n)}get(t,n){let r=on(this.items,t);return!n&&j(r)?F(r.key)?r.key.value:r.key:r}set(t,n){if(typeof n!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof n}`);let r=on(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new ie(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(gr(o,null,r));return i}};wr.tag="tag:yaml.org,2002:set";var Rs={collection:"map",identify:e=>e instanceof Set,nodeClass:wr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>wr.from(e,t,n),resolve(e,t){if(ot(e)){if(e.hasAllNullValues(!0))return Object.assign(new wr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Vc(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 Hm(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 mo={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})=>Vc(e,n),stringify:Hm},ho={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=>Vc(e,!1),stringify:Hm},kr={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(kr.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=Vc(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 Kc=[ct,dt,an,$n,Uc,Bc,Wm,Vm,Km,Gm,qm,Um,Bm,ws,lt,Ts,ks,Rs,mo,ho,kr];var Ym=new Map([["core",xm],["failsafe",[ct,dt,an]],["json",Mm],["yaml11",Kc],["yaml-1.1",Kc]]),zm={binary:ws,bool:ys,float:oo,floatExp:io,floatNaN:so,floatTime:ho,int:co,intHex:uo,intOct:lo,intTime:mo,map:ct,merge:lt,null:$n,omap:Ts,pairs:ks,seq:dt,set:Rs,timestamp:kr},Jm={"tag:yaml.org,2002:binary":ws,"tag:yaml.org,2002:merge":lt,"tag:yaml.org,2002:omap":Ts,"tag:yaml.org,2002:pairs":ks,"tag:yaml.org,2002:set":Rs,"tag:yaml.org,2002:timestamp":kr};function go(e,t,n){let r=Ym.get(t);if(r&&!e)return n&&!r.includes(lt)?r.concat(lt):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(Ym.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${t}"; use one of ${i} or define customTags array`)}if(Array.isArray(e))for(let i of e)s=s.concat(i);else typeof e=="function"&&(s=e(s.slice()));return n&&(s=s.concat(lt)),s.reduce((i,o)=>{let a=typeof o=="string"?zm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(zm).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 FS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,Ps=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?go(t,"compat"):t?go(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?Jm:{},this.tags=go(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,it,{value:ct}),Object.defineProperty(this,Ue,{value:an}),Object.defineProperty(this,Mt,{value:dt}),this.sortMapEntries=typeof o=="function"?o:o===!0?FS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function Xm(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=Qi(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(tt(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(tt(u,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Ut(e.contents,s,()=>a=null,l);a&&(c+=At(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Ut(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
|
|
132
|
+
`)?(n.push("..."),n.push(tt(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(tt(i(l),"")))}return n.join(`
|
|
133
133
|
`)+`
|
|
134
|
-
`}var ln=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,
|
|
134
|
+
`}var ln=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ee,{value:Bi});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 Ct({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Ee]:{value:Bi}});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){Tr(this.contents)&&this.contents.add(t)}addIn(t,n){Tr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=Oc(this);t.anchor=!n||r.has(n)?$c(n||"a",r):n}return new jt(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:u}=r??{},{onAnchor:d,setAnchors:p,sourceObjects:h}=Em(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:d,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=qt(t,u,f);return a&&V(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new ie(s,i)}delete(t){return Tr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return mr(t)?this.contents==null?!1:(this.contents=null,!0):Tr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return V(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return mr(t)?!n&&F(this.contents)?this.contents.value:this.contents:V(this.contents)?this.contents.getIn(t,n):void 0}has(t){return V(this.contents)?this.contents.has(t):!1}hasIn(t){return mr(t)?this.contents!==void 0:V(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=fs(this.schema,[t],n):Tr(this.contents)&&this.contents.set(t,n)}setIn(t,n){mr(t)?this.contents=n:this.contents==null?this.contents=fs(this.schema,Array.from(t),n):Tr(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 Ct({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 Ct({version:t}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(t);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new Ps(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=fe(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:u}of a.anchors.values())i(u,c);return typeof o=="function"?rn(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return Xm(this,t)}};function Tr(e){if(V(e))return!0;throw new Error("Expected a YAML collection as document contents")}var Ss=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},ut=class extends Ss{constructor(t,n,r){super("YAMLParseError",t,n,r)}},Is=class extends Ss{constructor(t,n,r){super("YAMLWarning",t,n,r)}},Gc=(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
|
|
140
|
-
`))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(cn(t.key)||cn(t.value))return!0}return!1;default:return!0}}function
|
|
141
|
-
`+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||cn(p))&&s(p??d[d.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",
|
|
142
|
-
`+b.comment:R.comment=b.comment);let $=new ie(R);n.options.keepSourceTokens&&($.srcToken=u),a.items.push($)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function
|
|
143
|
-
`+
|
|
144
|
-
`+
|
|
145
|
-
`+z.comment:A.comment=z.comment);let w=new ie(A,
|
|
146
|
-
`+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function
|
|
139
|
+
`}};function Et(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,u=a,d="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,b=null,$=null,N=null;for(let A of e)switch(f&&(A.type!=="space"&&A.type!=="newline"&&A.type!=="comma"&&i(A.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&A.type!=="comment"&&A.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),A.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&A.source.includes(" ")&&(m=A),u=!0;break;case"comment":{u||i(A,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let z=A.source.substring(1)||" ";d?d+=p+z:d=z,p="",c=!1;break}case"newline":c?d?d+=A.source:(!$||n!=="seq-item-ind")&&(l=!0):p+=A.source,c=!0,h=!0,(y||T)&&(R=A),u=!0;break;case"anchor":y&&i(A,"MULTIPLE_ANCHORS","A node can have at most one anchor"),A.source.endsWith(":")&&i(A.offset+A.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=A,N??(N=A.offset),c=!1,u=!1,f=!0;break;case"tag":{T&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),T=A,N??(N=A.offset),c=!1,u=!1,f=!0;break}case n:(y||T)&&i(A,"BAD_PROP_ORDER",`Anchors and tags must be after the ${A.source} indicator`),$&&i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.source} in ${t??"collection"}`),$=A,c=n==="seq-item-ind"||n==="explicit-key-ind",u=!1;break;case"comma":if(t){b&&i(A,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=A,c=!1,u=!1;break}default:i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.type} token`),c=!1,u=!1}let _=e[e.length-1],D=_?_.offset+_.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:$,spaceBefore:l,comment:d,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:D,start:N??D}}function cn(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
|
|
140
|
+
`))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(cn(t.key)||cn(t.value))return!0}return!1;default:return!0}}function vs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&cn(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function yo(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||F(i)&&F(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var Qm="All mapping items must start at the same column";function Zm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??ae,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let u of r.items){let{start:d,key:p,sep:h,value:f}=u,m=Et(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",Qm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
|
|
141
|
+
`+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||cn(p))&&s(p??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",Qm);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,d,null,m,s);n.schema.compat&&vs(r.indent,p,s),n.atKey=!1,yo(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=Et(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&&vs(r.indent,f,s),l=$.range[2];let N=new ie(R,$);n.options.keepSourceTokens&&(N.srcToken=u),a.items.push(N)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),b.comment&&(R.comment?R.comment+=`
|
|
142
|
+
`+b.comment:R.comment=b.comment);let $=new ie(R);n.options.keepSourceTokens&&($.srcToken=u),a.items.push($)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function eh({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??Re,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:u,value:d}of r.items){let p=Et(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&&vs(r.indent,d,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function Ot(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 Hc="Block collections are not allowed within flow collections",Yc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function th({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?ae:Re),c=new l(n.schema);c.flow=!0;let u=n.atRoot;u&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let d=r.offset+r.start.source.length;for(let y=0;y<r.items.length;++y){let T=r.items[y],{start:R,key:b,sep:$,value:N}=T,_=Et(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:d,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!_.found){if(!_.anchor&&!_.tag&&!$&&!N){y===0&&_.comma?s(_.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(_.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),_.comment&&(c.comment?c.comment+=`
|
|
143
|
+
`+_.comment:c.comment=_.comment),d=_.end;continue}!o&&n.options.strict&&cn(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)_.comma&&s(_.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(_.comma||s(_.start,"MISSING_CHAR",`Missing , between ${a} items`),_.comment){let D="";e:for(let A of R)switch(A.type){case"comma":case"space":break;case"comment":D=A.source.substring(1);break e;default:break e}if(D){let A=c.items[c.items.length-1];j(A)&&(A=A.value??A.key),A.comment?A.comment+=`
|
|
144
|
+
`+D:A.comment=D,_.comment=_.comment.substring(D.length+1)}}if(!o&&!$&&!_.found){let D=N?e(n,N,_,s):t(n,_.end,$,null,_,s);c.items.push(D),d=D.range[2],Yc(N)&&s(D.range,"BLOCK_IN_FLOW",Hc)}else{n.atKey=!0;let D=_.end,A=b?e(n,b,_,s):t(n,D,R,null,_,s);Yc(b)&&s(A.range,"BLOCK_IN_FLOW",Hc),n.atKey=!1;let z=Et($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(z.found){if(!o&&!_.found&&n.options.strict){if($)for(let G of $){if(G===z.found)break;if(G.type==="newline"){s(G,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}_.start<z.found.offset-1024&&s(z.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(z.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Le=N?e(n,N,z,s):z.found?t(n,z.end,$,null,z,s):null;Le?Yc(N)&&s(Le.range,"BLOCK_IN_FLOW",Hc):z.comment&&(A.comment?A.comment+=`
|
|
145
|
+
`+z.comment:A.comment=z.comment);let w=new ie(A,Le);if(n.options.keepSourceTokens&&(w.srcToken=T),o){let G=c;yo(n,G.items,A)&&s(D,"DUPLICATE_KEY","Map keys must be unique"),G.items.push(w)}else{let G=new ae(n.schema);G.flow=!0,G.items.push(w);let $t=(Le??A).range;G.range=[A.range[0],$t[1],$t[2]],c.items.push(G)}d=Le?Le.range[2]:z.end}}let p=o?"}":"]",[h,...f]=r.end,m=d;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=u?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(d,u?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=Ot(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 zc(e,t,n,r,s,i){let o=n.type==="block-map"?Zm(e,t,n,r,i):n.type==="block-seq"?eh(e,t,n,r,i):th(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function nh(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===ae.tagName&&a==="map"||o===Re.tagName&&a==="seq")return zc(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),zc(e,t,n,s,o)}let c=zc(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 Jc(e,t,n){let r=t.offset,s=xS(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
147
|
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,u=0;for(let m=0;m<a;++m){let[y,T]=o[m];if(T===""||T==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),u=m,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+T.length+1}for(let m=o.length-1;m>=a;--m)o[m][0].length>l&&(a=m+1);let d="",p="",h=!1;for(let m=0;m<u;++m)d+=o[m][0].slice(l)+`
|
|
148
148
|
`;for(let m=u;m<a;++m){let[y,T]=o[m];c+=y.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&y.length<l){let $=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",$),y=""}i===O.BLOCK_LITERAL?(d+=p+y.slice(l)+T,p=`
|
|
149
149
|
`):y.length>l||T[0]===" "?(p===" "?p=`
|
|
@@ -158,68 +158,68 @@ ${c}
|
|
|
158
158
|
`+o[m][0].slice(l);d[d.length-1]!==`
|
|
159
159
|
`&&(d+=`
|
|
160
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
|
|
161
|
+
`}let f=r+s.length+t.source.length;return{value:d,type:i,comment:s.comment,range:[r,f,f]}}function xS({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 Xc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,f)=>n(r+p,h,f);switch(s){case"scalar":a=O.PLAIN,l=MS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=jS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=qS(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=Ot(o,u,t,n);return{value:l,type:a,comment:d.comment,range:[r,u,d.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}`),rh(e)}function jS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),rh(e.slice(1,-1)).replace(/''/g,"'")}function rh(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
|
|
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 qS(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}=
|
|
167
|
+
`){let{fold:i,offset:o}=US(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=BS[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+=
|
|
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+=WS(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
|
|
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 US(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
|
|
176
|
-
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function
|
|
175
|
+
`),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var BS={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 WS(e,t,n,r){let s=e.substr(t,n),o=s.length===n&&/^[0-9a-fA-F]+$/.test(s)?parseInt(s,16):NaN;try{return String.fromCodePoint(o)}catch{let a=e.substr(t-2,n+2);return r(t-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),a}}function Qc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Jc(e,t,r):Xc(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[Ue]:l?c=VS(e.schema,s,l,n,r):t.type==="scalar"?c=KS(e,s,t,r):c=e.schema[Ue];let u;try{let d=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);u=F(d)?d:new O(d)}catch(d){let p=d instanceof Error?d.message:String(d);r(n??t,"TAG_RESOLVE_FAILED",p),u=new O(s)}return u.range=a,u.source=s,i&&(u.type=i),l&&(u.tag=l),c.format&&(u.format=c.format),o&&(u.comment=o),u}function VS(e,t,n,r,s){if(n==="!")return e[Ue];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[Ue])}function KS({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[Ue];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[Ue];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 sh(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 GS={composeNode:Zc,composeEmptyNode:wo};function Zc(e,t,n,r){let s=e.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=n,c,u=!0;switch(t.type){case"alias":c=HS(e,t,r),(a||l)&&r(t,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":c=Qc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=nh(GS,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=wo(e,t.offset,void 0,null,n,r)),a&&c.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&e.options.stringKeys&&(!F(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&r(l??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(c.spaceBefore=!0),o&&(t.type==="scalar"&&t.source===""?c.comment=o:c.commentBefore=o),e.options.keepSourceTokens&&u&&(c.srcToken=t),c}function wo(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let u={type:"scalar",offset:sh(t,n,r),indent:-1,source:""},d=Qc(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 HS({options:e},{offset:t,source:n,end:r},s){let i=new jt(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=Ot(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function ih(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new ln(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},u=Et(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});u.found&&(l.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!u.hasNewline&&o(u.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=s?Zc(c,s,u,o):wo(c,u.end,r,null,u,o);let d=l.contents.range[2],p=Ot(i,d,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,d,p.offset],l}function Cs(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 oh(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
|
|
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 As=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Cs(n);i?this.warnings.push(new Is(o,r,s)):this.errors.push(new ut(o,r,s))},this.directives=new Ct({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=oh(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(V(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:
|
|
183
|
-
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new ut(
|
|
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:oh(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=Cs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=ih(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(Cs(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(Cs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Ot(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(Cs(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new ln(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};var ed=Symbol("break visit"),YS=Symbol("skip children"),ah=Symbol("remove item");function Nn(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),lh(Object.freeze([]),e,t)}Nn.BREAK=ed;Nn.SKIP=YS;Nn.REMOVE=ah;Nn.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};Nn.parentCollection=(e,t)=>{let n=Nn.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 lh(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=lh(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===ed)return ed;a===ah&&(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 td="\uFEFF",nd="",rd="",ko="";function ch(e){switch(e){case td:return"byte-order-mark";case nd:return"doc-mode";case rd:return"flow-error-end";case ko:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
|
|
184
184
|
`:case`\r
|
|
185
185
|
`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function pt(e){switch(e){case void 0:case" ":case`
|
|
186
|
-
`:case"\r":case" ":return!0;default:return!1}}var
|
|
187
|
-
\r `),
|
|
186
|
+
`:case"\r":case" ":return!0;default:return!1}}var dh=new Set("0123456789ABCDEFabcdef"),JS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),To=new Set(",[]{}"),XS=new Set(` ,[]{}
|
|
187
|
+
\r `),sd=e=>!e||XS.has(e),Es=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
|
|
188
188
|
`?!0:n==="\r"?this.buffer[t+1]===`
|
|
189
189
|
`:!1}charAt(t){return this.buffer[this.pos+t]}continueScalar(t){let n=this.buffer[t];if(this.indentNext>0){let r=0;for(;n===" ";)n=this.buffer[++r+t];if(n==="\r"){let s=this.buffer[r+t+1];if(s===`
|
|
190
190
|
`||!s&&!this.atEnd)return t+r+1}return n===`
|
|
191
191
|
`||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&pt(this.buffer[t+3]))return-1}return t}getLine(){let t=this.lineEndPos;return(typeof t!="number"||t!==-1&&t<this.pos)&&(t=this.buffer.indexOf(`
|
|
192
|
-
`,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===
|
|
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]===td&&(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 nd,yield*this.parseLineStart()}*parseLineStart(){let t=this.charAt(0);if(!t&&!this.atEnd)return this.setNext("line-start");if(t==="-"||t==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");let n=this.peek(3);if((n==="---"||n==="...")&&pt(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,n==="---"?"doc":"stream"}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!pt(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[t,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((t==="-"||t==="?"||t===":")&&pt(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let t=this.getLine();if(t===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(t[n]){case"#":yield*this.pushCount(t.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(sd),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(t.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let t,n,r=-1;do t=yield*this.pushNewline(),t>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(t+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r<this.indentNext&&s[0]!=="#"||r===0&&(s.startsWith("---")||s.startsWith("..."))&&pt(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield rd,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(sd),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||pt(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
|
|
193
193
|
`,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
|
|
194
194
|
`,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>pt(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
|
|
195
195
|
`:t=i,n=0;break;case"\r":{let o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
|
|
196
196
|
`)break}default:break e}if(!r&&!this.atEnd)return this.setNext("block-scalar");if(n>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=n:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let i=this.continueScalar(t+1);if(i===-1)break;t=this.buffer.indexOf(`
|
|
197
197
|
`,i)}while(t!==-1);if(t===-1){if(!this.atEnd)return this.setNext("block-scalar");t=this.buffer.length}}let s=t+1;for(r=this.buffer[s];r===" ";)r=this.buffer[++s];if(r===" "){for(;r===" "||r===" "||r==="\r"||r===`
|
|
198
198
|
`;)r=this.buffer[++s];t=s-1}else if(!this.blockScalarKeep)do{let i=t-1,o=this.buffer[i];o==="\r"&&(o=this.buffer[--i]);let a=i;for(;o===" ";)o=this.buffer[--i];if(o===`
|
|
199
|
-
`&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield
|
|
199
|
+
`&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield ko,yield*this.pushToIndex(t+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let t=this.flowLevel>0,n=this.pos-1,r=this.pos-1,s;for(;s=this.buffer[++r];)if(s===":"){let i=this.buffer[r+1];if(pt(i)||t&&To.has(i))break;n=r}else if(pt(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
|
|
200
200
|
`?(r+=1,s=`
|
|
201
|
-
`,i=this.buffer[r+1]):n=r),i==="#"||t&&
|
|
202
|
-
`){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&
|
|
201
|
+
`,i=this.buffer[r+1]):n=r),i==="#"||t&&To.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&&To.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield ko,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(sd),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(pt(r)||n&&To.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,t+=yield*this.pushCount(1),t+=yield*this.pushSpaces(!0);continue e}}}break e}return t}*pushTag(){if(this.charAt(1)==="<"){let t=this.pos+2,n=this.buffer[t];for(;!pt(n)&&n!==">";)n=this.buffer[++t];return yield*this.pushToIndex(n===">"?t+1:t,!1)}else{let t=this.pos+1,n=this.buffer[t];for(;n;)if(JS.has(n))n=this.buffer[++t];else if(n==="%"&&dh.has(this.buffer[t+1])&&dh.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
|
|
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 Os=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function dn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function uh(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 fh(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 bo(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 br(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 Ro(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 ph(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!dn(t.start,"explicit-key-ind")&&!dn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,fh(t.value)?t.value.end?Ro(t.value.end,t.sep):t.value.end=t.sep:Ro(t.start,t.sep),delete t.sep)}var $s=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 Es,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=ch(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"&&ph(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&&uh(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":{uh(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=bo(this.peek(2)),r=br(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)){
|
|
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)){Ro(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(dn(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(fh(n.key)&&!dn(n.sep,"newline")){let o=br(n.start),a=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(dn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=br(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?t.items.push({start:i,key:null,sep:[this.sourceToken]}):dn(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(t.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(t);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!dn(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){Ro(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||dn(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){let r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){let n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}let r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=bo(r),i=br(s);ph(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=ko(t),r=kr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=ko(t),r=kr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function WS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new As||null,prettyErrors:t}}function nd(e,t={}){let{lineCounter:n,prettyErrors:r}=WS(t),s=new Es(n?.addNewLine),i=new vs(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new ut(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(Wc(e,n)),o.warnings.forEach(Wc(e,n))),o}var Os=1024*1024;function rd(e,t){Buffer.byteLength(e)>Os&&bo(t,[`Definition exceeds ${Os} bytes.`]);let n=nd(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Ze(n,(i,o)=>{Ue(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&bo(t,s),n.contents===null&&bo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){bo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function bo(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}import{createHash as KS}from"node:crypto";var Tr=/^[a-z][a-z0-9_-]{0,63}$/,oh=/\$\{\{\s*([^{}]+?)\s*\}\}/g,ah=32,lh=128,GS=16,HS=32,YS=10080*60*1e3,br=32*1024,ch=16;function od(e,t){let n=[],r=Be(e,"$",n);ft(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=iI(r.name,"$.name",n),i=JS(r.limits,n),o=XS(r.inputs,n),a=QS(r.steps,n);a.length>lh&&n.push(`$.steps may contain at most ${lh} 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=tI(a,n);c&&nI(a,o,c.ancestors,n),n.length>0&&lI(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:KS("sha256").update(id(u)).digest("hex"),order:c.order,waves:zS(c.waves,i.maxConcurrency)}}function zS(e,t){return e.flatMap(n=>{let r=[];for(let s=0;s<n.length;s+=t)r.push(n.slice(s,s+t));return r})}function JS(e,t){let n=Be(e,"$.limits",t);ft(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=dh(n.max_concurrency,"$.limits.max_concurrency",1,GS,t),s=dh(n.max_tasks,"$.limits.max_tasks",1,HS,t),i=fh(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function XS(e,t){if(e===void 0)return{};let n=Be(e,"$.inputs",t),r=Object.entries(n);r.length>ah&&t.push(`$.inputs may contain at most ${ah} inputs.`);let s={};for(let[i,o]of r){Tr.test(i)||t.push(`$.inputs key "${i}" must match ${Tr}.`);let a=Be(o,`$.inputs.${i}`,t);ft(a,["type","required","default"],`$.inputs.${i}`,t);let l=aI(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:oI(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&&!uh(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&uh(a.default,l)?{defaultValue:a.default}:{}}}return s}function QS(e,t){let n=Be(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{Tr.test(s)||t.push(`$.steps key "${s}" must match ${Tr}.`);let o=Be(i,`$.steps.${s}`,t),a=ph(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?eI(s,o,a,t):ZS(s,o,a,t)})}function ZS(e,t,n,r){ft(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?Ut(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=Be(t.create_child,`$.steps.${e}.create_child`,r);ft(d,["repo","workspace"],`$.steps.${e}.create_child`,r),d.repo!==void 0&&d.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...d.repo!==void 0?{repo:Ut(d.repo,`$.steps.${e}.create_child.repo`,r)}:{},...d.workspace!==void 0?{workspace:Ut(d.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let d=Be(t.agent,`$.steps.${e}.agent`,r);if(ft(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=k.runners.parse(Ut(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Ut(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>br&&r.push(`$.steps.${e}.prompt exceeds ${br} bytes.`);let u;if(t.output!==void 0){let d=Be(t.output,`$.steps.${e}.output`,r);ft(d,["schema"],`$.steps.${e}.output`,r),u=sd(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 eI(e,t,n,r){ft(t,["needs","human_review"],`$.steps.${e}`,r);let s=Be(t.human_review,`$.steps.${e}.human_review`,r);ft(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Be(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ft(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Ut(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Ut(s.title,`$.steps.${e}.human_review.title`,r),summary:Ut(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:fh(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function sd(e,t,n,r){if(r>ch)return n.push(`${t} exceeds the maximum schema depth of ${ch}.`),{};let s=Be(e,t,n);ft(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&ph(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=Be(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))sd(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&sd(s.items,`${t}.items`,n,r+1),s}function tI(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 nI(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(oh)],c=a.replace(oh,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)rI(u[1].trim(),i,t,n,s,r)}}}function rI(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&&sI(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function sI(e,t,n,r,s){let i=r;for(let o of n){if(i.type!=="object"){s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}if(!Ro(i.properties)){i.additionalProperties===!1&&s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}if(!Object.hasOwn(i.properties,o)){s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}let a=i.properties[o];if(!Ro(a))return;i=a}}function id(e){return Array.isArray(e)?`[${e.map(id).join(",")}]`:Ro(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${id(e[t])}`).join(",")}}`:JSON.stringify(e)}function Be(e,t,n){return Ro(e)?e:(n.push(`${t} must be an object.`),{})}function ft(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function iI(e,t,n){let r=Ut(e,t,n);return Tr.test(r)||n.push(`${t} must match ${Tr}.`),r}function Ut(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function ph(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 dh(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 oI(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function aI(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function uh(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function fh(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>YS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function lI(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var Ro=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as cI,stat as dI}from"node:fs/promises";var uI=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function ad(e){let t=await mh(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 ld(e,t){let n=await mh(e),r=pI(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:hI(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 mh(e){let t;try{let n=await dI(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Os)throw new Error(`Definition exceeds ${Os} bytes.`);t=await cI(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return od(rd(t,e),e)}function pI(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]=fI(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 fI(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 mI(e,t){return e.replace(uI,(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=mI(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 hI(e,t,n){let r=`$.steps.${n}.prompt`,s=$n(e,t,r);if(Buffer.byteLength(s)>br)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${br} bytes.`,{details:{location:r,maxBytes:br}});return s}import{createHash as hh}from"node:crypto";import gI from"node:path";import{mkdir as yI}from"node:fs/promises";var cd={type:"system",component:"heartbeat"};async function un(e,t={}){await yI(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):xt.listAgents(e),zf(e),SI(e)]),o=r??Rt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=PI(i),l=a!==i,c=[],u=dd(s.filter(RI),f=>f.taskId),d=dd(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=dd(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=wI(f),y=u.get(f.id),T=pd(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await Me(e,{id:ud(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:cd,data:{...m,changedFields:T?TI(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=bI(f.prs),$=d.get(f.id),N=pd($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",z=await Me(e,{id:ud(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:cd,data:b});c.push(z),D=z.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=pd(m?.data)??a.agents[f.tabId]??null;if(y?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let T=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await Me(e,{id:ud("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:cd,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(yh(e),a),c}function wI(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:gh(t)}}var kI=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function TI(e,t){return kI.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function bI(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:gh(t)}}function dd(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var RI=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",gh=e=>hh("sha256").update(JSON.stringify(e)).digest("hex"),ud=(...e)=>hh("sha256").update(e.join("\0")).digest("hex"),pd=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,yh=e=>gI.join(e.orchestrationDir,"event-reconciliation.json");function PI(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 Ys(yh(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function II(e,t){return await fd(e),await un(e),In(e,t)}async function vI(e,t,n){await fd(e);let r=await xt.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await un(e,{agentObserver:r});let a=await In(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await wh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function CI(e,t,n){await fd(e);let r=await S.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await xt.openObserver(e);try{await un(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=Rt([r],s.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw EI(t);let d=a-Date.now();if(d<=0)throw AI(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 wh(Math.min(250,d),n.signal)}}finally{s.close()}}async function fd(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 wh(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 AI=(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}}),EI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),Po={list:II,watch:vI,waitForTaskState:CI,reconcile:un};import{readFile as HI}from"node:fs/promises";import{mkdir as UI,readFile as vh,rm as Ch}from"node:fs/promises";import{createConnection as BI}from"node:net";import WI from"node:path";import{spawn as _I}from"node:child_process";import{closeSync as FI,openSync as xI}from"node:fs";import hd from"node:path";import{accessSync as OI,constants as $I}from"node:fs";import{homedir as kh}from"node:os";import pn from"node:path";var NI=[pn.join(kh(),".local","bin"),pn.join(kh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function bh(e=process.env){return DI([...(e.PATH??"").split(pn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:NI])}function So(e=process.env){return{...e,PATH:bh(e).join(pn.delimiter)}}function md(e,t={}){if(e.includes(pn.sep)){let n=pn.isAbsolute(e)?e:pn.resolve(t.cwd??process.cwd(),e);return Th(n)?n:null}for(let n of bh(t.env)){let r=pn.join(n,e);if(Th(r))return r}return null}function Io(e,t={}){let n=md(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 Th(e){try{return OI(e,$I.X_OK),!0}catch{return!1}}function DI(e){return[...new Set(e)]}function vo(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=LI(e.workspaceRoot),s=xI(hd.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return _I(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{FI(s)}})().unref()}function LI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=hd.resolve(hd.dirname(t),"..","node_modules",".bin","tsx");return{command:md("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 Rh,readFile as Ph,rm as gd,stat as Sh,utimes as MI,writeFile as jI}from"node:fs/promises";import $s from"node:path";async function yd(e){let t=$s.join(e.runtimeDir,"orchestration-supervisor.lock","owner.json");try{let[n,r]=await Promise.all([Ph(t,"utf8").then(i=>JSON.parse(i)),Sh(t)]),s=Date.now()-r.mtimeMs;return n.protocolVersion===Pt&&s>=-1e3&&s<5e3&&typeof n.pid=="number"&&Ih(n.pid)}catch{return!1}}async function wd(e){let t=$s.join(e.runtimeDir,"orchestration-supervisor.lock");await Rh(e.runtimeDir,{recursive:!0});try{await Rh(t)}catch(r){if(!qI(r))throw r;let s=await Ph($s.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Sh(t).catch(()=>null);if(typeof s?.pid=="number"&&!Ih(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await gd(t,{recursive:!0,force:!0}),wd(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await jI($s.join(t,"owner.json"),JSON.stringify({pid:process.pid,protocolVersion:Pt,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await gd(t,{recursive:!0,force:!0}),r}let n=!1;return{async heartbeat(){if(n)return;let r=new Date;await MI($s.join(t,"owner.json"),r,r)},async release(){n||(n=!0,await gd(t,{recursive:!0,force:!0}))}}}function Ih(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 qI=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";async function Dn(e){let t=await Ao(Le(e).socketPath).catch(()=>null);if(!t)return yd(e);try{let n=await Nn(t,{type:"ping"});return en(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return yd(e)}finally{t.end()}}async function Co(e,t){if(t.length===0)return!0;let n=await Ao(Le(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!en(r.protocolVersion))return!1;for(let s of t)await Nn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Eh(e,t){await VI(e);let n=await Ao(Le(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!en(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Nn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function VI(e){let t=Le(e),n=await Ah(t.socketPath).catch(()=>null);if(en(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await UI(e.runtimeDir,{recursive:!0});let r=await vh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&KI(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([Ch(t.socketPath,{force:!0}),Ch(t.pidPath,{force:!0})]),vo(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Ah(t.socketPath).catch(()=>null);if(en(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await vh(WI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
-
${o.slice(-2e3)}`:""}`)}async function
|
|
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=bo(t),r=br(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=bo(t),r=br(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 QS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Os||null,prettyErrors:t}}function id(e,t={}){let{lineCounter:n,prettyErrors:r}=QS(t),s=new $s(n?.addNewLine),i=new As(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(Gc(e,n)),o.warnings.forEach(Gc(e,n))),o}var Ns=1024*1024;function od(e,t){Buffer.byteLength(e)>Ns&&Po(t,[`Definition exceeds ${Ns} bytes.`]);let n=id(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];et(n,(i,o)=>{Be(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&&Po(t,s),n.contents===null&&Po(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){Po(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function Po(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 eI}from"node:crypto";var Rr=/^[a-z][a-z0-9_-]{0,63}$/,mh=/\$\{\{\s*([^{}]+?)\s*\}\}/g,hh=32,gh=128,tI=16,nI=32,rI=10080*60*1e3,Pr=32*1024,yh=16;function cd(e,t){let n=[],r=We(e,"$",n);ft(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=mI(r.name,"$.name",n),i=iI(r.limits,n),o=oI(r.inputs,n),a=aI(r.steps,n);a.length>gh&&n.push(`$.steps may contain at most ${gh} 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=dI(a,n);c&&uI(a,o,c.ancestors,n),n.length>0&&yI(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:eI("sha256").update(ld(u)).digest("hex"),order:c.order,waves:sI(c.waves,i.maxConcurrency)}}function sI(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 iI(e,t){let n=We(e,"$.limits",t);ft(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=wh(n.max_concurrency,"$.limits.max_concurrency",1,tI,t),s=wh(n.max_tasks,"$.limits.max_tasks",1,nI,t),i=bh(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function oI(e,t){if(e===void 0)return{};let n=We(e,"$.inputs",t),r=Object.entries(n);r.length>hh&&t.push(`$.inputs may contain at most ${hh} inputs.`);let s={};for(let[i,o]of r){Rr.test(i)||t.push(`$.inputs key "${i}" must match ${Rr}.`);let a=We(o,`$.inputs.${i}`,t);ft(a,["type","required","default"],`$.inputs.${i}`,t);let l=gI(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:hI(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&&!kh(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&kh(a.default,l)?{defaultValue:a.default}:{}}}return s}function aI(e,t){let n=We(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{Rr.test(s)||t.push(`$.steps key "${s}" must match ${Rr}.`);let o=We(i,`$.steps.${s}`,t),a=Th(o.needs,`$.steps.${s}.needs`,t);return new Set(a).size!==a.length&&t.push(`$.steps.${s}.needs cannot contain duplicates.`),o.human_review!==void 0?cI(s,o,a,t):lI(s,o,a,t)})}function lI(e,t,n,r){ft(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?Bt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=We(t.create_child,`$.steps.${e}.create_child`,r);ft(d,["repo","workspace"],`$.steps.${e}.create_child`,r),d.repo!==void 0&&d.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...d.repo!==void 0?{repo:Bt(d.repo,`$.steps.${e}.create_child.repo`,r)}:{},...d.workspace!==void 0?{workspace:Bt(d.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let d=We(t.agent,`$.steps.${e}.agent`,r);if(ft(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=k.runners.parse(Bt(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Bt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>Pr&&r.push(`$.steps.${e}.prompt exceeds ${Pr} bytes.`);let u;if(t.output!==void 0){let d=We(t.output,`$.steps.${e}.output`,r);ft(d,["schema"],`$.steps.${e}.output`,r),u=ad(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 cI(e,t,n,r){ft(t,["needs","human_review"],`$.steps.${e}`,r);let s=We(t.human_review,`$.steps.${e}.human_review`,r);ft(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=We(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ft(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Bt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Bt(s.title,`$.steps.${e}.human_review.title`,r),summary:Bt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:bh(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function ad(e,t,n,r){if(r>yh)return n.push(`${t} exceeds the maximum schema depth of ${yh}.`),{};let s=We(e,t,n);ft(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&Th(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=We(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))ad(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&ad(s.items,`${t}.items`,n,r+1),s}function dI(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 uI(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(mh)],c=a.replace(mh,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)pI(u[1].trim(),i,t,n,s,r)}}}function pI(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&&fI(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function fI(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(!So(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(!So(a))return;i=a}}function ld(e){return Array.isArray(e)?`[${e.map(ld).join(",")}]`:So(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ld(e[t])}`).join(",")}}`:JSON.stringify(e)}function We(e,t,n){return So(e)?e:(n.push(`${t} must be an object.`),{})}function ft(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function mI(e,t,n){let r=Bt(e,t,n);return Rr.test(r)||n.push(`${t} must match ${Rr}.`),r}function Bt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Th(e,t,n){return e===void 0?[]:!Array.isArray(e)||e.some(r=>typeof r!="string"||r.length===0)?(n.push(`${t} must be an array of non-empty strings.`),[]):e}function wh(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 hI(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function gI(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function kh(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function bh(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>rI?(n.push(`${t} must be between 1ms and 7d.`),1):i}function yI(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var So=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as wI,stat as kI}from"node:fs/promises";var TI=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function dd(e){let t=await Rh(e);return{kind:"validateFury",schemaVersion:1,valid:!0,file:e,definitionHash:t.hash,name:t.definition.name,inputNames:Object.keys(t.definition.inputs),stepCount:t.definition.steps.length,order:t.order,limits:t.definition.limits}}async function ud(e,t){let n=await Rh(e),r=bI(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:SI(l.prompt,r,a),outputSchema:l.outputSchema??null,review:null}});return{schemaVersion:1,file:e,definitionHash:n.hash,name:n.definition.name,inputs:r,limits:n.definition.limits,order:n.order,waves:n.waves,steps:o}}async function Rh(e){let t;try{let n=await kI(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Ns)throw new Error(`Definition exceeds ${Ns} bytes.`);t=await wI(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return cd(od(t,e),e)}function bI(e,t){let n=[];for(let s of Object.keys(t))e[s]||n.push(`Input "${s}" is not declared.`);let r={};for(let[s,i]of Object.entries(e)){let o=t[s];o!==void 0?r[s]=RI(o,i.type,s,n):i.defaultValue!==void 0?r[s]=i.defaultValue:i.required&&n.push(`Required input "${s}" was not provided.`)}if(n.length>0)throw new g("FURY_INPUT_INVALID","Fury inputs are invalid.",{details:{issues:n}});return r}function RI(e,t,n,r){if(t==="string")return e;if(t==="number"){if(e.trim().length===0)return r.push(`Input "${n}" must be a finite number.`),0;let s=Number(e);return Number.isFinite(s)?s:(r.push(`Input "${n}" must be a finite number.`),0)}return e==="true"?!0:(e==="false"||r.push(`Input "${n}" must be true or false.`),!1)}function PI(e,t){return e.replace(TI,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function _n(e,t,n){let r=PI(e,t);if(r.trim().length===0)throw new g("FURY_INPUT_INVALID",`Resolved ${n} must be a non-empty string.`,{details:{location:n}});return r}function SI(e,t,n){let r=`$.steps.${n}.prompt`,s=_n(e,t,r);if(Buffer.byteLength(s)>Pr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${Pr} bytes.`,{details:{location:r,maxBytes:Pr}});return s}import{createHash as Ph}from"node:crypto";import II from"node:path";import{mkdir as vI}from"node:fs/promises";var pd={type:"system",component:"heartbeat"};async function un(e,t={}){await vI(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Lt.listAgents(e),Zf(e),_I(e)]),o=r??Rt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=NI(i),l=a!==i,c=[],u=fd(s.filter($I),f=>f.taskId),d=fd(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=fd(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=CI(f),y=u.get(f.id),T=hd(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let D=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await je(e,{id:md(D,f.id,m.signature),type:D,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:pd,data:{...m,changedFields:T?EI(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=OI(f.prs),$=d.get(f.id),N=hd($?.data)??a.pullRequests[f.id]??null,_=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let D=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>D?"task.pr.linked":b.associations.length<D?"task.pr.unlinked":"task.pr.refreshed",z=await je(e,{id:md(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:pd,data:b});c.push(z),_=z.id}a.pullRequests[f.id]={...b,eventId:_}}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=hd(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 je(e,{id:md("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:pd,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 q(Ih(e),a),c}function CI(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:Sh(t)}}var AI=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function EI(e,t){return AI.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:Sh(t)}}function fd(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var $I=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Sh=e=>Ph("sha256").update(JSON.stringify(e)).digest("hex"),md=(...e)=>Ph("sha256").update(e.join("\0")).digest("hex"),hd=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Ih=e=>II.join(e.orchestrationDir,"event-reconciliation.json");function NI(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 _I(e){try{return await Js(Ih(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function DI(e,t){return await gd(e),await un(e),In(e,t)}async function FI(e,t,n){await gd(e);let r=await Lt.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 vh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function xI(e,t,n){await gd(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 Lt.openObserver(e);try{await un(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=Rt([r],s.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw MI(t);let d=a-Date.now();if(d<=0)throw LI(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 vh(Math.min(250,d),n.signal)}}finally{s.close()}}async function gd(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 vh(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}}),MI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),Io={list:DI,watch:FI,waitForTaskState:xI,reconcile:un};import{readFile as nv}from"node:fs/promises";import{mkdir as JI,readFile as Dh,rm as Fh}from"node:fs/promises";import{createConnection as XI}from"node:net";import QI from"node:path";import{spawn as WI}from"node:child_process";import{closeSync as VI,openSync as KI}from"node:fs";import wd from"node:path";import{accessSync as jI,constants as qI}from"node:fs";import{homedir as Ch}from"node:os";import pn from"node:path";var UI=[pn.join(Ch(),".local","bin"),pn.join(Ch(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Eh(e=process.env){return BI([...(e.PATH??"").split(pn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:UI])}function vo(e=process.env){return{...e,PATH:Eh(e).join(pn.delimiter)}}function yd(e,t={}){if(e.includes(pn.sep)){let n=pn.isAbsolute(e)?e:pn.resolve(t.cwd??process.cwd(),e);return Ah(n)?n:null}for(let n of Eh(t.env)){let r=pn.join(n,e);if(Ah(r))return r}return null}function Co(e,t={}){let n=yd(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 Ah(e){try{return jI(e,qI.X_OK),!0}catch{return!1}}function BI(e){return[...new Set(e)]}function Ao(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=GI(e.workspaceRoot),s=KI(wd.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return WI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{VI(s)}})().unref()}function GI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=wd.resolve(wd.dirname(t),"..","node_modules",".bin","tsx");return{command:yd("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 Oh,readFile as $h,rm as kd,stat as Nh,utimes as HI,writeFile as YI}from"node:fs/promises";import _s from"node:path";async function Td(e){let t=_s.join(e.runtimeDir,"orchestration-supervisor.lock","owner.json");try{let[n,r]=await Promise.all([$h(t,"utf8").then(i=>JSON.parse(i)),Nh(t)]),s=Date.now()-r.mtimeMs;return n.protocolVersion===Pt&&s>=-1e3&&s<5e3&&typeof n.pid=="number"&&_h(n.pid)}catch{return!1}}async function bd(e){let t=_s.join(e.runtimeDir,"orchestration-supervisor.lock");await Oh(e.runtimeDir,{recursive:!0});try{await Oh(t)}catch(r){if(!zI(r))throw r;let s=await $h(_s.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Nh(t).catch(()=>null);if(typeof s?.pid=="number"&&!_h(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await kd(t,{recursive:!0,force:!0}),bd(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await YI(_s.join(t,"owner.json"),JSON.stringify({pid:process.pid,protocolVersion:Pt,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await kd(t,{recursive:!0,force:!0}),r}let n=!1;return{async heartbeat(){if(n)return;let r=new Date;await HI(_s.join(t,"owner.json"),r,r)},async release(){n||(n=!0,await kd(t,{recursive:!0,force:!0}))}}}function _h(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 zI=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";async function Fn(e){let t=await Oo(Ce(e).socketPath).catch(()=>null);if(!t)return Td(e);try{let n=await Dn(t,{type:"ping"});return St(n.protocolVersion)?(await Dn(t,{type:"wakeOrchestration"}),!0):!1}catch{return Td(e)}finally{t.end()}}async function Eo(e,t){if(t.length===0)return!0;let n=await Oo(Ce(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Dn(n,{type:"ping"});if(!St(r.protocolVersion))return!1;for(let s of t)await Dn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Lh(e,t){await ZI(e);let n=await Oo(Ce(e).socketPath);try{let r=await Dn(n,{type:"ping"});if(!St(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Dn(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 ZI(e){let t=Ce(e),n=await xh(t.socketPath).catch(()=>null);if(St(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await JI(e.runtimeDir,{recursive:!0});let r=await Dh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&ev(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([Fh(t.socketPath,{force:!0}),Fh(t.pidPath,{force:!0})]),Ao(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await xh(t.socketPath).catch(()=>null);if(St(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await Dh(QI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
+
${o.slice(-2e3)}`:""}`)}async function xh(e){let t=await Oo(e);try{return await Dn(t,{type:"ping"})}finally{t.end()}}function ev(e){try{return process.kill(e,0),!0}catch{return!1}}var tv=1;function Dn(e,t){let n=tv++;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
210
|
`);if(u===-1)return;l();let d=JSON.parse(i.slice(0,u));d.ok?r(d):s(new Error(d.error??"Craig PTY daemon request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
|
|
211
|
-
`)})}function Ao(e){return new Promise((t,n)=>{let r=BI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function YI(e,t){await ev(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 ZI(t.prompt,t.readStdin),o;try{o=await ue.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await Dn(e),a}return await kd(e,o.command.id),o}async function kd(e,t){if((await ue.show(e,t)).command.state==="delivered"||await Dn(e))return;let r=(await ue.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ue.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function zI(e,t){return ue.show(e,t)}async function JI(e,t){return ue.list(e,t)}async function XI(e,t){let n;try{n=await ue.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Dn(e),r}return await Dn(e),n}async function QI(e,t,n){return ue.wait(e,t,n)}async function ZI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await HI(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 ev(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Rr={send:YI,show:zI,list:JI,cancel:XI,wait:QI};function Eo(e,t){if(t!=="codex")return e;let[n="codex",...r]=e,s=["--no-alt-screen","--no-daemon"].filter(a=>!r.includes(a)),i="check_for_update_on_startup=false",o=r.includes(i)?[]:["-c",i];return[n,...s,...r,...o]}var tv=6e4;async function Oo(e,t){return Pc(e,t,{createTask:nv})}async function Oh(e,t,n,r={}){return Rc(e,t,n,{...r,launchProvisioned:(s,i)=>$h(e,s,i,!1)})}async function nv(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>$h(e,s,i,!0)})}async function $h(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 Eh(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:Eo(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await ue.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:tv,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await kd(e,i.command.id)}catch(i){throw await Co(e,[s.id]),i}}async function $o(e,t,n){let r=(await S.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await Ic(e,t,n);if(!await Co(e,o))throw new g("PARTIAL_RESULT","The task tree was closed, but Craig could not stop its agent sessions. Retry cancellation after the daemon is available.",{retryable:!0,details:{taskId:t,persisted:!0,sessionsStopped:!1}});return a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await Co(e,o),a}}import{randomUUID as _h}from"node:crypto";import{readFile as rv,realpath as Nh}from"node:fs/promises";import Td from"node:path";var X={type:"system",component:"orchestration-supervisor"},sv=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function iv(e,t,n,r,s,i){await Pd(e);let o=await kv(e,t);if(await S.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new g("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await Qe(e,i,"fury.plan",r)}let a=await ld(t,n);Tv(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_${_h()}`,planHash:Xl(c),createdBy:s,createdAt:l};await Nf(e,a.definitionHash,await rv(t,"utf8"));let d=await Df(e,u);try{await Me(e,{id:`${d.id}:fury.plan.created`,taskId:r,type:"fury.plan.created",occurredAt:d.createdAt,actor:d.createdBy,data:{planId:d.id,planHash:d.planHash,name:d.name}})}catch(p){throw new g("PARTIAL_RESULT",`Fury plan ${d.id} was persisted, but its audit event could not be recorded.`,{details:{planId:d.id,planHash:d.planHash,persisted:!0},cause:p})}return{kind:"planFury",plan:d}}async function Rd(e,t,n,r){if(await Pd(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let s=await ss(e,t);if(r!==void 0&&s.planHash!==r)throw new g("FURY_STATE_CONFLICT","The Fury plan changed after you reviewed it. Review the current plan before approving.",{});let i={schemaVersion:1,planId:s.id,planHash:s.planHash,approvedBy:n,approvedAt:new Date().toISOString()},o=await Ff(e,i);try{await Me(e,{id:`${s.id}:fury.plan.approved`,taskId:s.rootTaskId,type:"fury.plan.approved",occurredAt:o.approval.approvedAt,actor:o.approval.approvedBy,data:{planId:s.id,planHash:s.planHash}})}catch(a){throw new g("PARTIAL_RESULT",`Fury plan ${s.id} was approved, but its audit event could not be recorded.`,{details:{planId:s.id,planHash:s.planHash,persisted:!0,approved:!0},cause:a})}return{kind:"approveFury",plan:s,approval:o.approval,created:o.created}}async function ov(e,t,n,r){await Pd(e);let s=await ss(e,t);if((await xf(e,t)).planHash!==s.planHash)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} changed after approval.`,{});if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury run requires an agent capability.",{});await Qe(e,r,"fury.run",s.rootTaskId)}await st(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${_h()}`,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 Lf(e,l);try{await le(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(u){throw new g("PARTIAL_RESULT",`Fury run ${c.run.id} was persisted, but its audit event could not be recorded.`,{details:{runId:c.run.id,planId:c.run.planId,persisted:!0},cause:u})}return ne(c.run)||await xn(e,c.run.id),{kind:"runFury",run:await te(e,c.run.id),created:c.created}}async function av(e,t){return{kind:"showFury",run:await te(e,t)}}async function Do(e,t={}){let n=await k.load(e),r=k.previews.isEnabled(n,"agentOrchestration");for(let s of await Ci(e))await lv(e,s.id,{...t,allowScheduling:r})}async function lv(e,t,n={}){let r=n.allowScheduling??k.previews.isEnabled(await k.load(e),"agentOrchestration"),s=await te(e,t);if(await Sv(e,s),ne(s)){s.cleanupPending&&await Iv(e,s);return}if(s=await Cv(e,s),await vv(e,s),Date.now()>=Date.parse(s.deadlineAt)){if(s=await Ce(e,t,a=>ne(a)?a:Pv(a)),s.state!=="timed_out")return;for(let a of Object.values(s.stepRuns))a.reviewId&&await or(e,a.reviewId,l=>["waiting_for_review","changes_requested"].includes(l.state)?{...l,state:"timed_out",version:l.version+1,updatedAt:new Date().toISOString()}:l);await le(e,s,null,"fury.run.timed_out",X,{state:s.state});return}let i=new Map((await je(e)).map(a=>[a.id,a]));for(let a of s.order){let l=s.stepRuns[a];if(r&&l.state==="running"&&!l.taskId){s=await Dh(e,s,l);continue}l.state==="running"&&l.commandId&&i.get(l.commandId)?.state==="failed"&&(s=await No(e,s.id,l.id,i.get(l.commandId)?.lastError?.message??"Prompt delivery failed.",X));let c=!l.commandId||i.get(l.commandId)?.state==="delivered";l.state==="running"&&l.agentTabId&&c&&n.isAgentAvailable&&l.startedAt&&Date.now()-Date.parse(l.startedAt)>2e3&&!n.isAgentAvailable(l.agentTabId)&&(s=await No(e,s.id,l.id,`Agent session ${l.agentTabId} disappeared.`,X)),l.state==="running"&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(s=await Ce(e,s.id,u=>ne(u)?u:Bt(u,l.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.step.timed_out",X,{})),(l.state==="waiting_for_review"||l.state==="changes_requested")&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(l.reviewId&&await or(e,l.reviewId,u=>({...u,state:"timed_out",version:u.version+1,updatedAt:new Date().toISOString()})),s=await Ce(e,s.id,u=>ne(u)?u:Bt(u,l.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.review.timed_out",X,{reviewId:l.reviewId}))}if(Object.values(s.stepRuns).some(a=>a.state==="failed"||a.state==="timed_out")){await _o(e,s.id,"failed",X);return}let o=Object.values(s.stepRuns).filter(a=>a.state==="running").length;for(let a of s.order){if(o>=s.limits.maxConcurrency)break;let l=s.stepRuns[a];l.state!=="pending"||!l.needs.every(c=>s.stepRuns[c]?.state==="succeeded")||(l.kind==="human_review"?s=await cv(e,s,l):r&&(s=await Dh(e,s,l),o+=1))}await Rv(e,s.id)}async function Dh(e,t,n){let r=new Date;if(t=await Ce(e,t.id,i=>ne(i)?i:Bt(i,n.id,{state:"running",startedAt:i.stepRuns[n.id]?.startedAt??r.toISOString(),deadlineAt:i.deadlineAt})),ne(t))return t;await le(e,t,n.id,"fury.step.started",X,{});let s=t.stepRuns[n.id];if(s.taskId)return t;try{let i=`${Fn(s.plan.prompt,t)}
|
|
211
|
+
`)})}function Oo(e){return new Promise((t,n)=>{let r=XI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function rv(e,t){await cv(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 lv(t.prompt,t.readStdin),o;try{o=await ue.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await Fn(e),a}return await Rd(e,o.command.id),o}async function Rd(e,t){if((await ue.show(e,t)).command.state==="delivered"||await Fn(e))return;let r=(await ue.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ue.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function sv(e,t){return ue.show(e,t)}async function iv(e,t){return ue.list(e,t)}async function ov(e,t){let n;try{n=await ue.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Fn(e),r}return await Fn(e),n}async function av(e,t,n){return ue.wait(e,t,n)}async function lv(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await nv(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 cv(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 Sr={send:rv,show:sv,list:iv,cancel:ov,wait:av};function $o(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 dv=6e4;async function No(e,t){return vc(e,t,{createTask:uv})}async function Mh(e,t,n,r={}){return Ic(e,t,n,{...r,launchProvisioned:(s,i)=>jh(e,s,i,!1)})}async function uv(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>jh(e,s,i,!0)})}async function jh(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 Lh(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:$o(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await ue.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:dv,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await Rd(e,i.command.id)}catch(i){throw await Eo(e,[s.id]),i}}async function _o(e,t,n){let r=(await S.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await Ac(e,t,n);if(!await Eo(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 Eo(e,o),a}}import{randomUUID as Bh}from"node:crypto";import{readFile as pv,realpath as qh}from"node:fs/promises";import Pd from"node:path";var X={type:"system",component:"orchestration-supervisor"},fv=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function mv(e,t,n,r,s,i){await vd(e);let o=await Av(e,t);if(await S.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new g("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await Ze(e,i,"fury.plan",r)}let a=await ud(t,n);Ev(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:Zl(c),createdBy:s,createdAt:l};await xf(e,a.definitionHash,await pv(t,"utf8"));let d=await Lf(e,u);try{await je(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 Id(e,t,n,r){if(await vd(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let s=await os(e,t);if(r!==void 0&&s.planHash!==r)throw new g("FURY_STATE_CONFLICT","The Fury plan changed after you reviewed it. Review the current plan before approving.",{});let i={schemaVersion:1,planId:s.id,planHash:s.planHash,approvedBy:n,approvedAt:new Date().toISOString()},o=await jf(e,i);try{await je(e,{id:`${s.id}:fury.plan.approved`,taskId:s.rootTaskId,type:"fury.plan.approved",occurredAt:o.approval.approvedAt,actor:o.approval.approvedBy,data:{planId:s.id,planHash:s.planHash}})}catch(a){throw new g("PARTIAL_RESULT",`Fury plan ${s.id} was approved, but its audit event could not be recorded.`,{details:{planId:s.id,planHash:s.planHash,persisted:!0,approved:!0},cause:a})}return{kind:"approveFury",plan:s,approval:o.approval,created:o.created}}async function hv(e,t,n,r){await vd(e);let s=await os(e,t);if((await qf(e,t)).planHash!==s.planHash)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} changed after approval.`,{});if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury run requires an agent capability.",{});await Ze(e,r,"fury.run",s.rootTaskId)}await st(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 Uf(e,l);try{await le(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(u){throw new g("PARTIAL_RESULT",`Fury run ${c.run.id} was persisted, but its audit event could not be recorded.`,{details:{runId:c.run.id,planId:c.run.planId,persisted:!0},cause:u})}return ne(c.run)||await Mn(e,c.run.id),{kind:"runFury",run:await te(e,c.run.id),created:c.created}}async function gv(e,t){return{kind:"showFury",run:await te(e,t)}}async function Fo(e,t={}){let n=await k.load(e),r=k.previews.isEnabled(n,"agentOrchestration");for(let s of await Ei(e))await yv(e,s.id,{...t,allowScheduling:r})}async function yv(e,t,n={}){let r=n.allowScheduling??k.previews.isEnabled(await k.load(e),"agentOrchestration"),s=await te(e,t);if(await _v(e,s),ne(s)){s.cleanupPending&&await Dv(e,s);return}if(s=await xv(e,s),await Fv(e,s),Date.now()>=Date.parse(s.deadlineAt)){if(s=await Ae(e,t,a=>ne(a)?a:Nv(a)),s.state!=="timed_out")return;for(let a of Object.values(s.stepRuns))a.reviewId&&await lr(e,a.reviewId,l=>["waiting_for_review","changes_requested"].includes(l.state)?{...l,state:"timed_out",version:l.version+1,updatedAt:new Date().toISOString()}:l);await le(e,s,null,"fury.run.timed_out",X,{state:s.state});return}let i=new Map((await qe(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 Uh(e,s,l);continue}l.state==="running"&&l.commandId&&i.get(l.commandId)?.state==="failed"&&(s=await Do(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 Do(e,s.id,l.id,`Agent session ${l.agentTabId} disappeared.`,X)),l.state==="running"&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(s=await Ae(e,s.id,u=>ne(u)?u:Wt(u,l.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.step.timed_out",X,{})),(l.state==="waiting_for_review"||l.state==="changes_requested")&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(l.reviewId&&await lr(e,l.reviewId,u=>({...u,state:"timed_out",version:u.version+1,updatedAt:new Date().toISOString()})),s=await Ae(e,s.id,u=>ne(u)?u:Wt(u,l.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.review.timed_out",X,{reviewId:l.reviewId}))}if(Object.values(s.stepRuns).some(a=>a.state==="failed"||a.state==="timed_out")){await xo(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 wv(e,s,l):r&&(s=await Uh(e,s,l),o+=1))}await $v(e,s.id)}async function Uh(e,t,n){let r=new Date;if(t=await Ae(e,t.id,i=>ne(i)?i:Wt(i,n.id,{state:"running",startedAt:i.stepRuns[n.id]?.startedAt??r.toISOString(),deadlineAt:i.deadlineAt})),ne(t))return t;await le(e,t,n.id,"fury.step.started",X,{});let s=t.stepRuns[n.id];if(s.taskId)return t;try{let i=`${Ln(s.plan.prompt,t)}
|
|
212
212
|
|
|
213
|
-
${bv(t.id,n.id,s.plan.outputSchema)}`,o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await Oo(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:Fn(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:Fn(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),u=await S.getTask(e,c.taskId),d=u.ptyTabs.find(p=>p.kind==="agent");if(!d)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${u.id} has no agent tab.`,{});o=u.id,a=d.id,l=(await je(e)).find(p=>p.idempotencyKey===`task-start:${u.id}`)?.id??null}else{o=Fn(s.plan.target.task,t);let c=await S.getTask(e,o),u=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!u)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await st(e,c,X,u.id),a=u.id,l=(await ue.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:X})).command.id}return t=await Ce(e,t.id,c=>ne(c)?{...c,cleanupPending:!0}:Bt(c,n.id,{taskId:o,agentTabId:a,commandId:l})),ne(t)||await le(e,t,n.id,"fury.step.dispatched",X,{taskId:o,agentTabId:a,commandId:l}),t}catch(i){let o=await te(e,t.id);return ne(o)?o:No(e,t.id,n.id,i instanceof Error?i.message:"Step dispatch failed.",X)}}async function cv(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?Fn(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(u=>u.taskId===o&&u.agentTabId):null,l=await rt(e,i).catch(u=>{if(u instanceof g&&u.code==="FURY_REVIEW_NOT_FOUND")return null;throw u}),c=l??{schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:Fn(r.title,t),summary:Fn(r.summary,t),feedbackTarget:o?{taskId:o,agentTabId:a?.agentTabId??null}:null,round:1,requestedAt:s.toISOString(),deadlineAt:new Date(Math.min(Date.parse(t.deadlineAt),s.getTime()+r.timeoutMs)).toISOString(),version:1,lastDecision:null,history:[],updatedAt:s.toISOString()};return l||await jf(e,c),t=await Ce(e,t.id,u=>ne(u)?{...u,cleanupPending:!0}:Bt(u,n.id,{state:"waiting_for_review",reviewId:i,startedAt:c.requestedAt,deadlineAt:c.deadlineAt})),ne(t)||await le(e,t,n.id,"fury.review.requested",X,{reviewId:i,title:c.title}),t}async function dv(e,t,n,r,s,i){let o=await te(e,t),a=xh(o,n);await Fh(e,a,s,i,"fury.step.complete"),wv(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ce(e,t,c=>{if(ne(c)||c.stepRuns[n]?.state!=="running"||Date.now()>=Date.parse(c.deadlineAt))throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running or its deadline has elapsed.`,{});return Bt(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await xn(e,t),o=await te(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function uv(e,t,n,r,s,i){let o=await te(e,t),a=xh(o,n);await Fh(e,a,s,i,"fury.step.fail");let l=await No(e,t,n,r,s);return await _o(e,t,"failed",s),await xn(e,t),{kind:"failFuryStep",run:await te(e,t),step:l.stepRuns[n]}}async function pv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Qe(e,r,"fury.cancel",s.rootTaskId)}if(ne(s))return s.cleanupPending&&await xn(e,t),{kind:"cancelFury",run:await te(e,t),changed:!1};let i=new Date().toISOString(),o=!1,a=await Ce(e,t,l=>ne(l)?l:(o=!0,{...l,state:"cancelled",cleanupPending:!0,cleanupError:null,completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,u])=>[c,u.state==="succeeded"?u:{...u,state:"cancelled",completedAt:i,completedBy:n}]))}));return o?(await le(e,a,null,"fury.run.cancelled",n,{}),await xn(e,t),{kind:"cancelFury",run:await te(e,t),changed:o}):{kind:"cancelFury",run:a,changed:!1}}async function fv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Qe(e,r,"fury.resume",s.rootTaskId)}if(ne(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await xn(e,t),{kind:"resumeFury",run:await te(e,t)}}async function mv(e,t,n){return{kind:"listFuryReviews",reviews:(await os(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function hv(e,t){return{kind:"showFuryReview",review:await rt(e,t)}}async function gv(e,t,n,r,s,i){let o=await rt(e,t),a=await te(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can decide a fury review.",{});if(n==="resubmit"&&s.type!=="human"&&s.type!=="agent")throw new g("CAPABILITY_DENIED","Only a human or the feedback-target agent can resubmit a review.",{});if(n==="resubmit"&&s.type==="agent"){if(!o.feedbackTarget||s.taskId!==o.feedbackTarget.taskId||!i)throw new g("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await Qe(e,i,"fury.review.resubmit",s.taskId)}if(ne(a)||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(o.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} belongs to a terminal or expired run.`,{});if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await S.getTask(e,o.feedbackTarget.taskId);if(!(o.feedbackTarget.agentTabId?h.ptyTabs.find(m=>m.kind==="agent"&&m.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(m=>m.kind==="agent")))throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{})}let u=new Date().toISOString(),d={sequence:o.history.length+1,round:o.round,action:n,message:r,actor:s,feedbackCommandId:c,occurredAt:u},p=n==="approve"?"approved":n==="reject"?"rejected":n==="request_changes"?"changes_requested":"waiting_for_review";return o=await or(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(h.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:d,history:[...h.history,d],updatedAt:u}}),a=await Ce(e,a.id,h=>{if(ne(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return Bt(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:u,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:u,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await le(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"&&await _o(e,a.id,"failed",s),await xn(e,a.id),{kind:"actFuryReview",review:o,run:await te(e,a.id)}}async function yv(e,t,n,r){await te(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){let a=await In(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,ne(await te(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await Av(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function Fn(e,t){return e.replace(sv,(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 wv(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(bd(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function bd(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])?bd(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)=>bd(o,t.items,`${n}[${a}]`,r))}async function Fh(e,t,n,r,s){if(n.type!=="human"){if(n.type!=="agent"||!r||n.taskId!==t.taskId)throw new g("CAPABILITY_DENIED","The step actor does not own this fury step.",{});await Qe(e,r,s,n.taskId)}}function xh(e,t){if(ne(e))throw new g("FURY_STATE_CONFLICT",`Run ${e.id} is ${e.state}.`,{});let n=e.stepRuns[t];if(!n)throw new g("FURY_STATE_CONFLICT",`Run ${e.id} has no step ${t}.`,{});if(n.kind!=="agent"||n.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${t} is ${n.state}.`,{});return n}async function kv(e,t){let[n,r]=await Promise.all([Nh(ke(e).root),Nh(t)]),s=Td.relative(n,r);if(!s||s.startsWith("..")||Td.isAbsolute(s)||!/\.ya?ml$/i.test(s))throw new g("FURY_DEFINITION_INVALID","Fury plans must use a YAML definition stored under .craig/fury/.",{details:{file:t,furyRoot:ke(e).root}});return Td.join(".craig","fury",s)}function Tv(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 bv(e,t,n){return n?`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --output '<json matching ${JSON.stringify(n)}>' --json
|
|
213
|
+
${Ov(t.id,n.id,s.plan.outputSchema)}`,o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await No(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:Ln(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:Ln(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),u=await S.getTask(e,c.taskId),d=u.ptyTabs.find(p=>p.kind==="agent");if(!d)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${u.id} has no agent tab.`,{});o=u.id,a=d.id,l=(await qe(e)).find(p=>p.idempotencyKey===`task-start:${u.id}`)?.id??null}else{o=Ln(s.plan.target.task,t);let c=await S.getTask(e,o),u=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!u)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await st(e,c,X,u.id),a=u.id,l=(await ue.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:X})).command.id}return t=await Ae(e,t.id,c=>ne(c)?{...c,cleanupPending:!0}:Wt(c,n.id,{taskId:o,agentTabId:a,commandId:l})),ne(t)||await le(e,t,n.id,"fury.step.dispatched",X,{taskId:o,agentTabId:a,commandId:l}),t}catch(i){let o=await te(e,t.id);return ne(o)?o:Do(e,t.id,n.id,i instanceof Error?i.message:"Step dispatch failed.",X)}}async function wv(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?Ln(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(u=>u.taskId===o&&u.agentTabId):null,l=await rt(e,i).catch(u=>{if(u instanceof g&&u.code==="FURY_REVIEW_NOT_FOUND")return null;throw u}),c=l??{schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:Ln(r.title,t),summary:Ln(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 Wf(e,c),t=await Ae(e,t.id,u=>ne(u)?{...u,cleanupPending:!0}:Wt(u,n.id,{state:"waiting_for_review",reviewId:i,startedAt:c.requestedAt,deadlineAt:c.deadlineAt})),ne(t)||await le(e,t,n.id,"fury.review.requested",X,{reviewId:i,title:c.title}),t}async function kv(e,t,n,r,s,i){let o=await te(e,t),a=Vh(o,n);await Wh(e,a,s,i,"fury.step.complete"),Cv(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ae(e,t,c=>{if(ne(c)||c.stepRuns[n]?.state!=="running"||Date.now()>=Date.parse(c.deadlineAt))throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running or its deadline has elapsed.`,{});return Wt(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Mn(e,t),o=await te(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function Tv(e,t,n,r,s,i){let o=await te(e,t),a=Vh(o,n);await Wh(e,a,s,i,"fury.step.fail");let l=await Do(e,t,n,r,s);return await xo(e,t,"failed",s),await Mn(e,t),{kind:"failFuryStep",run:await te(e,t),step:l.stepRuns[n]}}async function bv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Ze(e,r,"fury.cancel",s.rootTaskId)}if(ne(s))return s.cleanupPending&&await Mn(e,t),{kind:"cancelFury",run:await te(e,t),changed:!1};let i=new Date().toISOString(),o=!1,a=await Ae(e,t,l=>ne(l)?l:(o=!0,{...l,state:"cancelled",cleanupPending:!0,cleanupError:null,completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,u])=>[c,u.state==="succeeded"?u:{...u,state:"cancelled",completedAt:i,completedBy:n}]))}));return o?(await le(e,a,null,"fury.run.cancelled",n,{}),await Mn(e,t),{kind:"cancelFury",run:await te(e,t),changed:o}):{kind:"cancelFury",run:a,changed:!1}}async function Rv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Ze(e,r,"fury.resume",s.rootTaskId)}if(ne(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await Mn(e,t),{kind:"resumeFury",run:await te(e,t)}}async function Pv(e,t,n){return{kind:"listFuryReviews",reviews:(await ls(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function Sv(e,t){return{kind:"showFuryReview",review:await rt(e,t)}}async function Iv(e,t,n,r,s,i){let o=await rt(e,t),a=await te(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can decide a fury review.",{});if(n==="resubmit"&&s.type!=="human"&&s.type!=="agent")throw new g("CAPABILITY_DENIED","Only a human or the feedback-target agent can resubmit a review.",{});if(n==="resubmit"&&s.type==="agent"){if(!o.feedbackTarget||s.taskId!==o.feedbackTarget.taskId||!i)throw new g("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await Ze(e,i,"fury.review.resubmit",s.taskId)}if(ne(a)||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(o.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} belongs to a terminal or expired run.`,{});if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await S.getTask(e,o.feedbackTarget.taskId);if(!(o.feedbackTarget.agentTabId?h.ptyTabs.find(m=>m.kind==="agent"&&m.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(m=>m.kind==="agent")))throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{})}let u=new Date().toISOString(),d={sequence:o.history.length+1,round:o.round,action:n,message:r,actor:s,feedbackCommandId:c,occurredAt:u},p=n==="approve"?"approved":n==="reject"?"rejected":n==="request_changes"?"changes_requested":"waiting_for_review";return o=await lr(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(h.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:d,history:[...h.history,d],updatedAt:u}}),a=await Ae(e,a.id,h=>{if(ne(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return Wt(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:u,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:u,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await le(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"&&await xo(e,a.id,"failed",s),await Mn(e,a.id),{kind:"actFuryReview",review:o,run:await te(e,a.id)}}async function vv(e,t,n,r){await te(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){let a=await In(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,ne(await te(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await Lv(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function Ln(e,t){return e.replace(fv,(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=xn(o)?o[a]:void 0;if(o===void 0)throw new g("FURY_OUTPUT_INVALID",`Step ${r} has no output at ${s}.`,{});return typeof o=="string"?o:JSON.stringify(o)})}function Cv(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(Sd(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function Sd(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?xn(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"&&xn(e)){let o=xn(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))xn(o[a])?Sd(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&xn(t.items)&&e.forEach((o,a)=>Sd(o,t.items,`${n}[${a}]`,r))}async function Wh(e,t,n,r,s){if(n.type!=="human"){if(n.type!=="agent"||!r||n.taskId!==t.taskId)throw new g("CAPABILITY_DENIED","The step actor does not own this fury step.",{});await Ze(e,r,s,n.taskId)}}function Vh(e,t){if(ne(e))throw new g("FURY_STATE_CONFLICT",`Run ${e.id} is ${e.state}.`,{});let n=e.stepRuns[t];if(!n)throw new g("FURY_STATE_CONFLICT",`Run ${e.id} has no step ${t}.`,{});if(n.kind!=="agent"||n.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${t} is ${n.state}.`,{});return n}async function Av(e,t){let[n,r]=await Promise.all([qh(ke(e).root),qh(t)]),s=Pd.relative(n,r);if(!s||s.startsWith("..")||Pd.isAbsolute(s)||!/\.ya?ml$/i.test(s))throw new g("FURY_DEFINITION_INVALID","Fury plans must use a YAML definition stored under .craig/fury/.",{details:{file:t,furyRoot:ke(e).root}});return Pd.join(".craig","fury",s)}function Ev(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 Ov(e,t,n){return n?`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --output '<json matching ${JSON.stringify(n)}>' --json
|
|
214
214
|
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`:`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --json
|
|
215
|
-
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function
|
|
215
|
+
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function Do(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ae(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(ne(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,Wt(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await le(e,a,n,"fury.step.failed",s,{reason:r}),a}function Wt(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function $v(e,t){let n=await te(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await xo(e,t,s,X)}async function xo(e,t,n,r){let s=await te(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ae(e,t,l=>ne(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null,...["failed","cancelled","timed_out"].includes(n)?{cleanupPending:!0,cleanupError:null,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,u])=>[c,["pending","running","waiting_for_review","changes_requested"].includes(u.state)?{...u,state:"cancelled",completedAt:o,completedBy:X}:u]))}:{}});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function Nv(e){let t=new Date().toISOString();return{...e,state:"timed_out",cleanupPending:!0,cleanupError:null,updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:X}]))}}async function le(e,t,n,r,s,i){let o=xn(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 je(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 _v(e,t){await le(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await le(e,t,null,`fury.run.${t.state}`,X,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",X,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",X,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await le(e,t,n.id,`fury.step.${n.state}`,n.completedBy??X,{reason:n.error}),!n.reviewId)continue;let r=await rt(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",X,{reviewId:r.id,title:r.title});for(let s of r.history)await le(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function Dv(e,t){try{let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(c=>c.furyRunId===t.id&&(t.state==="cancelled"||t.stepRuns[c.furyStepId??""]?.state!=="succeeded")),s=new Set(r.map(c=>c.id)),i=new Set(Object.values(t.stepRuns).map(c=>c.commandId).filter(Boolean)),o=(await ls(e)).filter(c=>c.runId===t.id),a=new Set(o.map(c=>c.id));for(let c of await qe(e)){let u=c.idempotencyKey?.match(/^fury-review:([^:]+):[0-9]+$/)?.[1];c.state==="queued"&&(i.has(c.id)||s.has(c.taskId)||u&&a.has(u))&&await ue.cancel(e,c.id,X)}for(let c of r)await _o(e,c.id);for(let c of o)await lr(e,c.id,u=>["waiting_for_review","changes_requested"].includes(u.state)?{...u,state:t.state==="timed_out"?"timed_out":"cancelled",version:u.version+1,updatedAt:new Date().toISOString()}:u);let l=await Ae(e,t.id,c=>({...c,cleanupPending:!1,cleanupError:null}));await le(e,l,null,"fury.run.cleanup_completed",X,{})}catch(n){let r=n instanceof Error?n.message:"Fury cleanup failed.";await Ae(e,t.id,s=>({...s,cleanupPending:!0,cleanupError:r})),t.cleanupError!==r&&await le(e,t,null,"fury.run.cleanup_failed",X,{reason:r})}}async function Mn(e,t){if(!await Fn(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 Fv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId)continue;let r=await rt(e,n.reviewId),s=r.lastDecision;if(r.state!=="changes_requested"||!r.feedbackTarget||s?.action!=="request_changes"||s.feedbackCommandId||Date.now()>=Math.min(Date.parse(t.deadlineAt),Date.parse(r.deadlineAt)))continue;let i=await S.getTask(e,r.feedbackTarget.taskId),o=r.feedbackTarget.agentTabId?i.ptyTabs.find(l=>l.kind==="agent"&&l.id===r.feedbackTarget.agentTabId):i.ptyTabs.find(l=>l.kind==="agent");if(!o)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${i.id} has no agent tab.`,{});let{command:a}=await ue.create(e,{taskId:i.id,agentTabId:o.id,prompt:{source:"inline",text:`Fury review ${r.id} changes requested:
|
|
216
216
|
|
|
217
217
|
${s.message}
|
|
218
218
|
|
|
219
219
|
After revisions, resubmit with: craig fury review resubmit ${r.id} --summary '<revised summary>' --json
|
|
220
|
-
Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${r.id}:${s.round}`,actor:s.actor});await
|
|
220
|
+
Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${r.id}:${s.round}`,actor:s.actor});await lr(e,r.id,l=>{if(l.state!=="changes_requested"||l.version!==r.version)return l;let c={...s,feedbackCommandId:a.id};return{...l,lastDecision:c,history:l.history.map(u=>u.sequence===s.sequence?c:u)}})}}async function xv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId||n.kind!=="human_review")continue;let r=await rt(e,n.reviewId),s=r.state==="approved"?"succeeded":r.state==="rejected"?"failed":r.state;n.state!==s&&(t=await Ae(e,t.id,i=>ne(i)?i:Wt(i,n.id,{state:s,completedBy:r.lastDecision?.actor??X,...["succeeded","failed","timed_out","cancelled"].includes(s)?{completedAt:r.updatedAt}:{}})))}return t}async function vd(e){if(!k.previews.isEnabled(await k.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function ne(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function xn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Lv(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 Ve={plan:mv,approve:Id,run:hv,show:gv,watch:vv,cancel:bv,resume:Rv,completeStep:kv,failStep:Tv,listReviews:Pv,showReview:Sv,actOnReview:Iv,reconcile:Fo};import{access as Mv,stat as jv}from"node:fs/promises";import qv from"node:path";import{constants as Uv}from"node:fs";async function Cd(e,t){let n=qv.resolve(e,t),r;try{r=await jv(n),await Mv(n,Uv.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 Bv}from"node:net";async function Gh(e,t){let n=await Vv(Ce(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await Kh(n,{type:"ping"})).protocolVersion!==Pt?!1:((await Kh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var Wv=1;function Kh(e,t){let n=Wv++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig UI navigation request timed out."))},1e3),a=c=>{i+=String(c);let u=i.indexOf(`
|
|
221
221
|
`);if(u===-1)return;l();let d=JSON.parse(i.slice(0,u));d.ok?r(d):s(new Error(d.error??"Craig UI navigation request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
|
|
222
|
-
`)})}function Fv(e){return new Promise((t,n)=>{let r=Dv(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function qh(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 Id(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await be.repos.addRepo(t.paths,e.path);return await Id(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return be.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Bn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await ve(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await be.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return be.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await be.archiveWorkspace(t.paths,e.workspaceId);return await Mv(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await be.restoreWorkspace(t.paths,e.workspaceId);return await Id(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return be.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Oh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),Oo(t.paths,{parentTaskId:e.parentTaskId??Wt(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Ln(t),Sc(t.paths,e.taskId??Wt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),$o(t.paths,e.taskId??Wt(t).task.id,t.agentCapabilityId);case"validateFury":return await jh(t),ad(vd.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await jh(t),We.plan(t.paths,vd.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Wt(t).task.id,fn(t),t.agentCapabilityId);case"approveFury":return We.approve(t.paths,e.planId,fn(t));case"runFury":return Ln(t),We.run(t.paths,e.planId,fn(t),t.agentCapabilityId);case"showFury":return We.show(t.paths,e.runId);case"watchFury":return We.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return We.cancel(t.paths,e.runId,fn(t),t.agentCapabilityId);case"resumeFury":return We.resume(t.paths,e.runId,fn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),We.completeStep(t.paths,e.runId,e.stepId,await Lv(e.output,t),fn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),We.failStep(t.paths,e.runId,e.stepId,e.reason,fn(t),t.agentCapabilityId);case"listFuryReviews":return We.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return We.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),We.actOnReview(t.paths,e.reviewId,e.action,e.message??null,fn(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=Wt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??Wt(t).task.id,e.title);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return S.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await Sd(t.cwd??process.cwd(),e.path),s=await Mh(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,Wt(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Mn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Mn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Mn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return xt.listAgents(t.paths,e.taskId);case"showAgentStatus":return xt.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Mn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?Po.waitForTaskState(t.paths,r,n):xt.waitForTask(t.paths,r,n)}case"listEvents":return Po.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return Po.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Rr.send(t.paths,{taskId:Mn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Rr.show(t.paths,e.commandId);case"listPromptCommands":return Rr.list(t.paths,e.taskId);case"cancelPromptCommand":return Rr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Rr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,Pr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,Pr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,Pr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,Pr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,Pr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,Pr(t,"commit"));case"showContext":{let n=qv(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:Da()};case"exit":return{kind:"exit"};default:return jv(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 jh(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function fn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Wt(e);if(!e.agentCapabilityId||!t.agentTabId)throw new g("CAPABILITY_DENIED","This agent session has no scoped capability.",{});return{type:"agent",taskId:t.task.id,agentTabId:t.agentTabId,capabilityId:e.agentCapabilityId.split(".",1)[0]}}async function Lv(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await xv(vd.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 Id(e,t,n){let r=await Bn({uiStateFile:e.uiStateFile})??Js();await yt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function Mv(e,t){let n=await Bn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await yt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function jv(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Pr(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function Wt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??Wt(t).task.id}function qv(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Bh(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(`
|
|
222
|
+
`)})}function Vv(e){return new Promise((t,n)=>{let r=Bv(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function Yh(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 Ad(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await be.repos.addRepo(t.paths,e.path);return await Ad(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return be.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Vn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await ve(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await be.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return be.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await be.archiveWorkspace(t.paths,e.workspaceId);return await Hv(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await be.restoreWorkspace(t.paths,e.workspaceId);return await Ad(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return be.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Mh(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 jn(t),No(t.paths,{parentTaskId:e.parentTaskId??Vt(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 jn(t),Cc(t.paths,e.taskId??Vt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return jn(t),_o(t.paths,e.taskId??Vt(t).task.id,t.agentCapabilityId);case"validateFury":return await Hh(t),dd(Ed.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Hh(t),Ve.plan(t.paths,Ed.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Vt(t).task.id,fn(t),t.agentCapabilityId);case"approveFury":return Ve.approve(t.paths,e.planId,fn(t));case"runFury":return jn(t),Ve.run(t.paths,e.planId,fn(t),t.agentCapabilityId);case"showFury":return Ve.show(t.paths,e.runId);case"watchFury":return Ve.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Ve.cancel(t.paths,e.runId,fn(t),t.agentCapabilityId);case"resumeFury":return Ve.resume(t.paths,e.runId,fn(t),t.agentCapabilityId);case"completeFuryStep":return jn(t),Ve.completeStep(t.paths,e.runId,e.stepId,await Gv(e.output,t),fn(t),t.agentCapabilityId);case"failFuryStep":return jn(t),Ve.failStep(t.paths,e.runId,e.stepId,e.reason,fn(t),t.agentCapabilityId);case"listFuryReviews":return Ve.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Ve.showReview(t.paths,e.reviewId);case"actFuryReview":return jn(t),Ve.actOnReview(t.paths,e.reviewId,e.action,e.message??null,fn(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=Vt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??Vt(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 Cd(t.cwd??process.cwd(),e.path),s=await Gh(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,Vt(t).task.id);case"showTaskPr":return S.prs.show(t.paths,qn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,qn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,qn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,qn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,qn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return Lt.listAgents(t.paths,e.taskId);case"showAgentStatus":return Lt.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=qn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?Io.waitForTaskState(t.paths,r,n):Lt.waitForTask(t.paths,r,n)}case"listEvents":return Io.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return Io.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 Sr.send(t.paths,{taskId:qn(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 Sr.show(t.paths,e.commandId);case"listPromptCommands":return Sr.list(t.paths,e.taskId);case"cancelPromptCommand":return Sr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Sr.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,Ir(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,Ir(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,Ir(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,Ir(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,Ir(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,Ir(t,"commit"));case"showContext":{let n=zv(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:Fa()};case"exit":return{kind:"exit"};default:return Yv(e)}}function jn(e){if(!(!e.agentContext||e.agentCapabilityId))throw new g("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function Hh(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function fn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Vt(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 Gv(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await Kv(Ed.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 Ad(e,t,n){let r=await Vn({uiStateFile:e.uiStateFile})??Qs();await yt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function Hv(e,t){let n=await Vn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await yt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function Yv(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Ir(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 Vt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function qn(e,t){return e??Vt(t).task.id}function zv(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Jh(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
223
223
|
`);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
|
|
224
224
|
`);case"listRepos":return e.repos.length===0?"No repos registered yet. Use 'craig repo add <path>'.":["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
225
225
|
`);case"removeRepo":return`Removed repo ${e.repoId} (${e.rootPath})`;case"listWorkspaces":return e.workspaces.length===0?e.archivedOnly?"No archived workspaces.":"No active workspaces yet. Register one with 'craig workspace add <path>'.":["ID KIND STATUS REPOS PATH",...e.workspaces.map(t=>`${t.id} ${t.kind??"repo"} ${t.status} ${(t.discoveredRepoIds??[t.primaryRepoId]).join(",")} ${t.rootPath??""}`)].join(`
|
|
@@ -229,71 +229,74 @@ Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min
|
|
|
229
229
|
`);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
|
|
230
230
|
`);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
|
|
231
231
|
`);case"planFury":return[`Planned fury ${e.plan.name}`,`Plan: ${e.plan.id}`,`Root task: ${e.plan.rootTaskId}`,`Hash: ${e.plan.planHash}`,`Steps: ${e.plan.steps.length}`,...e.plan.waves.map((t,n)=>`Wave ${n}: ${t.join(", ")}`),`Approval required: craig fury approve ${e.plan.id} --json`].join(`
|
|
232
|
-
`);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return
|
|
233
|
-
`);case"showFuryReview":return
|
|
232
|
+
`);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return Jv(e.run);case"completeFuryStep":case"failFuryStep":return`${e.run.id} step ${e.step.id}: ${e.step.state}`;case"listFuryReviews":return e.reviews.length===0?"No fury reviews found.":["ID RUN STEP STATE ROUND TITLE",...e.reviews.map(t=>`${t.id} ${t.runId} ${t.stepId} ${t.state} ${t.round} ${t.title}`)].join(`
|
|
233
|
+
`);case"showFuryReview":return zh(e.review);case"actFuryReview":return`${zh(e.review)}
|
|
234
234
|
Run: ${e.run.state}`;case"watchFury":return"";case"addTaskLink":return[`Added contextual repo link ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`,`This does not provision a project task target. Use 'craig task repo add ${e.taskId} ${e.repoId}' for that.`].join(`
|
|
235
235
|
`);case"addTaskRepoTarget":return[`${e.disposition==="added"?"Added":"Found"} repo target ${e.repoId} for task ${e.taskId}`,`Branch: ${e.branch}`,`Worktree: ${e.worktreePath}`].join(`
|
|
236
236
|
`);case"listTaskLinks":return e.repos.length===0?`Task ${e.taskId} has no linked repos.`:["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
237
|
-
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${
|
|
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}`,...
|
|
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} ${nC(t)} ${rC(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}`,...eC(e)].join(`
|
|
239
239
|
`);case"currentTask":return[`${e.task.id}: ${e.task.title}`,`Workspace: ${e.task.workspaceId}`,`Repo: ${e.task.repoId}`,`Worktree: ${e.task.worktreePath}`,`Context source: ${e.context.source}`,`Agent tab: ${e.context.agentTabId??"none"}`].join(`
|
|
240
|
-
`);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return
|
|
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
|
|
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 Zv(e);case"listAgents":case"showAgentStatus":return Qv(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(Od).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 Xv(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
|
|
242
242
|
`);case"cancelPromptCommand":return`${e.changed?"Cancelled":"Command already cancelled:"} ${e.command.id}`;case"waitPromptCommand":return`Command ${e.command.id} reached ${e.command.state}.`;case"showContext":return[`Workspace: ${e.workspace.root}`,`Workspace source: ${e.workspace.source}`,`Initialized: ${e.workspace.initialized?"yes":"no"}`,`Task: ${e.task?.id??"none"}`,`Task source: ${e.task?.source??"none"}`,`Agent tab: ${e.task?.agentTabId??"none"}`].join(`
|
|
243
243
|
`);case"streamTaskLogs":return`Streaming logs for ${e.taskId} from ${e.logPath}`;case"showTaskDiff":return e.isEmpty?`Task ${e.taskId} has no uncommitted diff.`:e.diffText;case"openTask":return e.launched?`Opened task ${e.taskId} at ${e.worktreePath}`:e.worktreePath;case"openFile":return`Opened ${e.path} in Craig.`;case"runChecks":return`Checks ${e.status} for ${e.taskId}: ${e.commands.join(", ")}`;case"commitTask":return[`Committed task ${e.taskId}`,`Status: ${e.status}`,`Commit: ${e.commitSha}`,`Message: ${e.message}`].join(`
|
|
244
|
-
`);default:return
|
|
245
|
-
`)}function
|
|
246
|
-
`)}function
|
|
247
|
-
`)}function
|
|
248
|
-
`)}function
|
|
249
|
-
`)}function
|
|
250
|
-
`)
|
|
251
|
-
`)
|
|
252
|
-
`)
|
|
253
|
-
`
|
|
254
|
-
|
|
255
|
-
`)}function
|
|
256
|
-
`)}function
|
|
257
|
-
|
|
258
|
-
`)
|
|
259
|
-
`),s={bg:C.
|
|
260
|
-
`)}function
|
|
261
|
-
`)
|
|
262
|
-
`)}function Jo(e,t,n,r,s){let i=[n.versionText,n.updateText].filter(Boolean).join(" ");if(!i)return B(ht(e,t),r,s);let o=Ud(i,Math.max(0,t-2)),a=Math.max(0,t-Ee(o)-2),l=n.updateText?Ar(o,r,s):xs(o,r,s);return B(`${ht(e,a)} ${l} `,r,s)}function vg(e,t,n,r){let s=jC(e.runners),i=1,o=e.leftTree.map(l=>MC(l,t,r));return[...vr(o,n-i),s]}function xC(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Mo(s)?e.centerTranscript.map(o=>({...o})):Ag(e);return vr([...Cg(e,t,r),...i],n)}function Cg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:JC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Un(a,n,C.panelBg):Ar(a,n,C.panelMuted)}`,c=[`${Ar(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),u=Og(e.tabs,n,e.focusedRegion==="center"),d=" engaged ",p=d.length+2,h=e.inputMode==="terminal"?Un(`${d}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ee(u)-p)):"";return[{text:e.inputMode==="terminal"?`${u}${f}${h}`:u},{text:l,tone:"muted"},{text:c},mt()]}function Ag(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},mt(),{text:e.terminal.error},mt(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(Ld)}function Ld(e){return{text:Bd(e.segments),segments:e.segments,fullBleed:!0}}function Eg(e,t,n,r){let s=e.rightInspection?LC(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,n):vr([{text:"CONTEXT"},mt(),...e.rightContext.map(i=>qC(i,r)),...e.actionMessage?[mt(),{text:e.actionMessage}]:[]],n);return vr(s,n)}function LC(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:XC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>cg(a)),...r.slice(o,o+s).map(a=>cg(a))]}function cg(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 MC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Un("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ee(m.text),0):0,l=t-Ee(i)-Ee(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",u=e.selected?e.text:e.focused?Un(e.text,n,C.panelBg):e.panelHeader?Ar(e.text,n,C.panelMuted):e.text,d=ht(`${r}${c}${u}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=d.slice(f.length+2),y=m.trimEnd(),T=m.slice(y.length),R=[{text:f},$g(e.activity,e.activityAnimationFrame??0),{text:" "},{text:y,style:{bold:e.unread===!0}},{text:`${T}${i}${o}`},...e.prBadge??[]];return{text:Bd(R),segments:R,tone:p}}if(e.prBadge){let f=[{text:`${d}${i}${o}`},...e.prBadge];return{text:`${d}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${d}${i}${o}`,tone:p}}function jC(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 Og(e,t,n){return e.map(r=>{let s=r.active?n?Un(r.label,t,C.panelBg):Ar(r.label,t,C.panelBg):xs(r.label,t,C.panelBg);r.unread&&(s=Yo({text:s,style:{bold:!0}},t,C.panelBg));let i=r.activity?Yo($g(r.activity,r.activityAnimationFrame??0),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function $g(e,t){return{text:"\u25CF",style:{fg:e==="working"?_d[t%_d.length]??_d[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg}}}function qC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xs(e.value,t,C.panelBg):e.value}`}}function Ir(e,t,n,r,s=!1){let i=UC(r,e.tone??"default"),o=Ng(e,n,i);if(r==="left"){let l=s?1:ug,c=s?1:pg;if(e.fullBleed)return B(ht(o,t),n,i);let u=t-l-c;if(e.rightAlign){let p=Ee(o),h=Math.max(0,u-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return B(f,n,i)}let d=`${" ".repeat(l)}${ht(o,u)}${" ".repeat(c)}`;return B(d,n,i)}return r==="center"&&e.fullBleed?BC(e,t,n,i):B(ht(` ${o}`,t),n,i)}function UC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function vr(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(mt());return n}function mt(){return{text:""}}function Ng(e,t,n){return e.segments?e.segments.map(r=>Yo(r,t,n)).join(""):e.text}function BC(e,t,n,r){let s=" ".repeat(Ho),i=Math.max(0,t-Ho*2);if(!e.segments)return B(`${s}${ht(e.text,i)}${s}`,n,r);let o=KC(e.segments,i),a=`${s}${o.map(l=>Yo(l,n,r)).join("")}${s}${n?Md:""}`;return B(a,n,r)}function Yo(e,t,n){let r=e.href?`${Dg(e.href)}${e.text}${Md}`:WC(e.text);return!t||!e.style?r:`${Cr(YC(e.style,n))}${zC(e.style)}${r}${Fd}${Cr(n)}`}function WC(e){return e.replace(OC,t=>{let[n,r]=VC(t);return`${Dg(n)}${n}${Md}${r}`})}function VC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Dg(e){return`\x1B]8;;${e}\x1B\\`}function KC(e,t){let n=GC(e,t);return HC(n,t)}function GC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ee(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Xo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function HC(e,t){let n=Ee(Bd(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 YC(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 zC(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 JC(e){let t=0;for(let n of e){if(n.active)return t;t+=n.label.length+(n.activity?2:0)+3}return 0}function _g(e,t){let n=Math.max(0,t-Ee(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function ht(e,t){let n=Ee(e);return n>=t?Ud(e,t):e+" ".repeat(t-n)}function Ud(e,t){if(t<=0)return"";if(Ee(e)<=t)return e;let n=Fg(e);return Xo(n,Math.max(0,t-1))+"\u2026"}function Ee(e){let t=0;for(let n of Array.from(Fg(e)))t+=Ls(n);return t}function Xo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Ls(s);if(r+i>t)break;n+=s,r+=i}return n}function Ls(e){let t=e.codePointAt(0);return t===void 0||t===0||t<32||t>=127&&t<160||t>=768&&t<=879||t>=6832&&t<=6911||t>=7616&&t<=7679||t>=8400&&t<=8447||t>=65024&&t<=65039||t>=8203&&t<=8207||t>=8288&&t<=8292||t===65279?0:t>=4352&&(t<=4447||t===9001||t===9002||t>=11904&&t<=42191&&t!==12351||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65135||t>=65280&&t<=65376||t>=65504&&t<=65510||t>=127744&&t<=129791||t>=131072&&t<=262141)?2:1}function XC(e,t,n){return Math.min(Math.max(e,t),n)}function Fg(e){return e.replace(EC,"").replace(CC,"")}function Bd(e){return e.map(t=>t.text).join("")}function B(e,t,n){if(!t)return e;let r=Cr(n),s=e.replace(AC,`${Fd}${r}`);return`${r}${s}${Fd}`}function Cr(e){let t=[];return e.fg&&t.push(`38;2;${dg(e.fg).join(";")}`),e.bg&&t.push(`48;2;${dg(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function dg(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Un(e,t,n){return Ms(e,t,C.success.fg,n)}function QC(e,t,n){return Ms(e,t,C.error.fg,n)}function Ar(e,t,n){return Ms(e,t,C.accent.fg,n)}function xs(e,t,n){return Ms(e,t,C.mutedfg.fg,n)}function Ms(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Cr(s)}${e}${Cr(r)}`}async function js(e,t){let n=k.previews.isEnabled(e.config,"agentOrchestration")?await is(e.paths):[];if(t?.aborted)return;let r=!1;if(JSON.stringify(n)!==JSON.stringify(e.model.furyPendingPlans??[])){let s=e.model.furyPendingPlans?.length??0;e.model={...e.model,furyPendingPlans:n,furyApprovalCount:Math.max(0,(e.model.furyApprovalCount??0)-s)+n.length},r=!0}if(e.state.mode==="overlay"&&e.state.variant==="fury-plans"&&e.state.furyPlans){let s=e.state.furyPlans;if(!s.plan&&!s.busy&&JSON.stringify(s.plans)!==JSON.stringify(n)){let i=s.plans[s.selectedIndex]?.id;e.state={...e.state,furyPlans:{...s,plans:n,selectedIndex:Math.max(0,n.findIndex(o=>o.id===i))}},r=!0}}r&&e.render()}function xg(e){k.previews.isEnabled(e.config,"agentOrchestration")&&(e.state={mode:"overlay",variant:"fury-plans",menuIndex:0,optionsMessage:null,shell:e.state.shell,furyPlans:{plans:e.model.furyPendingPlans??[],selectedIndex:0,plan:null,scrollOffset:0,confirming:!1,busy:!1,message:null}},e.pendingClear=!0,e.render(),js(e).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="fury-plans"||!e.state.furyPlans||e.state.furyPlans.plan||(e.state={...e.state,furyPlans:{...e.state.furyPlans,plans:e.model.furyPendingPlans??[]}},e.render())}).catch(t=>{e.state.mode!=="overlay"||e.state.variant!=="fury-plans"||!e.state.furyPlans||(e.state={...e.state,furyPlans:{...e.state.furyPlans,message:Mg(t)}},e.render())}))}function Lg(e,t){if(e.state.mode!=="overlay"||!e.state.furyPlans)return;let n=e.state.furyPlans;if(n.busy)return;let r=s=>{e.state.mode==="overlay"&&(e.state={...e.state,furyPlans:s},e.render())};if(t==="ESCAPE"){n.confirming?r({...n,confirming:!1}):n.plan?r({...n,plan:null,scrollOffset:0,message:null,plans:e.model.furyPendingPlans??[],selectedIndex:0}):(e.state={mode:"main",shell:jn(e.state.shell,e.model)},e.pendingClear=!0,e.render());return}if(!n.plan){t==="UP"||t==="k"?r({...n,selectedIndex:Math.max(0,n.selectedIndex-1)}):t==="DOWN"||t==="j"?r({...n,selectedIndex:Math.min(Math.max(0,n.plans.length-1),n.selectedIndex+1)}):Se(t)&&n.plans[n.selectedIndex]&&r({...n,plan:n.plans[n.selectedIndex],scrollOffset:0,message:null});return}if(n.confirming){if(!Se(t))return;let s=n.plan;r({...n,busy:!0,message:"Approving plan..."}),(async()=>{if(!(await is(e.paths)).some(o=>o.id===s.id&&o.planHash===s.planHash))throw await js(e),new g("FURY_STATE_CONFLICT","This plan was replaced or already approved. Return to the list and review the current plan.",{});await Rd(e.paths,s.id,{type:"human",source:"tui",processId:process.pid},s.planHash),await js(e),r({...n,plans:e.model.furyPendingPlans??[],selectedIndex:0,plan:null,confirming:!1,busy:!1,scrollOffset:0,message:"Plan approved. No workers started; the planning agent can now start it."})})().catch(i=>r({...n,confirming:!1,busy:!1,message:Mg(i)}));return}if(t==="a"||t==="A")r({...n,confirming:!0,message:null});else if(["UP","k","DOWN","j","PAGE_UP","PAGE_DOWN","HOME","END"].includes(t)){let s=Math.max(1,(e.activeTerminal.height??36)-7),i=Math.max(0,qg(n.plan,(e.activeTerminal.width??120)-4).length-s),o=t==="PAGE_UP"?-s:t==="PAGE_DOWN"?s:t==="UP"||t==="k"?-1:1;r({...n,scrollOffset:t==="HOME"?0:t==="END"?i:Math.max(0,Math.min(i,n.scrollOffset+o))})}}function Mg(e){return e instanceof Error?e.message:"Could not approve the Fury plan. Try again."}function jg(e,t){return Array.from(ZC(e)).map(r=>{let s=r.codePointAt(0);return s<32&&s!==10||s>=127&&s<=159?" ":r}).join("").split(`
|
|
263
|
-
`)
|
|
264
|
-
`)
|
|
265
|
-
`).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function Jg(e){let t=new Map;for(let n of e.split(`
|
|
266
|
-
`)
|
|
267
|
-
`),
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
244
|
+
`);default:return tC(e)}}function Jv(e){return[`${e.id}: ${e.state}`,`Definition: ${e.name} (${e.definitionHash})`,`Root task: ${e.rootTaskId}`,...e.order.map(t=>{let n=e.stepRuns[t];return`${t}: ${n.state}${n.taskId?` (${n.taskId})`:""}${n.error?` - ${n.error}`:""}`})].join(`
|
|
245
|
+
`)}function zh(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 Xv(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 Od(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function Qv(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 Zv(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 eC(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 tC(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function nC(e){return e.checks.status}function rC(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 Xh(e,t){let{data:n,warnings:r}=sC(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function sC(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Qh(e,t){let n={schemaVersion:1,command:e,ok:!1,error:{code:t.code,message:t.message,retryable:t.retryable,details:t.details}};return JSON.stringify(n)}async function $d(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=Ne(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}}import{createConnection as iC}from"node:net";async function Zh(e,t){try{if(!await wc(e,t))return;let n=iC(Ce(e).socketPath);n.on("error",()=>{});let r=setTimeout(()=>n.destroy(new Error("Capability refresh probe timed out.")),1e3);try{let s=await Nd(n,1,"ping");if(!St(s.protocolVersion))return;await Nd(n,2,"setActivityEnabled");let i=await Nd(n,3,"getActivitySnapshots");clearTimeout(r),n.destroy(),i.activities?.some(o=>o.taskId===t.taskId&&o.tabId===t.agentTabId&&o.sessionState==="running")&&await En(e,t)}finally{clearTimeout(r),n.destroy()}}catch{}}function Nd(e,t,n){return new Promise((r,s)=>{let i="",o=()=>{e.off("data",c),e.off("error",a),e.off("close",l)},a=u=>{o(),s(u)},l=()=>a(new Error("Daemon closed during capability refresh.")),c=u=>{i+=String(u);let d=i.indexOf(`
|
|
250
|
+
`);for(;d!==-1;){let p=i.slice(0,d);i=i.slice(d+1);try{let h=JSON.parse(p);if(h.id===t){o(),h.ok?r(h):s(new Error("Daemon rejected capability refresh probe."));return}}catch{a(new Error("Invalid daemon response during capability refresh."));return}d=i.indexOf(`
|
|
251
|
+
`)}};e.on("data",c),e.once("error",a),e.once("close",l),e.write(`${JSON.stringify({id:t,type:n,...n==="setActivityEnabled"?{enabled:!0}:{}})}
|
|
252
|
+
`)})}async function eg(e){let t="cli",n=pp(e.argv);try{let r=up(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||fC(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 $d({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.",{});lC(r.command,r.options.taskId);let s=dC(r.command,r.options.taskId),i=aC(s);cC(s,r.options.taskId,i);let o=i!=="none",a=await $d({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:oC(s),resolveTask:i!=="none",requireTask:i==="required"});e.env.CRAIG_TASK_ID&&e.env.CRAIG_AGENT_TAB_ID&&e.env.CRAIG_AGENT_CAPABILITY&&await Zh(a.paths,{taskId:e.env.CRAIG_TASK_ID,agentTabId:e.env.CRAIG_AGENT_TAB_ID,capabilityToken:e.env.CRAIG_AGENT_CAPABILITY});let l=uC(s,e.signal),c;try{c=await Yh(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):Od(d)}
|
|
253
|
+
`)}:{},...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?Xh(t,c):Jh(c);return u.length>0&&e.writeStdout(`${u}
|
|
254
|
+
`),0}catch(r){let s=Na(r),i=n?Qh(t,s):s.message;return e.writeStderr(`${i}
|
|
255
|
+
`),s.exitCode}}function oC(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function aC(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"||pC(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 lC(e,t){let n=tg(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 cC(e,t,n){if(!(t===void 0||n!=="none"||tg(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 tg(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 dC(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 uC(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 pC(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function fC(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{spawn as mC}from"node:child_process";import{access as hC}from"node:fs/promises";import gC from"node:path";var yC=/^\d+\.\d+\.\d+$/,Lo=75;async function ng(e,t={runCommand:W}){if(!yC.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}async function rg(e,t={runCommand:W,access:hC,spawn:mC}){let{stdout:n}=await t.runCommand("npm",["root","--global"],{cwd:e.cwd,env:e.env}),r=n.trim();if(!r)throw new Error("npm did not report its global package directory");let s=gC.join(r,"craig-cli","dist","cli.js");await t.access(s);let i=t.spawn(e.nodePath??process.execPath,[s,...e.argv],{cwd:e.cwd,env:e.env,stdio:"inherit"});return new Promise((o,a)=>{i.once("error",a),i.once("exit",l=>o(l??1))})}import{createRequire as Z0}from"node:module";import{stripVTControlCharacters as cA}from"node:util";import DK from"picocolors";var wC=[" \u2584\u2588\u2588\u2588\u2588\u2584 \u2588\u2588\u2580\u2588\u2588\u2588 \u2584\u2584\u2584 \u2588\u2588\u2593 \u2584\u2588\u2588\u2588\u2588"," \u2592\u2588\u2588\u2580 \u2580\u2588 \u2593\u2588\u2588 \u2592 \u2588\u2588\u2592\u2592\u2588\u2588\u2588\u2588\u2584 \u2593\u2588\u2588\u2592 \u2588\u2588\u2592 \u2580\u2588\u2592"," \u2592\u2593\u2588 \u2584 \u2593\u2588\u2588 \u2591\u2584\u2588 \u2592\u2592\u2588\u2588 \u2580\u2588\u2584 \u2592\u2588\u2588\u2592\u2592\u2588\u2588\u2591\u2584\u2584\u2584\u2591"," \u2592\u2593\u2593\u2584 \u2584\u2588\u2588\u2592\u2592\u2588\u2588\u2580\u2580\u2588\u2584 \u2591\u2588\u2588\u2584\u2584\u2584\u2584\u2588\u2588 \u2591\u2588\u2588\u2591\u2591\u2593\u2588 \u2588\u2588\u2593"," \u2592 \u2593\u2588\u2588\u2588\u2580 \u2591\u2591\u2588\u2588\u2593 \u2592\u2588\u2588\u2592 \u2593\u2588 \u2593\u2588\u2588\u2592\u2591\u2588\u2588\u2591\u2591\u2592\u2593\u2588\u2588\u2588\u2580\u2592"," \u2591 \u2591\u2592 \u2592 \u2591\u2591 \u2592\u2593 \u2591\u2592\u2593\u2591 \u2592\u2592 \u2593\u2592\u2588\u2591\u2591\u2593 \u2591\u2592 \u2592"," \u2591 \u2592 \u2591\u2592 \u2591 \u2592\u2591 \u2592 \u2592\u2592 \u2591 \u2592 \u2591 \u2591 \u2591"," \u2591 \u2591\u2591 \u2591 \u2591 \u2592 \u2592 \u2591\u2591 \u2591 \u2591"," \u2591 \u2591 \u2591 \u2591 \u2591 \u2591 \u2591"," \u2591"];function _d(){return[...wC]}var Mo={width:120,height:36},ee={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Ke(e,t){return{width:Math.max(e??Mo.width,Mo.width),height:Math.max(t??Mo.height,Mo.height)}}function Ds(e,t=!1){let s=ee.topRailHeight+1,i=e.height-ee.topRailHeight-1,o={row:s,height:i,column:t?2:35,width:t?e.width-2:e.width-32-34-4};return{left:t?null:{row:s,height:i,column:2,width:32},center:o,right:t?null:{row:s,height:i,column:e.width-34,width:34}}}function sg(e,t=!1){let n=Ds(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var kC=["tasks","center","inspector","actions"],ig=["agent","terminal"],og=[],K="inspection",jK=[...ig,...og],Dd=["commit","push","refresh-checks","close-task"],ag=["refresh-checks","close-task"],lg=["task","checks","pr","setup-run","actions","next-action"],Fd=["files","review"];function cg(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=IC(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:CC(e?.inputMode),focusedRegion:PC(e?.focusedRegion),selectedRepoId:Kt(e?.selectedRepoId),selectedWorkspaceId:Kt(e?.selectedWorkspaceId),selectedTaskId:Kt(e?.selectedTaskId),selectedPtyTabId:Kt(e?.selectedPtyTabId),selectedLeftItemId:DC(Kt(e?.selectedTaskId)),activeTab:n?K:Kt(e?.activeTab)??"agent",preferredPtyTabKind:vC(e?.preferredPtyTabKind),inspectorSection:Fs(e?.inspectorSection,lg,"task"),inspectionMode:SC(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:Kt(e?.selectedFileTreePath),selectedFilePath:Kt(e?.selectedFilePath),selectedDiffPath:Kt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Fs(e?.selectedActionId,Dd,"commit"),selectedProjectTargetId:null,selectedRunner:AC(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 jo(e,t){return{...e??Qs(),selectedRepoId:t.selectedRepoId,selectedWorkspaceId:t.selectedWorkspaceId,selectedTaskId:t.selectedTaskId,selectedPtyTabId:t.selectedPtyTabId,inputMode:t.inputMode,focusedRegion:t.focusedRegion,activeTab:t.activeTab,preferredPtyTabKind:t.preferredPtyTabKind,inspectorSection:t.inspectorSection,inspectionMode:t.inspectionMode,openInspectionKind:t.openInspectionKind,selectedFileTreePath:t.selectedFileTreePath,selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath,collapsedFileTreePaths:t.collapsedFileTreePaths,selectedActionId:t.selectedActionId,selectedRunner:t.selectedRunner,readAgentActivityAt:t.readAgentActivityAt}}function Un(e,t,n={}){let r=NC(e,t),s=Ld(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?_C(t.tasks,i):null,a=Ho(r),l=Go(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?Bo(t.tasks,c.id):d?Wo(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,...EC(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:RC(e,t,h?.id??null),...OC(e,t,h?.id??null),selectedDiffPath:bC(e,t,h?.id??null),inspectorSection:Fs(e.inspectorSection,lg,"task")}}function Gt(e,t){return{...e,terminal:t}}function dg(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function ug(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function Se(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
256
|
+
`}function xd(e){return e.length===1&&e>=" "&&e!=="\x7F"}function qo(e){return fg(e)||vr(e)!==null}function pg(e){return og.includes(e)}function fg(e){return ig.includes(e)}function mg(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[K]:[]]}function bC(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 Fs(e,t,n){return t.includes(e??"")?e:n}function PC(e){return e==="tabs"?"center":Fs(e,kC,"tasks")}function SC(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Fs(e,Fd,t)}function IC(e){return e==="file"||e==="diff"?e:null}function vC(e){return e==="terminal"?"terminal":"agent"}function CC(e){return e==="terminal"?"terminal":"control"}function AC(e,t=[...wt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function Uo(e,t=wt){let n=t.length>0?t:wt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function vr(e){let t=me.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function EC(e,t,n){if(!e)return{activeTab:t===K?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(fg(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??K,selectedPtyTabId:l?.id??null}}if(t===K)return{activeTab:K,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??K,selectedPtyTabId:o?.id??null}}function OC(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?$C(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function $C(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=Bn(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 Bn(e){let t=e.furyPendingPlans?.length?["fury-plans"]:[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of xs(Bo(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 xs(Wo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Bo(e,t){return hg(e,n=>n.workspaceId===t)}function Wo(e,t){return hg(e,n=>n.repoId===t)}function _C(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function hg(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function xs(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 Ld(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 Kt(e){return typeof e=="string"?e:null}function DC(e){return e?`task:${e}`:null}function Ls(e){return typeof e=="string"&&e.startsWith("task:")}function Vo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Ko(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function gg(e){return typeof e=="string"&&e.startsWith("workspace:")}function Go(e){return Vo(e)?e.slice(9):null}function Ho(e){return Ko(e)?e.slice(19):null}var FC=["Start","Options","Exit"],xC=["Resume","Options","Exit"],Tg=2,bg=2,zo=2,LC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),MC=new RegExp("\x1B\\[(?:0)?m","g"),jC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),qC=/https?:\/\/[^\s<>"']+/g,jd="\x1B[0m",Bd="\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"}},Md=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Rg(e,t={}){return Pg(e,"boot",t)}function Pg(e,t,n){let r=n.panelPolish?n.splashSummary:void 0,s=r&&(r.workspaceCount>0||r.taskCount>0);return Vd(e,{panelPolish:n.panelPolish??!1,subtitle:n.panelPolish?"A workspace for your coding agents.":t==="boot"?"crAIg is that you?":"Control mode is paused.",details:r?UC(r,n.color??!0):[],menuItems:n.panelPolish&&(s||t==="pause")?["Resume workspace","Options","Exit"]:t==="boot"?FC:xC,menuIndex:n.menuIndex??0,optionsMessage:n.optionsMessage??null,color:n.color??!0,versionText:n.versionText??null,updateText:n.updateText??null})}function UC(e,t){let n=(i,o,a=`${o}s`)=>`${i} ${i===1?o:a}`;if(e.workspaceCount===0&&e.taskCount===0)return["Your workspace starts here.","Add a repo, then start your first task."];let r=`${n(e.workspaceCount,"workspace")} \xB7 ${n(e.taskCount,"open task")}`;if(!e.activityKnown)return[`${r} \xB7 Checking agent activity\u2026`];let s=[...e.workingAgents?[`${n(e.workingAgents,"agent")} working`]:[],...e.readyAgents?[`${e.readyAgents} ready`]:[],...e.attentionAgents?[qs(`${e.attentionAgents} ${e.attentionAgents===1?"needs":"need"} attention`,t,C.pending.fg,C.overlay)]:[]];return[`${r} \xB7 ${s.join(" \xB7 ")||"No agents running"}`]}function Sg(e,t={}){return Pg(e,"pause",t)}function Ig(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 v${t.latest} installed`,menuItems:["Restart Craig",`Continue with v${t.current}`,"Exit Craig"],message:`Restart loads v${t.latest}. Continuing keeps this session on v${t.current}.`}: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
|
|
257
|
+
Runs: ${r}`};return Vd(e,{subtitle:i.subtitle,menuItems:i.menuItems,menuIndex:n.menuIndex??0,optionsMessage:i.message,color:n.color??!0})}var Yo=[" 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."],BC=["Help"],WC=5;function Xo(e,t={}){return Vd(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??BC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function vg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i=_d(),o=Math.max(1,Math.floor((e.height-i.length-2-Yo.length)/2));for(let u=0;u<i.length&&!(o+u>=e.height);u+=1)s[o+u]=B(Wg(i[u]??"",e.width),n,C.overlayLogo);let a=Math.max(...Yo.map(u=>u.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let u=0;u<Yo.length;u+=1){let d=c+u;if(d>=e.height)break;let p=Yo[u]??"";s[d]=B(ht(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
258
|
+
`)}function Cg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i="Logs",o=t.logPath??"",a=t.logLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),u=[{text:i,tone:"selected"},{text:o,tone:"muted"},mt(),...a.length>0?a.map(h=>({text:h,tone:VC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],mt(),{text:"Esc returns to Options.",tone:"muted"}],d=Ar(u,e.height-2),p=Math.max(1,Math.floor((e.height-d.length)/2));for(let h=0;h<d.length;h+=1){let f=p+h;if(f>=e.height)break;let m=d[h]??mt(),y=`${" ".repeat(c)}${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(ht(y,e.width),n,T)}return s.join(`
|
|
259
|
+
`)}function VC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function Ag(e,t,n={}){if(n.panelPolish)return KC(e,t,n);let r=n.color??!0,s=ee.leftWidth,i=ee.rightWidth,o=n.centerOnly??!1,a=e.height-ee.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:C.divider.bg,fg:"9ece6a"},u=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:C.divider,d=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:C.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=Qo(p,e.width,n,r,C.rail),f=Fg(t,s-Tg-bg,a,r),m=Wd(e,t,{color:r,centerOnly:o}),y=Mg(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let w=0;w<a;w+=1)if(!o){let G=Cr(f[w]??mt(),s,r,"left"),$t=B("\u2502",r,u),Gs=B("\u2502",r,d),Ra=Cr(y[w]??mt(),i,r,"right");R.push(`${G}${$t}`),b.push(`${Gs}${Ra}`)}let $=T||t.modalInput?C.panelBg:C.panelMuted,N=Dg(t.footerText,t.footerToast,e.width,r,$),_={row:1,column:1,width:e.width,rows:[h]},D=o?null:{row:ee.topRailHeight+1,column:1,width:s+ee.dividerWidth,rows:R},A=o?null:{row:ee.topRailHeight+1,column:m.column+m.width,width:ee.dividerWidth+i,rows:b},z={row:e.height,column:1,width:e.width,rows:[N]},Le=o?m.rows:m.rows.map((w,G)=>`${R[G]??""}${w}${b[G]??""}`);return{frame:[h,...Le,N].join(`
|
|
260
|
+
`),center:m,regions:{rail:_,left:D,center:m,right:A,footer:z}}}function Wd(e,t,n={}){if(n.panelPolish)return Og(e,t,n);let r=n.color??!0,s=_g(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=>Cr(o,s.width,r,"center"))}}function Eg(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!qo(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;if(r.panelPolish){let c=Ds(e,r.centerOnly).center;return{row:c.row,column:c.column,width:c.width,rowCount:c.height,rows:[...new Set(n)].filter(u=>u+2<c.height-1).map(u=>({index:u+2,row:Ng(Ud(t.terminal.rows[u]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=_g(e,r.centerOnly??!1),a=xg(t,o.width,i).length,l=[...new Set(n)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:u})=>({index:u,row:Cr(Ud(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function KC(e,t,n){let r=n.color??!0,s=Ds(e,n.centerOnly),i=Og(e,t,n),o=B(" ",r,C.panelBg),a=` CRAIG ${Ms("/",r,C.panelBg)} ${Ms(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[Qo(a,e.width,n,r,C.rail)]},c=null,u=null;if(s.left&&s.right){let y=t.leftTree.filter(D=>!D.panelHeader).map(D=>({...D,indent:Math.floor((D.indent??0)/2)})),T=Fg({...t,leftTree:y},s.left.width-4,s.left.height-2,r),R=t.focusedRegion==="tasks"?Wn("WORKSPACES",r,C.panelBg):Or("WORKSPACES",r,C.panelBg),b=qd(T,R,s.left,t.focusedRegion==="tasks",r,"left");c={row:s.left.row,column:1,width:s.left.width+2,rows:b.map(D=>`${o}${D}${o}`)};let $=Mg(t,s.right.width-2,s.right.height-1,r),N=Ug($[0]??{text:"Inspector"},r,C.panelBg).trim(),_=qd($.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:_.map(D=>`${o}${D}${o}`)}}let d=t.modalInput?C.panelBg:C.panelMuted,p=Dg(t.footerText,t.footerToast,e.width,r,d),h=t.modalInput?p:p.replace(/( {2,})(Tab|Enter|Esc|Ctrl\+\]|[ntxar?q+z]|↑↓\/PgUp\/PgDn)(?= )/g,(y,T,R)=>`${T}${B(R,r,C.panelSelected)}${r?Er(d):""}`),f={row:e.height,column:1,width:e.width,rows:[h]},m=i.rows.map((y,T)=>c&&u?`${c.rows[T]}${y}${u.rows[T]}`:`${o}${y}${o}`);return{frame:[l.rows[0],...m,f.rows[0]].join(`
|
|
261
|
+
`),center:i,regions:{rail:l,left:c,center:i,right:u,footer:f}}}function Og(e,t,n){let r=n.color??!0,s=Ds(e,n.centerOnly).center,i=t.tabs.find(u=>u.active)?.id??"agent",o=t.centerHeader.tabLabel==="BROWSER"||!qo(i)?t.centerTranscript.map(u=>({...u})):Lg(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=jg(t.tabs,r,t.focusedRegion==="center"),c=qd([{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 $g(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function qd(e,t,n,r,s,i,o=!1){let a=$g(r,o),l=Kd(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)}`,u=Ar(e,n.height-2).map(d=>Ng(d,n.width,r,s,i,o));return[c,...u,B(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function Ng(e,t,n,r,s,i=!1){let o=B("\u2502",r,$g(n,i)),a=s==="right"?`${Cr(e,t-3,r,s)}${B(" ",r,C.panelBg)}`:Cr(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function _g(e,t){return{row:ee.topRailHeight+1,column:t?1:ee.leftWidth+ee.dividerWidth+1,width:t?e.width:e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth*2,rowCount:e.height-ee.topRailHeight-1}}function Dg(e,t,n,r,s){let i=` ${e}`;if(!t)return B(ht(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Oe(o),l=Oe(i),c=Math.max(1,n-l-a-2),u=l+c+a+2>n?Zo(i,Math.max(0,n-a-3)):i,d=Math.max(1,n-Oe(u)-a-2),p=t.tone==="error"?lA(o,r,s):Wn(o,r,s),h=`${u}${" ".repeat(d)}${p} `;return B(ht(h,n),r,s)}function Vd(e,t){if(!t.panelPolish)return yg(e,t);let n=e.width-4,r=yg({width:n,height:e.height-4},{...t,versionText:null,updateText:null}).split(`
|
|
262
|
+
`),s={bg:C.overlay.bg,fg:C.accent.fg},i=B(" ",t.color,C.overlay),o=B("\u2502",t.color,s);return[Qo("",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(`
|
|
263
|
+
`)}function yg(e,t){let n=new Array(e.height).fill(B(" ".repeat(e.width),t.color,C.overlay)),r=_d(),s=t.menuItems.map((u,d)=>`${d===t.menuIndex?">":" "} ${u}`),i=t.optionsMessage?["",...t.optionsMessage.split(`
|
|
264
|
+
`)]:[],o=[...s,...i];for(;o.length<WC;)o.push("");let a=t.details?.length?["",...t.details]:[],l=[...r,"",t.subtitle,...a,"",...o],c=Math.max(1,Math.floor((e.height-l.length)/2));for(let u=0;u<l.length;u+=1){let d=Wg(l[u]??"",e.width);if(u<r.length){n[c+u]=B(d,t.color,C.overlayLogo);continue}if(u===r.length+1){n[c+u]=B(d,t.color,C.overlaySubtitle);continue}let p=u-(r.length+3+a.length),f=p>=0&&p<t.menuItems.length&&p===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[c+u]=B(d,t.color,f)}return n[0]=Qo("",e.width,t,t.color,C.overlay),n.join(`
|
|
265
|
+
`)}function Qo(e,t,n,r,s){let i=[n.versionText,n.updateText].filter(Boolean).join(" ");if(!i)return B(ht(e,t),r,s);let o=Kd(i,Math.max(0,t-2)),a=Math.max(0,t-Oe(o)-2),l=n.updateText?Or(o,r,s):Ms(o,r,s);return B(`${ht(e,a)} ${l} `,r,s)}function Fg(e,t,n,r){let s=zC(e.runners),i=1,o=e.leftTree.map(l=>YC(l,t,r));return[...Ar(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"||!qo(s)?e.centerTranscript.map(o=>({...o})):Lg(e);return Ar([...xg(e,t,r),...i],n)}function xg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:oA(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Wn(a,n,C.panelBg):Or(a,n,C.panelMuted)}`,c=[`${Or(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),u=jg(e.tabs,n,e.focusedRegion==="center"),d=" engaged ",p=d.length+2,h=e.inputMode==="terminal"?Wn(`${d}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Oe(u)-p)):"";return[{text:e.inputMode==="terminal"?`${u}${f}${h}`:u},{text:l,tone:"muted"},{text:c},mt()]}function Lg(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},mt(),{text:e.terminal.error},mt(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(Ud)}function Ud(e){return{text:Gd(e.segments),segments:e.segments,fullBleed:!0}}function Mg(e,t,n,r){let s=e.rightInspection?HC(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):Ar([{text:"CONTEXT"},mt(),...e.rightContext.map(i=>JC(i,r)),...e.actionMessage?[mt(),{text:e.actionMessage}]:[]],n);return Ar(s,n)}function HC(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:aA(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>wg(a)),...r.slice(o,o+s).map(a=>wg(a))]}function wg(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 YC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Wn("\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 `:"",u=e.selected?e.text:e.focused?Wn(e.text,n,C.panelBg):e.panelHeader?Or(e.text,n,C.panelMuted):e.text,d=ht(`${r}${c}${u}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=d.slice(f.length+2),y=m.trimEnd(),T=m.slice(y.length),R=[{text:f},qg(e.activity,e.activityAnimationFrame??0),{text:" "},{text:y,style:{bold:e.unread===!0}},{text:`${T}${i}${o}`},...e.prBadge??[]];return{text:Gd(R),segments:R,tone:p}}if(e.prBadge){let f=[{text:`${d}${i}${o}`},...e.prBadge];return{text:`${d}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${d}${i}${o}`,tone:p}}function zC(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 jg(e,t,n){return e.map(r=>{let s=r.active?n?Wn(r.label,t,C.panelBg):Or(r.label,t,C.panelBg):Ms(r.label,t,C.panelBg);r.unread&&(s=Jo({text:s,style:{bold:!0}},t,C.panelBg));let i=r.activity?Jo(qg(r.activity,r.activityAnimationFrame??0),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function qg(e,t){return{text:"\u25CF",style:{fg:e==="working"?Md[t%Md.length]??Md[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg}}}function JC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?Ms(e.value,t,C.panelBg):e.value}`}}function Cr(e,t,n,r,s=!1){let i=XC(r,e.tone??"default"),o=Ug(e,n,i);if(r==="left"){let l=s?1:Tg,c=s?1:bg;if(e.fullBleed)return B(ht(o,t),n,i);let u=t-l-c;if(e.rightAlign){let p=Oe(o),h=Math.max(0,u-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return B(f,n,i)}let d=`${" ".repeat(l)}${ht(o,u)}${" ".repeat(c)}`;return B(d,n,i)}return r==="center"&&e.fullBleed?QC(e,t,n,i):B(ht(` ${o}`,t),n,i)}function XC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function Ar(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(mt());return n}function mt(){return{text:""}}function Ug(e,t,n){return e.segments?e.segments.map(r=>Jo(r,t,n)).join(""):e.text}function QC(e,t,n,r){let s=" ".repeat(zo),i=Math.max(0,t-zo*2);if(!e.segments)return B(`${s}${ht(e.text,i)}${s}`,n,r);let o=tA(e.segments,i),a=`${s}${o.map(l=>Jo(l,n,r)).join("")}${s}${n?Bd:""}`;return B(a,n,r)}function Jo(e,t,n){let r=e.href?`${Bg(e.href)}${e.text}${Bd}`:ZC(e.text);return!t||!e.style?r:`${Er(sA(e.style,n))}${iA(e.style)}${r}${jd}${Er(n)}`}function ZC(e){return e.replace(qC,t=>{let[n,r]=eA(t);return`${Bg(n)}${n}${Bd}${r}`})}function eA(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Bg(e){return`\x1B]8;;${e}\x1B\\`}function tA(e,t){let n=nA(e,t);return rA(n,t)}function nA(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 rA(e,t){let n=Oe(Gd(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 sA(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 iA(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 oA(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 Wg(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 ht(e,t){let n=Oe(e);return n>=t?Kd(e,t):e+" ".repeat(t-n)}function Kd(e,t){if(t<=0)return"";if(Oe(e)<=t)return e;let n=Vg(e);return Zo(n,Math.max(0,t-1))+"\u2026"}function Oe(e){let t=0;for(let n of Array.from(Vg(e)))t+=js(n);return t}function Zo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=js(s);if(r+i>t)break;n+=s,r+=i}return n}function js(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 aA(e,t,n){return Math.min(Math.max(e,t),n)}function Vg(e){return e.replace(jC,"").replace(LC,"")}function Gd(e){return e.map(t=>t.text).join("")}function B(e,t,n){if(!t)return e;let r=Er(n),s=e.replace(MC,`${jd}${r}`);return`${r}${s}${jd}`}function Er(e){let t=[];return e.fg&&t.push(`38;2;${kg(e.fg).join(";")}`),e.bg&&t.push(`48;2;${kg(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function kg(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Wn(e,t,n){return qs(e,t,C.success.fg,n)}function lA(e,t,n){return qs(e,t,C.error.fg,n)}function Or(e,t,n){return qs(e,t,C.accent.fg,n)}function Ms(e,t,n){return qs(e,t,C.mutedfg.fg,n)}function qs(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Er(s)}${e}${Er(r)}`}async function Us(e,t){let n=k.previews.isEnabled(e.config,"agentOrchestration")?await as(e.paths):[];if(t?.aborted)return;let r=!1;if(JSON.stringify(n)!==JSON.stringify(e.model.furyPendingPlans??[])){let s=e.model.furyPendingPlans?.length??0;e.model={...e.model,furyPendingPlans:n,furyApprovalCount:Math.max(0,(e.model.furyApprovalCount??0)-s)+n.length},r=!0}if(e.state.mode==="overlay"&&e.state.variant==="fury-plans"&&e.state.furyPlans){let s=e.state.furyPlans;if(!s.plan&&!s.busy&&JSON.stringify(s.plans)!==JSON.stringify(n)){let i=s.plans[s.selectedIndex]?.id;e.state={...e.state,furyPlans:{...s,plans:n,selectedIndex:Math.max(0,n.findIndex(o=>o.id===i))}},r=!0}}r&&e.render()}function Kg(e){k.previews.isEnabled(e.config,"agentOrchestration")&&(e.state={mode:"overlay",variant:"fury-plans",menuIndex:0,optionsMessage:null,shell:e.state.shell,furyPlans:{plans:e.model.furyPendingPlans??[],selectedIndex:0,plan:null,scrollOffset:0,confirming:!1,busy:!1,message:null}},e.pendingClear=!0,e.render(),Us(e).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="fury-plans"||!e.state.furyPlans||e.state.furyPlans.plan||(e.state={...e.state,furyPlans:{...e.state.furyPlans,plans:e.model.furyPendingPlans??[]}},e.render())}).catch(t=>{e.state.mode!=="overlay"||e.state.variant!=="fury-plans"||!e.state.furyPlans||(e.state={...e.state,furyPlans:{...e.state.furyPlans,message:Hg(t)}},e.render())}))}function Gg(e,t){if(e.state.mode!=="overlay"||!e.state.furyPlans)return;let n=e.state.furyPlans;if(n.busy)return;let r=s=>{e.state.mode==="overlay"&&(e.state={...e.state,furyPlans:s},e.render())};if(t==="ESCAPE"){n.confirming?r({...n,confirming:!1}):n.plan?r({...n,plan:null,scrollOffset:0,message:null,plans:e.model.furyPendingPlans??[],selectedIndex:0}):(e.state={mode:"main",shell:Un(e.state.shell,e.model)},e.pendingClear=!0,e.render());return}if(!n.plan){t==="UP"||t==="k"?r({...n,selectedIndex:Math.max(0,n.selectedIndex-1)}):t==="DOWN"||t==="j"?r({...n,selectedIndex:Math.min(Math.max(0,n.plans.length-1),n.selectedIndex+1)}):Se(t)&&n.plans[n.selectedIndex]&&r({...n,plan:n.plans[n.selectedIndex],scrollOffset:0,message:null});return}if(n.confirming){if(!Se(t))return;let s=n.plan;r({...n,busy:!0,message:"Approving plan..."}),(async()=>{if(!(await as(e.paths)).some(o=>o.id===s.id&&o.planHash===s.planHash))throw await Us(e),new g("FURY_STATE_CONFLICT","This plan was replaced or already approved. Return to the list and review the current plan.",{});await Id(e.paths,s.id,{type:"human",source:"tui",processId:process.pid},s.planHash),await Us(e),r({...n,plans:e.model.furyPendingPlans??[],selectedIndex:0,plan:null,confirming:!1,busy:!1,scrollOffset:0,message:"Plan approved. No workers started; the planning agent can now start it."})})().catch(i=>r({...n,confirming:!1,busy:!1,message:Hg(i)}));return}if(t==="a"||t==="A")r({...n,confirming:!0,message:null});else if(["UP","k","DOWN","j","PAGE_UP","PAGE_DOWN","HOME","END"].includes(t)){let s=Math.max(1,(e.activeTerminal.height??36)-7),i=Math.max(0,zg(n.plan,(e.activeTerminal.width??120)-4).length-s),o=t==="PAGE_UP"?-s:t==="PAGE_DOWN"?s:t==="UP"||t==="k"?-1:1;r({...n,scrollOffset:t==="HOME"?0:t==="END"?i:Math.max(0,Math.min(i,n.scrollOffset+o))})}}function Hg(e){return e instanceof Error?e.message:"Could not approve the Fury plan. Try again."}function Yg(e,t){return Array.from(cA(e)).map(r=>{let s=r.codePointAt(0);return s<32&&s!==10||s>=127&&s<=159?" ":r}).join("").split(`
|
|
266
|
+
`).flatMap(r=>{let s=Array.from(r);if(!s.length)return[""];let i=[],o="",a=0;for(let l of s){let c=js(l);a+c>t&&o&&(i.push(o),o="",a=0),o+=l,a+=c}return o&&i.push(o),i})}function zg(e,t){return[e.name,`Root task: ${e.rootTaskId}`,`Definition: ${e.sourceFile}`,`Limits: ${e.limits.maxTasks} tasks | ${e.limits.maxConcurrency} concurrent | ${e.limits.timeoutMs/1e3}s timeout`,`Inputs: ${JSON.stringify(e.inputs)}`,`Plan: ${e.id}`,`Hash: ${e.planHash}`,"",...e.steps.flatMap(n=>[`${n.id} | ${n.kind==="human_review"?"HUMAN REVIEW":n.runner} | needs: ${n.needs.join(", ")||"none"}`,`Target: ${JSON.stringify(n.target)}`,...n.prompt?[`Prompt: ${n.prompt}`]:[],...n.outputSchema?[`Output: ${JSON.stringify(n.outputSchema)}`]:[],...n.review?[`Review: ${n.review.title}`,n.review.summary,`Feedback target: ${n.review.feedbackTask??"none"} | timeout: ${n.review.timeoutMs/1e3}s`]:[],""])].flatMap(n=>Yg(n,Math.max(1,t)))}function Jg(e,t){let n=Math.max(1,e.width-4),r=Math.max(1,e.height-7),s;if(t.confirming&&t.plan)s=[`Approve ${t.plan.name}?`,"",`Plan: ${t.plan.id}`,`Hash: ${t.plan.planHash}`,"","This approves the exact plan you reviewed. It does not start workers."];else if(t.plan)s=zg(t.plan,n).slice(t.scrollOffset,t.scrollOffset+r);else{let o=Math.max(0,t.selectedIndex-r+1);s=t.plans.length?t.plans.slice(o,o+r).map((a,l)=>`${t.selectedIndex===o+l?">":" "} ${a.name} | ${a.rootTaskId} | ${a.steps.length} steps`):["No Fury plans waiting for approval."]}let i=new Array(e.height).fill("");return i[0]="FURY PLANS \u2014 human approval",i[1]=t.plan&&!t.confirming?`Plan details | line ${t.scrollOffset+1} | a approve | Esc back`:"",s.slice(0,r).forEach((o,a)=>{i[a+3]=o}),i[e.height-3]=t.message??"",i[e.height-1]=t.busy?"Saving approval...":t.confirming?"Enter approve this plan Esc back":t.plan?"\u2191\u2193 / PgUp / PgDn scroll Home / End a approve plan Esc back":"\u2191\u2193 select Enter review plan Esc return",i.map(o=>{let a=` ${Yg(o,n)[0]??""}`,l=Array.from(a).reduce((c,u)=>c+js(u),0);return a+" ".repeat(Math.max(0,e.width-l))}).join(`
|
|
267
|
+
`)}import{readFile as dA,stat as uA}from"node:fs/promises";import Hd from"node:path";var pA=200*1024,fA=500*1024,ea="100000";async function Qg(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return mA(e,t,n);try{let r=mn(n.selectedFilePath??null,t.filePaths),s=mn(n.selectedDiffPath??null,t.diffPaths),i=s?await Bs(e.worktreePath):null,[o,a]=await Promise.all([na(e.worktreePath,r),s?Yd(e.worktreePath,s,t.diffRows,i):Promise.resolve($e("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 mA(e,t,n){let r=mn(n.selectedFilePath??null,t.filePaths),s=mn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([ey(e,r),(async()=>{if(!s)return $e("No diff selected","No local changes found.","empty");let l=ta(e,s),c=l?await Bs(l.target.worktreePath).catch(()=>null):null;return ty(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Zg(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return hA(e,t);try{await we(e);let n=await Bs(e.worktreePath),[r,s]=await Promise.all([ny(e.worktreePath),ry(e.worktreePath,n)]),i=[...new Set(s.map(d=>d.path))],o=mn(t.selectedFilePath??null,r),a=mn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([na(e.worktreePath,o),a?Yd(e.worktreePath,a,s,n):Promise.resolve($e("No diff selected","No local changes found.","empty"))]),u=a?{[a]:c}:{};return{taskId:e.id,fileRows:ly(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:$e("Files unavailable",r,"error"),selectedDiff:$e("Diff unavailable",r,"error"),error:r}}}async function hA(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Bs(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([ny(p.worktreePath).catch(()=>[]),ry(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:f,targetDiffRows:m}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:f}of r)s.push(...h.map(m=>`${p.repoId}/${m}`)),i.push(...f.map(m=>({...m,path:`${p.repoId}/${m.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=mn(t.selectedFilePath??null,s),l=mn(t.selectedDiffPath??null,o),[c,u]=await Promise.all([ey(e,a),(async()=>{if(!l)return $e("No diff selected","No local changes found.","empty");let p=ta(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return ty(e,l,i,h?.baseRef??null)})()]),d=l?{[l]:u}:{};return{taskId:e.id,fileRows:ly(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:d,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:u,error:null}}async function ey(e,t){let n=ta(e,t);if(!n)return $e("No file selected","No Git-visible files found.","empty");let r=await na(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function ty(e,t,n,r=null){let s=ta(e,t);return s?{...await Yd(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}:$e(t,"Repo target is unavailable.","error",t)}function ta(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 ny(e){let t=await W("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return cy(t.stdout)}async function ry(e,t){let[n,r,s,i]=await Promise.all([gA(e,t),Xg(e,"staged"),Xg(e,"unstaged"),yA(e)]);return[...n,...r,...s,...i]}async function gA(e,t){if(!t)return[];let[n,r]=await Promise.all([W("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),W("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=sy(n.stdout),i=iy(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 Xg(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([W("git",[...n,"--name-status"],{cwd:e}),W("git",[...n,"--numstat"],{cwd:e})]),i=sy(r.stdout),o=iy(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 yA(e){let t=await W("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=cy(t.stdout);return await Promise.all(n.map(async s=>{let i=await na(e,s),o=i.status==="ready"?wA(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function sy(e){return e.split(`
|
|
268
|
+
`).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 iy(e){let t=new Map;for(let n of e.split(`
|
|
269
|
+
`)){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 Bs(e){return(await Q("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await Q("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function na(e,t){if(!t)return $e("No file selected","No Git-visible files found.","empty");let n=kA(e,t);return ay(n,t)}async function oy(e){return ay(e,e)}async function ay(e,t){try{let n=await uA(e);if(n.size>pA)return $e(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await dA(e);return TA(r)?$e(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
|
|
270
|
+
`),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return $e(t,r,"missing",t,null)}}async function Yd(e,t,n,r=null){if(!t)return $e("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 Bs(e);if(a){let l=await W("git",["diff","--stat","--patch",`--unified=${ea}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
|
|
271
|
+
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await W("git",["diff","--cached","--stat","--patch",`--unified=${ea}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
|
|
272
|
+
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await W("git",["diff","--stat","--patch",`--unified=${ea}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
|
|
273
|
+
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await Q("git",["diff","--no-index","--stat","--patch",`--unified=${ea}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
|
|
271
274
|
${a.stdout.trimEnd()}`)}let o=s.join(`
|
|
272
275
|
|
|
273
|
-
`);return o.length>
|
|
274
|
-
`):["No diff for this file."],byteLength:o.length}}function
|
|
275
|
-
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function
|
|
276
|
+
`);return o.length>fA?$e(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?$e(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(`
|
|
277
|
+
`):["No diff for this file."],byteLength:o.length}}function ly(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function mn(e,t){return e&&t.includes(e)?e:t[0]??null}function wA(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function cy(e){return[...new Set(e.split(`
|
|
278
|
+
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function kA(e,t){let n=Hd.resolve(e,t),r=Hd.resolve(e);if(n!==r&&!n.startsWith(`${r}${Hd.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function TA(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function $e(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}async function $r(e,t,n){let r=Ne(e),[s,i]=await Promise.all([be.repos.listRegisteredRepos(r),be.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await st(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r)}let[u,d]=await Promise.all([k.previews.isEnabled(l,"agentOrchestration")?as(r):[],ls(r)]);c=(k.previews.isEnabled(l,"agentOrchestration")?u.length:0)+d.filter(m=>m.state==="waiting_for_review"||m.state==="changes_requested").length;let p=zd(o.tasks,t),h=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},f=p?await Zg(p,h):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:f,furyApprovalCount:c,furyPendingPlans:u,furyPlansEnabled:k.previews.isEnabled(l,"agentOrchestration"),...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function zd(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function dy(e,t){return Un(e,t)}import Jd from"node:path";function uy(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"?RA(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:bA(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function bA(e,t){let n=(e??"").split(Jd.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Jd.delimiter):[...n,t].join(Jd.delimiter)}function RA(e,t){let n=e.command.length>0?e.command:["codex"];return $o(n,e.runner??t??"codex")}function py(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 Ht(e,t=!1,n=!1){if(t){let r=sg(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth-zo*2),rows:Math.max(5,e.height-ee.topRailHeight-5)}}function fy(e){return e.length===1||Se(e)||e==="BACKSPACE"||e==="TAB"}function Yt(e){return typeof e=="string"&&new RegExp(`:(?:agent|${me.join("|")})(?:-\\d+)?$`).test(e)}function my(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 Xd(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function hy(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 Ws(e){return yy.includes(e)?"SHIFT_ENTER":null}function Qd(e){return yy.some(t=>t.startsWith(e))}function gy(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var yy=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function wy(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
276
279
|
`||n===`\r
|
|
277
|
-
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function
|
|
280
|
+
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function ky(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Ty(e,t=null){let n=t?.split(`
|
|
278
281
|
`)??[];return e.split(`
|
|
279
|
-
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function ta(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as nE,createConnection as Iy}from"node:net";import{mkdir as rE,readFile as vy,rm as Bs,writeFile as sE}from"node:fs/promises";import iE from"node:path";import{setTimeout as kA}from"node:timers/promises";var hn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=zd(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:zd(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=zd(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 zd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}var fA="\x1B[200~",mA="\x1B[201~";function py(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 fy(e,t){switch(e){case"codex":return na(t,50);case"cursor":return na(t,50);case"claude":return na(t,50);case"pi":return na(t,50);default:return hA(e)}}function na(e,t){return{paste:`${fA}${e}${mA}`,submit:"\r",submitDelayMs:t}}function hA(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import gA from"node:path";var yA={type:"system",component:"orchestration-supervisor"};async function my(e){let t=gA.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ys(t)??{version:1,commands:{}},r=await je(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of wA(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:yA),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await U(t,n)}function wA(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 ra=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new hn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()}),this.heartbeat.register({id:"orchestration.liveness",intervalMs:1e3,run:async()=>{await this.lease?.heartbeat()}})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(t={}){if(!this.lease){this.lease=await wd(this.paths);try{t.deferReconciliation||await this.reconcile(),this.heartbeat.start()}catch(n){throw await this.lease.release(),this.lease=null,n}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await Do(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await my(this.paths);let t=await je(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Or("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await Do(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){let n=t.idempotencyKey?.match(/^fury-review:([^:]+):([0-9]+)$/);if(n){let l=await rt(this.paths,n[1]),c=await te(this.paths,l.runId);if(l.state!=="changes_requested"||l.round!==Number(n[2])||["succeeded","failed","cancelled","timed_out"].includes(c.state)||Date.now()>=Math.min(Date.parse(c.deadlineAt),Date.parse(l.deadlineAt))){await ue.cancel(this.paths,t.id,{type:"system",component:"orchestration-supervisor"});return}}if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Or("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let r=await S.getTask(this.paths,t.taskId).catch(l=>{if(l instanceof g&&l.code==="TASK_NOT_FOUND")return null;throw l}),s=r?.ptyTabs.find(l=>l.id===t.agentTabId);if(!r||!s||s.kind!=="agent"||r.status==="closed"){await this.failCommand(t,Or("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let i=this.runtime.getActivitySnapshots().find(l=>l.tabId===t.agentTabId);if(i&&i.sessionState!=="running"){await this.failCommand(t,Or("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&bt(r,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;let o=this.runtime.getStartupBlocker?.(t.agentTabId,s.runner??r.runner);if(o){await this.failCommand(t,Or("PROMPT_STARTUP_BLOCKED",o,!0,!1));return}await ue.beginDelivery(this.paths,t.id);try{let l=fy(s.runner??r.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,l.paste),await kA(l.submitDelayMs),this.runtime.writeToSession(t.agentTabId,l.submit)}catch(l){await this.failCommand(t,Or("PROMPT_DELIVERY_UNCERTAIN",l instanceof Error?l.message:"Prompt delivery failed after it began.",!1,!0));return}let a=await ue.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(a)}async failCommand(t,n){let r=await ue.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!TA(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}.`)}}},TA=e=>e.idempotencyKey===`task-start:${e.taskId}`,Or=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var bA={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},$r=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...bA,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,n){let r=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,n);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:r,lastPollAt:null}),r>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,r+a)),l.intervalMs=a,r>=this.notBefore&&r>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let n=this.now();for(let r of t){let s=this.scheduledTasks.get(r);if(!s)continue;let i=s.lastPollAt===null?n:Math.max(n,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,n){let r=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,n);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:r+i,lastPollAt:r})}}recordFailure(t,n){let r=this.now(),s=n instanceof Ye,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=r+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=r+i,a.lastPollAt=r)}}getTaskIntervalMs(t,n){let r=RA(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(PA);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 RA(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 PA(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as SA}from"node:fs";var sa=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watchers=[];debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){this.running||(this.running=!0,this.baselineComplete=!1,this.watchPath(this.paths.tasksDir,()=>this.schedule(this.taskDebounceMs)),this.watchPath(this.paths.craigDir,(t,n)=>{let r=n===null?"":String(n);(r==="index.json"||r.startsWith(".index.json."))&&this.schedule(this.taskDebounceMs)}),this.schedule(0))}notifyActivity(t){if(!this.running)return;let n=ze(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1;for(let t of this.watchers.splice(0))t.close();this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}watchPath(t,n){try{let r=SA(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 IA={selectedTaskId:null,reviewVisible:!1},vA={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))))},ia=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??vA,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new $r({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new sa(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=AA(s);i.length>0&&await this.onTasksChanged(i);let o=CA(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new hn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=IA;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,hy(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)!==hy(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 CA(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=$A(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&OA.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&&EA(n)&&t.add(n.taskId);return[...t]}function EA(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var OA=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),$A=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function hy(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as BA}from"node:module";import DA from"@xterm/headless";var NA=new RegExp("^\x1B\\[(\\d*)S$"),oa=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=NA.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
|
|
280
|
-
`.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function
|
|
281
|
-
`,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},
|
|
282
|
-
`))&&this.touchActivity(n))}writeKey(t){let n=
|
|
283
|
-
`);return
|
|
284
|
-
[process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function
|
|
282
|
+
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function ra(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as pE,createConnection as Dy}from"node:net";import{mkdir as fE,readFile as Fy,rm as Vs,writeFile as mE}from"node:fs/promises";import hE from"node:path";import{setTimeout as EA}from"node:timers/promises";var hn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Zd(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:Zd(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=Zd(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 Zd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}var PA="\x1B[200~",SA="\x1B[201~";function by(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 Ry(e,t){switch(e){case"codex":return sa(t,50);case"cursor":return sa(t,50);case"claude":return sa(t,50);case"pi":return sa(t,50);default:return IA(e)}}function sa(e,t){return{paste:`${PA}${e}${SA}`,submit:"\r",submitDelayMs:t}}function IA(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import vA from"node:path";var CA={type:"system",component:"orchestration-supervisor"};async function Py(e){let t=vA.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Js(t)??{version:1,commands:{}},r=await qe(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of AA(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:CA),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await q(t,n)}function AA(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 ia=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new hn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()}),this.heartbeat.register({id:"orchestration.capabilities",intervalMs:6e4,run:()=>this.refreshCapabilities()}),this.heartbeat.register({id:"orchestration.liveness",intervalMs:1e3,run:async()=>{await this.lease?.heartbeat()}})}paths;runtime;heartbeat;lease=null;reconciliation=null;capabilityRefresh=null;async start(t={}){if(!this.lease){this.lease=await bd(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.refreshCapabilities(),await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.capabilityRefresh?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}refreshCapabilities(){return this.capabilityRefresh?this.capabilityRefresh:(this.capabilityRefresh=Promise.allSettled((this.runtime.getRunningAgentCapabilities?.()??[]).map(t=>En(this.paths,t))).then(t=>{let n=t.find(r=>r.status==="rejected");if(n?.status==="rejected")throw n.reason}).finally(()=>{this.capabilityRefresh=null}),this.capabilityRefresh)}async reconcileCommands(){await Fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await Py(this.paths);let t=await qe(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Nr("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await Fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){let n=t.idempotencyKey?.match(/^fury-review:([^:]+):([0-9]+)$/);if(n){let l=await rt(this.paths,n[1]),c=await te(this.paths,l.runId);if(l.state!=="changes_requested"||l.round!==Number(n[2])||["succeeded","failed","cancelled","timed_out"].includes(c.state)||Date.now()>=Math.min(Date.parse(c.deadlineAt),Date.parse(l.deadlineAt))){await ue.cancel(this.paths,t.id,{type:"system",component:"orchestration-supervisor"});return}}if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Nr("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let r=await S.getTask(this.paths,t.taskId).catch(l=>{if(l instanceof g&&l.code==="TASK_NOT_FOUND")return null;throw l}),s=r?.ptyTabs.find(l=>l.id===t.agentTabId);if(!r||!s||s.kind!=="agent"||r.status==="closed"){await this.failCommand(t,Nr("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let i=this.runtime.getActivitySnapshots().find(l=>l.tabId===t.agentTabId);if(i&&i.sessionState!=="running"){await this.failCommand(t,Nr("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&bt(r,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;let o=this.runtime.getStartupBlocker?.(t.agentTabId,s.runner??r.runner);if(o){await this.failCommand(t,Nr("PROMPT_STARTUP_BLOCKED",o,!0,!1));return}await ue.beginDelivery(this.paths,t.id);try{let l=Ry(s.runner??r.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,l.paste),await EA(l.submitDelayMs),this.runtime.writeToSession(t.agentTabId,l.submit)}catch(l){await this.failCommand(t,Nr("PROMPT_DELIVERY_UNCERTAIN",l instanceof Error?l.message:"Prompt delivery failed after it began.",!1,!0));return}let a=await ue.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(a)}async failCommand(t,n){let r=await ue.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!OA(t)||t.state==="queued"||t.state==="delivering")return;let n=await 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}.`)}}},OA=e=>e.idempotencyKey===`task-start:${e.taskId}`,Nr=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var $A={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},_r=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...$A,...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 ze,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=NA(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(_A);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 NA(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 _A(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as DA}from"node:fs";var oa=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=Je(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1;for(let t of this.watchers.splice(0))t.close();this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}watchPath(t,n){try{let r=DA(t,{persistent:!1},n);r.on("error",s=>{this.reportError(s)}),this.watchers.push(r)}catch(r){this.reportError(r)}}clearReadinessTimer(t){let n=this.readinessTimers.get(t);n&&clearTimeout(n),this.readinessTimers.delete(t)}schedule(t){if(this.running){if(this.reconciliation){this.dirty=!0;return}this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.requestReconciliation()},t))}}requestReconciliation(){if(!this.running||this.reconciliation){this.dirty=!0;return}this.reconciliation=this.drainReconciliations().catch(t=>this.reportError(t)).finally(()=>{this.reconciliation=null,this.running&&this.dirty&&this.requestReconciliation()})}async drainReconciliations(){do{this.dirty=!1;let t=await this.options.reconcileEvents();this.baselineComplete&&t.length>0&&await this.options.onEvents(t),this.baselineComplete=!0}while(this.running&&this.dirty)}async reportError(t){await this.options.onError(t)}};var FA={selectedTaskId:null,reviewVisible:!1},xA={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))))},aa=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??xA,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new _r({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new oa(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=MA(s);i.length>0&&await this.onTasksChanged(i);let o=LA(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new hn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=FA;running=!1;lastErrorMessage=null;start(){this.running||(this.running=!0,this.eventMonitor?.start(),this.heartbeat.start())}async stop(){this.running&&(this.running=!1,this.heartbeat.stop(),await this.eventMonitor?.stop(),await this.reconciliation?.catch(()=>{}))}setView(t){this.view=t}notifyActivity(t){this.eventMonitor?.notifyActivity(t)}notifyActivityRemoved(t){this.eventMonitor?.notifyActivityRemoved(t)}async wake(t){if(t?.length){for(let n of t)this.pendingWakeTaskIds.add(n);this.reconciliationVersion+=1}await this.reconcile()}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.drainReconciliations(),this.reconciliation)}async drainReconciliations(){try{for(;;){let t=this.reconciliationVersion,n=[...this.pendingWakeTaskIds];if(this.pendingWakeTaskIds.clear(),this.coordinator.requestImmediate(n),await this.reconcilePullRequests(),t===this.reconciliationVersion)return}}finally{this.reconciliation=null}}async reconcilePullRequests(){let t=await this.dependencies.listTasks(this.paths),n=this.view,r=this.coordinator.takeDueTasks(t,n);if(r.length===0)return;let s=new Map(r.map(o=>[o.id,Sy(o)])),i;try{i=await this.dependencies.syncTasks(this.paths,r)}catch(o){this.coordinator.recordFailure(r,o),await this.reportPersistedChangesAfterFailure(s),await this.reportError(o);return}this.coordinator.recordSuccess(i,this.view),this.lastErrorMessage=null,await this.reportChangedTasks(s,i)}async reportPersistedChangesAfterFailure(t){try{let n=await this.dependencies.listTasks(this.paths);await this.reportChangedTasks(t,n.filter(r=>t.has(r.id)))}catch(n){await this.reportError(n)}}async reportChangedTasks(t,n){let r=n.filter(s=>t.get(s.id)!==Sy(s)).map(s=>s.id);r.length>0&&await this.onTasksChanged(r)}async reportError(t){let n=t instanceof Error?t.message:String(t);n!==this.lastErrorMessage&&(this.lastErrorMessage=n,await this.onError(t))}};function LA(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"&&qA.has(i))&&t.add(n.taskId);continue}n.type==="agent.state.changed"&&r?.previousState==="working"&&(r.state==="ready"||r.state==="idle"||r.state==="error")&&t.add(n.taskId)}return[...t]}function MA(e){let t=new Set;for(let n of e)n.taskId&&jA(n)&&t.add(n.taskId);return[...t]}function jA(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var qA=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),UA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Sy(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as QA}from"node:module";import WA from"@xterm/headless";var BA=new RegExp("^\x1B\\[(\\d*)S$"),la=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=BA.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${`
|
|
283
|
+
`.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function Iy(e,t){let n=t;if(!n.hasExtendedAttrs?.())return;let r=n.extended?.urlId;if(!r)return;let s=e._core?._oscLinkService?.getLinkData(r)?.uri;if(!(!s||!/^(https?:|file:|mailto:)/i.test(s))&&![...s].some(i=>i.charCodeAt(0)<32||i.charCodeAt(0)>=127&&i.charCodeAt(0)<=159))return s}var VA=1e3,Cy=new WeakMap,KA=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Ay(e){let t=new WA.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:VA,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return Cy.set(t,new la(t)),t}function Ey(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function tu(e,t){let n=Cy.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function Oy(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=Iy(e,d);c.push({text:d.getChars()||" ",style:YA(d,o+a===i&&u===n.cursorX),...p?{href:p}:{}})}r.push({segments:GA(HA(c))})}return r}function GA(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&XA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),$y(n.style)||(s.style=n.style),t.push(s)}return t}function HA(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!$y(n.style))break;t-=1}return e.slice(0,t)}function YA(e,t){let n={},r=vy(e,"fg"),s=vy(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 vy(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"):KA[s]??zA(s)}function zA(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(JA).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 JA(e){return e===0?0:55+e*40}function XA(e,t){return eu(e)===eu(t)}function eu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function $y(e){return eu(e)===""}var ZA=QA(import.meta.url),eE=/^CTRL_([A-Z])$/,tE="\x1B[6n",nE="\x1B[c",rE="\x1B[?u",sE={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
284
|
+
`,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:""},ca=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")nu(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,Ny(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)}getRunningAgentCapabilities(){return[...this.sessions.values()].flatMap(t=>t.status==="running"&&t.capabilityToken?[{taskId:t.taskId,agentTabId:t.tabId,capabilityToken:t.capabilityToken}]:[])}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||(n.pty.write(t),(t.includes("\r")||t.includes(`
|
|
285
|
+
`))&&this.touchActivity(n))}writeKey(t){let n=iE(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&&Ny(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&&(nu(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())nu(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:oE(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(`
|
|
286
|
+
`);return by(n,i)}createSession(t,n,r,s){let i=this.spawn??lE().spawn,o=Ay(r),a=s??this.resolveSessionSpec(t,n),l=vo({...this.env,...a.env??{}}),{executable:c,args:u}=cE(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:dE(l)}),p={capabilityToken:a.env?.CRAIG_AGENT_CAPABILITY,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),uE(d,h),tu(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),tu(p.terminal,`\r
|
|
287
|
+
[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 iE(e){if(e.length===1)return e;let t=sE[e];if(t!==void 0)return t;let n=eE.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function Ny(e,t){aE(e.pty,t),Ey(e.terminal,t),e.screenDirty=!0}function oE(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=Oy(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function nu(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function aE(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function lE(){return ZA("node-pty")}function cE(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[Co(t[0],n),...t.slice(1)].map(_y).join(" ")}; exec ${_y(e)} -l`;return{executable:e,args:["-lc",s]}}function _y(e){return`'${e.replaceAll("'","'\\''")}'`}function dE(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 uE(e,t){for(let n=0;n<ru(t,tE);n+=1)e.write("\x1B[1;1R");for(let n=0;n<ru(t,nE);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<ru(t,rE);n+=1)e.write("\x1B[?0u")}function ru(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 da=Pt,gE=16,yE=250;async function xy(e){let t=Ce(e.paths);await bE(t,e.paths,e.spawnDaemon);let n=await Vy(t.socketPath),r=new su(n,e);return await r.ready(),r}async function Ly(e,t={}){let n=Ce(e);await fE(e.runtimeDir,{recursive:!0}),await Vs(n.socketPath,{force:!0});let r=new iu(e,t),s=pE(i=>r.handleConnection(i));try{await IE(s,n.socketPath),await r.start(),await mE(n.pidPath,String(process.pid),"utf8"),await pe.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${da}.`,details:{pid:process.pid,protocolVersion:da}}),await new Promise(i=>{let o=!1,a=()=>{o||(o=!0,r.closeClients(),s.close(()=>{process.removeListener("SIGTERM",a),process.removeListener("SIGINT",a),i()}))};r.onShutdown=a,process.once("SIGTERM",a),process.once("SIGINT",a)})}catch(i){throw await pe.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{r.closeClients(),s.listening&&await new Promise(i=>s.close(()=>i())),await pe.appendLogBestEffort(e,{level:"info",component:"daemon",event:"stopped",message:"PTY daemon stopped and disposed its remaining sessions.",details:{pid:process.pid,remainingSessionCount:r.sessionCount()}}),r.onShutdown=null,await Vs(n.socketPath,{force:!0}),await Vs(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function My(e){let t=Ce(e);return await Uy(t.socketPath)?(await SE(t.socketPath),!0):!1}var su=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=da;options;async ready(){let t=await this.send({type:"ping"});if(!qy(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.protocolVersion>=10&&await this.send({type:"subscribeNavigation"}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&(this.viewCache.set(n,r.view),r.view.status==="idle"&&pe.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}setOpenFileHandler(t){this.openFileHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
|
|
285
288
|
`);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
286
289
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
287
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=
|
|
290
|
+
`)}}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=TE(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)}}},iu=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 ca({...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 aa(this.paths,{...r,reconcileEvents:s,minimumIntervalMs:r.minimumIntervalMs??(t.github?.watchIntervalSeconds??5)*1e3,onTasksChanged:async i=>{this.broadcastTasksChanged(i),await r.onTasksChanged?.(i)},onError:async i=>{await pe.appendErrorLogBestEffort(this.paths,{context:"pull request sync supervisor",message:i instanceof Error?i.message:String(i)}),await r.onError?.(i)}}),this.pullRequestSyncSupervisor.start(),this.updateRuntimeActivityEnabled()}let n=(await qe(this.paths)).some(r=>r.state==="queued"||r.state==="delivering")||(await Ei(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(`
|
|
288
291
|
`);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
|
|
289
|
-
`)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}sessionCount(){return this.runtime.sessionTabIds().length}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{gn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);gn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:la,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);gn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec);return r||this.log({level:"info",component:"pty",event:"spawned",message:"PTY session spawned.",taskId:n.taskId,tabId:n.tabId}),this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,s)}case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),this.orchestrationSupervisor.wake().catch(r=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor wake",message:r instanceof Error?r.message:String(r)})),null;case"shutdown":return this.log({level:"warn",component:"daemon",event:"shutdown.requested",message:"PTY daemon shutdown was explicitly requested.",details:{liveSessionCount:this.runtime.sessionTabIds().length}}),setTimeout(()=>this.onShutdown?.(),0),null;default:return yE(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(nu),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!1}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)gn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(gn(s,{type:"openFile",path:n}),r+=1);return r}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},aE))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&gn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&gn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new ra(this.paths,this.runtime,{onError:n=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start({deferReconciliation:!0}),await pe.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){pe.appendLogBestEffort(this.paths,t)}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},oE))}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=lE(s,n),o=cE(s.view,n);s.view=n,s.rowKeys=n.rows.map(nu),(i.rows.length>0||o)&&gn(r,{type:"update",tabId:t,patch:i})}}};function lE(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==nu(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 cE(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 dE(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function nu(e){return JSON.stringify(e)}async function uE(e,t,n){if(await pE(e.socketPath,1e3))return;if(await Ny(e.socketPath)){let i=await Dy(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await pe.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.")}await fE(e,t),vo(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await Oy(e.socketPath))return;await xy(50)}let s=await vy(iE.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
|
|
290
|
-
${s.slice(-2e3)}`:""}`)}async function
|
|
292
|
+
`)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}sessionCount(){return this.runtime.sessionTabIds().length}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{gn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);gn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:da,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);gn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=n.spec.env?.CRAIG_AGENT_CAPABILITY;if(!r&&s)try{await En(this.paths,{taskId:n.taskId,agentTabId:n.tabId,capabilityToken:s})}catch{this.log({level:"warn",component:"orchestration",event:"capability.refresh.failed",message:"Could not refresh capability before launch; normal authorization still applies.",taskId:n.taskId,tabId:n.tabId})}let i=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,i)}case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),this.orchestrationSupervisor.wake().catch(r=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor wake",message:r instanceof Error?r.message:String(r)})),null;case"shutdown":return this.log({level:"warn",component:"daemon",event:"shutdown.requested",message:"PTY daemon shutdown was explicitly requested.",details:{liveSessionCount:this.runtime.sessionTabIds().length}}),setTimeout(()=>this.onShutdown?.(),0),null;default:return CE(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(ou),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!1}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)gn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(gn(s,{type:"openFile",path:n}),r+=1);return r}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},yE))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&gn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&gn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new ia(this.paths,this.runtime,{onError:n=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start({deferReconciliation:!0}),await pe.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){pe.appendLogBestEffort(this.paths,t)}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},gE))}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=wE(s,n),o=kE(s.view,n);s.view=n,s.rowKeys=n.rows.map(ou),(i.rows.length>0||o)&&gn(r,{type:"update",tabId:t,patch:i})}}};function wE(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==ou(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 kE(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 TE(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function ou(e){return JSON.stringify(e)}async function bE(e,t,n){if(await RE(e.socketPath,1e3))return;if(await Uy(e.socketPath)){let i=await By(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await pe.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.")}await PE(e,t),Ao(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await jy(e.socketPath))return;await Ky(50)}let s=await Fy(hE.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
|
|
293
|
+
${s.slice(-2e3)}`:""}`)}async function jy(e){let t=await By(e).catch(()=>null);return t?.ok===!0&&qy(t.protocolVersion)}function qy(e){return St(e)}async function RE(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await jy(e))return!0;await Ky(50)}return!1}async function PE(e,t){let n=await Fy(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&vE(r))return;await pe.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"previous_exit.unclean",message:"Found stale daemon state from a process that is no longer running.",details:{previousPid:Number.isInteger(r)?r:null}})}await Vs(e.socketPath,{force:!0}),await Vs(e.pidPath,{force:!0})}async function Uy(e){let t=await Vy(e).catch(()=>null);return t?(t.end(),!0):!1}async function SE(e){await Wy(e,{id:1,type:"shutdown"}).catch(()=>null)}async function By(e){return Wy(e,{id:1,type:"ping"})}function Wy(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)}
|
|
291
294
|
`)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
|
|
292
|
-
`);if(c===-1)return;let u=i.slice(0,c);a(),s.end();try{n(JSON.parse(u))}catch(d){r(d instanceof Error?d:new Error(String(d)))}}),s.once("close",()=>a())})}function
|
|
293
|
-
`)}catch{}}function
|
|
294
|
-
`}function kE(e){return e.length===1&&e>=" "&&e!==""}var iu=150,Yy=6;function zy(e,t,n,r){if(e.inputMode!=="terminal"&&e.focusedRegion!=="center"||e.terminal.scrolledBack||e.terminal.rows.length===0)return e;let i=t.find(a=>a.id===e.selectedTaskId)?.ptyTabs.find(a=>a.id===e.activeTab||e.activeTab==="agent"&&a.kind==="agent");if(i?.kind!=="agent")return e;let o=n.find(a=>a.tabId===i.id);return!o||ze(i.id,n,r)!=="ready"||e.readAgentActivityAt[i.id]===o.lastActivityAt?e:{...e,readAgentActivityAt:{...e.readAgentActivityAt,[i.id]:o.lastActivityAt}}}function da(e,t,n,r){return t.some(s=>e.includes(s.tabId)&&ze(s.tabId,t,n)==="ready"&&s.lastActivityAt>(r[s.tabId]??-1))}function Jy(e,t,n,r){let s=e.tasks.filter(o=>o.status!=="closed"&&o.status!=="merged"),i={workspaceCount:e.workspaces?.filter(o=>o.status==="active").length??e.repos.length,taskCount:s.length,workingAgents:0,readyAgents:0,attentionAgents:0,activityKnown:r};if(!r)return i;for(let o of s)for(let a of o.ptyTabs){if(a.kind!=="agent")continue;let l=bt(o,a.id,t,n);l==="working"&&i.workingAgents++,l==="ready"&&i.readyAgents++,l==="error"&&i.attentionAgents++}return i}import Ws from"node:path";function 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 Qy="\u{F024B} ",Zy="\u{F0DCF} ",ew="\u25CB",ou="\uEA64",tw="\uEAFE",nw="\uEBDA",au="\u25CB",lu="\u25CF",cu="\u2713",du="\u2715";function rw(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 pa="empty",he={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function aw(e,t,n){let r=RE(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=i0(t.tasks),u=IE(e,a),d=SE(e,a,u,n),p=d.find(y=>y.id===u)??d[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Fs(e.selectedLeftItemId)?`n new task ${t.furyPlansEnabled?"f Fury plans ":""}Enter attach X close task Esc pause ? help`:e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":e.selectedLeftItemId==="fury-plans"?"Enter review Fury plans f Fury plans Esc pause ? help":`n new task ${t.furyPlansEnabled?"f Fury plans ":""}Enter select Esc pause ? help`:e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":u===K?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ws.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ws.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:TE(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>o0(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:PE(u,e,s,a,e.workspaceBrowser,h,r),tabs:d,rightContext:s0(s,a),rightInspection:ME(e,a,h)}}function TE(e,t,n){let r=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];t.furyPendingPlans?.length&&r.push({text:`\u25CF ${t.furyPendingPlans.length} Fury plan${t.furyPendingPlans.length===1?"":"s"} to approve`,indent:1,status:"pending",selected:e.selectedLeftItemId==="fury-plans",focused:e.focusedRegion==="tasks"&&e.selectedLeftItemId==="fury-plans"});let s=(t.furyApprovalCount??0)-(t.furyPendingPlans?.length??0);if(s>0&&r.push({text:`\u25CF ${s} Fury approval${s===1?"":"s"} waiting`,indent:1,status:"pending"}),!t.workspaces)return bE(r,e,t.repos,t.tasks,n);let i=t.workspaces;if(i.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let a of i){let l=e.selectedLeftItemId===`workspace:${a.id}`;r.push({id:`workspace:${a.id}`,text:`${a.kind==="project"?"\u2261":"\u2013"} ${a.name??a.id}`,selected:l,focused:l&&e.focusedRegion==="tasks"});let c=a.kind==="project"?a.discoveredRepoIds??[]:[a.primaryRepoId],u=qo(t.tasks,a.id);if(u.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of _s(u)){let h=e.selectedLeftItemId===`task:${d.id}`,f=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,m={id:`task:${d.id}`,taskId:d.id,text:n?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&e.focusedRegion==="tasks",...n?{activity:sr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame,unread:da(d.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),n.snapshots,n.now,e.readAgentActivityAt)}:{}},y=cw(d);y&&(m.prBadge=y),r.push(m)}if(a.kind==="project"){let d=`new-task-workspace:${a.id}`,p=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:p,focused:p&&e.focusedRegion==="tasks",muted:!p})}if(a.kind==="repo"){let d=`new-task:${a.primaryRepoId}`,p=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:p,focused:p&&e.focusedRegion==="tasks",muted:!p})}else{r.push({text:` Repos (${c.length})`,indent:0,muted:!0});for(let d of c.slice(0,6)){let p=t.repos.find(h=>h.id===d);r.push({text:` \xB7 ${p?.name??d}`,indent:0,muted:!0})}c.length>6&&r.push({text:` \xB7 ${c.length-6} more`,indent:0,muted:!0})}}let o=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:o,focused:o&&e.focusedRegion==="tasks"}),r}function bE(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=Uo(r,o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of _s(l)){let h=t.selectedLeftItemId===`task:${d.id}`,f=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,m={id:`task:${d.id}`,taskId:d.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:sr(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame,unread:da(d.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),s.snapshots,s.now,t.readAgentActivityAt)}:{}},y=cw(d);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,u=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:u,focused:u&&t.focusedRegion==="tasks",muted:!u})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function RE(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 PE(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(d=>d.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((d,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=d.kind==="repo"?" [git repo]":"/";return`${h} ${d.name}${f}`}),u=s.query!==null?`Search: ${s.query}\u2588`:"";return gt(["Browse for a workspace to register.",s.cwd,...u?[u]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return gt(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,u=l?"Project Task":"Task";return gt([`No tasks in ${c}.`,"",`Press n or choose + New ${u} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?gt([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):gt([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===K&&t.openInspectionKind==="file"?AE(r,i,t.fileScrollOffset):e===K&&t.openInspectionKind==="diff"?EE(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?gt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):gt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function SE(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:vE(o),...o.kind==="agent"&&r&&t?{activity:bt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame,unread:da([o.id],r.snapshots,r.now,e.readAgentActivityAt)}:{}}))??[];if(!t)return[{id:pa,label:"EMPTY",active:n===pa,focused:e.focusedRegion==="center"&&n===pa}];let i=e.openInspectionKind||n===K?[{id:K,label:CE(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===K&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??K:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??K:pa}function vE(e){return e.title.toUpperCase()}function CE(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ws.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function AE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return gt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=lw(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:""},...OE(r.lines,n,s)]}function EE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return gt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=lw(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:""},...$E(r.lines,n,s)]}function gt(e){return e.map(t=>({text:t}))}function OE(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:he.lineNumber}},{text:" \u2502 ",style:{fg:he.gutter}},...uu(i,n)],tone:"default"}})}function $E(e,t,n){let r=NE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>DE(i,n))}function NE(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 DE(e,t){let n=sw(e.oldNumber),r=sw(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:he.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:he.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?FE(uu(e.text,t),i.bg,i.fallbackFg):uu(e.text,t),l=i?{fg:he.lineNumber,bg:i.bg}:{fg:he.lineNumber},c=i?{fg:he.gutter,bg:i.bg}:{fg:he.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function sw(e){return e===null?" ":String(e).padStart(4," ")}function lw(e){let t=Ws.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function uu(e,t){return t==="diff"?_E(e):t==="markdown"?xE(e):t==="json"?pu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?pu(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 _E(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:he.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:he.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:he.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:he.diffMeta}}]:[{text:e}]}function FE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function xE(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:he.markup,bold:!0}}]:pu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function pu(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:LE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function LE(e){return e.startsWith("//")||e.startsWith("/*")?{fg:he.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:he.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:he.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:he.markup}:{fg:he.keyword}}function ME(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"?dw(t.repoTargets??[]):s?.pullRequest??(t?Y(t):null),o=[jE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=fw(e,t,n),l=fu(e,n),c=HE([{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,...t0(e,n)]}:{title:"",rows:[...o,...fu(e,n)]}}function jE(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=mu(t),o=hu(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function iw(e){return[{text:" "},mu(e),{text:" "},hu(e)]}function cw(e){if(e.type==="project"&&e.repoTargets?.length){let n=dw(e.repoTargets);return n?iw(n):null}let t=Y(e);return t?.number?iw(t):null}function dw(e){let t=e.filter(s=>s.status==="ready"),n=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(n.length===0)return null;let r=UE(n);return{number:-1,status:qE(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 qE(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function UE(e){let t=e.map(n=>uw(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 mu(e){return!e||!e.number?{text:ew,style:{fg:"565f89"}}:e.status==="merged"?{text:tw,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:nw,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:ou,style:{fg:"565f89"}}:{text:ou,style:{fg:"9ece6a"}}}function hu(e){return e?.aggregateReadiness?ow(e.aggregateReadiness):ow(uw(e))}function ow(e){return e==="failed"?{text:du,style:{fg:"f7768e"}}:e==="pending"?{text:lu,style:{fg:"e0af68"}}:e==="success"?{text:cu,style:{fg:"9ece6a"}}:{text:au,style:{fg:"565f89"}}}function uw(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")?pw(e)?"failed":BE(e)?"success":"pending":"pending"}function BE(e){return!!(e.mergeable&&!e.draft&&!pw(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function pw(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function fw(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return WE(e,t,n);let r=Y(t),s=gw("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 ua=32;function WE(e,t,n){let r=[],s=gu(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=ua-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=ua-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:u,focused:d,muted:!0})}else{let h=mu(c.pullRequest),f=hu(c.pullRequest),m=`${h.text} ${f.text}`,y=ua-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=ua-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:u,focused:d,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?VE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...gw("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 gu(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)||mw(e,r).length>0)}function VE(e,t){return mw(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function mw(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=GE(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 GE(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 hw(e,t,n=null){return 3+fw(e,t,n).length+fu(e,n).length}function gw(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=YE(n.reviewDecision,n.mergeStateStatus),c=l&&l!=="review approved"?"merge blocked":n.mergeable?"merge ready":n.mergeStateStatus?`merge ${n.mergeStateStatus}`:"merge unknown";l?s.push({id:r("pr-merge"),text:`${c} \xB7 ${l}`,muted:!0,segments:[{text:c},{text:" \xB7 "},{text:l,style:{fg:zE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${yw(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(JE)):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)=>XE(d,r(`comment:${p}`))))),s}function HE(e,t){if(t.focusedRegion!=="inspector"||t.inspectionMode!=="review"||e.length===0)return e;let n=Math.max(0,Math.min(t.reviewScrollOffset,e.length-1));return e.map((r,s)=>({...r,selected:t.reviewScrollOffset===0&&r.selected||s===n,focused:t.reviewScrollOffset===0&&r.focused||s===n}))}function YE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function zE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function yw(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 JE(e){let{icon:t,color:n}=ZE(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," ")} ${e0(e.status)}`,color:n,muted:!1}}function XE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${yw(e.createdAt)}`:"",s=QE(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 QE(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 ZE(e){switch(e){case"success":return{icon:cu,color:"9ece6a"};case"pending":return{icon:lu,color:"e0af68"};case"failed":return{icon:du,color:"f7768e"};case"skipped":return{icon:au,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function e0(e){return e==="success"?"passing":e==="failed"?"failing":e}function t0(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=yu(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)?Qy:Zy:Xy(l.label),p=l.kind==="directory"?"7aa2f7":rw(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 yu(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 fu(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(n0(t))return r0(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=>ww(i,e,t))))}return n}function n0(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function r0(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=>ww(c,e,t,s.length+1))))}}return n}function ww(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 s0(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ws.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function i0(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function o0(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function kw(e,t,n,r,s=null,i=!1){if(s)return a0(e,t,n,r,s,i);let o=jd(e,t,{centerOnly:r,panelPolish:i});return l0(n,o)?{output:ta(o.rows,n.rows,o.row,o.column),region:o}:null}function a0(e,t,n,r,s,i){let o=Tg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!c0(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 l0(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function c0(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Tw(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!d0(o,a))return null;!o||!a||(s+=ta(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function d0(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 u0=["tasks","center","inspector"];function p0(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 ku(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return bu({...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 bu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return ng(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return p0(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"&&(Bo(e.selectedLeftItemId)||Wo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:jo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return bw(e,1);if(t==="SHIFT_TAB"||t==="[")return bw(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===K?yn(e,-1,n):ku(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===K?yn(e,1,n):ku(e,1,n);if(t==="PAGE_UP")return yn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return yn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return yn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return yn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??wt,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=T0(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Fs(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&ag(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 wu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Rw(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return wu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Rw(e,1)}if(Se(t)){if(e.focusedRegion==="tasks"&&(Bo(e.selectedLeftItemId)||Wo(e.selectedLeftItemId))){let r=Vo(e.selectedLeftItemId),s=Ko(e.selectedLeftItemId);return E({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Fs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Sr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&Sw(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Sr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===K)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:h0({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:K,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function yn(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"?Pw(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===K){if(e.openInspectionKind==="file")return Pw(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return g0(e,t,n)}return E({state:e})}function bw(e,t){return fa(e,"focusedRegion",u0,t)}function wu(e,t,n){let r=fa(e,"activeTab",n&&n.length>0?n:b0(e),t);return!r.changed||rg(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Sr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function ku(e,t,n){if(e.focusedRegion==="tasks")return f0(e,t,n.leftItemIds);if(e.focusedRegion==="center")return wu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Iw(e,t,n);if(n.projectTargetIds?.length){let s=Tu(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Tu(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:fa(e,"selectedActionId",Qh,t)}return fa(e,"selectedActionId",Od,t)}function f0(e,t,n){let r=Tu(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Dd(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=Vo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Ko(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function m0(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?K:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function Rw(e,t){return m0(e,k0(e.inspectionMode,$d,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=Yt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?K:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function h0(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 Pw(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Yt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function g0(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return y0(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=e.diffScrollOffset+t,a=n.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let u=Yt(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let u=Yt(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}if(t>0&&o>i){let u=a[l+1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let u=a[l-1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Yt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function y0(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Yt(e.diffScrollOffset+t,0,i),a=w0(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 w0(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function fa(e,t,n,r){let s=n.indexOf(e[t]),i=Yt(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function Tu(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Yt(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function k0(e,t,n){let r=t.indexOf(e);return t[Yt(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function Sw(e,t){return t.includes(e)}function T0(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Sr(e.activeTab)??e.preferredPtyTabKind}function b0(e){return[e.selectedPtyTabId,e.openInspectionKind?K:null].filter(t=>typeof t=="string")}function Yt(e,t,n){return Math.min(n,Math.max(t,e))}var vw=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>H(r.paths,e.selectedTaskId,i=>{let o=t??R0(i,e.activeTab,e.preferredPtyTabKind),a=Ow(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"}`}}},Cw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await H(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},Aw=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await H(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},Ew=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await H(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=Ow(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await H(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function R0(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function Ow(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,u=a;for(;l.has(u);)c+=1,u=`${a}-${c}`;let d=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:u,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:d,updatedAt:d}}var Nr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},$w=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await st(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=So();Io(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",u=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Nr(c,u)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},Nw=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},Dw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await Mr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},_w=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Mr(t.paths,n.id)))),Dr=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await pe.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var Fw=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 xw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Lw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},Mw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var P0=250;function zt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Jt(e,t){return Kt(t,e.ptyRuntime.getViewState(_r(e,t)))}function _r(e,t){let n=zt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function v(e,t){return Jt(e,ty(t,e.model))}function jw(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 qw(e,t,n){return jw(e,t,n?{tone:"success",message:n}:null)}function ce(e,t,n){return jw(e,t,{tone:"error",message:n})}function oe(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return pe.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=Lo(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function Ru(e,t){if(!e.uiStateFile){e.runtimeState={...Lo(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...Lo(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function S0(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function de(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:be,queueTaskMutation:t=>S0(e,t)}}function Pu(e,t){let n=zt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?yu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:qn(e.model),centerTabIds:ig(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:hw(t,n,s),pageRows:Math.max(5,Ve(e.activeTerminal.width,e.activeTerminal.height).height-ee.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:gu(n,s).map(a=>a.repoId)}}async function Uw(e,t){await Aw(t,de(e))}async function Ie(e){e.model=await Er(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:v(e,e.state.shell)}:e.state={...e.state,shell:v(e,e.state.shell)}}function ma(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 ha(e,t){let n=++e.inspectionRefreshSequence,r=Kd(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 Wg(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Er(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Z(e,e.state.shell),e.render())}function Bw(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)&&ha(e,n).catch(r=>{let s=oe(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},P0))}function Ww(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=yn(e.state.shell,n,Pu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render(),ha(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render()}},16)))}function Su(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Iu(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 Kw(e){Iu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function Gw(e,t){let n=v(e,t),r=zt(e.model.tasks,n),s=_r(e,n);if(!r||!s||!r.ptyTabs.some(a=>a.id===s))return n;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return Kt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Gt(Ve(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Kt({...n,inputMode:"control"},o)}function vu(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 Cu(e,t){try{let n=v(e,t),r=zt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await Vw(e,r),await Ie(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Vw(e,r),await Ie(e),s=r.selectedPtyTabId);let i=v(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Kt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Gt(Ve(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Ht(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Kt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=oe(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Ht(t.selectedPtyTabId)&&(await I0(e,t.selectedTaskId,r).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,tg(v(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function I0(e,t,n){await Nw(t,n,de(e))}async function Hw(e,t,n,r){let s=v(e,t),{nextShell:i}=await vw(s,n,r,de(e));return await Ie(e),v(e,{...s,...i})}async function Yw(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await Cw(n,de(e));return e.ptyRuntime.disposeSession(r.id),await Ie(e),v(e,{...n,...s})}async function zw(e,t){let n=v(e,t),r=qn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await Dw(n,de(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Ie(e),v(e,{...n,...o,selectedLeftItemId:v0(r,qn(e.model),s)})}async function Jw(e,t){let n=v(e,t),r=e.model.workspaces?.findIndex(a=>a.id===n.selectedWorkspaceId)??-1,{nextShell:s}=await Fw(n,de(e));await Ie(e);let i=e.model.workspaces??[],o=i[Math.min(Math.max(0,r),i.length-1)];return v(e,{...n,...s,selectedLeftItemId:o?`workspace:${o.id}`:null})}async function Vw(e,t){return Ew(t,de(e))}function ga(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:Jt(e,e.state.shell)},e.render())},16))}function Xw(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:Jt(e,e.state.shell)},e.render())}function v0(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 Zw(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Qw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await _w(s,de(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)ma(e,o);t.recordSuccess(i,Qw(e)),e.state={mode:"main",shell:v(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,Dr("background PR polling",i,de(e)))}}function Qw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function ek(e,t){let n=v(e,t),r=zt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Ie(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Ie(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${Y(a)?.requiredChecks.length??0} reported`)}return v(e,{...qw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import $0 from"node:path";import{readdir as C0,stat as A0}from"node:fs/promises";import tk from"node:path";async function E0(e){let t=await C0(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=tk.join(e,r.name);n.push({name:r.name,path:s,kind:await O0(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 nk(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function rk(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 ya(e,t){let n=await E0(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 O0(e){let t=tk.join(e,".git");return await A0(t).catch(()=>null)!==null}function sk(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function ik(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function N0(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 $w(r.repoId,r.workspaceId,n,t.selectedRunner,de(e));s=i.task,await Ie(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??ry(s,"agent"),Gt(Ve(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ht(o.selectedPtyTabId),e.state={mode:"main",shell:Kt(o,a)},Z(e,e.state.shell)}catch(i){i instanceof Nr&&(s=i.task);let o=oe(e,"create task",i,"Failed to create task.");s&&!(i instanceof Nr)?(await H(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Ie(e).catch(()=>{})):s&&(await H(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function D0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:v(e,{...n,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(Se(t)){N0(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:jo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Nd(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function _0(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=nk(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"){ya(e,$0.dirname(n.cwd)).catch(s=>{let i=oe(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||Se(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ya(e,s.path).catch(o=>{let a=oe(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=de(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Ie(e);let a=o.repos[0]??null,l=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Z(e,e.state.shell),e.render()}).catch(o=>{let a=oe(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function F0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Ky(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;x0(e,r)}}}async function x0(e,t){let n;try{n=await pe.readLog(e.paths)}catch(r){let s=oe(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function L0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Hy(sk(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"?xw(n.runner,n.enabled,de(e)):Lw(n.runner,n.path,de(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=oe(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),i),runnerOptions:{...sk(e),message:i}},e.render()})}function M0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Gy(ik(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){Ru(e,{seenPreviewIds:[...kt]});let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}Mw(n.feature,n.enabled,de(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=oe(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),s),previewOptions:{...ik(e),message:s}},e.render()})}}function wa(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||Gw(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Z(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=oe(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ce(e,v(e,e.state.shell),r)},Z(e,e.state.shell),e.render()})})}function j0(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 ok(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.updateText=`\xB7 restart for v${t}`,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=j0(n);oe(e,"update Craig",n,r),e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"error",error:r}},e.pendingClear=!0,e.render()})}function q0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let n=e.state.update.phase;if(n==="installing"||t==="ESCAPE"&&n==="success")return;if(t==="ESCAPE"){wa(e);return}let r=n==="ready"||n==="success"?2:1;if(t==="UP"||t==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(t==="DOWN"||t==="j"){e.state={...e.state,menuIndex:Math.min(r,e.state.menuIndex+1)},e.render();return}if(Se(t)){if(n==="ready"&&e.state.menuIndex===0){ok(e);return}if(n==="ready"&&e.state.menuIndex===2){Ru(e,{ignoredUpdateVersion:e.state.update.latest}),e.updateText=null,wa(e);return}if(n==="error"&&e.state.menuIndex===0){ok(e);return}if(n==="success"&&e.state.menuIndex===0){e.exit(Fo);return}if(n==="success"&&e.state.menuIndex===2){e.exit(0);return}wa(e)}}function ak(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){D0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){_0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(k.previews.isEnabled(e.config,"agentOrchestration")&&e.state.shell.fileSearchQuery===null&&(n==="f"||Se(n)&&e.state.shell.focusedRegion==="tasks"&&e.state.shell.selectedLeftItemId==="fury-plans")){xg(e);return}if(n==="F"){B0(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=bu(e.state.shell,n,Pu(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&Se(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Us(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(U0(e,n))return;e.lastTerminalKey=sy(n)?{key:n,at:Date.now()}:null;let i=iy(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){ga(e,i);return}Nd(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Ht(e.state.shell.selectedPtyTabId)&&Xw(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ya(e,e.workspaceRoot).catch(s=>{let i=oe(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Hw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Cu(e,s)}).catch(s=>{let i=oe(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Yw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){ek(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=zt(e.model.tasks,r.state),i=s?Y(s)?.url??null:null;i?rk(i).catch(o=>{let a=oe(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ce(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ce(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){zw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Jw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Cu(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Bw(e,e.state.shell);return}ha(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},Uw(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="fury-plans"){Lg(e,n);return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){F0(e,n);return}if(e.state.variant==="runners"){L0(e,n);return}if(e.state.variant==="previews"){M0(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||Se(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.variant==="update"){q0(e,n);return}if(e.state.optionsMessage){(n==="ESCAPE"||Se(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(Se(n)){if(e.state.menuIndex===0){e.state.variant==="boot"?wa(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),Kw(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 lk(e,t){let n=dy(t);if(e.state.mode!=="main"||e.state.shell.inputMode!=="terminal"||n.length===0)return;if(e.pendingTerminalKeySequence){let i=`${e.pendingTerminalKeySequence.raw}${n}`,o=Us(i);if(o){dk(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Yd(i)){e.pendingTerminalKeySequence.raw=i,ck(e);return}ka(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Z(e,e.state.shell),e.render();return}let r=oy(n);if(r!==0){ga(e,r);return}let s=Us(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
295
|
+
`);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 Vy(e){return new Promise((t,n)=>{let r=Dy(e);r.once("connect",()=>t(r)),r.once("error",n)})}function IE(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function gn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
|
|
296
|
+
`)}catch{}}function vE(e){try{return process.kill(e,0),!0}catch{return!1}}function Ky(e){return new Promise(t=>setTimeout(t,e))}function CE(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Hy=["Runners","Feature Previews","Logs","Help"],Yy=["piRunner","fileOpen","panelPolish"],zy={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function lu(e,t){return au(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 Jy(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 Xy(e=[]){let t=Yy.some(n=>!e.includes(n));return Hy.map((n,r)=>r===1&&t?`${n} \xB7 NEW`:n)}function Qy(e,t=[]){return kt.map(n=>{let r=k.previews.isEnabled(e,n),s=Yy.includes(n)&&!t.includes(n);return`${r?"[x]":"[ ]"} ${zy[n]}${s?" \xB7 NEW":""}`})}function Zy(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function ew(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Hy.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:ua(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function tw(e,t,n){if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(kt.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!ua(n))return{kind:"noop",state:e};let r=kt[e.menuIndex]??kt[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${zy[r]} ${s?"enabled":"disabled"}.`}}}function nw(e,t,n,r){if(e.pathEdit)return AE({...e,pathEdit:e.pathEdit},t,n);let s=lu(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=au(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!ua(n))return{kind:"noop",state:e};let i=au(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 au(e){return me.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function AE(e,t,n){if(n==="ESCAPE")return{kind:"render",state:Gy({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(ua(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:Gy({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return EE(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function Gy(e){let t={...e};return delete t.pathEdit,t}function ua(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
297
|
+
`}function EE(e){return e.length===1&&e>=" "&&e!==""}var cu=150,rw=6;function sw(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||Je(i.id,n,r)!=="ready"||e.readAgentActivityAt[i.id]===o.lastActivityAt?e:{...e,readAgentActivityAt:{...e.readAgentActivityAt,[i.id]:o.lastActivityAt}}}function pa(e,t,n,r){return t.some(s=>e.includes(s.tabId)&&Je(s.tabId,t,n)==="ready"&&s.lastActivityAt>(r[s.tabId]??-1))}function iw(e,t,n,r){let s=e.tasks.filter(o=>o.status!=="closed"&&o.status!=="merged"),i={workspaceCount:e.workspaces?.filter(o=>o.status==="active").length??e.repos.length,taskCount:s.length,workingAgents:0,readyAgents:0,attentionAgents:0,activityKnown:r};if(!r)return i;for(let o of s)for(let a of o.ptyTabs){if(a.kind!=="agent")continue;let l=bt(o,a.id,t,n);l==="working"&&i.workingAgents++,l==="ready"&&i.readyAgents++,l==="error"&&i.attentionAgents++}return i}import Ks from"node:path";function ow(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 aw="\u{F024B} ",lw="\u{F0DCF} ",cw="\u25CB",du="\uEA64",dw="\uEAFE",uw="\uEBDA",uu="\u25CB",pu="\u25CF",fu="\u2713",mu="\u2715";function pw(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 ma="empty",he={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function gw(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=h0(t.tasks),u=FE(e,a),d=DE(e,a,u,n),p=d.find(y=>y.id===u)??d[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ls(e.selectedLeftItemId)?`n new task ${t.furyPlansEnabled?"f Fury plans ":""}Enter attach X close task Esc pause ? help`:e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":e.selectedLeftItemId==="fury-plans"?"Enter review Fury plans f Fury plans Esc pause ? help":`n new task ${t.furyPlansEnabled?"f Fury plans ":""}Enter select Esc pause ? help`:e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":u===K?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ks.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ks.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:OE(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>g0(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:_E(u,e,s,a,e.workspaceBrowser,h,r),tabs:d,rightContext:m0(s,a),rightInspection:YE(e,a,h)}}function OE(e,t,n){let r=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];t.furyPendingPlans?.length&&r.push({text:`\u25CF ${t.furyPendingPlans.length} Fury plan${t.furyPendingPlans.length===1?"":"s"} to approve`,indent:1,status:"pending",selected:e.selectedLeftItemId==="fury-plans",focused:e.focusedRegion==="tasks"&&e.selectedLeftItemId==="fury-plans"});let s=(t.furyApprovalCount??0)-(t.furyPendingPlans?.length??0);if(s>0&&r.push({text:`\u25CF ${s} Fury approval${s===1?"":"s"} waiting`,indent:1,status:"pending"}),!t.workspaces)return $E(r,e,t.repos,t.tasks,n);let i=t.workspaces;if(i.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let a of i){let l=e.selectedLeftItemId===`workspace:${a.id}`;r.push({id:`workspace:${a.id}`,text:`${a.kind==="project"?"\u2261":"\u2013"} ${a.name??a.id}`,selected:l,focused:l&&e.focusedRegion==="tasks"});let c=a.kind==="project"?a.discoveredRepoIds??[]:[a.primaryRepoId],u=Bo(t.tasks,a.id);if(u.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of xs(u)){let h=e.selectedLeftItemId===`task:${d.id}`,f=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,m={id:`task:${d.id}`,taskId:d.id,text:n?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&e.focusedRegion==="tasks",...n?{activity:or(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame,unread:pa(d.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),n.snapshots,n.now,e.readAgentActivityAt)}:{}},y=ww(d);y&&(m.prBadge=y),r.push(m)}if(a.kind==="project"){let d=`new-task-workspace:${a.id}`,p=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:p,focused:p&&e.focusedRegion==="tasks",muted:!p})}if(a.kind==="repo"){let d=`new-task:${a.primaryRepoId}`,p=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:p,focused:p&&e.focusedRegion==="tasks",muted:!p})}else{r.push({text:` Repos (${c.length})`,indent:0,muted:!0});for(let d of c.slice(0,6)){let p=t.repos.find(h=>h.id===d);r.push({text:` \xB7 ${p?.name??d}`,indent:0,muted:!0})}c.length>6&&r.push({text:` \xB7 ${c.length-6} more`,indent:0,muted:!0})}}let o=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:o,focused:o&&e.focusedRegion==="tasks"}),r}function $E(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=Wo(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 xs(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:or(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame,unread:pa(d.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),s.snapshots,s.now,t.readAgentActivityAt)}:{}},y=ww(d);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,u=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:u,focused:u&&t.focusedRegion==="tasks",muted:!u})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function 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 _E(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(d=>d.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((d,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=d.kind==="repo"?" [git repo]":"/";return`${h} ${d.name}${f}`}),u=s.query!==null?`Search: ${s.query}\u2588`:"";return gt(["Browse for a workspace to register.",s.cwd,...u?[u]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return gt(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,u=l?"Project Task":"Task";return gt([`No tasks in ${c}.`,"",`Press n or choose + New ${u} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?gt([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):gt([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===K&&t.openInspectionKind==="file"?ME(r,i,t.fileScrollOffset):e===K&&t.openInspectionKind==="diff"?jE(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?gt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):gt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function DE(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:xE(o),...o.kind==="agent"&&r&&t?{activity:bt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame,unread:pa([o.id],r.snapshots,r.now,e.readAgentActivityAt)}:{}}))??[];if(!t)return[{id:ma,label:"EMPTY",active:n===ma,focused:e.focusedRegion==="center"&&n===ma}];let i=e.openInspectionKind||n===K?[{id:K,label:LE(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function FE(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===K&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??K:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??K:ma}function xE(e){return e.title.toUpperCase()}function LE(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ks.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function ME(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return gt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=yw(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:""},...qE(r.lines,n,s)]}function jE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return gt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=yw(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:""},...UE(r.lines,n,s)]}function gt(e){return e.map(t=>({text:t}))}function qE(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:he.lineNumber}},{text:" \u2502 ",style:{fg:he.gutter}},...hu(i,n)],tone:"default"}})}function UE(e,t,n){let r=BE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>WE(i,n))}function BE(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 WE(e,t){let n=fw(e.oldNumber),r=fw(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:he.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:he.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?KE(hu(e.text,t),i.bg,i.fallbackFg):hu(e.text,t),l=i?{fg:he.lineNumber,bg:i.bg}:{fg:he.lineNumber},c=i?{fg:he.gutter,bg:i.bg}:{fg:he.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function fw(e){return e===null?" ":String(e).padStart(4," ")}function yw(e){let t=Ks.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 hu(e,t){return t==="diff"?VE(e):t==="markdown"?GE(e):t==="json"?gu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?gu(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 VE(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:he.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:he.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:he.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:he.diffMeta}}]:[{text:e}]}function KE(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:he.markup,bold:!0}}]:gu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function gu(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:HE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function HE(e){return e.startsWith("//")||e.startsWith("/*")?{fg:he.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:he.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:he.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:he.markup}:{fg:he.keyword}}function YE(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"?kw(t.repoTargets??[]):s?.pullRequest??(t?Y(t):null),o=[zE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Rw(e,t,n),l=yu(e,n),c=r0([{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,...u0(e,n)]}:{title:"",rows:[...o,...yu(e,n)]}}function zE(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=wu(t),o=ku(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function mw(e){return[{text:" "},wu(e),{text:" "},ku(e)]}function ww(e){if(e.type==="project"&&e.repoTargets?.length){let n=kw(e.repoTargets);return n?mw(n):null}let t=Y(e);return t?.number?mw(t):null}function kw(e){let t=e.filter(s=>s.status==="ready"),n=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(n.length===0)return null;let r=XE(n);return{number:-1,status:JE(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 JE(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function XE(e){let t=e.map(n=>Tw(n));return t.some(n=>n==="failed")?"failed":t.some(n=>n==="pending")?"pending":t.length>0&&t.every(n=>n==="success")?"success":"none"}function wu(e){return!e||!e.number?{text:cw,style:{fg:"565f89"}}:e.status==="merged"?{text:dw,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:uw,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:du,style:{fg:"565f89"}}:{text:du,style:{fg:"9ece6a"}}}function ku(e){return e?.aggregateReadiness?hw(e.aggregateReadiness):hw(Tw(e))}function hw(e){return e==="failed"?{text:mu,style:{fg:"f7768e"}}:e==="pending"?{text:pu,style:{fg:"e0af68"}}:e==="success"?{text:fu,style:{fg:"9ece6a"}}:{text:uu,style:{fg:"565f89"}}}function Tw(e){let t=e?.requiredChecks??null;return e?.status==="merged"?"success":e?.status==="closed"||!e?.number||!t||t.length===0?"none":t.some(n=>n.status==="failed")||e.reviewDecision==="CHANGES_REQUESTED"?"failed":t.every(n=>n.status==="success"||n.status==="skipped")?bw(e)?"failed":QE(e)?"success":"pending":"pending"}function QE(e){return!!(e.mergeable&&!e.draft&&!bw(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function bw(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Rw(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return ZE(e,t,n);let r=Y(t),s=Iw("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 fa=32;function ZE(e,t,n){let r=[],s=Tu(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=fa-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=fa-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:u,focused:d,muted:!0})}else{let h=wu(c.pullRequest),f=ku(c.pullRequest),m=`${h.text} ${f.text}`,y=fa-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=fa-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:u,focused:d,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?e0(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...Iw("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 Tu(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||Pw(e,r).length>0)}function e0(e,t){return Pw(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function Pw(e,t){let n=t0(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function t0(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=n0(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 n0(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 Sw(e,t,n=null){return 3+Rw(e,t,n).length+yu(e,n).length}function Iw(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=s0(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:i0(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${vw(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(o0)):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)=>a0(d,r(`comment:${p}`))))),s}function r0(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 s0(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function i0(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function vw(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 o0(e){let{icon:t,color:n}=c0(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," ")} ${d0(e.status)}`,color:n,muted:!1}}function a0(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${vw(e.createdAt)}`:"",s=l0(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 l0(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 c0(e){switch(e){case"success":return{icon:fu,color:"9ece6a"};case"pending":return{icon:pu,color:"e0af68"};case"failed":return{icon:mu,color:"f7768e"};case"skipped":return{icon:uu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function d0(e){return e==="success"?"passing":e==="failed"?"failing":e}function u0(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=bu(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)?aw:lw:ow(l.label),p=l.kind==="directory"?"7aa2f7":pw(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 bu(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 yu(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(p0(t))return f0(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=>Cw(i,e,t))))}return n}function p0(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function f0(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=>Cw(c,e,t,s.length+1))))}}return n}function Cw(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 m0(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:Ks.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 h0(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function g0(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Aw(e,t,n,r,s=null,i=!1){if(s)return y0(e,t,n,r,s,i);let o=Wd(e,t,{centerOnly:r,panelPolish:i});return w0(n,o)?{output:ra(o.rows,n.rows,o.row,o.column),region:o}:null}function y0(e,t,n,r,s,i){let o=Eg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!k0(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 w0(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function k0(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(!T0(o,a))return null;!o||!a||(s+=ra(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function T0(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 b0=["tasks","center","inspector"];function R0(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 Pu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return Iu({...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 Iu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return ug(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return R0(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"&&(Vo(e.selectedLeftItemId)||Ko(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:Uo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Ow(e,1);if(t==="SHIFT_TAB"||t==="[")return Ow(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===K?yn(e,-1,n):Pu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===K?yn(e,1,n):Pu(e,1,n);if(t==="PAGE_UP")return yn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return yn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return yn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return yn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??wt,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=O0(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"&&Ls(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&gg(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&_w(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Ru(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return $w(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Ru(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return $w(e,1)}if(Se(t)){if(e.focusedRegion==="tasks"&&(Vo(e.selectedLeftItemId)||Ko(e.selectedLeftItemId))){let r=Go(e.selectedLeftItemId),s=Ho(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"&&Ls(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:vr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&_w(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:vr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===K)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:I0({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:K,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function yn(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"?Nw(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===K){if(e.openInspectionKind==="file")return Nw(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return v0(e,t,n)}return E({state:e})}function Ow(e,t){return ha(e,"focusedRegion",b0,t)}function Ru(e,t,n){let r=ha(e,"activeTab",n&&n.length>0?n:$0(e),t);return!r.changed||pg(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:vr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Pu(e,t,n){if(e.focusedRegion==="tasks")return P0(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Ru(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Dw(e,t,n);if(n.projectTargetIds?.length){let s=Su(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Su(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:ha(e,"selectedActionId",ag,t)}return ha(e,"selectedActionId",Dd,t)}function P0(e,t,n){let r=Su(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Ld(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=Go(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Ho(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function S0(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?K:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function $w(e,t){return S0(e,E0(e.inspectionMode,Fd,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=zt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?K:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function I0(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 Nw(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=zt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function v0(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return C0(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=zt(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=zt(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}if(t>0&&o>i){let u=a[l+1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let u=a[l-1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=zt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function C0(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=zt(e.diffScrollOffset+t,0,i),a=A0(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 A0(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function ha(e,t,n,r){let s=n.indexOf(e[t]),i=zt(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 Su(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=zt(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 E0(e,t,n){let r=t.indexOf(e);return t[zt(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 _w(e,t){return t.includes(e)}function O0(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":vr(e.activeTab)??e.preferredPtyTabKind}function $0(e){return[e.selectedPtyTabId,e.openInspectionKind?K:null].filter(t=>typeof t=="string")}function zt(e,t,n){return Math.min(n,Math.max(t,e))}var Fw=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>H(r.paths,e.selectedTaskId,i=>{let o=t??N0(i,e.activeTab,e.preferredPtyTabKind),a=jw(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"}`}}},xw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await H(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},Lw=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await H(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},Mw=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await H(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=jw(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await H(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function N0(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function jw(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,u=a;for(;l.has(u);)c+=1,u=`${a}-${c}`;let d=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:u,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:d,updatedAt:d}}var Dr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},qw=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await st(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=vo();Co(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",u=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Dr(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}},Uw=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},Bw=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 qr(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}`}}},Ww=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>qr(t.paths,n.id)))),Fr=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await pe.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var Vw=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 Kw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Gw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},Hw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var _0=250;function Jt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Xt(e,t){return Gt(t,e.ptyRuntime.getViewState(xr(e,t)))}function xr(e,t){let n=Jt(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 Xt(e,dy(t,e.model))}function Yw(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 zw(e,t,n){return Yw(e,t,n?{tone:"success",message:n}:null)}function ce(e,t,n){return Yw(e,t,{tone:"error",message:n})}function oe(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return pe.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=jo(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function vu(e,t){if(!e.uiStateFile){e.runtimeState={...jo(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...jo(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function D0(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function de(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:be,queueTaskMutation:t=>D0(e,t)}}function Cu(e,t){let n=Jt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?bu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Bn(e.model),centerTabIds:mg(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:Sw(t,n,s),pageRows:Math.max(5,Ke(e.activeTerminal.width,e.activeTerminal.height).height-ee.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:Tu(n,s).map(a=>a.repoId)}}async function Jw(e,t){await Lw(t,de(e))}async function Ie(e){e.model=await $r(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 ga(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 ya(e,t){let n=++e.inspectionRefreshSequence,r=zd(e.model.tasks,t),s=e.model.inspection,i=t.focusedRegion==="inspector"&&t.inspectionMode==="review"&&t.openInspectionKind!=="diff",o;if(r&&s?.taskId===r.id&&!i){let a={selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath},l=await Qg(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await $r(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Z(e,e.state.shell),e.render())}function Xw(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)&&ya(e,n).catch(r=>{let s=oe(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},_0))}function Qw(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=yn(e.state.shell,n,Cu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render(),ya(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render()}},16)))}function Au(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Eu(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 ek(e){Eu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function tk(e,t){let n=v(e,t),r=Jt(e.model.tasks,n),s=xr(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 Gt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Ht(Ke(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Gt({...n,inputMode:"control"},o)}function Ou(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 $u(e,t){try{let n=v(e,t),r=Jt(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 Zw(e,r),await Ie(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Zw(e,r),await Ie(e),s=r.selectedPtyTabId);let i=v(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Gt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Ht(Ke(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Yt(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Gt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=oe(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Yt(t.selectedPtyTabId)&&(await F0(e,t.selectedTaskId,r).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,dg(v(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function F0(e,t,n){await Uw(t,n,de(e))}async function nk(e,t,n,r){let s=v(e,t),{nextShell:i}=await Fw(s,n,r,de(e));return await Ie(e),v(e,{...s,...i})}async function rk(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await xw(n,de(e));return e.ptyRuntime.disposeSession(r.id),await Ie(e),v(e,{...n,...s})}async function sk(e,t){let n=v(e,t),r=Bn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await Bw(n,de(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Ie(e),v(e,{...n,...o,selectedLeftItemId:x0(r,Bn(e.model),s)})}async function ik(e,t){let n=v(e,t),r=e.model.workspaces?.findIndex(a=>a.id===n.selectedWorkspaceId)??-1,{nextShell:s}=await Vw(n,de(e));await Ie(e);let i=e.model.workspaces??[],o=i[Math.min(Math.max(0,r),i.length-1)];return v(e,{...n,...s,selectedLeftItemId:o?`workspace:${o.id}`:null})}async function Zw(e,t){return Mw(t,de(e))}function wa(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:Xt(e,e.state.shell)},e.render())},16))}function ok(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:Xt(e,e.state.shell)},e.render())}function x0(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 lk(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=ak(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Ww(s,de(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)ga(e,o);t.recordSuccess(i,ak(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,Fr("background PR polling",i,de(e)))}}function ak(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function ck(e,t){let n=v(e,t),r=Jt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Ie(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Ie(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${Y(a)?.requiredChecks.length??0} reported`)}return v(e,{...zw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import U0 from"node:path";import{readdir as L0,stat as M0}from"node:fs/promises";import dk from"node:path";async function j0(e){let t=await L0(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=dk.join(e,r.name);n.push({name:r.name,path:s,kind:await q0(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 uk(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function pk(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 ka(e,t){let n=await j0(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 q0(e){let t=dk.join(e,".git");return await M0(t).catch(()=>null)!==null}function fk(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function mk(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function B0(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 qw(r.repoId,r.workspaceId,n,t.selectedRunner,de(e));s=i.task,await Ie(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??py(s,"agent"),Ht(Ke(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Yt(o.selectedPtyTabId),e.state={mode:"main",shell:Gt(o,a)},Z(e,e.state.shell)}catch(i){i instanceof Dr&&(s=i.task);let o=oe(e,"create task",i,"Failed to create task.");s&&!(i instanceof Dr)?(await H(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Ie(e).catch(()=>{})):s&&(await H(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function W0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:v(e,{...n,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(Se(t)){B0(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:Uo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}xd(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function V0(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=uk(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"){ka(e,U0.dirname(n.cwd)).catch(s=>{let i=oe(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||Se(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ka(e,s.path).catch(o=>{let a=oe(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=de(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Ie(e);let a=o.repos[0]??null,l=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Z(e,e.state.shell),e.render()}).catch(o=>{let a=oe(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function K0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=ew(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 pe.readLog(e.paths)}catch(r){let s=oe(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function H0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=nw(fk(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"?Kw(n.runner,n.enabled,de(e)):Gw(n.runner,n.path,de(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=oe(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),i),runnerOptions:{...fk(e),message:i}},e.render()})}function Y0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=tw(mk(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){vu(e,{seenPreviewIds:[...kt]});let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}Hw(n.feature,n.enabled,de(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=oe(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),s),previewOptions:{...mk(e),message:s}},e.render()})}}function Ta(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||tk(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Z(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=oe(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ce(e,v(e,e.state.shell),r)},Z(e,e.state.shell),e.render()})})}function z0(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 hk(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.updateText=`\xB7 restart for v${t}`,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=z0(n);oe(e,"update Craig",n,r),e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"error",error:r}},e.pendingClear=!0,e.render()})}function J0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let n=e.state.update.phase;if(n==="installing"||t==="ESCAPE"&&n==="success")return;if(t==="ESCAPE"){Ta(e);return}let r=n==="ready"||n==="success"?2:1;if(t==="UP"||t==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(t==="DOWN"||t==="j"){e.state={...e.state,menuIndex:Math.min(r,e.state.menuIndex+1)},e.render();return}if(Se(t)){if(n==="ready"&&e.state.menuIndex===0){hk(e);return}if(n==="ready"&&e.state.menuIndex===2){vu(e,{ignoredUpdateVersion:e.state.update.latest}),e.updateText=null,Ta(e);return}if(n==="error"&&e.state.menuIndex===0){hk(e);return}if(n==="success"&&e.state.menuIndex===0){e.exit(Lo);return}if(n==="success"&&e.state.menuIndex===2){e.exit(0);return}Ta(e)}}function gk(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){W0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){V0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(k.previews.isEnabled(e.config,"agentOrchestration")&&e.state.shell.fileSearchQuery===null&&(n==="f"||Se(n)&&e.state.shell.focusedRegion==="tasks"&&e.state.shell.selectedLeftItemId==="fury-plans")){Kg(e);return}if(n==="F"){Q0(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=Iu(e.state.shell,n,Cu(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&Se(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Ws(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(X0(e,n))return;e.lastTerminalKey=fy(n)?{key:n,at:Date.now()}:null;let i=my(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){wa(e,i);return}xd(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Yt(e.state.shell.selectedPtyTabId)&&ok(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ka(e,e.workspaceRoot).catch(s=>{let i=oe(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){nk(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{$u(e,s)}).catch(s=>{let i=oe(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){rk(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){ck(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Jt(e.model.tasks,r.state),i=s?Y(s)?.url??null:null;i?pk(i).catch(o=>{let a=oe(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ce(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ce(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){sk(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){ik(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){$u(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Xw(e,e.state.shell);return}ya(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},Jw(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="fury-plans"){Gg(e,n);return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){K0(e,n);return}if(e.state.variant==="runners"){H0(e,n);return}if(e.state.variant==="previews"){Y0(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||Se(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.variant==="update"){J0(e,n);return}if(e.state.optionsMessage){(n==="ESCAPE"||Se(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(Se(n)){if(e.state.menuIndex===0){e.state.variant==="boot"?Ta(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),ek(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 yk(e,t){let n=ky(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=Ws(i);if(o){kk(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Qd(i)){e.pendingTerminalKeySequence.raw=i,wk(e);return}ba(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Z(e,e.state.shell),e.render();return}let r=hy(n);if(r!==0){wa(e,r);return}let s=Ws(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
295
298
|
`&&n!==`\r
|
|
296
|
-
`&&(e.suppressTerminalEnterOnAttach=!1),cy(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function U0(e,t){if(e.pendingTerminalKeySequence){let n=ay(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Us(r);if(s)return dk(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Yd(r))return e.pendingTerminalKeySequence.raw=r,ck(e),!0}return ka(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>ka(e),30)},!0)}function ck(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>ka(e),30))}function ka(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function dk(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function uk(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Ww(e,Hd(t));return}let n=Hd(t);n!==0&&ga(e,n)}function B0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var V0=W0(import.meta.url),K0=V0("terminal-kit"),G0=K0.terminal;function Au(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function pk(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function fk(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function H0(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 mk(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=$e(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Bn({uiStateFile:e.uiStateFile}):null,o=await Er(t,void 0,s),a=jn(eg(i,r),o);o=await Er(t,a,s);let l={current:o},c=()=>{},u=()=>{},d=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>u(f),onActivityRemoved:f=>d(f),resolveSessionSpec:(f,m)=>ny(l.current,m,t)},h=e.ptyRuntime??await Cy({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??G0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=!1,A=!1,z=new Map,Fe=h.managesPullRequestSync?null:new $r({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,G=new hn({resolutionMs:iu,onError:(P,L)=>Dr(`heartbeat job "${P}"`,L,de(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:jn(a,o)},get model(){return l.current},set model(P){l.current=P},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:P=>f(P),installUpdate:e.installUpdate??Hh},w.ptyRuntime.setActivityEnabled?.(!0);let Ot=()=>w.state.mode==="overlay"&&(w.state.variant==="boot"||w.state.variant==="pause")&&k.previews.isEnabled(w.config,"panelPolish");c=P=>{w.state.mode==="main"&&($=H0($,P),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let L=$;if($=null,w.state.mode==="main"){let re=Jt(w,w.state.shell);if(w.state={mode:"main",shell:re},!b||!T){w.render();return}let ge=Ve(m.width,m.height),ye={...b,terminal:re.terminal},Ke=kw(ge,ye,T,re.centerZoomed,L?.kind==="rows"?L.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!Ke){w.render();return}Ke.output.length>0&&m.noFormat(Ke.output),b=ye,T=Ke.region,R&&(R={...R,center:Ke.region}),y=null,m.hideCursor(!0)}},0)))},u=P=>{if(Ot()){w.render();return}let L=ze(P.tabId,[P],Date.now());w.state.mode==="main"&&Ht(P.tabId)&&(z.get(P.tabId)!==L||L==="ready")&&w.render()},d=P=>{if(Ot()){w.render();return}w.state.mode==="main"&&Ht(P)&&z.get(P)!=="idle"&&w.render()};let Vs=Promise.resolve(),Ta=P=>{Vs=Vs.then(async()=>{let L=await Promise.all([...new Set(P)].map(re=>S.getTask(w.paths,re)));for(let re of L)ma(w,re);w.state.mode==="main"?w.state={mode:"main",shell:v(w,w.state.shell)}:w.state={...w.state,shell:v(w,w.state.shell)},w.render()}).catch(L=>Dr("daemon task-state refresh",L,de(w)))};w.ptyRuntime.setTasksChangedHandler?.(Ta);let Eu=Promise.resolve(),gk=P=>{Eu=Eu.then(async()=>{let L=w.state.shell,re=w.model.tasks.find(Ks=>Ks.id===L.selectedTaskId)??null,ge=re&&w.model.inspection?.taskId===re.id?w.model.inspection:null;if(!re||!ge)throw new Error("Craig needs an active task before it can open a file from an agent session.");let ye=await Xg(P);w.model={...w.model,inspection:{...ge,filePaths:[...new Set([...ge.filePaths,P])],selectedFilePath:P,selectedFile:ye,error:null}},w.ptyRuntime.detach();let Ke=v(w,{...L,inputMode:"control",focusedRegion:"center",activeTab:K,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:P,selectedFilePath:P,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:Ke},Z(w,Ke),w.render()}).catch(L=>Dr("open file from agent",L,de(w)))};w.ptyRuntime.setOpenFileHandler?.(gk);let ba=null,Ou=P=>{let L=Ve(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Gs=`${L.width}:${L.height}:${P.shell.centerZoomed}`;ba!==Gs&&(ba=Gs,w.ptyRuntime.resize(Gt(L,!0,P.shell.centerZoomed)),P.shell=Jt(w,P.shell))}else ba=null;let re=w.ptyRuntime.getActivitySnapshots?.()??[],ge=Date.now(),ye=v(w,P.shell),Ke=zy(ye,w.model.tasks,re,ge);Ke!==ye&&(P.shell.readAgentActivityAt=Ke.readAgentActivityAt,Z(w,P.shell));let Ks=aw(Ke,w.model,{snapshots:re,now:ge,animationFrame:N});z.clear();for(let Gs of w.model.tasks)for(let Ra of Gs.ptyTabs)Ra.kind==="agent"&&z.set(Ra.id,ze(Ra.id,re,ge));let wk=kg(L,Ks,{versionText:w.versionText,updateText:w.updateText,centerOnly:P.shell.centerZoomed,panelPolish:k.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Ks,presentation:wk}},$u=(P,L,re,ge)=>{if(!R)return!1;let ye=Tw(R,L.regions,re);return ye?(ye.output.length>0&&m.noFormat(ye.output),b=P,R=ye.regions,T=ye.regions.center,y=ge?L.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;vu(w),w.ptyRuntime.setPullRequestPollView?.(fk(w.state)),w.ptyRuntime.setViewedTab?.(_r(w,w.state.shell));let{data:P,presentation:L}=Ou(w.state);return $u(P,L,["rail","left","center","footer"],!1)},w.render=()=>{vu(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(fk(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?_r(w,P.shell):null);let L=Ve(m.width,m.height),re,ge=null;if(P.mode==="main"){let ye=Ou(P);if(ge=ye.presentation,re=ge.frame,!w.pendingClear&&$u(ye.data,ge,["rail","left","center","right","footer"],!0))return;b=ye.data,T=ge.center}else re=P.variant==="boot"||P.variant==="pause"?(P.variant==="boot"?fg:hg)(L,{...k.previews.isEnabled(w.config,"panelPolish")?{splashSummary:Jy(w.model,w.ptyRuntime.getActivitySnapshots?.()??[],Date.now(),_&&w.ptyRuntime.getActivitySnapshots!==void 0)}:{},panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?zo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:By(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?zo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Au(P).menuIndex,optionsMenuItems:su(w.config,Au(P)),optionsMessage:Uy(Au(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?zo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:pk(P).menuIndex,optionsMenuItems:Wy(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:Vy(pk(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?gg(L,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?wg(L,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):P.variant==="fury-plans"&&P.furyPlans?Ug(L,P.furyPlans):yg(L),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(uy(re,y)),y=re,R=ge?.regions??null,m.hideCursor(!0)};let Nu=P=>ak(w,P),Du=P=>lk(w,P),_u=P=>uk(w,P),yk=()=>{A=!0,process.stdout.off("resize",Fu),process.off("SIGCONT",xu),m.removeListener("key",Nu),m.removeListener("unknown",Du),m.removeListener("mouse",_u),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),G.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{yk(),f(P)};let Fu=()=>{Su(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Gt(Ve(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Jt(w,w.state.shell)}),w.render()},xu=()=>{Su(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Gt(Ve(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Jt(w,w.state.shell)}),w.render()};process.stdout.on("resize",Fu),process.on("SIGCONT",xu),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",Nu),m.on("unknown",Du),m.on("mouse",_u),Fe&&G.register({id:"github.pull-requests",intervalMs:1e3,run:P=>Zw(w,Fe,P)}),G.register({id:"agent.activity-indicators",intervalMs:iu,run:()=>{let P=Date.now(),L=vi(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(L||D)&&(N=(N+1)%Yy,(w.state.mode==="main"||Ot())&&w.render()),D=L}}),G.register({id:"fury.pending-plans",intervalMs:1e3,run:P=>js(w,P)}),G.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=Iu(w).then(()=>{_=!0}).catch(()=>{}).finally(()=>{!A&&Ot()&&w.render()}),w.render()})}async function z0(){try{if(process.argv[2]==="__craig-daemon"){let e=await hk(process.argv[3]??process.cwd()),t=$e(e);return await Ay(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await hk(process.argv[3]??process.cwd()),t=$e(e);return await Ey(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
297
|
-
`),1}return
|
|
299
|
+
`&&(e.suppressTerminalEnterOnAttach=!1),wy(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function X0(e,t){if(e.pendingTerminalKeySequence){let n=gy(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Ws(r);if(s)return kk(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Qd(r))return e.pendingTerminalKeySequence.raw=r,wk(e),!0}return ba(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>ba(e),30)},!0)}function wk(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>ba(e),30))}function ba(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function kk(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Tk(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Qw(e,Xd(t));return}let n=Xd(t);n!==0&&wa(e,n)}function Q0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var eO=Z0(import.meta.url),tO=eO("terminal-kit"),nO=tO.terminal;function Nu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function bk(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Rk(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function rO(e,t){return e?e.tabId!==t.tabId?{tabId:t.tabId,kind:"full"}:e.kind==="full"||t.kind==="full"?{tabId:t.tabId,kind:"full"}:{tabId:t.tabId,kind:"rows",rowIndices:[...new Set([...e.rowIndices,...t.rowIndices])]}:t}async function Pk(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ne(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Vn({uiStateFile:e.uiStateFile}):null,o=await $r(t,void 0,s),a=Un(cg(i,r),o);o=await $r(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)=>uy(l.current,m,t)},h=e.ptyRuntime??await xy({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??nO,y=null,T=null,R=null,b=null,$=null,N=0,_=!1,D=!1,A=!1,z=new Map,Le=h.managesPullRequestSync?null:new _r({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,G=new hn({resolutionMs:cu,onError:(P,L)=>Fr(`heartbeat job "${P}"`,L,de(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Un(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??ng},w.ptyRuntime.setActivityEnabled?.(!0);let $t=()=>w.state.mode==="overlay"&&(w.state.variant==="boot"||w.state.variant==="pause")&&k.previews.isEnabled(w.config,"panelPolish");c=P=>{w.state.mode==="main"&&($=rO($,P),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let L=$;if($=null,w.state.mode==="main"){let re=Xt(w,w.state.shell);if(w.state={mode:"main",shell:re},!b||!T){w.render();return}let ge=Ke(m.width,m.height),ye={...b,terminal:re.terminal},Ge=Aw(ge,ye,T,re.centerZoomed,L?.kind==="rows"?L.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!Ge){w.render();return}Ge.output.length>0&&m.noFormat(Ge.output),b=ye,T=Ge.region,R&&(R={...R,center:Ge.region}),y=null,m.hideCursor(!0)}},0)))},u=P=>{if($t()){w.render();return}let L=Je(P.tabId,[P],Date.now());w.state.mode==="main"&&Yt(P.tabId)&&(z.get(P.tabId)!==L||L==="ready")&&w.render()},d=P=>{if($t()){w.render();return}w.state.mode==="main"&&Yt(P)&&z.get(P)!=="idle"&&w.render()};let Gs=Promise.resolve(),Ra=P=>{Gs=Gs.then(async()=>{let L=await Promise.all([...new Set(P)].map(re=>S.getTask(w.paths,re)));for(let re of L)ga(w,re);w.state.mode==="main"?w.state={mode:"main",shell:v(w,w.state.shell)}:w.state={...w.state,shell:v(w,w.state.shell)},w.render()}).catch(L=>Fr("daemon task-state refresh",L,de(w)))};w.ptyRuntime.setTasksChangedHandler?.(Ra);let _u=Promise.resolve(),Ik=P=>{_u=_u.then(async()=>{let L=w.state.shell,re=w.model.tasks.find(Hs=>Hs.id===L.selectedTaskId)??null,ge=re&&w.model.inspection?.taskId===re.id?w.model.inspection:null;if(!re||!ge)throw new Error("Craig needs an active task before it can open a file from an agent session.");let ye=await oy(P);w.model={...w.model,inspection:{...ge,filePaths:[...new Set([...ge.filePaths,P])],selectedFilePath:P,selectedFile:ye,error:null}},w.ptyRuntime.detach();let Ge=v(w,{...L,inputMode:"control",focusedRegion:"center",activeTab:K,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:P,selectedFilePath:P,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:Ge},Z(w,Ge),w.render()}).catch(L=>Fr("open file from agent",L,de(w)))};w.ptyRuntime.setOpenFileHandler?.(Ik);let Pa=null,Du=P=>{let L=Ke(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Ys=`${L.width}:${L.height}:${P.shell.centerZoomed}`;Pa!==Ys&&(Pa=Ys,w.ptyRuntime.resize(Ht(L,!0,P.shell.centerZoomed)),P.shell=Xt(w,P.shell))}else Pa=null;let re=w.ptyRuntime.getActivitySnapshots?.()??[],ge=Date.now(),ye=v(w,P.shell),Ge=sw(ye,w.model.tasks,re,ge);Ge!==ye&&(P.shell.readAgentActivityAt=Ge.readAgentActivityAt,Z(w,P.shell));let Hs=gw(Ge,w.model,{snapshots:re,now:ge,animationFrame:N});z.clear();for(let Ys of w.model.tasks)for(let Sa of Ys.ptyTabs)Sa.kind==="agent"&&z.set(Sa.id,Je(Sa.id,re,ge));let Ck=Ag(L,Hs,{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:Hs,presentation:Ck}},Fu=(P,L,re,ge)=>{if(!R)return!1;let ye=Ew(R,L.regions,re);return ye?(ye.output.length>0&&m.noFormat(ye.output),b=P,R=ye.regions,T=ye.regions.center,y=ge?L.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Ou(w),w.ptyRuntime.setPullRequestPollView?.(Rk(w.state)),w.ptyRuntime.setViewedTab?.(xr(w,w.state.shell));let{data:P,presentation:L}=Du(w.state);return Fu(P,L,["rail","left","center","footer"],!1)},w.render=()=>{Ou(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(Rk(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?xr(w,P.shell):null);let L=Ke(m.width,m.height),re,ge=null;if(P.mode==="main"){let ye=Du(P);if(ge=ye.presentation,re=ge.frame,!w.pendingClear&&Fu(ye.data,ge,["rail","left","center","right","footer"],!0))return;b=ye.data,T=ge.center}else re=P.variant==="boot"||P.variant==="pause"?(P.variant==="boot"?Rg:Sg)(L,{...k.previews.isEnabled(w.config,"panelPolish")?{splashSummary:iw(w.model,w.ptyRuntime.getActivitySnapshots?.()??[],Date.now(),D&&w.ptyRuntime.getActivitySnapshots!==void 0)}:{},panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?Xo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:Xy(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?Xo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Nu(P).menuIndex,optionsMenuItems:lu(w.config,Nu(P)),optionsMessage:Jy(Nu(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?Xo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:bk(P).menuIndex,optionsMenuItems:Qy(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:Zy(bk(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?Ig(L,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?Cg(L,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):P.variant==="fury-plans"&&P.furyPlans?Jg(L,P.furyPlans):vg(L),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Ty(re,y)),y=re,R=ge?.regions??null,m.hideCursor(!0)};let xu=P=>gk(w,P),Lu=P=>yk(w,P),Mu=P=>Tk(w,P),vk=()=>{A=!0,process.stdout.off("resize",ju),process.off("SIGCONT",qu),m.removeListener("key",xu),m.removeListener("unknown",Lu),m.removeListener("mouse",Mu),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),G.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{vk(),f(P)};let ju=()=>{Au(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Ht(Ke(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Xt(w,w.state.shell)}),w.render()},qu=()=>{Au(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Ht(Ke(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Xt(w,w.state.shell)}),w.render()};process.stdout.on("resize",ju),process.on("SIGCONT",qu),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",xu),m.on("unknown",Lu),m.on("mouse",Mu),Le&&G.register({id:"github.pull-requests",intervalMs:1e3,run:P=>lk(w,Le,P)}),G.register({id:"agent.activity-indicators",intervalMs:cu,run:()=>{let P=Date.now(),L=Ai(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(L||_)&&(N=(N+1)%rw,(w.state.mode==="main"||$t())&&w.render()),_=L}}),G.register({id:"fury.pending-plans",intervalMs:1e3,run:P=>Us(w,P)}),G.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=Eu(w).then(()=>{D=!0}).catch(()=>{}).finally(()=>{!A&&$t()&&w.render()}),w.render()})}async function iO(){try{if(process.argv[2]==="__craig-daemon"){let e=await Sk(process.argv[3]??process.cwd()),t=Ne(e);return await Ly(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Sk(process.argv[3]??process.cwd()),t=Ne(e);return await My(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
300
|
+
`),1}return eg({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:async e=>{let t=await Pk({uiStateFile:Ne(e).uiStateFile,workspaceRoot:e});if(t!==Lo)return t;try{return await rg({argv:process.argv.slice(2),cwd:process.cwd(),env:process.env})}catch(n){let r=(n instanceof Error?n.message:"Unknown restart error").replace(/\s+/g," ").trim().slice(0,200);return process.stderr.write(`Craig updated, but could not restart automatically: ${r}
|
|
298
301
|
Run \`craig\` again to use the new version.
|
|
299
|
-
`),1}}})}async function
|
|
302
|
+
`),1}}})}async function Sk(e){return sO(e)}var oO=await iO();await Promise.all([process.stdout,process.stderr].filter(e=>e.writableLength>0).map(e=>new Promise(t=>e.write("",()=>t()))));process.exit(oO);
|