craig-cli 0.13.5 → 0.14.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/README.md +7 -5
- package/dist/cli.js +147 -148
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,19 +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(Ew);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if($w(n))return{path:e.logFile,lines:[],empty:!0};throw n}},ea=async(e,t)=>Gs(e,{level:"error",component:"application",event:Ow(t.context),message:t.message,...t.details?{details:t.details}:{}}),ku=async(e,t)=>{try{await ea(e,t)}catch{}},Tu=Hs,bu=async(e,t=yu)=>Hs(e,t);function Ew(e){try{let t=JSON.parse(e);if(!t.timestamp||!t.level||!t.component||!t.event||!t.message)return e;let n=[t.taskId,t.tabId].filter(Boolean).join("/");return`[${t.timestamp}] ${t.level.toUpperCase().padEnd(5)} ${t.component}.${t.event}${n?` ${n}`:""} \u2014 ${t.message}`}catch{return e}}function Ow(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function $w(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var we={appendErrorLog:ea,appendErrorLogBestEffort:ku,appendLog:Gs,appendLogBestEffort:wu,readLog:Hs,readErrorLog:Tu,readRecentErrorLines:bu};function Cu(e){let{commandTokens:t,options:n,help:r}=Nw(e);if(r)return Su({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Or(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Iu(o,"Repo path")};break;case"repo:list":Or(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:X(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Iu(o,"Workspace path")};break;case"workspace:list":a=xw(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:X(o,"Workspace id")};break;case"task:new":a=Fw(o);break;case"task:create-child":a=Lw(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:list":a=_w(o);break;case"task:current":Or(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:X(o,"Task id")};break;case"task:pr":a=Mw(o);break;case"task:wait":a=Kw(o);break;case"agent:list":Or(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Uw(o);break;case"agent:send":a=Ww(o);break;case"command:show":a={kind:"showPromptCommand",commandId:X(o,"Command id")};break;case"command:list":Or(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:X(o,"Command id")};break;case"command:wait":a=Bw(o);break;case"events:list":a=Ru(o,!1);break;case"events:watch":a=Ru(o,!0);break;case"fury:validate":a={kind:"validateFury",file:X(o,"Fury file")};break;case"fury:plan":a=Gw(o);break;case"fury:approve":a={kind:"approveFury",planId:X(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:X(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:X(o,"Fury run id")};break;case"fury:watch":a=Hw(o);break;case"fury:cancel":a={kind:"cancelFury",runId:X(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:X(o,"Fury run id")};break;case"fury:step":a=Yw(o);break;case"fury:reviews":a=zw(o);break;case"fury:review":a=Jw(o);break;case"task:attach":a={kind:"attachTask",taskId:X(o,"Task id")};break;case"task:logs":a={kind:"streamTaskLogs",taskId:X(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:X(o,"Task id")};break;case"task:focus":a={kind:"focusTask",taskId:X(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:X(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:X(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:X(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:vu(o,0,"Task id"),repoId:vu(o,1,"Repo id")},ia(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:X(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw P(`Unsupported command: ${t.join(" ")}`)}return Su(a,n)}function Au(e){let t=e[0]==="--"?e.slice(1):e,n=!0;for(let r of t){if(r==="--"){n=!1;continue}if(n&&r==="--json")return!0}return!1}function Dw(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",attachTask:"task.attach",addTaskLink:"link.add",listTaskLinks:"link.list",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",focusTask:"task.focus",focusSelectedTask:"task.focus",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function ta(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig task new --repo <repo-id> [--runner codex|cursor|claude] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude] <prompt>"," craig task create-child --parent <task-id> --repo <repo-id> [--runner codex|cursor|claude] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task attach <id> Attach to a live task session"," craig task focus <id> Focus the tmux pane for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add a linked repo to a task"," craig link list <task-id> List linked repos for a task"].join(`
|
|
7
|
-
`)}function Nw(e){let t=[...e];t[0]==="--"&&t.shift();let n=[],r={json:!1,noInput:!1},s=new Set,i=!1,o=!0;for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--"){o=!1,n.push(l);continue}if(!o||!Pu(l)){n.push(l);continue}if(s.has(l))throw P(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||Pu(c))throw P(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=j(c,"Workspace root"):r.taskId=j(c,"Task id")}return{commandTokens:n,options:r,help:i}}function xw(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw P(`Unsupported command: workspace list ${e.join(" ")}`)}function _w(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:j(e[1],"Repo id")};throw P(`Unsupported command: task list ${e.join(" ")}`)}function Fw(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw P(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw P("Task option --repo may only be provided once.");t=j(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw P("Task option --workspace may only be provided once.");n=j(c,"Workspace id")}else{if(r!==void 0)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}}if(!t&&!n)throw P("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw P("Task creation accepts either '--repo' or '--workspace', not both.");let o=j(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Lw(e){let t,n,r,s,i=[],o=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){o=!1;continue}if(!o||!["--parent","--repo","--runner","--idempotency-key"].includes(l)){if(o&&l.startsWith("--"))throw P(`Unsupported task create-child option: ${l}`);i.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--parent"){if(t)throw P("Task option --parent may only be provided once.");t=j(c,"Parent task id")}else if(l==="--repo"){if(n)throw P("Task option --repo may only be provided once.");n=j(c,"Repo id")}else if(l==="--runner"){if(r)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}else{if(s)throw P("Task option --idempotency-key may only be provided once.");s=j(c,"Idempotency key")}}if(!n)throw P("Child task creation requires '--repo <repo-id>'.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},repoId:n,prompt:j(i.join(" "),"Child task prompt"),...r?{runner:r}:{},...s?{idempotencyKey:s}:{}}}function Mw(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw P(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw P(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw P(`task pr ${t} accepts at most one task id.`);r=j(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw P(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw P("Task PR option --repo may only be provided once.");s=j(c,"Repo id")}else{if(i!==void 0)throw P("Task PR option --pr may only be provided once.");i=j(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw P(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw P(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw P(`Unsupported command: task pr ${e.join(" ")}`)}}var na=300*1e3,jw=new Set(["idle","working","ready","error"]),qw=new Set(["queued","delivering","delivered","failed","cancelled"]);function Uw(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:j(e[1],"Agent tab id")};throw P(`Unsupported command: agent status ${e.join(" ")}`)}function Ww(e){let t,n,r="when-ready",s=na,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw P(`Unsupported agent send option: ${l}`);if(o.has(l))throw P(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw P("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw P("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:j(c,"Prompt")}:{source:"file",path:j(c,"Prompt file")}}else if(l==="--tab")n=j(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw P('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=sa(c):i=j(c,"Idempotency key")}if(!t)throw P("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Bw(e){let t=j(e[0]??"","Command id"),n,r=na,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw P(`Unsupported command wait option: ${o}`);if(s.has(o))throw P(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw P(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Vw(a):r=sa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Vw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!qw.has(n)))throw P(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Ru(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw P(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw P("--format is supported only by events watch.");if(i.has(l))throw P(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=j(c,"Event type glob");else if(l==="--after")r=j(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw P('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function Kw(e){let t,n,r,s=na,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw P(`Unsupported task wait option: ${a}`);if(t!==void 0)throw P("task wait accepts at most one task id.");t=j(a,"Task id");continue}if(i.has(a))throw P(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw P(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Xw(l):a==="--tab"?r=j(l,"Agent tab id"):s=sa(l)}if(!n)throw P("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Gw(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw P(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw P("fury plan accepts exactly one definition file.");t=j(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw P(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw P("Fury plan option --root-task may only be provided once.");n=j(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw P(`Invalid fury input "${o}". Use key=value.`);let l=j(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw P(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw P("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function Hw(e){let t=j(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw P("fury watch supports --after and --format jsonl.");if(i==="--after")n=j(o,"Event cursor");else if(o==="jsonl")r=o;else throw P("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Yw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw P("fury step requires complete or fail.");let n=ra(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=j(n.get("--run")??"","Fury run id"),s=j(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw P("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:j(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw P("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw P("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function zw(e){if(e[0]!=="list")throw P("fury reviews requires list.");let t=ra(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw P(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Jw(e){let t=e[0],n=j(e[1]??"","Fury review id");if(t==="show")return ia(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw P("Unsupported fury review action.");let r=ra(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw P(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function ra(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw P(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw P(`Option ${s} requires a value.`);n.set(s,j(i,s))}return n}function Xw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!jw.has(n)))throw P(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function sa(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw P(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw P(`Duration "${e}" is too large.`);return s}function Su(e,t){return{mode:"command",command:e,commandName:Dw(e),options:t}}function Pu(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Or(e,t){ia(e,0,t)}function ia(e,t,n){if(e.length!==t)throw P(`Command ${n} received an unexpected number of arguments.`)}function X(e,t){if(e.length!==1)throw P(`${t} is required and must be provided once.`);return j(e[0],t)}function Iu(e,t){return j(e.join(" "),t)}function vu(e,t,n){return j(e[t]??"",n)}function j(e,t){let n=e.trim();if(n.length===0)throw P(`${t} cannot be empty.`);return n}function P(e){return new h("CLI_USAGE",`${e}
|
|
2
|
+
var Jy=Object.defineProperty;var Ds=(e,t)=>{for(var n in t)Jy(e,n,{get:t[n],enumerable:!0})};import{realpath as oE}from"node:fs/promises";import we from"node:path";function ve(e){let t=we.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:we.join(t,"index.json"),reposDir:we.join(t,"repos"),workspacesDir:we.join(t,"workspaces"),runtimeDir:we.join(t,"runtime"),uiStateFile:we.join(t,"runtime","ui-state.json"),tasksDir:we.join(t,"tasks"),jobsDir:we.join(t,"jobs"),commandsDir:we.join(t,"commands"),eventsDir:we.join(t,"events"),orchestrationDir:we.join(t,"orchestration"),logsDir:we.join(t,"logs"),logFile:we.join(t,"logs","craig.jsonl"),artifactsDir:we.join(t,"artifacts"),worktreesDir:we.join(t,"worktrees"),configFile:we.join(t,"config.json")}}import Wc from"node:path";import{readFile as zP}from"node:fs/promises";import{readFile as sw}from"node:fs/promises";import{randomUUID as Xy}from"node:crypto";import{chmod as Qy,open as Zy,readFile as ew,rename as tw,rm as nw}from"node:fs/promises";import zo from"node:path";async function q(e,t,n={}){let r=zo.dirname(e),s=zo.join(r,`.${zo.basename(e)}.${process.pid}.${Date.now()}.${Xy()}.tmp`),i=await Zy(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 tw(s,e),n.mode!==void 0&&await Qy(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await nw(s,{force:!0}).catch(()=>{}),o}}async function Ns(e){try{let t=await ew(e,"utf8");return JSON.parse(t)}catch(t){if(rw(t))return null;throw t}}function rw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Mn(e){try{let t=await sw(e.uiStateFile,"utf8"),n=JSON.parse(t);return iw(n,e.uiStateFile)}catch(t){if(aw(t))return null;throw t}}async function qt(e,t){await q(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function xs(){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 iw(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")||!Fn(e,"inputMode")||!Fn(e,"focusedRegion")||!Fn(e,"activeTab")||!Fn(e,"inspectorSection")||!Fn(e,"inspectionMode")||!_s(e,"openInspectionKind")||!_s(e,"selectedFileTreePath")||!_s(e,"selectedFilePath")||!_s(e,"selectedDiffPath")||!ow(e,"collapsedFileTreePaths")||!Fn(e,"selectedActionId")||typeof e.updatedAt!="string")throw new Error(`Craig UI state at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e}function Fn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function _s(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function ow(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function aw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Jo={};Ds(Jo,{RUNNER_IDS:()=>z,assertEnabled:()=>Zu,buildCommand:()=>nd,getConfiguredProfile:()=>Ls,getDefault:()=>Qu,getDisplayName:()=>td,getEnabled:()=>Fs,getProfile:()=>jn,isRunnerType:()=>Ms,parse:()=>ed,setRunnerEnabled:()=>rd,setRunnerPath:()=>sd});var z=["codex","cursor","claude"];var Xu={codex:{id:"codex",displayName:"Codex",executable:"codex",defaultAgentTitle:"Codex"},cursor:{id:"cursor",displayName:"Cursor",executable:"cursor-agent",defaultAgentTitle:"Cursor"},claude:{id:"claude",displayName:"Claude",executable:"claude",defaultAgentTitle:"Claude"}};var jn=e=>Xu[e];var Ls=(e,t={})=>{let n=jn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Fs=(e={})=>z.filter(t=>e.runners?.[t]?.enabled!==!1);var Qu=(e={})=>{let t=Fs(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 Zu=(e,t={})=>{if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Ms=e=>z.includes(e);var ed=e=>{if(!e||e.length===0)return"codex";if(!Ms(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${z.join(", ")}.`);return e};var td=e=>jn(e).displayName;var nd=(e,t,n={})=>{let r=[Ls(e,n).executable];return t&&t.length>0&&r.push(t),r};var rd=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var sd=(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 Xo={};Ds(Xo,{PREVIEW_FEATURE_IDS:()=>ze,isEnabled:()=>id,setEnabled:()=>od});var ze=["agentActivityIndicators","agentOrchestration"];function id(e,t){return e.previews?.[t]===!0}function od(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as lw,readFile as cw,writeFile as uw}from"node:fs/promises";import dw from"node:path";var pw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",ad=async e=>{try{return await cw(e,"utf8")}catch(t){if(pw(t))return null;throw t}},ld=async(e,t)=>{await lw(dw.dirname(e),{recursive:!0}),await uw(e,t,"utf8")};var js=(e,t)=>{if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!z.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${z.join(", ")}.`);if(typeof s!="object"||s===null||Array.isArray(s))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" must be an object.`);let i=s;if(i.enabled!==void 0&&typeof i.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${r}.enabled" must be a boolean.`);if(i.path!==void 0&&(typeof i.path!="string"||i.path.trim().length===0))throw new Error(`Craig config at ${t} is invalid. "runners.${r}.path" must be a non-empty string.`)}}if(n.checks!==void 0&&(typeof n.checks!="object"||n.checks===null||!Array.isArray(n.checks.commands)||!n.checks.commands.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "checks.commands" must be an array of strings.`);if(n.open!==void 0&&(typeof n.open!="object"||n.open===null||!Array.isArray(n.open.command)||!n.open.command.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "open.command" must be an array of strings.`);if(n.github!==void 0){if(typeof n.github!="object"||n.github===null)throw new Error(`Craig config at ${t} is invalid. "github" must be an object.`);if(n.github.mergeMethod!==void 0&&n.github.mergeMethod!=="merge"&&n.github.mergeMethod!=="rebase"&&n.github.mergeMethod!=="squash")throw new Error(`Craig config at ${t} is invalid. "github.mergeMethod" must be "merge", "rebase", or "squash".`);if(n.github.watchIntervalSeconds!==void 0&&(!Number.isInteger(n.github.watchIntervalSeconds)||n.github.watchIntervalSeconds<=0))throw new Error(`Craig config at ${t} is invalid. "github.watchIntervalSeconds" must be a positive integer.`)}if(n.previews!==void 0){if(typeof n.previews!="object"||n.previews===null||Array.isArray(n.previews))throw new Error(`Craig config at ${t} is invalid. "previews" must be an object.`);for(let[r,s]of Object.entries(n.previews)){if(r!=="incrementalCenterPane"&&!ze.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${ze.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var Qo=async(e,t={readConfigFile:ad})=>{let n=await t.readConfigFile(e.configFile);if(!n)return{};if(n.trimStart()[0]!=="{")throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`);let r;try{r=JSON.parse(n)}catch{throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`)}return js(r,e.configFile)};var Zo=async(e,t,n={writeConfigFile:ld})=>{js(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`)};var ea={};Ds(ea,{checkForUpdate:()=>cd,getCurrent:()=>qs});var qs=()=>{try{return"0.14.1"}catch{return"unknown"}};var fw="https://registry.npmjs.org/craig-cli/latest",mw=3600*1e3,hw={value:null},gw=(e,t)=>{let n=c=>c.split(".").map(Number),[r=0,s=0,i=0]=n(e),[o=0,a=0,l=0]=n(t);return r!==o?r>o:s!==a?s>a:i>l},cd=async(e={fetch:globalThis.fetch,getCurrent:qs,cache:hw})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<mw)return e.cache.value.result;let r=null;try{let i=await e.fetch(fw,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&gw(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:Qo,save:Zo,previews:Xo,runners:Jo,version:ea};var ud={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=ud[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function ta(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as yw,mkdir as ww,readFile as kw}from"node:fs/promises";import Tw from"node:path";var dd=80,Us=async(e,t)=>{await ww(Tw.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await yw(e.logFile,`${JSON.stringify(n)}
|
|
5
|
+
`,"utf8")},pd=async(e,t)=>{try{await Us(e,t)}catch{}},Ws=async(e,t=dd)=>{try{let s=(await kw(e.logFile,"utf8")).trimEnd().split(`
|
|
6
|
+
`).filter(i=>i.length>0).map(bw);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Sw(n))return{path:e.logFile,lines:[],empty:!0};throw n}},na=async(e,t)=>Us(e,{level:"error",component:"application",event:Rw(t.context),message:t.message,...t.details?{details:t.details}:{}}),fd=async(e,t)=>{try{await na(e,t)}catch{}},md=Ws,hd=async(e,t=dd)=>Ws(e,t);function bw(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 Rw(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Sw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var de={appendErrorLog:na,appendErrorLogBestEffort:fd,appendLog:Us,appendLogBestEffort:pd,readLog:Ws,readErrorLog:md,readRecentErrorLines:hd};function bd(e){let{commandTokens:t,options:n,help:r}=Iw(e);if(r)return yd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Pr(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:kd(o,"Repo path")};break;case"repo:list":Pr(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:ee(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:kd(o,"Workspace path")};break;case"workspace:list":a=vw(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:ee(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:ee(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:ee(o,"Workspace id")};break;case"task:new":a=Aw(o);break;case"task:create-child":a=Ew(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:ee(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:ee(o,"Task id")}};break;case"task:list":a=Cw(o);break;case"task:current":Pr(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:ee(o,"Task id")};break;case"task:pr":a=Ow(o);break;case"task:wait":a=Fw(o);break;case"agent:list":Pr(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Nw(o);break;case"agent:send":a=_w(o);break;case"command:show":a={kind:"showPromptCommand",commandId:ee(o,"Command id")};break;case"command:list":Pr(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:ee(o,"Command id")};break;case"command:wait":a=xw(o);break;case"events:list":a=gd(o,!1);break;case"events:watch":a=gd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:ee(o,"Fury file")};break;case"fury:plan":a=Mw(o);break;case"fury:approve":a={kind:"approveFury",planId:ee(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:ee(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:ee(o,"Fury run id")};break;case"fury:watch":a=jw(o);break;case"fury:cancel":a={kind:"cancelFury",runId:ee(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:ee(o,"Fury run id")};break;case"fury:step":a=qw(o);break;case"fury:reviews":a=Uw(o);break;case"fury:review":a=Ww(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:ee(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:ee(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:ee(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:ee(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:ee(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Td(o,0,"Task id"),repoId:Td(o,1,"Repo id")},aa(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:ee(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw P(`Unsupported command: ${t.join(" ")}`)}return yd(a,n)}function Rd(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 Pw(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.add",listTaskLinks:"link.list",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 ra(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig task new --repo <repo-id> [--runner codex|cursor|claude] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add a linked repo to a task"," craig link list <task-id> List linked repos for a task"].join(`
|
|
7
|
+
`)}function Iw(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||!wd(l)){n.push(l);continue}if(s.has(l))throw P(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||wd(c))throw P(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=L(c,"Workspace root"):r.taskId=L(c,"Task id")}return{commandTokens:n,options:r,help:i}}function vw(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw P(`Unsupported command: workspace list ${e.join(" ")}`)}function Cw(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:L(e[1],"Repo id")};throw P(`Unsupported command: task list ${e.join(" ")}`)}function Aw(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw P(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw P("Task option --repo may only be provided once.");t=L(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw P("Task option --workspace may only be provided once.");n=L(c,"Workspace id")}else{if(r!==void 0)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw P(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw P("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw P("Task creation accepts either '--repo' or '--workspace', not both.");let o=L(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Ew(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 P(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw P(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw P("Task option --parent may only be provided once.");t=L(d,"Parent task id")}else if(c==="--repo"){if(n)throw P("Task option --repo may only be provided once.");n=L(d,"Repo id")}else if(c==="--workspace"){if(r)throw P("Task option --workspace may only be provided once.");r=L(d,"Workspace id")}else if(c==="--runner"){if(s)throw P("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw P("Task option --idempotency-key may only be provided once.");i=L(d,"Idempotency key")}}if(n&&r)throw P("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:L(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function Ow(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw P(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw P(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw P(`task pr ${t} accepts at most one task id.`);r=L(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw P(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw P("Task PR option --repo may only be provided once.");s=L(c,"Repo id")}else{if(i!==void 0)throw P("Task PR option --pr may only be provided once.");i=L(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw P(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw P(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw P(`Unsupported command: task pr ${e.join(" ")}`)}}var sa=300*1e3,$w=new Set(["idle","working","ready","error"]),Dw=new Set(["queued","delivering","delivered","failed","cancelled"]);function Nw(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:L(e[1],"Agent tab id")};throw P(`Unsupported command: agent status ${e.join(" ")}`)}function _w(e){let t,n,r="when-ready",s=sa,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw P(`Unsupported agent send option: ${l}`);if(o.has(l))throw P(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw P("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw P("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:L(c,"Prompt")}:{source:"file",path:L(c,"Prompt file")}}else if(l==="--tab")n=L(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw P('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=oa(c):i=L(c,"Idempotency key")}if(!t)throw P("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function xw(e){let t=L(e[0]??"","Command id"),n,r=sa,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw P(`Unsupported command wait option: ${o}`);if(s.has(o))throw P(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw P(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Lw(a):r=oa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Lw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Dw.has(n)))throw P(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function gd(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw P(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw P("--format is supported only by events watch.");if(i.has(l))throw P(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=L(c,"Event type glob");else if(l==="--after")r=L(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw P('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function Fw(e){let t,n,r,s=sa,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw P(`Unsupported task wait option: ${a}`);if(t!==void 0)throw P("task wait accepts at most one task id.");t=L(a,"Task id");continue}if(i.has(a))throw P(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw P(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Bw(l):a==="--tab"?r=L(l,"Agent tab id"):s=oa(l)}if(!n)throw P("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Mw(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw P(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw P("fury plan accepts exactly one definition file.");t=L(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw P(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw P("Fury plan option --root-task may only be provided once.");n=L(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw P(`Invalid fury input "${o}". Use key=value.`);let l=L(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw P(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw P("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function jw(e){let t=L(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw P("fury watch supports --after and --format jsonl.");if(i==="--after")n=L(o,"Event cursor");else if(o==="jsonl")r=o;else throw P("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function qw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw P("fury step requires complete or fail.");let n=ia(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=L(n.get("--run")??"","Fury run id"),s=L(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw P("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:L(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw P("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw P("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function Uw(e){if(e[0]!=="list")throw P("fury reviews requires list.");let t=ia(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw P(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Ww(e){let t=e[0],n=L(e[1]??"","Fury review id");if(t==="show")return aa(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw P("Unsupported fury review action.");let r=ia(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw P(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function ia(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw P(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw P(`Option ${s} requires a value.`);n.set(s,L(i,s))}return n}function Bw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!$w.has(n)))throw P(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function oa(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw P(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw P(`Duration "${e}" is too large.`);return s}function yd(e,t){return{mode:"command",command:e,commandName:Pw(e),options:t}}function wd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Pr(e,t){aa(e,0,t)}function aa(e,t,n){if(e.length!==t)throw P(`Command ${n} received an unexpected number of arguments.`)}function ee(e,t){if(e.length!==1)throw P(`${t} is required and must be provided once.`);return L(e[0],t)}function kd(e,t){return L(e.join(" "),t)}function Td(e,t,n){return L(e[t]??"",n)}function L(e,t){let n=e.trim();if(n.length===0)throw P(`${t} cannot be empty.`);return n}function P(e){return new g("CLI_USAGE",`${e}
|
|
8
8
|
|
|
9
|
-
${ta()}`,{})}var qe=(e,t)=>{let n=oa(e);if(!Zw(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},oa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,{...r,runner:aa(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",sessionId:typeof t.sessionId=="string"||t.sessionId===null?t.sessionId:null,selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(s=>typeof s=="string"):[],parentTaskId:typeof t.parentTaskId=="string"||t.parentTaskId===null?t.parentTaskId:null,rootTaskId:typeof t.rootTaskId=="string"?t.rootTaskId:t.id,delegationDepth:Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0?t.delegationDepth:0,delegationIdempotencyKey:typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null?t.delegationIdempotencyKey:null,furyRunId:typeof t.furyRunId=="string"||t.furyRunId===null?t.furyRunId:typeof n.swarmRunId=="string"?n.swarmRunId:null,furyStepId:typeof t.furyStepId=="string"||t.furyStepId===null?t.furyStepId:typeof n.swarmStepId=="string"?n.swarmStepId:null,ptyTabs:nk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:ek(t.repoTargets),runnerSession:t.runnerSession??Qw(t),checks:ck(t),lastCommit:t.lastCommit??null,prs:dk(t),artifacts:mk(t),cleanup:gk(t)}},Qw=e=>{if(typeof e.title!="string")return null;let t=aa(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Zw=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.sessionId=="string"||t.sessionId===null)&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Ou(t.ptyTabs)&&(t.bundlePath===void 0||t.bundlePath===null||typeof t.bundlePath=="string")&&(t.selectedRepoTargetId===void 0||t.selectedRepoTargetId===null||typeof t.selectedRepoTargetId=="string")&&(t.repoTargets===void 0||tk(t.repoTargets))&&sk(t.runnerSession)&&ik(t.prompt)&&$u(t.checks)&&Du(t.lastCommit)&&ak(t.prs)&&lk(t.artifacts)&&xu(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},ek=e=>{if(Array.isArray(e))return e.filter(Eu)},tk=e=>Array.isArray(e)&&e.every(Eu),Eu=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.repoId=="string"&&typeof t.branch=="string"&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&(t.status==="ready"||t.status==="unavailable"||t.status==="merged"||t.status==="closed")&&(typeof t.failureReason=="string"||t.failureReason===null)&&$u(t.checks)&&Du(t.lastCommit)&&Nu(t.pullRequest)&&xu(t.cleanup)},nk=e=>{if(Ou(e.ptyTabs))return e.ptyTabs;if(typeof e.id!="string"||typeof e.title!="string")return[];let t=typeof e.updatedAt=="string"?e.updatedAt:new Date().toISOString();return rk(e.id,e.title,t,aa(e.runner))},rk=(e,t,n,r)=>{let s=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:k.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},aa=e=>e&&k.runners.isRunnerType(e)?e:"codex",Ou=e=>Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.id=="string"&&(t.kind==="agent"||t.kind==="terminal")&&(t.capabilityId===void 0||typeof t.capabilityId=="string")&&typeof t.title=="string"&&Array.isArray(t.command)&&t.command.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"),sk=e=>typeof e=="object"&&e!==null&&Array.isArray(e.command)&&e.command.every(t=>typeof t=="string")&&(typeof e.pid=="number"||e.pid===null)&&(typeof e.startedAt=="string"||e.startedAt===null)&&(e.lastKnownState==="starting"||e.lastKnownState==="running"||e.lastKnownState==="exited"||e.lastKnownState==="failed")&&(typeof e.exitCode=="number"||e.exitCode===null)&&(typeof e.exitedAt=="string"||e.exitedAt===null),ik=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",$u=e=>typeof e=="object"&&e!==null&&typeof e.source=="object"&&e.source!==null&&e.source.type==="repo_config"&&typeof e.source.path=="string"&&(typeof e.lastRunAt=="string"||e.lastRunAt===null)&&(e.status==="not_run"||e.status==="running"||e.status==="passed"||e.status==="failed")&&Array.isArray(e.commands)&&e.commands.every(t=>typeof t=="string")&&Array.isArray(e.results)&&e.results.every(t=>typeof t=="object"&&t!==null&&typeof t.command=="string"&&typeof t.startedAt=="string"&&typeof t.finishedAt=="string"&&typeof t.exitCode=="number"),Du=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Nu=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&ok(e.requiredChecks),ok=e=>Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.name=="string"&&(t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown")&&(typeof t.conclusion=="string"||t.conclusion===null)),ak=e=>Array.isArray(e)&&e.every(Nu),lk=e=>typeof e=="object"&&e!==null&&(typeof e.logPath=="string"||e.logPath===null)&&(typeof e.checkSummaryPath=="string"||e.checkSummaryPath===null)&&(typeof e.prDraftPath=="string"||e.prDraftPath===null)&&(typeof e.prStatusPath=="string"||e.prStatusPath===null),xu=e=>typeof e=="object"&&e!==null&&(typeof e.paneClosedAt=="string"||e.paneClosedAt===null)&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),ck=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},dk=e=>{if(Array.isArray(e.prs))return e.prs.map(uk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:_u(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Fu(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},uk=e=>{let t=e??{};return{provider:"github",owner:t.owner??null,repo:t.repo??null,number:typeof t.number=="number"?t.number:null,url:t.url??null,title:t.title??null,status:_u(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:pk(t.reviewDecision),requiredChecks:Fu(t.requiredChecks),comments:fk(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},_u=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,pk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,fk=e=>Array.isArray(e)?e.flatMap(t=>{if(typeof t!="object"||t===null)return[];let n=t;return typeof n.body!="string"||!n.body.trim()?[]:[{author:typeof n.author=="string"?n.author:null,body:n.body,createdAt:typeof n.createdAt=="string"?n.createdAt:null,url:typeof n.url=="string"?n.url:null}]}):[],Fu=e=>Array.isArray(e)?e.map(t=>({...t,status:t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown"?t.status:"unknown",conclusion:t.conclusion??null})):[],mk=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},gk=e=>e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null};import{readFile as Zk}from"node:fs/promises";import{readFile as hk,readdir as yk,rm as wk}from"node:fs/promises";import Lu from"node:path";var la=(e,t)=>Lu.join(e.workspacesDir,`${t}.json`),kk=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=t.repoId??t.primaryRepoId;return{...t,kind:t.kind??"repo",name:t.name??n??t.id,rootPath:t.rootPath??"",primaryRepoId:t.primaryRepoId??n??"",repoId:t.kind==="project"?t.repoId:n,discoveredRepoIds:Array.isArray(t.discoveredRepoIds)?t.discoveredRepoIds.filter(r=>typeof r=="string"):t.kind==="project"?[]:n?[n]:[],linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(r=>typeof r=="string"):[]}},Mu=(e,t)=>{let n=kk(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},gn=async(e,t)=>{let n=la(e,t);try{let r=await hk(n,"utf8");return Mu(JSON.parse(r),n)}catch(r){throw Tk(r)?new h("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig workspace record at ")?new h("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},hn=async(e,t)=>{await M(la(e,t.id),{...t,updatedAt:new Date().toISOString()})},$e=async e=>{let t=await yk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>gn(e,Lu.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},ju=async(e,t)=>{await wk(la(e,t),{force:!0})},Tk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as bk,readdir as Rk,rm as Sk}from"node:fs/promises";import qu from"node:path";var ca=(e,t)=>qu.join(e.reposDir,`${t}.json`),Uu=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},Ue=async(e,t)=>{let n=ca(e,t);try{let r=await bk(n,"utf8");return Uu(JSON.parse(r),n)}catch(r){throw Pk(r)?new h("REPO_NOT_FOUND",`Craig repo "${t}" was not found.`,{details:{repoId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig repo record at ")?new h("REPO_RECORD_INVALID",r instanceof Error?r.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:r}):r}},da=async(e,t)=>{await M(ca(e,t.id),{...t,updatedAt:new Date().toISOString()})},$r=async e=>{let t=await Rk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Ue(e,qu.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},Wu=async(e,t)=>{await Sk(ca(e,t),{force:!0})},Pk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Ik}from"node:fs/promises";var vk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Bn=(e,t,n)=>{if(!vk(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Ce=async e=>{let t=await Ik(e.indexFile,"utf8");return Bn(JSON.parse(t),e.workspaceRoot,e.indexFile)},bt=async(e,t)=>{await M(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as $k,stat as Dk}from"node:fs/promises";import Kn from"node:path";import{realpath as Ku}from"node:fs/promises";import Ys from"node:path";import{execFile as Ck}from"node:child_process";import{promisify as Ak}from"node:util";var Bu=Ak(Ck);async function F(e,t,n={}){try{let r=await Bu(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Vu(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function G(e,t,n={}){try{let r=await Bu(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Vu(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Vu(e){return e instanceof Error}var ua=async e=>{try{let n=(await F("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Ku(n).catch(()=>Ys.resolve(n)),Ku(e).catch(()=>Ys.resolve(e))]);return r===s}catch{return!1}},pa=async e=>{let t=await G("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await G("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await F("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},Gu=async e=>{let t=await G("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=Ys.resolve(e,n);return Ys.dirname(r)};import{mkdir as De,readFile as Ek}from"node:fs/promises";var Ok=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=ve(e);await De(t.craigDir,{recursive:!0}),await Promise.all([De(t.reposDir,{recursive:!0}),De(t.workspacesDir,{recursive:!0}),De(t.sessionsDir,{recursive:!0}),De(t.runtimeDir,{recursive:!0}),De(t.tasksDir,{recursive:!0}),De(t.jobsDir,{recursive:!0}),De(t.commandsDir,{recursive:!0}),De(t.eventsDir,{recursive:!0}),De(t.orchestrationDir,{recursive:!0}),De(t.logsDir,{recursive:!0}),De(t.artifactsDir,{recursive:!0}),De(t.worktreesDir,{recursive:!0})]);try{let s=await Ek(t.indexFile,"utf8"),i=JSON.parse(s);return Bn(i,e,t.indexFile)}catch(s){if(!Ok(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await M(t.indexFile,r),r};var Hu=(e,t,n)=>{let r=new Date().toISOString();return{id:Nk(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Yu=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Nk=(e,t)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"repo",r=`repo_${n}`,s=2;for(;e.some(i=>i.id===r);)r=`repo_${n}_${s}`,s+=1;return r},xk=(e,t)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"workspace",r=`workspace_${n}`,s=2;for(;e.some(i=>i.id===r);)r=`workspace_${n}_${s}`,s+=1;return r},zu=async(e,t)=>{let n=await Ce(e);await bt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},_k=async(e,t)=>{let n=await $k(t,{withFileTypes:!0}),r=await $r(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Kn.join(t,i.name);if(!await ua(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await pa(o);s.push(a?Yu(a,l):Hu([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Fk=async(e,t)=>{let n=await pa(t),r=await $r(e),s=r.find(d=>d.rootPath===t)??null,i=s?Yu(s,n):Hu(r,t,n),o=`workspace_${i.id}`,l=(await $e(e)).find(d=>d.id===o)??null,c=new Date().toISOString(),u=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await da(e,i),l||await hn(e,u),await zu(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},Lk=async(e,t)=>{let n=await _k(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await $e(e),s=xk(r,Kn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Kn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>da(e,c))),await hn(e,l),await zu(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Dr=async(e,t)=>{await Vn(e.workspaceRoot);let n=Kn.resolve(e.workspaceRoot,t);if(!(await Dk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await ua(n)?Fk(e,n):Lk(e,n)};var fa=async(e,t,n={listWorkspaceRecords:$e,ensureCraigState:Vn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var ma=async(e,t,n={readWorkspace:gn,writeWorkspace:hn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var ga=async(e,t)=>{let r={...await gn(e,t),status:"active",archivedAt:null};await hn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var yn=async(e,t,n={deleteWorkspace:ju,readCraigIndex:Ce,writeCraigIndex:bt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var ha=async(e,t,n)=>{let r=await gn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await yn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as Mk,realpath as Qu,stat as jk}from"node:fs/promises";import zs from"node:path";async function ya(e){let t=await ep(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Ju(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Ju(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Xu(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Gu(t);if(r){let s=await Xu(r);if(s)return{workspaceRoot:s,source:"git_common_dir",initialized:!0}}if(e.allowUninitializedCwd)return{workspaceRoot:t,source:"cwd",initialized:!1};throw new h("WORKSPACE_CONTEXT_NOT_FOUND",`No Craig workspace was found from ${t}. Use --workspace-root <path> or run Craig inside an initialized workspace.`,{details:{cwd:t}})}async function Ju(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await ep(zs.resolve(n,e),s),o=await Zu(i);if(o)return{workspaceRoot:o,source:t,initialized:!0};if(r)return{workspaceRoot:i,source:t,initialized:!1};throw new h("WORKSPACE_CONTEXT_NOT_FOUND",`${s} ${i} is not an initialized Craig workspace.`,{details:{workspaceRoot:i,source:t}})}async function Xu(e){let t=e;for(;;){let n=await Zu(t);if(n)return n;let r=zs.dirname(t);if(r===t)return null;t=r}}async function Zu(e){let t=ve(e);try{let n=await Mk(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Bn(r,s,t.indexFile);if(await Qu(i.workspaceRoot).catch(()=>zs.resolve(i.workspaceRoot))!==e)throw new Error(`Craig index at ${t.indexFile} belongs to ${i.workspaceRoot}, not ${e}. Remove or repair the file before rerunning Craig.`);return i.workspaceRoot}catch(n){if(qk(n))return null;throw n instanceof h?n:new h("WORKSPACE_CONTEXT_INVALID",n instanceof Error?n.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:n})}}async function ep(e,t){let n=zs.resolve(e);try{if(!(await jk(n)).isDirectory())throw new h("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Qu(n)}catch(r){throw r instanceof h?r:new h("WORKSPACE_CONTEXT_NOT_FOUND",`${t} ${n} does not exist or cannot be read.`,{details:{path:n},cause:r})}}function qk(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var wa={};Ls(wa,{addRepo:()=>tp,listRegisteredRepos:()=>np,removeRepo:()=>rp});import Uk from"node:path";import{stat as Wk}from"node:fs/promises";var tp=async(e,t)=>{let n=Uk.resolve(e.workspaceRoot,t);if(!(await Wk(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Dr(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var np=async(e,t={listRepos:$r,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var rp=async(e,t,n)=>{let r=await Ue(e,t),i=(await $e(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>yn(e,c.id))),await Wu(e,t);let l=await Ce(e);return await bt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var ke={addWorkspace:Dr,listWorkspaces:fa,archiveWorkspace:ma,restoreWorkspace:ga,removeWorkspace:ha,removeWorkspaceRecord:yn,resolveContext:ya,repos:wa};import{mkdir as sp,readFile as Bk,rm as Xs,stat as Vk,writeFile as Kk}from"node:fs/promises";import Js from"node:path";var Gk=25,Hk=3e4,Yk=5e3;async function qt(e,t,n){let r=Js.join(e.runtimeDir,"task-locks"),s=Js.join(r,`${t}.lock`);await sp(r,{recursive:!0});let i=Date.now();for(;;)try{await sp(s);try{await Kk(Js.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Xs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Xk(o))throw o;if(await zk(s))continue;if(Date.now()-i>=Hk)throw new h("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Qk(Gk)}try{return await n()}finally{await Xs(s,{recursive:!0,force:!0})}}async function zk(e){let t=await Bk(Js.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Jk(t.pid)?!1:(await Xs(e,{recursive:!0,force:!0}),!0);let n=await Vk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Yk?!1:(await Xs(e,{recursive:!0,force:!0}),!0)}function Jk(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Xk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Qk=e=>new Promise(t=>setTimeout(t,e));var Rt=async(e,t)=>{let n=await Zk(Qs(e,t),"utf8");return JSON.parse(n)},Nr=async(e,t)=>{let n=await Rt(e,t);return qe(n,Qs(e,t))},St=async(e,t)=>{let n=ip(t);await M(Qs(e,t.id),n)},W=async(e,t,n)=>qt(e,t,async()=>{let r=await Nr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=ip(s);return await M(Qs(e,t),i),i}),ka=async(e,t)=>{let n=await Ce(e);n.taskIds.includes(t)||await bt(e,{...n,taskIds:[...n.taskIds,t]})},Qs=(e,t)=>`${e.tasksDir}/${t}.json`,ip=e=>({...e,updatedAt:new Date().toISOString()});var V=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Ut=e=>e.status==="merged"||e.status==="closed",Pt=(e,t)=>{let n=e.prs.findIndex(s=>Gn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Gn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),wn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return ei(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ei=e=>e.mergeable&&!eT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),eT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ta=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),It=(e,t,n)=>{let r=e.isDraft??!1,s=tT(e.state,r);return{provider:"github",owner:n?.owner??t?.owner??null,repo:n?.name??t?.repo??null,number:e.number,url:e.url,title:e.title??t?.title??null,status:s,draft:r,baseBranch:e.baseRefName,headBranch:e.headRefName,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:nT(e.reviewDecision??null),requiredChecks:ba(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:oT(e.comments),createdAt:e.createdAt??t?.createdAt??null,updatedAt:e.updatedAt??t?.updatedAt??null,mergedAt:e.mergedAt??t?.mergedAt??null,lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}},tT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,nT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ba=e=>{let t=e.map(r=>rT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||sT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},rT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=t.name??t.context,r=t.state??t.status??t.conclusion;return n?{name:n,status:ap(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:iT(t)}:null},sT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Zs(e)&&!Zs(t)?!0:!Zs(e)&&Zs(t)?!1:op(t.status)>=op(e.status),Zs=e=>e.conclusion?.toUpperCase()==="CANCELLED",op=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},iT=e=>{let t=e.completedAt??e.startedAt??e.createdAt??null;if(!t)return null;let n=new Date(t).getTime();return Number.isFinite(n)?n:null},oT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(aT).filter(n=>n!==null).slice(-4):[]},aT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=lT(t.bodyText??t.body??"");return n?{author:typeof t.author=="string"?t.author:t.author?.login??null,body:n,createdAt:t.createdAt??null,url:t.url??null}:null},lT=e=>e.replace(/\s+/g," ").trim(),ap=(e,t)=>{let n=e?.toUpperCase()??null,r=t?.toUpperCase()??null;return r==="SKIPPED"||n==="SKIPPED"?"skipped":n==="SUCCESS"||r==="SUCCESS"||r==="NEUTRAL"?"success":n==="PENDING"||n==="EXPECTED"||n==="IN_PROGRESS"||n==="QUEUED"||n==="REQUESTED"||n==="WAITING"?"pending":n==="FAILURE"||n==="FAILED"||n==="ERROR"||n==="TIMED_OUT"||n==="CANCELLED"||n==="ACTION_REQUIRED"||n==="STARTUP_FAILURE"||r==="FAILURE"||r==="FAILED"||r==="ERROR"||r==="TIMED_OUT"||r==="CANCELLED"||r==="ACTION_REQUIRED"||r==="STARTUP_FAILURE"?"failed":n==="COMPLETED"&&r===null?"unknown":n==="COMPLETED"&&r!==null?ap(r,r):"unknown"};var We=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as cT}from"node:fs/promises";import lp from"node:path";var L=async(e,t,n={readRawTask:Rt,validateTaskRecord:qe})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw mT(r)?new h("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):gT(r)?new h("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},me=async e=>{if(!await Ra(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Hn=(e,t)=>t.artifacts.logPath?lp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:lp.join(e.workspaceRoot,t.artifacts.logPath):null,xr=async(e,t)=>{let n=await Ra(t.worktreePath),r=Hn(e,t),s=r?await Ra(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:dT(t),lastCommitSummary:uT(t),prSummary:pT(t),cleanupSummary:fT(t)}},Ra=async e=>{try{return await cT(e),!0}catch{return!1}},dT=e=>{let t=e.checks.commands.length,n=t===1?"command":"commands",r=e.checks.lastRunAt?` at ${e.checks.lastRunAt}`:"";return`${e.checks.status} (${t} ${n})${r}`},uT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",pT=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let u=c.pullRequest.status??"unknown";return l[u]=(l[u]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
|
|
9
|
+
${ra()}`,{})}var je=(e,t)=>{let n=la(e);if(!Kw(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:ca(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:Yw(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Gw(t.repoTargets),runnerSession:t.runnerSession??Vw(t),checks:tk(t),lastCommit:t.lastCommit??null,prs:nk(t),artifacts:ok(t),cleanup:ak(t)}},Vw=e=>{if(typeof e.title!="string")return null;let t=ca(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Kw=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"&&Pd(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||Hw(t.repoTargets))&&Jw(t.runnerSession)&&Xw(t.prompt)&&Id(t.checks)&&vd(t.lastCommit)&&Zw(t.prs)&&ek(t.artifacts)&&Ad(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Gw=e=>{if(Array.isArray(e))return e.filter(Sd)},Hw=e=>Array.isArray(e)&&e.every(Sd),Sd=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)&&Id(t.checks)&&vd(t.lastCommit)&&Cd(t.pullRequest)&&Ad(t.cleanup)},Yw=e=>{if(Pd(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 zw(e.id,e.title,t,ca(e.runner))},zw=(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}]},ca=e=>e&&k.runners.isRunnerType(e)?e:"codex",Pd=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"),Jw=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),Xw=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Id=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"),vd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Cd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&Qw(e.requiredChecks),Qw=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)),Zw=e=>Array.isArray(e)&&e.every(Cd),ek=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),Ad=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),tk=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},nk=e=>{if(Array.isArray(e.prs))return e.prs.map(rk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Ed(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Od(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},rk=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:Ed(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:sk(t.reviewDecision),requiredChecks:Od(t.requiredChecks),comments:ik(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Ed=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,sk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ik=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}]}):[],Od=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})):[],ok=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},ak=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as Kk}from"node:fs/promises";import{readFile as lk,readdir as ck,rm as uk}from"node:fs/promises";import $d from"node:path";var ua=(e,t)=>$d.join(e.workspacesDir,`${t}.json`),dk=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"):[]}},Dd=(e,t)=>{let n=dk(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},mn=async(e,t)=>{let n=ua(e,t);try{let r=await lk(n,"utf8");return Dd(JSON.parse(r),n)}catch(r){throw pk(r)?new g("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig workspace record at ")?new g("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},hn=async(e,t)=>{await q(ua(e,t.id),{...t,updatedAt:new Date().toISOString()})},$e=async e=>{let t=await ck(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>mn(e,$d.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Nd=async(e,t)=>{await uk(ua(e,t),{force:!0})},pk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as fk,readdir as mk,rm as hk}from"node:fs/promises";import _d from"node:path";var da=(e,t)=>_d.join(e.reposDir,`${t}.json`),xd=(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},ut=async(e,t)=>{let n=da(e,t);try{let r=await fk(n,"utf8");return xd(JSON.parse(r),n)}catch(r){throw gk(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}},pa=async(e,t)=>{await q(da(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ir=async e=>{let t=await mk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>ut(e,_d.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},Ld=async(e,t)=>{await hk(da(e,t),{force:!0})},gk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as yk}from"node:fs/promises";var wk=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"},qn=(e,t,n)=>{if(!wk(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Ce=async e=>{let t=await yk(e.indexFile,"utf8");return qn(JSON.parse(t),e.workspaceRoot,e.indexFile)},bt=async(e,t)=>{await q(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Sk,stat as Pk}from"node:fs/promises";import Wn from"node:path";import{realpath as jd}from"node:fs/promises";import Bs from"node:path";import{execFile as kk}from"node:child_process";import{promisify as Tk}from"node:util";var Fd=Tk(kk);async function K(e,t,n={}){try{let r=await Fd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Md(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function J(e,t,n={}){try{let r=await Fd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Md(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Md(e){return e instanceof Error}var fa=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([jd(n).catch(()=>Bs.resolve(n)),jd(e).catch(()=>Bs.resolve(e))]);return r===s}catch{return!1}},ma=async e=>{let t=await J("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},qd=async e=>{let t=await J("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=Bs.resolve(e,n);return Bs.dirname(r)};import{mkdir as qe,readFile as bk}from"node:fs/promises";var Rk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Un=async e=>{let t=ve(e);await qe(t.craigDir,{recursive:!0}),await Promise.all([qe(t.reposDir,{recursive:!0}),qe(t.workspacesDir,{recursive:!0}),qe(t.runtimeDir,{recursive:!0}),qe(t.tasksDir,{recursive:!0}),qe(t.jobsDir,{recursive:!0}),qe(t.commandsDir,{recursive:!0}),qe(t.eventsDir,{recursive:!0}),qe(t.orchestrationDir,{recursive:!0}),qe(t.logsDir,{recursive:!0}),qe(t.artifactsDir,{recursive:!0}),qe(t.worktreesDir,{recursive:!0})]);try{let s=await bk(t.indexFile,"utf8"),i=JSON.parse(s);return qn(i,e,t.indexFile)}catch(s){if(!Rk(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 Ud=(e,t,n)=>{let r=new Date().toISOString();return{id:Ik(e,Wn.basename(t)),name:Wn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Wd=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Ik=(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},vk=(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},Bd=async(e,t)=>{let n=await Ce(e);await bt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},Ck=async(e,t)=>{let n=await Sk(t,{withFileTypes:!0}),r=await Ir(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Wn.join(t,i.name);if(!await fa(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await ma(o);s.push(a?Wd(a,l):Ud([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Ak=async(e,t)=>{let n=await ma(t),r=await Ir(e),s=r.find(u=>u.rootPath===t)??null,i=s?Wd(s,n):Ud(r,t,n),o=`workspace_${i.id}`,l=(await $e(e)).find(u=>u.id===o)??null,c=new Date().toISOString(),d=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await pa(e,i),l||await hn(e,d),await Bd(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},Ek=async(e,t)=>{let n=await Ck(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await $e(e),s=vk(r,Wn.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:Wn.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=>pa(e,c))),await hn(e,l),await Bd(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},vr=async(e,t)=>{await Un(e.workspaceRoot);let n=Wn.resolve(e.workspaceRoot,t);if(!(await Pk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await fa(n)?Ak(e,n):Ek(e,n)};var ha=async(e,t,n={listWorkspaceRecords:$e,ensureCraigState:Un})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var ga=async(e,t,n={readWorkspace:mn,writeWorkspace:hn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var ya=async(e,t)=>{let r={...await mn(e,t),status:"active",archivedAt:null};await hn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var gn=async(e,t,n={deleteWorkspace:Nd,readCraigIndex:Ce,writeCraigIndex:bt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var wa=async(e,t,n)=>{let r=await mn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await gn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as Ok,realpath as Gd,stat as $k}from"node:fs/promises";import Vs from"node:path";async function ka(e){let t=await Yd(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Vd(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Vd(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Kd(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await qd(t);if(r){let s=await Kd(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 Vd(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Yd(Vs.resolve(n,e),s),o=await Hd(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 Kd(e){let t=e;for(;;){let n=await Hd(t);if(n)return n;let r=Vs.dirname(t);if(r===t)return null;t=r}}async function Hd(e){let t=ve(e);try{let n=await Ok(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=qn(r,s,t.indexFile);if(await Gd(i.workspaceRoot).catch(()=>Vs.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(Dk(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 Yd(e,t){let n=Vs.resolve(e);try{if(!(await $k(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Gd(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 Dk(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Ta={};Ds(Ta,{addRepo:()=>zd,listRegisteredRepos:()=>Jd,removeRepo:()=>Xd});import Nk from"node:path";import{stat as _k}from"node:fs/promises";var zd=async(e,t)=>{let n=Nk.resolve(e.workspaceRoot,t);if(!(await _k(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await vr(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 Jd=async(e,t={listRepos:Ir,ensureCraigState:Un})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Xd=async(e,t,n)=>{let r=await ut(e,t),i=(await $e(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>gn(e,c.id))),await Ld(e,t);let l=await Ce(e);return await bt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var ke={addWorkspace:vr,listWorkspaces:ha,archiveWorkspace:ga,restoreWorkspace:ya,removeWorkspace:wa,removeWorkspaceRecord:gn,resolveContext:ka,repos:Ta};import{mkdir as Qd,readFile as xk,rm as Gs,stat as Lk,writeFile as Fk}from"node:fs/promises";import Ks from"node:path";var Mk=25,jk=3e4,qk=5e3;async function Ut(e,t,n){let r=Ks.join(e.runtimeDir,"task-locks"),s=Ks.join(r,`${t}.lock`);await Qd(r,{recursive:!0});let i=Date.now();for(;;)try{await Qd(s);try{await Fk(Ks.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Gs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Bk(o))throw o;if(await Uk(s))continue;if(Date.now()-i>=jk)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Vk(Mk)}try{return await n()}finally{await Gs(s,{recursive:!0,force:!0})}}async function Uk(e){let t=await xk(Ks.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Wk(t.pid)?!1:(await Gs(e,{recursive:!0,force:!0}),!0);let n=await Lk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<qk?!1:(await Gs(e,{recursive:!0,force:!0}),!0)}function Wk(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 Bk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Vk=e=>new Promise(t=>setTimeout(t,e));var Rt=async(e,t)=>{let n=await Kk(Hs(e,t),"utf8");return JSON.parse(n)},Cr=async(e,t)=>{let n=await Rt(e,t);return je(n,Hs(e,t))},St=async(e,t)=>{let n=Zd(t);await q(Hs(e,t.id),n)},V=async(e,t,n)=>Ut(e,t,async()=>{let r=await Cr(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=Zd(s);return await q(Hs(e,t),i),i}),ba=async(e,t)=>{let n=await Ce(e);n.taskIds.includes(t)||await bt(e,{...n,taskIds:[...n.taskIds,t]})},Hs=(e,t)=>`${e.tasksDir}/${t}.json`,Zd=e=>({...e,updatedAt:new Date().toISOString()});var W=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Wt=e=>e.status==="merged"||e.status==="closed",Pt=(e,t)=>{let n=e.prs.findIndex(s=>Bn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Bn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),yn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return zs(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},zs=e=>e.mergeable&&!Gk(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Gk=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ra=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),It=(e,t,n)=>{let r=e.isDraft??!1,s=Hk(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:Yk(e.reviewDecision??null),requiredChecks:Sa(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:Qk(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}},Hk=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Yk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Sa=e=>{let t=e.map(r=>zk(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||Jk(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},zk=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:tp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:Xk(t)}:null},Jk=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Ys(e)&&!Ys(t)?!0:!Ys(e)&&Ys(t)?!1:ep(t.status)>=ep(e.status),Ys=e=>e.conclusion?.toUpperCase()==="CANCELLED",ep=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},Xk=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},Qk=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(Zk).filter(n=>n!==null).slice(-4):[]},Zk=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=eT(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},eT=e=>e.replace(/\s+/g," ").trim(),tp=(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?tp(r,r):"unknown"};var Ue=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as tT}from"node:fs/promises";import np from"node:path";var F=async(e,t,n={readRawTask:Rt,validateTaskRecord:je})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw oT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):aT(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},me=async e=>{if(!await Pa(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Vn=(e,t)=>t.artifacts.logPath?np.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:np.join(e.workspaceRoot,t.artifacts.logPath):null,Ar=async(e,t)=>{let n=await Pa(t.worktreePath),r=Vn(e,t),s=r?await Pa(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:nT(t),lastCommitSummary:rT(t),prSummary:sT(t),cleanupSummary:iT(t)}},Pa=async e=>{try{return await tT(e),!0}catch{return!1}},nT=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}`},rT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",sT=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let d=c.pullRequest.status??"unknown";return l[d]=(l[d]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
|
|
10
10
|
${i.join(`
|
|
11
|
-
`)}`}let t=
|
|
12
|
-
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},
|
|
11
|
+
`)}`}let t=W(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})`},iT=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",oT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",aT=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var rp=async(e,t)=>{let n=await J("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},Ia=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await lT(e,s);await K("git",["worktree","add","-b",t,n,o],{cwd:e})},lT=async(e,t)=>(await J("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await J("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await J("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,Js=async e=>{let t=await J("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},sp=async e=>{await K("git",["add","-A"],{cwd:e})},ip=async(e,t)=>{await K("git",["commit","-m",t],{cwd:e})},op=async e=>{let t=await K("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
|
|
12
|
+
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},ap=async e=>{let t=await J("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var lp=async(e,t)=>{await K("git",["worktree","remove","--force",t],{cwd:e})};var va=async e=>Kn(e,e.repoRoot),Kn=async(e,t)=>{let n=await Ce(e),r=cp(new Date),s=up(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await rp(t,o))return i;s+=1}},Er=async e=>{let t=await Ce(e),n=cp(new Date),r=up(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},cp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},up=(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 Or=async(e,t,n={readRawTask:Rt,validateTaskRecord:je})=>{let r=await Ce(e),s=[],i=[];await Promise.all(r.taskIds.map(async l=>{try{let c=await n.readRawTask(e,l);s.push(n.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(cT(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}},cT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var dp=["merge_ready","pr_open","checked","review","running","draft"],Ca=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Aa=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(uT)[0]?.id??null,uT=(e,t)=>{let n=pp(e.status),r=pp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},pp=e=>{let t=dp.indexOf(e);return t>=0?t:dp.length};import fp from"node:path";var wn=(e,t)=>t?fp.isAbsolute(t)?t:fp.join(e.repoRoot,t):null;import{randomUUID as dT}from"node:crypto";import{mkdir as $r,rm as pT,writeFile as Xs}from"node:fs/promises";import G from"node:path";var hp=["AGENTS","md"].join("."),Gn=async(e,t,n,r={})=>{let s=await ut(e,t),[i,o]=await Promise.all([yT(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Kn(e,s.rootPath)]),a=`craig/${o}`,l=G.join(e.worktreesDir,s.id,o),c=G.join(e.logsDir,`${o}.log`),d=G.join(e.artifactsDir,o);await Promise.all([$r(G.dirname(l),{recursive:!0}),$r(d,{recursive:!0}),Xs(c,"","utf8")]);let u=fT(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 St(e,u),await ba(e,o),await Ia(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},Dr=async(e,t,n,r={})=>{let s=(await $e(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await Gn(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 Er(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=G.join(e.craigDir,"task-bundles",o),u=G.join(e.logsDir,`${o}.log`),p=G.join(e.artifactsDir,o);await $r(d,{recursive:!0}),await $r(p,{recursive:!0}),await Xs(u,"","utf8");let m=await Promise.all(i.map(b=>ut(e,b))),h=hT(m),f=await Promise.all(m.map(b=>mT(e,b,o,c,G.join(d,h.get(b.id))))),y=f.find(b=>b.status==="ready")??f[0];if(!f.some(b=>b.status==="ready"))throw await pT(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${f.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Xs(G.join(d,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:n,repos:f.map(b=>({repoId:b.repoId,repoName:m.find(O=>O.id===b.repoId)?.name??b.repoId,path:G.relative(d,b.worktreePath),status:b.status,worktreePath:b.worktreePath,failureReason:b.failureReason}))},null,2),"utf8"),await Xs(G.join(d,hp),gT({taskId:o,workspaceId:t,prompt:n,repos:m,repoTargets:f,bundlePath:d}),"utf8");let T=Nr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:yp(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),...gp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:f,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:G.relative(e.workspaceRoot,u),checkSummaryPath:G.relative(e.workspaceRoot,G.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:G.relative(e.workspaceRoot,G.join(p,"pr-status.json"))},cleanup:Qs(),lastFailureReason:f.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await St(e,R),await ba(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:f}},Nr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${dT()}`}:{},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}]},fT=(e,t)=>{let n=new Date().toISOString(),r=Nr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:yp(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...gp(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:{...Ea(G.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:G.relative(e.workspaceRoot,G.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:G.relative(e.workspaceRoot,G.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:G.relative(e.workspaceRoot,G.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:Qs(),lastFailureReason:null,createdAt:n,updatedAt:n}},mT=async(e,t,n,r,s)=>{await $r(G.dirname(s),{recursive:!0});try{return await Ia(t.rootPath,r,s,t.defaultBranch),{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Ea(G.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:mp(),cleanup:Qs()}}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:Ea(G.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:mp(),cleanup:Qs()}}},hT=e=>{let t=new Set(["manifest.json",hp]),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},gT=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=G.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
|
-
`)},
|
|
15
|
-
`);return await zT(r,`${s}
|
|
16
|
-
`,{encoding:"utf8",mode:384,flag:"wx"}),r}var XT=async(e,t)=>{let n=await G("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return Np({paneId:e.paneId,windowTarget:e.windowTarget,alive:n.exitCode===0&&n.stdout.split(/\s+/).some(r=>r.trim()===e.paneId)})},Np=async e=>({paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()});var Na=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let a=r.workspaceId?await Mr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await zn(e,t,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}),l=a.task,c=k.runners.buildCommand(o,s,i),u=`session_${l.id}`,d=l.artifacts.logPath?xp.resolve(e.workspaceRoot,l.artifacts.logPath):xp.join(e.logsDir,`${l.id}.log`);try{let p=await r.onProvisioned?.(l);await Da.prepare(l,{repoRoot:a.repoRoot});let m=await qr.create(e,{sessionId:u,taskId:l.id,repoId:a.repoId,workspaceId:a.workspaceId,repoRoot:a.repoRoot,worktreePath:l.worktreePath,logPath:d,command:c});await Da.launch(l,{repoRoot:a.repoRoot,session:m,...p?{environment:p}:{}});let g=new Date().toISOString();m={...m,status:"running",startedAt:g,command:c};let f=await W(e,l.id,y=>({...y,status:"running",runner:o,sessionId:m.id,selectedPtyTabId:y.selectedPtyTabId,runnerSession:{command:m.command,pid:null,startedAt:g,lastKnownState:"running",exitCode:null,exitedAt:null}}));return await Tn(e,m),{kind:"createTask",taskId:f.id,repoId:f.repoId,workspaceId:f.workspaceId,sessionId:m.id,status:f.status,branch:f.branch,worktreePath:f.worktreePath,runner:f.runner}}catch(p){throw await W(e,l.id,m=>({...m,sessionId:null,status:"draft",runnerSession:{...m.runnerSession,lastKnownState:"failed"},lastFailureReason:p instanceof Error?p.message:"Unknown Craig error"})),p}};import{mkdir as nb}from"node:fs/promises";import rb from"node:path";var vt=async e=>{let t=await G("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var _p=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await F("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Jn=async(e,t)=>{let n=await F("gh",xa(e),{cwd:t});return JSON.parse(n.stdout)},Xn=async(e,t)=>{let n=await G("gh",xa(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Mp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Fp=async(e,t)=>{let n=await G("gh",xa(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Mp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Lp=async(e,t,n)=>{if(n.length===0)return[];let r=eb(n),s;try{s=await F("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw QT(a)?new We(a instanceof Error?a.message:String(a)):a}let o=JSON.parse(s.stdout).data?.repository??{};return n.map((a,l)=>{let c=o[`item${l}`],u=tb(c);return{id:a.id,found:u!==null,view:u}})},ii=async e=>{let t=await G("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:ZT(t.stdout.trim())},Vt=e=>{let t=e.trim().match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/([1-9]\d*)(?:[/?#].*)?$/);return!t?.[1]||!t[2]||!t[3]?null:{owner:t[1],name:t[2],number:Number(t[3])}},QT=e=>{let t=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return t.includes("rate limit")||t.includes("secondary rate limit")||t.includes("abuse detection")||t.includes("api rate limit exceeded")||t.includes("you have exceeded")},Mp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},xa=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],ZT=e=>{let t=e.replace(/\.git$/,""),n=t.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)$/);if(n?.[1]&&n[2])return{owner:n[1],name:n[2]};let r=t.match(/^git@github\.com:([^/]+)\/([^/]+)$/);if(r?.[1]&&r[2])return{owner:r[1],name:r[2]};let s=t.match(/^ssh:\/\/git@github\.com\/([^/]+)\/([^/]+)$/);return s?.[1]&&s[2]?{owner:s[1],name:s[2]}:null},eb=e=>`
|
|
14
|
+
`)},Ea=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),mp=()=>({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}),Qs=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),gp=(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}),yT=async(e,t,n,r=!1)=>{let s=await $e(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},yp=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Oa=async(e,t,n)=>{await V(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},_r=async(e,t,n)=>V(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),xr=async(e,t)=>V(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 $a=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 Dr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Gn(e,t,s,{runner:o,config:i,...r.owningWorkspaceId?{workspaceId:r.owningWorkspaceId,allowLinkedProjectRepo:r.allowLinkedProjectRepo??!1}:{},...r.lineage?{lineage:r.lineage}:{}})).task;try{let c=await r.onProvisioned?.(l);if(!r.launchProvisioned)throw new Error("Craig task creation requires the PTY daemon launcher.");await r.launchProvisioned(l,c||void 0);let d=r.markStartedAfterLaunch===!1?await F(e,l.id):await xr(e,l.id),u=d.ptyTabs.find(p=>p.kind==="agent");return{kind:"createTask",taskId:d.id,repoId:d.repoId,workspaceId:d.workspaceId,agentTabId:u.id,status:d.status,branch:d.branch,worktreePath:d.worktreePath,runner:d.runner}}catch(c){throw await _r(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as RT}from"node:fs/promises";import ST from"node:path";var vt=async e=>{let t=await J("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var wp=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await K("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Hn=async(e,t)=>{let n=await K("gh",Da(e),{cwd:t});return JSON.parse(n.stdout)},Yn=async(e,t)=>{let n=await J("gh",Da(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(bp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},kp=async(e,t)=>{let n=await J("gh",Da(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(bp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Tp=async(e,t,n)=>{if(n.length===0)return[];let r=TT(n),s;try{s=await K("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw wT(a)?new Ue(a instanceof Error?a.message:String(a)):a}let o=JSON.parse(s.stdout).data?.repository??{};return n.map((a,l)=>{let c=o[`item${l}`],d=bT(c);return{id:a.id,found:d!==null,view:d}})},Zs=async e=>{let t=await J("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:kT(t.stdout.trim())},Bt=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])}},wT=e=>{let t=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return t.includes("rate limit")||t.includes("secondary rate limit")||t.includes("abuse detection")||t.includes("api rate limit exceeded")||t.includes("you have exceeded")},bp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},Da=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],kT=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},TT=e=>`
|
|
17
15
|
query CraigPullRequestBatch($owner: String!, $name: String!) {
|
|
18
16
|
repository(owner: $owner, name: $name) {
|
|
19
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(`
|
|
@@ -67,216 +65,217 @@ fragment PrFields on PullRequest {
|
|
|
67
65
|
}
|
|
68
66
|
}
|
|
69
67
|
}
|
|
70
|
-
`,
|
|
68
|
+
`,bT=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 kn=async(e,t)=>{let n=wn(e,t.artifacts.prStatusPath);n&&(await RT(ST.dirname(n),{recursive:!0}),await q(n,{taskId:t.id,prs:t.prs}))},Lr=async(e,t,n={writeTask:St,writePrStatusArtifact:kn})=>{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},Fr=async(e,t,n,r,s={readRawTask:Rt,validateTaskRecord:je,writeTask:St,writePrStatusArtifact:kn,withTaskLock:Ut})=>s.withTaskLock(e,t.id,async()=>{let i=await s.readRawTask(e,t.id),o=s.validateTaskRecord(i,`${e.tasksDir}/${t.id}.json`),a=o.prs.find(p=>r?.number!==null&&p.number===r?.number)??r,l=It(n,a),c=Pt(o,l),d=o.status==="closed"?o.status:yn(c.prs),u={...c,status:d};return Lr(e,u,s)}),Mr=async(e,t)=>{let n=W(t),r=n?.number?String(n.number):t.branch,s=await Hn(r,t.worktreePath);return Fr(e,t,s,n)},jr=async(e,t)=>{for(let n of await Na(t)){let r=await Yn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Fr(e,t,r,null)}}return{discovered:!1,task:t}},Na=async e=>{let t=await ap(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function qr(e,t,n,r){return Ut(e,t,async()=>{let s=await F(e,t);if(!s.repoTargets?.find(m=>m.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Bt(r.url),a=s.prs.find(m=>o?Bn(m,{owner:o.owner,repo:o.name,number:r.number}):m.number===r.number)??null,l=It(r,a,o??void 0),c=PT(r),d=Pt(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(m=>m.repoId===n?{...m,pullRequest:c}:m)},p={...u,status:u.status==="closed"?u.status:_a(u)};return Lr(e,p)})}function PT(e){let t=Bt(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:IT(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:vT(e.reviewDecision??null),requiredChecks:Sa(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function _a(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 IT=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,vT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var zn=async(e,t,n)=>{let r=n.pullRequest.number?String(n.pullRequest.number):n.branch;if(n.pullRequest.number){let i=await Hn(r,n.worktreePath);return await qr(e,t.id,n.repoId,i),"synced"}let s=await Yn(r,n.worktreePath);return s?(await qr(e,t.id,n.repoId,s),"discovered"):"not_found"};var Ur=async(e,t)=>{let n=await F(e,t),r=W(n);return r?.number?(await vt(n.worktreePath),Wt(r)?(await jr(e,n)).task:Mr(e,n)):n},La=async(e,t)=>{let n=await F(e,t);if(n.type==="project"&&n.repoTargets?.length)return await Jn(e,t),F(e,t);let r=W(n);if(await me(n),await vt(n.worktreePath),!r?.number||Wt(r)){let i=await jr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Mr(e,n)},Jn=async(e,t)=>{let n=await F(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await vt(i.worktreePath);let o=i.pullRequest.number?await zn(e,n,i):await zn(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},Fa=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=xa(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p={id:`${i.id}:${u.repoId}`,task:i,targetRepoId:u.repoId,worktreePath:u.worktreePath,selector:u.pullRequest.number?String(u.pullRequest.number):u.branch,mode:u.pullRequest.number?"number":"head",fallbackSelectors:[]};await Rp(r,p).catch(async()=>{try{await vt(u.worktreePath);let m=u.pullRequest.number?await zn(e,i,u):await zn(e,i,u);ei(o,m,u.pullRequest.number??null,u.pullRequest.url??null)}catch(m){if(m instanceof Ue)throw m;s.push(m)}})}continue}let a=W(i),l=a?.number&&!Wt(a),c=l?[]:await Na(i),d={id:i.id,task:i,worktreePath:i.worktreePath,selector:l?String(a.number):c[0]??i.branch,mode:l?"number":"head",fallbackSelectors:l?[]:c.slice(1)};await Rp(r,d).catch(async()=>{try{let{disposition:u,task:p}=await ti(e,i.id),m=W(p);ei(o,u,m?.number??null,m?.url??null)}catch(u){if(u instanceof Ue)throw u;s.push(u)}})}for(let i of r.values())try{await vt(i.worktreePath);let o=await Tp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=xa(n,l.task),u=a.get(l.id)?.view??await CT(i.worktreePath,l);if(!u){ei(c,"not_found",null,null);continue}if(l.targetRepoId)await qr(e,l.task.id,l.targetRepoId,u);else{let p=await Rt(e,l.task.id),m=je(p,`${e.tasksDir}/${l.task.id}.json`);await Fr(e,m,u,l.mode==="number"?W(m):null)}ei(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof Ue)throw o;s.push(o)}return AT(s),t.map(i=>xa(n,i))},ti=async(e,t)=>{let n=await F(e,t);await me(n),await vt(n.worktreePath);let r=W(n);if(r?.number&&!Wt(r))return{disposition:"synced",task:await Mr(e,n)};let s=await jr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},CT=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Yn(n,e);if(r)return r}return null},Rp=async(e,t)=>{let n=await Zs(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]})},xa=(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):!!W(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},ei=(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},AT=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var Ma=async(e,t)=>{let n=await F(e,t);try{n.type==="project"&&n.repoTargets?.length?(await Jn(e,t),n=await F(e,t)):n.prs.some(s=>s.number)&&(n=await Ur(e,t))}catch{}let r=await Ar(e,n);return{kind:"showTask",task:n,inspection:r}};var ja=async(e,t)=>{let n=await F(e,t);if(await me(n),(await K("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await ET(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},ET=async e=>{let t=[],n=await K("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await OT(e);for(let s of r){let i=await J("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
|
|
71
69
|
|
|
72
|
-
`)},
|
|
73
|
-
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as ub}from"node:child_process";import{access as pb}from"node:fs/promises";var Wa=async(e,t)=>{let n=await L(e,t),r=Hn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await pb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},Ba=async e=>{await new Promise((t,n)=>{let r=!1,s=ub("tail",["-n","+1","-f",e],{stdio:"inherit"}),i=()=>{r=!0,s.kill("SIGINT")};process.on("SIGINT",i),s.on("error",a=>{o(),n(a)}),s.on("exit",(a,l)=>{if(o(),r||l==="SIGINT"){t();return}if(a===0){t();return}n(new Error(`tail -n +1 -f ${e} failed with exit code ${a??"unknown"}.`))});function o(){process.off("SIGINT",i)}})};import{mkdir as fb}from"node:fs/promises";import mb from"node:path";var Va=async(e,t)=>{let n=await L(e,t);if(await me(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await ti(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await W(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await G("sh",["-lc",a],{cwd:n.worktreePath}),u=new Date().toISOString(),d=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:u,exitCode:d}),d!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,m=await W(e,n.id,g=>({...g,status:"review",checks:{...g.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await qp(e,m),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await W(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await qp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},qp=async(e,t)=>{let n=kn(e,t.artifacts.checkSummaryPath);n&&(await fb(mb.dirname(n),{recursive:!0}),await M(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var Ka=async(e,t)=>{let n=await L(e,t);await me(n);let r=await ti(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.prompt.value.trim();await dp(n.worktreePath),await up(n.worktreePath,s);let i=await pp(n.worktreePath),o=new Date().toISOString(),a=await W(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as gb}from"node:fs/promises";var Ga=async(e,t)=>{let n=await L(e,t),r=await hb(n.worktreePath);return W(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},hb=async e=>{try{return await gb(e),!0}catch{return!1}};var Ha=async(e,t,n)=>{let r=[],s=null,i=null;try{if(t.sessionId){let o=await Wt(e,t.sessionId);await Ap(e.repoRoot,o.sessionName),s=new Date().toISOString()}}catch(o){r.push(o instanceof Error?o.message:"Failed to close tmux session.")}if(!n.preserveWorktree)try{await mp(e.repoRoot,t.worktreePath),i=new Date().toISOString()}catch(o){r.push(o instanceof Error?o.message:"Failed to remove worktree.")}await W(e,t.id,o=>({...o,cleanup:{...o.cleanup,paneClosedAt:s??o.cleanup.paneClosedAt,worktreeRemovedAt:i??o.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Ya=async(e,t,n)=>{let r=await Ue(e,n),s=await W(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},za=async(e,t)=>{let n=await L(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>Ue(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};var Ja=async(e,t)=>{let n=await L(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session to attach.`);let[r,s]=await Promise.all([Ue(e,n.repoId),Wt(e,n.sessionId)]),i=await qr.attach(e,s,r.rootPath);return{kind:"attachTask",taskId:n.id,sessionId:i.id,disposition:"attached"}};var Xa=async(e,t)=>{let n=await L(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session.`);let r=await Wt(e,n.sessionId).catch(s=>{throw yb(s)?new Error(`Task ${n.id} does not have a Craig session.`):s});if(!r.paneId)throw new Error(`Task ${n.id} does not have a tmux target.`);return await si(e.repoRoot,r.paneId,r.windowTarget,r.sessionName),{kind:"focusTask",taskId:n.id,tmuxTarget:r.paneId}},yb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";import{spawn as wb}from"node:child_process";var Qa=async(e,t)=>{let n=await L(e,t);await me(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await kb(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},kb=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=wb(s,i,{cwd:t,stdio:"inherit"});o.on("error",r),o.on("exit",a=>{if(a===0){n();return}r(new Error(`${e.join(" ")} failed with exit code ${a??"unknown"}.`))})})};var Za=async(e,t,n)=>{await W(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},el=async(e,t,n)=>W(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),tl=async(e,t)=>W(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});import{realpath as Wp}from"node:fs/promises";import Hr from"node:path";async function rl(e,t){if(t.explicitTaskId!==void 0){let l=await Up(e,t.explicitTaskId,"explicit");return nl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Up(e,t.environmentTaskId,"environment");return nl(l,"environment",t.environmentAgentTabId)}let n=await Wp(t.cwd).catch(()=>Hr.resolve(t.cwd)),r=await Fr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await bb(l,n)})))).filter(l=>l.matches).map(l=>l.task),o=[...new Map(i.map(l=>[l.id,l])).values()];if(o.length>1)throw new h("TASK_CONTEXT_AMBIGUOUS",`Multiple Craig tasks match ${n}: ${o.map(l=>l.id).join(", ")}. Use --task <id>.`,{details:{cwd:n,taskIds:o.map(l=>l.id)}});let a=o[0];if(a)return nl(a,"cwd",t.environmentAgentTabId);if(t.environmentAgentTabId!==void 0)throw new h("TASK_CONTEXT_CONFLICT",`CRAIG_AGENT_TAB_ID is set to ${t.environmentAgentTabId}, but no task context could be resolved.`,{details:{agentTabId:t.environmentAgentTabId}});if(t.required)throw new h("TASK_CONTEXT_NOT_FOUND",`No Craig task was found from ${n}. Use --task <id> or run the command inside a task worktree.`,{details:{cwd:n}});return null}async function Up(e,t,n){try{return await L(e,t)}catch(r){throw!(r instanceof h)||r.code!=="TASK_NOT_FOUND"?r:new h("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function nl(e,t,n){let r=n??null;if(r!==null){let s=e.ptyTabs.find(i=>i.id===r);if(!s||s.kind!=="agent")throw new h("TASK_CONTEXT_CONFLICT",`Agent tab ${r} does not belong to Craig task ${e.id}.`,{details:{taskId:e.id,agentTabId:r}})}return{task:e,source:t,agentTabId:r}}function Tb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function bb(e,t){return(await Promise.all(Tb(e).map(r=>Wp(r).catch(()=>Hr.resolve(r))))).some(r=>Rb(r,t))}function Rb(e,t){let n=Hr.relative(Hr.resolve(e),t);return n===""||!n.startsWith("..")&&!Hr.isAbsolute(n)}var sl=async(e,t,n="merge",r)=>{let s=await L(e,t),i=r??V(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await _p(s.worktreePath,i,n)};var Yr={readTask:L,writeTask:St,withTaskLock:qt,ensureGhAuthenticated:vt,fetchPrView:Jn,discoverPrView:Fp,getGitHubRepositoryLocator:ii,writePrStatusArtifact:Pn};async function ol(e,t,n,r=Yr){let s=await r.readTask(e,t),i=await Pb(s,n,r);return Kt(s,i,"showTaskPr","shown",[])}async function al(e,t,n,r=Yr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await pl(s,n,null,r);await fl(i,r);let o=await ci(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Kt(s,i,"discoverTaskPr","not_found",[]);ml(o,i);let a=di(s,i,o.number),l=await gl(e,s,i,o,r);return Kt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function ll(e,t,n,r,s=Yr){let i=ul(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await pl(o,r,i.repository,s);Vp(i.repository,a),await fl(a,s);let l=await ci(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Ib(l,i),ml(l,a);let c=di(o,a,l.number),u=hl(o,a),d=u&&!Gn(u,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&u.status!=="closed"&&u.status!=="merged"?[`Pull request #${l.number} becomes active; #${u.number} remains in task history.`]:[],p=await gl(e,o,a,l,s);return Kt(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function Sb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);let o=e.prs.find(a=>a.number===n.number)??V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await li(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw er(e,t);let a=Bp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await li(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new h("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&dt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new h("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function cl(e,t,n,r=Yr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await pl(s,n,null,r),o=hl(s,i);if(!o?.number)return Kt(s,i,"refreshTaskPr","not_found",[]);await fl(i,r);let a=await ci(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));ml(a,i);let l=await gl(e,s,i,a,r);return Kt(l,i,"refreshTaskPr","synced",[])})}async function dl(e,t,n,r,s=Yr){let i=ul(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Sb(o,r,i,s);if(Vp(i.repository,a),!di(o,a,i.number))return Kt(o,a,"unlinkTaskPr","unchanged",[]);let c=vb(o,a,i.number),u=await Gp(e,c,s);return Kt(u,a,"unlinkTaskPr","unlinked",[])})}function ul(e){let t=e.trim(),n=Vt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new h("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function pl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);return il(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw er(e,t);return il(o.repoId,o.branch,o.worktreePath,o,r)}if(!n)throw new h("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:s.map(o=>o.repoId)}});let i=[];for(let o of s){let a=await il(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof h&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&dt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new h("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function Pb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);let s=V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await li(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new h("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw er(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await li(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function li(e,t,n,r){let s=Bp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Bp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Vt(e.url):null}async function il(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new h("EXTERNAL_DEPENDENCY_FAILED",`Repo ${e} does not have a supported GitHub origin remote.`,{details:{repoId:e,worktreePath:n}});return{repoId:e,branch:t,worktreePath:n,repository:i,projectTarget:r}}async function fl(e,t){await ci("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function ci(e,t){try{return await t()}catch(n){throw n instanceof h?n:new h("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function Vp(e,t){if(e&&!dt(e,t.repository))throw Kp(e,t)}function Ib(e,t){let n=Vt(e.url);if(!n||n.number!==t.number)throw new h("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!dt(t.repository,n))throw new h("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function ml(e,t){let n=Vt(e.url);if(!n||!dt(n,t.repository))throw Kp(n,t);if(e.headRefName!==t.branch)throw new h("PR_BRANCH_MISMATCH",`Pull request #${e.number} uses head branch ${e.headRefName}, not task branch ${t.branch}.`,{details:{repoId:t.repoId,pullRequestNumber:e.number,expectedBranch:t.branch,actualBranch:e.headRefName}})}function Kp(e,t){return new h("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function er(e,t){return new h("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function dt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function gl(e,t,n,r,s){let i=di(t,n,r.number),o=It(r,i,n.repository),a=Pt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:zp(o)}:l)}),Gp(e,a,s)}function vb(e,t,n){let r=e.prs.filter(i=>!Yp(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Hp(r.filter(o=>o.owner&&o.repo&&dt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?zp(i):Ab(t.repository)}:o)}}return s}async function Gp(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?Fa(t):wn(t.prs),s={...t,status:r};return Ur(e,s,n)}function di(e,t,n){return yl(e,t).find(r=>Yp(r,t,n))??null}function hl(e,t){if(!t.projectTarget)return V(e);let n=yl(e,t);return Hp(n)}function Hp(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function yl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&dt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?Cb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function Yp(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||dt({owner:e.owner,name:e.repo},t.repository)}function Kt(e,t,n,r,s){let i=yl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:hl(e,t),warnings:s}}function zp(e){return{provider:"github",owner:e.owner,repo:e.repo,number:e.number,url:e.url,baseBranch:e.baseBranch,headBranch:e.headBranch,status:e.status==="draft"?"open":e.status,draft:e.draft,mergeable:e.mergeable,mergeStateStatus:e.mergeStateStatus,reviewDecision:e.reviewDecision??null,requiredChecks:e.requiredChecks,comments:e.comments??[],lastSyncedAt:e.lastSyncedAt,lastSyncedHeadSha:e.lastSyncedHeadSha}}function Cb(e,t){return{provider:"github",owner:e.owner??t.owner,repo:e.repo??t.name,number:e.number,url:e.url,title:null,status:e.draft?"draft":e.status,draft:e.draft??!1,baseBranch:e.baseBranch,headBranch:e.headBranch,mergeable:e.mergeable,mergeStateStatus:e.mergeStateStatus,reviewDecision:e.reviewDecision??null,requiredChecks:e.requiredChecks,comments:e.comments??[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:e.lastSyncedAt,lastSyncedHeadSha:e.lastSyncedHeadSha}}function Ab(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var R={listTasks:Fr,getTask:L,provisionTask:zn,provisionProjectTask:Mr,createTask:Na,showTask:qa,showTaskDiff:Ua,prepareTaskLogs:Wa,streamTaskLogs:Ba,runChecks:Va,commitTask:Ka,closeTask:Ga,cleanupTask:Ha,addTaskLink:Ya,listTaskLinks:za,sortTasksForDisplay:Ia,resolveSelectedTaskId:va,allocateTaskId:Pa,allocateTaskIdForRepo:Yn,allocateProjectTaskId:_r,createDefaultTaskPtyTabs:jr,assertTaskWorktreeExists:me,resolveTaskLogPath:Hn,buildTaskInspection:xr,resolveArtifactPath:kn,attachTask:Ja,focusTask:Xa,openTask:Qa,markRunnerFailed:Za,recordStartupFailure:el,markTaskStarted:tl,resolveContext:rl,prs:{refresh:Gr,refreshChecks:Ma,discoverOrRefresh:ai,discoverOrRefreshAll:Zn,discoverOrRefreshMany:ja,show:ol,discover:al,link:ll,refreshAssociation:cl,unlink:dl,merge:sl,getPrimaryPr:V,isPrTerminal:Ut,isMergeReady:ei,deriveTaskStatus:wn,upsertPr:Pt,normalizePr:It,summarizeRequiredChecks:Ta,writePrStatusArtifact:Pn}};var Jp={idle:0,ready:1,working:2,error:3};function Ct(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Gt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ct(t,n,r,i)}function tr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Gt(e,s.id,t,n);Jp[i]>Jp[r]&&(r=i)}return r}function ui(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ct(s.id,t,n)==="working"))}function ut(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=Gt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:tr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function wl(e,t,n){let r=n.now??Date.now;if(n.tabId&&!e.ptyTabs.some(l=>l.kind==="agent"&&l.id===n.tabId))throw new h("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:n.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=r()+n.timeoutMs;try{for(;;){let l=r(),c=ut([e],t.getSnapshots(),l),u=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw Xp(e.id);let d=a-r();if(d<=0)throw Eb(e.id,n.states,n.timeoutMs);let p=s;await new Promise((m,g)=>{let f=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),m()},y=()=>{clearTimeout(T),g(Xp(e.id))},T=setTimeout(f,d);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var Eb=(e,t,n)=>new h("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),Xp=e=>new h("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Db}from"node:net";import{createHash as Ob}from"node:crypto";import{tmpdir as $b}from"node:os";import Qp from"node:path";var Ht=9;function pt(e){let t=Ob("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Qp.join($b(),`craig-${t}.sock`),pidPath:Qp.join(e.runtimeDir,"pty-daemon.pid")}}async function Zp(e){let t=null;try{let n=await Nb(pt(e.paths).socketPath);return t=new Tl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Tl=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Ht)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
|
|
70
|
+
`)},OT=async e=>(await K("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
|
|
71
|
+
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as $T}from"node:child_process";import{access as DT}from"node:fs/promises";var qa=async(e,t)=>{let n=await F(e,t),r=Vn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await DT(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},Ua=async e=>{await new Promise((t,n)=>{let r=!1,s=$T("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 NT}from"node:fs/promises";import _T from"node:path";var Wa=async(e,t)=>{let n=await F(e,t);if(await me(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await Js(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 V(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await J("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,m=await V(e,n.id,h=>({...h,status:"review",checks:{...h.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Sp(e,m),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await V(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 Sp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Sp=async(e,t)=>{let n=wn(e,t.artifacts.checkSummaryPath);n&&(await NT(_T.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 Ba=async(e,t)=>{let n=await F(e,t);await me(n);let r=await Js(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.prompt.value.trim();await sp(n.worktreePath),await ip(n.worktreePath,s);let i=await op(n.worktreePath),o=new Date().toISOString(),a=await V(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 xT}from"node:fs/promises";var Va=async(e,t)=>{let n=await F(e,t),r=await LT(n.worktreePath);return V(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},LT=async e=>{try{return await xT(e),!0}catch{return!1}};var Ka=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await lp(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await V(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Ga=async(e,t,n)=>{let r=await ut(e,n),s=await V(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}},Ha=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>ut(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{spawn as FT}from"node:child_process";var Ya=async(e,t)=>{let n=await F(e,t);await me(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await MT(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},MT=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=FT(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 Ip}from"node:fs/promises";import Wr from"node:path";async function Ja(e,t){if(t.explicitTaskId!==void 0){let l=await Pp(e,t.explicitTaskId,"explicit");return za(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Pp(e,t.environmentTaskId,"environment");return za(l,"environment",t.environmentAgentTabId)}let n=await Ip(t.cwd).catch(()=>Wr.resolve(t.cwd)),r=await Or(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await qT(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 za(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 Pp(e,t,n){try{return await F(e,t)}catch(r){throw!(r instanceof g)||r.code!=="TASK_NOT_FOUND"?r:new g("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function za(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 jT(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function qT(e,t){return(await Promise.all(jT(e).map(r=>Ip(r).catch(()=>Wr.resolve(r))))).some(r=>UT(r,t))}function UT(e,t){let n=Wr.relative(Wr.resolve(e),t);return n===""||!n.startsWith("..")&&!Wr.isAbsolute(n)}var Xa=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??W(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await wp(s.worktreePath,i,n)};var Br={readTask:F,writeTask:St,withTaskLock:Ut,ensureGhAuthenticated:vt,fetchPrView:Hn,discoverPrView:kp,getGitHubRepositoryLocator:Zs,writePrStatusArtifact:kn};async function Za(e,t,n,r=Br){let s=await r.readTask(e,t),i=await BT(s,n,r);return Vt(s,i,"showTaskPr","shown",[])}async function el(e,t,n,r=Br){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await il(s,n,null,r);await ol(i,r);let o=await ri(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Vt(s,i,"discoverTaskPr","not_found",[]);al(o,i);let a=si(s,i,o.number),l=await ll(e,s,i,o,r);return Vt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function tl(e,t,n,r,s=Br){let i=sl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await il(o,r,i.repository,s);Cp(i.repository,a),await ol(a,s);let l=await ri(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));VT(l,i),al(l,a);let c=si(o,a,l.number),d=cl(o,a),u=d&&!Bn(d,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&d.status!=="closed"&&d.status!=="merged"?[`Pull request #${l.number} becomes active; #${d.number} remains in task history.`]:[],p=await ll(e,o,a,l,s);return Vt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function WT(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);let o=e.prs.find(a=>a.number===n.number)??W(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ni(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw Xn(e,t);let a=vp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ni(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&dt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function nl(e,t,n,r=Br){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await il(s,n,null,r),o=cl(s,i);if(!o?.number)return Vt(s,i,"refreshTaskPr","not_found",[]);await ol(i,r);let a=await ri(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));al(a,i);let l=await ll(e,s,i,a,r);return Vt(l,i,"refreshTaskPr","synced",[])})}async function rl(e,t,n,r,s=Br){let i=sl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await WT(o,r,i,s);if(Cp(i.repository,a),!si(o,a,i.number))return Vt(o,a,"unlinkTaskPr","unchanged",[]);let c=KT(o,a,i.number),d=await Ep(e,c,s);return Vt(d,a,"unlinkTaskPr","unlinked",[])})}function sl(e){let t=e.trim(),n=Bt(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 il(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);return Qa(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 Xn(e,t);return Qa(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 Qa(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&dt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function BT(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);let s=W(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ni(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 Xn(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ni(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ni(e,t,n,r){let s=vp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function vp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Bt(e.url):null}async function Qa(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 ol(e,t){await ri("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function ri(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 Cp(e,t){if(e&&!dt(e,t.repository))throw Ap(e,t)}function VT(e,t){let n=Bt(e.url);if(!n||n.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!dt(t.repository,n))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function al(e,t){let n=Bt(e.url);if(!n||!dt(n,t.repository))throw Ap(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 Ap(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 Xn(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function dt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function ll(e,t,n,r,s){let i=si(t,n,r.number),o=It(r,i,n.repository),a=Pt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:Dp(o)}:l)}),Ep(e,a,s)}function KT(e,t,n){let r=e.prs.filter(i=>!$p(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Op(r.filter(o=>o.owner&&o.repo&&dt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?Dp(i):HT(t.repository)}:o)}}return s}async function Ep(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?_a(t):yn(t.prs),s={...t,status:r};return Lr(e,s,n)}function si(e,t,n){return ul(e,t).find(r=>$p(r,t,n))??null}function cl(e,t){if(!t.projectTarget)return W(e);let n=ul(e,t);return Op(n)}function Op(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function ul(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&dt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?GT(r.pullRequest,t.repository):null;return s&&!n.some(i=>Bn(i,s))?[...n,s]:n}function $p(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||dt({owner:e.owner,name:e.repo},t.repository)}function Vt(e,t,n,r,s){let i=ul(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:cl(e,t),warnings:s}}function Dp(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 GT(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 HT(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:Or,getTask:F,provisionTask:Gn,provisionProjectTask:Dr,createTask:$a,showTask:Ma,showTaskDiff:ja,prepareTaskLogs:qa,streamTaskLogs:Ua,runChecks:Wa,commitTask:Ba,closeTask:Va,cleanupTask:Ka,addTaskLink:Ga,listTaskLinks:Ha,sortTasksForDisplay:Ca,resolveSelectedTaskId:Aa,allocateTaskId:va,allocateTaskIdForRepo:Kn,allocateProjectTaskId:Er,createDefaultTaskPtyTabs:Nr,assertTaskWorktreeExists:me,resolveTaskLogPath:Vn,buildTaskInspection:Ar,resolveArtifactPath:wn,openTask:Ya,markRunnerFailed:Oa,recordStartupFailure:_r,markTaskStarted:xr,resolveContext:Ja,prs:{refresh:Ur,refreshChecks:La,discoverOrRefresh:ti,discoverOrRefreshAll:Jn,discoverOrRefreshMany:Fa,show:Za,discover:el,link:tl,refreshAssociation:nl,unlink:rl,merge:Xa,getPrimaryPr:W,isPrTerminal:Wt,isMergeReady:zs,deriveTaskStatus:yn,upsertPr:Pt,normalizePr:It,summarizeRequiredChecks:Ra,writePrStatusArtifact:kn}};var Np={idle:0,ready:1,working:2,error:3};function Ct(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Kt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ct(t,n,r,i)}function Qn(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Kt(e,s.id,t,n);Np[i]>Np[r]&&(r=i)}return r}function ii(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ct(s.id,t,n)==="working"))}function pt(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=Kt(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:Qn(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function dl(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=pt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw _p(e.id);let u=a-r();if(u<=0)throw YT(e.id,n.states,n.timeoutMs);let p=s;await new Promise((m,h)=>{let f=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),m()},y=()=>{clearTimeout(T),h(_p(e.id))},T=setTimeout(f,u);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var YT=(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}}),_p=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as QT}from"node:net";import{createHash as zT}from"node:crypto";import{tmpdir as JT}from"node:os";import xp from"node:path";var Vr=9,XT=new Set([6,7,8,Vr]);function Gt(e){return e!==void 0&&XT.has(e)}function Je(e){let t=zT("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:xp.join(JT(),`craig-${t}.sock`),pidPath:xp.join(e.runtimeDir,"pty-daemon.pid")}}async function Lp(e){let t=null;try{let n=await ZT(Je(e.paths).socketPath);return t=new fl(n,e),await t.ready(),t}catch{return t?.close(),null}}var fl=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Vr)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
|
|
74
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(`
|
|
75
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(`
|
|
76
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="activity"?(this.recordSnapshot(n.snapshot),this.options.onActivity?.(n.snapshot)):n.type==="activityRemoved"&&(this.removeSnapshot(n.tabId),this.options.onActivityRemoved?.(n.tabId))}replaceSnapshots(t,n){let r=new Map;for(let[s,i]of this.revisionByTabId)i>n&&r.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of r)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let n of this.snapshots.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(r),this.options.onActivity?.(r)}this.options.onDaemonClose?.()}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}};function Nb(e){return new Promise((t,n)=>{let r=Db(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Rl={openObserver:tf,listTasks:e=>R.listTasks(e),getTask:(e,t)=>R.getTask(e,t),now:Date.now};async function xb(e,t,n=Rl){let r=await ef(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...ut(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function _b(e,t,n=Rl){let r=await ef(e,t.taskId,n),s=await n.openObserver(e);try{let i=ut(r,s.getSnapshots(),n.now()),o=t.tabId?i.agents.filter(l=>l.tabId===t.tabId):i.agents;if(t.tabId&&o.length===0)throw new h("TASK_CONTEXT_NOT_FOUND",`Agent tab ${t.tabId} was not found${t.taskId?` in task ${t.taskId}`:""}.`,{details:{taskId:t.taskId??null,tabId:t.tabId}});let a=new Set(o.map(l=>l.taskId));return{kind:"showAgentStatus",agents:o,tasks:t.tabId?i.tasks.filter(l=>a.has(l.taskId)):i.tasks,daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function Fb(e,t,n,r=Rl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await wl(s,i,{...n,now:r.now})}finally{i.close()}}async function ef(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function tf(e){return bl.open(e)}async function Lb(e){return tf(e)}var bl=class e{listeners=new Set;snapshots=new Map;client=null;reconnectTimer=null;reconnectDelayMs=250;closed=!1;paths;constructor(t){this.paths=t}static async open(t){let n=new e(t);return await n.connect(),n}get daemonAvailable(){return this.client!==null}getSnapshots(){return[...this.snapshots.values()]}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}close(){this.closed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.client?.close(),this.client=null}async connect(){if(this.closed)return;let t=await Zp({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},At={listAgents:xb,showAgentStatus:_b,waitForTask:Fb,openObserver:Lb};import{randomUUID as sR}from"node:crypto";import{mkdir as Pf,open as Nl,readdir as xl,readFile as Zr,rm as iR,stat as oR}from"node:fs/promises";import hi from"node:path";import{createHash as Wb}from"node:crypto";import{mkdir as zr,readdir as Il,readFile as Jr,writeFile as Bb}from"node:fs/promises";import Be from"node:path";import{mkdir as nf,readFile as Mb,rm as Sl,stat as jb,writeFile as qb}from"node:fs/promises";import Pl from"node:path";async function nr(e,t){let n=Pl.join(e.runtimeDir,"fury-store.lock");await nf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await nf(n);try{await qb(Pl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Sl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!rf(s,"EEXIST"))throw s;let i=await Mb(Pl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await jb(n).catch(()=>null);if(typeof i?.pid=="number"&&!Ub(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Sl(n,{recursive:!0,force:!0});continue}if(Date.now()-r>3e4)throw new h("OPERATION_TIMEOUT","Timed out waiting for the fury store lock.",{retryable:!0});await new Promise(a=>setTimeout(a,20))}try{return await t()}finally{await Sl(n,{recursive:!0,force:!0})}}function Ub(e){try{return process.kill(e,0),!0}catch(t){return rf(t,"EPERM")}}var rf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ge=e=>({root:Be.join(e.craigDir,"fury"),definitions:Be.join(e.craigDir,"fury","definitions"),plans:Be.join(e.craigDir,"fury","plans"),approvals:Be.join(e.craigDir,"fury","approvals"),runs:Be.join(e.craigDir,"fury","runs"),reviews:Be.join(e.craigDir,"fury","reviews")});function vl(e){return Wb("sha256").update(JSON.stringify(e)).digest("hex")}async function of(e,t,n){let r=ge(e);await zr(r.definitions,{recursive:!0});let s=Be.join(r.definitions,`${t}.yaml`);await Bb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Yt(i,"EEXIST"))throw i})}async function af(e,t){return nr(e,async()=>{let n=await lf(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await zr(ge(e).plans,{recursive:!0}),await M(wf(e,i.id),i),i})}async function pi(e,t){mi(t,"plan");try{return Vb(JSON.parse(await Jr(wf(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new h("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function lf(e){let t=ge(e).plans,n=await Il(t).catch(s=>Yt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>pi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function cf(e){let t=await lf(e),n=await Promise.all(t.map(s=>El(e,s.id))),r=new Map;for(let[s,i]of t.entries())n[s]===null&&r.set(`${i.rootTaskId}\0${i.sourceFile}`,i);return[...r.values()].sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function df(e,t){return nr(e,async()=>{let n=await El(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new h("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await zr(ge(e).approvals,{recursive:!0}),await M(kf(e,t.planId),t),{approval:t,created:!0}})}async function uf(e,t){mi(t,"plan");let n=await El(e,t);if(!n)throw new h("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function pf(e,t){return nr(e,async()=>{let r=(await mf(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new h("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await zr(ge(e).runs,{recursive:!0}),await M(Cl(e,t.id),t),{run:t,created:!0}})}async function de(e,t){mi(t,"run");try{return hf(JSON.parse(await Jr(Cl(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new h("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function ff(e){return mf(e)}async function mf(e){let t=ge(e).runs,n=await Il(t).catch(s=>Yt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return hf(JSON.parse(await Jr(Be.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ke(e,t,n){return nr(e,async()=>{let r=await de(e,t),s=n(r);if(s.id!==t)throw new h("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await M(Cl(e,t),s),s})}async function gf(e,t){await zr(ge(e).reviews,{recursive:!0}),await M(Al(e,t.id),t)}async function Xr(e,t,n){return nr(e,async()=>{let r=await rr(e,t),s=n(r);if(s.id!==t)throw new h("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await M(Al(e,t),s),s})}async function rr(e,t){mi(t,"review");try{return Kb(JSON.parse(await Jr(Al(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new h("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function fi(e){let t=ge(e).reviews,n=await Il(t).catch(r=>Yt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rr(e,r.slice(0,-5))))}function hf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planId!="string"||!/^fury_plan_[A-Za-z0-9_-]+$/.test(e.planId)||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!n.includes(String(e.state))||!Ae(e.inputs)||!yf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!Gb(e.stepRuns,e.order)||!Qr(e.actor)||!Ve(e.createdAt)||!Ve(e.updatedAt)||!Ve(e.stateChangedAt)||!Ve(e.deadlineAt)||e.completedAt!==null&&!Ve(e.completedAt))throw new h("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function Vb(e,t){if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!Ae(e.inputs)||!yf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||!Array.isArray(e.waves)||e.waves.some(r=>!Array.isArray(r)||r.some(s=>typeof s!="string"))||!Array.isArray(e.steps)||e.steps.length!==e.order.length||!Qr(e.createdBy)||!Ve(e.createdAt))throw new h("FURY_RECORD_INVALID",`Fury plan record ${t} is invalid.`,{});let n={...e};if(delete n.id,delete n.planHash,delete n.createdBy,delete n.createdAt,vl(n)!==e.planHash)throw new h("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function Kb(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!Ae(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Ve(e.requestedAt)||!Ve(e.deadlineAt)||!Ve(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!sf(r))||e.lastDecision!==null&&!sf(e.lastDecision))throw new h("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function Gb(e,t){return Ae(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&Hb(e[n],n))}function Hb(e,t){return!Ae(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!Ae(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Ve(n))&&(e.completedBy===null||Qr(e.completedBy))}function sf(e){return Ae(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&Qr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ve(e.occurredAt)}function yf(e){return Ae(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function Qr(e){return Ae(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}var Cl=(e,t)=>Be.join(ge(e).runs,`${t}.json`),wf=(e,t)=>Be.join(ge(e).plans,`${t}.json`),kf=(e,t)=>Be.join(ge(e).approvals,`${t}.json`),Al=(e,t)=>Be.join(ge(e).reviews,`${t}.json`),mi=(e,t)=>{if(!(t==="plan"?/^fury_plan_[A-Za-z0-9_-]+$/:t==="run"?/^fury_[A-Za-z0-9_-]+$/:/^review_[A-Za-z0-9_-]+$/).test(e))throw new h("CLI_USAGE",`Invalid fury ${t} id "${e}".`,{})};async function El(e,t){try{let n=JSON.parse(await Jr(kf(e,t),"utf8"));if(!Ae(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Qr(n.approvedBy)||!Ae(n.approvedBy)||n.approvedBy.type!=="human"||!Ve(n.approvedAt))throw new h("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Yt(n,"ENOENT"))return null;throw n}}var Ae=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ve=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Yt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Tf,readFile as Yb,rm as gi,stat as zb,writeFile as Jb}from"node:fs/promises";import Ol from"node:path";var Xb=20,Qb=3e4,Zb=5e3;async function bf(e,t){let n=Ol.join(e.runtimeDir,"event-journal.lock");await Tf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Tf(n);try{await Jb(Ol.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await gi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!nR(s))throw s;if(await eR(n))continue;if(Date.now()-r>=Qb)throw new h("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await rR(Xb)}try{return await t()}finally{await gi(n,{recursive:!0,force:!0})}}async function eR(e){let t=await Yb(Ol.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return tR(t.pid)?!1:(await gi(e,{recursive:!0,force:!0}),!0);let n=await zb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Zb?!1:(await gi(e,{recursive:!0,force:!0}),!0)}function tR(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var nR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",rR=e=>new Promise(t=>setTimeout(t,e));var aR=256*1024,lR=16,cR=64*1024;async function Ne(e,t,n={}){let r=Dl(n.maxSegmentBytes??aR,"Event journal segment size"),s=Dl(n.maxSegments??lR,"Event journal retention"),i=Dl(n.maxRecordBytes??cR,"Event record size");return bf(e,async()=>{await Pf(e.eventsDir,{recursive:!0}),await gR(e);let o=await _l(e),a=t.id??sR(),l=o.events.find(y=>y.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,u={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,furyRunId:t.furyRunId??null,furyStepId:t.furyStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:wR(t.data)},d=`${JSON.stringify(u)}
|
|
77
|
-
`;if(Buffer.byteLength(
|
|
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 ZT(e){return new Promise((t,n)=>{let r=QT(e);r.once("connect",()=>t(r)),r.once("error",n)})}var hl={openObserver:Mp,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function eb(e,t,n=hl){let r=await Fp(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...pt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function tb(e,t,n=hl){let r=await Fp(e,t.taskId,n),s=await n.openObserver(e);try{let i=pt(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 nb(e,t,n,r=hl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await dl(s,i,{...n,now:r.now})}finally{i.close()}}async function Fp(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Mp(e){return ml.open(e)}async function rb(e){return Mp(e)}var ml=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 Lp({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},At={listAgents:eb,showAgentStatus:tb,waitForTask:nb,openObserver:rb};import{randomUUID as Pb}from"node:crypto";import{mkdir as af,open as vl,readdir as Cl,readFile as zr,rm as Ib,stat as vb}from"node:fs/promises";import ui from"node:path";import{createHash as lb}from"node:crypto";import{mkdir as Kr,readdir as wl,readFile as Gr,writeFile as cb}from"node:fs/promises";import We from"node:path";import{mkdir as jp,readFile as sb,rm as gl,stat as ib,writeFile as ob}from"node:fs/promises";import yl from"node:path";async function Zn(e,t){let n=yl.join(e.runtimeDir,"fury-store.lock");await jp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await jp(n);try{await ob(yl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await gl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!qp(s,"EEXIST"))throw s;let i=await sb(yl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await ib(n).catch(()=>null);if(typeof i?.pid=="number"&&!ab(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await gl(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 gl(n,{recursive:!0,force:!0})}}function ab(e){try{return process.kill(e,0),!0}catch(t){return qp(t,"EPERM")}}var qp=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var he=e=>({root:We.join(e.craigDir,"fury"),definitions:We.join(e.craigDir,"fury","definitions"),plans:We.join(e.craigDir,"fury","plans"),approvals:We.join(e.craigDir,"fury","approvals"),runs:We.join(e.craigDir,"fury","runs"),reviews:We.join(e.craigDir,"fury","reviews")});function kl(e){return lb("sha256").update(JSON.stringify(e)).digest("hex")}async function Wp(e,t,n){let r=he(e);await Kr(r.definitions,{recursive:!0});let s=We.join(r.definitions,`${t}.yaml`);await cb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Ht(i,"EEXIST"))throw i})}async function Bp(e,t){return Zn(e,async()=>{let n=await Vp(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 Kr(he(e).plans,{recursive:!0}),await q(ef(e,i.id),i),i})}async function oi(e,t){li(t,"plan");try{return ub(JSON.parse(await Gr(ef(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Vp(e){let t=he(e).plans,n=await wl(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>oi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Kp(e){let t=await Vp(e),n=await Promise.all(t.map(s=>Rl(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 Gp(e,t){return Zn(e,async()=>{let n=await Rl(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await Kr(he(e).approvals,{recursive:!0}),await q(tf(e,t.planId),t),{approval:t,created:!0}})}async function Hp(e,t){li(t,"plan");let n=await Rl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Yp(e,t){return Zn(e,async()=>{let r=(await Jp(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 Kr(he(e).runs,{recursive:!0}),await q(Tl(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){li(t,"run");try{return Qp(JSON.parse(await Gr(Tl(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function zp(e){return Jp(e)}async function Jp(e){let t=he(e).runs,n=await wl(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return Qp(JSON.parse(await Gr(We.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ve(e,t,n){return Zn(e,async()=>{let r=await pe(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await q(Tl(e,t),s),s})}async function Xp(e,t){await Kr(he(e).reviews,{recursive:!0}),await q(bl(e,t.id),t)}async function Hr(e,t,n){return Zn(e,async()=>{let r=await er(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await q(bl(e,t),s),s})}async function er(e,t){li(t,"review");try{return db(JSON.parse(await Gr(bl(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function ai(e){let t=he(e).reviews,n=await wl(t).catch(r=>Ht(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>er(e,r.slice(0,-5))))}function Qp(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planId!="string"||!/^fury_plan_[A-Za-z0-9_-]+$/.test(e.planId)||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!n.includes(String(e.state))||!Ae(e.inputs)||!Zp(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!pb(e.stepRuns,e.order)||!Yr(e.actor)||!Be(e.createdAt)||!Be(e.updatedAt)||!Be(e.stateChangedAt)||!Be(e.deadlineAt)||e.completedAt!==null&&!Be(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function ub(e,t){if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!Ae(e.inputs)||!Zp(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||!Yr(e.createdBy)||!Be(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,kl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function db(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!Ae(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Be(e.requestedAt)||!Be(e.deadlineAt)||!Be(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!Up(r))||e.lastDecision!==null&&!Up(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function pb(e,t){return Ae(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&fb(e[n],n))}function fb(e,t){return!Ae(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!Ae(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Be(n))&&(e.completedBy===null||Yr(e.completedBy))}function Up(e){return Ae(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&Yr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Be(e.occurredAt)}function Zp(e){return Ae(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function Yr(e){return Ae(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}var Tl=(e,t)=>We.join(he(e).runs,`${t}.json`),ef=(e,t)=>We.join(he(e).plans,`${t}.json`),tf=(e,t)=>We.join(he(e).approvals,`${t}.json`),bl=(e,t)=>We.join(he(e).reviews,`${t}.json`),li=(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 Rl(e,t){try{let n=JSON.parse(await Gr(tf(e,t),"utf8"));if(!Ae(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Yr(n.approvedBy)||!Ae(n.approvedBy)||n.approvedBy.type!=="human"||!Be(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Ht(n,"ENOENT"))return null;throw n}}var Ae=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Be=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Ht=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as nf,readFile as mb,rm as ci,stat as hb,writeFile as gb}from"node:fs/promises";import Sl from"node:path";var yb=20,wb=3e4,kb=5e3;async function rf(e,t){let n=Sl.join(e.runtimeDir,"event-journal.lock");await nf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await nf(n);try{await gb(Sl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ci(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Rb(s))throw s;if(await Tb(n))continue;if(Date.now()-r>=wb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await Sb(yb)}try{return await t()}finally{await ci(n,{recursive:!0,force:!0})}}async function Tb(e){let t=await mb(Sl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return bb(t.pid)?!1:(await ci(e,{recursive:!0,force:!0}),!0);let n=await hb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<kb?!1:(await ci(e,{recursive:!0,force:!0}),!0)}function bb(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 Rb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Sb=e=>new Promise(t=>setTimeout(t,e));var Cb=256*1024,Ab=16,Eb=64*1024;async function De(e,t,n={}){let r=Il(n.maxSegmentBytes??Cb,"Event journal segment size"),s=Il(n.maxSegments??Ab,"Event journal retention"),i=Il(n.maxRecordBytes??Eb,"Event record size");return rf(e,async()=>{await af(e.eventsDir,{recursive:!0}),await xb(e);let o=await Al(e),a=t.id??Pb(),l=o.events.find(y=>y.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,d={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,furyRunId:t.furyRunId??null,furyStepId:t.furyStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:Mb(t.data)},u=`${JSON.stringify(d)}
|
|
75
|
+
`;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let m=(await di(e)).at(-1),h=!m||await Ob(m.path,u,r);if(h&&(m={name:of(c),path:ui.join(e.eventsDir,of(c)),startSequence:c}),!m)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let f=await vl(m.path,"a");try{await f.writeFile(u,"utf8"),await f.sync()}finally{await f.close()}return h&&await cf(e.eventsDir),await $b(e,s),d})}async function Tn(e,t={}){let n=await Al(e),r=Lb(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?Fb(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 lf(e){return(await Al(e)).events}async function Al(e){await af(e.eventsDir,{recursive:!0});let t=await di(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await zr(i.path,"utf8"),a=s===t.length-1,l=o.split(`
|
|
78
76
|
`);if(o.endsWith(`
|
|
79
|
-
`))l.pop();else{if(!a)throw
|
|
80
|
-
`))if(s)try{let i=JSON.parse(s);if(typeof i.commandId=="string"&&t.has(i.commandId)||typeof i.furyRunId=="string"&&n.has(i.furyRunId))return!0}catch{return!0}return!1}async function gR(e){let t=(await yi(e)).at(-1);if(!t)return;let n=await Zr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Nl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function hR(e,t,n,r){if(t===void 0)return 0;if(/^\d+$/.test(t)){let i=Number(t);if(!Number.isSafeInteger(i)||r===null&&i!==0||r!==null&&i>r)throw $l(t);return Rf(t,i,n),i}let s=e.find(i=>i.id===t);if(!s)throw n!==null&&n>1?new h("EVENT_CURSOR_EXPIRED",`Event cursor ${t} has expired.`,{details:{cursor:t,earliestAvailableSequence:n,resumeAfter:n-1}}):$l(t);return Rf(t,s.sequence,n),s.sequence}function Rf(e,t,n){if(n!==null&&t<n-1)throw new h("EVENT_CURSOR_EXPIRED",`Event cursor ${e} has expired.`,{details:{cursor:e,earliestAvailableSequence:n,resumeAfter:n-1}})}function yR(e){if(e.length===0||e.length>256)throw new h("CLI_USAGE","Event type glob must contain between 1 and 256 characters.",{});let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`)}function wR(e){let t=JSON.stringify(e,(n,r)=>/prompt|token|secret|password|authorization|capability/i.test(n)?"[REDACTED]":r);return t===void 0?null:JSON.parse(t)}function kR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw zt(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!sr(i.workspaceId)||!sr(i.taskId)||!sr(i.agentTabId)||!sr(i.commandId)||!sr(i.furyRunId)||!sr(i.furyStepId)||!TR(i.actor)||!("data"in i))throw zt(t,`record at line ${n} has an invalid schema`);return i}function TR(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var sr=e=>e===null||typeof e=="string",Sf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,zt=(e,t)=>new h("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),$l=e=>new h("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Fl=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Dl(e,t){if(!Number.isSafeInteger(e)||e<1)throw new h("CLI_USAGE",`${t} must be a positive integer.`,{details:{value:e}});return e}async function vf(e){let t=await Nl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Ef,readdir as $R,readFile as Of}from"node:fs/promises";import $f from"node:path";import{mkdir as Cf,readFile as bR,rm as wi,stat as RR,writeFile as SR}from"node:fs/promises";import Ll from"node:path";var PR=20,IR=3e4,vR=5e3;async function Ml(e,t){let n=Ll.join(e.runtimeDir,"command-store.lock");await Cf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Cf(n);try{await SR(Ll.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await wi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!ER(s))throw s;if(await CR(n))continue;if(Date.now()-r>=IR)throw new h("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await OR(PR)}try{return await t()}finally{await wi(n,{recursive:!0,force:!0})}}async function CR(e){let t=await bR(Ll.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return AR(t.pid)?!1:(await wi(e,{recursive:!0,force:!0}),!0);let n=await RR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<vR?!1:(await wi(e,{recursive:!0,force:!0}),!0)}function AR(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var ER=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",OR=e=>new Promise(t=>setTimeout(t,e));async function bi(e,t){jl(t);try{let n=JSON.parse(await Of(es(e,t),"utf8"));return Nf(n,es(e,t),t)}catch(n){throw _R(n)?new h("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Ti(t,es(e,t),n):n}}async function Ge(e){await Ef(e.commandsDir,{recursive:!0});let t=await $R(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=$f.join(e.commandsDir,r);try{n.push(Nf(JSON.parse(await Of(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof h?i:Ti(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Df(e,t){return jl(t.id),Ml(e,async()=>{await Ef(e.commandsDir,{recursive:!0});let n=await Ge(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!DR(r,t))throw new h("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await M(es(e,t.id),t),{command:t,created:!0}})}async function ts(e,t,n){return jl(t),Ml(e,async()=>{let r=await bi(e,t),s=n(r);if(s.id!==r.id)throw new h("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await M(es(e,t),s),s})}function DR(e,t){return e.taskId===t.taskId&&e.agentTabId===t.agentTabId&&e.prompt.source===t.prompt.source&&e.prompt.text===t.prompt.text&&e.delivery===t.delivery&&e.timeoutMs===t.timeoutMs}function Nf(e,t,n){if(!ki(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Ti("unknown",t);let r=e.id,s=["queued","delivering","delivered","failed","cancelled"];if(r!==n||e.idempotencyKey!==null&&(typeof e.idempotencyKey!="string"||e.idempotencyKey.length>256)||typeof e.taskId!="string"||e.taskId.length===0||typeof e.agentTabId!="string"||e.agentTabId.length===0||!ki(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!xR(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!ir(e.expiresAt)||!ir(e.createdAt)||!ir(e.updatedAt)||e.deliveryStartedAt!==null&&!ir(e.deliveryStartedAt)||e.deliveredAt!==null&&!ir(e.deliveredAt)||e.cancelledAt!==null&&!ir(e.cancelledAt)||e.cancelledBy!==null&&!Af(e.cancelledBy)||!Af(e.actor)||!NR(e.lastError)||e.state==="delivered"!=(e.deliveredAt!==null)||e.state==="failed"!=(e.lastError!==null)||Number(e.attempts)>0!=(e.deliveryStartedAt!==null)||e.state==="cancelled"!=(e.cancelledAt!==null&&e.cancelledBy!==null))throw Ti(r,t);return e}function Af(e){return!ki(e)||typeof e.type!="string"?!1:e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component))}function NR(e){return e===null||ki(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var es=(e,t)=>$f.join(e.commandsDir,`${t}.json`),jl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new h("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},ir=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),xR=e=>e.trim().length>0&&Buffer.byteLength(e)<=32*1024&&![...e].some(t=>{let n=t.charCodeAt(0);return n<=8||n>=11&&n<=31||n>=127&&n<=159}),ki=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),_R=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Ti=(e,t,n)=>new h("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function xf(e,t=new Date){return Ri(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function _f(e,t=new Date){return e.state==="delivered"?e:(Ri(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Ff(e,t,n=new Date){return e.state==="failed"?e:(Ri(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Lf(e,t,n=new Date){return e.state==="cancelled"?e:(Ri(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Ri(e,t,n){if(!t.includes(e.state))throw new h("COMMAND_STATE_CONFLICT",`Cannot ${n} command ${e.id} while it is ${e.state}.`,{details:{commandId:e.id,state:e.state,allowedStates:t}})}import{randomUUID as FR}from"node:crypto";var ql=32*1024,Mf=1440*60*1e3,Ul=256,LR=["delivered","failed","cancelled"],Wl={type:"system",component:"orchestration-supervisor"};async function MR(e,t){if(GR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Mf)throw new h("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Mf}});if(t.idempotencyKey!==void 0&&t.idempotencyKey!==null&&t.idempotencyKey.trim().length===0)throw new h("CLI_USAGE","Idempotency key cannot be empty.",{});if((t.idempotencyKey?.length??0)>Ul)throw new h("CLI_USAGE",`Idempotency key exceeds ${Ul} characters.`,{details:{maxIdempotencyKeyLength:Ul}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${FR()}`,idempotencyKey:t.idempotencyKey?.trim()||null,taskId:t.taskId,agentTabId:t.agentTabId,prompt:t.prompt,delivery:t.delivery,state:"queued",attempts:0,timeoutMs:t.timeoutMs,expiresAt:new Date(n.getTime()+t.timeoutMs).toISOString(),lastError:null,actor:t.actor,createdAt:n.toISOString(),updatedAt:n.toISOString(),deliveryStartedAt:null,deliveredAt:null,cancelledAt:null,cancelledBy:null},s=await Df(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw jf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function jR(e,t){return{kind:"showPromptCommand",command:await bi(e,t)}}async function qR(e,t){let n=await Ge(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function UR(e,t,n){let r=!1,s=await ts(e,t,i=>{if(i.state==="cancelled")return i;let o=Lf(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw jf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function WR(e,t){let n=await ts(e,t,r=>xf(r));return await vn(e,n,"command.delivering",Wl),n}async function BR(e,t){let n=await ts(e,t,r=>_f(r));return await vn(e,n,"command.delivered",Wl),n}async function VR(e,t,n){let r=await ts(e,t,s=>Ff(s,n));return await vn(e,r,"command.failed",Wl),r}async function KR(e,t,n){let r=[...n.states??LR],s=Date.now()+n.timeoutMs;for(;;){let i=await bi(e,t);if(r.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:r};if(n.signal?.aborted)throw new h("OPERATION_CANCELLED",`Cancelled while waiting for command ${t}.`,{retryable:!0,details:{commandId:t,cancelled:!0}});let o=s-Date.now();if(o<=0)throw new h("OPERATION_TIMEOUT",`Timed out after ${n.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:r,timeoutMs:n.timeoutMs}});await HR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function GR(e){if(e.trim().length===0)throw new h("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>ql)throw new h("CLI_USAGE",`Prompt exceeds the ${ql}-byte limit.`,{details:{maxPromptBytes:ql,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new h("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await Ne(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function HR(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var jf=(e,t)=>new h("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),ue={create:MR,show:jR,list:qR,cancel:UR,wait:KR,beginDelivery:WR,completeDelivery:BR,fail:VR};import{randomUUID as Uf,timingSafeEqual as YR}from"node:crypto";import{mkdir as zR,readFile as JR,readdir as XR}from"node:fs/promises";import Wf from"node:path";var QR=10080*60*1e3,ZR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},eS=["task.create-child","task.children","task.cancel-tree"],tS=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Xe(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await zR(Gl(e),{recursive:!0,mode:448}),await W(e,t.id,async o=>{let a=o.ptyTabs.find(d=>d.id===s.id&&d.kind==="agent");if(!a)throw new h("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${Uf()}`,c=await Si(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new h("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await nS(e,l,o.id,a.id,n)).token,a.capabilityId?o:{...o,ptyTabs:o.ptyTabs.map(d=>d.id===a.id?{...d,capabilityId:l}:d)}}),!i)throw new h("INTERNAL_ERROR",`Failed to issue a capability for ${s.id}.`,{});return{CRAIG_AGENT_CAPABILITY:i}}async function nS(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Uf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...eS],targetPolicy:"children-only",limits:{...ZR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+QR).toISOString(),revokedAt:null,revokedBy:null};return await M(Hl(e,o.id),o,{mode:384}),o}async function He(e,t,n,r){let s=await sS(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!tS.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await rS(e,s.taskId,r)&&Cn(s.id,`target task ${r} is outside the capability task subtree`),{capability:s,actor:{type:"agent",taskId:s.taskId,agentTabId:s.agentTabId,capabilityId:s.id}}}async function rS(e,t,n){if(t===n)return!0;let r=(await R.listTasks(e,{includeClosed:!0})).tasks,s=new Map(r.map(a=>[a.id,a])),i=s.get(n),o=new Set;for(;i?.parentTaskId&&!o.has(i.id);){if(i.parentTaskId===t)return!0;o.add(i.id),i=s.get(i.parentTaskId)}return!1}async function Bf(e,t,n){let r=await Si(e,t);r&&(r.revokedAt||await M(Hl(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function Kl(e,t,n){let r=await XR(Gl(e)).catch(i=>Vf(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await Si(e,o[1]);!a||!t.has(a.taskId)||(await Bf(e,a.id,n),s.push(a.id))}return s}async function sS(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Cn("<redacted>","token is invalid");let s=await Si(e,r);if(!s)throw new h("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!YR(i,o))&&Cn(r,"token is invalid"),s}async function Si(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await JR(Hl(e,t),"utf8"));if(!iS(n,t))throw new h("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Vf(n))return null;throw n}}function iS(e,t){if(!Vl(e)||e.schemaVersion!==1||e.id!==t)return!1;let n=e.limits;return typeof e.token=="string"&&e.token.startsWith(`${t}.`)&&e.token.length>t.length+1&&typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&Array.isArray(e.allowedCommandFamilies)&&e.allowedCommandFamilies.length>0&&e.allowedCommandFamilies.every(r=>typeof r=="string"&&oS(r))&&e.targetPolicy==="children-only"&&Vl(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Bl(e.createdAt)&&Bl(e.expiresAt)&&qf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Bl(e.revokedAt)&&qf(e.revokedBy))}function qf(e){return Vl(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}function Cn(e,t){throw new h("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var Gl=e=>Wf.join(e.orchestrationDir,"capabilities"),Hl=(e,t)=>Wf.join(Gl(e),`${t}.json`),oS=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Vl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Bl=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Vf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Kf,readFile as aS,rm as Yl,stat as lS,writeFile as cS}from"node:fs/promises";import zl from"node:path";var dS=20,uS=3e4,pS=5e3;async function Jl(e,t){let n=zl.join(e.runtimeDir,"delegation.lock");await Kf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Kf(n);try{await cS(zl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Yl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!gS(s))throw s;if(await fS(n))continue;if(Date.now()-r>=uS)throw new h("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,dS))}try{return await t()}finally{await Yl(n,{recursive:!0,force:!0})}}async function fS(e){let t=await aS(zl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&mS(t.pid))return!1;let n=await lS(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<pS?!1:(await Yl(e,{recursive:!0,force:!0}),!0)}function mS(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var gS=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var hS={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Xl(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?R.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):R.createTask(e,t,n,r)}async function Ql(e,t,n={}){return Jl(e,async()=>{let r=await R.getTask(e,t.parentTaskId),s=t.capabilityId?await He(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??hS,a=t.prompt.trim();if(a.length===0)throw new h("CLI_USAGE","Child task prompt cannot be empty.",{});if(Buffer.byteLength(a)>o.maxPromptBytes&&Pi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Pi("delegation depth",o.maxDepth),!new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(f=>f.repoId)]).has(t.repoId))throw new h("CAPABILITY_DENIED",`Repo ${t.repoId} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:t.repoId}});let u=(await R.listTasks(e,{includeClosed:!0})).tasks.filter(f=>f.parentTaskId===r.id),d=t.idempotencyKey?.trim()||null;if(d){if(d.length>256)throw new h("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let f=u.find(y=>y.delegationIdempotencyKey===d);if(f){if(f.repoId!==t.repoId||f.prompt.value!==a||t.runner&&f.runner!==t.runner)throw new h("COMMAND_STATE_CONFLICT",`Idempotency key "${d}" is already used by child ${f.id}.`,{details:{idempotencyKey:d,taskId:f.id}});return Gf(f,!0)}}u.length>=o.maxChildren&&Pi("children",o.maxChildren),u.filter(f=>f.status!=="closed"&&f.status!=="merged").length>=o.maxConcurrentChildren&&Pi("concurrent children",o.maxConcurrentChildren);let m=await(n.createTask??R.createTask)(e,t.repoId,a,{...t.runner?{runner:t.runner}:{},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:d,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async f=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:f.id,CRAIG_AGENT_TAB_ID:f.ptyTabs.find(y=>y.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await Xe(e,f,i)})}),g=await R.getTask(e,m.taskId);try{await Ne(e,{workspaceId:g.workspaceId,taskId:g.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:g.rootTaskId,delegationDepth:g.delegationDepth}})}catch(f){throw new h("PARTIAL_RESULT",`Child ${g.id} was created, but its audit event could not be recorded.`,{details:{taskId:g.id,parentTaskId:r.id,persisted:!0},cause:f})}return Gf(g,!1)})}async function Zl(e,t,n){n&&await He(e,n,"task.children",t),await R.getTask(e,t);let r=(await R.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function ec(e,t,n){return Jl(e,async()=>{let s=(n?await He(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await R.getTask(e,t);let i=(await R.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(g=>[g.id,g])),a=new Map;for(let g of i)g.parentTaskId&&a.set(g.parentTaskId,[...a.get(g.parentTaskId)??[],g]);let l=[],c=new Set,u=g=>{if(c.has(g))throw new h("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${g}.`,{details:{taskId:g,rootTaskId:t}});let f=o.get(g);if(f){c.add(g),l.push(f);for(let y of(a.get(g)??[]).sort((T,S)=>T.id.localeCompare(S.id)))u(y.id)}};u(t);let d=[],p=[],m=[];try{await Kl(e,new Set(l.map(g=>g.id)),s)}catch{m.push(...l.map(g=>g.id))}for(let g of l){let f=g.status;if(f==="closed"){d.push({taskId:g.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await R.cleanupTask(e,g,{preserveWorktree:!0});let y=await R.closeTask(e,g.id);d.push({taskId:g.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await Ne(e,{workspaceId:g.workspaceId,taskId:g.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(g.id)}}if(p.length>0||m.length>0)throw new h("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:d,auditFailures:p,revocationFailures:m,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:d}})}function Gf(e,t){return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,repoId:e.repoId,workspaceId:e.workspaceId,sessionId:e.sessionId,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function Pi(e,t){throw new h("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ii=Symbol.for("yaml.alias"),vi=Symbol.for("yaml.document"),Qe=Symbol.for("yaml.map"),tc=Symbol.for("yaml.pair"),xe=Symbol.for("yaml.scalar"),Et=Symbol.for("yaml.seq"),Se=Symbol.for("yaml.node.type"),_e=e=>!!e&&typeof e=="object"&&e[Se]===Ii,ft=e=>!!e&&typeof e=="object"&&e[Se]===vi,Ze=e=>!!e&&typeof e=="object"&&e[Se]===Qe,q=e=>!!e&&typeof e=="object"&&e[Se]===tc,x=e=>!!e&&typeof e=="object"&&e[Se]===xe,et=e=>!!e&&typeof e=="object"&&e[Se]===Et;function B(e){if(e&&typeof e=="object")switch(e[Se]){case Qe:case Et:return!0}return!1}function U(e){if(e&&typeof e=="object")switch(e[Se]){case Ii:case Qe:case xe:case Et:return!0}return!1}var Ci=e=>(x(e)||B(e))&&!!e.anchor;var Ee=Symbol("break visit"),Hf=Symbol("skip children"),mt=Symbol("remove node");function Ye(e,t){let n=Yf(t);ft(e)?or(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):or(null,e,n,Object.freeze([]))}Ye.BREAK=Ee;Ye.SKIP=Hf;Ye.REMOVE=mt;function or(e,t,n,r){let s=zf(e,t,n,r);if(U(s)||q(s))return Jf(e,r,s),or(e,s,n,r);if(typeof s!="symbol"){if(B(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=or(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(q(t)){r=Object.freeze(r.concat(t));let i=or("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=or("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}async function Ai(e,t){let n=Yf(t);ft(e)?await ar(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):await ar(null,e,n,Object.freeze([]))}Ai.BREAK=Ee;Ai.SKIP=Hf;Ai.REMOVE=mt;async function ar(e,t,n,r){let s=await zf(e,t,n,r);if(U(s)||q(s))return Jf(e,r,s),ar(e,s,n,r);if(typeof s!="symbol"){if(B(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(q(t)){r=Object.freeze(r.concat(t));let i=await ar("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=await ar("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}function Yf(e){return typeof e=="object"&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function zf(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Ze(t))return n.Map?.(e,t,r);if(et(t))return n.Seq?.(e,t,r);if(q(t))return n.Pair?.(e,t,r);if(x(t))return n.Scalar?.(e,t,r);if(_e(t))return n.Alias?.(e,t,r)}function Jf(e,t,n){let r=t[t.length-1];if(B(r))r.items[e]=n;else if(q(r))e==="key"?r.key=n:r.value=n;else if(ft(r))r.contents=n;else{let s=_e(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var yS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},wS=e=>e.replace(/[!,[\]{}]/g,t=>yS[t]),gt=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&(this.yaml={explicit:e.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},e.defaultTags),this.atNextDocument=!1);let r=t.trim().split(/[ \t]+/),s=r.shift();switch(s){case"%TAG":{if(r.length!==2&&(n(0,"%TAG directive should contain exactly two parts"),r.length<2))return!1;let[i,o]=r;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,r.length!==1)return n(0,"%YAML directive should contain exactly one part"),!1;let[i]=r;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{let o=/^\d+\.\d+$/.test(i);return n(6,`Unsupported YAML version ${i}`,o),!1}}default:return n(0,`Unknown directive ${s}`,!0),!1}}tagName(t,n){if(t==="!")return"!";if(t[0]!=="!")return n(`Not a valid tag: ${t}`),null;if(t[1]==="<"){let o=t.slice(2,-1);return o==="!"||o==="!!"?(n(`Verbatim tags aren't resolved, so ${t} is invalid.`),null):(t[t.length-1]!==">"&&n("Verbatim tags must end with a >"),o)}let[,r,s]=t.match(/^(.*!)([^!]*)$/s);s||n(`The ${t} tag has no suffix`);let i=this.tags[r];if(i)try{return i+decodeURIComponent(s)}catch(o){return n(String(o)),null}return r==="!"?t:(n(`Could not resolve tag: ${t}`),null)}tagString(t){for(let[n,r]of Object.entries(this.tags))if(t.startsWith(r))return n+wS(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&U(t.contents)){let i={};Ye(t.contents,(o,a)=>{U(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
|
|
81
|
-
`)}};
|
|
82
|
-
`)?
|
|
77
|
+
`))l.pop();else{if(!a)throw Yt(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let d=l[c];if(d.length===0)throw Yt(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Yt(i.name,`invalid JSON at line ${c+1}`)}let p=jb(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Yt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Yt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let m=n.at(-1);if(m&&p.sequence!==m.sequence+1)throw Yt(i.name,`non-monotonic sequence ${p.sequence} after ${m.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function di(e){return(await Cl(e.eventsDir).catch(n=>{if(El(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:ui.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function Ob(e,t,n){let r=await vb(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function $b(e,t){let n=await di(e),r=Math.max(0,n.length-t),s=await Nb(e),i=await Db(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await _b(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await Ib(a.path,{force:!0});o.length>0&&await cf(e.eventsDir)}async function Db(e){let t=he(e).runs,n=await Cl(t).catch(s=>{if(El(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await zr(ui.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 Nb(e){let t=await Cl(e.commandsDir).catch(r=>{if(El(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await zr(ui.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 _b(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await zr(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 xb(e){let t=(await di(e)).at(-1);if(!t)return;let n=await zr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await vl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function Lb(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 Pl(t);return sf(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}}):Pl(t);return sf(t,s.sequence,n),s.sequence}function sf(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 Fb(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 Mb(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 jb(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Yt(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!tr(i.workspaceId)||!tr(i.taskId)||!tr(i.agentTabId)||!tr(i.commandId)||!tr(i.furyRunId)||!tr(i.furyStepId)||!qb(i.actor)||!("data"in i))throw Yt(t,`record at line ${n} has an invalid schema`);return i}function qb(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 tr=e=>e===null||typeof e=="string",of=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Yt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Pl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),El=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Il(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 cf(e){let t=await vl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as pf,readdir as Xb,readFile as ff}from"node:fs/promises";import mf from"node:path";import{mkdir as uf,readFile as Ub,rm as pi,stat as Wb,writeFile as Bb}from"node:fs/promises";import Ol from"node:path";var Vb=20,Kb=3e4,Gb=5e3;async function $l(e,t){let n=Ol.join(e.runtimeDir,"command-store.lock");await uf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await uf(n);try{await Bb(Ol.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await pi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!zb(s))throw s;if(await Hb(n))continue;if(Date.now()-r>=Kb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await Jb(Vb)}try{return await t()}finally{await pi(n,{recursive:!0,force:!0})}}async function Hb(e){let t=await Ub(Ol.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Yb(t.pid)?!1:(await pi(e,{recursive:!0,force:!0}),!0);let n=await Wb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Gb?!1:(await pi(e,{recursive:!0,force:!0}),!0)}function Yb(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var zb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Jb=e=>new Promise(t=>setTimeout(t,e));async function hi(e,t){Dl(t);try{let n=JSON.parse(await ff(Jr(e,t),"utf8"));return gf(n,Jr(e,t),t)}catch(n){throw tR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?mi(t,Jr(e,t),n):n}}async function Ke(e){await pf(e.commandsDir,{recursive:!0});let t=await Xb(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=mf.join(e.commandsDir,r);try{n.push(gf(JSON.parse(await ff(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:mi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function hf(e,t){return Dl(t.id),$l(e,async()=>{await pf(e.commandsDir,{recursive:!0});let n=await Ke(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!Qb(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(Jr(e,t.id),t),{command:t,created:!0}})}async function Xr(e,t,n){return Dl(t),$l(e,async()=>{let r=await hi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await q(Jr(e,t),s),s})}function Qb(e,t){return e.taskId===t.taskId&&e.agentTabId===t.agentTabId&&e.prompt.source===t.prompt.source&&e.prompt.text===t.prompt.text&&e.delivery===t.delivery&&e.timeoutMs===t.timeoutMs}function gf(e,t,n){if(!fi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw mi("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"||!eR(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||!nr(e.expiresAt)||!nr(e.createdAt)||!nr(e.updatedAt)||e.deliveryStartedAt!==null&&!nr(e.deliveryStartedAt)||e.deliveredAt!==null&&!nr(e.deliveredAt)||e.cancelledAt!==null&&!nr(e.cancelledAt)||e.cancelledBy!==null&&!df(e.cancelledBy)||!df(e.actor)||!Zb(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 mi(r,t);return e}function df(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 Zb(e){return e===null||fi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var Jr=(e,t)=>mf.join(e.commandsDir,`${t}.json`),Dl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},nr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),eR=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),tR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",mi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function yf(e,t=new Date){return gi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function wf(e,t=new Date){return e.state==="delivered"?e:(gi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function kf(e,t,n=new Date){return e.state==="failed"?e:(gi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Tf(e,t,n=new Date){return e.state==="cancelled"?e:(gi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function gi(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 nR}from"node:crypto";var Nl=32*1024,bf=1440*60*1e3,_l=256,rR=["delivered","failed","cancelled"],xl={type:"system",component:"orchestration-supervisor"};async function sR(e,t){if(pR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>bf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:bf}});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)>_l)throw new g("CLI_USAGE",`Idempotency key exceeds ${_l} characters.`,{details:{maxIdempotencyKeyLength:_l}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${nR()}`,idempotencyKey:t.idempotencyKey?.trim()||null,taskId:t.taskId,agentTabId:t.agentTabId,prompt:t.prompt,delivery:t.delivery,state:"queued",attempts:0,timeoutMs:t.timeoutMs,expiresAt:new Date(n.getTime()+t.timeoutMs).toISOString(),lastError:null,actor:t.actor,createdAt:n.toISOString(),updatedAt:n.toISOString(),deliveryStartedAt:null,deliveredAt:null,cancelledAt:null,cancelledBy:null},s=await hf(e,r);if(s.created)try{await bn(e,s.command,"command.queued")}catch(i){throw Rf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function iR(e,t){return{kind:"showPromptCommand",command:await hi(e,t)}}async function oR(e,t){let n=await Ke(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function aR(e,t,n){let r=!1,s=await Xr(e,t,i=>{if(i.state==="cancelled")return i;let o=Tf(i,n??i.actor);return r=!0,o});if(r)try{await bn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Rf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function lR(e,t){let n=await Xr(e,t,r=>yf(r));return await bn(e,n,"command.delivering",xl),n}async function cR(e,t){let n=await Xr(e,t,r=>wf(r));return await bn(e,n,"command.delivered",xl),n}async function uR(e,t,n){let r=await Xr(e,t,s=>kf(s,n));return await bn(e,r,"command.failed",xl),r}async function dR(e,t,n){let r=[...n.states??rR],s=Date.now()+n.timeoutMs;for(;;){let i=await hi(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 fR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function pR(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Nl)throw new g("CLI_USAGE",`Prompt exceeds the ${Nl}-byte limit.`,{details:{maxPromptBytes:Nl,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 bn(e,t,n,r=t.actor){await De(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function fR(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 Rf=(e,t)=>new g("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),ae={create:sR,show:iR,list:oR,cancel:aR,wait:dR,beginDelivery:lR,completeDelivery:cR,fail:uR};import{randomUUID as Pf,timingSafeEqual as mR}from"node:crypto";import{mkdir as hR,readFile as gR,readdir as yR}from"node:fs/promises";import If from"node:path";var wR=10080*60*1e3,kR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},TR=["task.create-child","task.children","task.cancel-tree"],bR=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Xe(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await hR(jl(e),{recursive:!0,mode:448}),await V(e,t.id,async o=>{let a=o.ptyTabs.find(u=>u.id===s.id&&u.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${Pf()}`,c=await yi(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 RR(e,l,o.id,a.id,n)).token,a.capabilityId?o:{...o,ptyTabs:o.ptyTabs.map(u=>u.id===a.id?{...u,capabilityId:l}:u)}}),!i)throw new g("INTERNAL_ERROR",`Failed to issue a capability for ${s.id}.`,{});return{CRAIG_AGENT_CAPABILITY:i}}async function RR(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Pf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...TR],targetPolicy:"children-only",limits:{...kR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+wR).toISOString(),revokedAt:null,revokedBy:null};return await q(ql(e,o.id),o,{mode:384}),o}async function Ge(e,t,n,r){let s=await PR(e,t);return s.revokedAt&&Rn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Rn(s.id,"expired"),!bR.has(n)&&!s.allowedCommandFamilies.includes(n)&&Rn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await SR(e,s.taskId,r)&&Rn(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 SR(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 vf(e,t,n){let r=await yi(e,t);r&&(r.revokedAt||await q(ql(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function Ml(e,t,n){let r=await yR(jl(e)).catch(i=>Cf(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 yi(e,o[1]);!a||!t.has(a.taskId)||(await vf(e,a.id,n),s.push(a.id))}return s}async function PR(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Rn("<redacted>","token is invalid");let s=await yi(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||!mR(i,o))&&Rn(r,"token is invalid"),s}async function yi(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Rn(t,"identifier is invalid");try{let n=JSON.parse(await gR(ql(e,t),"utf8"));if(!IR(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Cf(n))return null;throw n}}function IR(e,t){if(!Fl(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"&&vR(r))&&e.targetPolicy==="children-only"&&Fl(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Ll(e.createdAt)&&Ll(e.expiresAt)&&Sf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Ll(e.revokedAt)&&Sf(e.revokedBy))}function Sf(e){return Fl(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 Rn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var jl=e=>If.join(e.orchestrationDir,"capabilities"),ql=(e,t)=>If.join(jl(e),`${t}.json`),vR=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Fl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ll=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Cf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Af,readFile as CR,rm as Ul,stat as AR,writeFile as ER}from"node:fs/promises";import Wl from"node:path";var OR=20,$R=3e4,DR=5e3;async function Bl(e,t){let n=Wl.join(e.runtimeDir,"delegation.lock");await Af(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Af(n);try{await ER(Wl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ul(n,{recursive:!0,force:!0}),s}break}catch(s){if(!xR(s))throw s;if(await NR(n))continue;if(Date.now()-r>=$R)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,OR))}try{return await t()}finally{await Ul(n,{recursive:!0,force:!0})}}async function NR(e){let t=await CR(Wl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&_R(t.pid))return!1;let n=await AR(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<DR?!1:(await Ul(e,{recursive:!0,force:!0}),!0)}function _R(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var xR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var LR={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Vl(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function Kl(e,t,n={}){return Bl(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await Ge(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??LR,a=FR(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&&wi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&wi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(T=>T.delegationIdempotencyKey===p);if(y){if(!MR(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 Ef(y,!0)}}u.length>=o.maxChildren&&wi("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&wi("concurrent children",o.maxConcurrentChildren);let h=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 Xe(e,y,i)})}),f=await S.getTask(e,h.taskId);try{await De(e,{workspaceId:f.workspaceId,taskId:f.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:f.rootTaskId,delegationDepth:f.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${f.id} was created, but its audit event could not be recorded.`,{details:{taskId:f.id,parentTaskId:r.id,persisted:!0},cause:y})}return Ef(f,!1)})}async function Gl(e,t,n){n&&await Ge(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 Hl(e,t,n){return Bl(e,async()=>{let s=(n?await Ge(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(h=>[h.id,h])),a=new Map;for(let h of i)h.parentTaskId&&a.set(h.parentTaskId,[...a.get(h.parentTaskId)??[],h]);let l=[],c=new Set,d=h=>{if(c.has(h))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${h}.`,{details:{taskId:h,rootTaskId:t}});let f=o.get(h);if(f){c.add(h),l.push(f);for(let y of(a.get(h)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],m=[];try{await Ml(e,new Set(l.map(h=>h.id)),s)}catch{m.push(...l.map(h=>h.id))}for(let h of l){let f=h.status;if(f==="closed"){u.push({taskId:h.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,h,{preserveWorktree:!0});let y=await S.closeTask(e,h.id);u.push({taskId:h.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await De(e,{workspaceId:h.workspaceId,taskId:h.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(h.id)}}if(p.length>0||m.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:m,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function Ef(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 FR(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 MR(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function wi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var ki=Symbol.for("yaml.alias"),Ti=Symbol.for("yaml.document"),Qe=Symbol.for("yaml.map"),Yl=Symbol.for("yaml.pair"),Ne=Symbol.for("yaml.scalar"),Et=Symbol.for("yaml.seq"),Pe=Symbol.for("yaml.node.type"),_e=e=>!!e&&typeof e=="object"&&e[Pe]===ki,ft=e=>!!e&&typeof e=="object"&&e[Pe]===Ti,Ze=e=>!!e&&typeof e=="object"&&e[Pe]===Qe,M=e=>!!e&&typeof e=="object"&&e[Pe]===Yl,_=e=>!!e&&typeof e=="object"&&e[Pe]===Ne,et=e=>!!e&&typeof e=="object"&&e[Pe]===Et;function U(e){if(e&&typeof e=="object")switch(e[Pe]){case Qe:case Et:return!0}return!1}function j(e){if(e&&typeof e=="object")switch(e[Pe]){case ki:case Qe:case Ne:case Et:return!0}return!1}var bi=e=>(_(e)||U(e))&&!!e.anchor;var Ee=Symbol("break visit"),Of=Symbol("skip children"),mt=Symbol("remove node");function He(e,t){let n=$f(t);ft(e)?rr(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):rr(null,e,n,Object.freeze([]))}He.BREAK=Ee;He.SKIP=Of;He.REMOVE=mt;function rr(e,t,n,r){let s=Df(e,t,n,r);if(j(s)||M(s))return Nf(e,r,s),rr(e,s,n,r);if(typeof s!="symbol"){if(U(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=rr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=rr("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=rr("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}async function Ri(e,t){let n=$f(t);ft(e)?await sr(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):await sr(null,e,n,Object.freeze([]))}Ri.BREAK=Ee;Ri.SKIP=Of;Ri.REMOVE=mt;async function sr(e,t,n,r){let s=await Df(e,t,n,r);if(j(s)||M(s))return Nf(e,r,s),sr(e,s,n,r);if(typeof s!="symbol"){if(U(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await sr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await sr("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=await sr("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}function $f(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 Df(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Ze(t))return n.Map?.(e,t,r);if(et(t))return n.Seq?.(e,t,r);if(M(t))return n.Pair?.(e,t,r);if(_(t))return n.Scalar?.(e,t,r);if(_e(t))return n.Alias?.(e,t,r)}function Nf(e,t,n){let r=t[t.length-1];if(U(r))r.items[e]=n;else if(M(r))e==="key"?r.key=n:r.value=n;else if(ft(r))r.contents=n;else{let s=_e(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var jR={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},qR=e=>e.replace(/[!,[\]{}]/g,t=>jR[t]),ht=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+qR(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&&j(t.contents)){let i={};He(t.contents,(o,a)=>{j(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
|
+
`)}};ht.defaultYaml={explicit:!1,version:"1.2"};ht.defaultTags={"!!":"tag:yaml.org,2002:"};function Si(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 zl(e){let t=new Set;return He(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function Jl(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function _f(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=zl(e));let o=Jl(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(_(o.node)||U(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function zt(e,t,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s<i;++s){let o=r[s],a=zt(e,r,String(s),o);a===void 0?delete r[s]:a!==o&&(r[s]=a)}else if(r instanceof Map)for(let s of Array.from(r.keys())){let i=r.get(s),o=zt(e,r,s,i);o===void 0?r.delete(s):o!==i&&r.set(s,o)}else if(r instanceof Set)for(let s of Array.from(r)){let i=zt(e,r,s,s);i===void 0?r.delete(s):i!==s&&(r.delete(s),r.add(i))}else for(let[s,i]of Object.entries(r)){let o=zt(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function le(e,t,n){if(Array.isArray(e))return e.map((r,s)=>le(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!bi(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=e.toJSON(t,n);return n.onCreate&&n.onCreate(s),s}return typeof e=="bigint"&&!n?.keep?Number(e):e}var Jt=class{constructor(t){Object.defineProperty(this,Pe,{value:t})}clone(){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(t.range=this.range.slice()),t}toJS(t,{mapAsMap:n,maxAliasCount:r,onAnchor:s,reviver:i}={}){if(!ft(t))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:t,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=le(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?zt(i,{"":a},"",a):a}};var Ot=class extends Jt{constructor(t){super(ki),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=[],He(t,{Node:(i,o)=>{(_e(o)||bi(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(t,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=r.get(o);if(a||(le(o,null,n),a=r.get(o)),a?.res===void 0){let l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Pi(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(Si(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 Pi(e,t,n){if(_e(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(U(t)){let r=0;for(let s of t.items){let i=Pi(e,s,n);i>r&&(r=i)}return r}else if(M(t)){let r=Pi(e,t.key,n),s=Pi(e,t.value,n);return Math.max(r,s)}return 1}var Ii=e=>!e||typeof e!="function"&&typeof e!="object",E=class extends Jt{constructor(t){super(Ne),this.value=t}toJSON(t,n){return n?.keep?this.value:le(this.value,t,n)}toString(){return String(this.value)}};E.BLOCK_FOLDED="BLOCK_FOLDED";E.BLOCK_LITERAL="BLOCK_LITERAL";E.PLAIN="PLAIN";E.QUOTE_DOUBLE="QUOTE_DOUBLE";E.QUOTE_SINGLE="QUOTE_SINGLE";var UR="tag:yaml.org,2002:";function WR(e,t,n){if(t){let r=n.filter(i=>i.tag===t),s=r.find(i=>!i.format)??r[0];if(!s)throw new Error(`Tag ${t} not found`);return s}return n.find(r=>r.identify?.(e)&&!r.format)}function $t(e,t,n){if(ft(e)&&(e=e.contents),j(e))return e;if(M(e)){let u=n.schema[Qe].createNode?.(n.schema,null,n);return u.items.push(e),u}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<"u"&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,l;if(r&&e&&typeof e=="object"){if(l=a.get(e),l)return l.anchor??(l.anchor=s(e)),new Ot(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=UR+t.slice(2));let c=WR(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new E(e);return l&&(l.node=u),u}c=e instanceof Map?o[Qe]:Symbol.iterator in Object(e)?o[Et]:o[Qe]}i&&(i(c),delete n.onTagObj);let d=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new E(e);return t?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function Qr(e,t,n){let r=n;for(let s=t.length-1;s>=0;--s){let i=t[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return $t(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var or=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,ir=class extends Jt{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>j(r)||M(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(or(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(U(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,Qr(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(U(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&&_(i)?i.value:i:U(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!M(n))return!1;let r=n.value;return r==null||t&&_(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 U(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(U(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,Qr(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var xf=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Ye(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var gt=(e,t,n)=>e.endsWith(`
|
|
80
|
+
`)?Ye(n,t):n.includes(`
|
|
83
81
|
`)?`
|
|
84
|
-
`+
|
|
85
|
-
`)n===
|
|
86
|
-
`&&m!==" "){let
|
|
87
|
-
`&&
|
|
88
|
-
${t}${e.slice(0,$)}`:(n===
|
|
89
|
-
${t}${e.slice(
|
|
90
|
-
`);r=t,s=t+1,i=e[s]}return r}var
|
|
91
|
-
`){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function
|
|
82
|
+
`+Ye(n,t):(e.endsWith(" ")?"":" ")+n;var Xl="flow",vi="block",Zr="quoted";function es(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,m,h=!1,f=-1,y=-1,T=-1;n===vi&&(f=Lf(e,f,t.length),f!==-1&&(u=f+l));for(let b;b=e[f+=1];){if(n===Zr&&b==="\\"){switch(y=f,e[f+1]){case"x":f+=3;break;case"u":f+=5;break;case"U":f+=9;break;default:f+=1}T=f}if(b===`
|
|
83
|
+
`)n===vi&&(f=Lf(e,f,t.length)),u=f+t.length+l,p=void 0;else{if(b===" "&&m&&m!==" "&&m!==`
|
|
84
|
+
`&&m!==" "){let O=e[f+1];O&&O!==" "&&O!==`
|
|
85
|
+
`&&O!==" "&&(p=f)}if(f>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===Zr){for(;m===" "||m===" ";)m=b,b=e[f+=1],h=!0;let O=f>T+1?f-2:y-1;if(d[O])return e;c.push(O),d[O]=!0,u=O+l,p=void 0}else h=!0}m=b}if(h&&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 O=c[b],$=c[b+1]||e.length;O===0?R=`
|
|
86
|
+
${t}${e.slice(0,$)}`:(n===Zr&&d[O]&&(R+=`${e[O]}\\`),R+=`
|
|
87
|
+
${t}${e.slice(O+1,$)}`)}return R}function Lf(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 Ai=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Ei=e=>/^(%|---|\.\.\.)/m.test(e);function BR(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 ts(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Ei(e)?" ":""),o="",a=0;for(let l=0,c=n[l];c;c=n[++l])if(c===" "&&n[l+1]==="\\"&&n[l+2]==="n"&&(o+=n.slice(a,l)+"\\ ",l+=1,a=l,c="\\"),c==="\\")switch(n[l+1]){case"u":{o+=n.slice(a,l);let d=n.substr(l+2,4);switch(d){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:d.substr(0,2)==="00"?o+="\\x"+d.substr(2):o+=n.substr(l,6)}l+=5,a=l+1}break;case"n":if(r||n[l+2]==='"'||n.length<s)l+=1;else{for(o+=n.slice(a,l)+`
|
|
92
90
|
|
|
93
91
|
`;n[l+2]==="\\"&&n[l+3]==="n"&&n[l+4]!=='"';)o+=`
|
|
94
|
-
`,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:
|
|
95
|
-
`)||/[ \t]\n|\n[ \t]/.test(e))return
|
|
96
|
-
${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:es(o,i,Zr,Ai(t,!1))}function Ql(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
|
|
93
|
+
`)||/[ \t]\n|\n[ \t]/.test(e))return ts(e,t);let n=t.indent||(Ei(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
|
|
94
|
+
${n}`)+"'";return t.implicitKey?r:es(r,n,Xl,Ai(t,!1))}function ar(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=ts;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=Ql:i&&!s?r=ts:r=n?Ql:ts}return r(e,t)}var Zl;try{Zl=new RegExp(`(^|(?<!
|
|
97
95
|
))
|
|
98
96
|
+(?!
|
|
99
|
-
|$)`,"g")}catch{
|
|
97
|
+
|$)`,"g")}catch{Zl=/\n+(?!\n|$)/g}function Ci({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 ar(n,r);let c=r.indent||(r.forceBlockIndent||Ei(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===E.BLOCK_FOLDED?!1:t===E.BLOCK_LITERAL?!0:!BR(n,l,c.length);if(!n)return d?`|
|
|
100
98
|
`:`>
|
|
101
|
-
`;let
|
|
102
|
-
`&&$!==" "&&$!==" ")break}let m=n.substring(p),
|
|
103
|
-
`);
|
|
104
|
-
`&&(m=m.slice(0,-1)),m=m.replace(
|
|
105
|
-
`)T=y;else break}let
|
|
106
|
-
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,
|
|
107
|
-
${c}${
|
|
108
|
-
${c}${
|
|
109
|
-
`)||
|
|
110
|
-
`)?
|
|
111
|
-
`))return
|
|
112
|
-
${l}`);if(o){let p=f=>f.default&&f.tag!=="tag:yaml.org,2002:str"&&f.test?.test(
|
|
113
|
-
${t.indent}${a}`:a}function
|
|
114
|
-
${a}:`):(y=`${y}:`,p&&(y+=
|
|
115
|
-
`:"",
|
|
116
|
-
${
|
|
117
|
-
`&&
|
|
99
|
+
`;let u,p;for(p=n.length;p>0;--p){let $=n[p-1];if($!==`
|
|
100
|
+
`&&$!==" "&&$!==" ")break}let m=n.substring(p),h=m.indexOf(`
|
|
101
|
+
`);h===-1?u="-":n===m||h!==m.length-1?(u="+",i&&i()):u="",m&&(n=n.slice(0,-m.length),m[m.length-1]===`
|
|
102
|
+
`&&(m=m.slice(0,-1)),m=m.replace(Zl,`$&${c}`));let f=!1,y,T=-1;for(y=0;y<n.length;++y){let $=n[y];if($===" ")f=!0;else if($===`
|
|
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 O=(f?c?"2":"1":"")+u;if(e&&(O+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let $=n.replace(/\n+/g,`
|
|
104
|
+
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,x=Ai(r,!0);o!=="folded"&&t!==E.BLOCK_FOLDED&&(x.onOverflow=()=>{D=!0});let v=es(`${R}${$}${m}`,c,vi,x);if(!D)return`>${O}
|
|
105
|
+
${c}${v}`}return n=n.replace(/\n+/g,`$&${c}`),`|${O}
|
|
106
|
+
${c}${R}${n}${m}`}function VR(e,t,n,r){let{type:s,value:i}=e,{actualString:o,implicitKey:a,indent:l,indentStep:c,inFlow:d}=t;if(a&&i.includes(`
|
|
107
|
+
`)||d&&/[[\]{},]/.test(i))return ar(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
|
|
108
|
+
`)?ar(i,t):Ci(e,t,n,r);if(!a&&!d&&s!==E.PLAIN&&i.includes(`
|
|
109
|
+
`))return Ci(e,t,n,r);if(Ei(i)){if(l==="")return t.forceBlockIndent=!0,Ci(e,t,n,r);if(a&&l===c)return ar(i,t)}let u=i.replace(/\n+/g,`$&
|
|
110
|
+
${l}`);if(o){let p=f=>f.default&&f.tag!=="tag:yaml.org,2002:str"&&f.test?.test(u),{compat:m,tags:h}=t.doc.schema;if(h.some(p)||m?.some(p))return ar(i,t)}return a?u:es(u,l,Xl,Ai(t,!1))}function Sn(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!==E.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=E.QUOTE_DOUBLE);let l=d=>{switch(d){case E.BLOCK_FOLDED:case E.BLOCK_LITERAL:return s||i?ar(o.value,t):Ci(o,t,n,r);case E.QUOTE_DOUBLE:return ts(o.value,t);case E.QUOTE_SINGLE:return Ql(o.value,t);case E.PLAIN:return VR(o,t,n,r);default:return null}},c=l(a);if(c===null){let{defaultKeyType:d,defaultStringType:u}=t.options,p=s&&d||u;if(c=l(p),c===null)throw new Error(`Unsupported default string type ${p}`)}return c}function Oi(e,t){let n=Object.assign({blockQuote:!0,commentString:xf,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 KR(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(_(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 GR(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(_(e)||U(e))&&e.anchor;i&&Si(i)&&(n.add(i),s.push(`&${i}`));let o=e.tag??(t.default?null:t.tag);return o&&s.push(r.directives.tagString(o)),s.join(" ")}function Dt(e,t,n,r){if(M(e))return e.toString(t,n,r);if(_e(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=j(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=KR(t.doc.schema.tags,i));let o=GR(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):_(i)?Sn(i,t,n,r):i.toString(t,n,r);return o?_(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
|
|
111
|
+
${t.indent}${a}`:a}function Ff({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:d,simpleKeys:u}}=n,p=j(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(U(e)||!j(e)&&typeof e=="object"){let x="With simple keys, collection cannot be used as a key value";throw new Error(x)}}let m=!u&&(!e||p&&t==null&&!n.inFlow||U(e)||(_(e)?e.type===E.BLOCK_FOLDED||e.type===E.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!m&&(u||!i),indent:a+l});let h=!1,f=!1,y=Dt(e,n,()=>h=!0,()=>f=!0);if(!m&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");m=!0}if(n.inFlow){if(i||t==null)return h&&r&&r(),y===""?"?":m?`? ${y}`:y}else if(i&&!u||t==null&&m)return y=`? ${y}`,p&&!h?y+=gt(y,n.indent,c(p)):f&&s&&s(),y;h&&(p=null),m?(p&&(y+=gt(y,n.indent,c(p))),y=`? ${y}
|
|
112
|
+
${a}:`):(y=`${y}:`,p&&(y+=gt(y,n.indent,c(p))));let T,R,b;j(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,!m&&!p&&_(t)&&(n.indentAtStart=y.length+1),f=!1,!d&&l.length>=2&&!n.inFlow&&!m&&et(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let O=!1,$=Dt(t,n,()=>O=!0,()=>f=!0),D=" ";if(p||T||R){if(D=T?`
|
|
113
|
+
`:"",R){let x=c(R);D+=`
|
|
114
|
+
${Ye(x,n.indent)}`}$===""&&!n.inFlow?D===`
|
|
115
|
+
`&&b&&(D=`
|
|
118
116
|
|
|
119
117
|
`):D+=`
|
|
120
|
-
${n.indent}`}else if(!m&&
|
|
121
|
-
`),w=
|
|
118
|
+
${n.indent}`}else if(!m&&U(t)){let x=$[0],v=$.indexOf(`
|
|
119
|
+
`),w=v!==-1,ge=n.inFlow??t.flow??t.items.length===0;if(w||!ge){let ye=!1;if(w&&(x==="&"||x==="!")){let H=$.indexOf(" ");x==="&"&&H!==-1&&H<v&&$[H+1]==="!"&&(H=$.indexOf(" ",H+1)),(H===-1||v<H)&&(ye=!0)}ye||(D=`
|
|
122
120
|
${n.indent}`)}}else($===""||$[0]===`
|
|
123
|
-
`)&&(D="");return y+=D+$,n.inFlow?
|
|
121
|
+
`)&&(D="");return y+=D+$,n.inFlow?O&&r&&r():b&&!O?y+=gt(y,n.indent,c(b)):f&&s&&s(),y}function ec(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var $i="<<",tt={identify:e=>e===$i||typeof e=="symbol"&&e.description===$i,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new E(Symbol($i)),{addToJSMap:nc}),stringify:()=>$i},Mf=(e,t)=>(tt.identify(t)||_(t)&&(!t.type||t.type===E.PLAIN)&&tt.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===tt.tag&&n.default);function nc(e,t,n){let r=jf(e,n);if(et(r))for(let s of r.items)tc(e,t,s);else if(Array.isArray(r))for(let s of r)tc(e,t,s);else tc(e,t,r)}function tc(e,t,n){let r=jf(e,n);if(!Ze(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,e,Map);for(let[i,o]of s)t instanceof Map?t.has(i)||t.set(i,o):t instanceof Set?t.add(i):Object.prototype.hasOwnProperty.call(t,i)||Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return t}function jf(e,t){return e&&_e(t)?t.resolve(e.doc,e):t}function Di(e,t,{key:n,value:r}){if(j(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Mf(e,n))nc(e,t,r);else{let s=le(n,"",e);if(t instanceof Map)t.set(s,le(r,s,e));else if(t instanceof Set)t.add(s);else{let i=HR(n,s,e),o=le(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function HR(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(j(e)&&n?.doc){let r=Oi(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)+'..."'),ec(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 lr(e,t,n){let r=$t(e,void 0,n),s=$t(t,void 0,n);return new X(r,s)}var X=class e{constructor(t,n=null){Object.defineProperty(this,Pe,{value:Yl}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return j(n)&&(n=n.clone(t)),j(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return Di(n,r,this)}toString(t,n,r){return t?.doc?Ff(this,t,n,r):JSON.stringify(this)}};function _i(e,t,n){return(t.inFlow??e.flow?zR:YR)(e,t,n)}function YR({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,d=Object.assign({},n,{indent:i,type:null}),u=!1,p=[];for(let h=0;h<t.length;++h){let f=t[h],y=null;if(j(f))!u&&f.spaceBefore&&p.push(""),Ni(n,p,f.commentBefore,u),f.comment&&(y=f.comment);else if(M(f)){let R=j(f.key)?f.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Ni(n,p,R.commentBefore,u))}u=!1;let T=Dt(f,d,()=>y=null,()=>u=!0);y&&(T+=gt(T,i,c(y))),u&&y&&(u=!1),p.push(r+T)}let m;if(p.length===0)m=s.start+s.end;else{m=p[0];for(let h=1;h<p.length;++h){let f=p[h];m+=f?`
|
|
124
122
|
${l}${f}`:`
|
|
125
123
|
`}}return e?(m+=`
|
|
126
|
-
`+
|
|
127
|
-
`)),
|
|
124
|
+
`+Ye(c(e),l),a&&a()):u&&o&&o(),m}function zR({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,d=0,u=[];for(let h=0;h<e.length;++h){let f=e[h],y=null;if(j(f))f.spaceBefore&&u.push(""),Ni(t,u,f.commentBefore,!1),f.comment&&(y=f.comment);else if(M(f)){let R=j(f.key)?f.key:null;R&&(R.spaceBefore&&u.push(""),Ni(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=j(f.value)?f.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):f.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=Dt(f,l,()=>y=null);c||(c=u.length>d||T.includes(`
|
|
125
|
+
`)),h<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=gt(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:m}=n;if(u.length===0)return p+m;if(!c){let h=u.reduce((f,y)=>f+y.length+2,2);c=t.options.lineWidth>0&&h>t.options.lineWidth}if(c){let h=p;for(let f of u)h+=f?`
|
|
128
126
|
${i}${s}${f}`:`
|
|
129
|
-
`;return`${
|
|
130
|
-
${s}${m}`}else return`${p}${o}${
|
|
131
|
-
`:" ")}return
|
|
127
|
+
`;return`${h}
|
|
128
|
+
${s}${m}`}else return`${p}${o}${u.join(" ")}${o}${m}`}function Ni({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Ye(t(r),e);n.push(i.trimStart())}}function Xt(e,t){let n=_(t)?t.value:t;for(let r of e)if(M(r)&&(r.key===t||r.key===n||_(r.key)&&r.key.value===n))return r}var te=class extends ir{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(Qe,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(lr(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;M(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new X(t,t?.value):r=new X(t.key,t.value);let s=Xt(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);_(s.value)&&Ii(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=Xt(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=Xt(this.items,t)?.value;return(!n&&_(s)?s.value:s)??void 0}has(t){return!!Xt(this.items,t)}set(t,n){this.add(new X(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)Di(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!M(s))throw new Error(`Map items must all be pairs; found ${JSON.stringify(s)} instead`);return!t.allNullValues&&this.hasAllNullValues(!1)&&(t=Object.assign({},t,{allNullValues:!0})),_i(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var nt={collection:"map",default:!0,nodeClass:te,tag:"tag:yaml.org,2002:map",resolve(e,t){return Ze(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>te.from(e,t,n)};var Te=class extends ir{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Et,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=xi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=xi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&_(s)?s.value:s}has(t){let n=xi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=xi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];_(s)&&Ii(n)?s.value=n:this.items[r]=n}toJSON(t,n){let r=[];n?.onCreate&&n.onCreate(r);let s=0;for(let i of this.items)r.push(le(i,String(s++),n));return r}toString(t,n,r){return t?_i(this,t,{blockItemPrefix:"- ",flowChars:{start:"[",end:"]"},itemIndent:(t.indent||"")+" ",onChompKeep:r,onComment:n}):JSON.stringify(this)}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n)){let o=0;for(let a of n){if(typeof s=="function"){let l=n instanceof Set?a:String(o++);a=s.call(n,l,a)}i.items.push($t(a,void 0,r))}}return i}};function xi(e){let t=_(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var rt={collection:"seq",default:!0,nodeClass:Te,tag:"tag:yaml.org,2002:seq",resolve(e,t){return et(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>Te.from(e,t,n)};var Qt={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),Sn(e,t,n,r)}};var Pn={identify:e=>e==null,createNode:()=>new E(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new E(null),stringify:({source:e},t)=>typeof e=="string"&&Pn.test.test(e)?e:t.options.nullStr};var ns={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new E(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&ns.test.test(e)){let r=e[0]==="t"||e[0]==="T";if(t===r)return e}return t?n.options.trueStr:n.options.falseStr}};function be({format:e,minFractionDigits:t,tag:n,value:r}){if(typeof r=="bigint")return String(r);let s=typeof r=="number"?r:Number(r);if(!isFinite(s))return isNaN(s)?".nan":s<0?"-.inf":".inf";let i=Object.is(r,-0)?"-0":JSON.stringify(r);if(!e&&t&&(!n||n==="tag:yaml.org,2002:float")&&/^-?\d/.test(i)&&!i.includes("e")){let o=i.indexOf(".");o<0&&(o=i.length,i+=".");let a=t-(i.length-o-1);for(;a-- >0;)i+="0"}return i}var Li={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:be},Fi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():be(e)}},Mi={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 E(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:be};var ji=e=>typeof e=="bigint"||Number.isInteger(e),rc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function qf(e,t,n){let{value:r}=e;return ji(r)&&r>=0?n+r.toString(t):be(e)}var qi={identify:e=>ji(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>rc(e,2,8,n),stringify:e=>qf(e,8,"0o")},Ui={identify:ji,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>rc(e,0,10,n),stringify:be},Wi={identify:e=>ji(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>rc(e,2,16,n),stringify:e=>qf(e,16,"0x")};var Uf=[nt,rt,Qt,Pn,ns,qi,Ui,Wi,Li,Fi,Mi];function Wf(e){return typeof e=="bigint"||Number.isInteger(e)}var Bi=({value:e})=>JSON.stringify(e),JR=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:Bi},{identify:e=>e==null,createNode:()=>new E(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Bi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:Bi},{identify:Wf,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})=>Wf(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:Bi}],XR={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},Bf=[nt,rt].concat(JR,XR);var rs={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=E.BLOCK_LITERAL),t!==E.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),d=new Array(c);for(let u=0,p=0;u<c;++u,p+=l)d[u]=a.substr(p,l);a=d.join(t===E.BLOCK_LITERAL?`
|
|
129
|
+
`:" ")}return Sn({comment:e,type:t,value:a},r,s,i)}};function sc(e,t){if(et(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!M(r)){if(Ze(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new X(new E(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
|
|
132
130
|
${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment}
|
|
133
|
-
${i.comment}`:r.comment}r=s}e.items[n]=
|
|
134
|
-
`)?(n.push("..."),n.push(
|
|
131
|
+
${i.comment}`:r.comment}r=s}e.items[n]=M(r)?r:new X(r)}}else t("Expected a sequence for this tag");return e}function ic(e,t,n){let{replacer:r}=n,s=new Te(e);s.tag="tag:yaml.org,2002:pairs";let i=0;if(t&&Symbol.iterator in Object(t))for(let o of t){typeof r=="function"&&(o=r.call(t,String(i++),o));let a,l;if(Array.isArray(o))if(o.length===2)a=o[0],l=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let c=Object.keys(o);if(c.length===1)a=c[0],l=o[a];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else a=o;s.items.push(lr(a,l,n))}return s}var ss={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:sc,createNode:ic};var cr=class e extends Te{constructor(){super(),this.add=te.prototype.add.bind(this),this.delete=te.prototype.delete.bind(this),this.get=te.prototype.get.bind(this),this.has=te.prototype.has.bind(this),this.set=te.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(M(s)?(i=le(s.key,"",n),o=le(s.value,i,n)):i=le(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=ic(t,n,r),i=new this;return i.items=s.items,i}};cr.tag="tag:yaml.org,2002:omap";var is={collection:"seq",identify:e=>e instanceof Map,nodeClass:cr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=sc(e,t),r=[];for(let{key:s}of n.items)_(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new cr,n)},createNode:(e,t,n)=>cr.from(e,t,n)};function Vf({value:e,source:t},n){return t&&(e?oc:ac).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var oc={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 E(!0),stringify:Vf},ac={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 E(!1),stringify:Vf};var Kf={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:be},Gf={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,"")),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():be(e)}},Hf={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 E(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:be};var os=e=>typeof e=="bigint"||Number.isInteger(e);function Vi(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 lc(e,t,n){let{value:r}=e;if(os(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return be(e)}var Yf={identify:os,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>Vi(e,2,2,n),stringify:e=>lc(e,2,"0b")},zf={identify:os,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>Vi(e,1,8,n),stringify:e=>lc(e,8,"0")},Jf={identify:os,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>Vi(e,0,10,n),stringify:be},Xf={identify:os,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>Vi(e,2,16,n),stringify:e=>lc(e,16,"0x")};var ur=class e extends te{constructor(t){super(t),this.tag=e.tag}add(t){let n;M(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new X(t.key,null):n=new X(t,null),Xt(this.items,n.key)||this.items.push(n)}get(t,n){let r=Xt(this.items,t);return!n&&M(r)?_(r.key)?r.key.value:r.key:r}set(t,n){if(typeof n!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof n}`);let r=Xt(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new X(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(lr(o,null,r));return i}};ur.tag="tag:yaml.org,2002:set";var as={collection:"map",identify:e=>e instanceof Set,nodeClass:ur,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>ur.from(e,t,n),resolve(e,t){if(Ze(e)){if(e.hasAllNullValues(!0))return Object.assign(new ur,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function cc(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 Qf(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return be(e);let r="";t<0&&(r="-",t*=n(-1));let s=n(60),i=[t%s];return t<60?i.unshift(0):(t=(t-i[0])/s,i.unshift(t%s),t>=60&&(t=(t-i[0])/s,i.unshift(t))),r+i.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var Ki={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})=>cc(e,n),stringify:Qf},Gi={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=>cc(e,!1),stringify:Qf},dr={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(dr.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),d=t[8];if(d&&d!=="Z"){let u=cc(d,!1);Math.abs(u)<30&&(u*=60),c-=6e4*u}return new Date(c)},stringify:({value:e})=>e?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var uc=[nt,rt,Qt,Pn,oc,ac,Yf,zf,Jf,Xf,Kf,Gf,Hf,rs,tt,is,ss,as,Ki,Gi,dr];var Zf=new Map([["core",Uf],["failsafe",[nt,rt,Qt]],["json",Bf],["yaml11",uc],["yaml-1.1",uc]]),em={binary:rs,bool:ns,float:Mi,floatExp:Fi,floatNaN:Li,floatTime:Gi,int:Ui,intHex:Wi,intOct:qi,intTime:Ki,map:nt,merge:tt,null:Pn,omap:is,pairs:ss,seq:rt,set:as,timestamp:dr},tm={"tag:yaml.org,2002:binary":rs,"tag:yaml.org,2002:merge":tt,"tag:yaml.org,2002:omap":is,"tag:yaml.org,2002:pairs":ss,"tag:yaml.org,2002:set":as,"tag:yaml.org,2002:timestamp":dr};function Hi(e,t,n){let r=Zf.get(t);if(r&&!e)return n&&!r.includes(tt)?r.concat(tt):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(Zf.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${t}"; use one of ${i} or define customTags array`)}if(Array.isArray(e))for(let i of e)s=s.concat(i);else typeof e=="function"&&(s=e(s.slice()));return n&&(s=s.concat(tt)),s.reduce((i,o)=>{let a=typeof o=="string"?em[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(em).map(d=>JSON.stringify(d)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${c}`)}return i.includes(a)||i.push(a),i},[])}var QR=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ls=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?Hi(t,"compat"):t?Hi(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?tm:{},this.tags=Hi(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,Qe,{value:nt}),Object.defineProperty(this,Ne,{value:Qt}),Object.defineProperty(this,Et,{value:rt}),this.sortMapEntries=typeof o=="function"?o:o===!0?QR:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function nm(e,t){let n=[],r=t.directives===!0;if(t.directives!==!1&&e.directives){let l=e.directives.toString(e);l?(n.push(l),r=!0):e.directives.docStart&&(r=!0)}r&&n.push("---");let s=Oi(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Ye(l,""))}let o=!1,a=null;if(e.contents){if(j(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let d=i(e.contents.commentBefore);n.push(Ye(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Dt(e.contents,s,()=>a=null,l);a&&(c+=gt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Dt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
|
|
132
|
+
`)?(n.push("..."),n.push(Ye(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(Ye(i(l),"")))}return n.join(`
|
|
135
133
|
`)+`
|
|
136
|
-
`}var
|
|
134
|
+
`}var Zt=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Pe,{value:Ti});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 ht({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Pe]:{value:Ti}});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=j(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){pr(this.contents)&&this.contents.add(t)}addIn(t,n){pr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=zl(this);t.anchor=!n||r.has(n)?Jl(n||"a",r):n}return new Ot(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:d}=r??{},{onAnchor:u,setAnchors:p,sourceObjects:m}=_f(this,o||"a"),h={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:m},f=$t(t,d,h);return a&&U(f)&&(f.flow=!0),p(),f}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new X(s,i)}delete(t){return pr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return or(t)?this.contents==null?!1:(this.contents=null,!0):pr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return U(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return or(t)?!n&&_(this.contents)?this.contents.value:this.contents:U(this.contents)?this.contents.getIn(t,n):void 0}has(t){return U(this.contents)?this.contents.has(t):!1}hasIn(t){return or(t)?this.contents!==void 0:U(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=Qr(this.schema,[t],n):pr(this.contents)&&this.contents.set(t,n)}setIn(t,n){or(t)?this.contents=n:this.contents==null?this.contents=Qr(this.schema,Array.from(t),n):pr(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 ht({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 ht({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 ls(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=le(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:d}of a.anchors.values())i(d,c);return typeof o=="function"?zt(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return nm(this,t)}};function pr(e){if(U(e))return!0;throw new Error("Expected a YAML collection as document contents")}var cs=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},st=class extends cs{constructor(t,n,r){super("YAMLParseError",t,n,r)}},us=class extends cs{constructor(t,n,r){super("YAMLWarning",t,n,r)}},dc=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>t.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
|
|
137
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+=`:
|
|
138
136
|
|
|
139
137
|
${o}
|
|
140
138
|
${c}
|
|
141
|
-
`}};function yt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,
|
|
142
|
-
`))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(
|
|
143
|
-
`+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||
|
|
144
|
-
`+
|
|
145
|
-
`+D.comment:c.comment=D.comment),
|
|
146
|
-
`+
|
|
147
|
-
`+w.comment:
|
|
148
|
-
`+y.comment:c.comment=y.comment),c.range=[r.offset,f,y.offset]}else c.range=[r.offset,f,f];return c}function
|
|
149
|
-
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:f,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,
|
|
150
|
-
`;for(let f=
|
|
139
|
+
`}};function yt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",m=!1,h=!1,f=null,y=null,T=null,R=null,b=null,O=null,$=null;for(let v of e)switch(h&&(v.type!=="space"&&v.type!=="newline"&&v.type!=="comma"&&i(v.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),h=!1),f&&(c&&v.type!=="comment"&&v.type!=="newline"&&i(f,"TAB_AS_INDENT","Tabs are not allowed as indentation"),f=null),v.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&v.source.includes(" ")&&(f=v),d=!0;break;case"comment":{d||i(v,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=v.source.substring(1)||" ";u?u+=p+w:u=w,p="",c=!1;break}case"newline":c?u?u+=v.source:(!O||n!=="seq-item-ind")&&(l=!0):p+=v.source,c=!0,m=!0,(y||T)&&(R=v),d=!0;break;case"anchor":y&&i(v,"MULTIPLE_ANCHORS","A node can have at most one anchor"),v.source.endsWith(":")&&i(v.offset+v.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=v,$??($=v.offset),c=!1,d=!1,h=!0;break;case"tag":{T&&i(v,"MULTIPLE_TAGS","A node can have at most one tag"),T=v,$??($=v.offset),c=!1,d=!1,h=!0;break}case n:(y||T)&&i(v,"BAD_PROP_ORDER",`Anchors and tags must be after the ${v.source} indicator`),O&&i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.source} in ${t??"collection"}`),O=v,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(v,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=v,c=!1,d=!1;break}default:i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.type} token`),c=!1,d=!1}let D=e[e.length-1],x=D?D.offset+D.source.length:s;return h&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f&&(c&&f.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(f,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:O,spaceBefore:l,comment:u,hasNewline:m,anchor:y,tag:T,newlineAfterProp:R,end:x,start:$??x}}function en(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
|
|
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(en(t.key)||en(t.value))return!0}return!1;default:return!0}}function ds(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&en(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function Yi(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||_(i)&&_(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var rm="All mapping items must start at the same column";function sm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:m,value:h}=d,f=yt(u,{indicator:"explicit-key-ind",next:p??m?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!f.found;if(y){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",rm)),!f.anchor&&!f.tag&&!m){c=f.end,f.comment&&(a.comment?a.comment+=`
|
|
141
|
+
`+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||en(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else f.found?.indent!==r.indent&&s(l,"BAD_INDENT",rm);n.atKey=!0;let T=f.end,R=p?e(n,p,f,s):t(n,T,u,null,f,s);n.schema.compat&&ds(r.indent,p,s),n.atKey=!1,Yi(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=yt(m??[],{indicator:"map-value-ind",next:h,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(h?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&f.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 O=h?e(n,h,b,s):t(n,l,m,null,b,s);n.schema.compat&&ds(r.indent,h,s),l=O.range[2];let $=new X(R,O);n.options.keepSourceTokens&&($.srcToken=d),a.items.push($)}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 O=new X(R);n.options.keepSourceTokens&&(O.srcToken=d),a.items.push(O)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function im({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??Te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:d,value:u}of r.items){let p=yt(d,{indicator:"seq-item-ind",next:u,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||u)u?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let m=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&ds(r.indent,u,s),l=m.range[2],a.items.push(m)}return a.range=[r.offset,l,c??l],a}function wt(e,t,n,r){let s="";if(e){let i=!1,o="";for(let a of e){let{source:l,type:c}=a;switch(c){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let d=l.substring(1)||" ";s?s+=o+d:s=d,o="";break}case"newline":s&&(o+=l),i=!0;break;default:r(a,"UNEXPECTED_TOKEN",`Unexpected ${c} at node end`)}t+=l.length}}return{comment:s,offset:t}}var pc="Block collections are not allowed within flow collections",fc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function om({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?te:Te),c=new l(n.schema);c.flow=!0;let d=n.atRoot;d&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let u=r.offset+r.start.source.length;for(let y=0;y<r.items.length;++y){let T=r.items[y],{start:R,key:b,sep:O,value:$}=T,D=yt(R,{flow:a,indicator:"explicit-key-ind",next:b??O?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!O&&!$){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
|
|
143
|
+
`+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&en(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let x="";e:for(let v of R)switch(v.type){case"comma":case"space":break;case"comment":x=v.source.substring(1);break e;default:break e}if(x){let v=c.items[c.items.length-1];M(v)&&(v=v.value??v.key),v.comment?v.comment+=`
|
|
144
|
+
`+x:v.comment=x,D.comment=D.comment.substring(x.length+1)}}if(!o&&!O&&!D.found){let x=$?e(n,$,D,s):t(n,D.end,O,null,D,s);c.items.push(x),u=x.range[2],fc($)&&s(x.range,"BLOCK_IN_FLOW",pc)}else{n.atKey=!0;let x=D.end,v=b?e(n,b,D,s):t(n,x,R,null,D,s);fc(b)&&s(v.range,"BLOCK_IN_FLOW",pc),n.atKey=!1;let w=yt(O??[],{flow:a,indicator:"map-value-ind",next:$,offset:v.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if(O)for(let H of O){if(H===w.found)break;if(H.type==="newline"){s(H,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else $&&("source"in $&&$.source?.[0]===":"?s($,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let ge=$?e(n,$,w,s):w.found?t(n,w.end,O,null,w,s):null;ge?fc($)&&s(ge.range,"BLOCK_IN_FLOW",pc):w.comment&&(v.comment?v.comment+=`
|
|
145
|
+
`+w.comment:v.comment=w.comment);let ye=new X(v,ge);if(n.options.keepSourceTokens&&(ye.srcToken=T),o){let H=c;Yi(n,H.items,v)&&s(x,"DUPLICATE_KEY","Map keys must be unique"),H.items.push(ye)}else{let H=new te(n.schema);H.flow=!0,H.items.push(ye);let fn=(ge??v).range;H.range=[v.range[0],fn[1],fn[2]],c.items.push(H)}u=ge?ge.range[2]:w.end}}let p=o?"}":"]",[m,...h]=r.end,f=u;if(m?.source===p)f=m.offset+m.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),m&&m.source.length!==1&&h.unshift(m)}if(h.length>0){let y=wt(h,f,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
|
|
146
|
+
`+y.comment:c.comment=y.comment),c.range=[r.offset,f,y.offset]}else c.range=[r.offset,f,f];return c}function mc(e,t,n,r,s,i){let o=n.type==="block-map"?sm(e,t,n,r,i):n.type==="block-seq"?im(e,t,n,r,i):om(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function am(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:m}=r,h=p&&i?p.offset>i.offset?p:i:p??i;h&&(!m||m.offset<h.offset)&&s(h,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===te.tagName&&a==="map"||o===Te.tagName&&a==="seq")return mc(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),mc(e,t,n,s,o)}let c=mc(e,t,n,s,o,l),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=j(d)?d:new E(d);return u.range=c.range,u.tag=o,l?.format&&(u.format=l.format),u}function hc(e,t,n){let r=t.offset,s=ZR(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?E.BLOCK_FOLDED:E.BLOCK_LITERAL,o=t.source?eS(t.source):[],a=o.length;for(let f=o.length-1;f>=0;--f){let y=o[f][1];if(y===""||y==="\r")a=f;else break}if(a===0){let f=s.chomp==="+"&&o.length>0?`
|
|
147
|
+
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:f,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let f=0;f<a;++f){let[y,T]=o[f];if(T===""||T==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),d=f,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+T.length+1}for(let f=o.length-1;f>=a;--f)o[f][0].length>l&&(a=f+1);let u="",p="",m=!1;for(let f=0;f<d;++f)u+=o[f][0].slice(l)+`
|
|
148
|
+
`;for(let f=d;f<a;++f){let[y,T]=o[f];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 O=`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",O),y=""}i===E.BLOCK_LITERAL?(u+=p+y.slice(l)+T,p=`
|
|
151
149
|
`):y.length>l||T[0]===" "?(p===" "?p=`
|
|
152
150
|
`:!m&&p===`
|
|
153
151
|
`&&(p=`
|
|
154
152
|
|
|
155
|
-
`),
|
|
153
|
+
`),u+=p+y.slice(l)+T,p=`
|
|
156
154
|
`,m=!0):T===""?p===`
|
|
157
|
-
`?
|
|
155
|
+
`?u+=`
|
|
158
156
|
`:p=`
|
|
159
|
-
`:(
|
|
160
|
-
`+o[f][0].slice(l);
|
|
161
|
-
`&&(
|
|
162
|
-
`);break;default:
|
|
163
|
-
`}let
|
|
157
|
+
`:(u+=p+T,p=" ",m=!1)}switch(s.chomp){case"-":break;case"+":for(let f=a;f<o.length;++f)u+=`
|
|
158
|
+
`+o[f][0].slice(l);u[u.length-1]!==`
|
|
159
|
+
`&&(u+=`
|
|
160
|
+
`);break;default:u+=`
|
|
161
|
+
`}let h=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,h,h]}}function ZR({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let m=s[p];if(!a&&(m==="-"||m==="+"))a=m;else{let h=Number(m);!o&&h?o=h:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let m=t[p];switch(m.type){case"space":c=!0;case"newline":u+=m.source.length;break;case"comment":n&&!c&&r(m,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=m.source.length,d=m.source.substring(1);break;case"error":r(m,"UNEXPECTED_TOKEN",m.message),u+=m.source.length;break;default:{let h=`Unexpected token in block scalar header: ${m.type}`;r(m,"UNEXPECTED_TOKEN",h);let f=m.source;f&&typeof f=="string"&&(u+=f.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function eS(e){let t=e.split(/\n( *)/),n=t[0],r=n.match(/^( *)/),i=[r?.[1]?[r[1],n.slice(r[1].length)]:["",n]];for(let o=1;o<t.length;o+=2)i.push([t[o],t[o+1]]);return i}function gc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,m,h)=>n(r+p,m,h);switch(s){case"scalar":a=E.PLAIN,l=tS(i,c);break;case"single-quoted-scalar":a=E.QUOTE_SINGLE,l=nS(i,c);break;case"double-quoted-scalar":a=E.QUOTE_DOUBLE,l=rS(i,c);break;default:return n(e,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${s}`),{value:"",type:null,comment:"",range:[r,r+i.length,r+i.length]}}let d=r+i.length,u=wt(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function tS(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}`),lm(e)}function nS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),lm(e.slice(1,-1)).replace(/''/g,"'")}function lm(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
|
|
164
162
|
`,"sy"),n=new RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
|
|
165
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===`
|
|
166
164
|
`?s+=i:i=`
|
|
167
|
-
`:(s+=i+r[1],i=" "),o=n.lastIndex;let a=/[ \t]*(.*)/sy;return a.lastIndex=o,r=a.exec(e),s+i+(r?.[1]??"")}function
|
|
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 rS(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
|
|
168
166
|
`))if(s===`
|
|
169
|
-
`){let{fold:i,offset:o}=
|
|
167
|
+
`){let{fold:i,offset:o}=sS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=iS[i];if(o)n+=o;else if(i===`
|
|
170
168
|
`)for(i=e[r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="\r"&&e[r+1]===`
|
|
171
|
-
`)for(i=e[++r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="x"||i==="u"||i==="U"){let a=i==="x"?2:i==="u"?4:8;n+=
|
|
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+=oS(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
|
|
172
170
|
`&&!(o==="\r"&&e[r+2]===`
|
|
173
|
-
`)&&(n+=r>i?e.slice(i,r+1):s)}else n+=s}return(e[e.length-1]!=='"'||e.length===1)&&t(e.length,"MISSING_CHAR",'Missing closing "quote'),n}function
|
|
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 sS(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
|
|
174
172
|
`||r==="\r")&&!(r==="\r"&&e[t+2]!==`
|
|
175
173
|
`);)r===`
|
|
176
174
|
`&&(n+=`
|
|
177
|
-
`),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var
|
|
178
|
-
`,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 iS={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 oS(e,t,n,r){let s=e.substr(t,n),o=s.length===n&&/^[0-9a-fA-F]+$/.test(s)?parseInt(s,16):NaN;try{return String.fromCodePoint(o)}catch{let a=e.substr(t-2,n+2);return r(t-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),a}}function yc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?hc(e,t,r):gc(t,e.options.strict,r),l=n?e.directives.tagName(n.source,u=>r(n,"TAG_RESOLVE_FAILED",u)):null,c;e.options.stringKeys&&e.atKey?c=e.schema[Ne]:l?c=aS(e.schema,s,l,n,r):t.type==="scalar"?c=lS(e,s,t,r):c=e.schema[Ne];let d;try{let u=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);d=_(u)?u:new E(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new E(s)}return d.range=a,d.source=s,i&&(d.type=i),l&&(d.tag=l),c.format&&(d.format=c.format),o&&(d.comment=o),d}function aS(e,t,n,r,s){if(n==="!")return e[Ne];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[Ne])}function lS({atKey:e,directives:t,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||e&&a.default==="key")&&a.test?.test(r))||n[Ne];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[Ne];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),d=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",d,!0)}}return o}function cm(e,t,n){if(t){n??(n=t.length);for(let r=n-1;r>=0;--r){let s=t[r];switch(s.type){case"space":case"comment":case"newline":e-=s.source.length;continue}for(s=t[++r];s?.type==="space";)e+=s.source.length,s=t[++r];break}}return e}var cS={composeNode:wc,composeEmptyNode:zi};function wc(e,t,n,r){let s=e.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=n,c,d=!0;switch(t.type){case"alias":c=uS(e,t,r),(a||l)&&r(t,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":c=yc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=am(cS,e,t,n,r),a&&(c.anchor=a.source.substring(1))}catch(u){let p=u instanceof Error?u.message:String(u);r(t,"RESOURCE_EXHAUSTION",p)}break;default:{let u=t.type==="error"?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",u),d=!1}}return c??(c=zi(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&&(!_(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&r(l??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(c.spaceBefore=!0),o&&(t.type==="scalar"&&t.source===""?c.comment=o:c.commentBefore=o),e.options.keepSourceTokens&&d&&(c.srcToken=t),c}function zi(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:cm(t,n,r),indent:-1,source:""},u=yc(e,d,a,c);return o&&(u.anchor=o.source.substring(1),u.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(u.spaceBefore=!0),i&&(u.comment=i,u.range[2]=l),u}function uS({options:e},{offset:t,source:n,end:r},s){let i=new Ot(n.substring(1));i.source===""&&s(t,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(t+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=t+n.length,a=wt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function um(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new Zt(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=yt(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});d.found&&(l.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!d.hasNewline&&o(d.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=s?wc(c,s,d,o):zi(c,d.end,r,null,d,o);let u=l.contents.range[2],p=wt(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function ps(e){if(typeof e=="number")return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n=="string"?n.length:1)]}function dm(e){let t="",n=!1,r=!1;for(let s=0;s<e.length;++s){let i=e[s];switch(i[0]){case"#":t+=(t===""?"":r?`
|
|
179
177
|
|
|
180
178
|
`:`
|
|
181
|
-
`)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var
|
|
182
|
-
${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(
|
|
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 fs=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=ps(n);i?this.warnings.push(new us(o,r,s)):this.errors.push(new st(o,r,s))},this.directives=new ht({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=dm(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
|
|
180
|
+
${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(U(i)&&!i.flow&&i.items.length>0){let o=i.items[0];M(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r}
|
|
183
181
|
${a}`:r}else{let o=i.commentBefore;i.commentBefore=o?`${r}
|
|
184
|
-
${o}`:r}}if(n){for(let i=0;i<this.errors.length;++i)t.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)t.warnings.push(this.warnings[i])}else t.errors=this.errors,t.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:
|
|
185
|
-
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new st(
|
|
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:dm(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=ps(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=um(this.options,this.directives,t,this.onError);this.atDirectives&&!n.directives.docStart&&this.onError(t,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(n,!1),this.doc&&(yield this.doc),this.doc=n,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(t.source);break;case"error":{let n=t.source?`${t.message}: ${JSON.stringify(t.source)}`:t.message,r=new st(ps(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new st(ps(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=wt(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
|
|
183
|
+
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new st(ps(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new Zt(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};var kc=Symbol("break visit"),dS=Symbol("skip children"),pm=Symbol("remove item");function In(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),fm(Object.freeze([]),e,t)}In.BREAK=kc;In.SKIP=dS;In.REMOVE=pm;In.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};In.parentCollection=(e,t)=>{let n=In.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 fm(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=fm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===kc)return kc;a===pm&&(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 Tc="\uFEFF",bc="",Rc="",Ji="";function mm(e){switch(e){case Tc:return"byte-order-mark";case bc:return"doc-mode";case Rc:return"flow-error-end";case Ji:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
|
|
186
184
|
`:case`\r
|
|
187
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 it(e){switch(e){case void 0:case" ":case`
|
|
188
|
-
`:case"\r":case" ":return!0;default:return!1}}var
|
|
189
|
-
\r `),
|
|
186
|
+
`:case"\r":case" ":return!0;default:return!1}}var hm=new Set("0123456789ABCDEFabcdef"),fS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Xi=new Set(",[]{}"),mS=new Set(` ,[]{}
|
|
187
|
+
\r `),Sc=e=>!e||mS.has(e),ms=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
|
|
190
188
|
`?!0:n==="\r"?this.buffer[t+1]===`
|
|
191
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===`
|
|
192
190
|
`||!s&&!this.atEnd)return t+r+1}return n===`
|
|
193
191
|
`||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&it(this.buffer[t+3]))return-1}return t}getLine(){let t=this.lineEndPos;return(typeof t!="number"||t!==-1&&t<this.pos)&&(t=this.buffer.indexOf(`
|
|
194
|
-
`,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===
|
|
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]===Tc&&(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 bc,yield*this.parseLineStart()}*parseLineStart(){let t=this.charAt(0);if(!t&&!this.atEnd)return this.setNext("line-start");if(t==="-"||t==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");let n=this.peek(3);if((n==="---"||n==="...")&&it(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,n==="---"?"doc":"stream"}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!it(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[t,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((t==="-"||t==="?"||t===":")&&it(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let t=this.getLine();if(t===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(t[n]){case"#":yield*this.pushCount(t.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(Sc),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(t.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let t,n,r=-1;do t=yield*this.pushNewline(),t>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(t+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r<this.indentNext&&s[0]!=="#"||r===0&&(s.startsWith("---")||s.startsWith("..."))&&it(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Rc,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(Sc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||it(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
|
|
195
193
|
`,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
|
|
196
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=>it(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
|
|
197
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===`
|
|
198
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(`
|
|
199
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===`
|
|
200
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===`
|
|
201
|
-
`&&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 Ji,yield*this.pushToIndex(t+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let t=this.flowLevel>0,n=this.pos-1,r=this.pos-1,s;for(;s=this.buffer[++r];)if(s===":"){let i=this.buffer[r+1];if(it(i)||t&&Xi.has(i))break;n=r}else if(it(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
|
|
202
200
|
`?(r+=1,s=`
|
|
203
|
-
`,i=this.buffer[r+1]):n=r),i==="#"||t&&
|
|
204
|
-
`){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&&Xi.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&&Xi.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield Ji,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(Sc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(it(r)||n&&Xi.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,t+=yield*this.pushCount(1),t+=yield*this.pushSpaces(!0);continue e}}}break e}return t}*pushTag(){if(this.charAt(1)==="<"){let t=this.pos+2,n=this.buffer[t];for(;!it(n)&&n!==">";)n=this.buffer[++t];return yield*this.pushToIndex(n===">"?t+1:t,!1)}else{let t=this.pos+1,n=this.buffer[t];for(;n;)if(fS.has(n))n=this.buffer[++t];else if(n==="%"&&hm.has(this.buffer[t+1])&&hm.has(this.buffer[t+2]))n=this.buffer[t+=3];else break;return yield*this.pushToIndex(t,!1)}}*pushNewline(){let t=this.buffer[this.pos];return t===`
|
|
205
203
|
`?yield*this.pushCount(1):t==="\r"&&this.charAt(1)===`
|
|
206
|
-
`?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var
|
|
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 hs=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function tn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function gm(e){for(let t=0;t<e.length;++t)switch(e[t].type){case"space":case"comment":case"newline":break;default:return t}return-1}function wm(e){switch(e?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return!0;default:return!1}}function Qi(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 fr(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 Zi(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 ym(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!tn(t.start,"explicit-key-ind")&&!tn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,wm(t.value)?t.value.end?Zi(t.value.end,t.sep):t.value.end=t.sep:Zi(t.start,t.sep),delete t.sep)}var gs=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 ms,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=mm(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"&&ym(n),r.type){case"document":r.value=n;break;case"block-scalar":r.props.push(n);break;case"block-map":{let s=r.items[r.items.length-1];if(s.value){r.items.push({start:[],key:n,sep:[]}),this.onKeyLine=!0;return}else if(s.sep)s.value=n;else{Object.assign(s,{key:n,sep:[]}),this.onKeyLine=!s.explicitKey;return}break}case"block-seq":{let s=r.items[r.items.length-1];s.value?r.items.push({start:[],value:n}):s.value=n;break}case"flow-collection":{let s=r.items[r.items.length-1];!s||s.value?r.items.push({start:[],key:n,sep:[]}):s.sep?s.value=n:Object.assign(s,{key:n,sep:[]});return}default:yield*this.pop(),yield*this.pop(n)}if((r.type==="document"||r.type==="block-map"||r.type==="block-seq")&&(n.type==="block-map"||n.type==="block-seq")){let s=n.items[n.items.length-1];s&&!s.sep&&!s.value&&s.start.length>0&&gm(s.start)===-1&&(n.indent===0||s.start.every(i=>i.type!=="comment"||i.indent<n.indent))&&(r.type==="document"?r.end=s.start:r.items.push({start:s.start}),n.items.splice(-1,1))}}}*stream(){switch(this.type){case"directive-line":yield{type:"directive",offset:this.offset,source:this.source};return;case"byte-order-mark":case"space":case"comment":case"newline":yield this.sourceToken;return;case"doc-mode":case"doc-start":{let t={type:"document",offset:this.offset,start:[]};this.type==="doc-start"&&t.start.push(this.sourceToken),this.stack.push(t);return}}yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(t){if(t.value)return yield*this.lineEnd(t);switch(this.type){case"doc-start":{gm(t.start)!==-1?(yield*this.pop(),yield*this.step()):t.start.push(this.sourceToken);return}case"anchor":case"tag":case"space":case"comment":case"newline":t.start.push(this.sourceToken);return}let n=this.startBlockValue(t);n?this.stack.push(n):yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}*scalar(t){if(this.type==="map-value-ind"){let n=Qi(this.peek(2)),r=fr(n),s;t.end?(s=t.end,s.push(this.sourceToken),delete t.end):s=[this.sourceToken];let i={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:r,key:t,sep:s}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(t)}*blockScalar(t){switch(this.type){case"space":case"comment":case"newline":t.props.push(this.sourceToken);return;case"scalar":if(t.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let n=this.source.indexOf(`
|
|
207
205
|
`)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
|
|
208
|
-
`,n)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else if(n.sep)n.sep.push(this.sourceToken);else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){
|
|
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)){Zi(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(tn(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(wm(n.key)&&!tn(n.sep,"newline")){let o=fr(n.start),a=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(tn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=fr(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?t.items.push({start:i,key:null,sep:[this.sourceToken]}):tn(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(t.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(t);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!tn(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){Zi(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||tn(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){let r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){let n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}let r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=Qi(r),i=fr(s);ym(t);let o=t.end.splice(1,t.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:i,key:t,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(t)}}flowScalar(t){if(this.onNewLine){let n=this.source.indexOf(`
|
|
209
207
|
`)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
|
|
210
|
-
`,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=so(t),r=hr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=so(t),r=hr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function HS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new ks||null,prettyErrors:t}}function $c(e,t={}){let{lineCounter:n,prettyErrors:r}=HS(t),s=new Ts(n?.addNewLine),i=new ys(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new st(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(wc(e,n)),o.warnings.forEach(wc(e,n))),o}var bs=1024*1024;function Dc(e,t){Buffer.byteLength(e)>bs&&oo(t,[`Definition exceeds ${bs} bytes.`]);let n=$c(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Ye(n,(i,o)=>{_e(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&oo(t,s),n.contents===null&&oo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){oo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function oo(e,t){throw new h("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}import{createHash as zS}from"node:crypto";var yr=/^[a-z][a-z0-9_-]{0,63}$/,Fm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Lm=32,Mm=128,JS=16,XS=32,QS=10080*60*1e3,wr=32*1024,jm=16;function _c(e,t){let n=[],r=Fe(e,"$",n);ot(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=cP(r.name,"$.name",n),i=eP(r.limits,n),o=tP(r.inputs,n),a=nP(r.steps,n);a.length>Mm&&n.push(`$.steps may contain at most ${Mm} steps.`),a.filter(d=>d.kind==="agent"&&d.createChild).length>i.maxTasks&&n.push("$.steps creates more child tasks than limits.max_tasks allows.");let l=new Set(a.map(d=>d.id));for(let d of a)for(let p of d.needs)l.has(p)||n.push(`$.steps.${d.id}.needs references missing step "${p}".`),p===d.id&&n.push(`$.steps.${d.id}.needs cannot reference itself.`);let c=iP(a,n);c&&oP(a,o,c.ancestors,n),n.length>0&&pP(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:zS("sha256").update(xc(u)).digest("hex"),order:c.order,waves:ZS(c.waves,i.maxConcurrency)}}function ZS(e,t){return e.flatMap(n=>{let r=[];for(let s=0;s<n.length;s+=t)r.push(n.slice(s,s+t));return r})}function eP(e,t){let n=Fe(e,"$.limits",t);ot(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=qm(n.max_concurrency,"$.limits.max_concurrency",1,JS,t),s=qm(n.max_tasks,"$.limits.max_tasks",1,XS,t),i=Bm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function tP(e,t){if(e===void 0)return{};let n=Fe(e,"$.inputs",t),r=Object.entries(n);r.length>Lm&&t.push(`$.inputs may contain at most ${Lm} inputs.`);let s={};for(let[i,o]of r){yr.test(i)||t.push(`$.inputs key "${i}" must match ${yr}.`);let a=Fe(o,`$.inputs.${i}`,t);ot(a,["type","required","default"],`$.inputs.${i}`,t);let l=uP(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:dP(a.required,`$.inputs.${i}.required`,t);c&&a.default!==void 0&&t.push(`$.inputs.${i} cannot be required and have a default.`),a.default!==void 0&&!Um(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Um(a.default,l)?{defaultValue:a.default}:{}}}return s}function nP(e,t){let n=Fe(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{yr.test(s)||t.push(`$.steps key "${s}" must match ${yr}.`);let o=Fe(i,`$.steps.${s}`,t),a=Wm(o.needs,`$.steps.${s}.needs`,t);return new Set(a).size!==a.length&&t.push(`$.steps.${s}.needs cannot contain duplicates.`),o.human_review!==void 0?sP(s,o,a,t):rP(s,o,a,t)})}function rP(e,t,n,r){ot(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?rn(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=Fe(t.create_child,`$.steps.${e}.create_child`,r);ot(d,["repo"],`$.steps.${e}.create_child`,r),a={repo:rn(d.repo,`$.steps.${e}.create_child.repo`,r)}}let l;if(t.agent!==void 0){let d=Fe(t.agent,`$.steps.${e}.agent`,r);if(ot(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=k.runners.parse(rn(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=rn(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>wr&&r.push(`$.steps.${e}.prompt exceeds ${wr} bytes.`);let u;if(t.output!==void 0){let d=Fe(t.output,`$.steps.${e}.output`,r);ot(d,["schema"],`$.steps.${e}.output`,r),u=Nc(d.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...u?{outputSchema:u}:{}}}function sP(e,t,n,r){ot(t,["needs","human_review"],`$.steps.${e}`,r);let s=Fe(t.human_review,`$.steps.${e}.human_review`,r);ot(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Fe(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ot(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=rn(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:rn(s.title,`$.steps.${e}.human_review.title`,r),summary:rn(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:Bm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Nc(e,t,n,r){if(r>jm)return n.push(`${t} exceeds the maximum schema depth of ${jm}.`),{};let s=Fe(e,t,n);ot(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&Wm(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=Fe(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Nc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Nc(s.items,`${t}.items`,n,r+1),s}function iP(e,t){let n=new Set(e.map(d=>d.id));if(e.some(d=>d.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((d,p)=>[d.id,p])),s=new Map(e.map(d=>[d.id,d.needs.length])),i=new Map;for(let d of e)for(let p of d.needs)i.set(p,[...i.get(p)??[],d.id]);let o=e.filter(d=>d.needs.length===0).map(d=>d.id),a=[],l=[];for(;o.length>0;){o.sort((m,g)=>r.get(m)-r.get(g));let d=o;l.push(d),a.push(...d);let p=[];for(let m of d)for(let g of i.get(m)??[]){let f=s.get(g)-1;s.set(g,f),f===0&&p.push(g)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(d=>[d.id,d])),u=new Map;for(let d of a){let p=new Set;for(let m of c.get(d).needs){p.add(m);for(let g of u.get(m)??[])p.add(g)}u.set(d,p)}return{order:a,waves:l,ancestors:u}}function oP(e,t,n,r){let s=new Map(e.map(i=>[i.id,i]));for(let i of e){let o=i.kind==="agent"?[i.task,i.createChild?.repo,i.prompt]:[i.title,i.summary,i.feedbackTask];for(let a of o){if(a===void 0)continue;let l=[...a.matchAll(Fm)],c=a.replace(Fm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)aP(u[1].trim(),i,t,n,s,r)}}}function aP(e,t,n,r,s,i){let o=/^inputs\.([a-z][a-z0-9_-]{0,63})$/.exec(e);if(o){n[o[1]]||i.push(`$.steps.${t.id} references undeclared input "${o[1]}".`);return}let a=/^steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)$/.exec(e);if(!a){i.push(`$.steps.${t.id} contains unsupported reference "${e}".`);return}let l=a[1];if(!(r.get(t.id)?.has(l)??!1)){i.push(`$.steps.${t.id} references step "${l}" without depending on it.`);return}let c=s.get(l);!c||c.kind!=="agent"?i.push(`$.steps.${t.id} references an output from non-agent step "${l}".`):a[2].startsWith("output")&&!c.outputSchema?i.push(`$.steps.${t.id} references output from step "${l}" without a declared output schema.`):a[2].startsWith("output.")&&c.outputSchema&&lP(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function lP(e,t,n,r,s){let i=r;for(let o of n){if(i.type!=="object"){s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}if(!ao(i.properties)){i.additionalProperties===!1&&s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}if(!Object.hasOwn(i.properties,o)){s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}let a=i.properties[o];if(!ao(a))return;i=a}}function xc(e){return Array.isArray(e)?`[${e.map(xc).join(",")}]`:ao(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xc(e[t])}`).join(",")}}`:JSON.stringify(e)}function Fe(e,t,n){return ao(e)?e:(n.push(`${t} must be an object.`),{})}function ot(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function cP(e,t,n){let r=rn(e,t,n);return yr.test(r)||n.push(`${t} must match ${yr}.`),r}function rn(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Wm(e,t,n){return e===void 0?[]:!Array.isArray(e)||e.some(r=>typeof r!="string"||r.length===0)?(n.push(`${t} must be an array of non-empty strings.`),[]):e}function qm(e,t,n,r,s){return Number.isInteger(e)&&Number(e)>=n&&Number(e)<=r?Number(e):(s.push(`${t} must be an integer from ${n} through ${r}.`),n)}function dP(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function uP(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Um(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function Bm(e,t,n){if(typeof e!="string")return n.push(`${t} must be a duration such as 30m, 2h, or 1d.`),1;let r=/^(\d+)(ms|s|m|h|d)$/.exec(e);if(!r)return n.push(`${t} must be a duration such as 30m, 2h, or 1d.`),1;let s={ms:1,s:1e3,m:6e4,h:36e5,d:864e5},i=Number(r[1])*s[r[2]];return!Number.isSafeInteger(i)||i<1||i>QS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function pP(e,t){throw new h("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var ao=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as fP,stat as mP}from"node:fs/promises";var gP=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Fc(e){let t=await Vm(e);return{kind:"validateFury",schemaVersion:1,valid:!0,file:e,definitionHash:t.hash,name:t.definition.name,inputNames:Object.keys(t.definition.inputs),stepCount:t.definition.steps.length,order:t.order,limits:t.definition.limits}}async function Lc(e,t){let n=await Vm(e),r=hP(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:kr(l.title,r,`$.steps.${a}.human_review.title`),summary:kr(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?kr(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:kr(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",repo:kr(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)},runner:l.runner??null,prompt:kP(l.prompt,r,a),outputSchema:l.outputSchema??null,review:null}});return{schemaVersion:1,file:e,definitionHash:n.hash,name:n.definition.name,inputs:r,limits:n.definition.limits,order:n.order,waves:n.waves,steps:o}}async function Vm(e){let t;try{let n=await mP(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>bs)throw new Error(`Definition exceeds ${bs} bytes.`);t=await fP(e,"utf8")}catch(n){throw new h("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return _c(Dc(t,e),e)}function hP(e,t){let n=[];for(let s of Object.keys(t))e[s]||n.push(`Input "${s}" is not declared.`);let r={};for(let[s,i]of Object.entries(e)){let o=t[s];o!==void 0?r[s]=yP(o,i.type,s,n):i.defaultValue!==void 0?r[s]=i.defaultValue:i.required&&n.push(`Required input "${s}" was not provided.`)}if(n.length>0)throw new h("FURY_INPUT_INVALID","Fury inputs are invalid.",{details:{issues:n}});return r}function yP(e,t,n,r){if(t==="string")return e;if(t==="number"){if(e.trim().length===0)return r.push(`Input "${n}" must be a finite number.`),0;let s=Number(e);return Number.isFinite(s)?s:(r.push(`Input "${n}" must be a finite number.`),0)}return e==="true"?!0:(e==="false"||r.push(`Input "${n}" must be true or false.`),!1)}function wP(e,t){return e.replace(gP,(n,r)=>{if(!Object.hasOwn(t,r))throw new h("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function kr(e,t,n){let r=wP(e,t);if(r.trim().length===0)throw new h("FURY_INPUT_INVALID",`Resolved ${n} must be a non-empty string.`,{details:{location:n}});return r}function kP(e,t,n){let r=`$.steps.${n}.prompt`,s=kr(e,t,r);if(Buffer.byteLength(s)>wr)throw new h("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${wr} bytes.`,{details:{location:r,maxBytes:wr}});return s}import{createHash as Km}from"node:crypto";import TP from"node:path";import{mkdir as bP}from"node:fs/promises";var Mc={type:"system",component:"heartbeat"};async function sn(e,t={}){await bP(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([R.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):At.listAgents(e),If(e),AP(e)]),o=r??ut(n.tasks.filter(g=>g.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=CP(i),l=a!==i,c=[],u=jc(s.filter(vP),g=>g.taskId),d=jc(s.filter(g=>g.type.startsWith("task.pr.")),g=>g.taskId),p=jc(s.filter(g=>g.type==="agent.state.changed"),g=>g.agentTabId);for(let g of n.tasks){let f=RP(g),y=u.get(g.id),T=Uc(y?.data)??a.tasks[g.id]??null,S=y?.id??a.tasks[g.id]?.eventId??null;if(T?.signature!==f.signature){let _=T?g.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",C=await Ne(e,{id:qc(_,g.id,f.signature),type:_,taskId:g.id,workspaceId:g.workspaceId||null,occurredAt:g.updatedAt,actor:Mc,data:{...f,changedFields:T?PP(T,f):[]}});c.push(C),S=C.id}a.tasks[g.id]={...f,eventId:S};let v=IP(g.prs),b=d.get(g.id),$=Uc(b?.data)??a.pullRequests[g.id]??null,D=b?.id??a.pullRequests[g.id]?.eventId??null;if(($||v.associations.length>0)&&$?.signature!==v.signature){let _=Array.isArray($?.associations)?$.associations.length:0,C=v.associations.length>_?"task.pr.linked":v.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await Ne(e,{id:qc(C,g.id,v.signature),type:C,taskId:g.id,workspaceId:g.workspaceId||null,occurredAt:g.updatedAt,actor:Mc,data:v});c.push(w),D=w.id}a.pullRequests[g.id]={...v,eventId:D}}let m=new Map(o.tasks.map(g=>[g.taskId,g.state]));for(let g of o.agents){let f=p.get(g.tabId),y=Uc(f?.data)??a.agents[g.tabId]??null;if(y?.state===g.state){a.agents[g.tabId]={state:g.state,eventId:f?.id??a.agents[g.tabId]?.eventId??null};continue}let T=[f?.id??a.agents[g.tabId]?.eventId??"initial",g.state,g.sessionState??"none",g.lastActivityAt??"none",g.exitCode??"none",g.error??"none"].join(":"),S=await Ne(e,{id:qc("agent.state.changed",g.tabId,T),type:"agent.state.changed",taskId:g.taskId,agentTabId:g.tabId,actor:Mc,data:{previousState:typeof y?.state=="string"?y.state:null,state:g.state,taskState:m.get(g.taskId)??"idle",sessionState:g.sessionState,lastActivityAt:g.lastActivityAt,exitCode:g.exitCode,error:g.error}});c.push(S),a.agents[g.tabId]={state:g.state,eventId:S.id}}return(c.length>0||l)&&await M(Hm(e),a),c}function RP(e){let t={status:e.status,title:e.title,runner:e.runner,branch:e.branch,lastCommitSha:e.lastCommit?.sha??null,checksStatus:e.checks.status,checksLastRunAt:e.checks.lastRunAt,sourceUpdatedAt:e.updatedAt,agentTabIds:e.ptyTabs.filter(n=>n.kind==="agent").map(n=>n.id)};return{...t,signature:Gm(t)}}var SP=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function PP(e,t){return SP.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function IP(e){let t=e.map(n=>({provider:n.provider,owner:n.owner,repo:n.repo,number:n.number,url:n.url,status:n.status,draft:n.draft,headBranch:n.headBranch,lastSyncedAt:n.lastSyncedAt,lastSyncedHeadSha:n.lastSyncedHeadSha}));return{associations:t,signature:Gm(t)}}function jc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var vP=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Gm=e=>Km("sha256").update(JSON.stringify(e)).digest("hex"),qc=(...e)=>Km("sha256").update(e.join("\0")).digest("hex"),Uc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Hm=e=>TP.join(e.orchestrationDir,"event-reconciliation.json");function CP(e){return e?.schemaVersion===1&&typeof e.tasks=="object"&&e.tasks!==null&&typeof e.pullRequests=="object"&&e.pullRequests!==null&&typeof e.agents=="object"&&e.agents!==null?e:{schemaVersion:1,tasks:{},pullRequests:{},agents:{}}}async function AP(e){try{return await Ms(Hm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function EP(e,t){return await Wc(e),await sn(e),In(e,t)}async function OP(e,t,n){await Wc(e);let r=await At.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await sn(e,{agentObserver:r});let a=await In(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await Ym(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function $P(e,t,n){await Wc(e);let r=await R.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new h("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await At.openObserver(e);try{await sn(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=ut([r],s.getSnapshots(),l),u=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw NP(t);let d=a-Date.now();if(d<=0)throw DP(t,n.states,n.timeoutMs);await sn(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await Ym(Math.min(250,d),n.signal)}}finally{s.close()}}async function Wc(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new h("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function Ym(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var DP=(e,t,n)=>new h("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),NP=e=>new h("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),lo={list:EP,watch:OP,waitForTaskState:$P,reconcile:sn};import{readFile as FP}from"node:fs/promises";import{createConnection as xP}from"node:net";async function Nt(e){let t=await Vc(pt(e).socketPath).catch(()=>null);if(!t)return!1;try{return(await Tr(t,{type:"ping"})).protocolVersion!==Ht?!1:(await Tr(t,{type:"wakeOrchestration"}),!0)}catch{return!1}finally{t.end()}}async function Bc(e,t){if(t.length===0)return!0;let n=await Vc(pt(e).socketPath).catch(()=>null);if(!n)return!1;try{if((await Tr(n,{type:"ping"})).protocolVersion!==Ht)return!1;for(let s of t)await Tr(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function zm(e,t){let n=await Vc(pt(e).socketPath).catch(()=>null);if(!n)throw new Error("Craig PTY daemon is unavailable for delegated agent startup.");try{if((await Tr(n,{type:"ping"})).protocolVersion!==Ht)throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Tr(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}var _P=1;function Tr(e,t){let n=_P++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>s(new Error("Craig PTY daemon request timed out.")),1e3),a=c=>{i+=String(c);let u=i.indexOf(`
|
|
211
|
-
`);
|
|
212
|
-
`)
|
|
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=Qi(t),r=fr(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=Qi(t),r=fr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function hS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new hs||null,prettyErrors:t}}function Pc(e,t={}){let{lineCounter:n,prettyErrors:r}=hS(t),s=new gs(n?.addNewLine),i=new fs(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new st(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(dc(e,n)),o.warnings.forEach(dc(e,n))),o}var ys=1024*1024;function Ic(e,t){Buffer.byteLength(e)>ys&&eo(t,[`Definition exceeds ${ys} bytes.`]);let n=Pc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];He(n,(i,o)=>{_e(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&eo(t,s),n.contents===null&&eo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){eo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function eo(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 yS}from"node:crypto";var mr=/^[a-z][a-z0-9_-]{0,63}$/,km=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Tm=32,bm=128,wS=16,kS=32,TS=10080*60*1e3,hr=32*1024,Rm=16;function Ac(e,t){let n=[],r=xe(e,"$",n);ot(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=$S(r.name,"$.name",n),i=RS(r.limits,n),o=SS(r.inputs,n),a=PS(r.steps,n);a.length>bm&&n.push(`$.steps may contain at most ${bm} steps.`),a.filter(u=>u.kind==="agent"&&u.createChild).length>i.maxTasks&&n.push("$.steps creates more child tasks than limits.max_tasks allows.");let l=new Set(a.map(u=>u.id));for(let u of a)for(let p of u.needs)l.has(p)||n.push(`$.steps.${u.id}.needs references missing step "${p}".`),p===u.id&&n.push(`$.steps.${u.id}.needs cannot reference itself.`);let c=CS(a,n);c&&AS(a,o,c.ancestors,n),n.length>0&&_S(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:yS("sha256").update(Cc(d)).digest("hex"),order:c.order,waves:bS(c.waves,i.maxConcurrency)}}function bS(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 RS(e,t){let n=xe(e,"$.limits",t);ot(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Sm(n.max_concurrency,"$.limits.max_concurrency",1,wS,t),s=Sm(n.max_tasks,"$.limits.max_tasks",1,kS,t),i=vm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function SS(e,t){if(e===void 0)return{};let n=xe(e,"$.inputs",t),r=Object.entries(n);r.length>Tm&&t.push(`$.inputs may contain at most ${Tm} inputs.`);let s={};for(let[i,o]of r){mr.test(i)||t.push(`$.inputs key "${i}" must match ${mr}.`);let a=xe(o,`$.inputs.${i}`,t);ot(a,["type","required","default"],`$.inputs.${i}`,t);let l=NS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:DS(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&&!Pm(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Pm(a.default,l)?{defaultValue:a.default}:{}}}return s}function PS(e,t){let n=xe(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{mr.test(s)||t.push(`$.steps key "${s}" must match ${mr}.`);let o=xe(i,`$.steps.${s}`,t),a=Im(o.needs,`$.steps.${s}.needs`,t);return new Set(a).size!==a.length&&t.push(`$.steps.${s}.needs cannot contain duplicates.`),o.human_review!==void 0?vS(s,o,a,t):IS(s,o,a,t)})}function IS(e,t,n,r){ot(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?Nt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=xe(t.create_child,`$.steps.${e}.create_child`,r);ot(u,["repo","workspace"],`$.steps.${e}.create_child`,r),u.repo!==void 0&&u.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...u.repo!==void 0?{repo:Nt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Nt(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=xe(t.agent,`$.steps.${e}.agent`,r);if(ot(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(Nt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Nt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>hr&&r.push(`$.steps.${e}.prompt exceeds ${hr} bytes.`);let d;if(t.output!==void 0){let u=xe(t.output,`$.steps.${e}.output`,r);ot(u,["schema"],`$.steps.${e}.output`,r),d=vc(u.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...d?{outputSchema:d}:{}}}function vS(e,t,n,r){ot(t,["needs","human_review"],`$.steps.${e}`,r);let s=xe(t.human_review,`$.steps.${e}.human_review`,r);ot(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=xe(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ot(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Nt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Nt(s.title,`$.steps.${e}.human_review.title`,r),summary:Nt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:vm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function vc(e,t,n,r){if(r>Rm)return n.push(`${t} exceeds the maximum schema depth of ${Rm}.`),{};let s=xe(e,t,n);ot(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&Im(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=xe(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))vc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&vc(s.items,`${t}.items`,n,r+1),s}function CS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((m,h)=>r.get(m)-r.get(h));let u=o;l.push(u),a.push(...u);let p=[];for(let m of u)for(let h of i.get(m)??[]){let f=s.get(h)-1;s.set(h,f),f===0&&p.push(h)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let m of c.get(u).needs){p.add(m);for(let h of d.get(m)??[])p.add(h)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function AS(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(km)],c=a.replace(km,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)ES(d[1].trim(),i,t,n,s,r)}}}function ES(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&&OS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function OS(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(!to(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(!to(a))return;i=a}}function Cc(e){return Array.isArray(e)?`[${e.map(Cc).join(",")}]`:to(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Cc(e[t])}`).join(",")}}`:JSON.stringify(e)}function xe(e,t,n){return to(e)?e:(n.push(`${t} must be an object.`),{})}function ot(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function $S(e,t,n){let r=Nt(e,t,n);return mr.test(r)||n.push(`${t} must match ${mr}.`),r}function Nt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Im(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 Sm(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 DS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function NS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Pm(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function vm(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>TS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function _S(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var to=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as xS,stat as LS}from"node:fs/promises";var FS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Ec(e){let t=await Cm(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 Oc(e,t){let n=await Cm(e),r=MS(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:vn(l.title,r,`$.steps.${a}.human_review.title`),summary:vn(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?vn(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:vn(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:vn(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:vn(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:US(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 Cm(e){let t;try{let n=await LS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>ys)throw new Error(`Definition exceeds ${ys} bytes.`);t=await xS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Ac(Ic(t,e),e)}function MS(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]=jS(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 jS(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 qS(e,t){return e.replace(FS,(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 vn(e,t,n){let r=qS(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 US(e,t,n){let r=`$.steps.${n}.prompt`,s=vn(e,t,r);if(Buffer.byteLength(s)>hr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${hr} bytes.`,{details:{location:r,maxBytes:hr}});return s}import{createHash as Am}from"node:crypto";import WS from"node:path";import{mkdir as BS}from"node:fs/promises";var $c={type:"system",component:"heartbeat"};async function nn(e,t={}){await BS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):At.listAgents(e),lf(e),JS(e)]),o=r??pt(n.tasks.filter(h=>h.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=zS(i),l=a!==i,c=[],d=Dc(s.filter(YS),h=>h.taskId),u=Dc(s.filter(h=>h.type.startsWith("task.pr.")),h=>h.taskId),p=Dc(s.filter(h=>h.type==="agent.state.changed"),h=>h.agentTabId);for(let h of n.tasks){let f=VS(h),y=d.get(h.id),T=_c(y?.data)??a.tasks[h.id]??null,R=y?.id??a.tasks[h.id]?.eventId??null;if(T?.signature!==f.signature){let x=T?h.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await De(e,{id:Nc(x,h.id,f.signature),type:x,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:$c,data:{...f,changedFields:T?GS(T,f):[]}});c.push(v),R=v.id}a.tasks[h.id]={...f,eventId:R};let b=HS(h.prs),O=u.get(h.id),$=_c(O?.data)??a.pullRequests[h.id]??null,D=O?.id??a.pullRequests[h.id]?.eventId??null;if(($||b.associations.length>0)&&$?.signature!==b.signature){let x=Array.isArray($?.associations)?$.associations.length:0,v=b.associations.length>x?"task.pr.linked":b.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await De(e,{id:Nc(v,h.id,b.signature),type:v,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:$c,data:b});c.push(w),D=w.id}a.pullRequests[h.id]={...b,eventId:D}}let m=new Map(o.tasks.map(h=>[h.taskId,h.state]));for(let h of o.agents){let f=p.get(h.tabId),y=_c(f?.data)??a.agents[h.tabId]??null;if(y?.state===h.state){a.agents[h.tabId]={state:h.state,eventId:f?.id??a.agents[h.tabId]?.eventId??null};continue}let T=[f?.id??a.agents[h.tabId]?.eventId??"initial",h.state,h.sessionState??"none",h.lastActivityAt??"none",h.exitCode??"none",h.error??"none"].join(":"),R=await De(e,{id:Nc("agent.state.changed",h.tabId,T),type:"agent.state.changed",taskId:h.taskId,agentTabId:h.tabId,actor:$c,data:{previousState:typeof y?.state=="string"?y.state:null,state:h.state,taskState:m.get(h.taskId)??"idle",sessionState:h.sessionState,lastActivityAt:h.lastActivityAt,exitCode:h.exitCode,error:h.error}});c.push(R),a.agents[h.tabId]={state:h.state,eventId:R.id}}return(c.length>0||l)&&await q(Om(e),a),c}function VS(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:Em(t)}}var KS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function GS(e,t){return KS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function HS(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:Em(t)}}function Dc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var YS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Em=e=>Am("sha256").update(JSON.stringify(e)).digest("hex"),Nc=(...e)=>Am("sha256").update(e.join("\0")).digest("hex"),_c=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Om=e=>WS.join(e.orchestrationDir,"event-reconciliation.json");function zS(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 JS(e){try{return await Ns(Om(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function XS(e,t){return await xc(e),await nn(e),Tn(e,t)}async function QS(e,t,n){await xc(e);let r=await At.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await nn(e,{agentObserver:r});let a=await Tn(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 $m(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function ZS(e,t,n){await xc(e);let r=await S.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await At.openObserver(e);try{await nn(e,{agentObserver:s});let o=(await Tn(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=pt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw tP(t);let u=a-Date.now();if(u<=0)throw eP(t,n.states,n.timeoutMs);await nn(e,{agentObserver:s}),o=(await Tn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await $m(Math.min(250,u),n.signal)}}finally{s.close()}}async function xc(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 $m(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var eP=(e,t,n)=>new g("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),tP=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),no={list:XS,watch:QS,waitForTaskState:ZS,reconcile:nn};import{readFile as gP}from"node:fs/promises";import{mkdir as uP,readFile as xm,rm as Lm}from"node:fs/promises";import{createConnection as dP}from"node:net";import pP from"node:path";import{spawn as oP}from"node:child_process";import{closeSync as aP,openSync as lP}from"node:fs";import Fc from"node:path";import{accessSync as nP,constants as rP}from"node:fs";import{homedir as Dm}from"node:os";import rn from"node:path";var sP=[rn.join(Dm(),".local","bin"),rn.join(Dm(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function _m(e=process.env){return iP([...(e.PATH??"").split(rn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:sP])}function ro(e=process.env){return{...e,PATH:_m(e).join(rn.delimiter)}}function Lc(e,t={}){if(e.includes(rn.sep)){let n=rn.isAbsolute(e)?e:rn.resolve(t.cwd??process.cwd(),e);return Nm(n)?n:null}for(let n of _m(t.env)){let r=rn.join(n,e);if(Nm(r))return r}return null}function so(e,t={}){let n=Lc(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 Nm(e){try{return nP(e,rP.X_OK),!0}catch{return!1}}function iP(e){return[...new Set(e)]}function io(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=cP(e.workspaceRoot),s=lP(Fc.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return oP(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{aP(s)}})().unref()}function cP(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=Fc.resolve(Fc.dirname(t),"..","node_modules",".bin","tsx");return{command:Lc("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}async function _t(e){let t=await ao(Je(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await Cn(t,{type:"ping"});return Gt(n.protocolVersion)?(await Cn(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function oo(e,t){if(t.length===0)return!0;let n=await ao(Je(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Cn(n,{type:"ping"});if(!Gt(r.protocolVersion))return!1;for(let s of t)await Cn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Mm(e,t){await fP(e);let n=await ao(Je(e).socketPath);try{let r=await Cn(n,{type:"ping"});if(!Gt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Cn(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 fP(e){let t=Je(e),n=await Fm(t.socketPath).catch(()=>null);if(Gt(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 uP(e.runtimeDir,{recursive:!0});let r=await xm(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&mP(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([Lm(t.socketPath,{force:!0}),Lm(t.pidPath,{force:!0})]),io(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Fm(t.socketPath).catch(()=>null);if(Gt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await xm(pP.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
+
${o.slice(-2e3)}`:""}`)}async function Fm(e){let t=await ao(e);try{return await Cn(t,{type:"ping"})}finally{t.end()}}function mP(e){try{return process.kill(e,0),!0}catch{return!1}}var hP=1;function Cn(e,t){let n=hP++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig PTY daemon request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
|
|
210
|
+
`);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?r(u):s(new Error(u.error??"Craig PTY daemon request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
|
|
211
|
+
`)})}function ao(e){return new Promise((t,n)=>{let r=dP(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function yP(e,t){await SP(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 RP(t.prompt,t.readStdin),o;try{o=await ae.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await _t(e),a}return await Mc(e,o.command.id),o}async function Mc(e,t){if((await ae.show(e,t)).command.state==="delivered"||await _t(e))return;let r=(await ae.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ae.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function wP(e,t){return ae.show(e,t)}async function kP(e,t){return ae.list(e,t)}async function TP(e,t){let n;try{n=await ae.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await _t(e),r}return await _t(e),n}async function bP(e,t,n){return ae.wait(e,t,n)}async function RP(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await gP(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 SP(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 gr={send:yP,show:wP,list:kP,cancel:TP,wait:bP};var PP=6e4;async function lo(e,t){return Kl(e,t,{createTask:IP})}async function jm(e,t,n,r={}){return Vl(e,t,n,{...r,launchProvisioned:(s,i)=>qm(e,s,i,!1)})}async function IP(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>qm(e,s,i,!0)})}async function qm(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 Mm(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:r?s.command:t.runnerSession.command,...n?{env:n}:{}}),!r)return;let i=await ae.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:PP,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await Mc(e,i.command.id)}catch(i){throw await oo(e,[s.id]),i}}async function co(e,t,n){let r=(await S.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await Hl(e,t,n);return await oo(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await oo(e,o),a}}import{randomUUID as Bm}from"node:crypto";import{readFile as vP,realpath as Um}from"node:fs/promises";import jc from"node:path";var ne={type:"system",component:"orchestration-supervisor"},CP=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function AP(e,t,n,r,s,i){await $n(e);let o=await WP(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 Ge(e,i,"fury.plan",r)}let a=await Oc(t,n);BP(a.steps,r);let l=new Date().toISOString(),c={schemaVersion:1,definitionHash:a.definitionHash,name:a.name,sourceFile:o,rootTaskId:r,inputs:a.inputs,limits:a.limits,order:a.order,waves:a.waves,steps:a.steps},d={...c,id:`fury_plan_${Bm()}`,planHash:kl(c),createdBy:s,createdAt:l};await Wp(e,a.definitionHash,await vP(t,"utf8"));let u=await Bp(e,d);try{await De(e,{id:`${u.id}:fury.plan.created`,taskId:r,type:"fury.plan.created",occurredAt:u.createdAt,actor:u.createdBy,data:{planId:u.id,planHash:u.planHash,name:u.name}})}catch(p){throw new g("PARTIAL_RESULT",`Fury plan ${u.id} was persisted, but its audit event could not be recorded.`,{details:{planId:u.id,planHash:u.planHash,persisted:!0},cause:p})}return{kind:"planFury",plan:u}}async function EP(e,t,n){if(await $n(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await oi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await Gp(e,s);try{await De(e,{id:`${r.id}:fury.plan.approved`,taskId:r.rootTaskId,type:"fury.plan.approved",occurredAt:i.approval.approvedAt,actor:i.approval.approvedBy,data:{planId:r.id,planHash:r.planHash}})}catch(o){throw new g("PARTIAL_RESULT",`Fury plan ${r.id} was approved, but its audit event could not be recorded.`,{details:{planId:r.id,planHash:r.planHash,persisted:!0,approved:!0},cause:o})}return{kind:"approveFury",plan:r,approval:i.approval,created:i.created}}async function OP(e,t,n,r){await $n(e);let s=await oi(e,t);if((await Hp(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 Ge(e,r,"fury.run",s.rootTaskId)}await Xe(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Bm()}`,planId:s.id,planHash:s.planHash,definitionHash:s.definitionHash,name:s.name,sourceFile:s.sourceFile,rootTaskId:s.rootTaskId,state:"pending",inputs:s.inputs,limits:s.limits,order:s.order,stepRuns:Object.fromEntries(s.steps.map(d=>[d.id,{id:d.id,kind:d.kind,needs:d.needs,state:"pending",plan:d,taskId:null,agentTabId:null,commandId:null,reviewId:null,output:null,error:null,startedAt:null,completedAt:null,deadlineAt:null,completedBy:null}])),actor:n,createdAt:o.toISOString(),updatedAt:o.toISOString(),stateChangedAt:o.toISOString(),deadlineAt:new Date(o.getTime()+s.limits.timeoutMs).toISOString(),completedAt:null},c=await Yp(e,l);try{await ce(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(d){throw new g("PARTIAL_RESULT",`Fury run ${c.run.id} was persisted, but its audit event could not be recorded.`,{details:{runId:c.run.id,planId:c.run.planId,persisted:!0},cause:d})}return await On(e,c.run.id),await _t(e),{kind:"runFury",run:await pe(e,c.run.id),created:c.created}}async function $P(e,t){return await $n(e),await On(e,t),{kind:"showFury",run:await pe(e,t)}}async function po(e,t={}){let n=await k.load(e);if(k.previews.isEnabled(n,"agentOrchestration"))for(let r of await zp(e))await On(e,r.id,t)}async function On(e,t,n={}){let r=await pe(e,t);if(await HP(e,r),kt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ve(e,t,o=>GP(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await Hr(e,o.reviewId,a=>({...a,state:"timed_out",version:a.version+1,updatedAt:new Date().toISOString()}));await ce(e,r,null,"fury.run.timed_out",ne,{state:r.state});return}let s=new Map((await Ke(e)).map(o=>[o.id,o]));for(let o of r.order){let a=r.stepRuns[o];if(a.state==="running"&&!a.taskId){r=await Wm(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await uo(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",ne));let l=!a.commandId||s.get(a.commandId)?.state==="delivered";a.state==="running"&&a.agentTabId&&l&&n.isAgentAvailable&&a.startedAt&&Date.now()-Date.parse(a.startedAt)>2e3&&!n.isAgentAvailable(a.agentTabId)&&(r=await uo(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,ne)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await Ve(e,r.id,c=>sn(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await ce(e,r,a.id,"fury.step.timed_out",ne,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await Hr(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ve(e,r.id,c=>sn(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await ce(e,r,a.id,"fury.review.timed_out",ne,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await fo(e,r.id,"failed",ne);return}let i=Object.values(r.stepRuns).filter(o=>o.state==="running").length;for(let o of r.order){if(i>=r.limits.maxConcurrency)break;let a=r.stepRuns[o];a.state!=="pending"||!a.needs.every(l=>r.stepRuns[l]?.state==="succeeded")||(a.kind==="human_review"?r=await DP(e,r,a):(r=await Wm(e,r,a),i+=1))}await KP(e,r.id)}async function Wm(e,t,n){let r=new Date;t=await Ve(e,t.id,o=>sn(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await ce(e,t,n.id,"fury.step.started",ne,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${En(s.plan.prompt,t)}
|
|
213
212
|
|
|
214
|
-
${
|
|
213
|
+
${VP(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await lo(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:En(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:En(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),d=await S.getTask(e,c.taskId),u=d.ptyTabs.find(p=>p.kind==="agent");if(!u)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${d.id} has no agent tab.`,{});o=d.id,a=u.id}else{o=En(s.plan.target.task,t);let c=await S.getTask(e,o),d=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!d)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await Xe(e,c,ne,d.id),a=d.id,l=(await ae.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:ne})).command.id}return t=await Ve(e,t.id,c=>sn(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await ce(e,t,n.id,"fury.step.dispatched",ne,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return uo(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",ne)}}async function DP(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?En(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(c=>c.taskId===o&&c.agentTabId):null,l={schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:En(r.title,t),summary:En(r.summary,t),feedbackTarget:o?{taskId:o,agentTabId:a?.agentTabId??null}:null,round:1,requestedAt:s.toISOString(),deadlineAt:new Date(Math.min(Date.parse(t.deadlineAt),s.getTime()+r.timeoutMs)).toISOString(),version:1,lastDecision:null,history:[],updatedAt:s.toISOString()};return await Xp(e,l),t=await Ve(e,t.id,c=>sn(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await ce(e,t,n.id,"fury.review.requested",ne,{reviewId:i,title:l.title}),t}async function NP(e,t,n,r,s,i){let o=await pe(e,t),a=Km(o,n);await Vm(e,a,s,i,"fury.step.complete"),UP(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ve(e,t,c=>{if(kt(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return sn(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ce(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await On(e,t),o=await pe(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function _P(e,t,n,r,s,i){let o=await pe(e,t),a=Km(o,n);await Vm(e,a,s,i,"fury.step.fail");let l=await uo(e,t,n,r,s);return await fo(e,t,"failed",s),{kind:"failFuryStep",run:await pe(e,t),step:l.stepRuns[n]}}async function xP(e,t,n,r){let s=await pe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Ge(e,r,"fury.cancel",s.rootTaskId)}if(kt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ve(e,t,c=>kt(c)?c:(o=!0,{...c,state:"cancelled",completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(c.stepRuns).map(([d,u])=>[d,u.state==="succeeded"?u:{...u,state:"cancelled",completedAt:i,completedBy:n}]))}));if(!o)return{kind:"cancelFury",run:a,changed:!1};let l=await Ke(e);for(let c of Object.values(a.stepRuns)){let d=c.commandId?l.find(u=>u.id===c.commandId):null;d?.state==="queued"&&await ae.cancel(e,d.id,n),c.taskId&&c.plan.target?.type==="create_child"&&await co(e,c.taskId).catch(()=>{}),c.reviewId&&await Hr(e,c.reviewId,u=>({...u,state:"cancelled",version:u.version+1,updatedAt:i}))}return await ce(e,a,null,"fury.run.cancelled",n,{}),{kind:"cancelFury",run:a,changed:o}}async function LP(e,t,n,r){let s=await pe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Ge(e,r,"fury.resume",s.rootTaskId)}if(kt(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await On(e,t),await _t(e),{kind:"resumeFury",run:await pe(e,t)}}async function FP(e,t,n){return await $n(e),{kind:"listFuryReviews",reviews:(await ai(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function MP(e,t){return await $n(e),{kind:"showFuryReview",review:await er(e,t)}}async function jP(e,t,n,r,s,i){let o=await er(e,t),a=await pe(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can decide a fury review.",{});if(n==="resubmit"&&s.type==="agent"){if(!o.feedbackTarget||s.taskId!==o.feedbackTarget.taskId||!i)throw new g("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await Ge(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let m=await S.getTask(e,o.feedbackTarget.taskId),h=o.feedbackTarget.agentTabId?m.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):m.ptyTabs.find(y=>y.kind==="agent");if(!h)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${m.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:m.id,agentTabId:h.id,prompt:{source:"inline",text:`Fury review changes requested:
|
|
215
214
|
|
|
216
|
-
${r}`},delivery:"when-ready",timeoutMs:Math.min(a.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${t}:${o.round}`,actor:s})).command.id}let
|
|
215
|
+
${r}`},delivery:"when-ready",timeoutMs:Math.min(a.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${t}:${o.round}`,actor:s})).command.id}let d=new Date().toISOString(),u={sequence:o.history.length+1,round:o.round,action:n,message:r,actor:s,feedbackCommandId:c,occurredAt:d},p=n==="approve"?"approved":n==="reject"?"rejected":n==="request_changes"?"changes_requested":"waiting_for_review";return o=await Hr(e,t,m=>{if(!(n==="resubmit"?m.state==="changes_requested":m.state==="waiting_for_review")||m.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...m,state:p,round:n==="resubmit"?m.round+1:m.round,version:m.version+1,lastDecision:u,history:[...m.history,u],updatedAt:d}}),a=await Ve(e,a.id,m=>{if(kt(m))throw new g("FURY_STATE_CONFLICT",`Run ${m.id} is ${m.state}.`,{});return sn(m,o.stepId,n==="approve"?{state:"succeeded",completedAt:d,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:d,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await ce(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await fo(e,a.id,"failed",s):await On(e,a.id),c&&await _t(e),{kind:"actFuryReview",review:o,run:await pe(e,a.id)}}async function qP(e,t,n,r){await $n(e),await pe(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await On(e,t);let a=await Tn(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,kt(await pe(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await YP(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function En(e,t){return e.replace(CP,(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=An(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 UP(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(qc(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function qc(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?An(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"&&An(e)){let o=An(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))An(o[a])?qc(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&An(t.items)&&e.forEach((o,a)=>qc(o,t.items,`${n}[${a}]`,r))}async function Vm(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 Ge(e,r,s,n.taskId)}}function Km(e,t){if(kt(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 WP(e,t){let[n,r]=await Promise.all([Um(he(e).root),Um(t)]),s=jc.relative(n,r);if(!s||s.startsWith("..")||jc.isAbsolute(s)||!/\.ya?ml$/i.test(s))throw new g("FURY_DEFINITION_INVALID","Fury plans must use a YAML definition stored under .craig/fury/.",{details:{file:t,furyRoot:he(e).root}});return jc.join(".craig","fury",s)}function BP(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 VP(e,t,n){return n?`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --output '<json matching ${JSON.stringify(n)}>' --json
|
|
217
216
|
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`:`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --json
|
|
218
|
-
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function po(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ke(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(kt(l)||l.stepRuns[n]?.state!=="running")throw new h("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,on(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await le(e,a,n,"fury.step.failed",s,{reason:r}),a}function on(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function dI(e,t){let n=await de(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await mo(e,t,s,ne)}async function mo(e,t,n,r){let s=await de(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ke(e,t,l=>kt(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function uI(e){let t=new Date().toISOString();return{...e,state:"timed_out",updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:ne}]))}}async function le(e,t,n,r,s,i){let o=$n(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await Ne(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function pI(e,t){await le(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await le(e,t,null,`fury.run.${t.state}`,ne,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",ne,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",ne,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await le(e,t,n.id,`fury.step.${n.state}`,n.completedBy??ne,{reason:n.error}),!n.reviewId)continue;let r=await rr(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",ne,{reviewId:r.id,title:r.title});for(let s of r.history)await le(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function Nn(e){if(!k.previews.isEnabled(await k.load(e),"agentOrchestration"))throw new h("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function kt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function $n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function fI(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Le={plan:HP,approve:YP,run:zP,show:JP,watch:iI,cancel:eI,resume:tI,completeStep:QP,failStep:ZP,listReviews:nI,showReview:rI,actOnReview:sI,reconcile:fo};async function ng(e,t){switch(e.kind){case"addWorkspace":{let n=await ke.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Hc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await ke.repos.addRepo(t.paths,e.path);return await Hc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return ke.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await $e(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await ke.repos.removeRepo(t.paths,e.repoId,{listTasks:R.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await jt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await jt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return ke.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await ke.archiveWorkspace(t.paths,e.workspaceId);return await hI(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await ke.restoreWorkspace(t.paths,e.workspaceId);return await Hc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return ke.removeWorkspace(t.paths,e.workspaceId,{listTasks:R.listTasks});case"createTask":return Xl(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new h("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return xn(t),co(t.paths,{parentTaskId:e.parentTaskId??ln(t).task.id,repoId:e.repoId,prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return xn(t),Zl(t.paths,e.taskId??ln(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return xn(t),uo(t.paths,e.taskId??ln(t).task.id,t.agentCapabilityId);case"validateFury":return await tg(t),Fc(Yc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await tg(t),Le.plan(t.paths,Yc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??ln(t).task.id,an(t),t.agentCapabilityId);case"approveFury":return Le.approve(t.paths,e.planId,an(t));case"runFury":return xn(t),Le.run(t.paths,e.planId,an(t),t.agentCapabilityId);case"showFury":return Le.show(t.paths,e.runId);case"watchFury":return Le.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Le.cancel(t.paths,e.runId,an(t),t.agentCapabilityId);case"resumeFury":return Le.resume(t.paths,e.runId,an(t),t.agentCapabilityId);case"completeFuryStep":return xn(t),Le.completeStep(t.paths,e.runId,e.stepId,await gI(e.output,t),an(t),t.agentCapabilityId);case"failFuryStep":return xn(t),Le.failStep(t.paths,e.runId,e.stepId,e.reason,an(t),t.agentCapabilityId);case"listFuryReviews":return Le.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Le.showReview(t.paths,e.reviewId);case"actFuryReview":return xn(t),Le.actOnReview(t.paths,e.reviewId,e.action,e.message??null,an(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?R.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):R.listTasks(t.paths);case"currentTask":{let n=ln(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"attachTask":return R.attachTask(t.paths,e.taskId);case"addTaskLink":return R.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return R.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return R.showTask(t.paths,e.taskId);case"showCurrentTask":return R.showTask(t.paths,ln(t).task.id);case"showTaskPr":return R.prs.show(t.paths,Fn(e.taskId,t),e.repoId);case"discoverTaskPr":return R.prs.discover(t.paths,Fn(e.taskId,t),e.repoId);case"linkTaskPr":return R.prs.link(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return R.prs.refreshAssociation(t.paths,Fn(e.taskId,t),e.repoId);case"unlinkTaskPr":return R.prs.unlink(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return At.listAgents(t.paths,e.taskId);case"showAgentStatus":return At.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Fn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?lo.waitForTaskState(t.paths,r,n):At.waitForTask(t.paths,r,n)}case"listEvents":return lo.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return lo.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return br.send(t.paths,{taskId:Fn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return br.show(t.paths,e.commandId);case"listPromptCommands":return br.list(t.paths,e.taskId);case"cancelPromptCommand":return br.cancel(t.paths,e.commandId);case"waitPromptCommand":return br.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return R.showTask(t.paths,_n(t,"show"));case"streamTaskLogs":return R.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return R.prepareTaskLogs(t.paths,_n(t,"logs"));case"showTaskDiff":return R.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return R.showTaskDiff(t.paths,_n(t,"diff"));case"focusTask":return R.focusTask(t.paths,e.taskId);case"focusSelectedTask":return R.focusTask(t.paths,_n(t,"focus"));case"openTask":return R.openTask(t.paths,e.taskId);case"openSelectedTask":return R.openTask(t.paths,_n(t,"open"));case"runChecks":return R.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return R.runChecks(t.paths,_n(t,"check"));case"commitTask":return R.commitTask(t.paths,e.taskId);case"commitSelectedTask":return R.commitTask(t.paths,_n(t,"commit"));case"showContext":{let n=wI(t);return{kind:"showContext",workspace:{root:n.workspaceRoot,source:n.source,initialized:n.initialized},task:t.taskContext?{id:t.taskContext.task.id,source:t.taskContext.source,agentTabId:t.taskContext.agentTabId}:null}}case"help":return{kind:"help",text:ta()};case"exit":return{kind:"exit"};default:return yI(e)}}function xn(e){if(!(!e.agentContext||e.agentCapabilityId))throw new h("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function tg(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new h("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function an(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=ln(e);if(!e.agentCapabilityId||!t.agentTabId)throw new h("CAPABILITY_DENIED","This agent session has no scoped capability.",{});return{type:"agent",taskId:t.task.id,agentTabId:t.agentTabId,capabilityId:e.agentCapabilityId.split(".",1)[0]}}async function gI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await mI(Yc.resolve(t.cwd??process.cwd(),e.path),"utf8");else{if(!t.readStdin)throw new h("INPUT_REQUIRED","Fury output from stdin is unavailable.",{});n=await t.readStdin()}try{return JSON.parse(n)}catch(r){throw new h("FURY_OUTPUT_INVALID","Fury step output must be valid JSON.",{cause:r})}}async function Hc(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??qs();await jt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function hI(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await jt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function yI(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function _n(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function ln(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Fn(e,t){return e??ln(t).task.id}function wI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function sg(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
217
|
+
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function uo(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ve(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(kt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,sn(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await ce(e,a,n,"fury.step.failed",s,{reason:r}),a}function sn(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function KP(e,t){let n=await pe(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await fo(e,t,s,ne)}async function fo(e,t,n,r){let s=await pe(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ve(e,t,l=>kt(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null});return a.state!==n||await ce(e,a,null,`fury.run.${n}`,r,{state:n}),a}function GP(e){let t=new Date().toISOString();return{...e,state:"timed_out",updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:ne}]))}}async function ce(e,t,n,r,s,i){let o=An(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await De(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function HP(e,t){await ce(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await ce(e,t,null,`fury.run.${t.state}`,ne,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await ce(e,t,n.id,"fury.step.started",ne,{}),n.taskId&&await ce(e,t,n.id,"fury.step.dispatched",ne,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await ce(e,t,n.id,`fury.step.${n.state}`,n.completedBy??ne,{reason:n.error}),!n.reviewId)continue;let r=await er(e,n.reviewId);await ce(e,t,n.id,"fury.review.requested",ne,{reviewId:r.id,title:r.title});for(let s of r.history)await ce(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function $n(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 kt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function An(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function YP(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Le={plan:AP,approve:EP,run:OP,show:$P,watch:qP,cancel:xP,resume:LP,completeStep:NP,failStep:_P,listReviews:FP,showReview:MP,actOnReview:jP,reconcile:po};async function Hm(e,t){switch(e.kind){case"addWorkspace":{let n=await ke.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Uc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await ke.repos.addRepo(t.paths,e.path);return await Uc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return ke.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Mn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await $e(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await ke.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await qt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await qt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return ke.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await ke.archiveWorkspace(t.paths,e.workspaceId);return await XP(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await ke.restoreWorkspace(t.paths,e.workspaceId);return await Uc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return ke.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return jm(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 Dn(t),lo(t.paths,{parentTaskId:e.parentTaskId??an(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 Dn(t),Gl(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Dn(t),co(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"validateFury":return await Gm(t),Ec(Wc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Gm(t),Le.plan(t.paths,Wc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??an(t).task.id,on(t),t.agentCapabilityId);case"approveFury":return Le.approve(t.paths,e.planId,on(t));case"runFury":return Dn(t),Le.run(t.paths,e.planId,on(t),t.agentCapabilityId);case"showFury":return Le.show(t.paths,e.runId);case"watchFury":return Le.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Le.cancel(t.paths,e.runId,on(t),t.agentCapabilityId);case"resumeFury":return Le.resume(t.paths,e.runId,on(t),t.agentCapabilityId);case"completeFuryStep":return Dn(t),Le.completeStep(t.paths,e.runId,e.stepId,await JP(e.output,t),on(t),t.agentCapabilityId);case"failFuryStep":return Dn(t),Le.failStep(t.paths,e.runId,e.stepId,e.reason,on(t),t.agentCapabilityId);case"listFuryReviews":return Le.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Le.showReview(t.paths,e.reviewId);case"actFuryReview":return Dn(t),Le.actOnReview(t.paths,e.reviewId,e.action,e.message??null,on(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=an(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,an(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Nn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Nn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Nn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Nn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Nn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return At.listAgents(t.paths,e.taskId);case"showAgentStatus":return At.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Nn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?no.waitForTaskState(t.paths,r,n):At.waitForTask(t.paths,r,n)}case"listEvents":return no.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return no.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 gr.send(t.paths,{taskId:Nn(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 gr.show(t.paths,e.commandId);case"listPromptCommands":return gr.list(t.paths,e.taskId);case"cancelPromptCommand":return gr.cancel(t.paths,e.commandId);case"waitPromptCommand":return gr.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,yr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,yr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,yr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,yr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,yr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,yr(t,"commit"));case"showContext":{let n=ZP(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:ra()};case"exit":return{kind:"exit"};default:return QP(e)}}function Dn(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 Gm(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function on(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=an(e);if(!e.agentCapabilityId||!t.agentTabId)throw new g("CAPABILITY_DENIED","This agent session has no scoped capability.",{});return{type:"agent",taskId:t.task.id,agentTabId:t.agentTabId,capabilityId:e.agentCapabilityId.split(".",1)[0]}}async function JP(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await zP(Wc.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 Uc(e,t,n){let r=await Mn({uiStateFile:e.uiStateFile})??xs();await qt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function XP(e,t){let n=await Mn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await qt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function QP(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function yr(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function an(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Nn(e,t){return e??an(t).task.id}function ZP(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function zm(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
219
218
|
`);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
|
|
220
219
|
`);case"listRepos":return e.repos.length===0?"No repos registered yet. Use 'craig repo add <path>'.":["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
221
220
|
`);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(`
|
|
222
|
-
`);case"archiveWorkspace":return`Archived workspace ${e.workspaceId} on branch ${e.branch}`;case"restoreWorkspace":return`Restored workspace ${e.workspaceId} on branch ${e.branch}`;case"removeWorkspace":return`Removed workspace ${e.workspaceId} (${e.rootPath})`;case"createTask":return[`Created task ${e.taskId}`,`Repo: ${e.repoId}`,`Workspace: ${e.workspaceId}`,`
|
|
223
|
-
`);case"createChildTask":return[`${e.idempotentReplay?"Found":"Created"} child task ${e.taskId}`,`Parent: ${e.parentTaskId}`,`Root: ${e.rootTaskId}`,`Depth: ${e.delegationDepth}`,`Status: ${e.status}`,`Worktree: ${e.worktreePath}`].join(`
|
|
221
|
+
`);case"archiveWorkspace":return`Archived workspace ${e.workspaceId} on branch ${e.branch}`;case"restoreWorkspace":return`Restored workspace ${e.workspaceId} on branch ${e.branch}`;case"removeWorkspace":return`Removed workspace ${e.workspaceId} (${e.rootPath})`;case"createTask":return[`Created task ${e.taskId}`,`Repo: ${e.repoId}`,`Workspace: ${e.workspaceId}`,`Agent tab: ${e.agentTabId}`,`Status: ${e.status}`,`Branch: ${e.branch}`,`Worktree: ${e.worktreePath}`,`Runner: ${e.runner}`].join(`
|
|
222
|
+
`);case"createChildTask":return[`${e.idempotentReplay?"Found":"Created"} child task ${e.taskId}`,`Parent: ${e.parentTaskId}`,`Root: ${e.rootTaskId}`,`Depth: ${e.delegationDepth}`,`Target: ${e.targetType} ${e.targetId}`,`Status: ${e.status}`,`Worktree: ${e.worktreePath}`].join(`
|
|
224
223
|
`);case"listTaskChildren":return e.children.length===0?`Task ${e.taskId} has no children.`:["ID STATUS DEPTH TITLE",...e.children.map(t=>`${t.id} ${t.status} ${t.delegationDepth} ${t.title}`)].join(`
|
|
225
224
|
`);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
|
|
226
225
|
`);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
|
|
227
226
|
`);case"planFury":return[`Planned fury ${e.plan.name}`,`Plan: ${e.plan.id}`,`Root task: ${e.plan.rootTaskId}`,`Hash: ${e.plan.planHash}`,`Steps: ${e.plan.steps.length}`,...e.plan.waves.map((t,n)=>`Wave ${n}: ${t.join(", ")}`),`Approval required: craig fury approve ${e.plan.id} --json`].join(`
|
|
228
|
-
`);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return
|
|
229
|
-
`);case"showFuryReview":return
|
|
230
|
-
Run: ${e.run.state}`;case"watchFury":return"";case"
|
|
231
|
-
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${
|
|
232
|
-
`);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`
|
|
227
|
+
`);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 eI(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(`
|
|
228
|
+
`);case"showFuryReview":return Ym(e.review);case"actFuryReview":return`${Ym(e.review)}
|
|
229
|
+
Run: ${e.run.state}`;case"watchFury":return"";case"addTaskLink":return`Linked repo ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`;case"listTaskLinks":return e.repos.length===0?`Task ${e.taskId} has no linked repos.`:["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
230
|
+
`);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} ${oI(t)} ${aI(t)} ${t.title}`)].join(`
|
|
231
|
+
`);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}`,...sI(e)].join(`
|
|
233
232
|
`);case"currentTask":return[`${e.task.id}: ${e.task.title}`,`Workspace: ${e.task.workspaceId}`,`Repo: ${e.task.repoId}`,`Worktree: ${e.task.worktreePath}`,`Context source: ${e.context.source}`,`Agent tab: ${e.context.agentTabId??"none"}`].join(`
|
|
234
|
-
`);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return
|
|
235
|
-
`);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return
|
|
233
|
+
`);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return rI(e);case"listAgents":case"showAgentStatus":return nI(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(Bc).join(`
|
|
234
|
+
`);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return tI(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
|
|
236
235
|
`);case"cancelPromptCommand":return`${e.changed?"Cancelled":"Command already cancelled:"} ${e.command.id}`;case"waitPromptCommand":return`Command ${e.command.id} reached ${e.command.state}.`;case"showContext":return[`Workspace: ${e.workspace.root}`,`Workspace source: ${e.workspace.source}`,`Initialized: ${e.workspace.initialized?"yes":"no"}`,`Task: ${e.task?.id??"none"}`,`Task source: ${e.task?.source??"none"}`,`Agent tab: ${e.task?.agentTabId??"none"}`].join(`
|
|
237
|
-
`);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"
|
|
238
|
-
`);default:return
|
|
239
|
-
`)}function
|
|
240
|
-
`)}function
|
|
241
|
-
`)}function
|
|
242
|
-
`)}function
|
|
243
|
-
`)}function
|
|
244
|
-
`)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let
|
|
245
|
-
`),0}catch(r){let s=
|
|
246
|
-
`),s.exitCode}}function
|
|
247
|
-
`).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function
|
|
248
|
-
`)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function
|
|
249
|
-
`),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return
|
|
250
|
-
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await
|
|
251
|
-
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await
|
|
252
|
-
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await
|
|
236
|
+
`);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"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(`
|
|
237
|
+
`);default:return iI(e)}}function eI(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(`
|
|
238
|
+
`)}function Ym(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(`
|
|
239
|
+
`)}function tI(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
|
|
240
|
+
`)}function Bc(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function nI(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(`
|
|
241
|
+
`)}function rI(e){let t=`${e.taskId} (${e.repoId}): ${e.disposition}`,n=e.pullRequests.length===0?["No pull requests associated."]:["PR STATUS HEAD URL",...e.pullRequests.map(r=>`#${r.number??"-"} ${r.status??"unknown"} ${r.headBranch??"-"} ${r.url??"-"}`)];return[t,...n,...e.warnings.map(r=>`Warning: ${r}`)].join(`
|
|
242
|
+
`)}function sI(e){let t=[];return e.inspection.worktreeExists||e.task.status==="merged"&&!e.task.cleanup.preservedWorktree&&e.task.cleanup.worktreeRemovedAt||t.push(`Warning: worktree is missing at ${e.task.worktreePath}`),e.task.cleanup.warning&&!(e.task.status==="merged"&&!e.task.cleanup.worktreeRemovedAt)&&t.push(`Cleanup warning: ${e.task.cleanup.warning}`),e.task.artifacts.logPath&&!e.inspection.logExists&&t.push(`Warning: log file is missing at ${e.task.artifacts.logPath}`),e.inspection.recentFailureReason&&t.push(`Last failure: ${e.inspection.recentFailureReason}`),t}function iI(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function oI(e){return e.checks.status}function aI(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 Jm(e,t){let{data:n,warnings:r}=lI(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function lI(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Xm(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 Vc(e){let t=await ke.resolveContext({cwd:e.cwd,...e.explicitWorkspaceRoot!==void 0?{explicitWorkspaceRoot:e.explicitWorkspaceRoot}:{},...e.environmentWorkspaceRoot!==void 0?{environmentWorkspaceRoot:e.environmentWorkspaceRoot}:{},...e.allowUninitializedWorkspace!==void 0?{allowUninitializedCwd:e.allowUninitializedWorkspace}:{}}),n=ve(t.workspaceRoot),r=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(r&&!t.initialized)throw new g("TASK_CONTEXT_NOT_FOUND",`Task context cannot be resolved because ${t.workspaceRoot} is not an initialized Craig workspace.`,{details:{workspaceRoot:t.workspaceRoot}});let s=r&&t.initialized?await S.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function Qm(e){let t="cli",n=Rd(e.argv);try{let r=bd(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||gI(e.env)||!e.isInputTty||!e.isOutputTty)throw new g("INPUT_REQUIRED","Interactive Craig requires a TTY. Provide a command instead of starting the terminal application.",{});if(r.options.workspaceRoot===void 0&&(e.env.CRAIG_TASK_ID!==void 0||e.env.CRAIG_AGENT_TAB_ID!==void 0))throw new g("TASK_CONTEXT_CONFLICT","Interactive Craig will not implicitly attach to a live workspace from an agent session. Pass --workspace-root <path> to confirm the live workspace, or pass a different directory for an isolated workspace.",{details:{workspaceRoot:e.env.CRAIG_WORKSPACE_ROOT??null,taskId:e.env.CRAIG_TASK_ID??null,agentTabId:e.env.CRAIG_AGENT_TAB_ID??null}});let u=await Vc({cwd:e.cwd,...r.options.workspaceRoot!==void 0?{explicitWorkspaceRoot:r.options.workspaceRoot}:{},...e.env.CRAIG_WORKSPACE_ROOT!==void 0?{environmentWorkspaceRoot:e.env.CRAIG_WORKSPACE_ROOT}:{},allowUninitializedWorkspace:!0});return e.runInteractive(u.workspace.workspaceRoot)}if(!r.command||!r.commandName)throw new g("CLI_USAGE","Command mode requires a command.",{});if(t=r.commandName,(r.command.kind==="watchEvents"||r.command.kind==="watchFury")&&r.options.json)throw new g("CLI_USAGE","watch commands stream output; use --format jsonl instead of --json.",{});dI(r.command,r.options.taskId);let s=fI(r.command,r.options.taskId),i=uI(s);pI(s,r.options.taskId,i);let o=i!=="none",a=await Vc({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:cI(s),resolveTask:i!=="none",requireTask:i==="required"}),l=mI(s,e.signal),c;try{c=await Hm(s,{paths:a.paths,cwd:e.cwd,workspaceContext:a.workspace,taskContext:a.task,...l.signal?{signal:l.signal}:{},...s.kind==="watchEvents"||s.kind==="watchFury"?{emitEvent:u=>e.writeStdout(`${s.format==="jsonl"?JSON.stringify(u):Bc(u)}
|
|
243
|
+
`)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let d=n?Jm(t,c):zm(c);return d.length>0&&e.writeStdout(`${d}
|
|
244
|
+
`),0}catch(r){let s=ta(r),i=n?Xm(t,s):s.message;return e.writeStderr(`${i}
|
|
245
|
+
`),s.exitCode}}function cI(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function uI(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||hI(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 dI(e,t){let n=Zm(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 pI(e,t,n){if(!(t===void 0||n!=="none"||Zm(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 Zm(e){switch(e.kind){case"showTask":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":return e.taskId;default:return}}function fI(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function mI(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 hI(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function gI(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as tE}from"node:module";import{readFile as yI,stat as wI}from"node:fs/promises";import Kc from"node:path";var kI=200*1024,TI=500*1024,mo="100000";async function th(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return bI(e,t,n);try{let r=ln(n.selectedFilePath??null,t.filePaths),s=ln(n.selectedDiffPath??null,t.diffPaths),i=s?await ws(e.worktreePath):null,[o,a]=await Promise.all([go(e.worktreePath,r),s?Gc(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ie("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 bI(e,t,n){let r=ln(n.selectedFilePath??null,t.filePaths),s=ln(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([rh(e,r),(async()=>{if(!s)return Ie("No diff selected","No local changes found.","empty");let l=ho(e,s),c=l?await ws(l.target.worktreePath).catch(()=>null):null;return sh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function nh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return RI(e,t);try{await me(e);let n=await ws(e.worktreePath),[r,s]=await Promise.all([ih(e.worktreePath),oh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=ln(t.selectedFilePath??null,r),a=ln(t.selectedDiffPath??null,i),[l,c]=await Promise.all([go(e.worktreePath,o),a?Gc(e.worktreePath,a,s,n):Promise.resolve(Ie("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:ch(r),filePaths:r,diffRows:s,diffPaths:i,diffContents:d,selectedFilePath:o,selectedDiffPath:a,selectedFile:l,selectedDiff:c,error:null}}catch(n){let r=n instanceof Error?n.message:"Unable to inspect task worktree.";return{taskId:e.id,fileRows:[],filePaths:[],diffRows:[],diffPaths:[],diffContents:{},selectedFilePath:null,selectedDiffPath:null,selectedFile:Ie("Files unavailable",r,"error"),selectedDiff:Ie("Diff unavailable",r,"error"),error:r}}}async function RI(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let m=await ws(p.worktreePath).catch(()=>null),[h,f]=await Promise.all([ih(p.worktreePath).catch(()=>[]),oh(p.worktreePath,m).catch(()=>[])]);return{target:p,baseRef:m,targetFiles:h,targetDiffRows:f}})),s=[],i=[];for(let{target:p,targetFiles:m,targetDiffRows:h}of r)s.push(...m.map(f=>`${p.repoId}/${f}`)),i.push(...h.map(f=>({...f,path:`${p.repoId}/${f.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=ln(t.selectedFilePath??null,s),l=ln(t.selectedDiffPath??null,o),[c,d]=await Promise.all([rh(e,a),(async()=>{if(!l)return Ie("No diff selected","No local changes found.","empty");let p=ho(e,l),m=p?r.find(h=>h.target.repoId===p.target.repoId):null;return sh(e,l,i,m?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:ch(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function rh(e,t){let n=ho(e,t);if(!n)return Ie("No file selected","No Git-visible files found.","empty");let r=await go(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function sh(e,t,n,r=null){let s=ho(e,t);return s?{...await Gc(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}:Ie(t,"Repo target is unavailable.","error",t)}function ho(e,t){if(!t)return null;let[n,...r]=t.split("/"),s=r.join("/"),i=(e.repoTargets??[]).find(o=>o.repoId===n&&o.status==="ready")??null;return!i||s.length===0?null:{target:i,relativePath:s}}async function ih(e){let t=await K("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return uh(t.stdout)}async function oh(e,t){let[n,r,s,i]=await Promise.all([SI(e,t),eh(e,"staged"),eh(e,"unstaged"),PI(e)]);return[...n,...r,...s,...i]}async function SI(e,t){if(!t)return[];let[n,r]=await Promise.all([K("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),K("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=ah(n.stdout),i=lh(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 eh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([K("git",[...n,"--name-status"],{cwd:e}),K("git",[...n,"--numstat"],{cwd:e})]),i=ah(r.stdout),o=lh(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 PI(e){let t=await K("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=uh(t.stdout);return await Promise.all(n.map(async s=>{let i=await go(e,s),o=i.status==="ready"?II(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function ah(e){return e.split(`
|
|
246
|
+
`).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 lh(e){let t=new Map;for(let n of e.split(`
|
|
247
|
+
`)){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 ws(e){return(await J("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await J("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function go(e,t){if(!t)return Ie("No file selected","No Git-visible files found.","empty");let n=vI(e,t);try{let r=await wI(n);if(r.size>kI)return Ie(t,`File is ${r.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,r.size);let s=await yI(n);return CI(s)?Ie(t,"Binary file preview is not available in Craig.","binary",t,s.byteLength):{path:t,status:"ready",title:t,lines:s.toString("utf8").split(`
|
|
248
|
+
`),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return Ie(t,s,"missing",t,null)}}async function Gc(e,t,n,r=null){if(!t)return Ie("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 ws(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${mo}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
|
|
249
|
+
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await K("git",["diff","--cached","--stat","--patch",`--unified=${mo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
|
|
250
|
+
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await K("git",["diff","--stat","--patch",`--unified=${mo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
|
|
251
|
+
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await J("git",["diff","--no-index","--stat","--patch",`--unified=${mo}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
|
|
253
252
|
${a.stdout.trimEnd()}`)}let o=s.join(`
|
|
254
253
|
|
|
255
|
-
`);return o.length>
|
|
256
|
-
`):["No diff for this file."],byteLength:o.length}}function
|
|
257
|
-
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function
|
|
258
|
-
`}function Ag(e){return e.length===1&&e>=" "&&e!=="\x7F"}function td(e){return Og(e)||Sr(e)!==null}function Eg(e){return bg.includes(e)}function Og(e){return Tg.includes(e)}function $g(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[K]:[]]}function zI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function JI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Ss(e,t,n){return t.includes(e??"")?e:n}function XI(e){return e==="tabs"?"center":Ss(e,HI,"tasks")}function QI(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ss(e,ed,t)}function ZI(e){return e==="file"||e==="diff"?e:null}function ev(e){return e==="terminal"?"terminal":"agent"}function tv(e){return e==="terminal"?"terminal":"control"}function nv(e,t=[...J],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function wo(e,t=J){let n=t.length>0?t:J,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Sr(e){let t=J.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function rv(e,t,n){if(!e)return{activeTab:t===K?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(Og(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??K,selectedPtyTabId:l?.id??null}}if(t===K)return{activeTab:K,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??K,selectedPtyTabId:o?.id??null}}function sv(e,t,n){if(!t.inspection||t.inspection.taskId!==n)return{selectedFileTreePath:e.selectedFileTreePath,collapsedFileTreePaths:e.collapsedFileTreePaths};let r=e.selectedFileTreePath??t.inspection.selectedFilePath,s=e.selectedFileTreePath===null&&e.collapsedFileTreePaths.length===0?iv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function iv(e,t){let n=new Set;if(t){let r=t.split("/");for(let s=1;s<r.length;s+=1)n.add(r.slice(0,s).join("/"))}return e.filter(r=>r.kind==="directory"&&!r.path.includes("/")&&!n.has(r.path)).map(r=>r.path).sort((r,s)=>r.localeCompare(s))}function ov(e,t){let n=Ln(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function Ln(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Ps(e.tasks.filter(s=>s.workspaceId===n.id)))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let{task:r}of Ps(e.tasks.filter(s=>s.repoId===n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Ps(e){let t=new Set(e.map(i=>i.id)),n=new Set,r=[],s=new Map;for(let i of e){if(i.rootTaskId===i.id||!t.has(i.rootTaskId))continue;let o=s.get(i.rootTaskId)??[];o.push(i),s.set(i.rootTaskId,o)}for(let i of e)if(!(i.rootTaskId!==i.id&&t.has(i.rootTaskId))){r.push({task:i,visualDepth:0}),n.add(i.id);for(let a of s.get(i.id)??[])n.has(a.id)||(r.push({task:a,visualDepth:1}),n.add(a.id))}for(let i of e)n.has(i.id)||r.push({task:i,visualDepth:0});return r}function nd(e){return e?e.startsWith("workspace:")?{kind:"workspace",id:e.slice(10)}:e.startsWith("repo:")?{kind:"repo",id:e.slice(5)}:e.startsWith("task:")?{kind:"task",id:e.slice(5)}:null:null}function xt(e){return typeof e=="string"?e:null}function av(e){return e?`task:${e}`:null}function vs(e){return typeof e=="string"&&e.startsWith("task:")}function ko(e){return typeof e=="string"&&e.startsWith("new-task:")}function To(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Dg(e){return typeof e=="string"&&e.startsWith("workspace:")}function rd(e){return ko(e)?e.slice(9):null}function sd(e){return To(e)?e.slice(19):null}async function Pr(e,t,n){let r=ve(e),[s,i]=await Promise.all([ke.repos.listRegisteredRepos(r),ke.listWorkspaces(r,{archived:!1})]),o=await R.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await Xe(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await R.listTasks(r);let[g,f]=await Promise.all([cf(r),fi(r)]);c=g.length+f.filter(y=>y.state==="waiting_for_review").length}let u=id(o.tasks,t),d=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=u?await ug(u,d):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:p,furyApprovalCount:c,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function id(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Ng(e,t){return Is(e,t)}import gd from"node:path";import eV from"picocolors";var lv=[" \u2584\u2588\u2588\u2588\u2588\u2584 \u2588\u2588\u2580\u2588\u2588\u2588 \u2584\u2584\u2584 \u2588\u2588\u2593 \u2584\u2588\u2588\u2588\u2588"," \u2592\u2588\u2588\u2580 \u2580\u2588 \u2593\u2588\u2588 \u2592 \u2588\u2588\u2592\u2592\u2588\u2588\u2588\u2588\u2584 \u2593\u2588\u2588\u2592 \u2588\u2588\u2592 \u2580\u2588\u2592"," \u2592\u2593\u2588 \u2584 \u2593\u2588\u2588 \u2591\u2584\u2588 \u2592\u2592\u2588\u2588 \u2580\u2588\u2584 \u2592\u2588\u2588\u2592\u2592\u2588\u2588\u2591\u2584\u2584\u2584\u2591"," \u2592\u2593\u2593\u2584 \u2584\u2588\u2588\u2592\u2592\u2588\u2588\u2580\u2580\u2588\u2584 \u2591\u2588\u2588\u2584\u2584\u2584\u2584\u2588\u2588 \u2591\u2588\u2588\u2591\u2591\u2593\u2588 \u2588\u2588\u2593"," \u2592 \u2593\u2588\u2588\u2588\u2580 \u2591\u2591\u2588\u2588\u2593 \u2592\u2588\u2588\u2592 \u2593\u2588 \u2593\u2588\u2588\u2592\u2591\u2588\u2588\u2591\u2591\u2592\u2593\u2588\u2588\u2588\u2580\u2592"," \u2591 \u2591\u2592 \u2592 \u2591\u2591 \u2592\u2593 \u2591\u2592\u2593\u2591 \u2592\u2592 \u2593\u2592\u2588\u2591\u2591\u2593 \u2591\u2592 \u2592"," \u2591 \u2592 \u2591\u2592 \u2591 \u2592\u2591 \u2592 \u2592\u2592 \u2591 \u2592 \u2591 \u2591 \u2591"," \u2591 \u2591\u2591 \u2591 \u2591 \u2592 \u2592 \u2591\u2591 \u2591 \u2591"," \u2591 \u2591 \u2591 \u2591 \u2591 \u2591 \u2591"," \u2591"];function od(){return[...lv]}var bo={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Me(e,t){return{width:Math.max(e??bo.width,bo.width),height:Math.max(t??bo.height,bo.height)}}var cv=["Start","Options","Exit"],dv=["Resume","Options","Exit"],So=2,Po=2,Io=2,uv=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),pv=new RegExp("\x1B\\[(?:0)?m","g"),fv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),mv=/https?:\/\/[^\s<>"']+/g,ld="\x1B[0m",cd="\x1B]8;;\x1B\\",N={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},ad=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Fg(e,t={}){return ud(e,{subtitle:"crAIg is that you?",menuItems:cv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Lg(e,t={}){return ud(e,{subtitle:"Control mode is paused.",menuItems:dv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Ro=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],gv=["Help"],hv=5;function Ao(e,t={}){return ud(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??gv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Mg(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=od(),o=Math.max(1,Math.floor((e.height-i.length-2-Ro.length)/2));for(let u=0;u<i.length&&!(o+u>=e.height);u+=1)s[o+u]=re(Hg(i[u]??"",e.width),n,N.overlayLogo);let a=Math.max(...Ro.map(u=>u.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let u=0;u<Ro.length;u+=1){let d=c+u;if(d>=e.height)break;let p=Ro[u]??"";s[d]=re(Tt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
259
|
-
`)}function
|
|
260
|
-
`)}function
|
|
261
|
-
`),center:f,regions:{rail:D,left:
|
|
262
|
-
`)}function
|
|
254
|
+
`);return o.length>TI?Ie(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ie(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(`
|
|
255
|
+
`):["No diff for this file."],byteLength:o.length}}function ch(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function ln(e,t){return e&&t.includes(e)?e:t[0]??null}function II(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function uh(e){return[...new Set(e.split(`
|
|
256
|
+
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function vI(e,t){let n=Kc.resolve(e,t),r=Kc.resolve(e);if(n!==r&&!n.startsWith(`${r}${Kc.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function CI(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ie(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var AI=["tasks","center","inspector","actions"],dh=["agent","terminal"],ph=[],B="inspection",zW=[...dh,...ph],Hc=["commit","push","refresh-checks","close-task"],fh=["refresh-checks","close-task"],mh=["task","checks","pr","setup-run","actions","next-action"],Yc=["files","review"];function hh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=_I(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:LI(e?.inputMode),focusedRegion:DI(e?.focusedRegion),selectedRepoId:xt(e?.selectedRepoId),selectedWorkspaceId:xt(e?.selectedWorkspaceId),selectedTaskId:xt(e?.selectedTaskId),selectedPtyTabId:xt(e?.selectedPtyTabId),selectedLeftItemId:BI(xt(e?.selectedTaskId)),activeTab:n?B:xt(e?.activeTab)??"agent",preferredPtyTabKind:xI(e?.preferredPtyTabKind),inspectorSection:ks(e?.inspectorSection,mh,"task"),inspectionMode:NI(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:xt(e?.selectedFileTreePath),selectedFilePath:xt(e?.selectedFilePath),selectedDiffPath:xt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:ks(e?.selectedActionId,Hc,"commit"),selectedProjectTargetId:null,selectedRunner:FI(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:EI(),centerZoomed:!1}}function EI(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function gh(e,t){return{...e??xs(),selectedRepoId:t.selectedRepoId,selectedWorkspaceId:t.selectedWorkspaceId,selectedTaskId:t.selectedTaskId,selectedPtyTabId:t.selectedPtyTabId,inputMode:t.inputMode,focusedRegion:t.focusedRegion,activeTab:t.activeTab,preferredPtyTabKind:t.preferredPtyTabKind,inspectorSection:t.inspectorSection,inspectionMode:t.inspectionMode,openInspectionKind:t.openInspectionKind,selectedFileTreePath:t.selectedFileTreePath,selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath,collapsedFileTreePaths:t.collapsedFileTreePaths,selectedActionId:t.selectedActionId,selectedRunner:t.selectedRunner}}function bs(e,t,n={}){let r=UI(e,t),s=Jc(r),i=s?.kind==="task"?t.tasks.find(p=>p.id===s.id)??null:null,o=i?WI(t.tasks,i):null,a=(s?.kind==="workspace"?t.workspaces?.find(p=>p.id===s.id)??null:null)??(o?t.workspaces?.find(p=>p.id===o.workspaceId)??null:null)??t.workspaces?.find(p=>p.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,c=((s?.kind==="repo"?t.repos.find(p=>p.id===s.id)??null:o?t.repos.find(p=>p.id===o.repoId)??null:null)??(a?.kind==="project"?t.repos.find(p=>p.id===e.selectedRepoId&&a.discoveredRepoIds?.includes(p.id))??null:null)??(a?.kind!=="project"?t.repos.find(p=>p.id===a?.primaryRepoId)??null:null)??t.repos.find(p=>p.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,d=a?wo(t.tasks,a.id):c?ko(t.tasks,c):[],u=(s?.kind==="task"?d.find(p=>p.id===s.id)??null:null)??d.find(p=>p.id===e.selectedTaskId)??d[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:a?.id??null,selectedRepoId:c,selectedTaskId:u?.id??null,...MI(u,e.activeTab,e.selectedPtyTabId),selectedFilePath:$I(e,t,u?.id??null),...jI(e,t,u?.id??null),selectedDiffPath:OI(e,t,u?.id??null),inspectorSection:ks(e.inspectorSection,mh,"task")}}function Lt(e,t){return{...e,terminal:t}}function yh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function wh(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function at(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
257
|
+
`}function kh(e){return e.length===1&&e>=" "&&e!=="\x7F"}function zc(e){return bh(e)||wr(e)!==null}function Th(e){return ph.includes(e)}function bh(e){return dh.includes(e)}function Rh(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[B]:[]]}function OI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function $I(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function ks(e,t,n){return t.includes(e??"")?e:n}function DI(e){return e==="tabs"?"center":ks(e,AI,"tasks")}function NI(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":ks(e,Yc,t)}function _I(e){return e==="file"||e==="diff"?e:null}function xI(e){return e==="terminal"?"terminal":"agent"}function LI(e){return e==="terminal"?"terminal":"control"}function FI(e,t=[...z],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function yo(e,t=z){let n=t.length>0?t:z,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function wr(e){let t=z.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function MI(e,t,n){if(!e)return{activeTab:t===B?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(bh(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??B,selectedPtyTabId:l?.id??null}}if(t===B)return{activeTab:B,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??B,selectedPtyTabId:o?.id??null}}function jI(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?qI(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function qI(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 UI(e,t){let n=_n(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 _n(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Ts(wo(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 Ts(ko(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function wo(e,t){return Sh(e,n=>n.workspaceId===t)}function ko(e,t){return Sh(e,n=>n.repoId===t)}function WI(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function Sh(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Ts(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 Jc(e){return e?e.startsWith("workspace:")?{kind:"workspace",id:e.slice(10)}:e.startsWith("repo:")?{kind:"repo",id:e.slice(5)}:e.startsWith("task:")?{kind:"task",id:e.slice(5)}:null:null}function xt(e){return typeof e=="string"?e:null}function BI(e){return e?`task:${e}`:null}function Rs(e){return typeof e=="string"&&e.startsWith("task:")}function To(e){return typeof e=="string"&&e.startsWith("new-task:")}function bo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Ph(e){return typeof e=="string"&&e.startsWith("workspace:")}function Xc(e){return To(e)?e.slice(9):null}function Qc(e){return bo(e)?e.slice(19):null}async function kr(e,t,n){let r=ve(e),[s,i]=await Promise.all([ke.repos.listRegisteredRepos(r),ke.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await Xe(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r);let[h,f]=await Promise.all([Kp(r),ai(r)]);c=h.length+f.filter(y=>y.state==="waiting_for_review").length}let d=Zc(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await nh(d,u):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:p,furyApprovalCount:c,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function Zc(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Ih(e,t){return bs(e,t)}import cu from"node:path";import oB from"picocolors";var VI=[" \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 eu(){return[...VI]}var Ro={width:120,height:36},Q={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Fe(e,t){return{width:Math.max(e??Ro.width,Ro.width),height:Math.max(t??Ro.height,Ro.height)}}var KI=["Start","Options","Exit"],GI=["Resume","Options","Exit"],Po=2,Io=2,vo=2,HI=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),YI=new RegExp("\x1B\\[(?:0)?m","g"),zI=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),JI=/https?:\/\/[^\s<>"']+/g,nu="\x1B[0m",ru="\x1B]8;;\x1B\\",N={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},tu=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Ah(e,t={}){return iu(e,{subtitle:"crAIg is that you?",menuItems:KI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Eh(e,t={}){return iu(e,{subtitle:"Control mode is paused.",menuItems:GI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var So=[" 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."],XI=["Help"],QI=5;function Eo(e,t={}){return iu(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??XI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Oh(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=eu(),o=Math.max(1,Math.floor((e.height-i.length-2-So.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=re(jh(i[d]??"",e.width),n,N.overlayLogo);let a=Math.max(...So.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<So.length;d+=1){let u=c+d;if(u>=e.height)break;let p=So[d]??"";s[u]=re(Tt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
258
|
+
`)}function $h(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i="Logs",o=t.logPath??"",a=t.logLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),d=[{text:i,tone:"selected"},{text:o,tone:"muted"},lt(),...a.length>0?a.map(m=>({text:m,tone:ZI(m)})):[{text:"No Craig activity has been logged.",tone:"muted"}],lt(),{text:"Esc returns to Options.",tone:"muted"}],u=Ss(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let m=0;m<u.length;m+=1){let h=p+m;if(h>=e.height)break;let f=u[m]??lt(),y=`${" ".repeat(c)}${Oo(f.text,l)}`,T=f.tone==="selected"?N.overlayMenuSelected:f.tone==="info"?{...N.overlay,fg:N.accent.fg}:f.tone==="warning"?{...N.overlay,fg:N.pending.fg}:f.tone==="error"?{...N.overlay,fg:N.error.fg}:f.tone==="muted"?N.overlay:N.panelBg;s[h]=re(Tt(y,e.width),n,T)}return s.join(`
|
|
259
|
+
`)}function ZI(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function Dh(e,t,n={}){let r=n.color??!0,s=Q.leftWidth,i=Q.rightWidth,o=n.centerOnly??!1,a=e.height-Q.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:N.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:N.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:N.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,m=re(Tt(p,e.width),r,N.rail),h=tv(t,s-Po-Io,a,r),f=su(e,t,{color:r,centerOnly:o}),y=sv(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let ye=0;ye<a;ye+=1)if(!o){let H=Co(h[ye]??lt(),s,r,"left"),fn=re("\u2502",r,d),Os=re("\u2502",r,u),$s=Co(y[ye]??lt(),i,r,"right");R.push(`${H}${fn}`),b.push(`${Os}${$s}`)}let O=T||t.modalInput?N.panelBg:N.panelMuted,$=ev(t.footerText,t.footerToast,e.width,r,O),D={row:1,column:1,width:e.width,rows:[m]},x=o?null:{row:Q.topRailHeight+1,column:1,width:s+Q.dividerWidth,rows:R},v=o?null:{row:Q.topRailHeight+1,column:f.column+f.width,width:Q.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[$]},ge=o?f.rows:f.rows.map((ye,H)=>`${R[H]??""}${ye}${b[H]??""}`);return{frame:[m,...ge,$].join(`
|
|
260
|
+
`),center:f,regions:{rail:D,left:x,center:f,right:v,footer:w}}}function su(e,t,n={}){let r=n.color??!0,s=_h(e,n.centerOnly??!1),i=nv(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Co(o,s.width,r,"center"))}}function Nh(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!zc(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;let i=r.color??!0,o=_h(e,r.centerOnly??!1),a=xh(t,o.width,i).length,l=[...new Set(n)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:d})=>({index:d,row:Co(Lh(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function _h(e,t){return{row:Q.topRailHeight+1,column:t?1:Q.leftWidth+Q.dividerWidth+1,width:t?e.width:e.width-Q.leftWidth-Q.rightWidth-Q.dividerWidth*2,rowCount:e.height-Q.topRailHeight-1}}function ev(e,t,n,r,s){let i=` ${e}`;if(!t)return re(Tt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Oe(o),l=Oe(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?Oo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Oe(d)-a-2),p=t.tone==="error"?Sv(o,r,s):Tr(o,r,s),m=`${d}${" ".repeat(u)}${p} `;return re(Tt(m,n),r,s)}function iu(e,t){let n=new Array(e.height).fill(re(" ".repeat(e.width),t.color,N.overlay)),r=eu(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<QI;)o.push("");let a=[...r,"",t.subtitle,"",...o],l=Math.max(1,Math.floor((e.height-a.length)/2));for(let c=0;c<a.length;c+=1){let d=jh(a[c]??"",e.width);if(c<r.length){n[l+c]=re(d,t.color,N.overlayLogo);continue}if(c===r.length+1){n[l+c]=re(d,t.color,N.overlaySubtitle);continue}let u=c-(r.length+3),m=u>=0&&u<t.menuItems.length&&u===t.menuIndex?N.overlayMenuSelected:N.overlay;n[l+c]=re(d,t.color,m)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-Oe(d)));n[e.height-1]=re(`${u}${lu(d,t.color,N.overlay)}`,t.color,N.overlay)}return n.join(`
|
|
261
|
+
`)}function tv(e,t,n,r){let s=av(e.runners),i=1,o=e.leftTree.map(l=>ov(l,t,r));return[...Ss(o,n-i),s]}function nv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!zc(s)?e.centerTranscript.map(o=>({...o})):rv(e);return Ss([...xh(e,t,r),...i],n)}function xh(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:Tv(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Tr(a,n,N.panelBg):Ao(a,n,N.panelMuted)}`,c=[`${Ao(e.centerHeader.tabLabel,n,N.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=lv(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,m=e.inputMode==="terminal"?Tr(`${u}\u25CF `,n,N.panelBg):"",h=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Oe(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${h}${m}`:d},{text:l,tone:"muted"},{text:c},lt()]}function rv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},lt(),{text:e.terminal.error},lt(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(Lh)}function Lh(e){return{text:au(e.segments),segments:e.segments,fullBleed:!0}}function sv(e,t,n,r){let s=e.rightInspection?iv(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):Ss([{text:"CONTEXT"},lt(),...e.rightContext.map(i=>cv(i,r)),...e.actionMessage?[lt(),{text:e.actionMessage}]:[]],n);return Ss(s,n)}function iv(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:Rv(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>vh(a)),...r.slice(o,o+s).map(a=>vh(a))]}function vh(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 ov(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Tr("\u25CF",n,e.selected?N.panelSelected:N.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((h,f)=>h+Oe(f.text),0):0,l=t-Oe(i)-Oe(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?Tr(e.text,n,N.panelBg):e.panelHeader?Ao(e.text,n,N.panelMuted):e.text,u=Tt(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let h=`${r}${e.selected?"\u25B8":" "} `,f=u.slice(h.length+2),y=[{text:h},Fh(e.activity,e.activityAnimationFrame??0),{text:` ${f}${i}${o}`},...e.prBadge??[]];return{text:au(y),segments:y,tone:p}}if(e.prBadge){let h=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:h,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function av(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:N.success.fg}}):n.push({text:s.text,style:{fg:N.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function lv(e,t,n){return e.map(r=>{let s=r.active?n?Tr(r.label,t,N.panelBg):Ao(r.label,t,N.panelBg):lu(r.label,t,N.panelBg),i=r.activity?ou(Fh(r.activity,r.activityAnimationFrame??0),t,N.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Fh(e,t){return{text:"\u25CF",style:{fg:e==="working"?tu[t%tu.length]??tu[0]:e==="ready"?N.success.fg:e==="error"?N.error.fg:N.panelMuted.fg}}}function cv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?lu(e.value,t,N.panelBg):e.value}`}}function Co(e,t,n,r){let s=uv(r,e.tone??"default"),i=dv(e,n,s);if(r==="left"){if(e.fullBleed)return re(Tt(i,t),n,s);let a=t-Po-Io;if(e.rightAlign){let c=Oe(i),d=Math.max(0,a-c),u=`${" ".repeat(Po)}${" ".repeat(d)}${i}${" ".repeat(Io)}`;return re(u,n,s)}let l=`${" ".repeat(Po)}${Tt(i,a)}${" ".repeat(Io)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?pv(e,t,n,s):re(Tt(` ${i}`,t),n,s)}function uv(e,t){return t==="selected"||t==="focused"?N.panelSelected:t==="muted"?N.panelMuted:N.panelBg}function Ss(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(lt());return n}function lt(){return{text:""}}function dv(e,t,n){return e.segments?e.segments.map(r=>ou(r,t,n)).join(""):e.text}function pv(e,t,n,r){let s=" ".repeat(vo),i=Math.max(0,t-vo*2);if(!e.segments)return re(`${s}${Tt(e.text,i)}${s}`,n,r);let o=hv(e.segments,i),a=`${s}${o.map(l=>ou(l,n,r)).join("")}${s}${n?ru:""}`;return re(a,n,r)}function ou(e,t,n){let r=e.href?`${Mh(e.href)}${e.text}${ru}`:fv(e.text);return!t||!e.style?r:`${Ps(wv(e.style,n))}${kv(e.style)}${r}${nu}${Ps(n)}`}function fv(e){return e.replace(JI,t=>{let[n,r]=mv(t);return`${Mh(n)}${n}${ru}${r}`})}function mv(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Mh(e){return`\x1B]8;;${e}\x1B\\`}function hv(e,t){let n=gv(e,t);return yv(n,t)}function gv(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=Oo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function yv(e,t){let n=Oe(au(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 wv(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 kv(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 Tv(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 jh(e,t){let n=Math.max(0,t-Oe(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function Tt(e,t){let n=Oe(e);return n>=t?bv(e,t):e+" ".repeat(t-n)}function bv(e,t){if(t<=0)return"";if(Oe(e)<=t)return e;let n=Uh(e);return Oo(n,Math.max(0,t-1))+"\u2026"}function Oe(e){let t=0;for(let n of Array.from(Uh(e)))t+=qh(n);return t}function Oo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=qh(s);if(r+i>t)break;n+=s,r+=i}return n}function qh(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 Rv(e,t,n){return Math.min(Math.max(e,t),n)}function Uh(e){return e.replace(zI,"").replace(HI,"")}function au(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=Ps(n),s=e.replace(YI,`${nu}${r}`);return`${r}${s}${nu}`}function Ps(e){let t=[];return e.fg&&t.push(`38;2;${Ch(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Ch(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Ch(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Tr(e,t,n){return $o(e,t,N.success.fg,n)}function Sv(e,t,n){return $o(e,t,N.error.fg,n)}function Ao(e,t,n){return $o(e,t,N.accent.fg,n)}function lu(e,t,n){return $o(e,t,N.mutedfg.fg,n)}function $o(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Ps(s)}${e}${Ps(r)}`}function Wh(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"?Iv(s):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:Pv(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function Pv(e,t){let n=(e??"").split(cu.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(cu.delimiter):[...n,t].join(cu.delimiter)}function Iv(e){return e.command.length>0?e.command:["codex"]}function Bh(e,t){let n=e.ptyTabs.find(r=>r.kind===t);if(!n)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return n.id}function cn(e){return{columns:Math.max(20,e.width-Q.leftWidth-Q.rightWidth-Q.dividerWidth-vo*2),rows:Math.max(5,e.height-Q.topRailHeight-5)}}function Vh(e){return e.length===1||at(e)||e==="BACKSPACE"||e==="TAB"}function un(e){return typeof e=="string"&&new RegExp(`:(?:agent|${z.join("|")})(?:-\\d+)?$`).test(e)}function Kh(e,t){return e==="UP"&&t?-3:e==="DOWN"&&t?3:e==="PAGE_UP"?-5:e==="PAGE_DOWN"?5:e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function uu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Gh(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 Is(e){return Yh.includes(e)?"SHIFT_ENTER":null}function du(e){return Yh.some(t=>t.startsWith(e))}function Hh(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Yh=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function zh(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
263
262
|
`||n===`\r
|
|
264
|
-
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function
|
|
263
|
+
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Jh(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Xh(e,t=null){let n=t?.split(`
|
|
265
264
|
`)??[];return e.split(`
|
|
266
|
-
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function $o(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{spawn as xC}from"node:child_process";import{createServer as _C,createConnection as yh}from"node:net";import{openSync as FC}from"node:fs";import{mkdir as LC,readFile as wh,rm as $s,writeFile as MC}from"node:fs/promises";import Fo from"node:path";import{setTimeout as tC}from"node:timers/promises";var pn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=wd(t.resolutionMs??1e3,"Heartbeat resolution"),this.now=t.now??Date.now,this.onError=t.onError}register(t){if(this.jobs.has(t.id))throw new Error(`Heartbeat job "${t.id}" is already registered.`);let n={...t,intervalMs:wd(t.intervalMs,`Heartbeat job "${t.id}" interval`),inFlight:!1,nextRunAt:this.timer?this.now()+t.intervalMs:null};this.jobs.set(t.id,n)}start(){if(this.timer)return;let t=this.now();for(let n of this.jobs.values())n.nextRunAt=t+n.intervalMs;this.abortController=new AbortController,this.timer=setInterval(()=>this.tick(),this.resolutionMs)}stop(){this.abortController?.abort(),this.abortController=null,this.timer&&clearInterval(this.timer),this.timer=null;for(let t of this.jobs.values())t.nextRunAt=null}setResolutionMs(t){let n=wd(t,"Heartbeat resolution");n!==this.resolutionMs&&(this.resolutionMs=n,this.timer&&(clearInterval(this.timer),this.timer=setInterval(()=>this.tick(),this.resolutionMs)))}tick(){let t=this.abortController?.signal;if(!t)return;let n=this.now();for(let r of this.jobs.values())r.inFlight||r.nextRunAt===null||n<r.nextRunAt||(r.inFlight=!0,r.nextRunAt=n+r.intervalMs,Promise.resolve().then(()=>r.run(t)).catch(s=>{if(!t.aborted)return Promise.resolve(this.onError(r.id,s)).catch(()=>{})}).finally(()=>{r.inFlight=!1}))}};function wd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as oh,readFile as Vv,rm as kd,stat as Kv,writeFile as Gv}from"node:fs/promises";import Td from"node:path";async function bd(e){let t=Td.join(e.runtimeDir,"orchestration-supervisor.lock");await oh(e.runtimeDir,{recursive:!0});try{await oh(t)}catch(r){if(!Yv(r))throw r;let s=await Vv(Td.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Kv(t).catch(()=>null);if(typeof s?.pid=="number"&&!Hv(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await kd(t,{recursive:!0,force:!0}),bd(e);throw new h("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Gv(Td.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await kd(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await kd(t,{recursive:!0,force:!0}))}}}function Hv(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Yv=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var zv="\x1B[200~",Jv="\x1B[201~";function ah(e,t){switch(e){case"codex":return Rd(t,50);case"cursor":return Rd(t,50);case"claude":return Rd(t,50);default:return Xv(e)}}function Rd(e,t){return{paste:`${zv}${e}${Jv}`,submit:"\r",submitDelayMs:t}}function Xv(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import Qv from"node:path";var Zv={type:"system",component:"orchestration-supervisor"};async function lh(e){let t=Qv.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ms(t)??{version:1,commands:{}},r=await Ge(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of eC(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:Zv),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await M(t,n)}function eC(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var Do=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new pn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await bd(this.paths);try{await this.reconcile(),this.heartbeat.start()}catch(t){throw await this.lease.release(),this.lease=null,t}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await lh(this.paths);let t=await Ge(this.paths);for(let n of t){if(n.state==="delivering"){await ue.fail(this.paths,n.id,Os("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await ue.fail(this.paths,t.id,Os("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await R.getTask(this.paths,t.taskId).catch(i=>{if(i instanceof h&&i.code==="TASK_NOT_FOUND")return null;throw i}),r=n?.ptyTabs.find(i=>i.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await ue.fail(this.paths,t.id,Os("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(i=>i.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await ue.fail(this.paths,t.id,Os("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(this.runtime.hasRunningSession(t.agentTabId)&&!(t.delivery==="when-ready"&&Gt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")){await ue.beginDelivery(this.paths,t.id);try{let i=ah(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,i.paste),await tC(i.submitDelayMs),this.runtime.writeToSession(t.agentTabId,i.submit)}catch(i){await ue.fail(this.paths,t.id,Os("PROMPT_DELIVERY_UNCERTAIN",i instanceof Error?i.message:"Prompt delivery failed after it began.",!1,!0));return}await ue.completeDelivery(this.paths,t.id)}}},Os=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var nC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},vr=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...nC,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,n){let r=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,n);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:r,lastPollAt:null}),r>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,r+a)),l.intervalMs=a,r>=this.notBefore&&r>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let n=this.now();for(let r of t){let s=this.scheduledTasks.get(r);if(!s)continue;let i=s.lastPollAt===null?n:Math.max(n,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,n){let r=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,n);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:r+i,lastPollAt:r})}}recordFailure(t,n){let r=this.now(),s=n instanceof We,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=r+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=r+i,a.lastPollAt=r)}}getTaskIntervalMs(t,n){let r=rC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(sC);return this.withMinimum(i?s?this.intervals.pendingForegroundMs:this.intervals.pendingBackgroundMs:s?this.intervals.stableForegroundMs:this.intervals.stableBackgroundMs)}return t.status!=="closed"?this.withMinimum(s?this.intervals.discoveryForegroundMs:this.intervals.discoveryBackgroundMs):null}withMinimum(t){return Math.max(t,this.minimumIntervalMs)}};function rC(e){return e.type==="project"&&e.repoTargets?.length?e.repoTargets.map(t=>t.pullRequest).filter(t=>t.status==="open"):e.prs.filter(t=>t.status==="open")}function sC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as iC}from"node:fs";var No=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watcher=null;debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){if(!this.running){this.running=!0,this.baselineComplete=!1;try{this.watcher=iC(this.paths.tasksDir,{persistent:!1},()=>{this.schedule(this.taskDebounceMs)}),this.watcher.on("error",t=>{this.reportError(t)})}catch(t){this.reportError(t)}this.schedule(0)}}notifyActivity(t){if(!this.running)return;let n=Ct(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1,this.watcher?.close(),this.watcher=null,this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}clearReadinessTimer(t){let n=this.readinessTimers.get(t);n&&clearTimeout(n),this.readinessTimers.delete(t)}schedule(t){if(this.running){if(this.reconciliation){this.dirty=!0;return}this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.requestReconciliation()},t))}}requestReconciliation(){if(!this.running||this.reconciliation){this.dirty=!0;return}this.reconciliation=this.drainReconciliations().catch(t=>this.reportError(t)).finally(()=>{this.reconciliation=null,this.running&&this.dirty&&this.requestReconciliation()})}async drainReconciliations(){do{this.dirty=!1;let t=await this.options.reconcileEvents();this.baselineComplete&&t.length>0&&await this.options.onEvents(t),this.baselineComplete=!0}while(this.running&&this.dirty)}async reportError(t){await this.options.onError(t)}};var oC={selectedTaskId:null,reviewVisible:!1},aC={listTasks:async e=>(await R.listTasks(e)).tasks,syncTasks:async(e,t)=>(await R.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>R.getTask(e,n.id))))},xo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??aC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new vr({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new No(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=lC(s);i.length>0&&await this.wake(i)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new pn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=oC;running=!1;lastErrorMessage=null;start(){this.running||(this.running=!0,this.eventMonitor?.start(),this.heartbeat.start())}async stop(){this.running&&(this.running=!1,this.heartbeat.stop(),await this.eventMonitor?.stop(),await this.reconciliation?.catch(()=>{}))}setView(t){this.view=t}notifyActivity(t){this.eventMonitor?.notifyActivity(t)}notifyActivityRemoved(t){this.eventMonitor?.notifyActivityRemoved(t)}async wake(t){if(t?.length){for(let n of t)this.pendingWakeTaskIds.add(n);this.reconciliationVersion+=1}await this.reconcile()}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.drainReconciliations(),this.reconciliation)}async drainReconciliations(){try{for(;;){let t=this.reconciliationVersion,n=[...this.pendingWakeTaskIds];if(this.pendingWakeTaskIds.clear(),this.coordinator.requestImmediate(n),await this.reconcilePullRequests(),t===this.reconciliationVersion)return}}finally{this.reconciliation=null}}async reconcilePullRequests(){let t=await this.dependencies.listTasks(this.paths),n=this.view,r=this.coordinator.takeDueTasks(t,n);if(r.length===0)return;let s=new Map(r.map(o=>[o.id,ch(o)])),i;try{i=await this.dependencies.syncTasks(this.paths,r)}catch(o){this.coordinator.recordFailure(r,o),await this.reportPersistedChangesAfterFailure(s),await this.reportError(o);return}this.coordinator.recordSuccess(i,this.view),this.lastErrorMessage=null,await this.reportChangedTasks(s,i)}async reportPersistedChangesAfterFailure(t){try{let n=await this.dependencies.listTasks(this.paths);await this.reportChangedTasks(t,n.filter(r=>t.has(r.id)))}catch(n){await this.reportError(n)}}async reportChangedTasks(t,n){let r=n.filter(s=>t.get(s.id)!==ch(s)).map(s=>s.id);r.length>0&&await this.onTasksChanged(r)}async reportError(t){let n=t instanceof Error?t.message:String(t);n!==this.lastErrorMessage&&(this.lastErrorMessage=n,await this.onError(t))}};function lC(e){let t=new Set;for(let n of e){if(!n.taskId)continue;if(n.type==="task.created"||n.type==="task.pr.unlinked"){t.add(n.taskId);continue}let r=dC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&cC.has(i))&&t.add(n.taskId);continue}n.type==="agent.state.changed"&&r?.previousState==="working"&&(r.state==="ready"||r.state==="idle"||r.state==="error")&&t.add(n.taskId)}return[...t]}var cC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),dC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function ch(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as TC}from"node:module";import uC from"@xterm/headless";var pC=1e3,fC=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function uh(e){return new uC.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:pC,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function ph(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Pd(e,t){return new Promise(n=>{e.write(t,n)})}function fh(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let u=0;u<e.cols;u+=1){let d=l.getCell(u,s);!d||d.getWidth()===0||c.push({text:d.getChars()||" ",style:hC(d,o+a===i&&u===n.cursorX)})}r.push({segments:mC(gC(c))})}return r}function mC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&kC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};mh(n.style)||(s.style=n.style),t.push(s)}return t}function gC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!mh(n.style))break;t-=1}return e.slice(0,t)}function hC(e,t){let n={},r=dh(e,"fg"),s=dh(e,"bg");return r&&(n.fg=r),s&&(n.bg=s),e.isBold()&&(n.bold=!0),e.isDim()&&(n.dim=!0),e.isItalic()&&(n.italic=!0),e.isUnderline()&&(n.underline=!0),(e.isInverse()||t)&&(n.inverse=!0),n}function dh(e,t){if(t==="fg"?e.isFgDefault():e.isBgDefault())return;let r=t==="fg"?e.isFgRGB():e.isBgRGB(),s=t==="fg"?e.getFgColor():e.getBgColor();return r?s.toString(16).padStart(6,"0"):fC[s]??yC(s)}function yC(e){if(e>=16&&e<=231){let t=e-16,n=Math.floor(t/36),r=Math.floor(t%36/6),s=t%6;return[n,r,s].map(wC).map(i=>i.toString(16).padStart(2,"0")).join("")}if(e>=232&&e<=255){let t=8+(e-232)*10;return[t,t,t].map(n=>n.toString(16).padStart(2,"0")).join("")}return"e6e6e6"}function wC(e){return e===0?0:55+e*40}function kC(e,t){return Sd(e)===Sd(t)}function Sd(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function mh(e){return Sd(e)===""}var bC=TC(import.meta.url),RC=/^CTRL_([A-Z])$/,SC="\x1B[6n",PC="\x1B[c",IC="\x1B[?u",vC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
267
|
-
`,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},
|
|
268
|
-
`))&&this.touchActivity(n))}writeKey(t){let n=
|
|
269
|
-
[process exited ${m.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function
|
|
265
|
+
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Do(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as kC,createConnection as cg}from"node:net";import{mkdir as TC,readFile as ug,rm as Cs,writeFile as bC}from"node:fs/promises";import RC from"node:path";import{setTimeout as Fv}from"node:timers/promises";var dn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=pu(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:pu(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=pu(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 pu(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Qh,readFile as vv,rm as fu,stat as Cv,writeFile as Av}from"node:fs/promises";import mu from"node:path";async function hu(e){let t=mu.join(e.runtimeDir,"orchestration-supervisor.lock");await Qh(e.runtimeDir,{recursive:!0});try{await Qh(t)}catch(r){if(!Ov(r))throw r;let s=await vv(mu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Cv(t).catch(()=>null);if(typeof s?.pid=="number"&&!Ev(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await fu(t,{recursive:!0,force:!0}),hu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Av(mu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await fu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await fu(t,{recursive:!0,force:!0}))}}}function Ev(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 Ov=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var $v="\x1B[200~",Dv="\x1B[201~";function Zh(e,t){switch(e){case"codex":return gu(t,50);case"cursor":return gu(t,50);case"claude":return gu(t,50);default:return Nv(e)}}function gu(e,t){return{paste:`${$v}${e}${Dv}`,submit:"\r",submitDelayMs:t}}function Nv(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import _v from"node:path";var xv={type:"system",component:"orchestration-supervisor"};async function eg(e){let t=_v.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ns(t)??{version:1,commands:{}},r=await Ke(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of Lv(i))o.has(a)||(await bn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:xv),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await q(t,n)}function Lv(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var No=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new dn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await hu(this.paths);try{await this.reconcile(),this.heartbeat.start()}catch(t){throw await this.lease.release(),this.lease=null,t}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await po(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await eg(this.paths);let t=await Ke(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,vs("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 po(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,vs("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await S.getTask(this.paths,t.taskId).catch(o=>{if(o instanceof g&&o.code==="TASK_NOT_FOUND")return null;throw o}),r=n?.ptyTabs.find(o=>o.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await this.failCommand(t,vs("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(o=>o.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await this.failCommand(t,vs("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Kt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=Zh(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await Fv(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,vs("PROMPT_DELIVERY_UNCERTAIN",o instanceof Error?o.message:"Prompt delivery failed after it began.",!1,!0));return}let i=await ae.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(i)}async failCommand(t,n){let r=await ae.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!Mv(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}.`)}}},Mv=e=>e.idempotencyKey===`task-start:${e.taskId}`,vs=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var jv={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},br=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...jv,...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 Ue,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=qv(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(Uv);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 qv(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 Uv(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as Wv}from"node:fs";var _o=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=Ct(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1;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=Wv(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 Bv={selectedTaskId:null,reviewVisible:!1},Vv={listTasks:async e=>(await S.listTasks(e)).tasks,syncTasks:async(e,t)=>(await S.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>S.getTask(e,n.id))))},xo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??Vv,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new br({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new _o(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=Gv(s);i.length>0&&await this.onTasksChanged(i);let o=Kv(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new dn({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=Bv;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,tg(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)!==tg(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 Kv(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=zv(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&Yv.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 Gv(e){let t=new Set;for(let n of e)n.taskId&&Hv(n)&&t.add(n.taskId);return[...t]}function Hv(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var Yv=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),zv=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function tg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as iC}from"node:module";import Jv from"@xterm/headless";var Xv=1e3,Qv=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function rg(e){return new Jv.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:Xv,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function sg(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function wu(e,t){return new Promise(n=>{e.write(t,n)})}function ig(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let d=0;d<e.cols;d+=1){let u=l.getCell(d,s);!u||u.getWidth()===0||c.push({text:u.getChars()||" ",style:tC(u,o+a===i&&d===n.cursorX)})}r.push({segments:Zv(eC(c))})}return r}function Zv(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&sC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};og(n.style)||(s.style=n.style),t.push(s)}return t}function eC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!og(n.style))break;t-=1}return e.slice(0,t)}function tC(e,t){let n={},r=ng(e,"fg"),s=ng(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 ng(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"):Qv[s]??nC(s)}function nC(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(rC).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 rC(e){return e===0?0:55+e*40}function sC(e,t){return yu(e)===yu(t)}function yu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function og(e){return yu(e)===""}var oC=iC(import.meta.url),aC=/^CTRL_([A-Z])$/,lC="\x1B[6n",cC="\x1B[c",uC="\x1B[?u",dC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
266
|
+
`,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:""},Lo=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")ku(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,ag(i,r),this.getViewState(n);let o;try{o=this.createSession(t,n,r,s)}catch(a){throw this.recordActivity({taskId:t,tabId:n,sessionState:"failed",lastActivityAt:Date.now(),exitCode:null,error:a instanceof Error?a.message:String(a)}),a}return this.sessions.set(n,o),this.notifyActivity(o),this.attachedTabId=n,this.getViewState(n)}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||(n.pty.write(t),(t.includes("\r")||t.includes(`
|
|
267
|
+
`))&&this.touchActivity(n))}writeKey(t){let n=pC(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&&ag(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&&(ku(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())ku(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:fC(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??hC().spawn,o=rg(r),a=s??this.resolveSessionSpec(t,n),l=ro({...this.env,...a.env??{}}),{executable:c,args:d}=gC(this.shell,a.command,{cwd:a.cwd,env:l}),u=i(c,d,{name:"xterm-256color",cols:r.columns,rows:r.rows,cwd:a.cwd,env:yC(l)}),p={taskId:t,tabId:n,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(u.onData(m=>{this.touchActivity(p),wC(u,m),wu(p.terminal,m).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(m=>{p.status="exited",p.exitCode=m.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),wu(p.terminal,`\r
|
|
268
|
+
[process exited ${m.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function pC(e){if(e.length===1)return e;let t=dC[e];if(t!==void 0)return t;let n=aC.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function ag(e,t){mC(e.pty,t),sg(e.terminal,t),e.screenDirty=!0}function fC(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=ig(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function ku(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function mC(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function hC(){return oC("node-pty")}function gC(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[so(t[0],n),...t.slice(1)].map(lg).join(" ")}; exec ${lg(e)} -l`;return{executable:e,args:["-lc",s]}}function lg(e){return`'${e.replaceAll("'","'\\''")}'`}function yC(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 wC(e,t){for(let n=0;n<Tu(t,lC);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Tu(t,cC);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Tu(t,uC);n+=1)e.write("\x1B[?0u")}function Tu(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 Fo=Vr,SC=16,PC=250;async function dg(e){let t=Je(e.paths);await AC(t,e.paths,e.spawnDaemon);let n=await kg(t.socketPath),r=new bu(n,e);return await r.ready(),r}async function pg(e,t={}){let n=Je(e);await TC(e.runtimeDir,{recursive:!0}),await Cs(n.socketPath,{force:!0});let r=new Ru(e,t),s=kC(i=>r.handleConnection(i));try{await r.start(),await DC(s,n.socketPath),await bC(n.pidPath,String(process.pid),"utf8"),await de.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${Fo}.`,details:{pid:process.pid,protocolVersion:Fo}}),await new Promise(i=>{let o=!1,a=()=>{o||(o=!0,r.closeClients(),s.close(()=>{process.removeListener("SIGTERM",a),process.removeListener("SIGINT",a),i()}))};r.onShutdown=a,process.once("SIGTERM",a),process.once("SIGINT",a)})}catch(i){throw await de.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{await de.appendLogBestEffort(e,{level:"info",component:"daemon",event:"stopped",message:"PTY daemon stopped and disposed its remaining sessions.",details:{pid:process.pid,remainingSessionCount:r.sessionCount()}}),r.onShutdown=null,await Cs(n.socketPath,{force:!0}),await Cs(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function fg(e){let t=Je(e);return await gg(t.socketPath)?(await $C(t.socketPath),!0):!1}var bu=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>{this.closed||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;buffer="";closed=!1;protocolVersion=Fo;options;async ready(){let t=await this.send({type:"ping"});if(!hg(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&(this.viewCache.set(n,r.view),r.view.status==="idle"&&de.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
|
|
270
269
|
`);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
271
270
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
272
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=
|
|
271
|
+
`)}}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=CC(r,n.patch),i=r.rows.slice(0,n.patch.rowCount);for(let o of n.patch.rows)i[o.index]=o.row;this.viewCache.set(n.tabId,{status:n.patch.status,rows:i,error:n.patch.error,scrolledBack:n.patch.scrolledBack}),this.viewedTabId===n.tabId&&this.options.onUpdate?.(s?{tabId:n.tabId,kind:"full"}:{tabId:n.tabId,kind:"rows",rowIndices:n.patch.rows.map(o=>o.index)})}n.type==="activity"&&(this.recordCachedActivity(n.snapshot),this.options.onActivity?.(n.snapshot)),n.type==="activityRemoved"&&this.removeCachedActivity(n.tabId),n.type==="tasksChanged"&&this.tasksChangedHandler?.(n.taskIds)}subscribeToView(t){this.closed||this.subscribedTabId===t||(this.subscribedTabId=t,this.send({type:"subscribeView",tabId:t}).then(n=>{t&&n.view&&this.viewCache.set(t,n.view),this.viewedTabId===t&&this.subscribedTabId===t&&this.notifyFullUpdate(t)}).catch(()=>{this.subscribedTabId===t&&(this.subscribedTabId=null)}))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}notifyFullUpdate(t){t&&this.options.onUpdate?.({tabId:t,kind:"full"})}replaceActivityCache(t,n){let r=new Map;for(let[s,i]of this.activityRevisionByTabId)i>n&&r.set(s,this.activityCache.get(s)??null);this.activityCache.clear();for(let s of t)this.activityCache.set(s.tabId,s);for(let[s,i]of r)i?this.activityCache.set(s,i):this.activityCache.delete(s)}async refreshActivitySnapshots(t=!1){let n=this.activityRevision,r=await this.send({type:"getActivitySnapshots"});if(this.replaceActivityCache(r.activities??[],n),t)for(let s of this.activityCache.values())this.options.onActivity?.(s)}recordCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t.tabId,this.activityRevision),this.activityCache.set(t.tabId,t)}removeCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t,this.activityRevision),this.activityCache.delete(t),this.options.onActivityRemoved?.(t)}failRunningActivities(t){for(let n of this.activityCache.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t};this.recordCachedActivity(r),this.options.onActivity?.(r)}}},Ru=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 Lo({...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??(()=>nn(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new xo(this.paths,{...r,reconcileEvents:s,minimumIntervalMs:r.minimumIntervalMs??(t.github?.watchIntervalSeconds??5)*1e3,onTasksChanged:async i=>{this.broadcastTasksChanged(i),await r.onTasksChanged?.(i)},onError:async i=>{await de.appendErrorLogBestEffort(this.paths,{context:"pull request sync supervisor",message:i instanceof Error?i.message:String(i)}),await r.onError?.(i)}}),this.pullRequestSyncSupervisor.start(),this.updateRuntimeActivityEnabled()}let n=(await Ke(this.paths)).some(r=>r.state==="queued"||r.state==="delivering");(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1}}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
|
|
273
272
|
`);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
|
|
274
|
-
`)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}sessionCount(){return this.runtime.sessionTabIds().length}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{
|
|
275
|
-
${
|
|
273
|
+
`)}});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{xn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);xn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:Fo,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);xn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec);return r||this.log({level:"info",component:"pty",event:"spawned",message:"PTY session spawned.",taskId:n.taskId,tabId:n.tabId}),this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,s)}case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),await this.orchestrationSupervisor.wake(),null;case"shutdown":return this.log({level:"warn",component:"daemon",event:"shutdown.requested",message:"PTY daemon shutdown was explicitly requested.",details:{liveSessionCount:this.runtime.sessionTabIds().length}}),setTimeout(()=>this.onShutdown?.(),0),null;default:return _C(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(Su),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1}}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)xn(n,{type:"tasksChanged",taskIds:t})}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},PC))}}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&&xn(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&&xn(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 No(this.paths,this.runtime,{onError:n=>de.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start(),await de.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await de.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){de.appendLogBestEffort(this.paths,t)}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},SC))}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=IC(s,n),o=vC(s.view,n);s.view=n,s.rowKeys=n.rows.map(Su),(i.rows.length>0||o)&&xn(r,{type:"update",tabId:t,patch:i})}}};function IC(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Su(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 vC(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 CC(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Su(e){return JSON.stringify(e)}async function AC(e,t,n){if(await EC(e.socketPath,1e3))return;if(await gg(e.socketPath)){let i=await yg(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await de.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.")}await OC(e,t),io(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await mg(e.socketPath))return;await Tg(50)}let s=await ug(RC.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
|
|
274
|
+
${s.slice(-2e3)}`:""}`)}async function mg(e){let t=await yg(e).catch(()=>null);return t?.ok===!0&&hg(t.protocolVersion)}function hg(e){return Gt(e)}async function EC(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await mg(e))return!0;await Tg(50)}return!1}async function OC(e,t){let n=await ug(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&NC(r))return;await de.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"previous_exit.unclean",message:"Found stale daemon state from a process that is no longer running.",details:{previousPid:Number.isInteger(r)?r:null}})}await Cs(e.socketPath,{force:!0}),await Cs(e.pidPath,{force:!0})}async function gg(e){let t=await kg(e).catch(()=>null);return t?(t.end(),!0):!1}async function $C(e){await wg(e,{id:1,type:"shutdown"}).catch(()=>null)}async function yg(e){return wg(e,{id:1,type:"ping"})}function wg(e,t){return new Promise((n,r)=>{let s=cg(e),i="",o=setTimeout(()=>{s.destroy(),r(new Error("Craig PTY daemon request timed out."))},500),a=()=>clearTimeout(o);s.setEncoding("utf8"),s.once("connect",()=>s.write(`${JSON.stringify(t)}
|
|
276
275
|
`)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
|
|
277
|
-
`);if(c===-1)return;let
|
|
278
|
-
`)}catch{}}function
|
|
279
|
-
`}function eA(e){return e.length===1&&e>=" "&&e!==""}import Ns from"node:path";function Lh(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"\u{F06E6} ";case"js":case"jsx":case"mjs":case"cjs":return"\u{F031E} ";case"json":case"jsonc":return"\u{F0871} ";case"md":case"mdx":return"\u{F0354} ";case"yaml":case"yml":return"\u{F0B10} ";case"sh":case"bash":case"zsh":return"\u{F018D} ";case"css":case"scss":case"sass":return"\u{F031C} ";case"html":case"htm":return"\u{F031D} ";case"py":return"\u{F0320} ";case"go":return"\u{F07D3} ";case"rs":return"\u{F1617} ";case"lock":return"\u{F033E} ";case"png":case"jpg":case"jpeg":case"gif":case"svg":case"webp":return"\u{F02E9} ";default:return"\u{F0214} "}}var Mh="\u{F024B} ",jh="\u{F0DCF} ",qh="\u25CB",Dd="\uEA64",Uh="\uEAFE",Wh="\uEBDA",Nd="\u25CB",xd="\u25CF",_d="\u2713",Fd="\u2715";function Bh(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"4fc1ff";case"js":case"jsx":case"mjs":case"cjs":return"f7df1e";case"json":case"jsonc":return"fbc02d";case"md":case"mdx":return"519aba";case"yaml":case"yml":return"e06c75";case"sh":case"bash":case"zsh":return"89e051";case"css":case"scss":case"sass":return"c792ea";case"html":case"htm":return"e06c75";case"py":return"3572a5";case"go":return"00add8";case"rs":return"dea584";case"lock":return"565f89";default:return}}var Mo=150,Vh=6;var qo="empty",pe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Yh(e,t,n){let r=rA(t,e),s=t.repos.find(y=>y.id===e.selectedRepoId)??t.repos[0]??null,i=r?t.tasks.filter(y=>y.workspaceId===r.id):t.tasks,o=r?.kind==="project"?i:s?i.filter(y=>y.repoId===s.id):[],a=o.find(y=>y.id===e.selectedTaskId)??o[0]??null,l=a?.type==="project",c=LA(t.tasks),u=oA(e,a),d=iA(e,a,u,n),p=d.find(y=>y.id===u)??d[0]??{id:"agent",label:"CODEX"},m=t.inspection?.taskId===a?.id?t.inspection:null,g=s?.name??"no repo",f=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:vs(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":u===K?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ns.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ns.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:tA(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>MA(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:g,agent:f},centerTranscript:sA(u,e,s,a,e.workspaceBrowser,m,r),tabs:d,rightContext:FA(s,a),rightInspection:kA(e,a,m)}}function tA(e,t,n){let r=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if((t.furyApprovalCount??0)>0&&r.push({text:`\u25CF ${t.furyApprovalCount} Fury approval${t.furyApprovalCount===1?"":"s"} waiting`,indent:1,status:"pending"}),!t.workspaces)return nA(r,e,t.repos,t.tasks,n);let s=t.workspaces;if(s.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of s){let a=e.selectedLeftItemId===`workspace:${o.id}`;r.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:a,focused:a&&e.focusedRegion==="tasks"});let l=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],c=t.tasks.filter(u=>u.workspaceId===o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:d}of Ps(c)){let p=e.selectedLeftItemId===`task:${u.id}`,m=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,g={id:`task:${u.id}`,taskId:u.id,text:n?m:`${p?"\u25B8":"\u2022"} ${m}`,indent:d===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:tr(u,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=Jh(u);f&&(g.prBadge=f),r.push(g)}if(o.kind==="project"){let u=`new-task-workspace:${o.id}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}if(o.kind==="repo"){let u=`new-task:${o.primaryRepoId}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let u of l.slice(0,6)){let d=t.repos.find(p=>p.id===u);r.push({text:` \xB7 ${d?.name??u}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function nA(e,t,n,r,s){if(n.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let o of n){let a=t.selectedLeftItemId===`repo:${o.id}`;e.push({id:`repo:${o.id}`,text:`\u2013 ${o.name}`,selected:a,focused:a&&t.focusedRegion==="tasks"});let l=r.filter(d=>d.repoId===o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of Ps(l)){let m=t.selectedLeftItemId===`task:${d.id}`,g=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:s?g:`${m?"\u25B8":"\u2022"} ${g}`,indent:p===0?2:4,selected:m,focused:m&&t.focusedRegion==="tasks",...s?{activity:tr(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Jh(d);y&&(f.prBadge=y),e.push(f)}let c=`new-task:${o.id}`,u=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:u,focused:u&&t.focusedRegion==="tasks",muted:!u})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function rA(e,t){let n=e.workspaces??[];if(!e.workspaces)return null;let r=e.tasks.find(s=>s.id===t.selectedTaskId)??null;return r?n.find(s=>s.id===r.workspaceId)??null:t.selectedWorkspaceId?n.find(s=>s.id===t.selectedWorkspaceId)??null:n[0]??null}function sA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(d=>d.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((d,p)=>{let m=p===s.selectedIndex?"\u25B8":" ",g=d.kind==="repo"?" [git repo]":"/";return`${m} ${d.name}${g}`}),u=s.query!==null?`Search: ${s.query}\u2588`:"";return ct(["Browse for a workspace to register.",s.cwd,...u?[u]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return ct(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,u=l?"Project Task":"Task";return ct([`No tasks in ${c}.`,"",`Press n or choose + New ${u} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===K&&t.openInspectionKind==="file"?cA(r,i,t.fileScrollOffset):e===K&&t.openInspectionKind==="diff"?dA(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ct(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ct(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function iA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:aA(o),...o.kind==="agent"&&r&&t?{activity:Gt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:qo,label:"EMPTY",active:n===qo,focused:e.focusedRegion==="center"&&n===qo}];let i=e.openInspectionKind||n===K?[{id:K,label:lA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function oA(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===K&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??K:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??K:qo}function aA(e){return e.title.toUpperCase()}function lA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ns.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function cA(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ct(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=zh(r.path??r.title);return[{text:r.title},{text:`${r.byteLength===null?"size unknown":`${r.byteLength} bytes`} \xB7 ${r.lines.length} lines \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...uA(r.lines,n,s)]}function dA(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ct(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=zh(r.path??r.title);return[{text:r.title},{text:`${t.diffPaths.length} changed files \xB7 ${r.lines.length} rows \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...pA(r.lines,n,s)]}function ct(e){return e.map(t=>({text:t}))}function uA(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:pe.lineNumber}},{text:" \u2502 ",style:{fg:pe.gutter}},...Ld(i,n)],tone:"default"}})}function pA(e,t,n){let r=fA(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>mA(i,n))}function fA(e){let t=[],n=0,r=0;for(let s of e){let i=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(s);if(i){n=Number.parseInt(i[1]??"0",10),r=Number.parseInt(i[2]??"0",10);continue}if(!(s.startsWith("diff --git")||s.startsWith("index ")||s.startsWith("+++ ")||s.startsWith("--- "))&&!(s==="staged"||s==="unstaged"||s==="untracked")){if(s.startsWith("-")&&!s.startsWith("---")){t.push({oldNumber:n,newNumber:null,marker:"-",text:s.slice(1),kind:"delete"}),n+=1;continue}if(s.startsWith("+")&&!s.startsWith("+++")){t.push({oldNumber:null,newNumber:r,marker:"+",text:s.slice(1),kind:"add"}),r+=1;continue}if(s.startsWith(" ")){if(n===0&&r===0)continue;t.push({oldNumber:n,newNumber:r,marker:" ",text:s.slice(1),kind:"context"}),n+=1,r+=1;continue}}}return t}function mA(e,t){let n=Kh(e.oldNumber),r=Kh(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:pe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:pe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?hA(Ld(e.text,t),i.bg,i.fallbackFg):Ld(e.text,t),l=i?{fg:pe.lineNumber,bg:i.bg}:{fg:pe.lineNumber},c=i?{fg:pe.gutter,bg:i.bg}:{fg:pe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Kh(e){return e===null?" ":String(e).padStart(4," ")}function zh(e){let t=Ns.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function Ld(e,t){return t==="diff"?gA(e):t==="markdown"?yA(e):t==="json"?Md(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Md(e,/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`)|\/\/.*$|\/\*.*?\*\/|\b(const|let|var|function|return|if|else|for|while|class|interface|type|import|export|from|async|await|new|extends|implements|switch|case|break|continue|try|catch|throw|true|false|null|undefined)\b|-?\b\d+(?:\.\d+)?\b/g):[{text:e}]}function gA(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:pe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:pe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:pe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:pe.diffMeta}}]:[{text:e}]}function hA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function yA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:pe.markup,bold:!0}}]:Md(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Md(e,t){let n=[],r=0;for(let s of e.matchAll(t)){let i=s[0],o=s.index??0;o>r&&n.push({text:e.slice(r,o)}),n.push({text:i,style:wA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function wA(e){return e.startsWith("//")||e.startsWith("/*")?{fg:pe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:pe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:pe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:pe.markup}:{fg:pe.keyword}}function kA(e,t,n){let r=e.selectedProjectTargetId??t?.repoTargets?.[0]?.repoId??null,s=t?.type==="project"&&r?t.repoTargets?.find(a=>a.repoId===r)??null:null,i=t?.type==="project"?Xh(t.repoTargets??[]):s?.pullRequest??(t?V(t):null),o=[TA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=ey(e,t),l=jd(e,n),c=IA([{id:"review-pr-header",text:"PULL REQUEST",muted:!0},...a,{id:"review-changes-spacer",text:"",muted:!0},{id:"review-changes-header",text:"CHANGES",muted:!0},...l],e);return{title:"",rows:[...o,...c]}}return e.inspectionMode==="files"?{title:"",rows:[...o,...NA(e,n)]}:{title:"",rows:[...o,...jd(e,n)]}}function TA(e,t){let n=e.inspectionMode,r=[{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let c=r[l];l>0&&s.push({text:" "});let u=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:u}})}let i=qd(t),o=Ud(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Gh(e){return[{text:" "},qd(e),{text:" "},Ud(e)]}function Jh(e){if(e.type==="project"&&e.repoTargets?.length){let n=Xh(e.repoTargets);return n?Gh(n):null}let t=V(e);return t?.number?Gh(t):null}function Xh(e){let t=e.filter(s=>s.status==="ready"),n=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(n.length===0)return null;let r=RA(n);return{number:-1,status:bA(n),draft:n.some(s=>s.draft),mergeable:n.length===t.length&&n.every(s=>s.mergeable),mergeStateStatus:null,reviewDecision:n.some(s=>s.reviewDecision==="CHANGES_REQUESTED")?"CHANGES_REQUESTED":n.some(s=>s.reviewDecision==="REVIEW_REQUIRED")?"REVIEW_REQUIRED":n.every(s=>s.reviewDecision==="APPROVED")?"APPROVED":null,requiredChecks:n.flatMap(s=>s.requiredChecks),aggregateReadiness:r}}function bA(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function RA(e){let t=e.map(n=>Qh(n));return t.some(n=>n==="failed")?"failed":t.some(n=>n==="pending")?"pending":t.length>0&&t.every(n=>n==="success")?"success":"none"}function qd(e){return!e||!e.number?{text:qh,style:{fg:"565f89"}}:e.status==="merged"?{text:Uh,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Wh,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Dd,style:{fg:"565f89"}}:{text:Dd,style:{fg:"9ece6a"}}}function Ud(e){return e?.aggregateReadiness?Hh(e.aggregateReadiness):Hh(Qh(e))}function Hh(e){return e==="failed"?{text:Fd,style:{fg:"f7768e"}}:e==="pending"?{text:xd,style:{fg:"e0af68"}}:e==="success"?{text:_d,style:{fg:"9ece6a"}}:{text:Nd,style:{fg:"565f89"}}}function Qh(e){let t=e?.requiredChecks??null;return e?.status==="merged"?"success":e?.status==="closed"||!e?.number||!t||t.length===0?"none":t.some(n=>n.status==="failed")||e.reviewDecision==="CHANGES_REQUESTED"?"failed":t.every(n=>n.status==="success"||n.status==="skipped")?Zh(e)?"failed":SA(e)?"success":"pending":"pending"}function SA(e){return!!(e.mergeable&&!e.draft&&!Zh(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Zh(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function ey(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return PA(e,t);let n=V(t),r=ny("pr",t.branch,n??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(i=>i!==n&&(i.status==="merged"||i.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),r}var jo=32;function PA(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let o of r){let a=s===o.repoId,l=e.focusedRegion==="inspector"&&a,c=o.repoId.startsWith("repo_")?o.repoId.slice(5):o.repoId;if(o.status!=="ready"){let d=o.failureReason?o.failureReason.slice(0,14):o.status,p=jo-d.length-1,m=c.length>p?c.slice(0,p-1)+"\u2026":c,g=jo-m.length-d.length;n.push({id:`project-review:${o.repoId}`,text:m+" ".repeat(Math.max(1,g))+d,selected:a,focused:l,muted:!0})}else{let u=qd(o.pullRequest),d=Ud(o.pullRequest),p=`${u.text} ${d.text}`,m=jo-p.length-1,g=c.length>m?c.slice(0,m-1)+"\u2026":c,f=jo-g.length-p.length,y=g+" ".repeat(Math.max(1,f));n.push({id:`project-review:${o.repoId}`,text:y+p,selected:a,focused:l,segments:[{text:y},{...u,text:u.text},{text:" "},{...d,text:d.text}]})}}let i=r.find(o=>o.repoId===s)??null;return i?.status==="ready"&&i.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...ny("target",i.branch,i.pullRequest))),n}function ty(e,t,n=null){return 3+ey(e,t).length+jd(e,n).length}function ny(e,t,n){let r=d=>`${e}-${d}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],i=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${i} Open in GitHub \u2197`,segments:[{text:i},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:i});let o=n.baseBranch??"?",a=n.headBranch??t;s.push({id:r("pr-branches"),text:`${o} \u2192 ${a}`,muted:!0});let l=vA(n.reviewDecision,n.mergeStateStatus),c=l&&l!=="review approved"?"merge blocked":n.mergeable?"merge ready":n.mergeStateStatus?`merge ${n.mergeStateStatus}`:"merge unknown";l?s.push({id:r("pr-merge"),text:`${c} \xB7 ${l}`,muted:!0,segments:[{text:c},{text:" \xB7 "},{text:l,style:{fg:CA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${ry(n.lastSyncedAt)}`,muted:!0}),s.push({id:r("checks-spacer"),text:""}),s.push({id:r("checks-header"),text:"Checks"}),n.requiredChecks.length?s.push(...n.requiredChecks.map(AA)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let u=n.comments??[];return u.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${u.length})`}),s.push(...u.slice(-4).flatMap((d,p)=>EA(d,r(`comment:${p}`))))),s}function IA(e,t){if(t.focusedRegion!=="inspector"||t.inspectionMode!=="review"||e.length===0)return e;let n=Math.max(0,Math.min(t.reviewScrollOffset,e.length-1));return e.map((r,s)=>({...r,selected:t.reviewScrollOffset===0&&r.selected||s===n,focused:t.reviewScrollOffset===0&&r.focused||s===n}))}function vA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function CA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function ry(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/1e3);if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let s=Math.floor(r/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function AA(e){let{icon:t,color:n}=$A(e.status),r=e.name.length>16?`${e.name.slice(0,15)}\u2026`:e.name;return{id:`pr-check:${e.name}`,text:`${t} ${r.padEnd(16," ")} ${DA(e.status)}`,color:n,muted:!1}}function EA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${ry(e.createdAt)}`:"",s=OA(e.body,30),i=s.slice(0,4),o=i.length<s.length,a=[{id:`${t}:author`,text:`${n}${r}`,muted:!0},...i.map((l,c)=>({id:`${t}:body:${c}`,text:` ${o&&c===i.length-1?`${l}\u2026`:l}`,muted:!0}))];return a.push({id:`${t}:spacer`,text:"",muted:!0}),a}function OA(e,t){let n=e.split(/\s+/).filter(Boolean);if(n.length===0)return[];let r=[],s="";for(let i of n){if(!s){s=i;continue}`${s} ${i}`.length<=t?s=`${s} ${i}`:(r.push(s),s=i)}return s&&r.push(s),r}function $A(e){switch(e){case"success":return{icon:_d,color:"9ece6a"};case"pending":return{icon:xd,color:"e0af68"};case"failed":return{icon:Fd,color:"f7768e"};case"skipped":return{icon:Nd,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function DA(e){return e==="success"?"passing":e==="failed"?"failing":e}function NA(e,t){if(!t)return[{id:"empty",text:"No file index. Select a task with local changes.",muted:!0}];if(t.error)return[{id:"error",text:t.error,muted:!0}];if(t.fileRows.length===0)return[{id:"empty",text:"No Git-visible files.",muted:!0}];let n=new Map(t.diffRows.map(l=>[l.path,l.status])),r=Wd(t.fileRows,e.collapsedFileTreePaths),s=e.fileSearchQuery,i=s?r.filter(l=>l.path.toLowerCase().includes(s.toLowerCase())):r,o=s!==null?[{id:"file-search",text:`Search: ${s}\u2588`,muted:!1}]:[],a=e.selectedFileTreePath??t.selectedFilePath;return[...o,...i.map(l=>{let c=l.kind==="file"?n.get(l.path):void 0,u=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,d=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?Mh:jh:Lh(l.label),p=l.kind==="directory"?"7aa2f7":Bh(l.label),m=" ".repeat(l.depth),g=p?{text:d,style:{fg:p}}:{text:d},f=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:u?{text:l.label,style:{fg:u}}:{text:l.label},y=[{text:m},g,f];return{id:l.path,text:`${m}${d}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function Wd(e,t){let n=new Set(t);return e.filter(r=>{let s=r.path.split("/");for(let i=1;i<s.length;i+=1)if(n.has(s.slice(0,i).join("/")))return!1;return!0})}function jd(e,t){if(!t)return[{id:"empty",text:"No task diff index.",muted:!0}];if(t.error)return[{id:"error",text:t.error,muted:!0}];if(t.diffRows.length===0)return[{id:"empty",text:t.filePaths.some(s=>s.startsWith("repo_"))?"No changes in project task worktrees. Edits in the original repos are outside this task.":"No local changes.",muted:!0}];if(xA(t))return _A(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(i=>i.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(i=>sy(i,e,t))))}return n}function xA(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function _A(e,t){let n=[],r=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of r){let i=t.diffRows.filter(a=>a.path.startsWith(`${s}/`)),o=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:o,muted:!0});for(let a of["branch","staged","unstaged","untracked"]){let l=i.filter(c=>c.group===a);l.length!==0&&(n.push({id:`repo-diff:${s}:${a}`,text:` ${a}`,muted:!0}),n.push(...l.map(c=>sy(c,e,t,s.length+1))))}}return n}function sy(e,t,n,r=0){let s=e.additions===null?"-":`+${e.additions}`,i=e.deletions===null?"-":`-${e.deletions}`,o=e.status==="A"||e.group==="untracked"?"9ece6a":e.status==="D"?"f7768e":"e0af68",a=r>0?e.path.slice(r):e.path;return{id:`${e.group}:${e.path}`,text:` ${e.status.padEnd(2," ")} ${a} ${s}/${i}`,selected:e.path===(t.selectedDiffPath??n.selectedDiffPath),focused:e.path===(t.selectedDiffPath??n.selectedDiffPath)&&t.focusedRegion==="inspector",color:o}}function FA(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ns.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function LA(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function MA(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function iy(e,t,n,r,s=null){if(s)return jA(e,t,n,r,s);let i=dd(e,t,{centerOnly:r});return qA(n,i)?{output:$o(i.rows,n.rows,i.row,i.column),region:i}:null}function jA(e,t,n,r,s){let i=Ug(e,t,s,{centerOnly:r});if(!i||!UA(n,i))return null;let o=n.rows.slice();return{output:i.rows.map(({index:l,row:c})=>o[l]===c?"":(o[l]=c,`\x1B[${i.row+l};${i.column}H${c}`)).join(""),region:{row:i.row,column:i.column,width:i.width,rows:o}}}function qA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function UA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function oy(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!WA(o,a))return null;!o||!a||(s+=$o(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function WA(e,t){return!e||!t?e===t:e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}var BA=["tasks","center","inspector"];function VA(e,t,n){if(t==="ESCAPE")return E({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return E({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return Vd(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return Gd({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return E({state:{...e,fileSearchQuery:r},changed:!0})}return E({state:e})}function Gd(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Cg(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return VA(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return E({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return E({state:e,exit:!0});if(t==="ESCAPE")return E({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return E({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(ko(e.selectedLeftItemId)||To(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:wo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return ay(e,1);if(t==="SHIFT_TAB"||t==="[")return ay(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===K?fn(e,-1,n):Vd(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===K?fn(e,1,n):Vd(e,1,n);if(t==="PAGE_UP")return fn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return fn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return fn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return fn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??J,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=QA(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&vs(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Dg(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&dy(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Bd(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return ly(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Bd(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return ly(e,1)}if(at(t)){if(e.focusedRegion==="tasks"&&(ko(e.selectedLeftItemId)||To(e.selectedLeftItemId))){let r=rd(e.selectedLeftItemId),s=sd(e.selectedLeftItemId);return E({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&vs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Sr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&dy(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Sr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===K)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:HA({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:K,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function fn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?uy(e,t,n):e.inspectionMode==="review"?cy(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===K){if(e.openInspectionKind==="file")return cy(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return YA(e,t,n)}return E({state:e})}function ay(e,t){return Uo(e,"focusedRegion",BA,t)}function Bd(e,t,n){let r=Uo(e,"activeTab",n&&n.length>0?n:ZA(e),t);return!r.changed||Eg(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Sr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Vd(e,t,n){if(e.focusedRegion==="tasks")return KA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Bd(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return uy(e,t,n);if(n.projectTargetIds?.length){let s=Kd(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Kd(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Uo(e,"selectedActionId",Rg,t)}return Uo(e,"selectedActionId",Zc,t)}function KA(e,t,n){let r=Kd(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=nd(r.state.selectedLeftItemId);if(s?.kind==="workspace")return{...r,state:{...r.state,selectedWorkspaceId:s.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};if(s?.kind==="task")return{...r,state:{...r.state,selectedTaskId:s.id,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};if(s?.kind==="repo")return{...r,state:{...r.state,selectedRepoId:s.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};let i=rd(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=sd(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function GA(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?K:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function ly(e,t){return GA(e,XA(e.inspectionMode,ed,t))}function uy(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Ft(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?K:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function HA(e){if(!e.selectedFileTreePath)return e;let t=new Set(e.collapsedFileTreePaths);return t.has(e.selectedFileTreePath)?t.delete(e.selectedFileTreePath):t.add(e.selectedFileTreePath),{...e,collapsedFileTreePaths:[...t].sort((n,r)=>n.localeCompare(r)),actionMessage:null}}function cy(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Ft(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function YA(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return zA(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=e.diffScrollOffset+t,a=n.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let u=Ft(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let u=Ft(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}if(t>0&&o>i){let u=a[l+1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let u=a[l-1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Ft(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function zA(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Ft(e.diffScrollOffset+t,0,i),a=JA(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?E({state:e}):E({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function JA(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Uo(e,t,n,r){let s=n.indexOf(e[t]),i=Ft(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function Kd(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Ft(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function XA(e,t,n){let r=t.indexOf(e);return t[Ft(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function dy(e,t){return t.includes(e)}function QA(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Sr(e.activeTab)??e.preferredPtyTabKind}function ZA(e){return[e.selectedPtyTabId,e.openInspectionKind?K:null].filter(t=>typeof t=="string")}function Ft(e,t,n){return Math.min(n,Math.max(t,e))}var py=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>W(r.paths,e.selectedTaskId,i=>{let o=t??eE(i,e.activeTab,e.preferredPtyTabKind),a=hy(i,o,n??void 0,r.config);return{...i,ptyTabs:[...i.ptyTabs,a],selectedPtyTabId:a.id}}));return{updatedTask:s,nextShell:{activeTab:s.selectedPtyTabId??e.activeTab,selectedPtyTabId:s.selectedPtyTabId,preferredPtyTabKind:s.ptyTabs.at(-1)?.kind??e.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${s.ptyTabs.at(-1)?.title??"tab"}`}}},fy=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await W(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},my=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await W(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},gy=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await W(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=hy(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await W(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function eE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function hy(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(m=>m.id)),c=1,u=a;for(;l.has(u);)c+=1,u=`${a}-${c}`;let d=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:u,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:d,updatedAt:d}}var Cr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},yy=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=Rn();Sn(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",u=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Cr(c,u)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},wy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},ky=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await Nr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},Ty=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Nr(t.paths,n.id)))),xs=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await we.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var by=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var Ry=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Sy=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},Py=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var tE=250;function Lt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function jn(e,t){return _t(t,e.ptyRuntime.getViewState(Ar(e,t)))}function Ar(e,t){let n=Lt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function I(e,t){return jn(e,Ng(t,e.model))}function Iy(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:I(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function vy(e,t,n){return Iy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return Iy(e,t,{tone:"error",message:n})}function ie(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return we.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function ee(e,t){if(!e.uiStateFile)return;e.runtimeState=Ig(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>jt({uiStateFile:e.uiStateFile},n),()=>jt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function nE(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function oe(e){return{paths:e.paths,config:e.config,taskService:R,workspaceService:ke,queueTaskMutation:t=>nE(e,t)}}function Hd(e,t){let n=Lt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?Wd(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Ln(e.model),centerTabIds:$g(n,t),ptyTabIds:n?.ptyTabs.map(a=>a.id)??[],filePathIds:s?.filePaths??[],fileTreeRowIds:o.map(a=>a.path),fileTreeFileIds:o.filter(a=>a.kind==="file").map(a=>a.path),fileTreeDirectoryIds:o.filter(a=>a.kind==="directory").map(a=>a.path),diffPathIds:s?.diffPaths??[],diffPathRanges:[],fileLineCount:s?.selectedFile.lines.length??0,diffLineCount:s?.selectedDiff.lines.length??0,reviewRowCount:ty(t,n,s),pageRows:Math.max(5,Me(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function Cy(e,t){await my(t,oe(e))}async function Ie(e){e.model=await Pr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:I(e,e.state.shell)}:e.state={...e.state,shell:I(e,e.state.shell)}}function Er(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),t].sort((n,r)=>n.id.localeCompare(r.id))}}async function Wo(e,t){let n=++e.inspectionRefreshSequence,r=id(e.model.tasks,t),s=e.model.inspection,i=t.focusedRegion==="inspector"&&t.inspectionMode==="review"&&t.openInspectionKind!=="diff",o;if(r&&s?.taskId===r.id&&!i){let a={selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath},l=await dg(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Pr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},ee(e,e.state.shell),e.render())}function Ay(e,t){e.pendingLeftNavInspectionShell=t,!e.leftNavInspectionTimer&&(e.leftNavInspectionTimer=setTimeout(()=>{e.leftNavInspectionTimer=null;let n=e.pendingLeftNavInspectionShell;e.pendingLeftNavInspectionShell=null,!(!n||e.state.mode!=="main"||e.state.shell!==n)&&Wo(e,n).catch(r=>{let s=ie(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},tE))}function Ey(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=fn(e.state.shell,n,Hd(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render(),Wo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render()}},16)))}function Yd(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function zd(e){let t=e.model.tasks.flatMap(n=>n.ptyTabs.map(r=>r.id));await e.ptyRuntime.pruneStale?.(t),await e.ptyRuntime.hydrateSessions?.(t)}function $y(e){zd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Dy(e,t){let n=I(e,t),r=Lt(e.model.tasks,n),s=Ar(e,n);if(!r||!s||!r.ptyTabs.some(a=>a.id===s))return n;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return _t(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,dn(Me(e.activeTerminal.width,e.activeTerminal.height)));return _t({...n,inputMode:"control"},o)}function Jd(e){let t=e.state.mode==="main"&&e.state.shell.inputMode==="terminal"?"terminal":"control";t!==e.inputCaptureMode&&(e.inputCaptureMode=t,e.activeTerminal.grabInput(t==="terminal"?{mouse:"button"}:!0))}async function Xd(e,t){try{let n=I(e,t),r=Lt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await Oy(e,r),await Ie(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Oy(e,r),await Ie(e),s=r.selectedPtyTabId);let i=I(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:_t({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},ee(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,dn(Me(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(s),e.lastTerminalKey=null,e.state={mode:"main",shell:_t({...i,inputMode:"terminal"},o)},ee(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&un(t.selectedPtyTabId)&&(await rE(e,t.selectedTaskId,r).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:se(e,vg(I(e,t),r),r)},ee(e,e.state.shell)}e.render()}async function rE(e,t,n){await wy(t,n,oe(e))}async function Ny(e,t,n,r){let s=I(e,t),{nextShell:i}=await py(s,n,r,oe(e));return await Ie(e),I(e,{...s,...i})}async function xy(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await fy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Ie(e),I(e,{...n,...s})}async function _y(e,t){let n=I(e,t),r=Ln(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await ky(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Ie(e),I(e,{...n,...o,selectedLeftItemId:sE(r,Ln(e.model),s)})}async function Fy(e,t){let n=I(e,t),{nextShell:r}=await by(n,oe(e));return await Ie(e),I(e,{...n,...r})}async function Oy(e,t){return gy(t,oe(e))}function Bo(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:jn(e,e.state.shell)},e.render())},16))}function sE(e,t,n){if(t.length===0)return null;for(let r=n-1;r>=0;r-=1){let s=e[r];if(s&&t.includes(s))return s}return t[Math.min(Math.max(0,n),t.length-1)]??null}async function My(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Ly(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Ty(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Er(e,o);t.recordSuccess(i,Ly(e)),e.state={mode:"main",shell:I(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,xs("background PR polling",i,oe(e)))}}function Ly(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function jy(e,t){let n=I(e,t),r=Lt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await R.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Ie(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await R.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Ie(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${V(a)?.requiredChecks.length??0} reported`)}return I(e,{...vy(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import cE from"node:path";import{readdir as iE,stat as oE}from"node:fs/promises";import qy from"node:path";async function aE(e){let t=await iE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=qy.join(e,r.name);n.push({name:r.name,path:s,kind:await lE(s)?"repo":"directory"})}return n.sort((r,s)=>r.kind!==s.kind?r.kind==="repo"?-1:1:r.name.localeCompare(s.name)),{cwd:e,entries:n,selectedIndex:0,query:null,error:null}}function Uy(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Wy(e){let{spawn:t}=await import("node:child_process"),n=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";await new Promise((r,s)=>{let i=t(n,[e],{stdio:"ignore",detached:!0});i.unref(),i.on("error",s),i.on("spawn",r)})}async function Vo(e,t){let n=await aE(t);e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function lE(e){let t=qy.join(e,".git");return await oE(t).catch(()=>null)!==null}function By(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Vy(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function dE(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"";if(!t.selectedRepoId&&!t.selectedWorkspaceId){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:I(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let r=null;try{let s=await yy(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,Er(e,r);let i=I(e,{...e.state.shell,...s.nextShell,selectedLeftItemId:`task:${r.id}`,inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),o=await e.ptyRuntime.ensureSession(r.id,i.selectedPtyTabId??Xg(r,"agent"),dn(Me(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(i.selectedPtyTabId),e.state={mode:"main",shell:_t(i,o)},ee(e,e.state.shell)}catch(s){s instanceof Cr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof Cr)?(await W(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Ie(e).catch(()=>{})):r&&(await W(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function uE(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(at(t)){dE(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:I(e,{...n,selectedRunner:wo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Ag(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function pE(e,t){if(e.state.mode!=="main")return;let n=e.state.shell.workspaceBrowser;if(!n)return;if(t==="ESCAPE"){if(n.query!==null){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,query:"",selectedIndex:0}})},e.render();return}if(n.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=n.query.slice(0,-1);e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}if(n.query!==null&&t.length===1&&t>=" "){let s=n.query+t;e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=Uy(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){Vo(e,cE.dirname(n.cwd)).catch(s=>{let i=ie(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||at(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Vo(e,s.path).catch(o=>{let a=ie(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=oe(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Ie(e);let a=o.repos[0]??null,l=I(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},ee(e,e.state.shell),e.render()}).catch(o=>{let a=ie(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function fE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=xh(e.state.menuIndex,t);if(n.kind!=="noop"){if(n.kind==="render"){e.state={...e.state,menuIndex:n.menuIndex},e.render();return}if(n.kind==="back"){e.state.parentVariant&&(e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render());return}if(n.kind==="help"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell,viaOptions:!0,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="runners"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"runners",menuIndex:0,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="previews"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"previews",menuIndex:0,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="logs"){let r=e.state.parentVariant;mE(e,r)}}}async function mE(e,t){let n;try{n=await we.readLog(e.paths)}catch(r){let s=ie(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function gE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Fh(By(e),e.config,t,e.enabledRunnerIds);if(n.kind==="noop")return;if(n.kind==="back"){let s=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...s!==void 0?{parentVariant:s}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,runnerOptions:n.state},e.render();return}(n.kind==="save-enabled"?Ry(n.runner,n.enabled,oe(e)):Sy(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=ie(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:se(e,I(e,e.state.shell),i),runnerOptions:{...By(e),message:i}},e.render()})}function hE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=_h(Vy(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}Py(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,n.feature==="agentActivityIndicators"&&e.setAgentActivityEnabled(n.enabled),e.state={...e.state,previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=ie(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:se(e,I(e,e.state.shell),s),previewOptions:{...Vy(e),message:s}},e.render()})}}function Ky(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){uE(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){pE(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){wE(e),e.render();return}e.focusFlashUntil!==null&&(e.focusFlashUntil=null,e.focusFlashTimer&&(clearTimeout(e.focusFlashTimer),e.focusFlashTimer=null))}if(e.state.mode==="main"){let r=Gd(e.state.shell,n,Hd(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&at(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Es(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(yE(e,n))return;e.lastTerminalKey=Qg(n)?{key:n,at:Date.now()}:null;let i=Zg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Bo(e,i);return}e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:I(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Vo(e,e.workspaceRoot).catch(s=>{let i=ie(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:se(e,I(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Ny(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Xd(e,s)}).catch(s=>{let i=ie(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){xy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){jy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Lt(e.model.tasks,r.state),i=s?V(s)?.url??null:null;i?Wy(i).catch(o=>{let a=ie(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:se(e,I(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:se(e,I(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){_y(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Fy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Xd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ay(e,e.state.shell);return}Wo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:I(e,r.state)},Cy(e,e.state.shell).catch(()=>{}),ee(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){fE(e,n);return}if(e.state.variant==="runners"){gE(e,n);return}if(e.state.variant==="previews"){hE(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||at(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.optionsMessage){(n==="ESCAPE"||at(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(at(n)){if(e.state.menuIndex===0){let r=e.state.variant==="boot";e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),r?e.bootHydrationReady.then(()=>{if(e.state.mode!=="main")return;let s=e.state.shell;Dy(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},ee(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=ie(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:se(e,I(e,e.state.shell),o)},ee(e,e.state.shell),e.render()})}):$y(e);return}if(e.state.menuIndex===1){let r=e.state.variant==="boot"||e.state.variant==="pause"?e.state.variant:void 0;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}e.exit(0)}}function Gy(e,t){let n=sh(t);if(e.state.mode!=="main"||e.state.shell.inputMode!=="terminal"||n.length===0)return;if(e.pendingTerminalKeySequence){let i=`${e.pendingTerminalKeySequence.raw}${n}`,o=Es(i);if(o){Yy(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(yd(i)){e.pendingTerminalKeySequence.raw=i,Hy(e);return}Ko(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},ee(e,e.state.shell),e.render();return}let r=eh(n);if(r!==0){Bo(e,r);return}let s=Es(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
276
|
+
`);if(c===-1)return;let d=i.slice(0,c);a(),s.end();try{n(JSON.parse(d))}catch(u){r(u instanceof Error?u:new Error(String(u)))}}),s.once("close",()=>a())})}function kg(e){return new Promise((t,n)=>{let r=cg(e);r.once("connect",()=>t(r)),r.once("error",n)})}function DC(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function xn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
|
|
277
|
+
`)}catch{}}function NC(e){try{return process.kill(e,0),!0}catch{return!1}}function Tg(e){return new Promise(t=>setTimeout(t,e))}function _C(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Pu=["Runners","Feature Previews","Logs","Help"],Rg={agentActivityIndicators:"Agent activity indicators",agentOrchestration:"Agent orchestration"};function Iu(e,t){return z.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 Sg(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 Pg(e){return ze.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Rg[t]}`)}function Ig(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function vg(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Pu.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Mo(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Cg(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(ze.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!Mo(n))return{kind:"noop",state:e};let r=ze[e.menuIndex]??ze[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Rg[r]} ${s?"enabled":"disabled"}.`}}}function Ag(e,t,n,r){if(e.pathEdit)return xC({...e,pathEdit:e.pathEdit},t,n);let s=Iu(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=z[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!Mo(n))return{kind:"noop",state:e};let i=z[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 xC(e,t,n){if(n==="ESCAPE")return{kind:"render",state:bg({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Mo(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:bg({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return LC(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function bg(e){let t={...e};return delete t.pathEdit,t}function Mo(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
278
|
+
`}function LC(e){return e.length===1&&e>=" "&&e!==""}import As from"node:path";function Eg(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 Og="\u{F024B} ",$g="\u{F0DCF} ",Dg="\u25CB",vu="\uEA64",Ng="\uEAFE",_g="\uEBDA",Cu="\u25CB",Au="\u25CF",Eu="\u2713",Ou="\u2715";function xg(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 jo=150,Lg=6;var Uo="empty",fe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function qg(e,t,n){let r=jC(t,e),s=t.repos.find(y=>y.id===e.selectedRepoId)??t.repos[0]??null,i=r?t.tasks.filter(y=>y.workspaceId===r.id):t.tasks,o=r?.kind==="project"?i:s?i.filter(y=>y.repoId===s.id):[],a=o.find(y=>y.id===e.selectedTaskId)??o[0]??null,l=a?.type==="project",c=kA(t.tasks),d=WC(e,a),u=UC(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},m=t.inspection?.taskId===a?.id?t.inspection:null,h=s?.name??"no repo",f=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Rs(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":d===B?"\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:As.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${As.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:FC(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>TA(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:h,agent:f},centerTranscript:qC(d,e,s,a,e.workspaceBrowser,m,r),tabs:u,rightContext:wA(s,a),rightInspection:tA(e,a,m)}}function FC(e,t,n){let r=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if((t.furyApprovalCount??0)>0&&r.push({text:`\u25CF ${t.furyApprovalCount} Fury approval${t.furyApprovalCount===1?"":"s"} waiting`,indent:1,status:"pending"}),!t.workspaces)return MC(r,e,t.repos,t.tasks,n);let s=t.workspaces;if(s.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of s){let a=e.selectedLeftItemId===`workspace:${o.id}`;r.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:a,focused:a&&e.focusedRegion==="tasks"});let l=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],c=wo(t.tasks,o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:u}of Ts(c)){let p=e.selectedLeftItemId===`task:${d.id}`,m=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,h={id:`task:${d.id}`,taskId:d.id,text:n?m:`${p?"\u25B8":"\u2022"} ${m}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:Qn(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=Wg(d);f&&(h.prBadge=f),r.push(h)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function MC(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=ko(r,o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:p}of Ts(l)){let m=t.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:s?h:`${m?"\u25B8":"\u2022"} ${h}`,indent:p===0?2:4,selected:m,focused:m&&t.focusedRegion==="tasks",...s?{activity:Qn(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Wg(u);y&&(f.prBadge=y),e.push(f)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function jC(e,t){let n=e.workspaces??[];if(!e.workspaces)return null;let r=e.tasks.find(s=>s.id===t.selectedTaskId)??null;return r?n.find(s=>s.id===r.workspaceId)??null:t.selectedWorkspaceId?n.find(s=>s.id===t.selectedWorkspaceId)??null:n[0]??null}function qC(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let m=p===s.selectedIndex?"\u25B8":" ",h=u.kind==="repo"?" [git repo]":"/";return`${m} ${u.name}${h}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ct(["Browse for a workspace to register.",s.cwd,...d?[d]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return ct(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,d=l?"Project Task":"Task";return ct([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===B&&t.openInspectionKind==="file"?KC(r,i,t.fileScrollOffset):e===B&&t.openInspectionKind==="diff"?GC(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ct(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ct(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function UC(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:BC(o),...o.kind==="agent"&&r&&t?{activity:Kt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:Uo,label:"EMPTY",active:n===Uo,focused:e.focusedRegion==="center"&&n===Uo}];let i=e.openInspectionKind||n===B?[{id:B,label:VC(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function WC(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===B&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??B:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??B:Uo}function BC(e){return e.title.toUpperCase()}function VC(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?As.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function KC(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ct(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Ug(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:""},...HC(r.lines,n,s)]}function GC(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ct(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Ug(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:""},...YC(r.lines,n,s)]}function ct(e){return e.map(t=>({text:t}))}function HC(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:fe.lineNumber}},{text:" \u2502 ",style:{fg:fe.gutter}},...$u(i,n)],tone:"default"}})}function YC(e,t,n){let r=zC(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>JC(i,n))}function zC(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 JC(e,t){let n=Fg(e.oldNumber),r=Fg(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:fe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:fe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?QC($u(e.text,t),i.bg,i.fallbackFg):$u(e.text,t),l=i?{fg:fe.lineNumber,bg:i.bg}:{fg:fe.lineNumber},c=i?{fg:fe.gutter,bg:i.bg}:{fg:fe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Fg(e){return e===null?" ":String(e).padStart(4," ")}function Ug(e){let t=As.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 $u(e,t){return t==="diff"?XC(e):t==="markdown"?ZC(e):t==="json"?Du(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Du(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 XC(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:fe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:fe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:fe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:fe.diffMeta}}]:[{text:e}]}function QC(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function ZC(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:Du(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Du(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:eA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function eA(e){return e.startsWith("//")||e.startsWith("/*")?{fg:fe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:fe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:fe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:fe.markup}:{fg:fe.keyword}}function tA(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"?Bg(t.repoTargets??[]):s?.pullRequest??(t?W(t):null),o=[nA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Gg(e,t),l=Nu(e,n),c=aA([{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,...hA(e,n)]}:{title:"",rows:[...o,...Nu(e,n)]}}function nA(e,t){let n=e.inspectionMode,r=[{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let c=r[l];l>0&&s.push({text:" "});let d=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:d}})}let i=_u(t),o=xu(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Mg(e){return[{text:" "},_u(e),{text:" "},xu(e)]}function Wg(e){if(e.type==="project"&&e.repoTargets?.length){let n=Bg(e.repoTargets);return n?Mg(n):null}let t=W(e);return t?.number?Mg(t):null}function Bg(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=sA(n);return{number:-1,status:rA(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 rA(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 sA(e){let t=e.map(n=>Vg(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 _u(e){return!e||!e.number?{text:Dg,style:{fg:"565f89"}}:e.status==="merged"?{text:Ng,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:_g,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:vu,style:{fg:"565f89"}}:{text:vu,style:{fg:"9ece6a"}}}function xu(e){return e?.aggregateReadiness?jg(e.aggregateReadiness):jg(Vg(e))}function jg(e){return e==="failed"?{text:Ou,style:{fg:"f7768e"}}:e==="pending"?{text:Au,style:{fg:"e0af68"}}:e==="success"?{text:Eu,style:{fg:"9ece6a"}}:{text:Cu,style:{fg:"565f89"}}}function Vg(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")?Kg(e)?"failed":iA(e)?"success":"pending":"pending"}function iA(e){return!!(e.mergeable&&!e.draft&&!Kg(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Kg(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Gg(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return oA(e,t);let n=W(t),r=Yg("pr",t.branch,n??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(i=>i!==n&&(i.status==="merged"||i.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),r}var qo=32;function oA(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let o of r){let a=s===o.repoId,l=e.focusedRegion==="inspector"&&a,c=o.repoId.startsWith("repo_")?o.repoId.slice(5):o.repoId;if(o.status!=="ready"){let u=o.failureReason?o.failureReason.slice(0,14):o.status,p=qo-u.length-1,m=c.length>p?c.slice(0,p-1)+"\u2026":c,h=qo-m.length-u.length;n.push({id:`project-review:${o.repoId}`,text:m+" ".repeat(Math.max(1,h))+u,selected:a,focused:l,muted:!0})}else{let d=_u(o.pullRequest),u=xu(o.pullRequest),p=`${d.text} ${u.text}`,m=qo-p.length-1,h=c.length>m?c.slice(0,m-1)+"\u2026":c,f=qo-h.length-p.length,y=h+" ".repeat(Math.max(1,f));n.push({id:`project-review:${o.repoId}`,text:y+p,selected:a,focused:l,segments:[{text:y},{...d,text:d.text},{text:" "},{...u,text:u.text}]})}}let i=r.find(o=>o.repoId===s)??null;return i?.status==="ready"&&i.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...Yg("target",i.branch,i.pullRequest))),n}function Hg(e,t,n=null){return 3+Gg(e,t).length+Nu(e,n).length}function Yg(e,t,n){let r=u=>`${e}-${u}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],i=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${i} Open in GitHub \u2197`,segments:[{text:i},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:i});let o=n.baseBranch??"?",a=n.headBranch??t;s.push({id:r("pr-branches"),text:`${o} \u2192 ${a}`,muted:!0});let l=lA(n.reviewDecision,n.mergeStateStatus),c=l&&l!=="review approved"?"merge blocked":n.mergeable?"merge ready":n.mergeStateStatus?`merge ${n.mergeStateStatus}`:"merge unknown";l?s.push({id:r("pr-merge"),text:`${c} \xB7 ${l}`,muted:!0,segments:[{text:c},{text:" \xB7 "},{text:l,style:{fg:cA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${zg(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(uA)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let d=n.comments??[];return d.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${d.length})`}),s.push(...d.slice(-4).flatMap((u,p)=>dA(u,r(`comment:${p}`))))),s}function aA(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 lA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function cA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function zg(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 uA(e){let{icon:t,color:n}=fA(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," ")} ${mA(e.status)}`,color:n,muted:!1}}function dA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${zg(e.createdAt)}`:"",s=pA(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 pA(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 fA(e){switch(e){case"success":return{icon:Eu,color:"9ece6a"};case"pending":return{icon:Au,color:"e0af68"};case"failed":return{icon:Ou,color:"f7768e"};case"skipped":return{icon:Cu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function mA(e){return e==="success"?"passing":e==="failed"?"failing":e}function hA(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=Lu(t.fileRows,e.collapsedFileTreePaths),s=e.fileSearchQuery,i=s?r.filter(l=>l.path.toLowerCase().includes(s.toLowerCase())):r,o=s!==null?[{id:"file-search",text:`Search: ${s}\u2588`,muted:!1}]:[],a=e.selectedFileTreePath??t.selectedFilePath;return[...o,...i.map(l=>{let c=l.kind==="file"?n.get(l.path):void 0,d=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,u=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?Og:$g:Eg(l.label),p=l.kind==="directory"?"7aa2f7":xg(l.label),m=" ".repeat(l.depth),h=p?{text:u,style:{fg:p}}:{text:u},f=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:m},h,f];return{id:l.path,text:`${m}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function Lu(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 Nu(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(gA(t))return yA(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=>Jg(i,e,t))))}return n}function gA(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function yA(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=>Jg(c,e,t,s.length+1))))}}return n}function Jg(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 wA(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:As.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 kA(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function TA(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Xg(e,t,n,r,s=null){if(s)return bA(e,t,n,r,s);let i=su(e,t,{centerOnly:r});return RA(n,i)?{output:Do(i.rows,n.rows,i.row,i.column),region:i}:null}function bA(e,t,n,r,s){let i=Nh(e,t,s,{centerOnly:r});if(!i||!SA(n,i))return null;let o=n.rows.slice();return{output:i.rows.map(({index:l,row:c})=>o[l]===c?"":(o[l]=c,`\x1B[${i.row+l};${i.column}H${c}`)).join(""),region:{row:i.row,column:i.column,width:i.width,rows:o}}}function RA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function SA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Qg(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!PA(o,a))return null;!o||!a||(s+=Do(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function PA(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 IA=["tasks","center","inspector"];function vA(e,t,n){if(t==="ESCAPE")return A({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return A({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return Mu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return qu({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return A({state:{...e,fileSearchQuery:r},changed:!0})}return A({state:e})}function qu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return wh(t)?A({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):A({state:e});if(e.fileSearchQuery!==null)return vA(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return A({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return A({state:e,exit:!0});if(t==="ESCAPE")return A({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return A({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(To(e.selectedLeftItemId)||bo(e.selectedLeftItemId)))return A({state:{...e,selectedRunner:yo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Zg(e,1);if(t==="SHIFT_TAB"||t==="[")return Zg(e,-1);if(t==="z"||t==="Z")return A({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===B?pn(e,-1,n):Mu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===B?pn(e,1,n):Mu(e,1,n);if(t==="PAGE_UP")return pn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return pn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return pn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return pn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??z,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return A({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=_A(e,t);return A({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 A({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return A({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Rs(e.selectedLeftItemId)&&e.selectedTaskId)return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Ph(e.selectedLeftItemId)&&e.selectedWorkspaceId)return A({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&ny(e.activeTab,n.ptyTabIds??[]))return A({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Fu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return ey(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Fu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return ey(e,1)}if(at(t)){if(e.focusedRegion==="tasks"&&(To(e.selectedLeftItemId)||bo(e.selectedLeftItemId))){let r=Xc(e.selectedLeftItemId),s=Qc(e.selectedLeftItemId);return A({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 A({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Rs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return A({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:wr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&ny(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return A({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:wr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===B)return A({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 A({state:EA({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return A({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:B,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?A({state:{...e,selectedDiffPath:r,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?A({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):A({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?A({state:e}):e.selectedActionId==="refresh-checks"?A({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?A({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):A({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return A({state:e})}function pn(e,t,n){if(t===0)return A({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?ry(e,t,n):e.inspectionMode==="review"?ty(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):A({state:e});if(e.focusedRegion==="center"&&e.activeTab===B){if(e.openInspectionKind==="file")return ty(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return OA(e,t,n)}return A({state:e})}function Zg(e,t){return Wo(e,"focusedRegion",IA,t)}function Fu(e,t,n){let r=Wo(e,"activeTab",n&&n.length>0?n:xA(e),t);return!r.changed||Th(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:wr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Mu(e,t,n){if(e.focusedRegion==="tasks")return CA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Fu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return ry(e,t,n);if(n.projectTargetIds?.length){let s=ju(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=ju(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Wo(e,"selectedActionId",fh,t)}return Wo(e,"selectedActionId",Hc,t)}function CA(e,t,n){let r=ju(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Jc(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=Xc(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Qc(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function AA(e,t){if(e.inspectionMode===t)return A({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?B:e.activeTab;return A({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 ey(e,t){return AA(e,NA(e.inspectionMode,Yc,t))}function ry(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return A({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Ft(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return A({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return A({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?B:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function EA(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 ty(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Ft(e[t]+n,0,i);return o===e[t]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function OA(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return $A(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=e.diffScrollOffset+t,a=n.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let d=Ft(o,0,i);return d===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let d=Ft(o,0,i);return d===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?A({state:{...e,selectedDiffPath:d,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?A({state:e}):A({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?A({state:{...e,selectedDiffPath:d,activeTab:B,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?A({state:e}):A({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Ft(o,0,i);return c===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function $A(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Ft(e.diffScrollOffset+t,0,i),a=DA(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?A({state:e}):A({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function DA(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Wo(e,t,n,r){let s=n.indexOf(e[t]),i=Ft(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function ju(e,t,n,r,s=!1){if(n.length===0)return A({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Ft(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?A({state:e}):A({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function NA(e,t,n){let r=t.indexOf(e);return t[Ft(r+n,0,t.length-1)]??e}function A(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 ny(e,t){return t.includes(e)}function _A(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":wr(e.activeTab)??e.preferredPtyTabKind}function xA(e){return[e.selectedPtyTabId,e.openInspectionKind?B:null].filter(t=>typeof t=="string")}function Ft(e,t,n){return Math.min(n,Math.max(t,e))}var sy=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>V(r.paths,e.selectedTaskId,i=>{let o=t??LA(i,e.activeTab,e.preferredPtyTabKind),a=ly(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"}`}}},iy=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 V(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}`}}},oy=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await V(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},ay=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await V(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=ly(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await V(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 LA(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function ly(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(m=>m.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var Rr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},cy=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=ro();so(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Rr(c,d)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},uy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},dy=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 Cr(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}`}}},py=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Cr(t.paths,n.id)))),Es=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await de.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var fy=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var my=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},hy=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},gy=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var FA=250;function Mt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Ln(e,t){return Lt(t,e.ptyRuntime.getViewState(Sr(e,t)))}function Sr(e,t){let n=Mt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function I(e,t){return Ln(e,Ih(t,e.model))}function yy(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:I(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function wy(e,t,n){return yy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return yy(e,t,{tone:"error",message:n})}function ie(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return de.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=gh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>qt({uiStateFile:e.uiStateFile},n),()=>qt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function MA(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function oe(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:ke,queueTaskMutation:t=>MA(e,t)}}function Uu(e,t){let n=Mt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?Lu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:_n(e.model),centerTabIds:Rh(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:Hg(t,n,s),pageRows:Math.max(5,Fe(e.activeTerminal.width,e.activeTerminal.height).height-Q.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function ky(e,t){await oy(t,oe(e))}async function Re(e){e.model=await kr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:I(e,e.state.shell)}:e.state={...e.state,shell:I(e,e.state.shell)}}function Bo(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),t].sort((n,r)=>n.id.localeCompare(r.id))}}async function Vo(e,t){let n=++e.inspectionRefreshSequence,r=Zc(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 th(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await kr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},Z(e,e.state.shell),e.render())}function Ty(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)&&Vo(e,n).catch(r=>{let s=ie(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},FA))}function by(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=pn(e.state.shell,n,Uu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),e.render(),Vo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),e.render()}},16)))}function Wu(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Bu(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 Sy(e){Bu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Py(e,t){let n=I(e,t),r=Mt(e.model.tasks,n),s=Sr(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 Lt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));return Lt({...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 Ku(e,t){try{let n=I(e,t),r=Mt(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 Ry(e,r),await Re(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Ry(e,r),await Re(e),s=r.selectedPtyTabId);let i=I(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Lt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Lt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&un(t.selectedPtyTabId)&&(await jA(e,t.selectedTaskId,r).catch(()=>{}),await Re(e).catch(()=>{})),e.state={mode:"main",shell:se(e,yh(I(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function jA(e,t,n){await uy(t,n,oe(e))}async function Iy(e,t,n,r){let s=I(e,t),{nextShell:i}=await sy(s,n,r,oe(e));return await Re(e),I(e,{...s,...i})}async function vy(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await iy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Re(e),I(e,{...n,...s})}async function Cy(e,t){let n=I(e,t),r=_n(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await dy(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Re(e),I(e,{...n,...o,selectedLeftItemId:qA(r,_n(e.model),s)})}async function Ay(e,t){let n=I(e,t),{nextShell:r}=await fy(n,oe(e));return await Re(e),I(e,{...n,...r})}async function Ry(e,t){return ay(t,oe(e))}function Ko(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:Ln(e,e.state.shell)},e.render())},16))}function qA(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 Oy(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Ey(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await py(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Bo(e,o);t.recordSuccess(i,Ey(e)),e.state={mode:"main",shell:I(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,Es("background PR polling",i,oe(e)))}}function Ey(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function $y(e,t){let n=I(e,t),r=Mt(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 Re(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 Re(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${W(a)?.requiredChecks.length??0} reported`)}return I(e,{...wy(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import KA from"node:path";import{readdir as UA,stat as WA}from"node:fs/promises";import Dy from"node:path";async function BA(e){let t=await UA(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Dy.join(e,r.name);n.push({name:r.name,path:s,kind:await VA(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 Ny(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function _y(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 Go(e,t){let n=await BA(t);e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function VA(e){let t=Dy.join(e,".git");return await WA(t).catch(()=>null)!==null}function xy(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Ly(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function GA(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"";if(!t.selectedRepoId&&!t.selectedWorkspaceId){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:I(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let r=null;try{let s=await cy(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,await Re(e);let i=I(e,{...e.state.shell,...s.nextShell,selectedLeftItemId:`task:${r.id}`,inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),o=await e.ptyRuntime.ensureSession(r.id,i.selectedPtyTabId??Bh(r,"agent"),cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(i.selectedPtyTabId),e.state={mode:"main",shell:Lt(i,o)},Z(e,e.state.shell)}catch(s){s instanceof Rr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof Rr)?(await V(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Re(e).catch(()=>{})):r&&(await V(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Re(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function HA(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(at(t)){GA(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:I(e,{...n,selectedRunner:yo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}kh(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function YA(e,t){if(e.state.mode!=="main")return;let n=e.state.shell.workspaceBrowser;if(!n)return;if(t==="ESCAPE"){if(n.query!==null){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,query:"",selectedIndex:0}})},e.render();return}if(n.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=n.query.slice(0,-1);e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}if(n.query!==null&&t.length===1&&t>=" "){let s=n.query+t;e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=Ny(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){Go(e,KA.dirname(n.cwd)).catch(s=>{let i=ie(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||at(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Go(e,s.path).catch(o=>{let a=ie(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=oe(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Re(e);let a=o.repos[0]??null,l=I(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Z(e,e.state.shell),e.render()}).catch(o=>{let a=ie(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function zA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=vg(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;JA(e,r)}}}async function JA(e,t){let n;try{n=await de.readLog(e.paths)}catch(r){let s=ie(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function XA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Ag(xy(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"?my(n.runner,n.enabled,oe(e)):hy(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=ie(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:se(e,I(e,e.state.shell),i),runnerOptions:{...xy(e),message:i}},e.render()})}function QA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Cg(Ly(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}gy(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,n.feature==="agentActivityIndicators"&&e.setAgentActivityEnabled(n.enabled),e.state={...e.state,previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=ie(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:se(e,I(e,e.state.shell),s),previewOptions:{...Ly(e),message:s}},e.render()})}}function Fy(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){HA(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){YA(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){eE(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=qu(e.state.shell,n,Uu(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&at(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Is(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(ZA(e,n))return;e.lastTerminalKey=Vh(n)?{key:n,at:Date.now()}:null;let i=Kh(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Ko(e,i);return}e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:I(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Go(e,e.workspaceRoot).catch(s=>{let i=ie(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:se(e,I(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Iy(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Ku(e,s)}).catch(s=>{let i=ie(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){vy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){$y(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Mt(e.model.tasks,r.state),i=s?W(s)?.url??null:null;i?_y(i).catch(o=>{let a=ie(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:se(e,I(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:se(e,I(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){Cy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Ay(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Ku(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ty(e,e.state.shell);return}Vo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:I(e,r.state)},ky(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){zA(e,n);return}if(e.state.variant==="runners"){XA(e,n);return}if(e.state.variant==="previews"){QA(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||at(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.optionsMessage){(n==="ESCAPE"||at(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(at(n)){if(e.state.menuIndex===0){let r=e.state.variant==="boot";e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),r?e.bootHydrationReady.then(()=>{if(e.state.mode!=="main")return;let s=e.state.shell;Py(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},Z(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=ie(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:se(e,I(e,e.state.shell),o)},Z(e,e.state.shell),e.render()})}):Sy(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 My(e,t){let n=Jh(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=Is(i);if(o){qy(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(du(i)){e.pendingTerminalKeySequence.raw=i,jy(e);return}Ho(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Z(e,e.state.shell),e.render();return}let r=Gh(n);if(r!==0){Ko(e,r);return}let s=Is(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
280
279
|
`&&n!==`\r
|
|
281
|
-
`&&(e.suppressTerminalEnterOnAttach=!1),
|
|
282
|
-
`),1}return
|
|
280
|
+
`&&(e.suppressTerminalEnterOnAttach=!1),zh(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function ZA(e,t){if(e.pendingTerminalKeySequence){let n=Hh(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Is(r);if(s)return qy(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(du(r))return e.pendingTerminalKeySequence.raw=r,jy(e),!0}return Ho(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Ho(e),30)},!0)}function jy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Ho(e),30))}function Ho(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function qy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Uy(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){by(e,uu(t));return}let n=uu(t);n!==0&&Ko(e,n)}function eE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var Wy=1e3,nE=tE(import.meta.url),rE=nE("terminal-kit"),sE=rE.terminal;function Gu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function By(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Vy(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function iE(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 Ky(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=ve(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Mn({uiStateFile:e.uiStateFile}):null,o=await kr(t,void 0,s),a=bs(hh(i,r),o);o=await kr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:h=>c(h),onActivity:h=>d(h),onActivityRemoved:h=>u(h),resolveSessionSpec:(h,f)=>Wh(l.current,f,t)},m=e.ptyRuntime??await dg({...p,paths:n,activityEnabled:k.previews.isEnabled(r,"agentActivityIndicators")});return new Promise(h=>{let f=e.terminal??sE,y=null,T=null,R=null,b=null,O=null,$=0,D=!1,x=new Map,v=m.managesPullRequestSync?null:new br({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,ge=new dn({resolutionMs:k.previews.isEnabled(r,"agentActivityIndicators")?jo:Wy,onError:(C,Y)=>Es(`heartbeat job "${C}"`,Y,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:bs(a,o)},get model(){return l.current},set model(C){l.current=C},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:f,ptyRuntime:m,resolve:h,render:()=>{},renderTaskNavigation:()=>!1,exit:C=>h(C),setAgentActivityEnabled:C=>{ge.setResolutionMs(C?jo:Wy),w.ptyRuntime.setActivityEnabled?.(C)}},w.setAgentActivityEnabled(k.previews.isEnabled(r,"agentActivityIndicators")),c=C=>{w.state.mode==="main"&&(O=iE(O,C),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let Y=O;if(O=null,w.state.mode==="main"){let ue=Ln(w,w.state.shell);if(w.state={mode:"main",shell:ue},!b||!T){w.render();return}let Me=Fe(f.width,f.height),Se={...b,terminal:ue.terminal},jt=Xg(Me,Se,T,ue.centerZoomed,Y?.kind==="rows"?Y.rowIndices:null);if(!jt){w.render();return}jt.output.length>0&&f.noFormat(jt.output),b=Se,T=jt.region,R&&(R={...R,center:jt.region}),y=null,f.hideCursor(!0)}},0)))},d=C=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&un(C.tabId)&&x.get(C.tabId)!==Ct(C.tabId,[C],Date.now())&&w.render()},u=C=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&un(C)&&x.get(C)!=="idle"&&w.render()};let ye=Promise.resolve(),H=C=>{ye=ye.then(async()=>{let Y=await Promise.all([...new Set(C)].map(ue=>S.getTask(w.paths,ue)));for(let ue of Y)Bo(w,ue);w.state.mode==="main"?w.state={mode:"main",shell:I(w,w.state.shell)}:w.state={...w.state,shell:I(w,w.state.shell)},w.render()}).catch(Y=>Es("daemon task-state refresh",Y,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(H);let fn=C=>{let Y=Fe(f.width,f.height),ue=k.previews.isEnabled(w.config,"agentActivityIndicators"),Me=ue?w.ptyRuntime.getActivitySnapshots?.()??[]:[],Se=Date.now(),jt=qg(I(w,C.shell),w.model,ue?{snapshots:Me,now:Se,animationFrame:$}:void 0);if(x.clear(),ue)for(let zy of w.model.tasks)for(let Yo of zy.ptyTabs)Yo.kind==="agent"&&x.set(Yo.id,Ct(Yo.id,Me,Se));let Yy=Dh(Y,jt,{centerOnly:C.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:jt,presentation:Yy}},Os=(C,Y,ue,Me)=>{if(!R)return!1;let Se=Qg(R,Y.regions,ue);return Se?(Se.output.length>0&&f.noFormat(Se.output),b=C,R=Se.regions,T=Se.regions.center,y=Me?Y.frame:null,f.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Vu(w),w.ptyRuntime.setPullRequestPollView?.(Vy(w.state)),w.ptyRuntime.setViewedTab?.(Sr(w,w.state.shell));let{data:C,presentation:Y}=fn(w.state);return Os(C,Y,["rail","left","center","footer"],!1)},w.render=()=>{Vu(w);let C=w.state;w.ptyRuntime.setPullRequestPollView?.(Vy(C)),w.ptyRuntime.setViewedTab?.(C.mode==="main"?Sr(w,C.shell):null);let Y=Fe(f.width,f.height),ue,Me=null;if(C.mode==="main"){let Se=fn(C);if(Me=Se.presentation,ue=Me.frame,!w.pendingClear&&Os(Se.data,Me,["rail","left","center","right","footer"],!0))return;b=Se.data,T=Me.center}else ue=C.variant==="boot"?Ah(Y,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="pause"?Eh(Y,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="options"?Eo(Y,{menuIndex:C.menuIndex,optionsMenuItems:Pu}):C.variant==="runners"?Eo(Y,{menuIndex:Gu(C).menuIndex,optionsMenuItems:Iu(w.config,Gu(C)),optionsMessage:Sg(Gu(C)),optionsSubtitle:"Runners"}):C.variant==="previews"?Eo(Y,{menuIndex:By(C).menuIndex,optionsMenuItems:Pg(w.config),optionsMessage:Ig(By(C)),optionsSubtitle:"Feature Previews - Experimental"}):C.variant==="logs"?$h(Y,{logPath:C.log?.path??n.logFile,logLines:C.log?.lines??[]}):Oh(Y),b=null,T=null,R=null;w.pendingClear&&(f.moveTo(1,1),f.eraseDisplayBelow(),w.pendingClear=!1,y=null),f.noFormat(Xh(ue,y)),y=ue,R=Me?.regions??null,f.hideCursor(!0)};let $s=C=>Fy(w,C),Hu=C=>My(w,C),Yu=C=>Uy(w,C),Hy=()=>{process.stdout.off("resize",zu),process.off("SIGCONT",Ju),f.removeListener("key",$s),f.removeListener("unknown",Hu),f.removeListener("mouse",Yu),w.scrollRenderTimer&&(clearTimeout(w.scrollRenderTimer),w.scrollRenderTimer=null),w.inspectionScrollRenderTimer&&(clearTimeout(w.inspectionScrollRenderTimer),w.inspectionScrollRenderTimer=null),w.leftNavInspectionTimer&&(clearTimeout(w.leftNavInspectionTimer),w.leftNavInspectionTimer=null),w.pendingTerminalKeySequence&&(clearTimeout(w.pendingTerminalKeySequence.timer),w.pendingTerminalKeySequence=null),w.ptyRenderTimer&&(clearTimeout(w.ptyRenderTimer),w.ptyRenderTimer=null),w.footerToastTimer&&(clearTimeout(w.footerToastTimer),w.footerToastTimer=null),w.focusFlashTimer&&(clearTimeout(w.focusFlashTimer),w.focusFlashTimer=null),ge.stop(),w.ptyRuntime.disposeAll(),f.grabInput(!1),f.hideCursor(!1),f.fullscreen(!1)};w.exit=C=>{Hy(),h(C)};let zu=()=>{Wu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(cn(Fe(f.width,f.height))),w.state={mode:"main",shell:Ln(w,w.state.shell)}),w.render()},Ju=()=>{Wu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(cn(Fe(f.width,f.height))),w.state={mode:"main",shell:Ln(w,w.state.shell)}),w.render()};process.stdout.on("resize",zu),process.on("SIGCONT",Ju),f.grabInput(!0),w.inputCaptureMode="control",f.hideCursor(!0),f.fullscreen(!0),f.on("key",$s),f.on("unknown",Hu),f.on("mouse",Yu),v&&ge.register({id:"github.pull-requests",intervalMs:1e3,run:C=>Oy(w,v,C)}),ge.register({id:"agent.activity-indicators",intervalMs:jo,run:()=>{if(!k.previews.isEnabled(w.config,"agentActivityIndicators")){$=0,D=!1;return}let C=Date.now(),Y=ii(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],C);(Y||D)&&($=($+1)%Lg,w.state.mode==="main"&&w.render()),D=Y}}),ge.start(),k.version.checkForUpdate().then(C=>{C.updateAvailable&&C.latest&&(w.updateText=`Update available: v${C.latest}`,w.render())}),w.bootHydrationReady=Bu(w).catch(()=>{}),w.render()})}async function aE(){try{if(process.argv[2]==="__craig-daemon"){let e=await Gy(process.argv[3]??process.cwd()),t=ve(e);return await pg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Gy(process.argv[3]??process.cwd()),t=ve(e);return await fg(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
281
|
+
`),1}return Qm({argv:process.argv.slice(2),cwd:process.cwd(),env:process.env,isInputTty:process.stdin.isTTY===!0,isOutputTty:process.stdout.isTTY===!0,writeStdout:e=>process.stdout.write(e),writeStderr:e=>process.stderr.write(e),readStdin:async()=>{let e="";process.stdin.setEncoding("utf8");for await(let t of process.stdin)e+=t;return e},runInteractive:e=>Ky({uiStateFile:ve(e).uiStateFile,workspaceRoot:e})})}async function Gy(e){return oE(e)}var lE=await aE();process.exit(lE);
|