craig-cli 0.17.5 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +148 -143
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`;await i.writeFile(o,"utf8"),await i.sync(),await i.close(),await
|
|
4
|
-
`)};var
|
|
5
|
-
`,"utf8")},
|
|
6
|
-
`).filter(i=>i.length>0).map(zw);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Xw(n))return{path:e.logFile,lines:[],empty:!0};throw n}},ya=async(e,t)=>Vs(e,{level:"error",component:"application",event:Jw(t.context),message:t.message,...t.details?{details:t.details}:{}}),xd=async(e,t)=>{try{await ya(e,t)}catch{}},Ld=Ks,Fd=async(e,t=Dd)=>Ks(e,t);function zw(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 Jw(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Xw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var de={appendErrorLog:ya,appendErrorLogBestEffort:xd,appendLog:Vs,appendLogBestEffort:_d,readLog:Ks,readErrorLog:Ld,readRecentErrorLines:Fd};function Ud(e){let{commandTokens:t,options:n,help:r}=Zw(e);if(r)return jd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Er(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:wa(o,"Repo path")};break;case"repo:list":Er(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:X(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:wa(o,"Workspace path")};break;case"workspace:list":a=ek(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"file:open":a={kind:"openFile",path:X(o,"File path")};break;case"task:new":a=nk(o);break;case"task:create-child":a=rk(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=tk(o);break;case"task:current":Er(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:wa(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:X(o,"Task id")};break;case"task:pr":a=sk(o);break;case"task:repo":if(o[0]!=="add")throw S(`Unsupported task repo command: ${o.join(" ")}`);Hs(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:Gs(o,1,"Task id"),repoId:Gs(o,2,"Repo id")};break;case"task:wait":a=dk(o);break;case"agent:list":Er(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=ak(o);break;case"agent:send":a=lk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:X(o,"Command id")};break;case"command:list":Er(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:X(o,"Command id")};break;case"command:wait":a=ck(o);break;case"events:list":a=Md(o,!1);break;case"events:watch":a=Md(o,!0);break;case"fury:validate":a={kind:"validateFury",file:X(o,"Fury file")};break;case"fury:plan":a=pk(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=fk(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=mk(o);break;case"fury:reviews":a=hk(o);break;case"fury:review":a=gk(o);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: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:Gs(o,0,"Task id"),repoId:Gs(o,1,"Repo id")},Hs(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 S(`Unsupported command: ${t.join(" ")}`)}return jd(a,n)}function Wd(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 Qw(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",renameTask:"task.rename",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.add",addTaskRepoTarget:"task.repo.add",listTaskLinks:"link.list",openFile:"file.open",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function ka(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig file open <path> Open a readable file in the active Craig TUI (preview)"," craig task new --repo <repo-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude|pi] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task rename <name> Rename the resolved task without changing its ID or worktree"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task repo add <task-id> <repo-id> Provision a repo target in an existing project task"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add contextual repo linkage only (does not provision a target)"," craig link list <task-id> List linked repos for a task"].join(`
|
|
7
|
-
`)}function Zw(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||!qd(l)){n.push(l);continue}if(s.has(l))throw S(`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==="--"||qd(c))throw S(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=F(c,"Workspace root"):r.taskId=F(c,"Task id")}return{commandTokens:n,options:r,help:i}}function ek(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw S(`Unsupported command: workspace list ${e.join(" ")}`)}function tk(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:F(e[1],"Repo id")};throw S(`Unsupported command: task list ${e.join(" ")}`)}function nk(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 S(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw S(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw S("Task option --repo may only be provided once.");t=F(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw S("Task option --workspace may only be provided once.");n=F(c,"Workspace id")}else{if(r!==void 0)throw S("Task option --runner may only be provided once.");try{r=T.runners.parse(c)}catch(d){throw S(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw S("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw S("Task creation accepts either '--repo' or '--workspace', not both.");let o=F(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function rk(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 S(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw S(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw S("Task option --parent may only be provided once.");t=F(d,"Parent task id")}else if(c==="--repo"){if(n)throw S("Task option --repo may only be provided once.");n=F(d,"Repo id")}else if(c==="--workspace"){if(r)throw S("Task option --workspace may only be provided once.");r=F(d,"Workspace id")}else if(c==="--runner"){if(s)throw S("Task option --runner may only be provided once.");try{s=T.runners.parse(d)}catch(u){throw S(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw S("Task option --idempotency-key may only be provided once.");i=F(d,"Idempotency key")}}if(n&&r)throw S("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:F(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function sk(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw S(`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 S(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw S(`task pr ${t} accepts at most one task id.`);r=F(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw S(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw S("Task PR option --repo may only be provided once.");s=F(c,"Repo id")}else{if(i!==void 0)throw S("Task PR option --pr may only be provided once.");i=F(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw S(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw S(`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 S(`Unsupported command: task pr ${e.join(" ")}`)}}var Ta=300*1e3,ik=new Set(["idle","working","ready","error"]),ok=new Set(["queued","delivering","delivered","failed","cancelled"]);function ak(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:F(e[1],"Agent tab id")};throw S(`Unsupported command: agent status ${e.join(" ")}`)}function lk(e){let t,n,r="when-ready",s=Ta,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 S(`Unsupported agent send option: ${l}`);if(o.has(l))throw S(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw S("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw S(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw S("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:F(c,"Prompt")}:{source:"file",path:F(c,"Prompt file")}}else if(l==="--tab")n=F(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw S('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=Ra(c):i=F(c,"Idempotency key")}if(!t)throw S("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function ck(e){let t=F(e[0]??"","Command id"),n,r=Ta,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw S(`Unsupported command wait option: ${o}`);if(s.has(o))throw S(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw S(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=uk(a):r=Ra(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function uk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!ok.has(n)))throw S(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Md(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 S(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw S("--format is supported only by events watch.");if(i.has(l))throw S(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw S(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=F(c,"Event type glob");else if(l==="--after")r=F(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw S('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 dk(e){let t,n,r,s=Ta,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 S(`Unsupported task wait option: ${a}`);if(t!==void 0)throw S("task wait accepts at most one task id.");t=F(a,"Task id");continue}if(i.has(a))throw S(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw S(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=yk(l):a==="--tab"?r=F(l,"Agent tab id"):s=Ra(l)}if(!n)throw S("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function pk(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 S(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw S("fury plan accepts exactly one definition file.");t=F(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw S(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw S("Fury plan option --root-task may only be provided once.");n=F(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw S(`Invalid fury input "${o}". Use key=value.`);let l=F(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw S(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw S("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function fk(e){let t=F(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 S("fury watch supports --after and --format jsonl.");if(i==="--after")n=F(o,"Event cursor");else if(o==="jsonl")r=o;else throw S("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function mk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw S("fury step requires complete or fail.");let n=ba(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=F(n.get("--run")??"","Fury run id"),s=F(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw S("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:F(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw S("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw S("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 hk(e){if(e[0]!=="list")throw S("fury reviews requires list.");let t=ba(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 S(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function gk(e){let t=e[0],n=F(e[1]??"","Fury review id");if(t==="show")return Hs(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw S("Unsupported fury review action.");let r=ba(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 S(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function ba(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 S(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw S(`Option ${s} requires a value.`);n.set(s,F(i,s))}return n}function yk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!ik.has(n)))throw S(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Ra(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw S(`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 S(`Duration "${e}" is too large.`);return s}function jd(e,t){return{mode:"command",command:e,commandName:Qw(e),options:t}}function qd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Er(e,t){Hs(e,0,t)}function Hs(e,t,n){if(e.length!==t)throw S(`Command ${n} received an unexpected number of arguments.`)}function X(e,t){if(e.length!==1)throw S(`${t} is required and must be provided once.`);return F(e[0],t)}function wa(e,t){return F(e.join(" "),t)}function Gs(e,t,n){return F(e[t]??"",n)}function F(e,t){let n=e.trim();if(n.length===0)throw S(`${t} cannot be empty.`);return n}function S(e){return new g("CLI_USAGE",`${e}
|
|
2
|
+
var Yw=Object.defineProperty;var qs=(e,t)=>{for(var n in t)Yw(e,n,{get:t[n],enumerable:!0})};import{realpath as y0}from"node:fs/promises";import ke from"node:path";function Ee(e){let t=ke.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:ke.join(t,"index.json"),reposDir:ke.join(t,"repos"),workspacesDir:ke.join(t,"workspaces"),runtimeDir:ke.join(t,"runtime"),uiStateFile:ke.join(t,"runtime","ui-state.json"),tasksDir:ke.join(t,"tasks"),jobsDir:ke.join(t,"jobs"),commandsDir:ke.join(t,"commands"),eventsDir:ke.join(t,"events"),orchestrationDir:ke.join(t,"orchestration"),logsDir:ke.join(t,"logs"),logFile:ke.join(t,"logs","craig.jsonl"),artifactsDir:ke.join(t,"artifacts"),worktreesDir:ke.join(t,"worktrees"),configFile:ke.join(t,"config.json")}}import pu from"node:path";import{readFile as iv}from"node:fs/promises";import{readFile as nk}from"node:fs/promises";import{randomUUID as zw}from"node:crypto";import{chmod as Jw,open as Xw,readFile as Qw,rename as Zw,rm as ek}from"node:fs/promises";import ma from"node:path";async function B(e,t,n={}){let r=ma.dirname(e),s=ma.join(r,`.${ma.basename(e)}.${process.pid}.${Date.now()}.${zw()}.tmp`),i=await Xw(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 Zw(s,e),n.mode!==void 0&&await Jw(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await ek(s,{force:!0}).catch(()=>{}),o}}async function Us(e){try{let t=await Qw(e,"utf8");return JSON.parse(t)}catch(t){if(tk(t))return null;throw t}}function tk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Bn(e){try{let t=await nk(e.uiStateFile,"utf8"),n=JSON.parse(t);return rk(n,e.uiStateFile)}catch(t){if(sk(t))return null;throw t}}async function ht(e,t){await B(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Ws(){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 rk(e,t){if(typeof e!="object"||e===null||e.version!==1||!(e.selectedRepoId===null||typeof e.selectedRepoId=="string")||!(e.selectedWorkspaceId===null||typeof e.selectedWorkspaceId=="string")||!(e.selectedTaskId===null||typeof e.selectedTaskId=="string")||!(e.selectedPtyTabId===void 0||e.selectedPtyTabId===null||typeof e.selectedPtyTabId=="string")||!yn(e,"inputMode")||!yn(e,"focusedRegion")||!yn(e,"activeTab")||!yn(e,"inspectorSection")||!yn(e,"inspectionMode")||!Bs(e,"openInspectionKind")||!Bs(e,"selectedFileTreePath")||!Bs(e,"selectedFilePath")||!Bs(e,"selectedDiffPath")||!Sd(e,"collapsedFileTreePaths")||!yn(e,"ignoredUpdateVersion")||!Sd(e,"seenPreviewIds")||!yn(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 yn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Bs(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Sd(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function sk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var ha={};qs(ha,{RUNNER_IDS:()=>ue,STABLE_RUNNER_IDS:()=>gt,assertEnabled:()=>Cd,buildCommand:()=>Od,getConfiguredProfile:()=>Vs,getDefault:()=>vd,getDisplayName:()=>Ed,getEnabled:()=>Ks,getProfile:()=>Wn,isRunnerType:()=>Gs,parse:()=>Ad,setRunnerEnabled:()=>$d,setRunnerPath:()=>Nd});var gt=["codex","cursor","claude"],ue=[...gt,"pi"];var Id={codex:{id:"codex",displayName:"Codex",executable:"codex",defaultAgentTitle:"Codex"},cursor:{id:"cursor",displayName:"Cursor",executable:"cursor-agent",defaultAgentTitle:"Cursor"},claude:{id:"claude",displayName:"Claude",executable:"claude",defaultAgentTitle:"Claude"},pi:{id:"pi",displayName:"Pi",executable:"pi",defaultAgentTitle:"Pi"}};var Wn=e=>Id[e];var Vs=(e,t={})=>{let n=Wn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Ks=(e={})=>ue.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var vd=(e={})=>{let t=Ks(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 Cd=(e,t={})=>{if(e==="pi"&&t.previews?.piRunner!==!0)throw new Error('Runner "pi" is experimental. Enable the piRunner feature preview in .craig/config.json.');if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Gs=e=>ue.includes(e);var Ad=e=>{if(!e||e.length===0)return"codex";if(!Gs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${ue.join(", ")}.`);return e};var Ed=e=>Wn(e).displayName;var Od=(e,t,n={})=>{let r=[Vs(e,n).executable];return t&&t.length>0&&r.push(t),r};var $d=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var Nd=(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 ga={};qs(ga,{PREVIEW_FEATURE_IDS:()=>De,isEnabled:()=>Dd,setEnabled:()=>_d});var De=["agentOrchestration","piRunner","fileOpen","panelPolish"];function Dd(e,t){return e.previews?.[t]===!0}function _d(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as ik,readFile as ok,writeFile as ak}from"node:fs/promises";import lk from"node:path";var ck=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",xd=async e=>{try{return await ok(e,"utf8")}catch(t){if(ck(t))return null;throw t}},Fd=async(e,t)=>{await ik(lk.dirname(e),{recursive:!0}),await ak(e,t,"utf8")};var uk=["incrementalCenterPane","agentActivityIndicators"],Hs=(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(!ue.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${ue.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(!uk.includes(r)&&!De.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${De.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var ya=async(e,t={readConfigFile:xd})=>{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 Hs(r,e.configFile)};var wa=async(e,t,n={writeConfigFile:Fd})=>{Hs(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`)};var Ta={};qs(Ta,{checkForUpdate:()=>Md,getCurrent:()=>Ys,isNewer:()=>ka});var Ys=()=>{try{return"0.18.0"}catch{return"unknown"}};var dk="https://registry.npmjs.org/craig-cli/latest",pk=3600*1e3,fk={value:null},Ld=/^\d+\.\d+\.\d+$/,ka=(e,t)=>{if(!Ld.test(e)||!Ld.test(t))return!1;let n=c=>c.split(".").map(Number),[r=0,s=0,i=0]=n(e),[o=0,a=0,l=0]=n(t);return r!==o?r>o:s!==a?s>a:i>l},Md=async(e={fetch:globalThis.fetch,getCurrent:Ys,cache:fk})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<pk)return e.cache.value.result;let r=null;try{let i=await e.fetch(dk,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&ka(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:ya,save:wa,previews:ga,runners:ha,version:Ta};var jd={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=jd[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function ba(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as mk,mkdir as hk,readFile as gk}from"node:fs/promises";import yk from"node:path";var qd=80,zs=async(e,t)=>{await hk(yk.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await mk(e.logFile,`${JSON.stringify(n)}
|
|
5
|
+
`,"utf8")},Ud=async(e,t)=>{try{await zs(e,t)}catch{}},Js=async(e,t=qd)=>{try{let s=(await gk(e.logFile,"utf8")).trimEnd().split(`
|
|
6
|
+
`).filter(i=>i.length>0).map(wk);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Tk(n))return{path:e.logFile,lines:[],empty:!0};throw n}},Ra=async(e,t)=>zs(e,{level:"error",component:"application",event:kk(t.context),message:t.message,...t.details?{details:t.details}:{}}),Bd=async(e,t)=>{try{await Ra(e,t)}catch{}},Wd=Js,Vd=async(e,t=qd)=>Js(e,t);function wk(e){try{let t=JSON.parse(e);if(!t.timestamp||!t.level||!t.component||!t.event||!t.message)return e;let n=[t.taskId,t.tabId].filter(Boolean).join("/");return`[${t.timestamp}] ${t.level.toUpperCase().padEnd(5)} ${t.component}.${t.event}${n?` ${n}`:""} \u2014 ${t.message}`}catch{return e}}function kk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Tk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var de={appendErrorLog:Ra,appendErrorLogBestEffort:Bd,appendLog:zs,appendLogBestEffort:Ud,readLog:Js,readErrorLog:Wd,readRecentErrorLines:Vd};function Yd(e){let{commandTokens:t,options:n,help:r}=Rk(e);if(r)return Gd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":_r(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Pa(o,"Repo path")};break;case"repo:list":_r(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:Z(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Pa(o,"Workspace path")};break;case"workspace:list":a=Pk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:Z(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:Z(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:Z(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:Z(o,"File path")};break;case"task:new":a=Ik(o);break;case"task:create-child":a=vk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:Z(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:Z(o,"Task id")}};break;case"task:list":a=Sk(o);break;case"task:current":_r(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Pa(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:Z(o,"Task id")};break;case"task:pr":a=Ck(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);Qs(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:Xs(o,1,"Task id"),repoId:Xs(o,2,"Repo id")};break;case"task:wait":a=_k(o);break;case"agent:list":_r(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Ok(o);break;case"agent:send":a=$k(o);break;case"command:show":a={kind:"showPromptCommand",commandId:Z(o,"Command id")};break;case"command:list":_r(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:Z(o,"Command id")};break;case"command:wait":a=Nk(o);break;case"events:list":a=Kd(o,!1);break;case"events:watch":a=Kd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:Z(o,"Fury file")};break;case"fury:plan":a=xk(o);break;case"fury:approve":a={kind:"approveFury",planId:Z(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:Z(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:Z(o,"Fury run id")};break;case"fury:watch":a=Fk(o);break;case"fury:cancel":a={kind:"cancelFury",runId:Z(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:Z(o,"Fury run id")};break;case"fury:step":a=Lk(o);break;case"fury:reviews":a=Mk(o);break;case"fury:review":a=jk(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:Z(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:Z(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:Z(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:Z(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:Z(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Xs(o,0,"Task id"),repoId:Xs(o,1,"Repo id")},Qs(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:Z(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return Gd(a,n)}function zd(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 bk(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",renameTask:"task.rename",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.add",addTaskRepoTarget:"task.repo.add",listTaskLinks:"link.list",openFile:"file.open",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function Sa(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig file open <path> Open a readable file in the active Craig TUI (preview)"," craig task new --repo <repo-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude|pi] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task rename <name> Rename the resolved task without changing its ID or worktree"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task repo add <task-id> <repo-id> Provision a repo target in an existing project task"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add contextual repo linkage only (does not provision a target)"," craig link list <task-id> List linked repos for a task"].join(`
|
|
7
|
+
`)}function Rk(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||!Hd(l)){n.push(l);continue}if(s.has(l))throw I(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||Hd(c))throw I(`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 Pk(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw I(`Unsupported command: workspace list ${e.join(" ")}`)}function Sk(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 I(`Unsupported command: task list ${e.join(" ")}`)}function Ik(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw I(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw I(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw I("Task option --repo may only be provided once.");t=L(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw I("Task option --workspace may only be provided once.");n=L(c,"Workspace id")}else{if(r!==void 0)throw I("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw I(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw I("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw I("Task creation accepts either '--repo' or '--workspace', not both.");let o=L(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function vk(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw I(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw I(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw I("Task option --parent may only be provided once.");t=L(d,"Parent task id")}else if(c==="--repo"){if(n)throw I("Task option --repo may only be provided once.");n=L(d,"Repo id")}else if(c==="--workspace"){if(r)throw I("Task option --workspace may only be provided once.");r=L(d,"Workspace id")}else if(c==="--runner"){if(s)throw I("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw I(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw I("Task option --idempotency-key may only be provided once.");i=L(d,"Idempotency key")}}if(n&&r)throw I("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:L(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function Ck(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw I(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw I(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw I(`task pr ${t} accepts at most one task id.`);r=L(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw I(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw I("Task PR option --repo may only be provided once.");s=L(c,"Repo id")}else{if(i!==void 0)throw I("Task PR option --pr may only be provided once.");i=L(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw I(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw I(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw I(`Unsupported command: task pr ${e.join(" ")}`)}}var Ia=300*1e3,Ak=new Set(["idle","working","ready","error"]),Ek=new Set(["queued","delivering","delivered","failed","cancelled"]);function Ok(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 I(`Unsupported command: agent status ${e.join(" ")}`)}function $k(e){let t,n,r="when-ready",s=Ia,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw I(`Unsupported agent send option: ${l}`);if(o.has(l))throw I(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw I("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw I("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text: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 I('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=Ca(c):i=L(c,"Idempotency key")}if(!t)throw I("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Nk(e){let t=L(e[0]??"","Command id"),n,r=Ia,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw I(`Unsupported command wait option: ${o}`);if(s.has(o))throw I(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw I(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Dk(a):r=Ca(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Dk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Ek.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Kd(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw I(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw I("--format is supported only by events watch.");if(i.has(l))throw I(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=L(c,"Event type glob");else if(l==="--after")r=L(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw I('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function _k(e){let t,n,r,s=Ia,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw I(`Unsupported task wait option: ${a}`);if(t!==void 0)throw I("task wait accepts at most one task id.");t=L(a,"Task id");continue}if(i.has(a))throw I(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw I(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=qk(l):a==="--tab"?r=L(l,"Agent tab id"):s=Ca(l)}if(!n)throw I("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function xk(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw I(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw I("fury plan accepts exactly one definition file.");t=L(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw I(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw I("Fury plan option --root-task may only be provided once.");n=L(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw I(`Invalid fury input "${o}". Use key=value.`);let l=L(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw I(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw I("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function Fk(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 I("fury watch supports --after and --format jsonl.");if(i==="--after")n=L(o,"Event cursor");else if(o==="jsonl")r=o;else throw I("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Lk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=va(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 I("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 I("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw I("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function Mk(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=va(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw I(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function jk(e){let t=e[0],n=L(e[1]??"","Fury review id");if(t==="show")return Qs(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw I("Unsupported fury review action.");let r=va(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw I(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function va(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw I(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw I(`Option ${s} requires a value.`);n.set(s,L(i,s))}return n}function qk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Ak.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Ca(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw I(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw I(`Duration "${e}" is too large.`);return s}function Gd(e,t){return{mode:"command",command:e,commandName:bk(e),options:t}}function Hd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function _r(e,t){Qs(e,0,t)}function Qs(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function Z(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return L(e[0],t)}function Pa(e,t){return L(e.join(" "),t)}function Xs(e,t,n){return L(e[t]??"",n)}function L(e,t){let n=e.trim();if(n.length===0)throw I(`${t} cannot be empty.`);return n}function I(e){return new g("CLI_USAGE",`${e}
|
|
8
8
|
|
|
9
|
-
${ka()}`,{})}var Ue=(e,t)=>{let n=Pa(e);if(!kk(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Pa=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:Sa(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:Rk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Tk(t.repoTargets),runnerSession:t.runnerSession??wk(t),checks:Ek(t),lastCommit:t.lastCommit??null,prs:Ok(t),artifacts:_k(t),cleanup:xk(t)}},wk=e=>{if(typeof e.title!="string")return null;let t=Sa(e.runner);return{command:T.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},kk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&T.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Vd(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||bk(t.repoTargets))&&Sk(t.runnerSession)&&Ik(t.prompt)&&Kd(t.checks)&&Gd(t.lastCommit)&&Ck(t.prs)&&Ak(t.artifacts)&&Yd(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Tk=e=>{if(Array.isArray(e))return e.filter(Bd)},bk=e=>Array.isArray(e)&&e.every(Bd),Bd=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)&&Kd(t.checks)&&Gd(t.lastCommit)&&Hd(t.pullRequest)&&Yd(t.cleanup)},Rk=e=>{if(Vd(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 Pk(e.id,e.title,t,Sa(e.runner))},Pk=(e,t,n,r)=>{let s=T.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:T.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},Sa=e=>e&&T.runners.isRunnerType(e)?e:"codex",Vd=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",Kd=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"),Gd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Hd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&vk(e.requiredChecks),vk=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)),Ck=e=>Array.isArray(e)&&e.every(Hd),Ak=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),Yd=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),Ek=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},Ok=e=>{if(Array.isArray(e.prs))return e.prs.map($k);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:zd(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Jd(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},$k=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:zd(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:Nk(t.reviewDecision),requiredChecks:Jd(t.requiredChecks),comments:Dk(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},zd=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,Nk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Dk=e=>Array.isArray(e)?e.flatMap(t=>{if(typeof t!="object"||t===null)return[];let n=t;return typeof n.body!="string"||!n.body.trim()?[]:[{author:typeof n.author=="string"?n.author:null,body:n.body,createdAt:typeof n.createdAt=="string"?n.createdAt:null,url:typeof n.url=="string"?n.url:null}]}):[],Jd=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})):[],_k=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},xk=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as kT}from"node:fs/promises";import{readFile as Lk,readdir as Fk,rm as Mk}from"node:fs/promises";import Xd from"node:path";var Ia=(e,t)=>Xd.join(e.workspacesDir,`${t}.json`),jk=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"):[]}},Qd=(e,t)=>{let n=jk(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},yn=async(e,t)=>{let n=Ia(e,t);try{let r=await Lk(n,"utf8");return Qd(JSON.parse(r),n)}catch(r){throw qk(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}},wn=async(e,t)=>{await q(Ia(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await Fk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>yn(e,Xd.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Zd=async(e,t)=>{await Mk(Ia(e,t),{force:!0})},qk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Uk,readdir as Wk,rm as Bk}from"node:fs/promises";import ep from"node:path";var va=(e,t)=>ep.join(e.reposDir,`${t}.json`),tp=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},De=async(e,t)=>{let n=va(e,t);try{let r=await Uk(n,"utf8");return tp(JSON.parse(r),n)}catch(r){throw Vk(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}},Ca=async(e,t)=>{await q(va(e,t.id),{...t,updatedAt:new Date().toISOString()})},Or=async e=>{let t=await Wk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>De(e,ep.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},np=async(e,t)=>{await Bk(va(e,t),{force:!0})},Vk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Kk}from"node:fs/promises";var Gk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Wn=(e,t,n)=>{if(!Gk(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},Ee=async e=>{let t=await Kk(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},It=async(e,t)=>{await q(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Xk,stat as Qk}from"node:fs/promises";import Vn from"node:path";import{realpath as ip}from"node:fs/promises";import Ys from"node:path";import{execFile as Hk}from"node:child_process";import{promisify as Yk}from"node:util";var rp=Yk(Hk);async function G(e,t,n={}){try{let r=await rp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(sp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function z(e,t,n={}){try{let r=await rp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(sp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function sp(e){return e instanceof Error}var Aa=async e=>{try{let n=(await G("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([ip(n).catch(()=>Ys.resolve(n)),ip(e).catch(()=>Ys.resolve(e))]);return r===s}catch{return!1}},Ea=async e=>{let t=await z("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 z("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await G("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},op=async e=>{let t=await z("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 We,readFile as zk}from"node:fs/promises";var Jk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Bn=async e=>{let t=Ae(e);await We(t.craigDir,{recursive:!0}),await Promise.all([We(t.reposDir,{recursive:!0}),We(t.workspacesDir,{recursive:!0}),We(t.runtimeDir,{recursive:!0}),We(t.tasksDir,{recursive:!0}),We(t.jobsDir,{recursive:!0}),We(t.commandsDir,{recursive:!0}),We(t.eventsDir,{recursive:!0}),We(t.orchestrationDir,{recursive:!0}),We(t.logsDir,{recursive:!0}),We(t.artifactsDir,{recursive:!0}),We(t.worktreesDir,{recursive:!0})]);try{let s=await zk(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!Jk(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 ap=(e,t,n)=>{let r=new Date().toISOString();return{id:Zk(e,Vn.basename(t)),name:Vn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},lp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Zk=(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},eT=(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},cp=async(e,t)=>{let n=await Ee(e);await It(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},tT=async(e,t)=>{let n=await Xk(t,{withFileTypes:!0}),r=await Or(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Vn.join(t,i.name);if(!await Aa(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Ea(o);s.push(a?lp(a,l):ap([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},nT=async(e,t)=>{let n=await Ea(t),r=await Or(e),s=r.find(u=>u.rootPath===t)??null,i=s?lp(s,n):ap(r,t,n),o=`workspace_${i.id}`,l=(await Ie(e)).find(u=>u.id===o)??null,c=new Date().toISOString(),d=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await Ca(e,i),l||await wn(e,d),await cp(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},rT=async(e,t)=>{let n=await tT(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Ie(e),s=eT(r,Vn.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:Vn.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=>Ca(e,c))),await wn(e,l),await cp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},$r=async(e,t)=>{await Bn(e.workspaceRoot);let n=Vn.resolve(e.workspaceRoot,t);if(!(await Qk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Aa(n)?nT(e,n):rT(e,n)};var Oa=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Bn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var $a=async(e,t,n={readWorkspace:yn,writeWorkspace:wn})=>{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 Na=async(e,t)=>{let r={...await yn(e,t),status:"active",archivedAt:null};await wn(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 kn=async(e,t,n={deleteWorkspace:Zd,readCraigIndex:Ee,writeCraigIndex:It})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Da=async(e,t,n)=>{let r=await yn(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 kn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as sT,realpath as pp,stat as iT}from"node:fs/promises";import zs from"node:path";async function _a(e){let t=await mp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return up(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return up(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await dp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await op(t);if(r){let s=await dp(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 up(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await mp(zs.resolve(n,e),s),o=await fp(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 dp(e){let t=e;for(;;){let n=await fp(t);if(n)return n;let r=zs.dirname(t);if(r===t)return null;t=r}}async function fp(e){let t=Ae(e);try{let n=await sT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Wn(r,s,t.indexFile);if(await pp(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(oT(n))return null;throw n instanceof g?n:new g("WORKSPACE_CONTEXT_INVALID",n instanceof Error?n.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:n})}}async function mp(e,t){let n=zs.resolve(e);try{if(!(await iT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await pp(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 oT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var xa={};xs(xa,{addRepo:()=>hp,listRegisteredRepos:()=>gp,removeRepo:()=>yp});import aT from"node:path";import{stat as lT}from"node:fs/promises";var hp=async(e,t)=>{let n=aT.resolve(e.workspaceRoot,t);if(!(await lT(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await $r(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var gp=async(e,t={listRepos:Or,ensureCraigState:Bn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var yp=async(e,t,n)=>{let r=await De(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>kn(e,c.id))),await np(e,t);let l=await Ee(e);return await It(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var Te={addWorkspace:$r,listWorkspaces:Oa,archiveWorkspace:$a,restoreWorkspace:Na,removeWorkspace:Da,removeWorkspaceRecord:kn,resolveContext:_a,repos:xa};import{mkdir as wp,readFile as cT,rm as Xs,stat as uT,writeFile as dT}from"node:fs/promises";import Js from"node:path";var pT=25,fT=3e4,mT=5e3;async function Qe(e,t,n){let r=Js.join(e.runtimeDir,"task-locks"),s=Js.join(r,`${t}.lock`);await wp(r,{recursive:!0});let i=Date.now();for(;;)try{await wp(s);try{await dT(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(!yT(o))throw o;if(await hT(s))continue;if(Date.now()-i>=fT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await wT(pT)}try{return await n()}finally{await Xs(s,{recursive:!0,force:!0})}}async function hT(e){let t=await cT(Js.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return gT(t.pid)?!1:(await Xs(e,{recursive:!0,force:!0}),!0);let n=await uT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<mT?!1:(await Xs(e,{recursive:!0,force:!0}),!0)}function gT(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 yT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",wT=e=>new Promise(t=>setTimeout(t,e));var vt=async(e,t)=>{let n=await kT(Qs(e,t),"utf8");return JSON.parse(n)},Nr=async(e,t)=>{let n=await vt(e,t);return Ue(n,Qs(e,t))},Ze=async(e,t)=>{let n=kp(t);await q(Qs(e,t.id),n)},V=async(e,t,n)=>Qe(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=kp(s);return await q(Qs(e,t),i),i}),La=async(e,t)=>{let n=await Ee(e);n.taskIds.includes(t)||await It(e,{...n,taskIds:[...n.taskIds,t]})},Qs=(e,t)=>`${e.tasksDir}/${t}.json`,kp=e=>({...e,updatedAt:new Date().toISOString()});var K=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Kt=e=>e.status==="merged"||e.status==="closed",Ct=(e,t)=>{let n=e.prs.findIndex(s=>Kn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Kn=(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(),Tn=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&&!TT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),TT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Fa=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),At=(e,t,n)=>{let r=e.isDraft??!1,s=bT(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:RT(e.reviewDecision??null),requiredChecks:Ma(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:vT(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}},bT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,RT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ma=e=>{let t=e.map(r=>PT(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}))},PT=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:bp(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:Tp(t.status)>=Tp(e.status),Zs=e=>e.conclusion?.toUpperCase()==="CANCELLED",Tp=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},vT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(CT).filter(n=>n!==null).slice(-4):[]},CT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=AT(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},AT=e=>e.replace(/\s+/g," ").trim(),bp=(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?bp(r,r):"unknown"};var Be=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as ET}from"node:fs/promises";import Rp from"node:path";var L=async(e,t,n={readRawTask:vt,validateTaskRecord:Ue})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw _T(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):xT(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},he=async e=>{if(!await ja(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Gn=(e,t)=>t.artifacts.logPath?Rp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Rp.join(e.workspaceRoot,t.artifacts.logPath):null,Dr=async(e,t)=>{let n=await ja(t.worktreePath),r=Gn(e,t),s=r?await ja(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:OT(t),lastCommitSummary:$T(t),prSummary:NT(t),cleanupSummary:DT(t)}},ja=async e=>{try{return await ET(e),!0}catch{return!1}},OT=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}`},$T=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",NT=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let d=c.pullRequest.status??"unknown";return l[d]=(l[d]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
|
|
9
|
+
${Sa()}`,{})}var Be=(e,t)=>{let n=Aa(e);if(!Bk(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Aa=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:Ea(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:Kk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Wk(t.repoTargets),runnerSession:t.runnerSession??Uk(t),checks:Qk(t),lastCommit:t.lastCommit??null,prs:Zk(t),artifacts:rT(t),cleanup:sT(t)}},Uk=e=>{if(typeof e.title!="string")return null;let t=Ea(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Bk=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"&&Xd(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||Vk(t.repoTargets))&&Hk(t.runnerSession)&&Yk(t.prompt)&&Qd(t.checks)&&Zd(t.lastCommit)&&Jk(t.prs)&&Xk(t.artifacts)&&tp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Wk=e=>{if(Array.isArray(e))return e.filter(Jd)},Vk=e=>Array.isArray(e)&&e.every(Jd),Jd=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)&&Qd(t.checks)&&Zd(t.lastCommit)&&ep(t.pullRequest)&&tp(t.cleanup)},Kk=e=>{if(Xd(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 Gk(e.id,e.title,t,Ea(e.runner))},Gk=(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}]},Ea=e=>e&&k.runners.isRunnerType(e)?e:"codex",Xd=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"),Hk=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),Yk=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Qd=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"),Zd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",ep=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&zk(e.requiredChecks),zk=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)),Jk=e=>Array.isArray(e)&&e.every(ep),Xk=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),tp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),Qk=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},Zk=e=>{if(Array.isArray(e.prs))return e.prs.map(eT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:np(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:rp(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},eT=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:np(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:tT(t.reviewDecision),requiredChecks:rp(t.requiredChecks),comments:nT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},np=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,tT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,nT=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}]}):[],rp=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})):[],rT=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},sT=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as BT}from"node:fs/promises";import{readFile as iT,readdir as oT,rm as aT}from"node:fs/promises";import sp from"node:path";var Oa=(e,t)=>sp.join(e.workspacesDir,`${t}.json`),lT=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"):[]}},ip=(e,t)=>{let n=lT(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},wn=async(e,t)=>{let n=Oa(e,t);try{let r=await iT(n,"utf8");return ip(JSON.parse(r),n)}catch(r){throw cT(r)?new g("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig workspace record at ")?new g("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},kn=async(e,t)=>{await B(Oa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await oT(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>wn(e,sp.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},op=async(e,t)=>{await aT(Oa(e,t),{force:!0})},cT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as uT,readdir as dT,rm as pT}from"node:fs/promises";import ap from"node:path";var $a=(e,t)=>ap.join(e.reposDir,`${t}.json`),lp=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},_e=async(e,t)=>{let n=$a(e,t);try{let r=await uT(n,"utf8");return lp(JSON.parse(r),n)}catch(r){throw fT(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}},Na=async(e,t)=>{await B($a(e,t.id),{...t,updatedAt:new Date().toISOString()})},xr=async e=>{let t=await dT(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>_e(e,ap.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},cp=async(e,t)=>{await pT($a(e,t),{force:!0})},fT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as mT}from"node:fs/promises";var hT=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Vn=(e,t,n)=>{if(!hT(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Oe=async e=>{let t=await mT(e.indexFile,"utf8");return Vn(JSON.parse(t),e.workspaceRoot,e.indexFile)},vt=async(e,t)=>{await B(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as TT,stat as bT}from"node:fs/promises";import Gn from"node:path";import{realpath as pp}from"node:fs/promises";import Zs from"node:path";import{execFile as gT}from"node:child_process";import{promisify as yT}from"node:util";var up=yT(gT);async function K(e,t,n={}){try{let r=await up(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(dp(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 up(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(dp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function dp(e){return e instanceof Error}var Da=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([pp(n).catch(()=>Zs.resolve(n)),pp(e).catch(()=>Zs.resolve(e))]);return r===s}catch{return!1}},_a=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"},fp=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=Zs.resolve(e,n);return Zs.dirname(r)};import{mkdir as We,readFile as wT}from"node:fs/promises";var kT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Kn=async e=>{let t=Ee(e);await We(t.craigDir,{recursive:!0}),await Promise.all([We(t.reposDir,{recursive:!0}),We(t.workspacesDir,{recursive:!0}),We(t.runtimeDir,{recursive:!0}),We(t.tasksDir,{recursive:!0}),We(t.jobsDir,{recursive:!0}),We(t.commandsDir,{recursive:!0}),We(t.eventsDir,{recursive:!0}),We(t.orchestrationDir,{recursive:!0}),We(t.logsDir,{recursive:!0}),We(t.artifactsDir,{recursive:!0}),We(t.worktreesDir,{recursive:!0})]);try{let s=await wT(t.indexFile,"utf8"),i=JSON.parse(s);return Vn(i,e,t.indexFile)}catch(s){if(!kT(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await B(t.indexFile,r),r};var mp=(e,t,n)=>{let r=new Date().toISOString();return{id:RT(e,Gn.basename(t)),name:Gn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},hp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},RT=(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},PT=(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},gp=async(e,t)=>{let n=await Oe(e);await vt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},ST=async(e,t)=>{let n=await TT(t,{withFileTypes:!0}),r=await xr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Gn.join(t,i.name);if(!await Da(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await _a(o);s.push(a?hp(a,l):mp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},IT=async(e,t)=>{let n=await _a(t),r=await xr(e),s=r.find(u=>u.rootPath===t)??null,i=s?hp(s,n):mp(r,t,n),o=`workspace_${i.id}`,l=(await Ie(e)).find(u=>u.id===o)??null,c=new Date().toISOString(),d=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await Na(e,i),l||await kn(e,d),await gp(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},vT=async(e,t)=>{let n=await ST(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Ie(e),s=PT(r,Gn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Gn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>Na(e,c))),await kn(e,l),await gp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Fr=async(e,t)=>{await Kn(e.workspaceRoot);let n=Gn.resolve(e.workspaceRoot,t);if(!(await bT(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Da(n)?IT(e,n):vT(e,n)};var xa=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Kn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Fa=async(e,t,n={readWorkspace:wn,writeWorkspace:kn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var La=async(e,t)=>{let r={...await wn(e,t),status:"active",archivedAt:null};await kn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var Tn=async(e,t,n={deleteWorkspace:op,readCraigIndex:Oe,writeCraigIndex:vt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Ma=async(e,t,n)=>{let r=await wn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await Tn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as CT,realpath as kp,stat as AT}from"node:fs/promises";import ei from"node:path";async function ja(e){let t=await bp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return yp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return yp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await wp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await fp(t);if(r){let s=await wp(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 yp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await bp(ei.resolve(n,e),s),o=await Tp(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 wp(e){let t=e;for(;;){let n=await Tp(t);if(n)return n;let r=ei.dirname(t);if(r===t)return null;t=r}}async function Tp(e){let t=Ee(e);try{let n=await CT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Vn(r,s,t.indexFile);if(await kp(i.workspaceRoot).catch(()=>ei.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(ET(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 bp(e,t){let n=ei.resolve(e);try{if(!(await AT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await kp(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 ET(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var qa={};qs(qa,{addRepo:()=>Rp,listRegisteredRepos:()=>Pp,removeRepo:()=>Sp});import OT from"node:path";import{stat as $T}from"node:fs/promises";var Rp=async(e,t)=>{let n=OT.resolve(e.workspaceRoot,t);if(!(await $T(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Fr(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var Pp=async(e,t={listRepos:xr,ensureCraigState:Kn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Sp=async(e,t,n)=>{let r=await _e(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>Tn(e,c.id))),await cp(e,t);let l=await Oe(e);return await vt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var Te={addWorkspace:Fr,listWorkspaces:xa,archiveWorkspace:Fa,restoreWorkspace:La,removeWorkspace:Ma,removeWorkspaceRecord:Tn,resolveContext:ja,repos:qa};import{mkdir as Ip,readFile as NT,rm as ni,stat as DT,writeFile as _T}from"node:fs/promises";import ti from"node:path";var xT=25,FT=3e4,LT=5e3;async function Ze(e,t,n){let r=ti.join(e.runtimeDir,"task-locks"),s=ti.join(r,`${t}.lock`);await Ip(r,{recursive:!0});let i=Date.now();for(;;)try{await Ip(s);try{await _T(ti.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ni(s,{recursive:!0,force:!0}),o}break}catch(o){if(!qT(o))throw o;if(await MT(s))continue;if(Date.now()-i>=FT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await UT(xT)}try{return await n()}finally{await ni(s,{recursive:!0,force:!0})}}async function MT(e){let t=await NT(ti.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return jT(t.pid)?!1:(await ni(e,{recursive:!0,force:!0}),!0);let n=await DT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<LT?!1:(await ni(e,{recursive:!0,force:!0}),!0)}function jT(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 qT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",UT=e=>new Promise(t=>setTimeout(t,e));var Ct=async(e,t)=>{let n=await BT(ri(e,t),"utf8");return JSON.parse(n)},Lr=async(e,t)=>{let n=await Ct(e,t);return Be(n,ri(e,t))},et=async(e,t)=>{let n=vp(t);await B(ri(e,t.id),n)},G=async(e,t,n)=>Ze(e,t,async()=>{let r=await Lr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=vp(s);return await B(ri(e,t),i),i}),Ua=async(e,t)=>{let n=await Oe(e);n.taskIds.includes(t)||await vt(e,{...n,taskIds:[...n.taskIds,t]})},ri=(e,t)=>`${e.tasksDir}/${t}.json`,vp=e=>({...e,updatedAt:new Date().toISOString()});var H=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Ht=e=>e.status==="merged"||e.status==="closed",At=(e,t)=>{let n=e.prs.findIndex(s=>Hn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Hn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),bn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return ii(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ii=e=>e.mergeable&&!WT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),WT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ba=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Et=(e,t,n)=>{let r=e.isDraft??!1,s=VT(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:KT(e.reviewDecision??null),requiredChecks:Wa(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:zT(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}},VT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,KT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Wa=e=>{let t=e.map(r=>GT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||HT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},GT=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:YT(t)}:null},HT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):si(e)&&!si(t)?!0:!si(e)&&si(t)?!1:Cp(t.status)>=Cp(e.status),si=e=>e.conclusion?.toUpperCase()==="CANCELLED",Cp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},YT=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},zT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(JT).filter(n=>n!==null).slice(-4):[]},JT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=XT(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},XT=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 Ve=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as QT}from"node:fs/promises";import Ep from"node:path";var F=async(e,t,n={readRawTask:Ct,validateTaskRecord:Be})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw rb(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):sb(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},he=async e=>{if(!await Va(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Yn=(e,t)=>t.artifacts.logPath?Ep.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Ep.join(e.workspaceRoot,t.artifacts.logPath):null,Mr=async(e,t)=>{let n=await Va(t.worktreePath),r=Yn(e,t),s=r?await Va(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:ZT(t),lastCommitSummary:eb(t),prSummary:tb(t),cleanupSummary:nb(t)}},Va=async e=>{try{return await QT(e),!0}catch{return!1}},ZT=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}`},eb=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",tb=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=H(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},nb=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",rb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",sb=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var jr=async(e,t)=>{let n=await J("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},Ka=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 ib(e,s);await K("git",["worktree","add","-b",t,n,o],{cwd:e})},ib=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,oi=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},Op=async e=>{await K("git",["add","-A"],{cwd:e})},$p=async(e,t)=>{await K("git",["commit","-m",t],{cwd:e})},Np=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}},Dp=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 ai=async(e,t)=>{await K("git",["worktree","remove","--force",t],{cwd:e})},_p=async(e,t)=>{await K("git",["branch","-D",t],{cwd:e})};var Ga=async e=>zn(e,e.repoRoot),zn=async(e,t)=>{let n=await Oe(e),r=xp(new Date),s=Fp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await jr(t,o))return i;s+=1}},qr=async e=>{let t=await Oe(e),n=xp(new Date),r=Fp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},xp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Fp=(e,t)=>{let n=e.filter(r=>r.startsWith(`task_${t}_`)).map(r=>Number.parseInt(r.slice(-2),10)).filter(r=>Number.isInteger(r));return n.length===0?1:Math.max(...n)+1};var Ur=async(e,t,n={readRawTask:Ct,validateTaskRecord:Be})=>{let r=await Oe(e),s=[],i=[];await Promise.all(r.taskIds.map(async l=>{try{let c=await n.readRawTask(e,l);s.push(n.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(ob(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}},ob=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Lp=["merge_ready","pr_open","checked","review","running","draft"],Ha=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Ya=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(ab)[0]?.id??null,ab=(e,t)=>{let n=Mp(e.status),r=Mp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Mp=e=>{let t=Lp.indexOf(e);return t>=0?t:Lp.length};import jp from"node:path";var Rn=(e,t)=>t?jp.isAbsolute(t)?t:jp.join(e.repoRoot,t):null;import{randomUUID as lb}from"node:crypto";import{mkdir as Wr,rm as cb,writeFile as li}from"node:fs/promises";import Y from"node:path";var Br=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var qp=["AGENTS","md"].join("."),Jn=async(e,t,n,r={})=>{let s=await _e(e,t),[i,o]=await Promise.all([mb(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),zn(e,s.rootPath)]),a=`craig/${o}`,l=Y.join(e.worktreesDir,s.id,o),c=Y.join(e.logsDir,`${o}.log`),d=Y.join(e.artifactsDir,o);await Promise.all([Wr(Y.dirname(l),{recursive:!0}),Wr(d,{recursive:!0}),li(c,"","utf8")]);let u=ub(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 et(e,u),await Ua(e,o),await Ka(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},Vr=async(e,t,n,r={})=>{let s=(await Ie(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await Jn(e,s.primaryRepoId,n,r);return{...b,bundlePath:b.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await qr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=Y.join(e.craigDir,"task-bundles",o),u=Y.join(e.logsDir,`${o}.log`),p=Y.join(e.artifactsDir,o);await Wr(d,{recursive:!0}),await Wr(p,{recursive:!0}),await li(u,"","utf8");let h=await Promise.all(i.map(b=>_e(e,b))),f=pb(h),m=await Promise.all(h.map(b=>db(e,b,o,c,Y.join(d,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await cb(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${m.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Ja({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:m,bundlePath:d});let T=Kr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Br(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:T[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...Bp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,u),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(p,"pr-status.json"))},cleanup:ci(),lastFailureReason:m.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await et(e,R),await Ua(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:m}},Kr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${lb()}`}:{},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}]},ub=(e,t)=>{let n=new Date().toISOString(),r=Kr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Br(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Bp(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:{...Xa(Y.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,Y.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:ci(),lastFailureReason:null,createdAt:n,updatedAt:n}},db=async(e,t,n,r,s)=>{try{return await za(e,t,r,s)}catch(i){return{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:i instanceof Error?i.message:"Failed to create worktree.",checks:Xa(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Up(),cleanup:ci()}}},za=async(e,t,n,r)=>(await Wr(Y.dirname(r),{recursive:!0}),await Ka(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:Xa(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Up(),cleanup:ci()}),pb=e=>{let t=new Set(["manifest.json",qp]),n=new Map;for(let r of e){let s=t.has(r.name)?`${r.name}-repo`:r.name,i=s,o=2;for(;t.has(i);)i=`${s}-${o}`,o+=1;t.add(i),n.set(r.id,i)}return n},fb=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=Y.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
|
|
13
13
|
`);return["# Craig Project Task Bundle","","This directory is a Craig project task bundle. Repo work must happen inside the child repo worktrees listed below.","","Run repo Git commands from a repo worktree directory, not from the bundle root. Use `manifest.json` as the machine-readable source of truth for this bundle.","",`Task: \`${e.taskId}\``,`Workspace: \`${e.workspaceId}\``,`Prompt: ${e.prompt}`,"","## Repo Worktrees","",n,""].join(`
|
|
14
|
-
`)},
|
|
14
|
+
`)},Ja=async e=>{await li(Y.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:Y.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await li(Y.join(e.bundlePath,qp),fb(e),"utf8")},Xa=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Up=()=>({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}),ci=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Bp=(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}),mb=async(e,t,n,r=!1)=>{let s=await Ie(e),i=n?s.find(o=>o.id===n&&o.status==="active"&&(o.kind==="project"?r||o.discoveredRepoIds?.includes(t):o.primaryRepoId===t)):s.find(o=>o.kind!=="project"&&o.primaryRepoId===t&&o.status==="active");if(!i)throw new Error(n?`Repo ${t} is not available in active workspace ${n}.`:`Repo ${t} does not have an active workspace.`);return i};var Qa=async(e,t,n)=>{await G(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},Gr=async(e,t,n)=>G(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Hr=async(e,t)=>G(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});var Za=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let l=(r.workspaceId?await Vr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Jn(e,t,s,{runner:o,config:i,...r.owningWorkspaceId?{workspaceId:r.owningWorkspaceId,allowLinkedProjectRepo:r.allowLinkedProjectRepo??!1}:{},...r.lineage?{lineage:r.lineage}:{}})).task;try{let c=await r.onProvisioned?.(l);if(!r.launchProvisioned)throw new Error("Craig task creation requires the PTY daemon launcher.");await r.launchProvisioned(l,c||void 0);let d=r.markStartedAfterLaunch===!1?await F(e,l.id):await Hr(e,l.id),u=d.ptyTabs.find(p=>p.kind==="agent");return{kind:"createTask",taskId:d.id,repoId:d.repoId,workspaceId:d.workspaceId,agentTabId:u.id,status:d.status,branch:d.branch,worktreePath:d.worktreePath,runner:d.runner}}catch(c){throw await Gr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as kb}from"node:fs/promises";import Tb from"node:path";var Ot=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})},Xn=async(e,t)=>{let n=await K("gh",el(e),{cwd:t});return JSON.parse(n.stdout)},Qn=async(e,t)=>{let n=await J("gh",el(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Gp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Vp=async(e,t)=>{let n=await J("gh",el(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Gp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Kp=async(e,t,n)=>{if(n.length===0)return[];let r=yb(n),s;try{s=await K("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw hb(a)?new Ve(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=wb(c);return{id:a.id,found:d!==null,view:d}})},ui=async e=>{let t=await J("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:gb(t.stdout.trim())},Yt=e=>{let t=e.trim().match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/([1-9]\d*)(?:[/?#].*)?$/);return!t?.[1]||!t[2]||!t[3]?null:{owner:t[1],name:t[2],number:Number(t[3])}},hb=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")},Gp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},el=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],gb=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},yb=e=>`
|
|
15
15
|
query CraigPullRequestBatch($owner: String!, $name: String!) {
|
|
16
16
|
repository(owner: $owner, name: $name) {
|
|
17
17
|
${e.map((n,r)=>{let s=`item${r}`;return n.mode==="number"?`${s}: pullRequest(number: ${Number(n.selector)}) { ...PrFields }`:`${s}: pullRequests(headRefName: ${JSON.stringify(n.selector)}, states: OPEN, first: 1, orderBy: { field: UPDATED_AT, direction: DESC }) { nodes { ...PrFields } }`}).join(`
|
|
@@ -65,158 +65,158 @@ fragment PrFields on PullRequest {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
`,
|
|
68
|
+
`,wb=e=>{if(!e||typeof e!="object")return null;let t="nodes"in e?e.nodes?.[0]??null:e;if(!t||typeof t!="object")return null;let n=t,r=n.statusCheckRollup?.contexts?.nodes??[];return{number:n.number,url:n.url,baseRefName:n.baseRefName,headRefName:n.headRefName,headRefOid:n.headRefOid??null,state:n.state,isDraft:n.isDraft??!1,title:n.title??null,createdAt:n.createdAt??null,updatedAt:n.updatedAt??null,mergedAt:n.mergedAt??null,mergeable:n.mergeable,mergeStateStatus:n.mergeStateStatus,reviewDecision:n.reviewDecision??null,statusCheckRollup:r,comments:n.comments?.nodes??[]}};var Pn=async(e,t)=>{let n=Rn(e,t.artifacts.prStatusPath);n&&(await kb(Tb.dirname(n),{recursive:!0}),await B(n,{taskId:t.id,prs:t.prs}))},Zn=async(e,t,n={writeTask:et,writePrStatusArtifact:Pn})=>{await n.writeTask(e,t);try{await n.writePrStatusArtifact(e,t)}catch(r){throw new g("PARTIAL_RESULT",`Task ${t.id} was updated, but its PR status artifact could not be written.`,{retryable:!0,details:{taskId:t.id},cause:r})}return t},Yr=async(e,t,n,r,s={readRawTask:Ct,validateTaskRecord:Be,writeTask:et,writePrStatusArtifact:Pn,withTaskLock:Ze})=>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=Et(n,a),c=At(o,l),d=o.status==="closed"?o.status:bn(c.prs),u={...c,status:d};return Zn(e,u,s)}),zr=async(e,t)=>{let n=H(t),r=n?.number?String(n.number):t.branch,s=await Xn(r,t.worktreePath);return Yr(e,t,s,n)},Jr=async(e,t)=>{for(let n of await tl(t)){let r=await Qn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Yr(e,t,r,null)}}return{discovered:!1,task:t}},tl=async e=>{let t=await Dp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Xr(e,t,n,r){return Ze(e,t,async()=>{let s=await F(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Yt(r.url),a=s.prs.find(h=>o?Hn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=Et(r,a,o??void 0),c=bb(r),d=At(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:er(h)?h.pullRequest:Hp(h.pullRequest)}:h)},p={...u,status:u.status==="closed"?u.status:pi(u)};return Zn(e,p)})}async function di(e,t,n){return Ze(e,t,async()=>{let r=await F(e,t),s=r.repoTargets?.find(a=>a.repoId===n);if(!s)throw new Error(`Project task ${t} has no repo target ${n}.`);if(s.pullRequest.number===null||er(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:Hp(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:pi(i)};return Zn(e,o)})}function er(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function bb(e){let t=Yt(e.url);return{provider:"github",owner:t?.owner??null,repo:t?.name??null,number:e.number,url:e.url,baseBranch:e.baseRefName,headBranch:e.headRefName,status:Rb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Pb(e.reviewDecision??null),requiredChecks:Wa(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function pi(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 Rb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Pb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Hp=e=>({provider:"github",owner:e.owner??null,repo:e.repo??null,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null});var tr=async(e,t,n)=>{if(er(n)){let s=String(n.pullRequest.number),i=await Xn(s,n.worktreePath);return await Xr(e,t.id,n.repoId,i),"synced"}let r=await Qn(n.branch,n.worktreePath);return r?(await Xr(e,t.id,n.repoId,r),"discovered"):(await di(e,t.id,n.repoId),"not_found")};var Qr=async(e,t)=>{let n=await F(e,t),r=H(n);return r?.number?(await Ot(n.worktreePath),Ht(r)?(await Jr(e,n)).task:zr(e,n)):n},rl=async(e,t)=>{let n=await F(e,t);if(n.type==="project"&&n.repoTargets?.length)return await nr(e,t),F(e,t);let r=H(n);if(await he(n),await Ot(n.worktreePath),!r?.number||Ht(r)){let i=await Jr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await zr(e,n)},nr=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 Ot(i.worktreePath);let o=i.pullRequest.number?await tr(e,n,i):await tr(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},sl=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=nl(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p=er(u),h={id:`${i.id}:${u.repoId}`,task:i,targetRepoId:u.repoId,worktreePath:u.worktreePath,selector:p?String(u.pullRequest.number):u.branch,mode:p?"number":"head",fallbackSelectors:[]};await Yp(r,h).catch(async()=>{try{await Ot(u.worktreePath);let f=u.pullRequest.number?await tr(e,i,u):await tr(e,i,u);fi(o,f,u.pullRequest.number??null,u.pullRequest.url??null)}catch(f){if(f instanceof Ve)throw f;s.push(f)}})}continue}let a=H(i),l=a?.number&&!Ht(a),c=l?[]:await tl(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 Yp(r,d).catch(async()=>{try{let{disposition:u,task:p}=await mi(e,i.id),h=H(p);fi(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof Ve)throw u;s.push(u)}})}for(let i of r.values())try{await Ot(i.worktreePath);let o=await Kp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=nl(n,l.task),u=a.get(l.id)?.view??await Sb(i.worktreePath,l);if(!u){l.targetRepoId&&l.mode==="head"&&await di(e,l.task.id,l.targetRepoId),fi(c,"not_found",null,null);continue}if(l.targetRepoId)await Xr(e,l.task.id,l.targetRepoId,u);else{let p=await Ct(e,l.task.id),h=Be(p,`${e.tasksDir}/${l.task.id}.json`);await Yr(e,h,u,l.mode==="number"?H(h):null)}fi(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof Ve)throw o;s.push(o)}return Ib(s),t.map(i=>nl(n,i))},mi=async(e,t)=>{let n=await F(e,t);await he(n),await Ot(n.worktreePath);let r=H(n);if(r?.number&&!Ht(r))return{disposition:"synced",task:await zr(e,n)};let s=await Jr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},Sb=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Qn(n,e);if(r)return r}return null},Yp=async(e,t)=>{let n=await ui(t.worktreePath);if(!n)throw new Error("GitHub repository remote could not be parsed.");let r=`${n.owner}/${n.name}`,s=e.get(r);if(s){s.items.push(t);return}e.set(r,{worktreePath:t.worktreePath,repository:n,items:[t]})},nl=(e,t)=>{let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!H(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},fi=(e,t,n,r)=>{if(t==="synced"){e.synced+=1;return}if(t==="discovered"){e.discovered+=1,e.firstDiscoveredPrNumber??=n,e.firstDiscoveredPrUrl??=r;return}e.notFound+=1},Ib=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var il=async(e,t)=>{let n=await F(e,t);try{n.type==="project"&&n.repoTargets?.length?(await nr(e,t),n=await F(e,t)):n.prs.some(s=>s.number)&&(n=await Qr(e,t))}catch{}let r=await Mr(e,n);return{kind:"showTask",task:n,inspection:r}};var ol=async(e,t)=>{let n=await F(e,t);if(await he(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 vb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},vb=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 Cb(e);for(let s of r){let i=await J("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
|
|
69
69
|
|
|
70
|
-
`)},
|
|
71
|
-
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as ib}from"node:child_process";import{access as ob}from"node:fs/promises";var nl=async(e,t)=>{let n=await L(e,t),r=Gn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await ob(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},rl=async e=>{await new Promise((t,n)=>{let r=!1,s=ib("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 ab}from"node:fs/promises";import lb from"node:path";var sl=async(e,t)=>{let n=await L(e,t);if(await he(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 T.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 z("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await V(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Wp(e,h),{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 Wp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Wp=async(e,t)=>{let n=bn(e,t.artifacts.checkSummaryPath);n&&(await ab(lb.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 il=async(e,t)=>{let n=await L(e,t);await he(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.title.trim();await Pp(n.worktreePath),await Sp(n.worktreePath,s);let i=await Ip(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 cb}from"node:fs/promises";var ol=async(e,t)=>{let n=await L(e,t),r=await ub(n.worktreePath);return V(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},ub=async e=>{try{return await cb(e),!0}catch{return!1}};var al=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await ni(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 ll=async(e,t,n)=>{let r=await De(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}},cl=async(e,t)=>{let n=await L(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>De(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as db,readFile as Bp,rm as pb,writeFile as Vp}from"node:fs/promises";import ui from"node:path";var Gp=["AGENTS","md"].join("."),ul=async(e,t,n)=>Qe(e,t,async()=>{let r=await L(e,t);fb(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return Kp(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([De(e,n),Ie(e).then(f=>f.find(m=>m.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=ui.join(a,mb(i.name,r)),c=ui.join(a,"manifest.json"),d=ui.join(a,Gp),[u,p,h]=await Promise.all([Bp(c,"utf8"),Bp(d,"utf8"),_r(i.rootPath,r.branch)]);try{let f=await Va(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(k=>De(e,k.repoId)));return await Ka({taskId:r.id,workspaceId:r.workspaceId,prompt:hb(u)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await Ze(e,m),Kp(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await gb({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:u,guidePath:d,guideBackup:p});throw m.length>0?new g("PARTIAL_RESULT",`Failed to attach repo ${i.id} to task ${r.id}, and rollback was incomplete.`,{retryable:!0,details:{taskId:r.id,repoId:i.id,rollbackFailures:m.map(y=>y instanceof Error?y.message:String(y))},cause:f}):f}}),fb=e=>{if(e.type!=="project"||!e.bundlePath)throw new g("TASK_CONTEXT_CONFLICT",`Task ${e.id} is not a project task and cannot accept repository targets.`,{details:{taskId:e.id,taskType:e.type}})},mb=(e,t)=>{let n=new Set(["manifest.json",Gp,...(t.repoTargets??[]).map(o=>ui.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},hb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},gb=async e=>{let t=[];return await Vp(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await Vp(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await db(e.worktreePath).then(()=>!0).catch(()=>!1)&&await ni(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await pb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await _r(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Cp(e.repoRoot,e.branch).catch(s=>t.push(s)),t},Kp=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as yb}from"node:child_process";var dl=async(e,t)=>{let n=await L(e,t);await he(n);let s=(await T.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await wb(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},wb=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=yb(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 Yp}from"node:fs/promises";import Yr from"node:path";async function fl(e,t){if(t.explicitTaskId!==void 0){let l=await Hp(e,t.explicitTaskId,"explicit");return pl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Hp(e,t.environmentTaskId,"environment");return pl(l,"environment",t.environmentAgentTabId)}let n=await Yp(t.cwd).catch(()=>Yr.resolve(t.cwd)),r=await Lr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await Tb(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 pl(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 Hp(e,t,n){try{return await L(e,t)}catch(r){throw!(r instanceof g)||r.code!=="TASK_NOT_FOUND"?r:new g("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function pl(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 kb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function Tb(e,t){return(await Promise.all(kb(e).map(r=>Yp(r).catch(()=>Yr.resolve(r))))).some(r=>bb(r,t))}function bb(e,t){let n=Yr.relative(Yr.resolve(e),t);return n===""||!n.startsWith("..")&&!Yr.isAbsolute(n)}var ml=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await V(e,t,o=>(s=o.title,{...o,title:r,slug:Fr(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var hl=async(e,t,n="merge",r)=>{let s=await L(e,t),i=r??K(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Lp(s.worktreePath,i,n)};var zr={readTask:L,writeTask:Ze,withTaskLock:Qe,ensureGhAuthenticated:Et,fetchPrView:zn,discoverPrView:Fp,getGitHubRepositoryLocator:ii,writePrStatusArtifact:Rn};async function yl(e,t,n,r=zr){let s=await r.readTask(e,t),i=await Pb(s,n,r);return Ht(s,i,"showTaskPr","shown",[])}async function wl(e,t,n,r=zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Pl(s,n,null,r);await Sl(i,r);let o=await pi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Ht(s,i,"discoverTaskPr","not_found",[]);Il(o,i);let a=fi(s,i,o.number),l=await vl(e,s,i,o,r);return Ht(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function kl(e,t,n,r,s=zr){let i=Rl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Pl(o,r,i.repository,s);Jp(i.repository,a),await Sl(a,s);let l=await pi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Sb(l,i),Il(l,a);let c=fi(o,a,l.number),d=Cl(o,a),u=d&&!Kn(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 vl(e,o,a,l,s);return Ht(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function Rb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);let o=e.prs.find(a=>a.number===n.number)??K(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await di(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw tr(e,t);let a=zp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&ht({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await di(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&&ht({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&ht({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 Tl(e,t,n,r=zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Pl(s,n,null,r),o=Cl(s,i);if(!o?.number)return Ht(s,i,"refreshTaskPr","not_found",[]);await Sl(i,r);let a=await pi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));Il(a,i);let l=await vl(e,s,i,a,r);return Ht(l,i,"refreshTaskPr","synced",[])})}async function bl(e,t,n,r,s=zr){let i=Rl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Rb(o,r,i,s);if(Jp(i.repository,a),!fi(o,a,i.number))return Ht(o,a,"unlinkTaskPr","unchanged",[]);let c=Ib(o,a,i.number),d=await Qp(e,c,s);return Ht(d,a,"unlinkTaskPr","unlinked",[])})}function Rl(e){let t=e.trim(),n=Gt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new g("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function Pl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);return gl(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 tr(e,t);return gl(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 gl(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&&ht(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 Pb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);let s=K(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await di(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 tr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await di(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function di(e,t,n,r){let s=zp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function zp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Gt(e.url):null}async function gl(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 Sl(e,t){await pi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function pi(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 Jp(e,t){if(e&&!ht(e,t.repository))throw Xp(e,t)}function Sb(e,t){let n=Gt(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&&!ht(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 Il(e,t){let n=Gt(e.url);if(!n||!ht(n,t.repository))throw Xp(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 Xp(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 tr(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 ht(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function vl(e,t,n,r,s){let i=fi(t,n,r.number),o=At(r,i,n.repository),a=Ct(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:tf(o)}:l)}),Qp(e,a,s)}function Ib(e,t,n){let r=e.prs.filter(i=>!ef(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Zp(r.filter(o=>o.owner&&o.repo&&ht({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?tf(i):Cb(t.repository)}:o)}}return s}async function Qp(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?ai(t):Tn(t.prs),s={...t,status:r};return Xn(e,s,n)}function fi(e,t,n){return Al(e,t).find(r=>ef(r,t,n))??null}function Cl(e,t){if(!t.projectTarget)return K(e);let n=Al(e,t);return Zp(n)}function Zp(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Al(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&ht({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?vb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Kn(i,s))?[...n,s]:n}function ef(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||ht({owner:e.owner,name:e.repo},t.repository)}function Ht(e,t,n,r,s){let i=Al(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Cl(e,t),warnings:s}}function tf(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 vb(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 Cb(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var P={listTasks:Lr,getTask:L,provisionTask:Yn,provisionProjectTask:jr,createTask:Ya,showTask:el,showTaskDiff:tl,prepareTaskLogs:nl,streamTaskLogs:rl,runChecks:sl,commitTask:il,closeTask:ol,cleanupTask:al,addTaskLink:ll,addTaskRepoTarget:ul,listTaskLinks:cl,sortTasksForDisplay:Wa,resolveSelectedTaskId:Ba,allocateTaskId:Ua,allocateTaskIdForRepo:Hn,allocateProjectTaskId:xr,createDefaultTaskPtyTabs:qr,assertTaskWorktreeExists:he,resolveTaskLogPath:Gn,buildTaskInspection:Dr,resolveArtifactPath:bn,openTask:dl,markRunnerFailed:Ha,recordStartupFailure:Ur,markTaskStarted:Wr,renameTask:ml,resolveContext:fl,prs:{refresh:Hr,refreshChecks:Qa,discoverOrRefresh:ci,discoverOrRefreshAll:er,discoverOrRefreshMany:Za,show:yl,discover:wl,link:kl,refreshAssociation:Tl,unlink:bl,merge:hl,getPrimaryPr:K,isPrTerminal:Kt,isMergeReady:ei,deriveTaskStatus:Tn,upsertPr:Ct,normalizePr:At,summarizeRequiredChecks:Fa,writePrStatusArtifact:Rn}};var nf={idle:0,ready:1,working:2,error:3};function Ot(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 Yt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ot(t,n,r,i)}function nr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Yt(e,s.id,t,n);nf[i]>nf[r]&&(r=i)}return r}function mi(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ot(s.id,t,n)==="working"))}function gt(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=Yt(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:nr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function El(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=gt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw rf(e.id);let u=a-r();if(u<=0)throw Ab(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(k),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(k),f(rf(e.id))},k=setTimeout(m,u);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var Ab=(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}}),rf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Nb}from"node:net";import{createHash as Eb}from"node:crypto";import{tmpdir as Ob}from"node:os";import sf from"node:path";var Pn=10,$b=new Set([6,7,8,9,Pn]);function zt(e){return e!==void 0&&$b.has(e)}function _e(e){let t=Eb("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:sf.join(Ob(),`craig-${t}.sock`),pidPath:sf.join(e.runtimeDir,"pty-daemon.pid")}}async function of(e){let t=null;try{let n=await Db(_e(e.paths).socketPath);return t=new $l(n,e),await t.ready(),t}catch{return t?.close(),null}}var $l=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Pn)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
|
|
70
|
+
`)},Cb=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 Ab}from"node:child_process";import{access as Eb}from"node:fs/promises";var al=async(e,t)=>{let n=await F(e,t),r=Yn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await Eb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},ll=async e=>{await new Promise((t,n)=>{let r=!1,s=Ab("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 Ob}from"node:fs/promises";import $b from"node:path";var cl=async(e,t)=>{let n=await F(e,t);if(await he(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 oi(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await G(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await J("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await G(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await zp(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await G(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await zp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},zp=async(e,t)=>{let n=Rn(e,t.artifacts.checkSummaryPath);n&&(await Ob($b.dirname(n),{recursive:!0}),await B(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var ul=async(e,t)=>{let n=await F(e,t);await he(n);let r=await oi(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.title.trim();await Op(n.worktreePath),await $p(n.worktreePath,s);let i=await Np(n.worktreePath),o=new Date().toISOString(),a=await G(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as Nb}from"node:fs/promises";var dl=async(e,t)=>{let n=await F(e,t),r=await Db(n.worktreePath);return G(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Db=async e=>{try{return await Nb(e),!0}catch{return!1}};var pl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await ai(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await G(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var fl=async(e,t,n)=>{let r=await _e(e,n),s=await G(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},ml=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>_e(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as _b,readFile as Jp,rm as xb,writeFile as Xp}from"node:fs/promises";import hi from"node:path";var Zp=["AGENTS","md"].join("."),hl=async(e,t,n)=>Ze(e,t,async()=>{let r=await F(e,t);Fb(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return Qp(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([_e(e,n),Ie(e).then(f=>f.find(m=>m.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=hi.join(a,Lb(i.name,r)),c=hi.join(a,"manifest.json"),d=hi.join(a,Zp),[u,p,h]=await Promise.all([Jp(c,"utf8"),Jp(d,"utf8"),jr(i.rootPath,r.branch)]);try{let f=await za(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(T=>_e(e,T.repoId)));return await Ja({taskId:r.id,workspaceId:r.workspaceId,prompt:Mb(u)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await et(e,m),Qp(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await jb({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:u,guidePath:d,guideBackup:p});throw m.length>0?new g("PARTIAL_RESULT",`Failed to attach repo ${i.id} to task ${r.id}, and rollback was incomplete.`,{retryable:!0,details:{taskId:r.id,repoId:i.id,rollbackFailures:m.map(y=>y instanceof Error?y.message:String(y))},cause:f}):f}}),Fb=e=>{if(e.type!=="project"||!e.bundlePath)throw new g("TASK_CONTEXT_CONFLICT",`Task ${e.id} is not a project task and cannot accept repository targets.`,{details:{taskId:e.id,taskType:e.type}})},Lb=(e,t)=>{let n=new Set(["manifest.json",Zp,...(t.repoTargets??[]).map(o=>hi.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},Mb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},jb=async e=>{let t=[];return await Xp(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await Xp(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await _b(e.worktreePath).then(()=>!0).catch(()=>!1)&&await ai(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await xb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await jr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await _p(e.repoRoot,e.branch).catch(s=>t.push(s)),t},Qp=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as qb}from"node:child_process";var gl=async(e,t)=>{let n=await F(e,t);await he(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 Ub(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},Ub=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=qb(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 tf}from"node:fs/promises";import Zr from"node:path";async function wl(e,t){if(t.explicitTaskId!==void 0){let l=await ef(e,t.explicitTaskId,"explicit");return yl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await ef(e,t.environmentTaskId,"environment");return yl(l,"environment",t.environmentAgentTabId)}let n=await tf(t.cwd).catch(()=>Zr.resolve(t.cwd)),r=await Ur(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await Wb(l,n)})))).filter(l=>l.matches).map(l=>l.task),o=[...new Map(i.map(l=>[l.id,l])).values()];if(o.length>1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Multiple Craig tasks match ${n}: ${o.map(l=>l.id).join(", ")}. Use --task <id>.`,{details:{cwd:n,taskIds:o.map(l=>l.id)}});let a=o[0];if(a)return yl(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 ef(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 yl(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 Bb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function Wb(e,t){return(await Promise.all(Bb(e).map(r=>tf(r).catch(()=>Zr.resolve(r))))).some(r=>Vb(r,t))}function Vb(e,t){let n=Zr.relative(Zr.resolve(e),t);return n===""||!n.startsWith("..")&&!Zr.isAbsolute(n)}var kl=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await G(e,t,o=>(s=o.title,{...o,title:r,slug:Br(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var Tl=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??H(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Wp(s.worktreePath,i,n)};var es={readTask:F,writeTask:et,withTaskLock:Ze,ensureGhAuthenticated:Ot,fetchPrView:Xn,discoverPrView:Vp,getGitHubRepositoryLocator:ui,writePrStatusArtifact:Pn};async function Rl(e,t,n,r=es){let s=await r.readTask(e,t),i=await Gb(s,n,r);return zt(s,i,"showTaskPr","shown",[])}async function Pl(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Al(s,n,null,r);await El(i,r);let o=await yi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return zt(s,i,"discoverTaskPr","not_found",[]);Ol(o,i);let a=wi(s,i,o.number),l=await $l(e,s,i,o,r);return zt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function Sl(e,t,n,r,s=es){let i=Cl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Al(o,r,i.repository,s);rf(i.repository,a),await El(a,s);let l=await yi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Hb(l,i),Ol(l,a);let c=wi(o,a,l.number),d=Nl(o,a),u=d&&!Hn(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 $l(e,o,a,l,s);return zt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function Kb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let o=e.prs.find(a=>a.number===n.number)??H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await gi(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw rr(e,t);let a=nf(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&yt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await gi(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&&yt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&yt({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 Il(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Al(s,n,null,r),o=Nl(s,i);if(!o?.number)return zt(s,i,"refreshTaskPr","not_found",[]);await El(i,r);let a=await yi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));Ol(a,i);let l=await $l(e,s,i,a,r);return zt(l,i,"refreshTaskPr","synced",[])})}async function vl(e,t,n,r,s=es){let i=Cl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Kb(o,r,i,s);if(rf(i.repository,a),!wi(o,a,i.number))return zt(o,a,"unlinkTaskPr","unchanged",[]);let c=Yb(o,a,i.number),d=await of(e,c,s);return zt(d,a,"unlinkTaskPr","unlinked",[])})}function Cl(e){let t=e.trim(),n=Yt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new g("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function Al(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);return bl(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw rr(e,t);return bl(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 bl(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&&yt(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 Gb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let s=H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await gi(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw rr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await gi(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function gi(e,t,n,r){let s=nf(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function nf(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Yt(e.url):null}async function bl(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 El(e,t){await yi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function yi(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 rf(e,t){if(e&&!yt(e,t.repository))throw sf(e,t)}function Hb(e,t){let n=Yt(e.url);if(!n||n.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!yt(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 Ol(e,t){let n=Yt(e.url);if(!n||!yt(n,t.repository))throw sf(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 sf(e,t){return new g("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function rr(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function yt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function $l(e,t,n,r,s){let i=wi(t,n,r.number),o=Et(r,i,n.repository),a=At(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:cf(o)}:l)}),of(e,a,s)}function Yb(e,t,n){let r=e.prs.filter(i=>!lf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=af(r.filter(o=>o.owner&&o.repo&&yt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?cf(i):Jb(t.repository)}:o)}}return s}async function of(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?pi(t):bn(t.prs),s={...t,status:r};return Zn(e,s,n)}function wi(e,t,n){return Dl(e,t).find(r=>lf(r,t,n))??null}function Nl(e,t){if(!t.projectTarget)return H(e);let n=Dl(e,t);return af(n)}function af(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Dl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&yt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?zb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Hn(i,s))?[...n,s]:n}function lf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||yt({owner:e.owner,name:e.repo},t.repository)}function zt(e,t,n,r,s){let i=Dl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Nl(e,t),warnings:s}}function cf(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 zb(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 Jb(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var S={listTasks:Ur,getTask:F,provisionTask:Jn,provisionProjectTask:Vr,createTask:Za,showTask:il,showTaskDiff:ol,prepareTaskLogs:al,streamTaskLogs:ll,runChecks:cl,commitTask:ul,closeTask:dl,cleanupTask:pl,addTaskLink:fl,addTaskRepoTarget:hl,listTaskLinks:ml,sortTasksForDisplay:Ha,resolveSelectedTaskId:Ya,allocateTaskId:Ga,allocateTaskIdForRepo:zn,allocateProjectTaskId:qr,createDefaultTaskPtyTabs:Kr,assertTaskWorktreeExists:he,resolveTaskLogPath:Yn,buildTaskInspection:Mr,resolveArtifactPath:Rn,openTask:gl,markRunnerFailed:Qa,recordStartupFailure:Gr,markTaskStarted:Hr,renameTask:kl,resolveContext:wl,prs:{refresh:Qr,refreshChecks:rl,discoverOrRefresh:mi,discoverOrRefreshAll:nr,discoverOrRefreshMany:sl,show:Rl,discover:Pl,link:Sl,refreshAssociation:Il,unlink:vl,merge:Tl,getPrimaryPr:H,isPrTerminal:Ht,isMergeReady:ii,deriveTaskStatus:bn,upsertPr:At,normalizePr:Et,summarizeRequiredChecks:Ba,writePrStatusArtifact:Pn}};var uf={idle:0,ready:1,working:2,error:3};function $t(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Jt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return $t(t,n,r,i)}function sr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Jt(e,s.id,t,n);uf[i]>uf[r]&&(r=i)}return r}function ki(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&$t(s.id,t,n)==="working"))}function wt(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=Jt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:sr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function _l(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=wt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw df(e.id);let u=a-r();if(u<=0)throw Xb(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(T),f(df(e.id))},T=setTimeout(m,u);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var Xb=(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}}),df=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as tR}from"node:net";import{createHash as Qb}from"node:crypto";import{tmpdir as Zb}from"node:os";import pf from"node:path";var Sn=10,eR=new Set([6,7,8,9,Sn]);function Xt(e){return e!==void 0&&eR.has(e)}function xe(e){let t=Qb("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:pf.join(Zb(),`craig-${t}.sock`),pidPath:pf.join(e.runtimeDir,"pty-daemon.pid")}}async function ff(e){let t=null;try{let n=await nR(xe(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!==Sn)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
|
|
72
72
|
`);let s=await r;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
73
73
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
74
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="activity"?(this.recordSnapshot(n.snapshot),this.options.onActivity?.(n.snapshot)):n.type==="activityRemoved"&&(this.removeSnapshot(n.tabId),this.options.onActivityRemoved?.(n.tabId))}replaceSnapshots(t,n){let r=new Map;for(let[s,i]of this.revisionByTabId)i>n&&r.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of r)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let n of this.snapshots.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(r),this.options.onActivity?.(r)}this.options.onDaemonClose?.()}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}};function Db(e){return new Promise((t,n)=>{let r=Nb(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Dl={openObserver:lf,listTasks:e=>P.listTasks(e),getTask:(e,t)=>P.getTask(e,t),now:Date.now};async function _b(e,t,n=Dl){let r=await af(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...gt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function xb(e,t,n=Dl){let r=await af(e,t.taskId,n),s=await n.openObserver(e);try{let i=gt(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 Lb(e,t,n,r=Dl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await El(s,i,{...n,now:r.now})}finally{i.close()}}async function af(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function lf(e){return Nl.open(e)}async function Fb(e){return lf(e)}var Nl=class e{listeners=new Set;snapshots=new Map;client=null;reconnectTimer=null;reconnectDelayMs=250;closed=!1;paths;constructor(t){this.paths=t}static async open(t){let n=new e(t);return await n.connect(),n}get daemonAvailable(){return this.client!==null}getSnapshots(){return[...this.snapshots.values()]}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}close(){this.closed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.client?.close(),this.client=null}async connect(){if(this.closed)return;let t=await of({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},$t={listAgents:_b,showAgentStatus:xb,waitForTask:Lb,openObserver:Fb};import{randomUUID as sR}from"node:crypto";import{mkdir as Of,open as Vl,readdir as Kl,readFile as es,rm as iR,stat as oR}from"node:fs/promises";import ki from"node:path";import{createHash as Wb}from"node:crypto";import{mkdir as Jr,readdir as Ll,readFile as Xr,writeFile as Bb}from"node:fs/promises";import Ve from"node:path";import{mkdir as cf,readFile as Mb,rm as _l,stat as jb,writeFile as qb}from"node:fs/promises";import xl from"node:path";async function rr(e,t){let n=xl.join(e.runtimeDir,"fury-store.lock");await cf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await cf(n);try{await qb(xl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await _l(n,{recursive:!0,force:!0}),s}break}catch(s){if(!uf(s,"EEXIST"))throw s;let i=await Mb(xl.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 _l(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 _l(n,{recursive:!0,force:!0})}}function Ub(e){try{return process.kill(e,0),!0}catch(t){return uf(t,"EPERM")}}var uf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ge=e=>({root:Ve.join(e.craigDir,"fury"),definitions:Ve.join(e.craigDir,"fury","definitions"),plans:Ve.join(e.craigDir,"fury","plans"),approvals:Ve.join(e.craigDir,"fury","approvals"),runs:Ve.join(e.craigDir,"fury","runs"),reviews:Ve.join(e.craigDir,"fury","reviews")});function Fl(e){return Wb("sha256").update(JSON.stringify(e)).digest("hex")}async function pf(e,t,n){let r=ge(e);await Jr(r.definitions,{recursive:!0});let s=Ve.join(r.definitions,`${t}.yaml`);await Bb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Jt(i,"EEXIST"))throw i})}async function ff(e,t){return rr(e,async()=>{let n=await mf(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await Jr(ge(e).plans,{recursive:!0}),await q(Sf(e,i.id),i),i})}async function hi(e,t){yi(t,"plan");try{return Vb(JSON.parse(await Xr(Sf(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function mf(e){let t=ge(e).plans,n=await Ll(t).catch(s=>Jt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>hi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function hf(e){let t=await mf(e),n=await Promise.all(t.map(s=>ql(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 gf(e,t){return rr(e,async()=>{let n=await ql(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 Jr(ge(e).approvals,{recursive:!0}),await q(If(e,t.planId),t),{approval:t,created:!0}})}async function yf(e,t){yi(t,"plan");let n=await ql(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function wf(e,t){return rr(e,async()=>{let r=(await Tf(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 Jr(ge(e).runs,{recursive:!0}),await q(Ml(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){yi(t,"run");try{return Rf(JSON.parse(await Xr(Ml(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function kf(e){return Tf(e)}async function Tf(e){let t=ge(e).runs,n=await Ll(t).catch(s=>Jt(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 Rf(JSON.parse(await Xr(Ve.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ge(e,t,n){return rr(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(Ml(e,t),s),s})}async function bf(e,t){await Jr(ge(e).reviews,{recursive:!0}),await q(jl(e,t.id),t)}async function Qr(e,t,n){return rr(e,async()=>{let r=await sr(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await q(jl(e,t),s),s})}async function sr(e,t){yi(t,"review");try{return Kb(JSON.parse(await Xr(jl(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function gi(e){let t=ge(e).reviews,n=await Ll(t).catch(r=>Jt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>sr(e,r.slice(0,-5))))}function Rf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Oe(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))||!Oe(e.inputs)||!Pf(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)||!Zr(e.actor)||!Ke(e.createdAt)||!Ke(e.updatedAt)||!Ke(e.stateChangedAt)||!Ke(e.deadlineAt)||e.completedAt!==null&&!Ke(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function Vb(e,t){if(!Oe(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||!Oe(e.inputs)||!Pf(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||!Zr(e.createdBy)||!Ke(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,Fl(n)!==e.planHash)throw new g("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(!Oe(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&&(!Oe(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||!Ke(e.requestedAt)||!Ke(e.deadlineAt)||!Ke(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!df(r))||e.lastDecision!==null&&!df(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function Gb(e,t){return Oe(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&Hb(e[n],n))}function Hb(e,t){return!Oe(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")||!Oe(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||Ke(n))&&(e.completedBy===null||Zr(e.completedBy))}function df(e){return Oe(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")&&Zr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ke(e.occurredAt)}function Pf(e){return Oe(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 Zr(e){return Oe(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 Ml=(e,t)=>Ve.join(ge(e).runs,`${t}.json`),Sf=(e,t)=>Ve.join(ge(e).plans,`${t}.json`),If=(e,t)=>Ve.join(ge(e).approvals,`${t}.json`),jl=(e,t)=>Ve.join(ge(e).reviews,`${t}.json`),yi=(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 ql(e,t){try{let n=JSON.parse(await Xr(If(e,t),"utf8"));if(!Oe(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Zr(n.approvedBy)||!Oe(n.approvedBy)||n.approvedBy.type!=="human"||!Ke(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Jt(n,"ENOENT"))return null;throw n}}var Oe=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ke=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Jt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as vf,readFile as Yb,rm as wi,stat as zb,writeFile as Jb}from"node:fs/promises";import Ul from"node:path";var Xb=20,Qb=3e4,Zb=5e3;async function Cf(e,t){let n=Ul.join(e.runtimeDir,"event-journal.lock");await vf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await vf(n);try{await Jb(Ul.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(!nR(s))throw s;if(await eR(n))continue;if(Date.now()-r>=Qb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await rR(Xb)}try{return await t()}finally{await wi(n,{recursive:!0,force:!0})}}async function eR(e){let t=await Yb(Ul.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return tR(t.pid)?!1:(await wi(e,{recursive:!0,force:!0}),!0);let n=await zb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Zb?!1:(await wi(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 xe(e,t,n={}){let r=Bl(n.maxSegmentBytes??aR,"Event journal segment size"),s=Bl(n.maxSegments??lR,"Event journal retention"),i=Bl(n.maxRecordBytes??cR,"Event record size");return Cf(e,async()=>{await Of(e.eventsDir,{recursive:!0}),await hR(e);let o=await Gl(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,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:wR(t.data)},u=`${JSON.stringify(d)}
|
|
75
|
-
`;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let h=(await
|
|
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 nR(e){return new Promise((t,n)=>{let r=tR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Ml={openObserver:hf,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function rR(e,t,n=Ml){let r=await mf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...wt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function sR(e,t,n=Ml){let r=await mf(e,t.taskId,n),s=await n.openObserver(e);try{let i=wt(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 iR(e,t,n,r=Ml){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await _l(s,i,{...n,now:r.now})}finally{i.close()}}async function mf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function hf(e){return Ll.open(e)}async function oR(e){return hf(e)}var Ll=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 ff({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},Nt={listAgents:rR,showAgentStatus:sR,waitForTask:iR,openObserver:oR};import{randomUUID as CR}from"node:crypto";import{mkdir as Lf,open as zl,readdir as Jl,readFile as is,rm as AR,stat as ER}from"node:fs/promises";import Si from"node:path";import{createHash as dR}from"node:crypto";import{mkdir as ts,readdir as Ul,readFile as ns,writeFile as pR}from"node:fs/promises";import Ke from"node:path";import{mkdir as gf,readFile as aR,rm as jl,stat as lR,writeFile as cR}from"node:fs/promises";import ql from"node:path";async function ir(e,t){let n=ql.join(e.runtimeDir,"fury-store.lock");await gf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await gf(n);try{await cR(ql.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await jl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!yf(s,"EEXIST"))throw s;let i=await aR(ql.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await lR(n).catch(()=>null);if(typeof i?.pid=="number"&&!uR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await jl(n,{recursive:!0,force:!0});continue}if(Date.now()-r>3e4)throw new g("OPERATION_TIMEOUT","Timed out waiting for the fury store lock.",{retryable:!0});await new Promise(a=>setTimeout(a,20))}try{return await t()}finally{await jl(n,{recursive:!0,force:!0})}}function uR(e){try{return process.kill(e,0),!0}catch(t){return yf(t,"EPERM")}}var yf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ge=e=>({root:Ke.join(e.craigDir,"fury"),definitions:Ke.join(e.craigDir,"fury","definitions"),plans:Ke.join(e.craigDir,"fury","plans"),approvals:Ke.join(e.craigDir,"fury","approvals"),runs:Ke.join(e.craigDir,"fury","runs"),reviews:Ke.join(e.craigDir,"fury","reviews")});function Bl(e){return dR("sha256").update(JSON.stringify(e)).digest("hex")}async function kf(e,t,n){let r=ge(e);await ts(r.definitions,{recursive:!0});let s=Ke.join(r.definitions,`${t}.yaml`);await pR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Qt(i,"EEXIST"))throw i})}async function Tf(e,t){return ir(e,async()=>{let n=await bf(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await ts(ge(e).plans,{recursive:!0}),await B($f(e,i.id),i),i})}async function Ti(e,t){Ri(t,"plan");try{return fR(JSON.parse(await ns($f(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function bf(e){let t=ge(e).plans,n=await Ul(t).catch(s=>Qt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>Ti(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Rf(e){let t=await bf(e),n=await Promise.all(t.map(s=>Kl(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 Pf(e,t){return ir(e,async()=>{let n=await Kl(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await ts(ge(e).approvals,{recursive:!0}),await B(Nf(e,t.planId),t),{approval:t,created:!0}})}async function Sf(e,t){Ri(t,"plan");let n=await Kl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function If(e,t){return ir(e,async()=>{let r=(await Cf(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await ts(ge(e).runs,{recursive:!0}),await B(Wl(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){Ri(t,"run");try{return Ef(JSON.parse(await ns(Wl(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function vf(e){return Cf(e)}async function Cf(e){let t=ge(e).runs,n=await Ul(t).catch(s=>Qt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return Ef(JSON.parse(await ns(Ke.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function He(e,t,n){return ir(e,async()=>{let r=await pe(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await B(Wl(e,t),s),s})}async function Af(e,t){await ts(ge(e).reviews,{recursive:!0}),await B(Vl(e,t.id),t)}async function rs(e,t,n){return ir(e,async()=>{let r=await or(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await B(Vl(e,t),s),s})}async function or(e,t){Ri(t,"review");try{return mR(JSON.parse(await ns(Vl(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function bi(e){let t=ge(e).reviews,n=await Ul(t).catch(r=>Qt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>or(e,r.slice(0,-5))))}function Ef(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!$e(e)||e.schemaVersion!==1||e.id!==t||typeof e.planId!="string"||!/^fury_plan_[A-Za-z0-9_-]+$/.test(e.planId)||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!n.includes(String(e.state))||!$e(e.inputs)||!Of(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!hR(e.stepRuns,e.order)||!ss(e.actor)||!Ge(e.createdAt)||!Ge(e.updatedAt)||!Ge(e.stateChangedAt)||!Ge(e.deadlineAt)||e.completedAt!==null&&!Ge(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function fR(e,t){if(!$e(e)||e.schemaVersion!==1||e.id!==t||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!$e(e.inputs)||!Of(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||!Array.isArray(e.waves)||e.waves.some(r=>!Array.isArray(r)||r.some(s=>typeof s!="string"))||!Array.isArray(e.steps)||e.steps.length!==e.order.length||!ss(e.createdBy)||!Ge(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,Bl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function mR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!$e(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!$e(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Ge(e.requestedAt)||!Ge(e.deadlineAt)||!Ge(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!wf(r))||e.lastDecision!==null&&!wf(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function hR(e,t){return $e(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&gR(e[n],n))}function gR(e,t){return!$e(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!$e(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Ge(n))&&(e.completedBy===null||ss(e.completedBy))}function wf(e){return $e(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&ss(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ge(e.occurredAt)}function Of(e){return $e(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function ss(e){return $e(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}var Wl=(e,t)=>Ke.join(ge(e).runs,`${t}.json`),$f=(e,t)=>Ke.join(ge(e).plans,`${t}.json`),Nf=(e,t)=>Ke.join(ge(e).approvals,`${t}.json`),Vl=(e,t)=>Ke.join(ge(e).reviews,`${t}.json`),Ri=(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 Kl(e,t){try{let n=JSON.parse(await ns(Nf(e,t),"utf8"));if(!$e(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!ss(n.approvedBy)||!$e(n.approvedBy)||n.approvedBy.type!=="human"||!Ge(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Qt(n,"ENOENT"))return null;throw n}}var $e=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ge=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Qt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Df,readFile as yR,rm as Pi,stat as wR,writeFile as kR}from"node:fs/promises";import Gl from"node:path";var TR=20,bR=3e4,RR=5e3;async function _f(e,t){let n=Gl.join(e.runtimeDir,"event-journal.lock");await Df(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Df(n);try{await kR(Gl.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(!IR(s))throw s;if(await PR(n))continue;if(Date.now()-r>=bR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await vR(TR)}try{return await t()}finally{await Pi(n,{recursive:!0,force:!0})}}async function PR(e){let t=await yR(Gl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return SR(t.pid)?!1:(await Pi(e,{recursive:!0,force:!0}),!0);let n=await wR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<RR?!1:(await Pi(e,{recursive:!0,force:!0}),!0)}function SR(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 IR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",vR=e=>new Promise(t=>setTimeout(t,e));var OR=256*1024,$R=16,NR=64*1024;async function Fe(e,t,n={}){let r=Yl(n.maxSegmentBytes??OR,"Event journal segment size"),s=Yl(n.maxSegments??$R,"Event journal retention"),i=Yl(n.maxRecordBytes??NR,"Event record size");return _f(e,async()=>{await Lf(e.eventsDir,{recursive:!0}),await MR(e);let o=await Xl(e),a=t.id??CR(),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:UR(t.data)},u=`${JSON.stringify(d)}
|
|
75
|
+
`;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let h=(await Ii(e)).at(-1),f=!h||await DR(h.path,u,r);if(f&&(h={name:Ff(c),path:Si.join(e.eventsDir,Ff(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await zl(h.path,"a");try{await m.writeFile(u,"utf8"),await m.sync()}finally{await m.close()}return f&&await jf(e.eventsDir),await _R(e,s),d})}async function In(e,t={}){let n=await Xl(e),r=jR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?qR(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 Mf(e){return(await Xl(e)).events}async function Xl(e){await Lf(e.eventsDir,{recursive:!0});let t=await Ii(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await is(i.path,"utf8"),a=s===t.length-1,l=o.split(`
|
|
76
76
|
`);if(o.endsWith(`
|
|
77
|
-
`))l.pop();else{if(!a)throw
|
|
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 hR(e){let t=(await Ti(e)).at(-1);if(!t)return;let n=await es(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 gR(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 Wl(t);return Af(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}}):Wl(t);return Af(t,s.sequence,n),s.sequence}function Af(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 yR(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 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 Xt(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!ir(i.workspaceId)||!ir(i.taskId)||!ir(i.agentTabId)||!ir(i.commandId)||!ir(i.furyRunId)||!ir(i.furyStepId)||!TR(i.actor)||!("data"in i))throw Xt(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 ir=e=>e===null||typeof e=="string",Ef=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Xt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Wl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Hl=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Bl(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 Nf(e){let t=await Vl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as xf,readdir as $R,readFile as Lf}from"node:fs/promises";import Ff from"node:path";import{mkdir as Df,readFile as bR,rm as bi,stat as RR,writeFile as PR}from"node:fs/promises";import Yl from"node:path";var SR=20,IR=3e4,vR=5e3;async function zl(e,t){let n=Yl.join(e.runtimeDir,"command-store.lock");await Df(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Df(n);try{await PR(Yl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await bi(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 g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await OR(SR)}try{return await t()}finally{await bi(n,{recursive:!0,force:!0})}}async function CR(e){let t=await bR(Yl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return AR(t.pid)?!1:(await bi(e,{recursive:!0,force:!0}),!0);let n=await RR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<vR?!1:(await bi(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 Si(e,t){Jl(t);try{let n=JSON.parse(await Lf(ts(e,t),"utf8"));return jf(n,ts(e,t),t)}catch(n){throw xR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Pi(t,ts(e,t),n):n}}async function He(e){await xf(e.commandsDir,{recursive:!0});let t=await $R(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Ff.join(e.commandsDir,r);try{n.push(jf(JSON.parse(await Lf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Pi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Mf(e,t){return Jl(t.id),zl(e,async()=>{await xf(e.commandsDir,{recursive:!0});let n=await He(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!NR(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(ts(e,t.id),t),{command:t,created:!0}})}async function ns(e,t,n){return Jl(t),zl(e,async()=>{let r=await Si(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await q(ts(e,t),s),s})}function NR(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 jf(e,t,n){if(!Ri(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Pi("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||!Ri(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!_R(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!or(e.expiresAt)||!or(e.createdAt)||!or(e.updatedAt)||e.deliveryStartedAt!==null&&!or(e.deliveryStartedAt)||e.deliveredAt!==null&&!or(e.deliveredAt)||e.cancelledAt!==null&&!or(e.cancelledAt)||e.cancelledBy!==null&&!_f(e.cancelledBy)||!_f(e.actor)||!DR(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 Pi(r,t);return e}function _f(e){return!Ri(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 DR(e){return e===null||Ri(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var ts=(e,t)=>Ff.join(e.commandsDir,`${t}.json`),Jl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},or=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),_R=e=>e.trim().length>0&&Buffer.byteLength(e)<=32*1024&&![...e].some(t=>{let n=t.charCodeAt(0);return n<=8||n>=11&&n<=31||n>=127&&n<=159}),Ri=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),xR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Pi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function qf(e,t=new Date){return Ii(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Uf(e,t=new Date){return e.state==="delivered"?e:(Ii(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Wf(e,t,n=new Date){return e.state==="failed"?e:(Ii(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Bf(e,t,n=new Date){return e.state==="cancelled"?e:(Ii(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Ii(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 LR}from"node:crypto";var Xl=32*1024,Vf=1440*60*1e3,Ql=256,FR=["delivered","failed","cancelled"],Zl={type:"system",component:"orchestration-supervisor"};async function MR(e,t){if(GR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Vf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Vf}});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)>Ql)throw new g("CLI_USAGE",`Idempotency key exceeds ${Ql} characters.`,{details:{maxIdempotencyKeyLength:Ql}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${LR()}`,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 Mf(e,r);if(s.created)try{await In(e,s.command,"command.queued")}catch(i){throw Kf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function jR(e,t){return{kind:"showPromptCommand",command:await Si(e,t)}}async function qR(e,t){let n=await He(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function UR(e,t,n){let r=!1,s=await ns(e,t,i=>{if(i.state==="cancelled")return i;let o=Bf(i,n??i.actor);return r=!0,o});if(r)try{await In(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Kf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function WR(e,t){let n=await ns(e,t,r=>qf(r));return await In(e,n,"command.delivering",Zl),n}async function BR(e,t){let n=await ns(e,t,r=>Uf(r));return await In(e,n,"command.delivered",Zl),n}async function VR(e,t,n){let r=await ns(e,t,s=>Wf(s,n));return await In(e,r,"command.failed",Zl),r}async function KR(e,t,n){let r=[...n.states??FR],s=Date.now()+n.timeoutMs;for(;;){let i=await Si(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 HR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function GR(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Xl)throw new g("CLI_USAGE",`Prompt exceeds the ${Xl}-byte limit.`,{details:{maxPromptBytes:Xl,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 In(e,t,n,r=t.actor){await xe(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 Kf=(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:MR,show:jR,list:qR,cancel:UR,wait:KR,beginDelivery:WR,completeDelivery:BR,fail:VR};import{randomUUID as Hf,timingSafeEqual as YR}from"node:crypto";import{mkdir as zR,readFile as JR,readdir as XR}from"node:fs/promises";import Yf from"node:path";var QR=10080*60*1e3,ZR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},eP=["task.create-child","task.children","task.cancel-tree"],tP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function et(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(rc(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_${Hf()}`,c=await vi(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 nP(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 nP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Hf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...eP],targetPolicy:"children-only",limits:{...ZR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+QR).toISOString(),revokedAt:null,revokedBy:null};return await q(sc(e,o.id),o,{mode:384}),o}async function Ye(e,t,n,r){let s=await sP(e,t);return s.revokedAt&&vn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&vn(s.id,"expired"),!tP.has(n)&&!s.allowedCommandFamilies.includes(n)&&vn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await rP(e,s.taskId,r)&&vn(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 rP(e,t,n){if(t===n)return!0;let r=(await P.listTasks(e,{includeClosed:!0})).tasks,s=new Map(r.map(a=>[a.id,a])),i=s.get(n),o=new Set;for(;i?.parentTaskId&&!o.has(i.id);){if(i.parentTaskId===t)return!0;o.add(i.id),i=s.get(i.parentTaskId)}return!1}async function zf(e,t,n){let r=await vi(e,t);r&&(r.revokedAt||await q(sc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function nc(e,t,n){let r=await XR(rc(e)).catch(i=>Jf(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 vi(e,o[1]);!a||!t.has(a.taskId)||(await zf(e,a.id,n),s.push(a.id))}return s}async function sP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||vn("<redacted>","token is invalid");let s=await vi(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||!YR(i,o))&&vn(r,"token is invalid"),s}async function vi(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||vn(t,"identifier is invalid");try{let n=JSON.parse(await JR(sc(e,t),"utf8"));if(!iP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Jf(n))return null;throw n}}function iP(e,t){if(!tc(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"&&oP(r))&&e.targetPolicy==="children-only"&&tc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&ec(e.createdAt)&&ec(e.expiresAt)&&Gf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||ec(e.revokedAt)&&Gf(e.revokedBy))}function Gf(e){return tc(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 vn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var rc=e=>Yf.join(e.orchestrationDir,"capabilities"),sc=(e,t)=>Yf.join(rc(e),`${t}.json`),oP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),tc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ec=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Jf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Xf,readFile as aP,rm as ic,stat as lP,writeFile as cP}from"node:fs/promises";import oc from"node:path";var uP=20,dP=3e4,pP=5e3;async function ac(e,t){let n=oc.join(e.runtimeDir,"delegation.lock");await Xf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Xf(n);try{await cP(oc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ic(n,{recursive:!0,force:!0}),s}break}catch(s){if(!hP(s))throw s;if(await fP(n))continue;if(Date.now()-r>=dP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,uP))}try{return await t()}finally{await ic(n,{recursive:!0,force:!0})}}async function fP(e){let t=await aP(oc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&mP(t.pid))return!1;let n=await lP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<pP?!1:(await ic(e,{recursive:!0,force:!0}),!0)}function mP(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 hP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var gP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function lc(e,t,n,r={}){let s=await T.load(e);return T.previews.isEnabled(s,"agentOrchestration")?P.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await et(e,i,{type:"human",source:"cli",processId:process.pid})})}):P.createTask(e,t,n,r)}async function cc(e,t,n={}){return ac(e,async()=>{let r=await P.getTask(e,t.parentTaskId),s=t.capabilityId?await Ye(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??gP,a=yP(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&&Ci("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Ci("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(k=>k.delegationIdempotencyKey===p);if(y){if(!wP(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 Qf(y,!0)}}u.length>=o.maxChildren&&Ci("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Ci("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??P.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(k=>k.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await et(e,y,i)})}),m=await P.getTask(e,f.taskId);try{await xe(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return Qf(m,!1)})}async function uc(e,t,n){n&&await Ye(e,n,"task.children",t),await P.getTask(e,t);let r=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function dc(e,t,n){return ac(e,async()=>{let s=(n?await Ye(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await P.getTask(e,t);let i=(await P.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,d=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((k,R)=>k.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await nc(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){u.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await P.cleanupTask(e,f,{preserveWorktree:!0});let y=await P.closeTask(e,f.id);u.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await xe(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function Qf(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 yP(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 wP(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Ci(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ai=Symbol.for("yaml.alias"),Ei=Symbol.for("yaml.document"),tt=Symbol.for("yaml.map"),pc=Symbol.for("yaml.pair"),Le=Symbol.for("yaml.scalar"),Nt=Symbol.for("yaml.seq"),ve=Symbol.for("yaml.node.type"),Fe=e=>!!e&&typeof e=="object"&&e[ve]===Ai,yt=e=>!!e&&typeof e=="object"&&e[ve]===Ei,nt=e=>!!e&&typeof e=="object"&&e[ve]===tt,M=e=>!!e&&typeof e=="object"&&e[ve]===pc,_=e=>!!e&&typeof e=="object"&&e[ve]===Le,rt=e=>!!e&&typeof e=="object"&&e[ve]===Nt;function W(e){if(e&&typeof e=="object")switch(e[ve]){case tt:case Nt:return!0}return!1}function j(e){if(e&&typeof e=="object")switch(e[ve]){case Ai:case tt:case Le:case Nt:return!0}return!1}var Oi=e=>(_(e)||W(e))&&!!e.anchor;var $e=Symbol("break visit"),Zf=Symbol("skip children"),wt=Symbol("remove node");function ze(e,t){let n=em(t);yt(e)?ar(null,e.contents,n,Object.freeze([e]))===wt&&(e.contents=null):ar(null,e,n,Object.freeze([]))}ze.BREAK=$e;ze.SKIP=Zf;ze.REMOVE=wt;function ar(e,t,n,r){let s=tm(e,t,n,r);if(j(s)||M(s))return nm(e,r,s),ar(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===$e)return $e;o===wt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=ar("key",t.key,n,r);if(i===$e)return $e;i===wt&&(t.key=null);let o=ar("value",t.value,n,r);if(o===$e)return $e;o===wt&&(t.value=null)}}return s}async function $i(e,t){let n=em(t);yt(e)?await lr(null,e.contents,n,Object.freeze([e]))===wt&&(e.contents=null):await lr(null,e,n,Object.freeze([]))}$i.BREAK=$e;$i.SKIP=Zf;$i.REMOVE=wt;async function lr(e,t,n,r){let s=await tm(e,t,n,r);if(j(s)||M(s))return nm(e,r,s),lr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await lr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===$e)return $e;o===wt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await lr("key",t.key,n,r);if(i===$e)return $e;i===wt&&(t.key=null);let o=await lr("value",t.value,n,r);if(o===$e)return $e;o===wt&&(t.value=null)}}return s}function em(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 tm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(nt(t))return n.Map?.(e,t,r);if(rt(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(Fe(t))return n.Alias?.(e,t,r)}function nm(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(M(r))e==="key"?r.key=n:r.value=n;else if(yt(r))r.contents=n;else{let s=Fe(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var kP={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},TP=e=>e.replace(/[!,[\]{}]/g,t=>kP[t]),kt=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+TP(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={};ze(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
|
-
`)}};
|
|
80
|
-
`)?
|
|
77
|
+
`))l.pop();else{if(!a)throw Zt(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let d=l[c];if(d.length===0)throw Zt(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Zt(i.name,`invalid JSON at line ${c+1}`)}let p=BR(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Zt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Zt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Zt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Ii(e){return(await Jl(e.eventsDir).catch(n=>{if(Ql(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Si.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function DR(e,t,n){let r=await ER(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function _R(e,t){let n=await Ii(e),r=Math.max(0,n.length-t),s=await FR(e),i=await xR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await LR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await AR(a.path,{force:!0});o.length>0&&await jf(e.eventsDir)}async function xR(e){let t=ge(e).runs,n=await Jl(t).catch(s=>{if(Ql(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await is(Si.join(t,s),"utf8"));typeof i.id=="string"&&["pending","running","waiting_for_review"].includes(String(i.state))&&r.add(i.id)}catch{return null}return r}async function FR(e){let t=await Jl(e.commandsDir).catch(r=>{if(Ql(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await is(Si.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 LR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await is(e,"utf8");for(let s of r.split(`
|
|
78
|
+
`))if(s)try{let i=JSON.parse(s);if(typeof i.commandId=="string"&&t.has(i.commandId)||typeof i.furyRunId=="string"&&n.has(i.furyRunId))return!0}catch{return!0}return!1}async function MR(e){let t=(await Ii(e)).at(-1);if(!t)return;let n=await is(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await zl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function jR(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 Hl(t);return xf(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}}):Hl(t);return xf(t,s.sequence,n),s.sequence}function xf(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 qR(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 UR(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 BR(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))||!ar(i.workspaceId)||!ar(i.taskId)||!ar(i.agentTabId)||!ar(i.commandId)||!ar(i.furyRunId)||!ar(i.furyStepId)||!WR(i.actor)||!("data"in i))throw Zt(t,`record at line ${n} has an invalid schema`);return i}function WR(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var ar=e=>e===null||typeof e=="string",Ff=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Zt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Hl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Ql=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Yl(e,t){if(!Number.isSafeInteger(e)||e<1)throw new g("CLI_USAGE",`${t} must be a positive integer.`,{details:{value:e}});return e}async function jf(e){let t=await zl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Bf,readdir as eP,readFile as Wf}from"node:fs/promises";import Vf from"node:path";import{mkdir as qf,readFile as VR,rm as vi,stat as KR,writeFile as GR}from"node:fs/promises";import Zl from"node:path";var HR=20,YR=3e4,zR=5e3;async function ec(e,t){let n=Zl.join(e.runtimeDir,"command-store.lock");await qf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await qf(n);try{await GR(Zl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await vi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!QR(s))throw s;if(await JR(n))continue;if(Date.now()-r>=YR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await ZR(HR)}try{return await t()}finally{await vi(n,{recursive:!0,force:!0})}}async function JR(e){let t=await VR(Zl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return XR(t.pid)?!1:(await vi(e,{recursive:!0,force:!0}),!0);let n=await KR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<zR?!1:(await vi(e,{recursive:!0,force:!0}),!0)}function XR(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var QR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",ZR=e=>new Promise(t=>setTimeout(t,e));async function Ei(e,t){tc(t);try{let n=JSON.parse(await Wf(os(e,t),"utf8"));return Gf(n,os(e,t),t)}catch(n){throw sP(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Ai(t,os(e,t),n):n}}async function Ye(e){await Bf(e.commandsDir,{recursive:!0});let t=await eP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Vf.join(e.commandsDir,r);try{n.push(Gf(JSON.parse(await Wf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Ai(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Kf(e,t){return tc(t.id),ec(e,async()=>{await Bf(e.commandsDir,{recursive:!0});let n=await Ye(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!tP(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await B(os(e,t.id),t),{command:t,created:!0}})}async function as(e,t,n){return tc(t),ec(e,async()=>{let r=await Ei(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await B(os(e,t),s),s})}function tP(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(!Ci(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Ai("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||!Ci(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!rP(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!lr(e.expiresAt)||!lr(e.createdAt)||!lr(e.updatedAt)||e.deliveryStartedAt!==null&&!lr(e.deliveryStartedAt)||e.deliveredAt!==null&&!lr(e.deliveredAt)||e.cancelledAt!==null&&!lr(e.cancelledAt)||e.cancelledBy!==null&&!Uf(e.cancelledBy)||!Uf(e.actor)||!nP(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 Ai(r,t);return e}function Uf(e){return!Ci(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 nP(e){return e===null||Ci(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var os=(e,t)=>Vf.join(e.commandsDir,`${t}.json`),tc=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},lr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),rP=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}),Ci=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),sP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Ai=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Hf(e,t=new Date){return Oi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Yf(e,t=new Date){return e.state==="delivered"?e:(Oi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function zf(e,t,n=new Date){return e.state==="failed"?e:(Oi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Jf(e,t,n=new Date){return e.state==="cancelled"?e:(Oi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Oi(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 iP}from"node:crypto";var nc=32*1024,Xf=1440*60*1e3,rc=256,oP=["delivered","failed","cancelled"],sc={type:"system",component:"orchestration-supervisor"};async function aP(e,t){if(hP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Xf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Xf}});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)>rc)throw new g("CLI_USAGE",`Idempotency key exceeds ${rc} characters.`,{details:{maxIdempotencyKeyLength:rc}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${iP()}`,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 Kf(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw Qf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function lP(e,t){return{kind:"showPromptCommand",command:await Ei(e,t)}}async function cP(e,t){let n=await Ye(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function uP(e,t,n){let r=!1,s=await as(e,t,i=>{if(i.state==="cancelled")return i;let o=Jf(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Qf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function dP(e,t){let n=await as(e,t,r=>Hf(r));return await vn(e,n,"command.delivering",sc),n}async function pP(e,t){let n=await as(e,t,r=>Yf(r));return await vn(e,n,"command.delivered",sc),n}async function fP(e,t,n){let r=await as(e,t,s=>zf(s,n));return await vn(e,r,"command.failed",sc),r}async function mP(e,t,n){let r=[...n.states??oP],s=Date.now()+n.timeoutMs;for(;;){let i=await Ei(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 gP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function hP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>nc)throw new g("CLI_USAGE",`Prompt exceeds the ${nc}-byte limit.`,{details:{maxPromptBytes:nc,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new g("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await Fe(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function gP(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 Qf=(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:aP,show:lP,list:cP,cancel:uP,wait:mP,beginDelivery:dP,completeDelivery:pP,fail:fP};import{randomUUID as em,timingSafeEqual as yP}from"node:crypto";import{mkdir as wP,readFile as kP,readdir as TP}from"node:fs/promises";import tm from"node:path";var bP=10080*60*1e3,RP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},PP=["task.create-child","task.children","task.cancel-tree"],SP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function tt(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await wP(lc(e),{recursive:!0,mode:448}),await G(e,t.id,async o=>{let a=o.ptyTabs.find(u=>u.id===s.id&&u.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${em()}`,c=await $i(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new g("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await IP(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 IP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${em()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...PP],targetPolicy:"children-only",limits:{...RP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+bP).toISOString(),revokedAt:null,revokedBy:null};return await B(cc(e,o.id),o,{mode:384}),o}async function ze(e,t,n,r){let s=await CP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!SP.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await vP(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 vP(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 nm(e,t,n){let r=await $i(e,t);r&&(r.revokedAt||await B(cc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function ac(e,t,n){let r=await TP(lc(e)).catch(i=>rm(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await $i(e,o[1]);!a||!t.has(a.taskId)||(await nm(e,a.id,n),s.push(a.id))}return s}async function CP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Cn("<redacted>","token is invalid");let s=await $i(e,r);if(!s)throw new g("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!yP(i,o))&&Cn(r,"token is invalid"),s}async function $i(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await kP(cc(e,t),"utf8"));if(!AP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(rm(n))return null;throw n}}function AP(e,t){if(!oc(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"&&EP(r))&&e.targetPolicy==="children-only"&&oc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&ic(e.createdAt)&&ic(e.expiresAt)&&Zf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||ic(e.revokedAt)&&Zf(e.revokedBy))}function Zf(e){return oc(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}function Cn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var lc=e=>tm.join(e.orchestrationDir,"capabilities"),cc=(e,t)=>tm.join(lc(e),`${t}.json`),EP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),oc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ic=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),rm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as sm,readFile as OP,rm as uc,stat as $P,writeFile as NP}from"node:fs/promises";import dc from"node:path";var DP=20,_P=3e4,xP=5e3;async function pc(e,t){let n=dc.join(e.runtimeDir,"delegation.lock");await sm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await sm(n);try{await NP(dc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await uc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!MP(s))throw s;if(await FP(n))continue;if(Date.now()-r>=_P)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,DP))}try{return await t()}finally{await uc(n,{recursive:!0,force:!0})}}async function FP(e){let t=await OP(dc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&LP(t.pid))return!1;let n=await $P(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<xP?!1:(await uc(e,{recursive:!0,force:!0}),!0)}function LP(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 MP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var jP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function fc(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 tt(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function mc(e,t,n={}){return pc(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await ze(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??jP,a=qP(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&&Ni("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Ni("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(!UP(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 im(y,!0)}}u.length>=o.maxChildren&&Ni("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Ni("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await tt(e,y,i)})}),m=await S.getTask(e,f.taskId);try{await Fe(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return im(m,!1)})}async function hc(e,t,n){n&&await ze(e,n,"task.children",t),await S.getTask(e,t);let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function gc(e,t,n){return pc(e,async()=>{let s=(n?await ze(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,d=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await ac(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){u.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,f,{preserveWorktree:!0});let y=await S.closeTask(e,f.id);u.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await Fe(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function im(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 qP(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 UP(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Ni(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Di=Symbol.for("yaml.alias"),_i=Symbol.for("yaml.document"),nt=Symbol.for("yaml.map"),yc=Symbol.for("yaml.pair"),Le=Symbol.for("yaml.scalar"),Dt=Symbol.for("yaml.seq"),ve=Symbol.for("yaml.node.type"),Me=e=>!!e&&typeof e=="object"&&e[ve]===Di,kt=e=>!!e&&typeof e=="object"&&e[ve]===_i,rt=e=>!!e&&typeof e=="object"&&e[ve]===nt,M=e=>!!e&&typeof e=="object"&&e[ve]===yc,x=e=>!!e&&typeof e=="object"&&e[ve]===Le,st=e=>!!e&&typeof e=="object"&&e[ve]===Dt;function W(e){if(e&&typeof e=="object")switch(e[ve]){case nt:case Dt:return!0}return!1}function U(e){if(e&&typeof e=="object")switch(e[ve]){case Di:case nt:case Le:case Dt:return!0}return!1}var xi=e=>(x(e)||W(e))&&!!e.anchor;var Ne=Symbol("break visit"),om=Symbol("skip children"),Tt=Symbol("remove node");function Je(e,t){let n=am(t);kt(e)?cr(null,e.contents,n,Object.freeze([e]))===Tt&&(e.contents=null):cr(null,e,n,Object.freeze([]))}Je.BREAK=Ne;Je.SKIP=om;Je.REMOVE=Tt;function cr(e,t,n,r){let s=lm(e,t,n,r);if(U(s)||M(s))return cm(e,r,s),cr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=cr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ne)return Ne;o===Tt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=cr("key",t.key,n,r);if(i===Ne)return Ne;i===Tt&&(t.key=null);let o=cr("value",t.value,n,r);if(o===Ne)return Ne;o===Tt&&(t.value=null)}}return s}async function Fi(e,t){let n=am(t);kt(e)?await ur(null,e.contents,n,Object.freeze([e]))===Tt&&(e.contents=null):await ur(null,e,n,Object.freeze([]))}Fi.BREAK=Ne;Fi.SKIP=om;Fi.REMOVE=Tt;async function ur(e,t,n,r){let s=await lm(e,t,n,r);if(U(s)||M(s))return cm(e,r,s),ur(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await ur(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ne)return Ne;o===Tt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await ur("key",t.key,n,r);if(i===Ne)return Ne;i===Tt&&(t.key=null);let o=await ur("value",t.value,n,r);if(o===Ne)return Ne;o===Tt&&(t.value=null)}}return s}function am(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 lm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(rt(t))return n.Map?.(e,t,r);if(st(t))return n.Seq?.(e,t,r);if(M(t))return n.Pair?.(e,t,r);if(x(t))return n.Scalar?.(e,t,r);if(Me(t))return n.Alias?.(e,t,r)}function cm(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(M(r))e==="key"?r.key=n:r.value=n;else if(kt(r))r.contents=n;else{let s=Me(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var BP={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},WP=e=>e.replace(/[!,[\]{}]/g,t=>BP[t]),bt=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+WP(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={};Je(t.contents,(o,a)=>{U(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
|
|
79
|
+
`)}};bt.defaultYaml={explicit:!1,version:"1.2"};bt.defaultTags={"!!":"tag:yaml.org,2002:"};function Li(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 wc(e){let t=new Set;return Je(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function kc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function um(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=wc(e));let o=kc(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(x(o.node)||W(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function en(e,t,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s<i;++s){let o=r[s],a=en(e,r,String(s),o);a===void 0?delete r[s]:a!==o&&(r[s]=a)}else if(r instanceof Map)for(let s of Array.from(r.keys())){let i=r.get(s),o=en(e,r,s,i);o===void 0?r.delete(s):o!==i&&r.set(s,o)}else if(r instanceof Set)for(let s of Array.from(r)){let i=en(e,r,s,s);i===void 0?r.delete(s):i!==s&&(r.delete(s),r.add(i))}else for(let[s,i]of Object.entries(r)){let o=en(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function le(e,t,n){if(Array.isArray(e))return e.map((r,s)=>le(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!xi(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=e.toJSON(t,n);return n.onCreate&&n.onCreate(s),s}return typeof e=="bigint"&&!n?.keep?Number(e):e}var tn=class{constructor(t){Object.defineProperty(this,ve,{value:t})}clone(){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(t.range=this.range.slice()),t}toJS(t,{mapAsMap:n,maxAliasCount:r,onAnchor:s,reviver:i}={}){if(!kt(t))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:t,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=le(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?en(i,{"":a},"",a):a}};var _t=class extends tn{constructor(t){super(Di),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=[],Je(t,{Node:(i,o)=>{(Me(o)||xi(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=Mi(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(Li(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 Mi(e,t,n){if(Me(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(W(t)){let r=0;for(let s of t.items){let i=Mi(e,s,n);i>r&&(r=i)}return r}else if(M(t)){let r=Mi(e,t.key,n),s=Mi(e,t.value,n);return Math.max(r,s)}return 1}var ji=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends tn{constructor(t){super(Le),this.value=t}toJSON(t,n){return n?.keep?this.value:le(this.value,t,n)}toString(){return String(this.value)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var VP="tag:yaml.org,2002:";function KP(e,t,n){if(t){let r=n.filter(i=>i.tag===t),s=r.find(i=>!i.format)??r[0];if(!s)throw new Error(`Tag ${t} not found`);return s}return n.find(r=>r.identify?.(e)&&!r.format)}function xt(e,t,n){if(kt(e)&&(e=e.contents),U(e))return e;if(M(e)){let u=n.schema[nt].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 _t(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=VP+t.slice(2));let c=KP(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new O(e);return l&&(l.node=u),u}c=e instanceof Map?o[nt]:Symbol.iterator in Object(e)?o[Dt]:o[nt]}i&&(i(c),delete n.onTagObj);let d=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new O(e);return t?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function ls(e,t,n){let r=n;for(let s=t.length-1;s>=0;--s){let i=t[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return xt(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var pr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,dr=class extends tn{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>U(r)||M(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(pr(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(W(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,ls(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(W(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&x(i)?i.value:i:W(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!M(n))return!1;let r=n.value;return r==null||t&&x(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(t){let[n,...r]=t;if(r.length===0)return this.has(n);let s=this.get(n,!0);return W(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(W(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,ls(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var dm=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Xe(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var Rt=(e,t,n)=>e.endsWith(`
|
|
80
|
+
`)?Xe(n,t):n.includes(`
|
|
81
81
|
`)?`
|
|
82
|
-
`+
|
|
83
|
-
`)n===
|
|
82
|
+
`+Xe(n,t):(e.endsWith(" ")?"":" ")+n;var Tc="flow",qi="block",cs="quoted";function us(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,h,f=!1,m=-1,y=-1,T=-1;n===qi&&(m=pm(e,m,t.length),m!==-1&&(u=m+l));for(let b;b=e[m+=1];){if(n===cs&&b==="\\"){switch(y=m,e[m+1]){case"x":m+=3;break;case"u":m+=5;break;case"U":m+=9;break;default:m+=1}T=m}if(b===`
|
|
83
|
+
`)n===qi&&(m=pm(e,m,t.length)),u=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
|
|
84
84
|
`&&h!==" "){let $=e[m+1];$&&$!==" "&&$!==`
|
|
85
|
-
`&&$!==" "&&(p=m)}if(m>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===
|
|
86
|
-
${t}${e.slice(0,
|
|
87
|
-
${t}${e.slice($+1,
|
|
88
|
-
`);r=t,s=t+1,i=e[s]}return r}var
|
|
89
|
-
`){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function
|
|
85
|
+
`&&$!==" "&&(p=m)}if(m>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===cs){for(;h===" "||h===" ";)h=b,b=e[m+=1],f=!0;let $=m>T+1?m-2:y-1;if(d[$])return e;c.push($),d[$]=!0,u=$+l,p=void 0}else f=!0}h=b}if(f&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let b=0;b<c.length;++b){let $=c[b],N=c[b+1]||e.length;$===0?R=`
|
|
86
|
+
${t}${e.slice(0,N)}`:(n===cs&&d[$]&&(R+=`${e[$]}\\`),R+=`
|
|
87
|
+
${t}${e.slice($+1,N)}`)}return R}function pm(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 Bi=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Wi=e=>/^(%|---|\.\.\.)/m.test(e);function GP(e,t,n){if(!t||t<0)return!1;let r=t-n,s=e.length;if(s<=r)return!1;for(let i=0,o=0;i<s;++i)if(e[i]===`
|
|
89
|
+
`){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function ds(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Wi(e)?" ":""),o="",a=0;for(let l=0,c=n[l];c;c=n[++l])if(c===" "&&n[l+1]==="\\"&&n[l+2]==="n"&&(o+=n.slice(a,l)+"\\ ",l+=1,a=l,c="\\"),c==="\\")switch(n[l+1]){case"u":{o+=n.slice(a,l);let d=n.substr(l+2,4);switch(d){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:d.substr(0,2)==="00"?o+="\\x"+d.substr(2):o+=n.substr(l,6)}l+=5,a=l+1}break;case"n":if(r||n[l+2]==='"'||n.length<s)l+=1;else{for(o+=n.slice(a,l)+`
|
|
90
90
|
|
|
91
91
|
`;n[l+2]==="\\"&&n[l+3]==="n"&&n[l+4]!=='"';)o+=`
|
|
92
|
-
`,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:
|
|
93
|
-
`)||/[ \t]\n|\n[ \t]/.test(e))return
|
|
94
|
-
${n}`)+"'";return t.implicitKey?r:
|
|
92
|
+
`,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:us(o,i,cs,Bi(t,!1))}function bc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
|
|
93
|
+
`)||/[ \t]\n|\n[ \t]/.test(e))return ds(e,t);let n=t.indent||(Wi(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
|
|
94
|
+
${n}`)+"'";return t.implicitKey?r:us(r,n,Tc,Bi(t,!1))}function fr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=ds;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=bc:i&&!s?r=ds:r=n?bc:ds}return r(e,t)}var Rc;try{Rc=new RegExp(`(^|(?<!
|
|
95
95
|
))
|
|
96
96
|
+(?!
|
|
97
|
-
|$)`,"g")}catch{
|
|
97
|
+
|$)`,"g")}catch{Rc=/\n+(?!\n|$)/g}function Ui({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return fr(n,r);let c=r.indent||(r.forceBlockIndent||Wi(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!GP(n,l,c.length);if(!n)return d?`|
|
|
98
98
|
`:`>
|
|
99
|
-
`;let u,p;for(p=n.length;p>0;--p){let
|
|
100
|
-
`&&
|
|
99
|
+
`;let u,p;for(p=n.length;p>0;--p){let N=n[p-1];if(N!==`
|
|
100
|
+
`&&N!==" "&&N!==" ")break}let h=n.substring(p),f=h.indexOf(`
|
|
101
101
|
`);f===-1?u="-":n===h||f!==h.length-1?(u="+",i&&i()):u="",h&&(n=n.slice(0,-h.length),h[h.length-1]===`
|
|
102
|
-
`&&(h=h.slice(0,-1)),h=h.replace(
|
|
103
|
-
`)
|
|
104
|
-
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),
|
|
105
|
-
${c}${
|
|
106
|
-
${c}${R}${n}${h}`}function
|
|
107
|
-
`)||d&&/[[\]{},]/.test(i))return
|
|
108
|
-
`)?
|
|
109
|
-
`))return
|
|
110
|
-
${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(u),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return
|
|
111
|
-
${t.indent}${a}`:a}function
|
|
112
|
-
${a}:`):(y=`${y}:`,p&&(y+=
|
|
113
|
-
`:"",R){let
|
|
114
|
-
${
|
|
115
|
-
`&&b&&(
|
|
102
|
+
`&&(h=h.slice(0,-1)),h=h.replace(Rc,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let N=n[y];if(N===" ")m=!0;else if(N===`
|
|
103
|
+
`)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let $=(m?c?"2":"1":"")+u;if(e&&($+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let N=n.replace(/\n+/g,`
|
|
104
|
+
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,_=Bi(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let A=us(`${R}${N}${h}`,c,qi,_);if(!D)return`>${$}
|
|
105
|
+
${c}${A}`}return n=n.replace(/\n+/g,`$&${c}`),`|${$}
|
|
106
|
+
${c}${R}${n}${h}`}function HP(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 fr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
|
|
108
|
+
`)?fr(i,t):Ui(e,t,n,r);if(!a&&!d&&s!==O.PLAIN&&i.includes(`
|
|
109
|
+
`))return Ui(e,t,n,r);if(Wi(i)){if(l==="")return t.forceBlockIndent=!0,Ui(e,t,n,r);if(a&&l===c)return fr(i,t)}let u=i.replace(/\n+/g,`$&
|
|
110
|
+
${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(u),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return fr(i,t)}return a?u:us(u,l,Tc,Bi(t,!1))}function An(e,t,n,r){let{implicitKey:s,inFlow:i}=t,o=typeof e.value=="string"?e:Object.assign({},e,{value:String(e.value)}),{type:a}=e;a!==O.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=O.QUOTE_DOUBLE);let l=d=>{switch(d){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?fr(o.value,t):Ui(o,t,n,r);case O.QUOTE_DOUBLE:return ds(o.value,t);case O.QUOTE_SINGLE:return bc(o.value,t);case O.PLAIN:return HP(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 Vi(e,t){let n=Object.assign({blockQuote:!0,commentString:dm,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 YP(e,t){if(t.tag){let s=e.filter(i=>i.tag===t.tag);if(s.length>0)return s.find(i=>i.format===t.format)??s[0]}let n,r;if(x(t)){r=t.value;let s=e.filter(i=>i.identify?.(r));if(s.length>1){let i=s.filter(o=>o.test);i.length>0&&(s=i)}n=s.find(i=>i.format===t.format)??s.find(i=>!i.format)}else r=t,n=e.find(s=>s.nodeClass&&r instanceof s.nodeClass);if(!n){let s=r?.constructor?.name??(r===null?"null":typeof r);throw new Error(`Tag not resolved for ${s} value`)}return n}function zP(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||W(e))&&e.anchor;i&&Li(i)&&(n.add(i),s.push(`&${i}`));let o=e.tag??(t.default?null:t.tag);return o&&s.push(r.directives.tagString(o)),s.join(" ")}function Ft(e,t,n,r){if(M(e))return e.toString(t,n,r);if(Me(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=U(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=YP(t.doc.schema.tags,i));let o=zP(i,s,t);o.length>0&&(t.indentAtStart=(t.indentAtStart??0)+o.length+1);let a=typeof s.stringify=="function"?s.stringify(i,t,n,r):x(i)?An(i,t,n,r):i.toString(t,n,r);return o?x(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
|
|
111
|
+
${t.indent}${a}`:a}function fm({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=U(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!U(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!u&&(!e||p&&t==null&&!n.inFlow||W(e)||(x(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(u||!i),indent:a+l});let f=!1,m=!1,y=Ft(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return f&&r&&r(),y===""?"?":h?`? ${y}`:y}else if(i&&!u||t==null&&h)return y=`? ${y}`,p&&!f?y+=Rt(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=Rt(y,n.indent,c(p))),y=`? ${y}
|
|
112
|
+
${a}:`):(y=`${y}:`,p&&(y+=Rt(y,n.indent,c(p))));let T,R,b;U(t)?(T=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(T=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&x(t)&&(n.indentAtStart=y.length+1),m=!1,!d&&l.length>=2&&!n.inFlow&&!h&&st(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=Ft(t,n,()=>$=!0,()=>m=!0),D=" ";if(p||T||R){if(D=T?`
|
|
113
|
+
`:"",R){let _=c(R);D+=`
|
|
114
|
+
${Xe(_,n.indent)}`}N===""&&!n.inFlow?D===`
|
|
115
|
+
`&&b&&(D=`
|
|
116
116
|
|
|
117
|
-
`):
|
|
118
|
-
${n.indent}`}else if(!h&&W(t)){let
|
|
119
|
-
`),w=
|
|
120
|
-
${n.indent}`)}}else(
|
|
121
|
-
`)&&(
|
|
117
|
+
`):D+=`
|
|
118
|
+
${n.indent}`}else if(!h&&W(t)){let _=N[0],A=N.indexOf(`
|
|
119
|
+
`),w=A!==-1,Se=n.inFlow??t.flow??t.items.length===0;if(w||!Se){let ye=!1;if(w&&(_==="&"||_==="!")){let z=N.indexOf(" ");_==="&"&&z!==-1&&z<A&&N[z+1]==="!"&&(z=N.indexOf(" ",z+1)),(z===-1||A<z)&&(ye=!0)}ye||(D=`
|
|
120
|
+
${n.indent}`)}}else(N===""||N[0]===`
|
|
121
|
+
`)&&(D="");return y+=D+N,n.inFlow?$&&r&&r():b&&!$?y+=Rt(y,n.indent,c(b)):m&&s&&s(),y}function Pc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Ki="<<",it={identify:e=>e===Ki||typeof e=="symbol"&&e.description===Ki,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Ki)),{addToJSMap:Ic}),stringify:()=>Ki},mm=(e,t)=>(it.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&&it.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===it.tag&&n.default);function Ic(e,t,n){let r=hm(e,n);if(st(r))for(let s of r.items)Sc(e,t,s);else if(Array.isArray(r))for(let s of r)Sc(e,t,s);else Sc(e,t,r)}function Sc(e,t,n){let r=hm(e,n);if(!rt(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 hm(e,t){return e&&Me(t)?t.resolve(e.doc,e):t}function Gi(e,t,{key:n,value:r}){if(U(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(mm(e,n))Ic(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=JP(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 JP(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(U(e)&&n?.doc){let r=Vi(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)+'..."'),Pc(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${i}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return s}return JSON.stringify(t)}function mr(e,t,n){let r=xt(e,void 0,n),s=xt(t,void 0,n);return new ee(r,s)}var ee=class e{constructor(t,n=null){Object.defineProperty(this,ve,{value:yc}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return U(n)&&(n=n.clone(t)),U(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return Gi(n,r,this)}toString(t,n,r){return t?.doc?fm(this,t,n,r):JSON.stringify(this)}};function Yi(e,t,n){return(t.inFlow??e.flow?QP:XP)(e,t,n)}function XP({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,d=Object.assign({},n,{indent:i,type:null}),u=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],y=null;if(U(m))!u&&m.spaceBefore&&p.push(""),Hi(n,p,m.commentBefore,u),m.comment&&(y=m.comment);else if(M(m)){let R=U(m.key)?m.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Hi(n,p,R.commentBefore,u))}u=!1;let T=Ft(m,d,()=>y=null,()=>u=!0);y&&(T+=Rt(T,i,c(y))),u&&y&&(u=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
|
|
122
122
|
${l}${m}`:`
|
|
123
123
|
`}}return e?(h+=`
|
|
124
|
-
`+
|
|
125
|
-
`)),f<e.length-1?
|
|
124
|
+
`+Xe(c(e),l),a&&a()):u&&o&&o(),h}function QP({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,d=0,u=[];for(let f=0;f<e.length;++f){let m=e[f],y=null;if(U(m))m.spaceBefore&&u.push(""),Hi(t,u,m.commentBefore,!1),m.comment&&(y=m.comment);else if(M(m)){let R=U(m.key)?m.key:null;R&&(R.spaceBefore&&u.push(""),Hi(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=U(m.value)?m.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=Ft(m,l,()=>y=null);c||(c=u.length>d||T.includes(`
|
|
125
|
+
`)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=Rt(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:h}=n;if(u.length===0)return p+h;if(!c){let f=u.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of u)f+=m?`
|
|
126
126
|
${i}${s}${m}`:`
|
|
127
127
|
`;return`${f}
|
|
128
|
-
${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function
|
|
129
|
-
`:" ")}return
|
|
128
|
+
${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function Hi({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Xe(t(r),e);n.push(i.trimStart())}}function nn(e,t){let n=x(t)?t.value:t;for(let r of e)if(M(r)&&(r.key===t||r.key===n||x(r.key)&&r.key.value===n))return r}var re=class extends dr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(nt,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(mr(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;M(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new ee(t,t?.value):r=new ee(t.key,t.value);let s=nn(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&ji(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=nn(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=nn(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!nn(this.items,t)}set(t,n){this.add(new ee(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)Gi(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})),Yi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var ot={collection:"map",default:!0,nodeClass:re,tag:"tag:yaml.org,2002:map",resolve(e,t){return rt(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>re.from(e,t,n)};var be=class extends dr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Dt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=zi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=zi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=zi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=zi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&ji(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?Yi(this,t,{blockItemPrefix:"- ",flowChars:{start:"[",end:"]"},itemIndent:(t.indent||"")+" ",onChompKeep:r,onComment:n}):JSON.stringify(this)}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n)){let o=0;for(let a of n){if(typeof s=="function"){let l=n instanceof Set?a:String(o++);a=s.call(n,l,a)}i.items.push(xt(a,void 0,r))}}return i}};function zi(e){let t=x(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var at={collection:"seq",default:!0,nodeClass:be,tag:"tag:yaml.org,2002:seq",resolve(e,t){return st(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>be.from(e,t,n)};var rn={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),An(e,t,n,r)}};var En={identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&En.test.test(e)?e:t.options.nullStr};var ps={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new O(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&ps.test.test(e)){let r=e[0]==="t"||e[0]==="T";if(t===r)return e}return t?n.options.trueStr:n.options.falseStr}};function Re({format:e,minFractionDigits:t,tag:n,value:r}){if(typeof r=="bigint")return String(r);let s=typeof r=="number"?r:Number(r);if(!isFinite(s))return isNaN(s)?".nan":s<0?"-.inf":".inf";let i=Object.is(r,-0)?"-0":JSON.stringify(r);if(!e&&t&&(!n||n==="tag:yaml.org,2002:float")&&/^-?\d/.test(i)&&!i.includes("e")){let o=i.indexOf(".");o<0&&(o=i.length,i+=".");let a=t-(i.length-o-1);for(;a-- >0;)i+="0"}return i}var Ji={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Re},Xi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():Re(e)}},Qi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new O(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:Re};var Zi=e=>typeof e=="bigint"||Number.isInteger(e),vc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function gm(e,t,n){let{value:r}=e;return Zi(r)&&r>=0?n+r.toString(t):Re(e)}var eo={identify:e=>Zi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>vc(e,2,8,n),stringify:e=>gm(e,8,"0o")},to={identify:Zi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>vc(e,0,10,n),stringify:Re},no={identify:e=>Zi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>vc(e,2,16,n),stringify:e=>gm(e,16,"0x")};var ym=[ot,at,rn,En,ps,eo,to,no,Ji,Xi,Qi];function wm(e){return typeof e=="bigint"||Number.isInteger(e)}var ro=({value:e})=>JSON.stringify(e),ZP=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:ro},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:ro},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:ro},{identify:wm,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})=>wm(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:ro}],eS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},km=[ot,at].concat(ZP,eS);var fs={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=O.BLOCK_LITERAL),t!==O.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),d=new Array(c);for(let u=0,p=0;u<c;++u,p+=l)d[u]=a.substr(p,l);a=d.join(t===O.BLOCK_LITERAL?`
|
|
129
|
+
`:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function Cc(e,t){if(st(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!M(r)){if(rt(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new ee(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
|
|
130
130
|
${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment}
|
|
131
|
-
${i.comment}`:r.comment}r=s}e.items[n]=M(r)?r:new
|
|
132
|
-
`)?(n.push("..."),n.push(
|
|
131
|
+
${i.comment}`:r.comment}r=s}e.items[n]=M(r)?r:new ee(r)}}else t("Expected a sequence for this tag");return e}function Ac(e,t,n){let{replacer:r}=n,s=new be(e);s.tag="tag:yaml.org,2002:pairs";let i=0;if(t&&Symbol.iterator in Object(t))for(let o of t){typeof r=="function"&&(o=r.call(t,String(i++),o));let a,l;if(Array.isArray(o))if(o.length===2)a=o[0],l=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let c=Object.keys(o);if(c.length===1)a=c[0],l=o[a];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else a=o;s.items.push(mr(a,l,n))}return s}var ms={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Cc,createNode:Ac};var hr=class e extends be{constructor(){super(),this.add=re.prototype.add.bind(this),this.delete=re.prototype.delete.bind(this),this.get=re.prototype.get.bind(this),this.has=re.prototype.has.bind(this),this.set=re.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(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=Ac(t,n,r),i=new this;return i.items=s.items,i}};hr.tag="tag:yaml.org,2002:omap";var hs={collection:"seq",identify:e=>e instanceof Map,nodeClass:hr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=Cc(e,t),r=[];for(let{key:s}of n.items)x(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new hr,n)},createNode:(e,t,n)=>hr.from(e,t,n)};function Tm({value:e,source:t},n){return t&&(e?Ec:Oc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Ec={identify:e=>e===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new O(!0),stringify:Tm},Oc={identify:e=>e===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new O(!1),stringify:Tm};var bm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Re},Rm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,"")),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():Re(e)}},Pm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new O(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:Re};var gs=e=>typeof e=="bigint"||Number.isInteger(e);function so(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 $c(e,t,n){let{value:r}=e;if(gs(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Re(e)}var Sm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>so(e,2,2,n),stringify:e=>$c(e,2,"0b")},Im={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>so(e,1,8,n),stringify:e=>$c(e,8,"0")},vm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>so(e,0,10,n),stringify:Re},Cm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>so(e,2,16,n),stringify:e=>$c(e,16,"0x")};var gr=class e extends re{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 ee(t.key,null):n=new ee(t,null),nn(this.items,n.key)||this.items.push(n)}get(t,n){let r=nn(this.items,t);return!n&&M(r)?x(r.key)?r.key.value:r.key:r}set(t,n){if(typeof n!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof n}`);let r=nn(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new ee(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(mr(o,null,r));return i}};gr.tag="tag:yaml.org,2002:set";var ys={collection:"map",identify:e=>e instanceof Set,nodeClass:gr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>gr.from(e,t,n),resolve(e,t){if(rt(e)){if(e.hasAllNullValues(!0))return Object.assign(new gr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Nc(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 Am(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return Re(e);let r="";t<0&&(r="-",t*=n(-1));let s=n(60),i=[t%s];return t<60?i.unshift(0):(t=(t-i[0])/s,i.unshift(t%s),t>=60&&(t=(t-i[0])/s,i.unshift(t))),r+i.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var io={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})=>Nc(e,n),stringify:Am},oo={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=>Nc(e,!1),stringify:Am},yr={identify:e=>e instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(e){let t=e.match(yr.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),d=t[8];if(d&&d!=="Z"){let u=Nc(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 Dc=[ot,at,rn,En,Ec,Oc,Sm,Im,vm,Cm,bm,Rm,Pm,fs,it,hs,ms,ys,io,oo,yr];var Em=new Map([["core",ym],["failsafe",[ot,at,rn]],["json",km],["yaml11",Dc],["yaml-1.1",Dc]]),Om={binary:fs,bool:ps,float:Qi,floatExp:Xi,floatNaN:Ji,floatTime:oo,int:to,intHex:no,intOct:eo,intTime:io,map:ot,merge:it,null:En,omap:hs,pairs:ms,seq:at,set:ys,timestamp:yr},$m={"tag:yaml.org,2002:binary":fs,"tag:yaml.org,2002:merge":it,"tag:yaml.org,2002:omap":hs,"tag:yaml.org,2002:pairs":ms,"tag:yaml.org,2002:set":ys,"tag:yaml.org,2002:timestamp":yr};function ao(e,t,n){let r=Em.get(t);if(r&&!e)return n&&!r.includes(it)?r.concat(it):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(Em.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(it)),s.reduce((i,o)=>{let a=typeof o=="string"?Om[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(Om).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 tS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ws=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?ao(t,"compat"):t?ao(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?$m:{},this.tags=ao(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,nt,{value:ot}),Object.defineProperty(this,Le,{value:rn}),Object.defineProperty(this,Dt,{value:at}),this.sortMapEntries=typeof o=="function"?o:o===!0?tS: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=Vi(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Xe(l,""))}let o=!1,a=null;if(e.contents){if(U(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let d=i(e.contents.commentBefore);n.push(Xe(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Ft(e.contents,s,()=>a=null,l);a&&(c+=Rt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Ft(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
|
|
132
|
+
`)?(n.push("..."),n.push(Xe(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(Xe(i(l),"")))}return n.join(`
|
|
133
133
|
`)+`
|
|
134
|
-
`}var
|
|
134
|
+
`}var sn=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,ve,{value:_i});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 bt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[ve]:{value:_i}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=U(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){wr(this.contents)&&this.contents.add(t)}addIn(t,n){wr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=wc(this);t.anchor=!n||r.has(n)?kc(n||"a",r):n}return new _t(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:d}=r??{},{onAnchor:u,setAnchors:p,sourceObjects:h}=um(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=xt(t,d,f);return a&&W(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new ee(s,i)}delete(t){return wr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return pr(t)?this.contents==null?!1:(this.contents=null,!0):wr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return W(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return pr(t)?!n&&x(this.contents)?this.contents.value:this.contents:W(this.contents)?this.contents.getIn(t,n):void 0}has(t){return W(this.contents)?this.contents.has(t):!1}hasIn(t){return pr(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=ls(this.schema,[t],n):wr(this.contents)&&this.contents.set(t,n)}setIn(t,n){pr(t)?this.contents=n:this.contents==null?this.contents=ls(this.schema,Array.from(t),n):wr(this.contents)&&this.contents.setIn(t,n)}setSchema(t,n={}){typeof t=="number"&&(t=String(t));let r;switch(t){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new bt({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 bt({version:t}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(t);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new ws(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=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"?en(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return Nm(this,t)}};function wr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ks=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},lt=class extends ks{constructor(t,n,r){super("YAMLParseError",t,n,r)}},Ts=class extends ks{constructor(t,n,r){super("YAMLWarning",t,n,r)}},_c=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>t.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
|
|
135
135
|
`),o=a+o}if(/[^ ]/.test(o)){let a=1,l=n.linePos[1];l?.line===r&&l.col>s&&(a=Math.max(1,Math.min(l.col-s,80-i)));let c=" ".repeat(i)+"^".repeat(a);n.message+=`:
|
|
136
136
|
|
|
137
137
|
${o}
|
|
138
138
|
${c}
|
|
139
|
-
`}};function
|
|
140
|
-
`))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(
|
|
141
|
-
`+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||
|
|
142
|
-
`+b.comment:R.comment=b.comment);let $=new
|
|
143
|
-
`+
|
|
144
|
-
`+
|
|
145
|
-
`+w.comment:
|
|
146
|
-
`+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function
|
|
147
|
-
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let m=0;m<a;++m){let[y,
|
|
148
|
-
`;for(let m=d;m<a;++m){let[y,
|
|
149
|
-
`):y.length>l||
|
|
139
|
+
`}};function Pt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,b=null,$=null,N=null;for(let A of e)switch(f&&(A.type!=="space"&&A.type!=="newline"&&A.type!=="comma"&&i(A.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&A.type!=="comment"&&A.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),A.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&A.source.includes(" ")&&(m=A),d=!0;break;case"comment":{d||i(A,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=A.source.substring(1)||" ";u?u+=p+w:u=w,p="",c=!1;break}case"newline":c?u?u+=A.source:(!$||n!=="seq-item-ind")&&(l=!0):p+=A.source,c=!0,h=!0,(y||T)&&(R=A),d=!0;break;case"anchor":y&&i(A,"MULTIPLE_ANCHORS","A node can have at most one anchor"),A.source.endsWith(":")&&i(A.offset+A.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=A,N??(N=A.offset),c=!1,d=!1,f=!0;break;case"tag":{T&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),T=A,N??(N=A.offset),c=!1,d=!1,f=!0;break}case n:(y||T)&&i(A,"BAD_PROP_ORDER",`Anchors and tags must be after the ${A.source} indicator`),$&&i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.source} in ${t??"collection"}`),$=A,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(A,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=A,c=!1,d=!1;break}default:i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.type} token`),c=!1,d=!1}let D=e[e.length-1],_=D?D.offset+D.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:$,spaceBefore:l,comment:u,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:_,start:N??_}}function on(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
|
|
140
|
+
`))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(on(t.key)||on(t.value))return!0}return!1;default:return!0}}function bs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&on(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function lo(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||x(i)&&x(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var Dm="All mapping items must start at the same column";function _m({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??re,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:h,value:f}=d,m=Pt(u,{indicator:"explicit-key-ind",next:p??h?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!m.found;if(y){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",Dm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
|
|
141
|
+
`+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||on(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",Dm);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,u,null,m,s);n.schema.compat&&bs(r.indent,p,s),n.atKey=!1,lo(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=Pt(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(f?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.start<b.found.offset-1024&&s(R.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));let $=f?e(n,f,b,s):t(n,l,h,null,b,s);n.schema.compat&&bs(r.indent,f,s),l=$.range[2];let N=new ee(R,$);n.options.keepSourceTokens&&(N.srcToken=d),a.items.push(N)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),b.comment&&(R.comment?R.comment+=`
|
|
142
|
+
`+b.comment:R.comment=b.comment);let $=new ee(R);n.options.keepSourceTokens&&($.srcToken=d),a.items.push($)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function xm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??be,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:d,value:u}of r.items){let p=Pt(d,{indicator:"seq-item-ind",next:u,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||u)u?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let h=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&bs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function St(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 xc="Block collections are not allowed within flow collections",Fc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Fm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?re:be),c=new l(n.schema);c.flow=!0;let d=n.atRoot;d&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let u=r.offset+r.start.source.length;for(let y=0;y<r.items.length;++y){let T=r.items[y],{start:R,key:b,sep:$,value:N}=T,D=Pt(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!$&&!N){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
|
|
143
|
+
`+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&on(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let _="";e:for(let A of R)switch(A.type){case"comma":case"space":break;case"comment":_=A.source.substring(1);break e;default:break e}if(_){let A=c.items[c.items.length-1];M(A)&&(A=A.value??A.key),A.comment?A.comment+=`
|
|
144
|
+
`+_:A.comment=_,D.comment=D.comment.substring(_.length+1)}}if(!o&&!$&&!D.found){let _=N?e(n,N,D,s):t(n,D.end,$,null,D,s);c.items.push(_),u=_.range[2],Fc(N)&&s(_.range,"BLOCK_IN_FLOW",xc)}else{n.atKey=!0;let _=D.end,A=b?e(n,b,D,s):t(n,_,R,null,D,s);Fc(b)&&s(A.range,"BLOCK_IN_FLOW",xc),n.atKey=!1;let w=Pt($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if($)for(let z of $){if(z===w.found)break;if(z.type==="newline"){s(z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Se=N?e(n,N,w,s):w.found?t(n,w.end,$,null,w,s):null;Se?Fc(N)&&s(Se.range,"BLOCK_IN_FLOW",xc):w.comment&&(A.comment?A.comment+=`
|
|
145
|
+
`+w.comment:A.comment=w.comment);let ye=new ee(A,Se);if(n.options.keepSourceTokens&&(ye.srcToken=T),o){let z=c;lo(n,z.items,A)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),z.items.push(ye)}else{let z=new re(n.schema);z.flow=!0,z.items.push(ye);let gn=(Se??A).range;z.range=[A.range[0],gn[1],gn[2]],c.items.push(z)}u=Se?Se.range[2]:w.end}}let p=o?"}":"]",[h,...f]=r.end,m=u;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=St(f,m,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
|
|
146
|
+
`+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function Lc(e,t,n,r,s,i){let o=n.type==="block-map"?_m(e,t,n,r,i):n.type==="block-seq"?xm(e,t,n,r,i):Fm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Lm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===re.tagName&&a==="map"||o===be.tagName&&a==="seq")return Lc(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),Lc(e,t,n,s,o)}let c=Lc(e,t,n,s,o,l),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=U(d)?d:new O(d);return u.range=c.range,u.tag=o,l?.format&&(u.format=l.format),u}function Mc(e,t,n){let r=t.offset,s=nS(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?O.BLOCK_FOLDED:O.BLOCK_LITERAL,o=t.source?rS(t.source):[],a=o.length;for(let m=o.length-1;m>=0;--m){let y=o[m][1];if(y===""||y==="\r")a=m;else break}if(a===0){let m=s.chomp==="+"&&o.length>0?`
|
|
147
|
+
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let m=0;m<a;++m){let[y,T]=o[m];if(T===""||T==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),d=m,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+T.length+1}for(let m=o.length-1;m>=a;--m)o[m][0].length>l&&(a=m+1);let u="",p="",h=!1;for(let m=0;m<d;++m)u+=o[m][0].slice(l)+`
|
|
148
|
+
`;for(let m=d;m<a;++m){let[y,T]=o[m];c+=y.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&y.length<l){let $=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",$),y=""}i===O.BLOCK_LITERAL?(u+=p+y.slice(l)+T,p=`
|
|
149
|
+
`):y.length>l||T[0]===" "?(p===" "?p=`
|
|
150
150
|
`:!h&&p===`
|
|
151
151
|
`&&(p=`
|
|
152
152
|
|
|
153
|
-
`),u+=p+y.slice(l)+
|
|
154
|
-
`,h=!0):
|
|
153
|
+
`),u+=p+y.slice(l)+T,p=`
|
|
154
|
+
`,h=!0):T===""?p===`
|
|
155
155
|
`?u+=`
|
|
156
156
|
`:p=`
|
|
157
|
-
`:(u+=p+
|
|
157
|
+
`:(u+=p+T,p=" ",h=!1)}switch(s.chomp){case"-":break;case"+":for(let m=a;m<o.length;++m)u+=`
|
|
158
158
|
`+o[m][0].slice(l);u[u.length-1]!==`
|
|
159
159
|
`&&(u+=`
|
|
160
160
|
`);break;default:u+=`
|
|
161
|
-
`}let f=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,f,f]}}function
|
|
161
|
+
`}let f=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,f,f]}}function nS({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let f=Number(h);!o&&f?o=f:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":u+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=h.source.length,d=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),u+=h.source.length;break;default:{let f=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",f);let m=h.source;m&&typeof m=="string"&&(u+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function rS(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 jc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,f)=>n(r+p,h,f);switch(s){case"scalar":a=O.PLAIN,l=sS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=iS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=oS(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=St(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function sS(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}`),Mm(e)}function iS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Mm(e.slice(1,-1)).replace(/''/g,"'")}function Mm(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
|
|
162
162
|
`,"sy"),n=new RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
|
|
163
163
|
`,"sy")}catch{t=/(.*?)[ \t]*\r?\n/sy,n=/[ \t]*(.*?)[ \t]*\r?\n/sy}let r=t.exec(e);if(!r)return e;let s=r[1],i=" ",o=t.lastIndex;for(n.lastIndex=o;r=n.exec(e);)r[1]===""?i===`
|
|
164
164
|
`?s+=i:i=`
|
|
165
|
-
`:(s+=i+r[1],i=" "),o=n.lastIndex;let a=/[ \t]*(.*)/sy;return a.lastIndex=o,r=a.exec(e),s+i+(r?.[1]??"")}function
|
|
165
|
+
`:(s+=i+r[1],i=" "),o=n.lastIndex;let a=/[ \t]*(.*)/sy;return a.lastIndex=o,r=a.exec(e),s+i+(r?.[1]??"")}function oS(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
|
|
166
166
|
`))if(s===`
|
|
167
|
-
`){let{fold:i,offset:o}=
|
|
167
|
+
`){let{fold:i,offset:o}=aS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=lS[i];if(o)n+=o;else if(i===`
|
|
168
168
|
`)for(i=e[r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="\r"&&e[r+1]===`
|
|
169
|
-
`)for(i=e[++r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="x"||i==="u"||i==="U"){let a=i==="x"?2:i==="u"?4:8;n+=
|
|
169
|
+
`)for(i=e[++r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="x"||i==="u"||i==="U"){let a=i==="x"?2:i==="u"?4:8;n+=cS(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
|
|
170
170
|
`&&!(o==="\r"&&e[r+2]===`
|
|
171
|
-
`)&&(n+=r>i?e.slice(i,r+1):s)}else n+=s}return(e[e.length-1]!=='"'||e.length===1)&&t(e.length,"MISSING_CHAR",'Missing closing "quote'),n}function
|
|
171
|
+
`)&&(n+=r>i?e.slice(i,r+1):s)}else n+=s}return(e[e.length-1]!=='"'||e.length===1)&&t(e.length,"MISSING_CHAR",'Missing closing "quote'),n}function aS(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
|
|
172
172
|
`||r==="\r")&&!(r==="\r"&&e[t+2]!==`
|
|
173
173
|
`);)r===`
|
|
174
174
|
`&&(n+=`
|
|
175
|
-
`),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var
|
|
176
|
-
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function
|
|
175
|
+
`),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var lS={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 cS(e,t,n,r){let s=e.substr(t,n),o=s.length===n&&/^[0-9a-fA-F]+$/.test(s)?parseInt(s,16):NaN;try{return String.fromCodePoint(o)}catch{let a=e.substr(t-2,n+2);return r(t-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),a}}function qc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Mc(e,t,r):jc(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[Le]:l?c=uS(e.schema,s,l,n,r):t.type==="scalar"?c=dS(e,s,t,r):c=e.schema[Le];let d;try{let u=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);d=x(u)?u:new O(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new O(s)}return d.range=a,d.source=s,i&&(d.type=i),l&&(d.tag=l),c.format&&(d.format=c.format),o&&(d.comment=o),d}function uS(e,t,n,r,s){if(n==="!")return e[Le];let i=[];for(let a of e.tags)if(!a.collection&&a.tag===n)if(a.default&&a.test)i.push(a);else return a;for(let a of i)if(a.test?.test(t))return a;let o=e.knownTags[n];return o&&!o.collection?(e.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(s(r,"TAG_RESOLVE_FAILED",`Unresolved tag: ${n}`,n!=="tag:yaml.org,2002:str"),e[Le])}function dS({atKey:e,directives:t,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||e&&a.default==="key")&&a.test?.test(r))||n[Le];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[Le];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),d=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",d,!0)}}return o}function jm(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 pS={composeNode:Uc,composeEmptyNode:co};function Uc(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=fS(e,t,r),(a||l)&&r(t,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":c=qc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Lm(pS,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=co(e,t.offset,void 0,null,n,r)),a&&c.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&e.options.stringKeys&&(!x(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&r(l??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(c.spaceBefore=!0),o&&(t.type==="scalar"&&t.source===""?c.comment=o:c.commentBefore=o),e.options.keepSourceTokens&&d&&(c.srcToken=t),c}function co(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:jm(t,n,r),indent:-1,source:""},u=qc(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 fS({options:e},{offset:t,source:n,end:r},s){let i=new _t(n.substring(1));i.source===""&&s(t,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(t+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=t+n.length,a=St(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function qm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new sn(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=Pt(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?Uc(c,s,d,o):co(c,d.end,r,null,d,o);let u=l.contents.range[2],p=St(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function Rs(e){if(typeof e=="number")return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n=="string"?n.length:1)]}function Um(e){let t="",n=!1,r=!1;for(let s=0;s<e.length;++s){let i=e[s];switch(i[0]){case"#":t+=(t===""?"":r?`
|
|
177
177
|
|
|
178
178
|
`:`
|
|
179
|
-
`)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var
|
|
179
|
+
`)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var Ps=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Rs(n);i?this.warnings.push(new Ts(o,r,s)):this.errors.push(new lt(o,r,s))},this.directives=new bt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Um(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
|
|
180
180
|
${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(W(i)&&!i.flow&&i.items.length>0){let o=i.items[0];M(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r}
|
|
181
181
|
${a}`:r}else{let o=i.commentBefore;i.commentBefore=o?`${r}
|
|
182
|
-
${o}`:r}}if(n){for(let i=0;i<this.errors.length;++i)t.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)t.warnings.push(this.warnings[i])}else t.errors=this.errors,t.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:
|
|
183
|
-
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new
|
|
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:Um(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=Rs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=qm(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 lt(Rs(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new lt(Rs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=St(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 lt(Rs(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new sn(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};var Bc=Symbol("break visit"),mS=Symbol("skip children"),Bm=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Wm(Object.freeze([]),e,t)}On.BREAK=Bc;On.SKIP=mS;On.REMOVE=Bm;On.itemAtPath=(e,t)=>{let n=e;for(let[r,s]of t){let i=n?.[r];if(i&&"items"in i)n=i.items[s];else return}return n};On.parentCollection=(e,t)=>{let n=On.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],s=n?.[r];if(s&&"items"in s)return s;throw new Error("Parent collection not found")};function Wm(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=Wm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Bc)return Bc;a===Bm&&(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 Wc="\uFEFF",Vc="",Kc="",uo="";function Vm(e){switch(e){case Wc:return"byte-order-mark";case Vc:return"doc-mode";case Kc:return"flow-error-end";case uo:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
|
|
184
184
|
`:case`\r
|
|
185
|
-
`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function
|
|
186
|
-
`:case"\r":case" ":return!0;default:return!1}}var
|
|
187
|
-
\r `),
|
|
185
|
+
`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function ct(e){switch(e){case void 0:case" ":case`
|
|
186
|
+
`:case"\r":case" ":return!0;default:return!1}}var Km=new Set("0123456789ABCDEFabcdef"),gS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),po=new Set(",[]{}"),yS=new Set(` ,[]{}
|
|
187
|
+
\r `),Gc=e=>!e||yS.has(e),Ss=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
|
|
188
188
|
`?!0:n==="\r"?this.buffer[t+1]===`
|
|
189
189
|
`:!1}charAt(t){return this.buffer[this.pos+t]}continueScalar(t){let n=this.buffer[t];if(this.indentNext>0){let r=0;for(;n===" ";)n=this.buffer[++r+t];if(n==="\r"){let s=this.buffer[r+t+1];if(s===`
|
|
190
190
|
`||!s&&!this.atEnd)return t+r+1}return n===`
|
|
191
|
-
`||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&
|
|
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]===
|
|
191
|
+
`||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&ct(this.buffer[t+3]))return-1}return t}getLine(){let t=this.lineEndPos;return(typeof t!="number"||t!==-1&&t<this.pos)&&(t=this.buffer.indexOf(`
|
|
192
|
+
`,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===Wc&&(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 Vc,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==="...")&&ct(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&&!ct(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===":")&&ct(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(Gc),"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("..."))&&ct(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Kc,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(Gc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||ct(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
|
|
193
193
|
`,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
|
|
194
|
-
`,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>
|
|
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=>ct(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
|
|
195
195
|
`:t=i,n=0;break;case"\r":{let o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
|
|
196
196
|
`)break}default:break e}if(!r&&!this.atEnd)return this.setNext("block-scalar");if(n>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=n:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let i=this.continueScalar(t+1);if(i===-1)break;t=this.buffer.indexOf(`
|
|
197
197
|
`,i)}while(t!==-1);if(t===-1){if(!this.atEnd)return this.setNext("block-scalar");t=this.buffer.length}}let s=t+1;for(r=this.buffer[s];r===" ";)r=this.buffer[++s];if(r===" "){for(;r===" "||r===" "||r==="\r"||r===`
|
|
198
198
|
`;)r=this.buffer[++s];t=s-1}else if(!this.blockScalarKeep)do{let i=t-1,o=this.buffer[i];o==="\r"&&(o=this.buffer[--i]);let a=i;for(;o===" ";)o=this.buffer[--i];if(o===`
|
|
199
|
-
`&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield
|
|
199
|
+
`&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield uo,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(ct(i)||t&&po.has(i))break;n=r}else if(ct(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
|
|
200
200
|
`?(r+=1,s=`
|
|
201
|
-
`,i=this.buffer[r+1]):n=r),i==="#"||t&&
|
|
202
|
-
`){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&
|
|
201
|
+
`,i=this.buffer[r+1]):n=r),i==="#"||t&&po.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&&po.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield uo,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(Gc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(ct(r)||n&&po.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(;!ct(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(gS.has(n))n=this.buffer[++t];else if(n==="%"&&Km.has(this.buffer[t+1])&&Km.has(this.buffer[t+2]))n=this.buffer[t+=3];else break;return yield*this.pushToIndex(t,!1)}}*pushNewline(){let t=this.buffer[this.pos];return t===`
|
|
203
203
|
`?yield*this.pushCount(1):t==="\r"&&this.charAt(1)===`
|
|
204
|
-
`?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var
|
|
204
|
+
`?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var Is=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function an(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 Ym(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 fo(e){switch(e.type){case"document":return e.start;case"block-map":{let t=e.items[e.items.length-1];return t.sep??t.start}case"block-seq":return e.items[e.items.length-1].start;default:return[]}}function kr(e){if(e.length===0)return[];let t=e.length;e:for(;--t>=0;)switch(e[t].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;e[++t]?.type==="space";);return e.splice(t,e.length)}function mo(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 Hm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!an(t.start,"explicit-key-ind")&&!an(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Ym(t.value)?t.value.end?mo(t.value.end,t.sep):t.value.end=t.sep:mo(t.start,t.sep),delete t.sep)}var vs=class{constructor(t){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new Ss,this.onNewLine=t}*parse(t,n=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let r of this.lexer.lex(t,n))yield*this.next(r);n||(yield*this.end())}*next(t){if(this.source=t,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=t.length;return}let n=Vm(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"&&Hm(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=fo(this.peek(2)),r=kr(n),s;t.end?(s=t.end,s.push(this.sourceToken),delete t.end):s=[this.sourceToken];let i={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:r,key:t,sep:s}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(t)}*blockScalar(t){switch(this.type){case"space":case"comment":case"newline":t.props.push(this.sourceToken);return;case"scalar":if(t.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let n=this.source.indexOf(`
|
|
205
205
|
`)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
|
|
206
|
-
`,n)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else if(n.sep)n.sep.push(this.sourceToken);else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){
|
|
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)){mo(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(an(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(Ym(n.key)&&!an(n.sep,"newline")){let o=kr(n.start),a=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(an(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=kr(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?t.items.push({start:i,key:null,sep:[this.sourceToken]}):an(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(t.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(t);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!an(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){mo(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||an(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){let r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){let n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}let r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=fo(r),i=kr(s);Hm(t);let o=t.end.splice(1,t.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:i,key:t,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(t)}}flowScalar(t){if(this.onNewLine){let n=this.source.indexOf(`
|
|
207
207
|
`)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
|
|
208
|
-
`,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=ao(t),r=yr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=ao(t),r=yr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function zP(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Ts||null,prettyErrors:t}}function Wc(e,t={}){let{lineCounter:n,prettyErrors:r}=zP(t),s=new bs(n?.addNewLine),i=new ws(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 at(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(Ec(e,n)),o.warnings.forEach(Ec(e,n))),o}var Rs=1024*1024;function Bc(e,t){Buffer.byteLength(e)>Rs&&co(t,[`Definition exceeds ${Rs} bytes.`]);let n=Wc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];ze(n,(i,o)=>{Fe(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&&co(t,s),n.contents===null&&co(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){co(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function co(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 XP}from"node:crypto";var wr=/^[a-z][a-z0-9_-]{0,63}$/,Wm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Bm=32,Vm=128,QP=16,ZP=32,eS=10080*60*1e3,kr=32*1024,Km=16;function Gc(e,t){let n=[],r=Me(e,"$",n);ct(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=dS(r.name,"$.name",n),i=nS(r.limits,n),o=rS(r.inputs,n),a=sS(r.steps,n);a.length>Vm&&n.push(`$.steps may contain at most ${Vm} 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=aS(a,n);c&&lS(a,o,c.ancestors,n),n.length>0&&mS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:XP("sha256").update(Kc(d)).digest("hex"),order:c.order,waves:tS(c.waves,i.maxConcurrency)}}function tS(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 nS(e,t){let n=Me(e,"$.limits",t);ct(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Gm(n.max_concurrency,"$.limits.max_concurrency",1,QP,t),s=Gm(n.max_tasks,"$.limits.max_tasks",1,ZP,t),i=zm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function rS(e,t){if(e===void 0)return{};let n=Me(e,"$.inputs",t),r=Object.entries(n);r.length>Bm&&t.push(`$.inputs may contain at most ${Bm} inputs.`);let s={};for(let[i,o]of r){wr.test(i)||t.push(`$.inputs key "${i}" must match ${wr}.`);let a=Me(o,`$.inputs.${i}`,t);ct(a,["type","required","default"],`$.inputs.${i}`,t);let l=fS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:pS(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&&!Hm(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Hm(a.default,l)?{defaultValue:a.default}:{}}}return s}function sS(e,t){let n=Me(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{wr.test(s)||t.push(`$.steps key "${s}" must match ${wr}.`);let o=Me(i,`$.steps.${s}`,t),a=Ym(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?oS(s,o,a,t):iS(s,o,a,t)})}function iS(e,t,n,r){ct(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?Lt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=Me(t.create_child,`$.steps.${e}.create_child`,r);ct(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:Lt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Lt(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=Me(t.agent,`$.steps.${e}.agent`,r);if(ct(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=T.runners.parse(Lt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Lt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>kr&&r.push(`$.steps.${e}.prompt exceeds ${kr} bytes.`);let d;if(t.output!==void 0){let u=Me(t.output,`$.steps.${e}.output`,r);ct(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 oS(e,t,n,r){ct(t,["needs","human_review"],`$.steps.${e}`,r);let s=Me(t.human_review,`$.steps.${e}.human_review`,r);ct(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Me(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ct(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Lt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Lt(s.title,`$.steps.${e}.human_review.title`,r),summary:Lt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:zm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Vc(e,t,n,r){if(r>Km)return n.push(`${t} exceeds the maximum schema depth of ${Km}.`),{};let s=Me(e,t,n);ct(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&&Ym(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=Me(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 aS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let f of d.get(h)??[])p.add(f)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function lS(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(Wm)],c=a.replace(Wm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)cS(d[1].trim(),i,t,n,s,r)}}}function cS(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&&uS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function uS(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(!uo(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(!uo(a))return;i=a}}function Kc(e){return Array.isArray(e)?`[${e.map(Kc).join(",")}]`:uo(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Kc(e[t])}`).join(",")}}`:JSON.stringify(e)}function Me(e,t,n){return uo(e)?e:(n.push(`${t} must be an object.`),{})}function ct(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 dS(e,t,n){let r=Lt(e,t,n);return wr.test(r)||n.push(`${t} must match ${wr}.`),r}function Lt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Ym(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 Gm(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 pS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function fS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Hm(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function zm(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>eS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function mS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var uo=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as hS,stat as gS}from"node:fs/promises";var yS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Hc(e){let t=await Jm(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 Yc(e,t){let n=await Jm(e),r=wS(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:On(l.title,r,`$.steps.${a}.human_review.title`),summary:On(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?On(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:On(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:On(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:On(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:bS(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 Jm(e){let t;try{let n=await gS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Rs)throw new Error(`Definition exceeds ${Rs} bytes.`);t=await hS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Gc(Bc(t,e),e)}function wS(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]=kS(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 kS(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 TS(e,t){return e.replace(yS,(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 On(e,t,n){let r=TS(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 bS(e,t,n){let r=`$.steps.${n}.prompt`,s=On(e,t,r);if(Buffer.byteLength(s)>kr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${kr} bytes.`,{details:{location:r,maxBytes:kr}});return s}import{createHash as Xm}from"node:crypto";import RS from"node:path";import{mkdir as PS}from"node:fs/promises";var zc={type:"system",component:"heartbeat"};async function on(e,t={}){await PS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([P.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):$t.listAgents(e),$f(e),OS(e)]),o=r??gt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=ES(i),l=a!==i,c=[],d=Jc(s.filter(AS),f=>f.taskId),u=Jc(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=Jc(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=SS(f),y=d.get(f.id),k=Qc(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(k?.signature!==m.signature){let x=k?f.status==="closed"&&k?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await xe(e,{id:Xc(x,f.id,m.signature),type:x,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:zc,data:{...m,changedFields:k?vS(k,m):[]}});c.push(v),R=v.id}a.tasks[f.id]={...m,eventId:R};let b=CS(f.prs),$=u.get(f.id),O=Qc($?.data)??a.pullRequests[f.id]??null,N=$?.id??a.pullRequests[f.id]?.eventId??null;if((O||b.associations.length>0)&&O?.signature!==b.signature){let x=Array.isArray(O?.associations)?O.associations.length:0,v=b.associations.length>x?"task.pr.linked":b.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await xe(e,{id:Xc(v,f.id,b.signature),type:v,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:zc,data:b});c.push(w),N=w.id}a.pullRequests[f.id]={...b,eventId:N}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=Qc(m?.data)??a.agents[f.tabId]??null;if(y?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let k=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await xe(e,{id:Xc("agent.state.changed",f.tabId,k),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:zc,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await q(Zm(e),a),c}function SS(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:Qm(t)}}var IS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function vS(e,t){return IS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function CS(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:Qm(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 AS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Qm=e=>Xm("sha256").update(JSON.stringify(e)).digest("hex"),Xc=(...e)=>Xm("sha256").update(e.join("\0")).digest("hex"),Qc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Zm=e=>RS.join(e.orchestrationDir,"event-reconciliation.json");function ES(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 OS(e){try{return await Ls(Zm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function $S(e,t){return await Zc(e),await on(e),Sn(e,t)}async function NS(e,t,n){await Zc(e);let r=await $t.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await on(e,{agentObserver:r});let a=await Sn(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 eh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function DS(e,t,n){await Zc(e);let r=await P.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await $t.openObserver(e);try{await on(e,{agentObserver:s});let o=(await Sn(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=gt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw xS(t);let u=a-Date.now();if(u<=0)throw _S(t,n.states,n.timeoutMs);await on(e,{agentObserver:s}),o=(await Sn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await eh(Math.min(250,u),n.signal)}}finally{s.close()}}async function Zc(e){let t=await T.load(e);if(!T.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function eh(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 _S=(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}}),xS=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),po={list:$S,watch:NS,waitForTaskState:DS,reconcile:on};import{readFile as JS}from"node:fs/promises";import{mkdir as VS,readFile as sh,rm as ih}from"node:fs/promises";import{createConnection as KS}from"node:net";import GS from"node:path";import{spawn as qS}from"node:child_process";import{closeSync as US,openSync as WS}from"node:fs";import tu from"node:path";import{accessSync as LS,constants as FS}from"node:fs";import{homedir as th}from"node:os";import an from"node:path";var MS=[an.join(th(),".local","bin"),an.join(th(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function rh(e=process.env){return jS([...(e.PATH??"").split(an.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:MS])}function fo(e=process.env){return{...e,PATH:rh(e).join(an.delimiter)}}function eu(e,t={}){if(e.includes(an.sep)){let n=an.isAbsolute(e)?e:an.resolve(t.cwd??process.cwd(),e);return nh(n)?n:null}for(let n of rh(t.env)){let r=an.join(n,e);if(nh(r))return r}return null}function mo(e,t={}){let n=eu(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 nh(e){try{return LS(e,FS.X_OK),!0}catch{return!1}}function jS(e){return[...new Set(e)]}function ho(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=BS(e.workspaceRoot),s=WS(tu.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return qS(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{US(s)}})().unref()}function BS(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=tu.resolve(tu.dirname(t),"..","node_modules",".bin","tsx");return{command:eu("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 Ft(e){let t=await yo(_e(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await $n(t,{type:"ping"});return zt(n.protocolVersion)?(await $n(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function go(e,t){if(t.length===0)return!0;let n=await yo(_e(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await $n(n,{type:"ping"});if(!zt(r.protocolVersion))return!1;for(let s of t)await $n(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function ah(e,t){await HS(e);let n=await yo(_e(e).socketPath);try{let r=await $n(n,{type:"ping"});if(!zt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await $n(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 HS(e){let t=_e(e),n=await oh(t.socketPath).catch(()=>null);if(zt(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 VS(e.runtimeDir,{recursive:!0});let r=await sh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&YS(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([ih(t.socketPath,{force:!0}),ih(t.pidPath,{force:!0})]),ho(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await oh(t.socketPath).catch(()=>null);if(zt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await sh(GS.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
-
${o.slice(-2e3)}`:""}`)}async function
|
|
208
|
+
`,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=fo(t),r=kr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=fo(t),r=kr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function wS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Is||null,prettyErrors:t}}function Hc(e,t={}){let{lineCounter:n,prettyErrors:r}=wS(t),s=new vs(n?.addNewLine),i=new Ps(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new lt(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(_c(e,n)),o.warnings.forEach(_c(e,n))),o}var Cs=1024*1024;function Yc(e,t){Buffer.byteLength(e)>Cs&&ho(t,[`Definition exceeds ${Cs} bytes.`]);let n=Hc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Je(n,(i,o)=>{Me(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&ho(t,s),n.contents===null&&ho(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){ho(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function ho(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 TS}from"node:crypto";var Tr=/^[a-z][a-z0-9_-]{0,63}$/,zm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Jm=32,Xm=128,bS=16,RS=32,PS=10080*60*1e3,br=32*1024,Qm=16;function Xc(e,t){let n=[],r=je(e,"$",n);ut(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=_S(r.name,"$.name",n),i=IS(r.limits,n),o=vS(r.inputs,n),a=CS(r.steps,n);a.length>Xm&&n.push(`$.steps may contain at most ${Xm} 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=OS(a,n);c&&$S(a,o,c.ancestors,n),n.length>0&&LS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:TS("sha256").update(Jc(d)).digest("hex"),order:c.order,waves:SS(c.waves,i.maxConcurrency)}}function SS(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 IS(e,t){let n=je(e,"$.limits",t);ut(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Zm(n.max_concurrency,"$.limits.max_concurrency",1,bS,t),s=Zm(n.max_tasks,"$.limits.max_tasks",1,RS,t),i=nh(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function vS(e,t){if(e===void 0)return{};let n=je(e,"$.inputs",t),r=Object.entries(n);r.length>Jm&&t.push(`$.inputs may contain at most ${Jm} inputs.`);let s={};for(let[i,o]of r){Tr.test(i)||t.push(`$.inputs key "${i}" must match ${Tr}.`);let a=je(o,`$.inputs.${i}`,t);ut(a,["type","required","default"],`$.inputs.${i}`,t);let l=FS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:xS(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&&!eh(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&eh(a.default,l)?{defaultValue:a.default}:{}}}return s}function CS(e,t){let n=je(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{Tr.test(s)||t.push(`$.steps key "${s}" must match ${Tr}.`);let o=je(i,`$.steps.${s}`,t),a=th(o.needs,`$.steps.${s}.needs`,t);return new Set(a).size!==a.length&&t.push(`$.steps.${s}.needs cannot contain duplicates.`),o.human_review!==void 0?ES(s,o,a,t):AS(s,o,a,t)})}function AS(e,t,n,r){ut(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?Lt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=je(t.create_child,`$.steps.${e}.create_child`,r);ut(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:Lt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Lt(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=je(t.agent,`$.steps.${e}.agent`,r);if(ut(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(Lt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Lt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>br&&r.push(`$.steps.${e}.prompt exceeds ${br} bytes.`);let d;if(t.output!==void 0){let u=je(t.output,`$.steps.${e}.output`,r);ut(u,["schema"],`$.steps.${e}.output`,r),d=zc(u.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...d?{outputSchema:d}:{}}}function ES(e,t,n,r){ut(t,["needs","human_review"],`$.steps.${e}`,r);let s=je(t.human_review,`$.steps.${e}.human_review`,r);ut(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=je(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ut(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Lt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Lt(s.title,`$.steps.${e}.human_review.title`,r),summary:Lt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:nh(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function zc(e,t,n,r){if(r>Qm)return n.push(`${t} exceeds the maximum schema depth of ${Qm}.`),{};let s=je(e,t,n);ut(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&th(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=je(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))zc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&zc(s.items,`${t}.items`,n,r+1),s}function OS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let f of d.get(h)??[])p.add(f)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function $S(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(zm)],c=a.replace(zm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)NS(d[1].trim(),i,t,n,s,r)}}}function NS(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&&DS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function DS(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(!go(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(!go(a))return;i=a}}function Jc(e){return Array.isArray(e)?`[${e.map(Jc).join(",")}]`:go(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Jc(e[t])}`).join(",")}}`:JSON.stringify(e)}function je(e,t,n){return go(e)?e:(n.push(`${t} must be an object.`),{})}function ut(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=Lt(e,t,n);return Tr.test(r)||n.push(`${t} must match ${Tr}.`),r}function Lt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function th(e,t,n){return e===void 0?[]:!Array.isArray(e)||e.some(r=>typeof r!="string"||r.length===0)?(n.push(`${t} must be an array of non-empty strings.`),[]):e}function Zm(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 xS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function FS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function eh(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function nh(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>PS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function LS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var go=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as MS,stat as jS}from"node:fs/promises";var qS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Qc(e){let t=await rh(e);return{kind:"validateFury",schemaVersion:1,valid:!0,file:e,definitionHash:t.hash,name:t.definition.name,inputNames:Object.keys(t.definition.inputs),stepCount:t.definition.steps.length,order:t.order,limits:t.definition.limits}}async function Zc(e,t){let n=await rh(e),r=US(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:$n(l.title,r,`$.steps.${a}.human_review.title`),summary:$n(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?$n(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:$n(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:$n(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:$n(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:VS(l.prompt,r,a),outputSchema:l.outputSchema??null,review:null}});return{schemaVersion:1,file:e,definitionHash:n.hash,name:n.definition.name,inputs:r,limits:n.definition.limits,order:n.order,waves:n.waves,steps:o}}async function rh(e){let t;try{let n=await jS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Cs)throw new Error(`Definition exceeds ${Cs} bytes.`);t=await MS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Xc(Yc(t,e),e)}function US(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]=BS(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 BS(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 WS(e,t){return e.replace(qS,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function $n(e,t,n){let r=WS(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 VS(e,t,n){let r=`$.steps.${n}.prompt`,s=$n(e,t,r);if(Buffer.byteLength(s)>br)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${br} bytes.`,{details:{location:r,maxBytes:br}});return s}import{createHash as sh}from"node:crypto";import KS from"node:path";import{mkdir as GS}from"node:fs/promises";var eu={type:"system",component:"heartbeat"};async function ln(e,t={}){await GS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Nt.listAgents(e),Mf(e),ZS(e)]),o=r??wt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=QS(i),l=a!==i,c=[],d=tu(s.filter(XS),f=>f.taskId),u=tu(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=tu(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=HS(f),y=d.get(f.id),T=ru(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await Fe(e,{id:nu(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:eu,data:{...m,changedFields:T?zS(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=JS(f.prs),$=u.get(f.id),N=ru($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await Fe(e,{id:nu(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:eu,data:b});c.push(w),D=w.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=ru(m?.data)??a.agents[f.tabId]??null;if(y?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let T=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await Fe(e,{id:nu("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:eu,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await B(oh(e),a),c}function HS(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:ih(t)}}var YS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function zS(e,t){return YS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function JS(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:ih(t)}}function tu(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var XS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",ih=e=>sh("sha256").update(JSON.stringify(e)).digest("hex"),nu=(...e)=>sh("sha256").update(e.join("\0")).digest("hex"),ru=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,oh=e=>KS.join(e.orchestrationDir,"event-reconciliation.json");function QS(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 ZS(e){try{return await Us(oh(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function eI(e,t){return await su(e),await ln(e),In(e,t)}async function tI(e,t,n){await su(e);let r=await Nt.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await ln(e,{agentObserver:r});let a=await In(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await ah(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function nI(e,t,n){await su(e);let r=await S.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await Nt.openObserver(e);try{await ln(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=wt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw sI(t);let u=a-Date.now();if(u<=0)throw rI(t,n.states,n.timeoutMs);await ln(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await ah(Math.min(250,u),n.signal)}}finally{s.close()}}async function su(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 ah(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 rI=(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}}),sI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),yo={list:eI,watch:tI,waitForTaskState:nI,reconcile:ln};import{readFile as kI}from"node:fs/promises";import{mkdir as fI,readFile as dh,rm as ph}from"node:fs/promises";import{createConnection as mI}from"node:net";import hI from"node:path";import{spawn as cI}from"node:child_process";import{closeSync as uI,openSync as dI}from"node:fs";import ou from"node:path";import{accessSync as iI,constants as oI}from"node:fs";import{homedir as lh}from"node:os";import cn from"node:path";var aI=[cn.join(lh(),".local","bin"),cn.join(lh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function uh(e=process.env){return lI([...(e.PATH??"").split(cn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:aI])}function wo(e=process.env){return{...e,PATH:uh(e).join(cn.delimiter)}}function iu(e,t={}){if(e.includes(cn.sep)){let n=cn.isAbsolute(e)?e:cn.resolve(t.cwd??process.cwd(),e);return ch(n)?n:null}for(let n of uh(t.env)){let r=cn.join(n,e);if(ch(r))return r}return null}function ko(e,t={}){let n=iu(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 ch(e){try{return iI(e,oI.X_OK),!0}catch{return!1}}function lI(e){return[...new Set(e)]}function To(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=pI(e.workspaceRoot),s=dI(ou.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return cI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{uI(s)}})().unref()}function pI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=ou.resolve(ou.dirname(t),"..","node_modules",".bin","tsx");return{command:iu("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}async function Mt(e){let t=await Ro(xe(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await Nn(t,{type:"ping"});return Xt(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function bo(e,t){if(t.length===0)return!0;let n=await Ro(xe(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!Xt(r.protocolVersion))return!1;for(let s of t)await Nn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function mh(e,t){await gI(e);let n=await Ro(xe(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!Xt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Nn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function gI(e){let t=xe(e),n=await fh(t.socketPath).catch(()=>null);if(Xt(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await fI(e.runtimeDir,{recursive:!0});let r=await dh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&yI(s))throw new Error("A Craig PTY daemon process is still running but is not accepting connections. Stop it explicitly before starting another daemon.");await Promise.all([ph(t.socketPath,{force:!0}),ph(t.pidPath,{force:!0})]),To(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await fh(t.socketPath).catch(()=>null);if(Xt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await dh(hI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
+
${o.slice(-2e3)}`:""}`)}async function fh(e){let t=await Ro(e);try{return await Nn(t,{type:"ping"})}finally{t.end()}}function yI(e){try{return process.kill(e,0),!0}catch{return!1}}var wI=1;function Nn(e,t){let n=wI++;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
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
|
|
211
|
+
`)})}function Ro(e){return new Promise((t,n)=>{let r=mI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function TI(e,t){await vI(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 II(t.prompt,t.readStdin),o;try{o=await ae.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await Mt(e),a}return await au(e,o.command.id),o}async function au(e,t){if((await ae.show(e,t)).command.state==="delivered"||await Mt(e))return;let r=(await ae.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ae.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function bI(e,t){return ae.show(e,t)}async function RI(e,t){return ae.list(e,t)}async function PI(e,t){let n;try{n=await ae.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Mt(e),r}return await Mt(e),n}async function SI(e,t,n){return ae.wait(e,t,n)}async function II(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await kI(e.path,"utf8")}}catch(n){throw new g("CLI_USAGE",`Unable to read prompt file ${e.path}.`,{details:{promptFile:e.path},cause:n})}if(!t)throw new g("INPUT_REQUIRED","Prompt input from stdin is unavailable.",{});return{source:"stdin",text:await t()}}async function vI(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Rr={send:TI,show:bI,list:RI,cancel:PI,wait:SI};function Po(e,t){if(t!=="codex")return e;let[n="codex",...r]=e,s=["--no-alt-screen","--no-daemon"].filter(i=>!r.includes(i));return[n,...s,...r]}var CI=6e4;async function So(e,t){return mc(e,t,{createTask:AI})}async function hh(e,t,n,r={}){return fc(e,t,n,{...r,launchProvisioned:(s,i)=>gh(e,s,i,!1)})}async function AI(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>gh(e,s,i,!0)})}async function gh(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 mh(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:Po(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await ae.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:CI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await au(e,i.command.id)}catch(i){throw await bo(e,[s.id]),i}}async function Io(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 gc(e,t,n);return await bo(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await bo(e,o),a}}import{randomUUID as kh}from"node:crypto";import{readFile as EI,realpath as yh}from"node:fs/promises";import lu from"node:path";var se={type:"system",component:"orchestration-supervisor"},OI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function $I(e,t,n,r,s,i){await Fn(e);let o=await KI(e,t);if(await S.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new g("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await ze(e,i,"fury.plan",r)}let a=await Zc(t,n);GI(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_${kh()}`,planHash:Bl(c),createdBy:s,createdAt:l};await kf(e,a.definitionHash,await EI(t,"utf8"));let u=await Tf(e,d);try{await Fe(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 NI(e,t,n){if(await Fn(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await Ti(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await Pf(e,s);try{await Fe(e,{id:`${r.id}:fury.plan.approved`,taskId:r.rootTaskId,type:"fury.plan.approved",occurredAt:i.approval.approvedAt,actor:i.approval.approvedBy,data:{planId:r.id,planHash:r.planHash}})}catch(o){throw new g("PARTIAL_RESULT",`Fury plan ${r.id} was approved, but its audit event could not be recorded.`,{details:{planId:r.id,planHash:r.planHash,persisted:!0,approved:!0},cause:o})}return{kind:"approveFury",plan:r,approval:i.approval,created:i.created}}async function DI(e,t,n,r){await Fn(e);let s=await Ti(e,t);if((await Sf(e,t)).planHash!==s.planHash)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} changed after approval.`,{});if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury run requires an agent capability.",{});await ze(e,r,"fury.run",s.rootTaskId)}await tt(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${kh()}`,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 If(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 xn(e,c.run.id),await Mt(e),{kind:"runFury",run:await pe(e,c.run.id),created:c.created}}async function _I(e,t){return await Fn(e),await xn(e,t),{kind:"showFury",run:await pe(e,t)}}async function Co(e,t={}){let n=await k.load(e);if(k.previews.isEnabled(n,"agentOrchestration"))for(let r of await vf(e))await xn(e,r.id,t)}async function xn(e,t,n={}){let r=await pe(e,t);if(await JI(e,r),It(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await He(e,t,o=>zI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await rs(e,o.reviewId,a=>({...a,state:"timed_out",version:a.version+1,updatedAt:new Date().toISOString()}));await ce(e,r,null,"fury.run.timed_out",se,{state:r.state});return}let s=new Map((await Ye(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 wh(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await vo(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",se));let l=!a.commandId||s.get(a.commandId)?.state==="delivered";a.state==="running"&&a.agentTabId&&l&&n.isAgentAvailable&&a.startedAt&&Date.now()-Date.parse(a.startedAt)>2e3&&!n.isAgentAvailable(a.agentTabId)&&(r=await vo(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,se)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await He(e,r.id,c=>un(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:se})),await ce(e,r,a.id,"fury.step.timed_out",se,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await rs(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await He(e,r.id,c=>un(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:se})),await ce(e,r,a.id,"fury.review.timed_out",se,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await Ao(e,r.id,"failed",se);return}let i=Object.values(r.stepRuns).filter(o=>o.state==="running").length;for(let o of r.order){if(i>=r.limits.maxConcurrency)break;let a=r.stepRuns[o];a.state!=="pending"||!a.needs.every(l=>r.stepRuns[l]?.state==="succeeded")||(a.kind==="human_review"?r=await xI(e,r,a):(r=await wh(e,r,a),i+=1))}await YI(e,r.id)}async function wh(e,t,n){let r=new Date;t=await He(e,t.id,o=>un(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await ce(e,t,n.id,"fury.step.started",se,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${_n(s.plan.prompt,t)}
|
|
212
212
|
|
|
213
|
-
${
|
|
213
|
+
${HI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await So(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:_n(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:_n(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),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=_n(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 tt(e,c,se,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:se})).command.id}return t=await He(e,t.id,c=>un(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await ce(e,t,n.id,"fury.step.dispatched",se,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return vo(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",se)}}async function xI(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?_n(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(c=>c.taskId===o&&c.agentTabId):null,l={schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:_n(r.title,t),summary:_n(r.summary,t),feedbackTarget:o?{taskId:o,agentTabId:a?.agentTabId??null}:null,round:1,requestedAt:s.toISOString(),deadlineAt:new Date(Math.min(Date.parse(t.deadlineAt),s.getTime()+r.timeoutMs)).toISOString(),version:1,lastDecision:null,history:[],updatedAt:s.toISOString()};return await Af(e,l),t=await He(e,t.id,c=>un(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await ce(e,t,n.id,"fury.review.requested",se,{reviewId:i,title:l.title}),t}async function FI(e,t,n,r,s,i){let o=await pe(e,t),a=bh(o,n);await Th(e,a,s,i,"fury.step.complete"),VI(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await He(e,t,c=>{if(It(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return un(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ce(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await xn(e,t),o=await pe(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function LI(e,t,n,r,s,i){let o=await pe(e,t),a=bh(o,n);await Th(e,a,s,i,"fury.step.fail");let l=await vo(e,t,n,r,s);return await Ao(e,t,"failed",s),{kind:"failFuryStep",run:await pe(e,t),step:l.stepRuns[n]}}async function MI(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 ze(e,r,"fury.cancel",s.rootTaskId)}if(It(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await He(e,t,c=>It(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 Ye(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 Io(e,c.taskId).catch(()=>{}),c.reviewId&&await rs(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 jI(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 ze(e,r,"fury.resume",s.rootTaskId)}if(It(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await xn(e,t),await Mt(e),{kind:"resumeFury",run:await pe(e,t)}}async function qI(e,t,n){return await Fn(e),{kind:"listFuryReviews",reviews:(await bi(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function UI(e,t){return await Fn(e),{kind:"showFuryReview",review:await or(e,t)}}async function BI(e,t,n,r,s,i){let o=await or(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 ze(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await S.getTask(e,o.feedbackTarget.taskId),f=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!f)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:h.id,agentTabId:f.id,prompt:{source:"inline",text:`Fury review changes requested:
|
|
214
214
|
|
|
215
|
-
${r}`},delivery:"when-ready",timeoutMs:Math.min(a.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${t}:${o.round}`,actor:s})).command.id}let 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
|
|
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 rs(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:u,history:[...h.history,u],updatedAt:d}}),a=await He(e,a.id,h=>{if(It(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return un(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:d,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:d,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await ce(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await Ao(e,a.id,"failed",s):await xn(e,a.id),c&&await Mt(e),{kind:"actFuryReview",review:o,run:await pe(e,a.id)}}async function WI(e,t,n,r){await Fn(e),await pe(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await xn(e,t);let a=await In(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,It(await pe(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await XI(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function _n(e,t){return e.replace(OI,(n,r,s)=>{let i=t.stepRuns[r];if(!i||i.state!=="succeeded")throw new g("FURY_STATE_CONFLICT",`Step ${r} is not complete.`,{});if(s==="task_id")return i.taskId??"";let o=i.output;for(let a of s.split(".").slice(1))o=Dn(o)?o[a]:void 0;if(o===void 0)throw new g("FURY_OUTPUT_INVALID",`Step ${r} has no output at ${s}.`,{});return typeof o=="string"?o:JSON.stringify(o)})}function VI(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(cu(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function cu(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?Dn(e):s==="integer"?Number.isInteger(e):s==="number"?typeof e=="number"&&Number.isFinite(e):typeof e===s)){r.push(`${n} must be ${String(s)}.`);return}if(Array.isArray(t.enum)&&!t.enum.some(o=>JSON.stringify(o)===JSON.stringify(e))&&r.push(`${n} is not in enum.`),s==="object"&&Dn(e)){let o=Dn(t.properties)?t.properties:{};for(let a of Array.isArray(t.required)?t.required:[])typeof a=="string"&&!Object.hasOwn(e,a)&&r.push(`${n}.${a} is required.`);for(let[a,l]of Object.entries(e))Dn(o[a])?cu(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&Dn(t.items)&&e.forEach((o,a)=>cu(o,t.items,`${n}[${a}]`,r))}async function Th(e,t,n,r,s){if(n.type!=="human"){if(n.type!=="agent"||!r||n.taskId!==t.taskId)throw new g("CAPABILITY_DENIED","The step actor does not own this fury step.",{});await ze(e,r,s,n.taskId)}}function bh(e,t){if(It(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 KI(e,t){let[n,r]=await Promise.all([yh(ge(e).root),yh(t)]),s=lu.relative(n,r);if(!s||s.startsWith("..")||lu.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:ge(e).root}});return lu.join(".craig","fury",s)}function GI(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 HI(e,t,n){return n?`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --output '<json matching ${JSON.stringify(n)}>' --json
|
|
216
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
|
|
217
|
-
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function
|
|
217
|
+
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function vo(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await He(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(It(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,un(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 un(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function YI(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 Ao(e,t,s,se)}async function Ao(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 He(e,t,l=>It(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 zI(e){let t=new Date().toISOString();return{...e,state:"timed_out",updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:se}]))}}async function ce(e,t,n,r,s,i){let o=Dn(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await Fe(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function JI(e,t){await ce(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await ce(e,t,null,`fury.run.${t.state}`,se,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await ce(e,t,n.id,"fury.step.started",se,{}),n.taskId&&await ce(e,t,n.id,"fury.step.dispatched",se,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await ce(e,t,n.id,`fury.step.${n.state}`,n.completedBy??se,{reason:n.error}),!n.reviewId)continue;let r=await or(e,n.reviewId);await ce(e,t,n.id,"fury.review.requested",se,{reviewId:r.id,title:r.title});for(let s of r.history)await ce(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function Fn(e){if(!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 It(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function Dn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function XI(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var qe={plan:$I,approve:NI,run:DI,show:_I,watch:WI,cancel:MI,resume:jI,completeStep:FI,failStep:LI,listReviews:qI,showReview:UI,actOnReview:BI,reconcile:Co};import{access as QI,stat as ZI}from"node:fs/promises";import ev from"node:path";import{constants as tv}from"node:fs";async function uu(e,t){let n=ev.resolve(e,t),r;try{r=await ZI(n),await QI(n,tv.R_OK)}catch(s){throw new g("CLI_USAGE",`File is not readable: ${n}`,{cause:s,details:{path:n}})}if(!r.isFile())throw new g("CLI_USAGE",`Path is not a regular file: ${n}`,{details:{path:n}});return n}import{createConnection as nv}from"node:net";async function Ph(e,t){let n=await sv(xe(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await Rh(n,{type:"ping"})).protocolVersion!==Sn?!1:((await Rh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var rv=1;function Rh(e,t){let n=rv++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig UI navigation request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
|
|
218
218
|
`);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?r(u):s(new Error(u.error??"Craig UI navigation request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
|
|
219
|
-
`)})}function xI(e){return new Promise((t,n)=>{let r=DI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function wh(e,t){switch(e.kind){case"addWorkspace":{let n=await Te.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await ou(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await Te.repos.addRepo(t.paths,e.path);return await ou(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return Te.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await qn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await Te.repos.removeRepo(t.paths,e.repoId,{listTasks:P.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await Vt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await Vt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return Te.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await Te.archiveWorkspace(t.paths,e.workspaceId);return await MI(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await Te.restoreWorkspace(t.paths,e.workspaceId);return await ou(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return Te.removeWorkspace(t.paths,e.workspaceId,{listTasks:P.listTasks});case"createTask":return lh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await T.load(t.paths);if(!T.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),ko(t.paths,{parentTaskId:e.parentTaskId??Mt(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Ln(t),uc(t.paths,e.taskId??Mt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),To(t.paths,e.taskId??Mt(t).task.id,t.agentCapabilityId);case"validateFury":return await yh(t),Hc(au.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await yh(t),je.plan(t.paths,au.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Mt(t).task.id,cn(t),t.agentCapabilityId);case"approveFury":return je.approve(t.paths,e.planId,cn(t));case"runFury":return Ln(t),je.run(t.paths,e.planId,cn(t),t.agentCapabilityId);case"showFury":return je.show(t.paths,e.runId);case"watchFury":return je.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return je.cancel(t.paths,e.runId,cn(t),t.agentCapabilityId);case"resumeFury":return je.resume(t.paths,e.runId,cn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),je.completeStep(t.paths,e.runId,e.stepId,await FI(e.output,t),cn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),je.failStep(t.paths,e.runId,e.stepId,e.reason,cn(t),t.agentCapabilityId);case"listFuryReviews":return je.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return je.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),je.actOnReview(t.paths,e.reviewId,e.action,e.message??null,cn(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?P.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):P.listTasks(t.paths);case"currentTask":{let n=Mt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return P.renameTask(t.paths,e.taskId??Mt(t).task.id,e.title);case"addTaskLink":return P.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return P.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return P.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await T.load(t.paths);if(!T.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await iu(t.cwd??process.cwd(),e.path),s=await gh(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return P.showTask(t.paths,e.taskId);case"showCurrentTask":return P.showTask(t.paths,Mt(t).task.id);case"showTaskPr":return P.prs.show(t.paths,Fn(e.taskId,t),e.repoId);case"discoverTaskPr":return P.prs.discover(t.paths,Fn(e.taskId,t),e.repoId);case"linkTaskPr":return P.prs.link(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return P.prs.refreshAssociation(t.paths,Fn(e.taskId,t),e.repoId);case"unlinkTaskPr":return P.prs.unlink(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return $t.listAgents(t.paths,e.taskId);case"showAgentStatus":return $t.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 T.load(t.paths);return T.previews.isEnabled(s,"agentOrchestration")?po.waitForTaskState(t.paths,r,n):$t.waitForTask(t.paths,r,n)}case"listEvents":return po.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return po.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Tr.send(t.paths,{taskId:Fn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Tr.show(t.paths,e.commandId);case"listPromptCommands":return Tr.list(t.paths,e.taskId);case"cancelPromptCommand":return Tr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Tr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return P.showTask(t.paths,br(t,"show"));case"streamTaskLogs":return P.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return P.prepareTaskLogs(t.paths,br(t,"logs"));case"showTaskDiff":return P.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return P.showTaskDiff(t.paths,br(t,"diff"));case"openTask":return P.openTask(t.paths,e.taskId);case"openSelectedTask":return P.openTask(t.paths,br(t,"open"));case"runChecks":return P.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return P.runChecks(t.paths,br(t,"check"));case"commitTask":return P.commitTask(t.paths,e.taskId);case"commitSelectedTask":return P.commitTask(t.paths,br(t,"commit"));case"showContext":{let n=qI(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:ka()};case"exit":return{kind:"exit"};default:return jI(e)}}function Ln(e){if(!(!e.agentContext||e.agentCapabilityId))throw new g("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function yh(e){let t=await T.load(e.paths);if(!T.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function cn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Mt(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 FI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await LI(au.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 ou(e,t,n){let r=await qn({uiStateFile:e.uiStateFile})??Ms();await Vt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function MI(e,t){let n=await qn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await Vt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function jI(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function br(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function Mt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Fn(e,t){return e??Mt(t).task.id}function qI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Th(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
219
|
+
`)})}function sv(e){return new Promise((t,n)=>{let r=nv(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function Ih(e,t){switch(e.kind){case"addWorkspace":{let n=await Te.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await du(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await Te.repos.addRepo(t.paths,e.path);return await du(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return Te.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Bn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await Te.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await ht({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await ht({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return Te.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await Te.archiveWorkspace(t.paths,e.workspaceId);return await av(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await Te.restoreWorkspace(t.paths,e.workspaceId);return await du(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return Te.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return hh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),So(t.paths,{parentTaskId:e.parentTaskId??jt(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Ln(t),hc(t.paths,e.taskId??jt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),Io(t.paths,e.taskId??jt(t).task.id,t.agentCapabilityId);case"validateFury":return await Sh(t),Qc(pu.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Sh(t),qe.plan(t.paths,pu.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??jt(t).task.id,dn(t),t.agentCapabilityId);case"approveFury":return qe.approve(t.paths,e.planId,dn(t));case"runFury":return Ln(t),qe.run(t.paths,e.planId,dn(t),t.agentCapabilityId);case"showFury":return qe.show(t.paths,e.runId);case"watchFury":return qe.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return qe.cancel(t.paths,e.runId,dn(t),t.agentCapabilityId);case"resumeFury":return qe.resume(t.paths,e.runId,dn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),qe.completeStep(t.paths,e.runId,e.stepId,await ov(e.output,t),dn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),qe.failStep(t.paths,e.runId,e.stepId,e.reason,dn(t),t.agentCapabilityId);case"listFuryReviews":return qe.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return qe.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),qe.actOnReview(t.paths,e.reviewId,e.action,e.message??null,dn(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=jt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??jt(t).task.id,e.title);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return S.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await uu(t.cwd??process.cwd(),e.path),s=await Ph(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,jt(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Mn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Mn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Mn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return Nt.listAgents(t.paths,e.taskId);case"showAgentStatus":return Nt.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Mn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?yo.waitForTaskState(t.paths,r,n):Nt.waitForTask(t.paths,r,n)}case"listEvents":return yo.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return yo.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Rr.send(t.paths,{taskId:Mn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Rr.show(t.paths,e.commandId);case"listPromptCommands":return Rr.list(t.paths,e.taskId);case"cancelPromptCommand":return Rr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Rr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,Pr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,Pr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,Pr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,Pr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,Pr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,Pr(t,"commit"));case"showContext":{let n=cv(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:Sa()};case"exit":return{kind:"exit"};default:return lv(e)}}function Ln(e){if(!(!e.agentContext||e.agentCapabilityId))throw new g("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function Sh(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 dn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=jt(e);if(!e.agentCapabilityId||!t.agentTabId)throw new g("CAPABILITY_DENIED","This agent session has no scoped capability.",{});return{type:"agent",taskId:t.task.id,agentTabId:t.agentTabId,capabilityId:e.agentCapabilityId.split(".",1)[0]}}async function ov(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await iv(pu.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 du(e,t,n){let r=await Bn({uiStateFile:e.uiStateFile})??Ws();await ht({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function av(e,t){let n=await Bn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await ht({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function lv(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Pr(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function jt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??jt(t).task.id}function cv(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Ch(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
220
220
|
`);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
|
|
221
221
|
`);case"listRepos":return e.repos.length===0?"No repos registered yet. Use 'craig repo add <path>'.":["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
222
222
|
`);case"removeRepo":return`Removed repo ${e.repoId} (${e.rootPath})`;case"listWorkspaces":return e.workspaces.length===0?e.archivedOnly?"No archived workspaces.":"No active workspaces yet. Register one with 'craig workspace add <path>'.":["ID KIND STATUS REPOS PATH",...e.workspaces.map(t=>`${t.id} ${t.kind??"repo"} ${t.status} ${(t.discoveredRepoIds??[t.primaryRepoId]).join(",")} ${t.rootPath??""}`)].join(`
|
|
@@ -226,61 +226,66 @@ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>
|
|
|
226
226
|
`);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
|
|
227
227
|
`);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
|
|
228
228
|
`);case"planFury":return[`Planned fury ${e.plan.name}`,`Plan: ${e.plan.id}`,`Root task: ${e.plan.rootTaskId}`,`Hash: ${e.plan.planHash}`,`Steps: ${e.plan.steps.length}`,...e.plan.waves.map((t,n)=>`Wave ${n}: ${t.join(", ")}`),`Approval required: craig fury approve ${e.plan.id} --json`].join(`
|
|
229
|
-
`);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return
|
|
230
|
-
`);case"showFuryReview":return
|
|
229
|
+
`);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return uv(e.run);case"completeFuryStep":case"failFuryStep":return`${e.run.id} step ${e.step.id}: ${e.step.state}`;case"listFuryReviews":return e.reviews.length===0?"No fury reviews found.":["ID RUN STEP STATE ROUND TITLE",...e.reviews.map(t=>`${t.id} ${t.runId} ${t.stepId} ${t.state} ${t.round} ${t.title}`)].join(`
|
|
230
|
+
`);case"showFuryReview":return vh(e.review);case"actFuryReview":return`${vh(e.review)}
|
|
231
231
|
Run: ${e.run.state}`;case"watchFury":return"";case"addTaskLink":return[`Added contextual repo link ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`,`This does not provision a project task target. Use 'craig task repo add ${e.taskId} ${e.repoId}' for that.`].join(`
|
|
232
232
|
`);case"addTaskRepoTarget":return[`${e.disposition==="added"?"Added":"Found"} repo target ${e.repoId} for task ${e.taskId}`,`Branch: ${e.branch}`,`Worktree: ${e.worktreePath}`].join(`
|
|
233
233
|
`);case"listTaskLinks":return e.repos.length===0?`Task ${e.taskId} has no linked repos.`:["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
234
|
-
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${
|
|
235
|
-
`);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...
|
|
234
|
+
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${gv(t)} ${yv(t)} ${t.title}`)].join(`
|
|
235
|
+
`);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...mv(e)].join(`
|
|
236
236
|
`);case"currentTask":return[`${e.task.id}: ${e.task.title}`,`Workspace: ${e.task.workspaceId}`,`Repo: ${e.task.repoId}`,`Worktree: ${e.task.worktreePath}`,`Context source: ${e.context.source}`,`Agent tab: ${e.context.agentTabId??"none"}`].join(`
|
|
237
|
-
`);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return
|
|
238
|
-
`);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return
|
|
237
|
+
`);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return fv(e);case"listAgents":case"showAgentStatus":return pv(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(fu).join(`
|
|
238
|
+
`);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return dv(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
|
|
239
239
|
`);case"cancelPromptCommand":return`${e.changed?"Cancelled":"Command already cancelled:"} ${e.command.id}`;case"waitPromptCommand":return`Command ${e.command.id} reached ${e.command.state}.`;case"showContext":return[`Workspace: ${e.workspace.root}`,`Workspace source: ${e.workspace.source}`,`Initialized: ${e.workspace.initialized?"yes":"no"}`,`Task: ${e.task?.id??"none"}`,`Task source: ${e.task?.source??"none"}`,`Agent tab: ${e.task?.agentTabId??"none"}`].join(`
|
|
240
240
|
`);case"streamTaskLogs":return`Streaming logs for ${e.taskId} from ${e.logPath}`;case"showTaskDiff":return e.isEmpty?`Task ${e.taskId} has no uncommitted diff.`:e.diffText;case"openTask":return e.launched?`Opened task ${e.taskId} at ${e.worktreePath}`:e.worktreePath;case"openFile":return`Opened ${e.path} in Craig.`;case"runChecks":return`Checks ${e.status} for ${e.taskId}: ${e.commands.join(", ")}`;case"commitTask":return[`Committed task ${e.taskId}`,`Status: ${e.status}`,`Commit: ${e.commitSha}`,`Message: ${e.message}`].join(`
|
|
241
|
-
`);default:return
|
|
242
|
-
`)}function
|
|
243
|
-
`)}function
|
|
244
|
-
`)}function
|
|
245
|
-
`)}function
|
|
246
|
-
`)}function
|
|
247
|
-
`)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let d=n?
|
|
248
|
-
`),0}catch(r){let s=
|
|
249
|
-
`),s.exitCode}}function
|
|
250
|
-
`).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function
|
|
251
|
-
`)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function
|
|
252
|
-
`),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Ce(t,r,"missing",t,null)}}async function
|
|
253
|
-
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await
|
|
254
|
-
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await
|
|
255
|
-
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await
|
|
241
|
+
`);default:return hv(e)}}function uv(e){return[`${e.id}: ${e.state}`,`Definition: ${e.name} (${e.definitionHash})`,`Root task: ${e.rootTaskId}`,...e.order.map(t=>{let n=e.stepRuns[t];return`${t}: ${n.state}${n.taskId?` (${n.taskId})`:""}${n.error?` - ${n.error}`:""}`})].join(`
|
|
242
|
+
`)}function vh(e){return[`${e.id}: ${e.state}`,`Run: ${e.runId}`,`Step: ${e.stepId}`,`Round: ${e.round}`,`Title: ${e.title}`,`Summary: ${e.summary}`,`Deadline: ${e.deadlineAt}`].join(`
|
|
243
|
+
`)}function dv(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
|
|
244
|
+
`)}function fu(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function pv(e){return e.agents.length===0?"No agent tabs found.":["TASK TAB RUNNER STATE SESSION ERROR",...e.agents.map(t=>`${t.taskId} ${t.tabId} ${t.runner} ${t.state} ${t.sessionState??"none"} ${t.error??""}`),...e.daemonAvailable?[]:["Warning: PTY daemon unavailable; live agent tabs report idle unless a durable startup failure exists."]].join(`
|
|
245
|
+
`)}function fv(e){let t=`${e.taskId} (${e.repoId}): ${e.disposition}`,n=e.pullRequests.length===0?["No pull requests associated."]:["PR STATUS HEAD URL",...e.pullRequests.map(r=>`#${r.number??"-"} ${r.status??"unknown"} ${r.headBranch??"-"} ${r.url??"-"}`)];return[t,...n,...e.warnings.map(r=>`Warning: ${r}`)].join(`
|
|
246
|
+
`)}function mv(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 hv(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function gv(e){return e.checks.status}function yv(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 Ah(e,t){let{data:n,warnings:r}=wv(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function wv(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Eh(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 mu(e){let t=await Te.resolveContext({cwd:e.cwd,...e.explicitWorkspaceRoot!==void 0?{explicitWorkspaceRoot:e.explicitWorkspaceRoot}:{},...e.environmentWorkspaceRoot!==void 0?{environmentWorkspaceRoot:e.environmentWorkspaceRoot}:{},...e.allowUninitializedWorkspace!==void 0?{allowUninitializedCwd:e.allowUninitializedWorkspace}:{}}),n=Ee(t.workspaceRoot),r=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(r&&!t.initialized)throw new g("TASK_CONTEXT_NOT_FOUND",`Task context cannot be resolved because ${t.workspaceRoot} is not an initialized Craig workspace.`,{details:{workspaceRoot:t.workspaceRoot}});let s=r&&t.initialized?await S.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function Oh(e){let t="cli",n=zd(e.argv);try{let r=Yd(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||vv(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 mu({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.",{});bv(r.command,r.options.taskId);let s=Pv(r.command,r.options.taskId),i=Tv(s);Rv(s,r.options.taskId,i);let o=i!=="none",a=await mu({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:kv(s),resolveTask:i!=="none",requireTask:i==="required"}),l=Sv(s,e.signal),c;try{c=await Ih(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):fu(u)}
|
|
247
|
+
`)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let d=n?Ah(t,c):Ch(c);return d.length>0&&e.writeStdout(`${d}
|
|
248
|
+
`),0}catch(r){let s=ba(r),i=n?Eh(t,s):s.message;return e.writeStderr(`${i}
|
|
249
|
+
`),s.exitCode}}function kv(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function Tv(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="renameTask"?e.taskId?"none":"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||Iv(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 bv(e,t){let n=$h(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 Rv(e,t,n){if(!(t===void 0||n!=="none"||$h(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 $h(e){switch(e.kind){case"showTask":case"renameTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"createChildTask":return e.parentTaskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":case"addTaskRepoTarget":return e.taskId;default:return}}function Pv(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask"||e.kind==="renameTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function Sv(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 Iv(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function vv(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as p0}from"node:module";import{readFile as Cv,stat as Av}from"node:fs/promises";import hu from"node:path";var Ev=200*1024,Ov=500*1024,Eo="100000";async function Dh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return $v(e,t,n);try{let r=pn(n.selectedFilePath??null,t.filePaths),s=pn(n.selectedDiffPath??null,t.diffPaths),i=s?await As(e.worktreePath):null,[o,a]=await Promise.all([$o(e.worktreePath,r),s?gu(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ce("No diff selected","No local changes found.","empty"))]),l=s?{[s]:a}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:l,selectedFile:o,selectedDiff:a,error:null}}catch(r){let s=r instanceof Error?r.message:"Unable to inspect task worktree.";return{...t,error:s}}}async function $v(e,t,n){let r=pn(n.selectedFilePath??null,t.filePaths),s=pn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([xh(e,r),(async()=>{if(!s)return Ce("No diff selected","No local changes found.","empty");let l=Oo(e,s),c=l?await As(l.target.worktreePath).catch(()=>null):null;return Fh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function _h(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return Nv(e,t);try{await he(e);let n=await As(e.worktreePath),[r,s]=await Promise.all([Lh(e.worktreePath),Mh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=pn(t.selectedFilePath??null,r),a=pn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([$o(e.worktreePath,o),a?gu(e.worktreePath,a,s,n):Promise.resolve(Ce("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:Wh(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:Ce("Files unavailable",r,"error"),selectedDiff:Ce("Diff unavailable",r,"error"),error:r}}}async function Nv(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await As(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([Lh(p.worktreePath).catch(()=>[]),Mh(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:f,targetDiffRows:m}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:f}of r)s.push(...h.map(m=>`${p.repoId}/${m}`)),i.push(...f.map(m=>({...m,path:`${p.repoId}/${m.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=pn(t.selectedFilePath??null,s),l=pn(t.selectedDiffPath??null,o),[c,d]=await Promise.all([xh(e,a),(async()=>{if(!l)return Ce("No diff selected","No local changes found.","empty");let p=Oo(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return Fh(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:Wh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function xh(e,t){let n=Oo(e,t);if(!n)return Ce("No file selected","No Git-visible files found.","empty");let r=await $o(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Fh(e,t,n,r=null){let s=Oo(e,t);return s?{...await gu(s.target.worktreePath,s.relativePath,n.filter(o=>o.path.startsWith(`${s.target.repoId}/`)).map(o=>({...o,path:o.path.slice(s.target.repoId.length+1)})),r),path:t,title:t}:Ce(t,"Repo target is unavailable.","error",t)}function Oo(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 Lh(e){let t=await K("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return Vh(t.stdout)}async function Mh(e,t){let[n,r,s,i]=await Promise.all([Dv(e,t),Nh(e,"staged"),Nh(e,"unstaged"),_v(e)]);return[...n,...r,...s,...i]}async function Dv(e,t){if(!t)return[];let[n,r]=await Promise.all([K("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),K("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=jh(n.stdout),i=qh(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 Nh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([K("git",[...n,"--name-status"],{cwd:e}),K("git",[...n,"--numstat"],{cwd:e})]),i=jh(r.stdout),o=qh(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 _v(e){let t=await K("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=Vh(t.stdout);return await Promise.all(n.map(async s=>{let i=await $o(e,s),o=i.status==="ready"?xv(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function jh(e){return e.split(`
|
|
250
|
+
`).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function qh(e){let t=new Map;for(let n of e.split(`
|
|
251
|
+
`)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function As(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 $o(e,t){if(!t)return Ce("No file selected","No Git-visible files found.","empty");let n=Fv(e,t);return Bh(n,t)}async function Uh(e){return Bh(e,e)}async function Bh(e,t){try{let n=await Av(e);if(n.size>Ev)return Ce(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await Cv(e);return Lv(r)?Ce(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
|
|
252
|
+
`),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Ce(t,r,"missing",t,null)}}async function gu(e,t,n,r=null){if(!t)return Ce("No diff selected","No local changes found.","empty");let s=[],i=n.filter(a=>a.path===t).map(a=>a.group);if(i.includes("branch")){let a=r??await As(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${Eo}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
|
|
253
|
+
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await K("git",["diff","--cached","--stat","--patch",`--unified=${Eo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
|
|
254
|
+
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await K("git",["diff","--stat","--patch",`--unified=${Eo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
|
|
255
|
+
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await J("git",["diff","--no-index","--stat","--patch",`--unified=${Eo}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
|
|
256
256
|
${a.stdout.trimEnd()}`)}let o=s.join(`
|
|
257
257
|
|
|
258
|
-
`);return o.length>
|
|
259
|
-
`):["No diff for this file."],byteLength:o.length}}function
|
|
260
|
-
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function
|
|
261
|
-
`}function mu(e){return e.length===1&&e>=" "&&e!=="\x7F"}function hu(e){return Hh(e)||Rr(e)!==null}function Gh(e){return jh.includes(e)}function Hh(e){return Mh.includes(e)}function Yh(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[B]:[]]}function yv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function wv(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 kv(e){return e==="tabs"?"center":Ss(e,hv,"tasks")}function Tv(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ss(e,fu,t)}function bv(e){return e==="file"||e==="diff"?e:null}function Rv(e){return e==="terminal"?"terminal":"agent"}function Pv(e){return e==="terminal"?"terminal":"control"}function Sv(e,t=[...mt],n="codex"){return e&&T.runners.isRunnerType(e)&&t.includes(e)?e:n}function Co(e,t=mt){let n=t.length>0?t:mt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Rr(e){let t=ue.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function Iv(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(Hh(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 vv(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?Cv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function Cv(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 Av(e,t){let n=Mn(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 Mn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Is(Ao(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 Is(Eo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Ao(e,t){return zh(e,n=>n.workspaceId===t)}function Eo(e,t){return zh(e,n=>n.repoId===t)}function Ev(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function zh(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Is(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 gu(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 jt(e){return typeof e=="string"?e:null}function Ov(e){return e?`task:${e}`:null}function Cs(e){return typeof e=="string"&&e.startsWith("task:")}function Oo(e){return typeof e=="string"&&e.startsWith("new-task:")}function $o(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Jh(e){return typeof e=="string"&&e.startsWith("workspace:")}function No(e){return Oo(e)?e.slice(9):null}function Do(e){return $o(e)?e.slice(19):null}async function Pr(e,t,n){let r=Ae(e),[s,i]=await Promise.all([Te.repos.listRegisteredRepos(r),Te.listWorkspaces(r,{archived:!1})]),o=await P.listTasks(r),a={},l=await T.load(r),c=0;if(T.previews.isEnabled(l,"agentOrchestration")){let h=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(k=>k.kind==="agent").map(async k=>({agentTab:k,environment:await et(r,y,void 0,k.id)}))));for(let{agentTab:y,environment:k}of h)k.CRAIG_AGENT_CAPABILITY&&(a[y.id]=k.CRAIG_AGENT_CAPABILITY);o=await P.listTasks(r);let[f,m]=await Promise.all([hf(r),gi(r)]);c=f.length+m.filter(y=>y.state==="waiting_for_review").length}let d=yu(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await Ch(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 yu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Xh(e,t){return vs(e,t)}import Cu from"node:path";import AV from"picocolors";var $v=[" \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 wu(){return[...$v]}var _o={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function qe(e,t){return{width:Math.max(e??_o.width,_o.width),height:Math.max(t??_o.height,_o.height)}}var Nv=["Start","Options","Exit"],Dv=["Resume","Options","Exit"],Lo=2,Fo=2,Mo=2,_v=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),xv=new RegExp("\x1B\\[(?:0)?m","g"),Lv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),Fv=/https?:\/\/[^\s<>"']+/g,Tu="\x1B[0m",bu="\x1B]8;;\x1B\\",D={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},ku=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function eg(e,t={}){return Pu(e,{subtitle:"crAIg is that you?",menuItems:Nv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function tg(e,t={}){return Pu(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 xo=[" 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."],Mv=["Help"],jv=5;function Uo(e,t={}){return Pu(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??Mv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function ng(e,t={}){let n=t.color??!0,r=D.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=wu(),o=Math.max(1,Math.floor((e.height-i.length-2-xo.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=re(dg(i[d]??"",e.width),n,D.overlayLogo);let a=Math.max(...xo.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<xo.length;d+=1){let u=c+d;if(u>=e.height)break;let p=xo[d]??"";s[u]=re(St(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
262
|
-
`)}function
|
|
263
|
-
`)}function
|
|
264
|
-
`)
|
|
265
|
-
`)}function Wv(e,t,n,r){let s=Yv(e.runners),i=1,o=e.leftTree.map(l=>Hv(l,t,r));return[...As(o,n-i),s]}function Bv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!hu(s)?e.centerTranscript.map(o=>({...o})):Vv(e);return As([...ag(e,t,r),...i],n)}function ag(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:aC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Sr(a,n,D.panelBg):qo(a,n,D.panelMuted)}`,c=[`${qo(e.centerHeader.tabLabel,n,D.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=zv(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?Sr(`${u}\u25CF `,n,D.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ne(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${f}${h}`:d},{text:l,tone:"muted"},{text:c},dt()]}function Vv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},dt(),{text:e.terminal.error},dt(),{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(lg)}function lg(e){return{text:Iu(e.segments),segments:e.segments,fullBleed:!0}}function Kv(e,t,n,r){let s=e.rightInspection?Gv(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):As([{text:"CONTEXT"},dt(),...e.rightContext.map(i=>Jv(i,r)),...e.actionMessage?[dt(),{text:e.actionMessage}]:[]],n);return As(s,n)}function Gv(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:cC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>Qh(a)),...r.slice(o,o+s).map(a=>Qh(a))]}function Qh(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 Hv(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Sr("\u25CF",n,e.selected?D.panelSelected:D.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ne(m.text),0):0,l=t-Ne(i)-Ne(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?Sr(e.text,n,D.panelBg):e.panelHeader?qo(e.text,n,D.panelMuted):e.text,u=St(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=u.slice(f.length+2),y=[{text:f},cg(e.activity,e.activityAnimationFrame??0),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:Iu(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function Yv(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:D.success.fg}}):n.push({text:s.text,style:{fg:D.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function zv(e,t,n){return e.map(r=>{let s=r.active?n?Sr(r.label,t,D.panelBg):qo(r.label,t,D.panelBg):vu(r.label,t,D.panelBg),i=r.activity?Su(cg(r.activity,r.activityAnimationFrame??0),t,D.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function cg(e,t){return{text:"\u25CF",style:{fg:e==="working"?ku[t%ku.length]??ku[0]:e==="ready"?D.success.fg:e==="error"?D.error.fg:D.panelMuted.fg}}}function Jv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?vu(e.value,t,D.panelBg):e.value}`}}function jo(e,t,n,r){let s=Xv(r,e.tone??"default"),i=Qv(e,n,s);if(r==="left"){if(e.fullBleed)return re(St(i,t),n,s);let a=t-Lo-Fo;if(e.rightAlign){let c=Ne(i),d=Math.max(0,a-c),u=`${" ".repeat(Lo)}${" ".repeat(d)}${i}${" ".repeat(Fo)}`;return re(u,n,s)}let l=`${" ".repeat(Lo)}${St(i,a)}${" ".repeat(Fo)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?Zv(e,t,n,s):re(St(` ${i}`,t),n,s)}function Xv(e,t){return t==="selected"||t==="focused"?D.panelSelected:t==="muted"?D.panelMuted:D.panelBg}function As(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(dt());return n}function dt(){return{text:""}}function Qv(e,t,n){return e.segments?e.segments.map(r=>Su(r,t,n)).join(""):e.text}function Zv(e,t,n,r){let s=" ".repeat(Mo),i=Math.max(0,t-Mo*2);if(!e.segments)return re(`${s}${St(e.text,i)}${s}`,n,r);let o=nC(e.segments,i),a=`${s}${o.map(l=>Su(l,n,r)).join("")}${s}${n?bu:""}`;return re(a,n,r)}function Su(e,t,n){let r=e.href?`${ug(e.href)}${e.text}${bu}`:eC(e.text);return!t||!e.style?r:`${Es(iC(e.style,n))}${oC(e.style)}${r}${Tu}${Es(n)}`}function eC(e){return e.replace(Fv,t=>{let[n,r]=tC(t);return`${ug(n)}${n}${bu}${r}`})}function tC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function ug(e){return`\x1B]8;;${e}\x1B\\`}function nC(e,t){let n=rC(e,t);return sC(n,t)}function rC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ne(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Wo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function sC(e,t){let n=Ne(Iu(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 iC(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 oC(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 aC(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 dg(e,t){let n=Math.max(0,t-Ne(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function St(e,t){let n=Ne(e);return n>=t?lC(e,t):e+" ".repeat(t-n)}function lC(e,t){if(t<=0)return"";if(Ne(e)<=t)return e;let n=fg(e);return Wo(n,Math.max(0,t-1))+"\u2026"}function Ne(e){let t=0;for(let n of Array.from(fg(e)))t+=pg(n);return t}function Wo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=pg(s);if(r+i>t)break;n+=s,r+=i}return n}function pg(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 cC(e,t,n){return Math.min(Math.max(e,t),n)}function fg(e){return e.replace(Lv,"").replace(_v,"")}function Iu(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=Es(n),s=e.replace(xv,`${Tu}${r}`);return`${r}${s}${Tu}`}function Es(e){let t=[];return e.fg&&t.push(`38;2;${Zh(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Zh(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Zh(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Sr(e,t,n){return Bo(e,t,D.success.fg,n)}function uC(e,t,n){return Bo(e,t,D.error.fg,n)}function qo(e,t,n){return Bo(e,t,D.accent.fg,n)}function vu(e,t,n){return Bo(e,t,D.mutedfg.fg,n)}function Bo(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Es(s)}${e}${Es(r)}`}function mg(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"?pC(s,r?.runner):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:dC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function dC(e,t){let n=(e??"").split(Cu.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Cu.delimiter):[...n,t].join(Cu.delimiter)}function pC(e,t){let n=e.command.length>0?e.command:["codex"];return wo(n,e.runner??t??"codex")}function hg(e,t){let n=e.ptyTabs.find(r=>r.kind===t);if(!n)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return n.id}function dn(e){return{columns:Math.max(20,e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth-Mo*2),rows:Math.max(5,e.height-Z.topRailHeight-5)}}function gg(e){return e.length===1||ut(e)||e==="BACKSPACE"||e==="TAB"}function Ut(e){return typeof e=="string"&&new RegExp(`:(?:agent|${ue.join("|")})(?:-\\d+)?$`).test(e)}function yg(e,t){return e==="UP"&&t?-3:e==="DOWN"&&t?3:e==="PAGE_UP"?-5:e==="PAGE_DOWN"?5:e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Au(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function wg(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 Os(e){return Tg.includes(e)?"SHIFT_ENTER":null}function Eu(e){return Tg.some(t=>t.startsWith(e))}function kg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Tg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function bg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
258
|
+
`);return o.length>Ov?Ce(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ce(t,"Binary diff preview is not available in Craig.","binary",t,o.length):{path:t,status:o.length>0?"ready":"empty",title:t,lines:o.length>0?o.split(`
|
|
259
|
+
`):["No diff for this file."],byteLength:o.length}}function Wh(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function pn(e,t){return e&&t.includes(e)?e:t[0]??null}function xv(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Vh(e){return[...new Set(e.split(`
|
|
260
|
+
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function Fv(e,t){let n=hu.resolve(e,t),r=hu.resolve(e);if(n!==r&&!n.startsWith(`${r}${hu.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function Lv(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ce(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var Mv=["tasks","center","inspector","actions"],Kh=["agent","terminal"],Gh=[],V="inspection",LV=[...Kh,...Gh],yu=["commit","push","refresh-checks","close-task"],Hh=["refresh-checks","close-task"],Yh=["task","checks","pr","setup-run","actions","next-action"],wu=["files","review"];function zh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=Vv(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:Gv(e?.inputMode),focusedRegion:Bv(e?.focusedRegion),selectedRepoId:qt(e?.selectedRepoId),selectedWorkspaceId:qt(e?.selectedWorkspaceId),selectedTaskId:qt(e?.selectedTaskId),selectedPtyTabId:qt(e?.selectedPtyTabId),selectedLeftItemId:Zv(qt(e?.selectedTaskId)),activeTab:n?V:qt(e?.activeTab)??"agent",preferredPtyTabKind:Kv(e?.preferredPtyTabKind),inspectorSection:Es(e?.inspectorSection,Yh,"task"),inspectionMode:Wv(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:qt(e?.selectedFileTreePath),selectedFilePath:qt(e?.selectedFilePath),selectedDiffPath:qt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Es(e?.selectedActionId,yu,"commit"),selectedProjectTargetId:null,selectedRunner:Hv(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:jv(),centerZoomed:!1}}function jv(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function No(e,t){return{...e??Ws(),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 $s(e,t,n={}){let r=Xv(e,t),s=Tu(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?Qv(t.tasks,i):null,a=qo(r),l=jo(r),c=t.workspaces?.find(f=>f.id===a)??(l?t.workspaces?.find(f=>f.kind==="repo"&&f.primaryRepoId===l):null)??(s?.kind==="workspace"?t.workspaces?.find(f=>f.id===s.id)??null:null)??(o?t.workspaces?.find(f=>f.id===o.workspaceId)??null:null)??t.workspaces?.find(f=>f.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,u=(t.repos.find(f=>f.id===l)??(s?.kind==="repo"?t.repos.find(f=>f.id===s.id)??null:o?t.repos.find(f=>f.id===o.repoId)??null:null)??(c?.kind==="project"?t.repos.find(f=>f.id===e.selectedRepoId&&c.discoveredRepoIds?.includes(f.id))??null:null)??(c?.kind!=="project"?t.repos.find(f=>f.id===c?.primaryRepoId)??null:null)??t.repos.find(f=>f.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,p=c?xo(t.tasks,c.id):u?Fo(t.tasks,u):[],h=(s?.kind==="task"?p.find(f=>f.id===s.id)??null:null)??p.find(f=>f.id===e.selectedTaskId)??p[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:c?.id??null,selectedRepoId:u,selectedTaskId:h?.id??null,...Yv(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:Uv(e,t,h?.id??null),...zv(e,t,h?.id??null),selectedDiffPath:qv(e,t,h?.id??null),inspectorSection:Es(e.inspectorSection,Yh,"task")}}function Ut(e,t){return{...e,terminal:t}}function Jh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Xh(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function Qe(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
261
|
+
`}function ku(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Do(e){return Zh(e)||Sr(e)!==null}function Qh(e){return Gh.includes(e)}function Zh(e){return Kh.includes(e)}function eg(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[V]:[]]}function qv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function Uv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Es(e,t,n){return t.includes(e??"")?e:n}function Bv(e){return e==="tabs"?"center":Es(e,Mv,"tasks")}function Wv(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Es(e,wu,t)}function Vv(e){return e==="file"||e==="diff"?e:null}function Kv(e){return e==="terminal"?"terminal":"agent"}function Gv(e){return e==="terminal"?"terminal":"control"}function Hv(e,t=[...gt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function _o(e,t=gt){let n=t.length>0?t:gt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Sr(e){let t=ue.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function Yv(e,t,n){if(!e)return{activeTab:t===V?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(Zh(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??V,selectedPtyTabId:l?.id??null}}if(t===V)return{activeTab:V,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??V,selectedPtyTabId:o?.id??null}}function zv(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?Jv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function Jv(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 Xv(e,t){let n=jn(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function jn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Os(xo(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 Os(Fo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function xo(e,t){return tg(e,n=>n.workspaceId===t)}function Fo(e,t){return tg(e,n=>n.repoId===t)}function Qv(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function tg(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Os(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 Tu(e){return e?e.startsWith("workspace:")?{kind:"workspace",id:e.slice(10)}:e.startsWith("repo:")?{kind:"repo",id:e.slice(5)}:e.startsWith("task:")?{kind:"task",id:e.slice(5)}:null:null}function qt(e){return typeof e=="string"?e:null}function Zv(e){return e?`task:${e}`:null}function Ns(e){return typeof e=="string"&&e.startsWith("task:")}function Lo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Mo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function ng(e){return typeof e=="string"&&e.startsWith("workspace:")}function jo(e){return Lo(e)?e.slice(9):null}function qo(e){return Mo(e)?e.slice(19):null}async function Ir(e,t,n){let r=Ee(e),[s,i]=await Promise.all([Te.repos.listRegisteredRepos(r),Te.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let h=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await tt(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of h)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r);let[f,m]=await Promise.all([Rf(r),bi(r)]);c=f.length+m.filter(y=>y.state==="waiting_for_review").length}let d=bu(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await _h(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 bu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function rg(e,t){return $s(e,t)}import $u from"node:path";import YV from"picocolors";var eC=[" \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 Ru(){return[...eC]}var Uo={width:120,height:36},X={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Ue(e,t){return{width:Math.max(e??Uo.width,Uo.width),height:Math.max(t??Uo.height,Uo.height)}}function Ds(e,t=!1){let s=X.topRailHeight+1,i=e.height-X.topRailHeight-1,o={row:s,height:i,column:t?2:35,width:t?e.width-2:e.width-32-34-4};return{left:t?null:{row:s,height:i,column:2,width:32},center:o,right:t?null:{row:s,height:i,column:e.width-34,width:34}}}function sg(e,t=!1){let n=Ds(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var tC=["Start","Options","Exit"],nC=["Resume","Options","Exit"],lg=2,cg=2,Wo=2,rC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),sC=new RegExp("\x1B\\[(?:0)?m","g"),iC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),oC=/https?:\/\/[^\s<>"']+/g,Su="\x1B[0m",Cu="\x1B]8;;\x1B\\",C={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},Pu=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function ug(e,t={}){return Ko(e,{panelPolish:t.panelPolish??!1,subtitle:"crAIg is that you?",menuItems:tC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function dg(e,t={}){return Ko(e,{panelPolish:t.panelPolish??!1,subtitle:"Control mode is paused.",menuItems:nC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function pg(e,t,n={}){let r=`npm install -g craig-cli@${t.latest}`,i=t.phase==="installing"?{subtitle:`Updating Craig \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Updating\u2026"],message:r}:t.phase==="success"?{subtitle:`Craig ${t.latest} installed \xB7 restart to use it`,menuItems:["Continue","Exit Craig"],message:"The current Craig session is still running the previous version."}:t.phase==="error"?{subtitle:"Craig update failed",menuItems:["Retry","Continue"],message:t.error??"npm could not install the update."}:{subtitle:`Update available \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Update now","Continue","Ignore this version"],message:`Release notes: https://github.com/hallsamuel90/craig/releases/latest
|
|
262
|
+
Runs: ${r}`};return Ko(e,{subtitle:i.subtitle,menuItems:i.menuItems,menuIndex:n.menuIndex??0,optionsMessage:i.message,color:n.color??!0})}var Bo=[" 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."],aC=["Help"],lC=5;function Vo(e,t={}){return Ko(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??aC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function fg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(j(" ".repeat(e.width),n,r)),i=Ru(),o=Math.max(1,Math.floor((e.height-i.length-2-Bo.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=j(Og(i[d]??"",e.width),n,C.overlayLogo);let a=Math.max(...Bo.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Bo.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Bo[d]??"";s[u]=j(pt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
263
|
+
`)}function mg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(j(" ".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"},dt(),...a.length>0?a.map(h=>({text:h,tone:cC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],dt(),{text:"Esc returns to Options.",tone:"muted"}],u=Cr(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let f=p+h;if(f>=e.height)break;let m=u[h]??dt(),y=`${" ".repeat(c)}${Go(m.text,l)}`,T=m.tone==="selected"?C.overlayMenuSelected:m.tone==="info"?{...C.overlay,fg:C.accent.fg}:m.tone==="warning"?{...C.overlay,fg:C.pending.fg}:m.tone==="error"?{...C.overlay,fg:C.error.fg}:m.tone==="muted"?C.overlay:C.panelBg;s[f]=j(pt(y,e.width),n,T)}return s.join(`
|
|
264
|
+
`)}function cC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function hg(e,t,n={}){if(n.panelPolish)return uC(e,t,n);let r=n.color??!0,s=X.leftWidth,i=X.rightWidth,o=n.centerOnly??!1,a=e.height-X.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:C.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:C.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:C.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=j(pt(p,e.width),r,C.rail),f=Rg(t,s-lg-cg,a,r),m=Au(e,t,{color:r,centerOnly:o}),y=Ig(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let ye=0;ye<a;ye+=1)if(!o){let z=vr(f[ye]??dt(),s,r,"left"),gn=j("\u2502",r,d),pa=j("\u2502",r,u),Dr=vr(y[ye]??dt(),i,r,"right");R.push(`${z}${gn}`),b.push(`${pa}${Dr}`)}let $=T||t.modalInput?C.panelBg:C.panelMuted,N=bg(t.footerText,t.footerToast,e.width,r,$),D={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:X.topRailHeight+1,column:1,width:s+X.dividerWidth,rows:R},A=o?null:{row:X.topRailHeight+1,column:m.column+m.width,width:X.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[N]},Se=o?m.rows:m.rows.map((ye,z)=>`${R[z]??""}${ye}${b[z]??""}`);return{frame:[h,...Se,N].join(`
|
|
265
|
+
`),center:m,regions:{rail:D,left:_,center:m,right:A,footer:w}}}function Au(e,t,n={}){if(n.panelPolish)return yg(e,t,n);let r=n.color??!0,s=Tg(e,n.centerOnly??!1),i=dC(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>vr(o,s.width,r,"center"))}}function gg(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Do(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;if(r.panelPolish){let c=Ds(e,r.centerOnly).center;return{row:c.row,column:c.column,width:c.width,rowCount:c.height,rows:[...new Set(n)].filter(d=>d+2<c.height-1).map(d=>({index:d+2,row:kg(vu(t.terminal.rows[d]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=Tg(e,r.centerOnly??!1),a=Pg(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:vr(vu(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function uC(e,t,n){let r=n.color??!0,s=Ds(e,n.centerOnly),i=yg(e,t,n),o=j(" ",r,C.panelBg),a=` CRAIG ${xs("/",r,C.panelBg)} ${xs(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[j(pt(a,e.width),r,C.rail)]},c=null,d=null;if(s.left&&s.right){let y=t.leftTree.filter(_=>!_.panelHeader).map(_=>({..._,indent:Math.floor((_.indent??0)/2)})),T=Rg({...t,leftTree:y},s.left.width-4,s.left.height-2,r),R=t.focusedRegion==="tasks"?qn("WORKSPACES",r,C.panelBg):_s("WORKSPACES",r,C.panelBg),b=Iu(T,R,s.left,t.focusedRegion==="tasks",r,"left");c={row:s.left.row,column:1,width:s.left.width+2,rows:b.map(_=>`${o}${_}${o}`)};let $=Ig(t,s.right.width-2,s.right.height-1,r),N=Ag($[0]??{text:"Inspector"},r,C.panelBg).trim(),D=Iu($.slice(1),N,s.right,t.focusedRegion==="inspector"||t.focusedRegion==="actions",r,"right");d={row:s.right.row,column:i.column+i.width,width:s.right.width+2,rows:D.map(_=>`${o}${_}${o}`)}}let u=t.modalInput?C.panelBg:C.panelMuted,p=bg(t.footerText,t.footerToast,e.width,r,u),h=t.modalInput?p:p.replace(/( {2,})(Tab|Enter|Esc|Ctrl\+\]|[ntxar?q+z]|↑↓\/PgUp\/PgDn)(?= )/g,(y,T,R)=>`${T}${j(R,r,C.panelSelected)}${r?Ar(u):""}`),f={row:e.height,column:1,width:e.width,rows:[h]},m=i.rows.map((y,T)=>c&&d?`${c.rows[T]}${y}${d.rows[T]}`:`${o}${y}${o}`);return{frame:[l.rows[0],...m,f.rows[0]].join(`
|
|
266
|
+
`),center:i,regions:{rail:l,left:c,center:i,right:d,footer:f}}}function yg(e,t,n){let r=n.color??!0,s=Ds(e,n.centerOnly).center,i=t.tabs.find(d=>d.active)?.id??"agent",o=t.centerHeader.tabLabel==="BROWSER"||!Do(i)?t.centerTranscript.map(d=>({...d})):Sg(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=vg(t.tabs,r,t.focusedRegion==="center"),c=Iu([{text:a,tone:"muted"},...o],l,s,t.focusedRegion==="center",r,"center",t.inputMode==="terminal");return{row:s.row,column:s.column,width:s.width,rows:c}}function wg(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function Iu(e,t,n,r,s,i,o=!1){let a=wg(r,o),l=$g(t,n.width-6),c=`${j("\u256D\u2500 ",s,a)}${j(l,s,r?a:C.panelMuted)}${j(` ${"\u2500".repeat(Math.max(0,n.width-Ae(l)-5))}\u256E`,s,a)}`,d=Cr(e,n.height-2).map(u=>kg(u,n.width,r,s,i,o));return[c,...d,j(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function kg(e,t,n,r,s,i=!1){let o=j("\u2502",r,wg(n,i)),a=s==="right"?`${vr(e,t-3,r,s)}${j(" ",r,C.panelBg)}`:vr(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function Tg(e,t){return{row:X.topRailHeight+1,column:t?1:X.leftWidth+X.dividerWidth+1,width:t?e.width:e.width-X.leftWidth-X.rightWidth-X.dividerWidth*2,rowCount:e.height-X.topRailHeight-1}}function bg(e,t,n,r,s){let i=` ${e}`;if(!t)return j(pt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ae(o),l=Ae(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?Go(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Ae(d)-a-2),p=t.tone==="error"?CC(o,r,s):qn(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return j(pt(h,n),r,s)}function Ko(e,t){if(!t.panelPolish)return ig(e,t);let n=e.width-4,r=ig({width:n,height:e.height-4},t).split(`
|
|
267
|
+
`),s={bg:C.overlay.bg,fg:C.accent.fg},i=j(" ",t.color,C.overlay),o=j("\u2502",t.color,s);return[j(" ".repeat(e.width),t.color,C.overlay),`${i}${j(`\u256D${"\u2500".repeat(n)}\u256E`,t.color,s)}${i}`,...r.map(a=>`${i}${o}${a}${o}${i}`),`${i}${j(`\u2570${"\u2500".repeat(n)}\u256F`,t.color,s)}${i}`,j(" ".repeat(e.width),t.color,C.overlay)].join(`
|
|
268
|
+
`)}function ig(e,t){let n=new Array(e.height).fill(j(" ".repeat(e.width),t.color,C.overlay)),r=Ru(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",...t.optionsMessage.split(`
|
|
269
|
+
`)]:[],o=[...s,...i];for(;o.length<lC;)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=Og(a[c]??"",e.width);if(c<r.length){n[l+c]=j(d,t.color,C.overlayLogo);continue}if(c===r.length+1){n[l+c]=j(d,t.color,C.overlaySubtitle);continue}let u=c-(r.length+3),h=u>=0&&u<t.menuItems.length&&u===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[l+c]=j(d,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-Ae(d)));n[e.height-1]=j(`${u}${xs(d,t.color,C.overlay)}`,t.color,C.overlay)}return n.join(`
|
|
270
|
+
`)}function Rg(e,t,n,r){let s=mC(e.runners),i=1,o=e.leftTree.map(l=>fC(l,t,r));return[...Cr(o,n-i),s]}function dC(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Do(s)?e.centerTranscript.map(o=>({...o})):Sg(e);return Cr([...Pg(e,t,r),...i],n)}function Pg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:IC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?qn(a,n,C.panelBg):_s(a,n,C.panelMuted)}`,c=[`${_s(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=vg(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?qn(`${u}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ae(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${f}${h}`:d},{text:l,tone:"muted"},{text:c},dt()]}function Sg(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},dt(),{text:e.terminal.error},dt(),{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(vu)}function vu(e){return{text:Ou(e.segments),segments:e.segments,fullBleed:!0}}function Ig(e,t,n,r){let s=e.rightInspection?pC(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):Cr([{text:"CONTEXT"},dt(),...e.rightContext.map(i=>hC(i,r)),...e.actionMessage?[dt(),{text:e.actionMessage}]:[]],n);return Cr(s,n)}function pC(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:vC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>og(a)),...r.slice(o,o+s).map(a=>og(a))]}function og(e){let t=e.focused?"\u25B8 ":e.selected?"\u2022 ":" ",n=e.focused||e.selected?"selected":e.muted?"muted":"default",r=`${t}${e.text}`;if(e.segments)return{text:r,segments:[{text:t},...e.segments],tone:n};if(e.accentPrefix&&!e.muted){let s=e.text.indexOf(" "),i=s===-1?e.text:e.text.slice(0,s),o=s===-1?"":e.text.slice(s);return{text:r,segments:[{text:t},{text:i,style:{fg:"7aa2f7"}},{text:o}],tone:n}}return e.color?{text:r,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:n}:{text:r,tone:n}}function fC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${qn("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ae(m.text),0):0,l=t-Ae(i)-Ae(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?qn(e.text,n,C.panelBg):e.panelHeader?_s(e.text,n,C.panelMuted):e.text,u=pt(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=u.slice(f.length+2),y=[{text:f},Cg(e.activity,e.activityAnimationFrame??0),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:Ou(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function mC(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:C.success.fg}}):n.push({text:s.text,style:{fg:C.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function vg(e,t,n){return e.map(r=>{let s=r.active?n?qn(r.label,t,C.panelBg):_s(r.label,t,C.panelBg):xs(r.label,t,C.panelBg),i=r.activity?Eu(Cg(r.activity,r.activityAnimationFrame??0),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Cg(e,t){return{text:"\u25CF",style:{fg:e==="working"?Pu[t%Pu.length]??Pu[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg}}}function hC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xs(e.value,t,C.panelBg):e.value}`}}function vr(e,t,n,r,s=!1){let i=gC(r,e.tone??"default"),o=Ag(e,n,i);if(r==="left"){let l=s?1:lg,c=s?1:cg;if(e.fullBleed)return j(pt(o,t),n,i);let d=t-l-c;if(e.rightAlign){let p=Ae(o),h=Math.max(0,d-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return j(f,n,i)}let u=`${" ".repeat(l)}${pt(o,d)}${" ".repeat(c)}`;return j(u,n,i)}return r==="center"&&e.fullBleed?yC(e,t,n,i):j(pt(` ${o}`,t),n,i)}function gC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function Cr(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(dt());return n}function dt(){return{text:""}}function Ag(e,t,n){return e.segments?e.segments.map(r=>Eu(r,t,n)).join(""):e.text}function yC(e,t,n,r){let s=" ".repeat(Wo),i=Math.max(0,t-Wo*2);if(!e.segments)return j(`${s}${pt(e.text,i)}${s}`,n,r);let o=TC(e.segments,i),a=`${s}${o.map(l=>Eu(l,n,r)).join("")}${s}${n?Cu:""}`;return j(a,n,r)}function Eu(e,t,n){let r=e.href?`${Eg(e.href)}${e.text}${Cu}`:wC(e.text);return!t||!e.style?r:`${Ar(PC(e.style,n))}${SC(e.style)}${r}${Su}${Ar(n)}`}function wC(e){return e.replace(oC,t=>{let[n,r]=kC(t);return`${Eg(n)}${n}${Cu}${r}`})}function kC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Eg(e){return`\x1B]8;;${e}\x1B\\`}function TC(e,t){let n=bC(e,t);return RC(n,t)}function bC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ae(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Go(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function RC(e,t){let n=Ae(Ou(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 PC(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 SC(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 IC(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 Og(e,t){let n=Math.max(0,t-Ae(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function pt(e,t){let n=Ae(e);return n>=t?$g(e,t):e+" ".repeat(t-n)}function $g(e,t){if(t<=0)return"";if(Ae(e)<=t)return e;let n=Dg(e);return Go(n,Math.max(0,t-1))+"\u2026"}function Ae(e){let t=0;for(let n of Array.from(Dg(e)))t+=Ng(n);return t}function Go(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Ng(s);if(r+i>t)break;n+=s,r+=i}return n}function Ng(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 vC(e,t,n){return Math.min(Math.max(e,t),n)}function Dg(e){return e.replace(iC,"").replace(rC,"")}function Ou(e){return e.map(t=>t.text).join("")}function j(e,t,n){if(!t)return e;let r=Ar(n),s=e.replace(sC,`${Su}${r}`);return`${r}${s}${Su}`}function Ar(e){let t=[];return e.fg&&t.push(`38;2;${ag(e.fg).join(";")}`),e.bg&&t.push(`48;2;${ag(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function ag(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function qn(e,t,n){return Ho(e,t,C.success.fg,n)}function CC(e,t,n){return Ho(e,t,C.error.fg,n)}function _s(e,t,n){return Ho(e,t,C.accent.fg,n)}function xs(e,t,n){return Ho(e,t,C.mutedfg.fg,n)}function Ho(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Ar(s)}${e}${Ar(r)}`}function _g(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"?EC(s,r?.runner):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:AC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function AC(e,t){let n=(e??"").split($u.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join($u.delimiter):[...n,t].join($u.delimiter)}function EC(e,t){let n=e.command.length>0?e.command:["codex"];return Po(n,e.runner??t??"codex")}function xg(e,t){let n=e.ptyTabs.find(r=>r.kind===t);if(!n)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return n.id}function Bt(e,t=!1,n=!1){if(t){let r=sg(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-X.leftWidth-X.rightWidth-X.dividerWidth-Wo*2),rows:Math.max(5,e.height-X.topRailHeight-5)}}function Fg(e){return e.length===1||Qe(e)||e==="BACKSPACE"||e==="TAB"}function Wt(e){return typeof e=="string"&&new RegExp(`:(?:agent|${ue.join("|")})(?:-\\d+)?$`).test(e)}function Lg(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 Nu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Mg(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 Fs(e){return qg.includes(e)?"SHIFT_ENTER":null}function Du(e){return qg.some(t=>t.startsWith(e))}function jg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var qg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Ug(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
266
271
|
`||n===`\r
|
|
267
|
-
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function
|
|
272
|
+
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Bg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Wg(e,t=null){let n=t?.split(`
|
|
268
273
|
`)??[];return e.split(`
|
|
269
|
-
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Vo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as aA,createConnection as Fg}from"node:net";import{mkdir as lA,readFile as Mg,rm as Ns,writeFile as cA}from"node:fs/promises";import uA from"node:path";import{setTimeout as SC}from"node:timers/promises";var pn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Ou(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:Ou(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=Ou(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 Ou(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Sg,readFile as fC,rm as $u,stat as mC,writeFile as hC}from"node:fs/promises";import Nu from"node:path";async function Du(e){let t=Nu.join(e.runtimeDir,"orchestration-supervisor.lock");await Sg(e.runtimeDir,{recursive:!0});try{await Sg(t)}catch(r){if(!yC(r))throw r;let s=await fC(Nu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await mC(t).catch(()=>null);if(typeof s?.pid=="number"&&!gC(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await $u(t,{recursive:!0,force:!0}),Du(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await hC(Nu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await $u(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await $u(t,{recursive:!0,force:!0}))}}}function gC(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 yC=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var wC="\x1B[200~",kC="\x1B[201~";function Ig(e,t){switch(e){case"codex":return Ko(t,50);case"cursor":return Ko(t,50);case"claude":return Ko(t,50);case"pi":return Ko(t,50);default:return TC(e)}}function Ko(e,t){return{paste:`${wC}${e}${kC}`,submit:"\r",submitDelayMs:t}}function TC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import bC from"node:path";var RC={type:"system",component:"orchestration-supervisor"};async function vg(e){let t=bC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ls(t)??{version:1,commands:{}},r=await He(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of PC(i))o.has(a)||(await In(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:RC),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await q(t,n)}function PC(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 Go=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 Du(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 Ro(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await vg(this.paths);let t=await He(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,$s("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 Ro(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,$s("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await P.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,$s("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,$s("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Yt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=Ig(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await SC(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,$s("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(!IC(t)||t.state==="queued"||t.state==="delivering")return;let n=await P.getTask(this.paths,t.taskId).catch(r=>{if(r instanceof g&&r.code==="TASK_NOT_FOUND")return null;throw r});if(!(!n||n.status==="closed")){if(t.state==="delivered"){(n.status==="draft"||n.runnerSession.lastKnownState==="starting")&&await P.markTaskStarted(this.paths,n.id);return}n.runnerSession.lastKnownState!=="failed"&&await P.recordStartupFailure(this.paths,n.id,t.lastError?.message??`Initial prompt ${t.state}.`)}}},IC=e=>e.idempotencyKey===`task-start:${e.taskId}`,$s=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var vC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Ir=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...vC,...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 Be,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=CC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(AC);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 CC(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 AC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as EC}from"node:fs";var Ho=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=Ot(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=EC(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 OC={selectedTaskId:null,reviewVisible:!1},$C={listTasks:async e=>(await P.listTasks(e)).tasks,syncTasks:async(e,t)=>(await P.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>P.getTask(e,n.id))))},Yo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??$C,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Ir({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Ho(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=DC(s);i.length>0&&await this.onTasksChanged(i);let o=NC(s);o.length>0&&await this.wake(o)},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,Cg(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)!==Cg(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 NC(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=LC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&xC.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 DC(e){let t=new Set;for(let n of e)n.taskId&&_C(n)&&t.add(n.taskId);return[...t]}function _C(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var xC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),LC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Cg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as HC}from"node:module";import MC from"@xterm/headless";var FC=new RegExp("^\x1B\\[(\\d*)S$"),zo=class{constructor(t){this.terminal=t;t.onResize(()=>{this.top=0,this.bottom=null}),t.parser.registerCsiHandler({final:"r"},n=>{if(t.buffer.active.type!=="normal")return!1;let r=Number(n[0]||1)-1,s=Math.min(Number(n[1]||t.rows),t.rows)-1;return r>=0&&r<s&&s<t.rows&&(this.top=r,this.bottom=s),!1});for(let n of["h","l"])t.parser.registerCsiHandler({prefix:"?",final:n},r=>(t.buffer.active.type==="normal"&&r.includes(6)&&(this.originMode=n==="h"),!1));t.parser.registerEscHandler({final:"c"},()=>(this.top=0,this.bottom=null,this.originMode=!1,!1)),t.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>(t.buffer.active.type==="normal"&&(this.top=0,this.bottom=null,this.originMode=!1),!1))}terminal;top=0;bottom=null;originMode=!1;state="text";pending="";queue=Promise.resolve();write(t){return this.queue=this.queue.then(()=>this.writeChunk(t)),this.queue}async writeChunk(t){let n="";for(let r of t){if(this.state==="string"||this.state==="stringEscape"){n+=r,r==="\x07"||this.state==="stringEscape"&&r==="\\"?this.state="text":this.state=r==="\x1B"?"stringEscape":"string";continue}if(this.state==="text"){r==="\x1B"?(this.pending=r,this.state="escape"):n+=r;continue}if(this.pending+=r,this.state==="escape"){r==="["?this.state="csi":("]PX^_".includes(r)?this.state="string":this.state="text",n+=this.pending,this.pending="");continue}if(r<"@"||r>"~")continue;let s=this.pending;this.pending="",this.state="text";let i=FC.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
|
|
270
|
-
`.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function
|
|
271
|
-
`,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:""},
|
|
272
|
-
`))&&this.touchActivity(n))}writeKey(t){let n=
|
|
273
|
-
[process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function
|
|
274
|
+
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Yo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as SA,createConnection as ry}from"node:net";import{mkdir as IA,readFile as sy,rm as Ms,writeFile as vA}from"node:fs/promises";import CA from"node:path";import{setTimeout as UC}from"node:timers/promises";var fn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=_u(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:_u(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=_u(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 _u(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Vg,readFile as OC,rm as xu,stat as $C,writeFile as NC}from"node:fs/promises";import Fu from"node:path";async function Lu(e){let t=Fu.join(e.runtimeDir,"orchestration-supervisor.lock");await Vg(e.runtimeDir,{recursive:!0});try{await Vg(t)}catch(r){if(!_C(r))throw r;let s=await OC(Fu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await $C(t).catch(()=>null);if(typeof s?.pid=="number"&&!DC(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await xu(t,{recursive:!0,force:!0}),Lu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await NC(Fu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await xu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await xu(t,{recursive:!0,force:!0}))}}}function DC(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 _C=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var xC="\x1B[200~",FC="\x1B[201~";function Kg(e,t){switch(e){case"codex":return zo(t,50);case"cursor":return zo(t,50);case"claude":return zo(t,50);case"pi":return zo(t,50);default:return LC(e)}}function zo(e,t){return{paste:`${xC}${e}${FC}`,submit:"\r",submitDelayMs:t}}function LC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import MC from"node:path";var jC={type:"system",component:"orchestration-supervisor"};async function Gg(e){let t=MC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Us(t)??{version:1,commands:{}},r=await Ye(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of qC(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:jC),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await B(t,n)}function qC(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 Jo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new fn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await Lu(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 Co(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await Gg(this.paths);let t=await Ye(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Ls("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 Co(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Ls("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,Ls("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,Ls("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Jt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=Kg(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await UC(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,Ls("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(!BC(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}.`)}}},BC=e=>e.idempotencyKey===`task-start:${e.taskId}`,Ls=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var WC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Er=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...WC,...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 Ve,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=VC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(KC);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 VC(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 KC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as GC}from"node:fs";var Xo=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=$t(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=GC(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 HC={selectedTaskId:null,reviewVisible:!1},YC={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))))},Qo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??YC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Er({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Xo(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=JC(s);i.length>0&&await this.onTasksChanged(i);let o=zC(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new fn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=HC;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,Hg(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)!==Hg(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 zC(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=ZC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&QC.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 JC(e){let t=new Set;for(let n of e)n.taskId&&XC(n)&&t.add(n.taskId);return[...t]}function XC(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var QC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),ZC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Hg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as uA}from"node:module";import tA from"@xterm/headless";var eA=new RegExp("^\x1B\\[(\\d*)S$"),Zo=class{constructor(t){this.terminal=t;t.onResize(()=>{this.top=0,this.bottom=null}),t.parser.registerCsiHandler({final:"r"},n=>{if(t.buffer.active.type!=="normal")return!1;let r=Number(n[0]||1)-1,s=Math.min(Number(n[1]||t.rows),t.rows)-1;return r>=0&&r<s&&s<t.rows&&(this.top=r,this.bottom=s),!1});for(let n of["h","l"])t.parser.registerCsiHandler({prefix:"?",final:n},r=>(t.buffer.active.type==="normal"&&r.includes(6)&&(this.originMode=n==="h"),!1));t.parser.registerEscHandler({final:"c"},()=>(this.top=0,this.bottom=null,this.originMode=!1,!1)),t.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>(t.buffer.active.type==="normal"&&(this.top=0,this.bottom=null,this.originMode=!1),!1))}terminal;top=0;bottom=null;originMode=!1;state="text";pending="";queue=Promise.resolve();write(t){return this.queue=this.queue.then(()=>this.writeChunk(t)),this.queue}async writeChunk(t){let n="";for(let r of t){if(this.state==="string"||this.state==="stringEscape"){n+=r,r==="\x07"||this.state==="stringEscape"&&r==="\\"?this.state="text":this.state=r==="\x1B"?"stringEscape":"string";continue}if(this.state==="text"){r==="\x1B"?(this.pending=r,this.state="escape"):n+=r;continue}if(this.pending+=r,this.state==="escape"){r==="["?this.state="csi":("]PX^_".includes(r)?this.state="string":this.state="text",n+=this.pending,this.pending="");continue}if(r<"@"||r>"~")continue;let s=this.pending;this.pending="",this.state="text";let i=eA.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
|
|
275
|
+
`.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function Yg(e,t){let n=t;if(!n.hasExtendedAttrs?.())return;let r=n.extended?.urlId;if(!r)return;let s=e._core?._oscLinkService?.getLinkData(r)?.uri;if(!(!s||!/^(https?:|file:|mailto:)/i.test(s))&&![...s].some(i=>i.charCodeAt(0)<32||i.charCodeAt(0)>=127&&i.charCodeAt(0)<=159))return s}var nA=1e3,Jg=new WeakMap,rA=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Xg(e){let t=new tA.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:nA,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return Jg.set(t,new Zo(t)),t}function Qg(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function ju(e,t){let n=Jg.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function Zg(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let d=0;d<e.cols;d+=1){let u=l.getCell(d,s);if(!u||u.getWidth()===0)continue;let p=Yg(e,u);c.push({text:u.getChars()||" ",style:oA(u,o+a===i&&d===n.cursorX),...p?{href:p}:{}})}r.push({segments:sA(iA(c))})}return r}function sA(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&cA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),ey(n.style)||(s.style=n.style),t.push(s)}return t}function iA(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!ey(n.style))break;t-=1}return e.slice(0,t)}function oA(e,t){let n={},r=zg(e,"fg"),s=zg(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 zg(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"):rA[s]??aA(s)}function aA(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(lA).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 lA(e){return e===0?0:55+e*40}function cA(e,t){return Mu(e)===Mu(t)}function Mu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function ey(e){return Mu(e)===""}var dA=uA(import.meta.url),pA=/^CTRL_([A-Z])$/,fA="\x1B[6n",mA="\x1B[c",hA="\x1B[?u",gA={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
276
|
+
`,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},ea=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")qu(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,ty(i,r),this.getViewState(n);let o;try{o=this.createSession(t,n,r,s)}catch(a){throw this.recordActivity({taskId:t,tabId:n,sessionState:"failed",lastActivityAt:Date.now(),exitCode:null,error:a instanceof Error?a.message:String(a)}),a}return this.sessions.set(n,o),this.notifyActivity(o),this.attachedTabId=n,this.getViewState(n)}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||(n.pty.write(t),(t.includes("\r")||t.includes(`
|
|
277
|
+
`))&&this.touchActivity(n))}writeKey(t){let n=yA(t);n!==null&&this.write(n)}hasRunningSession(t){return this.sessions.get(t)?.status==="running"}writeToSession(t,n){let r=this.sessions.get(t);if(!r||r.status!=="running")throw new Error(`Agent tab ${t} is not running.`);r.pty.write(n),this.touchActivity(r)}scrollViewport(t){let n=this.getAttachedSession();if(!n||t===0)return;let r=n.terminal.buffer.active.baseY;n.scrollbackLines=Math.max(0,Math.min(r,n.scrollbackLines-t))}resize(t){let n=this.getAttachedSession();n&&ty(n,t)}detach(){this.attachedTabId=null}sessionTabIds(){return[...this.sessions.keys()]}getActivitySnapshots(){return[...this.activitySnapshots.values()]}setActivityEnabled(t){if(this.activityEnabled!==t&&(this.activityEnabled=t,!!t))for(let n of this.sessions.values())this.notifyActivity(n)}disposeSession(t){let n=this.sessions.get(t);n&&(qu(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())qu(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:wA(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??TA().spawn,o=Xg(r),a=s??this.resolveSessionSpec(t,n),l=wo({...this.env,...a.env??{}}),{executable:c,args:d}=bA(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:RA(l)}),p={taskId:t,tabId:n,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(u.onData(h=>{this.touchActivity(p),PA(u,h),ju(p.terminal,h).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(h=>{p.status="exited",p.exitCode=h.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),ju(p.terminal,`\r
|
|
278
|
+
[process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function yA(e){if(e.length===1)return e;let t=gA[e];if(t!==void 0)return t;let n=pA.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function ty(e,t){kA(e.pty,t),Qg(e.terminal,t),e.screenDirty=!0}function wA(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=Zg(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function qu(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function kA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function TA(){return dA("node-pty")}function bA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[ko(t[0],n),...t.slice(1)].map(ny).join(" ")}; exec ${ny(e)} -l`;return{executable:e,args:["-lc",s]}}function ny(e){return`'${e.replaceAll("'","'\\''")}'`}function RA(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 PA(e,t){for(let n=0;n<Uu(t,fA);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Uu(t,mA);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Uu(t,hA);n+=1)e.write("\x1B[?0u")}function Uu(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 ta=Sn,AA=16,EA=250;async function iy(e){let t=xe(e.paths);await DA(t,e.paths,e.spawnDaemon);let n=await fy(t.socketPath),r=new Bu(n,e);return await r.ready(),r}async function oy(e,t={}){let n=xe(e);await IA(e.runtimeDir,{recursive:!0}),await Ms(n.socketPath,{force:!0});let r=new Wu(e,t),s=SA(i=>r.handleConnection(i));try{await r.start(),await LA(s,n.socketPath),await vA(n.pidPath,String(process.pid),"utf8"),await de.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${ta}.`,details:{pid:process.pid,protocolVersion:ta}}),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 Ms(n.socketPath,{force:!0}),await Ms(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function ay(e){let t=xe(e);return await uy(t.socketPath)?(await FA(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,this.openFileHandler=n.onOpenFile,t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>{this.closed||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;openFileHandler;buffer="";closed=!1;protocolVersion=ta;options;async ready(){let t=await this.send({type:"ping"});if(!cy(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.protocolVersion>=10&&await this.send({type:"subscribeNavigation"}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&(this.viewCache.set(n,r.view),r.view.status==="idle"&&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}setOpenFileHandler(t){this.openFileHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
|
|
274
279
|
`);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
275
280
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
276
|
-
`)}}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=
|
|
281
|
+
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=NA(r,n.patch),i=r.rows.slice(0,n.patch.rowCount);for(let o of n.patch.rows)i[o.index]=o.row;this.viewCache.set(n.tabId,{status:n.patch.status,rows:i,error:n.patch.error,scrolledBack:n.patch.scrolledBack}),this.viewedTabId===n.tabId&&this.options.onUpdate?.(s?{tabId:n.tabId,kind:"full"}:{tabId:n.tabId,kind:"rows",rowIndices:n.patch.rows.map(o=>o.index)})}n.type==="activity"&&(this.recordCachedActivity(n.snapshot),this.options.onActivity?.(n.snapshot)),n.type==="activityRemoved"&&this.removeCachedActivity(n.tabId),n.type==="tasksChanged"&&this.tasksChangedHandler?.(n.taskIds),n.type==="openFile"&&this.openFileHandler?.(n.path)}subscribeToView(t){this.closed||this.subscribedTabId===t||(this.subscribedTabId=t,this.send({type:"subscribeView",tabId:t}).then(n=>{t&&n.view&&this.viewCache.set(t,n.view),this.viewedTabId===t&&this.subscribedTabId===t&&this.notifyFullUpdate(t)}).catch(()=>{this.subscribedTabId===t&&(this.subscribedTabId=null)}))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}notifyFullUpdate(t){t&&this.options.onUpdate?.({tabId:t,kind:"full"})}replaceActivityCache(t,n){let r=new Map;for(let[s,i]of this.activityRevisionByTabId)i>n&&r.set(s,this.activityCache.get(s)??null);this.activityCache.clear();for(let s of t)this.activityCache.set(s.tabId,s);for(let[s,i]of r)i?this.activityCache.set(s,i):this.activityCache.delete(s)}async refreshActivitySnapshots(t=!1){let n=this.activityRevision,r=await this.send({type:"getActivitySnapshots"});if(this.replaceActivityCache(r.activities??[],n),t)for(let s of this.activityCache.values())this.options.onActivity?.(s)}recordCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t.tabId,this.activityRevision),this.activityCache.set(t.tabId,t)}removeCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t,this.activityRevision),this.activityCache.delete(t),this.options.onActivityRemoved?.(t)}failRunningActivities(t){for(let n of this.activityCache.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t};this.recordCachedActivity(r),this.options.onActivity?.(r)}}},Wu=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 ea({...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??(()=>ln(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new Qo(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 Ye(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},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
|
|
277
282
|
`);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
|
|
278
|
-
`)}});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{
|
|
279
|
-
${s.slice(-2e3)}`:""}`)}async function
|
|
283
|
+
`)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}sessionCount(){return this.runtime.sessionTabIds().length}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{mn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);mn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:ta,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);mn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec);return r||this.log({level:"info",component:"pty",event:"spawned",message:"PTY session spawned.",taskId:n.taskId,tabId:n.tabId}),this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,s)}case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),await this.orchestrationSupervisor.wake(),null;case"shutdown":return this.log({level:"warn",component:"daemon",event:"shutdown.requested",message:"PTY daemon shutdown was explicitly requested.",details:{liveSessionCount:this.runtime.sessionTabIds().length}}),setTimeout(()=>this.onShutdown?.(),0),null;default:return jA(n)}}subscribe(t,n,r){let s=this.subscriptions.get(t);return this.subscriptions.set(t,{activityEnabled:s?.activityEnabled??!1,tabId:n,view:r,rowKeys:r.rows.map(Vu),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!1}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)mn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(mn(s,{type:"openFile",path:n}),r+=1);return r}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},EA))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&mn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&mn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new Jo(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)},AA))}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=OA(s,n),o=$A(s.view,n);s.view=n,s.rowKeys=n.rows.map(Vu),(i.rows.length>0||o)&&mn(r,{type:"update",tabId:t,patch:i})}}};function OA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Vu(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 $A(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 NA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Vu(e){return JSON.stringify(e)}async function DA(e,t,n){if(await _A(e.socketPath,1e3))return;if(await uy(e.socketPath)){let i=await dy(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await 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 xA(e,t),To(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await ly(e.socketPath))return;await my(50)}let s=await sy(CA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
|
|
284
|
+
${s.slice(-2e3)}`:""}`)}async function ly(e){let t=await dy(e).catch(()=>null);return t?.ok===!0&&cy(t.protocolVersion)}function cy(e){return Xt(e)}async function _A(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await ly(e))return!0;await my(50)}return!1}async function xA(e,t){let n=await sy(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&MA(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 Ms(e.socketPath,{force:!0}),await Ms(e.pidPath,{force:!0})}async function uy(e){let t=await fy(e).catch(()=>null);return t?(t.end(),!0):!1}async function FA(e){await py(e,{id:1,type:"shutdown"}).catch(()=>null)}async function dy(e){return py(e,{id:1,type:"ping"})}function py(e,t){return new Promise((n,r)=>{let s=ry(e),i="",o=setTimeout(()=>{s.destroy(),r(new Error("Craig PTY daemon request timed out."))},500),a=()=>clearTimeout(o);s.setEncoding("utf8"),s.once("connect",()=>s.write(`${JSON.stringify(t)}
|
|
280
285
|
`)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
|
|
281
|
-
`);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
|
|
282
|
-
`)}catch{}}function
|
|
283
|
-
`}function SA(e){return e.length===1&&e>=" "&&e!==""}import Ds from"node:path";function ry(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 sy="\u{F024B} ",iy="\u{F0DCF} ",oy="\u25CB",Vu="\uEA64",ay="\uEAFE",ly="\uEBDA",Ku="\u25CB",Gu="\u25CF",Hu="\u2713",Yu="\u2715";function cy(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 zu=150,uy=6;var ea="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 my(e,t,n){let r=CA(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=uE(t.tasks),d=OA(e,a),u=EA(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?T.runners.getDisplayName(a.runner):T.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${T.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${T.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Cs(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 ${T.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ds.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ds.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:IA(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>dE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:AA(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:cE(s,a),rightInspection:BA(e,a,h)}}function IA(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 vA(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=Ao(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 Is(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:nr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},m=gy(d);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${T.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 [${T.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 vA(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=Eo(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 Is(l)){let h=t.selectedLeftItemId===`task:${u.id}`,f=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,m={id:`task:${u.id}`,taskId:u.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:nr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=gy(u);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${T.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 CA(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 AA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${f}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return pt(["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 pt(["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 pt([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${T.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?pt([`${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."]):pt([`${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"?DA(r,i,t.fileScrollOffset):e===B&&t.openInspectionKind==="diff"?_A(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?pt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):pt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function EA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:$A(o),...o.kind==="agent"&&r&&t?{activity:Yt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:ea,label:"EMPTY",active:n===ea,focused:e.focusedRegion==="center"&&n===ea}];let i=e.openInspectionKind||n===B?[{id:B,label:NA(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===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:ea}function $A(e){return e.title.toUpperCase()}function NA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ds.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function DA(e,t,n){if(!e)return pt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return pt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=hy(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:""},...xA(r.lines,n,s)]}function _A(e,t,n){if(!e)return pt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return pt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=hy(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:""},...LA(r.lines,n,s)]}function pt(e){return e.map(t=>({text:t}))}function xA(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}},...Ju(i,n)],tone:"default"}})}function LA(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=dy(e.oldNumber),r=dy(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?qA(Ju(e.text,t),i.bg,i.fallbackFg):Ju(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 dy(e){return e===null?" ":String(e).padStart(4," ")}function hy(e){let t=Ds.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function Ju(e,t){return t==="diff"?jA(e):t==="markdown"?UA(e):t==="json"?Xu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Xu(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 jA(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 qA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function UA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:Xu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Xu(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: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 BA(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"?yy(t.repoTargets??[]):s?.pullRequest??(t?K(t):null),o=[VA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Ty(e,t,n),l=Qu(e,n),c=QA([{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,...oE(e,n)]}:{title:"",rows:[...o,...Qu(e,n)]}}function VA(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=Zu(t),o=ed(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function py(e){return[{text:" "},Zu(e),{text:" "},ed(e)]}function gy(e){if(e.type==="project"&&e.repoTargets?.length){let n=yy(e.repoTargets);return n?py(n):null}let t=K(e);return t?.number?py(t):null}function yy(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=GA(n);return{number:-1,status:KA(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 KA(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 GA(e){let t=e.map(n=>wy(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 Zu(e){return!e||!e.number?{text:oy,style:{fg:"565f89"}}:e.status==="merged"?{text:ay,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:ly,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Vu,style:{fg:"565f89"}}:{text:Vu,style:{fg:"9ece6a"}}}function ed(e){return e?.aggregateReadiness?fy(e.aggregateReadiness):fy(wy(e))}function fy(e){return e==="failed"?{text:Yu,style:{fg:"f7768e"}}:e==="pending"?{text:Gu,style:{fg:"e0af68"}}:e==="success"?{text:Hu,style:{fg:"9ece6a"}}:{text:Ku,style:{fg:"565f89"}}}function wy(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")?ky(e)?"failed":HA(e)?"success":"pending":"pending"}function HA(e){return!!(e.mergeable&&!e.draft&&!ky(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function ky(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Ty(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return YA(e,t,n);let r=K(t),s=Py("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),i=t.prs.filter(o=>o!==r&&(o.status==="merged"||o.status==="closed")).length;return i>0&&s.push({id:"pr-history",text:`+ ${i} previous PR${i!==1?"s":""}`,muted:!0}),s}var Zo=32;function YA(e,t,n){let r=[],s=td(t,n),i=e.selectedProjectTargetId??s[0]?.repoId??null,o=s.some(c=>c.repoId===i)?i:s[0]?.repoId??null;if(s.length===0)return[{id:"project-review-empty",text:"No repos with changes or pull requests.",muted:!0}];for(let c of s){let d=o===c.repoId,u=e.focusedRegion==="inspector"&&d,p=c.repoId.startsWith("repo_")?c.repoId.slice(5):c.repoId;if(c.status!=="ready"){let f=c.failureReason?c.failureReason.slice(0,14):c.status,m=Zo-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,k=Zo-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,k))+f,selected:d,focused:u,muted:!0})}else{let h=Zu(c.pullRequest),f=ed(c.pullRequest),m=`${h.text} ${f.text}`,y=Zo-m.length-1,k=p.length>y?p.slice(0,y-1)+"\u2026":p,R=Zo-k.length-m.length,b=k+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:d,focused:u,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?zA(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...Py("target",a.branch,a.pullRequest)),l.length>0&&r.push({id:"target-pr-history",text:`+ ${l.length} previous PR${l.length!==1?"s":""}`,muted:!0})),r}function td(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||by(e,r).length>0)}function zA(e,t){return by(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function by(e,t){let n=JA(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function JA(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=XA(e.pullRequest.url);if(n)return n;let r=t.filter(i=>e.pullRequest.number!==null&&i.number===e.pullRequest.number),s=r.length===1?r[0]:null;return s?.owner&&s.repo?{owner:s.owner.toLowerCase(),repo:s.repo.toLowerCase()}:null}function XA(e){let t=e?.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+(?:[/?#].*)?$/i);return t?.[1]&&t[2]?{owner:t[1].toLowerCase(),repo:t[2].toLowerCase()}:null}function Ry(e,t,n=null){return 3+Ty(e,t,n).length+Qu(e,n).length}function Py(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=ZA(n.reviewDecision,n.mergeStateStatus),c=l&&l!=="review approved"?"merge blocked":n.mergeable?"merge ready":n.mergeStateStatus?`merge ${n.mergeStateStatus}`:"merge unknown";l?s.push({id:r("pr-merge"),text:`${c} \xB7 ${l}`,muted:!0,segments:[{text:c},{text:" \xB7 "},{text:l,style:{fg:eE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Sy(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(tE)):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)=>nE(u,r(`comment:${p}`))))),s}function QA(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 ZA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function eE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Sy(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 tE(e){let{icon:t,color:n}=sE(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," ")} ${iE(e.status)}`,color:n,muted:!1}}function nE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Sy(e.createdAt)}`:"",s=rE(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 rE(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 sE(e){switch(e){case"success":return{icon:Hu,color:"9ece6a"};case"pending":return{icon:Gu,color:"e0af68"};case"failed":return{icon:Yu,color:"f7768e"};case"skipped":return{icon:Ku,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function iE(e){return e==="success"?"passing":e==="failed"?"failing":e}function oE(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=nd(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)?sy:iy:ry(l.label),p=l.kind==="directory"?"7aa2f7":cy(l.label),h=" ".repeat(l.depth),f=p?{text:u,style:{fg:p}}:{text:u},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function nd(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 Qu(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(aE(t))return lE(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(i=>i.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(i=>Iy(i,e,t))))}return n}function aE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function lE(e,t){let n=[],r=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of r){let i=t.diffRows.filter(a=>a.path.startsWith(`${s}/`)),o=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:o,muted:!0});for(let a of["branch","staged","unstaged","untracked"]){let l=i.filter(c=>c.group===a);l.length!==0&&(n.push({id:`repo-diff:${s}:${a}`,text:` ${a}`,muted:!0}),n.push(...l.map(c=>Iy(c,e,t,s.length+1))))}}return n}function Iy(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 cE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:T.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ds.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function uE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function dE(e,t){return{name:T.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function vy(e,t,n,r,s=null){if(s)return pE(e,t,n,r,s);let i=Ru(e,t,{centerOnly:r});return fE(n,i)?{output:Vo(i.rows,n.rows,i.row,i.column),region:i}:null}function pE(e,t,n,r,s){let i=ig(e,t,s,{centerOnly:r});if(!i||!mE(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 fE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function mE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Cy(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!hE(o,a))return null;!o||!a||(s+=Vo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function hE(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 gE=["tasks","center","inspector"];function yE(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 sd(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return od({...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 od(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Kh(t)?A({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):A({state:e});if(e.fileSearchQuery!==null)return yE(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"&&(Oo(e.selectedLeftItemId)||$o(e.selectedLeftItemId)))return A({state:{...e,selectedRunner:Co(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 A({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===B?mn(e,-1,n):sd(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===B?mn(e,1,n):sd(e,1,n);if(t==="PAGE_UP")return mn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return mn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return mn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return mn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??mt,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=IE(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"&&Cs(e.selectedLeftItemId)&&e.selectedTaskId)return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Jh(e.selectedLeftItemId)&&e.selectedWorkspaceId)return A({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&$y(e.activeTab,n.ptyTabIds??[]))return A({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return rd(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Ey(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return rd(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Ey(e,1)}if(ut(t)){if(e.focusedRegion==="tasks"&&(Oo(e.selectedLeftItemId)||$o(e.selectedLeftItemId))){let r=No(e.selectedLeftItemId),s=Do(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"&&Cs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return A({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Rr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&$y(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return A({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Rr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===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:TE({...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 mn(e,t,n){if(t===0)return A({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?Ny(e,t,n):e.inspectionMode==="review"?Oy(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):A({state:e});if(e.focusedRegion==="center"&&e.activeTab===B){if(e.openInspectionKind==="file")return Oy(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return bE(e,t,n)}return A({state:e})}function Ay(e,t){return ta(e,"focusedRegion",gE,t)}function rd(e,t,n){let r=ta(e,"activeTab",n&&n.length>0?n:vE(e),t);return!r.changed||Gh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Rr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function sd(e,t,n){if(e.focusedRegion==="tasks")return wE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return rd(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Ny(e,t,n);if(n.projectTargetIds?.length){let s=id(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=id(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:ta(e,"selectedActionId",qh,t)}return ta(e,"selectedActionId",pu,t)}function wE(e,t,n){let r=id(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=gu(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=No(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Do(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function kE(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 kE(e,SE(e.inspectionMode,fu,t))}function Ny(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=Wt(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 TE(e){if(!e.selectedFileTreePath)return e;let t=new Set(e.collapsedFileTreePaths);return t.has(e.selectedFileTreePath)?t.delete(e.selectedFileTreePath):t.add(e.selectedFileTreePath),{...e,collapsedFileTreePaths:[...t].sort((n,r)=>n.localeCompare(r)),actionMessage:null}}function Oy(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Wt(e[t]+n,0,i);return o===e[t]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function bE(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return RE(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=Wt(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=Wt(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=Wt(o,0,i);return c===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function RE(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Wt(e.diffScrollOffset+t,0,i),a=PE(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 PE(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function ta(e,t,n,r){let s=n.indexOf(e[t]),i=Wt(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 id(e,t,n,r,s=!1){if(n.length===0)return A({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Wt(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 SE(e,t,n){let r=t.indexOf(e);return t[Wt(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 $y(e,t){return t.includes(e)}function IE(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Rr(e.activeTab)??e.preferredPtyTabKind}function vE(e){return[e.selectedPtyTabId,e.openInspectionKind?B:null].filter(t=>typeof t=="string")}function Wt(e,t,n){return Math.min(n,Math.max(t,e))}var Dy=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??CE(i,e.activeTab,e.preferredPtyTabKind),a=Fy(i,o,n??void 0,r.config);return{...i,ptyTabs:[...i.ptyTabs,a],selectedPtyTabId:a.id}}));return{updatedTask:s,nextShell:{activeTab:s.selectedPtyTabId??e.activeTab,selectedPtyTabId:s.selectedPtyTabId,preferredPtyTabKind:s.ptyTabs.at(-1)?.kind??e.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${s.ptyTabs.at(-1)?.title??"tab"}`}}},_y=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}`}}},xy=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})})},Ly=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=Fy(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 CE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function Fy(e,t,n,r={}){let s=n??e.runner,i=T.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,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"?T.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var vr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},My=async(e,t,n,r,s)=>{T.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});T.previews.isEnabled(s.config,"agentOrchestration")&&await et(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=fo();mo(T.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new vr(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}},jy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},qy=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}`}}},Uy=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Nr(t.paths,n.id)))),Cr=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 Wy=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");let n=await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0}),r=n.tasks.filter(i=>i.status!=="closed");if(r.length>0)throw new Error(`Close tasks before removing workspace: ${r.map(i=>`${i.id} (${i.status})`).join(", ")}.`);await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId);let s=n.tasks.length>0;return s||await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks}),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:s?`Archived workspace ${e.selectedWorkspaceId}; closed task history preserved.`:`Removed workspace ${e.selectedWorkspaceId}`}}};var By=async(e,t,n)=>{let r=T.runners.setRunnerEnabled(n.config,e,t);return await T.save(n.paths,r),r},Vy=async(e,t,n)=>{let r=T.runners.setRunnerPath(n.config,e,t);return await T.save(n.paths,r),r},Ky=async(e,t,n)=>{let r=T.previews.setEnabled(n.config,e,t);return await T.save(n.paths,r),r};var AE=250;function Bt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function hn(e,t){return qt(t,e.ptyRuntime.getViewState(Ar(e,t)))}function Ar(e,t){let n=Bt(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 hn(e,Xh(t,e.model))}function Gy(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 Hy(e,t,n){return Gy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return Gy(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 J(e,t){if(!e.uiStateFile)return;e.runtimeState=Bh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>Vt({uiStateFile:e.uiStateFile},n),()=>Vt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function EE(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:P,workspaceService:Te,queueTaskMutation:t=>EE(e,t)}}function ad(e,t){let n=Bt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?nd(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Mn(e.model),centerTabIds:Yh(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:Ry(t,n,s),pageRows:Math.max(5,qe(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:td(n,s).map(a=>a.repoId)}}async function Yy(e,t){await xy(t,oe(e))}async function Pe(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 na(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),...t.status==="closed"?[]:[t]].sort((n,r)=>n.id.localeCompare(r.id))}}async function ra(e,t){let n=++e.inspectionRefreshSequence,r=yu(e.model.tasks,t),s=e.model.inspection,i=t.focusedRegion==="inspector"&&t.inspectionMode==="review"&&t.openInspectionKind!=="diff",o;if(r&&s?.taskId===r.id&&!i){let a={selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath},l=await vh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await 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)},J(e,e.state.shell),e.render())}function zy(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)&&ra(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()})},AE))}function Jy(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=mn(e.state.shell,n,ad(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},J(e,e.state.shell),e.render(),ra(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)},J(e,e.state.shell),e.render()}},16)))}function ld(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function cd(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 Qy(e){cd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Zy(e,t){let n=I(e,t),r=Bt(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 qt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,dn(qe(e.activeTerminal.width,e.activeTerminal.height)));return qt({...n,inputMode:"control"},o)}function ud(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 dd(e,t){try{let n=I(e,t),r=Bt(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 Xy(e,r),await Pe(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Xy(e,r),await Pe(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:qt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},J(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,dn(qe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ut(s),e.lastTerminalKey=null,e.state={mode:"main",shell:qt({...i,inputMode:"terminal"},o)},J(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Ut(t.selectedPtyTabId)&&(await OE(e,t.selectedTaskId,r).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,Vh(I(e,t),r),r)},J(e,e.state.shell)}e.render()}async function OE(e,t,n){await jy(t,n,oe(e))}async function ew(e,t,n,r){let s=I(e,t),{nextShell:i}=await Dy(s,n,r,oe(e));return await Pe(e),I(e,{...s,...i})}async function tw(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await _y(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Pe(e),I(e,{...n,...s})}async function nw(e,t){let n=I(e,t),r=Mn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await qy(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Pe(e),I(e,{...n,...o,selectedLeftItemId:$E(r,Mn(e.model),s)})}async function rw(e,t){let n=I(e,t),{nextShell:r}=await Wy(n,oe(e));return await Pe(e),I(e,{...n,...r})}async function Xy(e,t){return Ly(t,oe(e))}function sa(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:hn(e,e.state.shell)},e.render())},16))}function sw(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:hn(e,e.state.shell)},e.render())}function $E(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 ow(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=iw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Uy(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)na(e,o);t.recordSuccess(i,iw(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,Cr("background PR polling",i,oe(e)))}}function iw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function aw(e,t){let n=I(e,t),r=Bt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await P.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Pe(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await P.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Pe(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${K(a)?.requiredChecks.length??0} reported`)}return I(e,{...Hy(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import LE from"node:path";import{readdir as NE,stat as DE}from"node:fs/promises";import lw from"node:path";async function _E(e){let t=await NE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=lw.join(e,r.name);n.push({name:r.name,path:s,kind:await xE(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 cw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function uw(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 ia(e,t){let n=await _E(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 xE(e){let t=lw.join(e,".git");return await DE(t).catch(()=>null)!==null}function dw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function pw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function FE(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"",r=t.taskPromptTarget;if(!r||!r.repoId&&!r.workspaceId){e.state={mode:"main",shell: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 ${r.name}...`})},e.render();let s=null;try{let i=await My(r.repoId,r.workspaceId,n,t.selectedRunner,oe(e));s=i.task,await Pe(e);let o=I(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??hg(s,"agent"),dn(qe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ut(o.selectedPtyTabId),e.state={mode:"main",shell:qt(o,a)},J(e,e.state.shell)}catch(i){i instanceof vr&&(s=i.task);let o=ie(e,"create task",i,"Failed to create task.");s&&!(i instanceof vr)?(await V(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})):s&&(await V(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function ME(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,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(ut(t)){FE(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:Co(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}mu(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function jE(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=cw(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"){ia(e,LE.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"||ut(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ia(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 Pe(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},J(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 qE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=ey(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;UE(e,r)}}}async function UE(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 WE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=ny(dw(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"?By(n.runner,n.enabled,oe(e)):Vy(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=T.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:T.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=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:{...dw(e),message:i}},e.render()})}function BE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=ty(pw(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}Ky(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=T.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:T.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=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:{...pw(e),message:s}},e.render()})}}function fw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){ME(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){jE(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){KE(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=od(e.state.shell,n,ad(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)},J(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)},J(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&ut(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Os(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(VE(e,n))return;e.lastTerminalKey=gg(n)?{key:n,at:Date.now()}:null;let i=yg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){sa(e,i);return}mu(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Ut(e.state.shell.selectedPtyTabId)&&sw(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:I(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=I(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},J(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ia(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){ew(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{dd(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){tw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){aw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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=Bt(e.model.tasks,r.state),i=s?K(s)?.url??null:null;i?uw(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){nw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){rw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){dd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},J(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){zy(e,e.state.shell);return}ra(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)},Yy(e,e.state.shell).catch(()=>{}),J(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"){qE(e,n);return}if(e.state.variant==="runners"){WE(e,n);return}if(e.state.variant==="previews"){BE(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||ut(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"||ut(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(ut(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;Zy(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},J(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)},J(e,e.state.shell),e.render()})}):Qy(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 mw(e,t){let n=Rg(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=Os(i);if(o){gw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Eu(i)){e.pendingTerminalKeySequence.raw=i,hw(e);return}oa(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"})},J(e,e.state.shell),e.render();return}let r=wg(n);if(r!==0){sa(e,r);return}let s=Os(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
286
|
+
`);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 fy(e){return new Promise((t,n)=>{let r=ry(e);r.once("connect",()=>t(r)),r.once("error",n)})}function LA(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function mn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
|
|
287
|
+
`)}catch{}}function MA(e){try{return process.kill(e,0),!0}catch{return!1}}function my(e){return new Promise(t=>setTimeout(t,e))}function jA(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var gy=["Runners","Feature Previews","Logs","Help"],yy=["piRunner","fileOpen","panelPolish"],wy={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function Gu(e,t){return Ku(e).map(n=>{let r=k.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function ky(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 Ty(e=[]){let t=yy.some(n=>!e.includes(n));return gy.map((n,r)=>r===1&&t?`${n} \xB7 NEW`:n)}function by(e,t=[]){return De.map(n=>{let r=k.previews.isEnabled(e,n),s=yy.includes(n)&&!t.includes(n);return`${r?"[x]":"[ ]"} ${wy[n]}${s?" \xB7 NEW":""}`})}function Ry(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Py(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(gy.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:na(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Sy(e,t,n){if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(De.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!na(n))return{kind:"noop",state:e};let r=De[e.menuIndex]??De[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${wy[r]} ${s?"enabled":"disabled"}.`}}}function Iy(e,t,n,r){if(e.pathEdit)return qA({...e,pathEdit:e.pathEdit},t,n);let s=Gu(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=Ku(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!na(n))return{kind:"noop",state:e};let i=Ku(t)[e.menuIndex]??"codex",o=t.runners?.[i]?.enabled!==!1;return o&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save-enabled",runner:i,enabled:!o,state:{...e,message:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function Ku(e){return ue.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function qA(e,t,n){if(n==="ESCAPE")return{kind:"render",state:hy({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(na(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:hy({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return UA(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function hy(e){let t={...e};return delete t.pathEdit,t}function na(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
288
|
+
`}function UA(e){return e.length===1&&e>=" "&&e!==""}var BA=/^\d+\.\d+\.\d+$/;async function vy(e,t={runCommand:K}){if(!BA.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}import js from"node:path";function Cy(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 Ay="\u{F024B} ",Ey="\u{F0DCF} ",Oy="\u25CB",Hu="\uEA64",$y="\uEAFE",Ny="\uEBDA",Yu="\u25CB",zu="\u25CF",Ju="\u2713",Xu="\u2715";function Dy(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 Qu=150,_y=6;var sa="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 My(e,t,n){let r=KA(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=AE(t.tasks),d=YA(e,a),u=HA(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ns(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":d===V?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:js.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${js.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:WA(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>EE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:GA(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:CE(s,a),rightInspection:aE(e,a,h)}}function WA(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 VA(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=xo(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 Os(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:sr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},m=qy(d);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function VA(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=Fo(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 Os(l)){let h=t.selectedLeftItemId===`task:${u.id}`,f=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,m={id:`task:${u.id}`,taskId:u.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:sr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=qy(u);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function KA(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 GA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${f}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ft(["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 ft(["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 ft([`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"?ft([`${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."]):ft([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===V&&t.openInspectionKind==="file"?XA(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?QA(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ft(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ft(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function HA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:zA(o),...o.kind==="agent"&&r&&t?{activity:Jt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:sa,label:"EMPTY",active:n===sa,focused:e.focusedRegion==="center"&&n===sa}];let i=e.openInspectionKind||n===V?[{id:V,label:JA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function YA(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===V&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??V:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??V:sa}function zA(e){return e.title.toUpperCase()}function JA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?js.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function XA(e,t,n){if(!e)return ft(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ft(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=jy(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:""},...ZA(r.lines,n,s)]}function QA(e,t,n){if(!e)return ft(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ft(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=jy(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:""},...eE(r.lines,n,s)]}function ft(e){return e.map(t=>({text:t}))}function ZA(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}},...Zu(i,n)],tone:"default"}})}function eE(e,t,n){let r=tE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>nE(i,n))}function tE(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 nE(e,t){let n=xy(e.oldNumber),r=xy(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?sE(Zu(e.text,t),i.bg,i.fallbackFg):Zu(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 xy(e){return e===null?" ":String(e).padStart(4," ")}function jy(e){let t=js.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function Zu(e,t){return t==="diff"?rE(e):t==="markdown"?iE(e):t==="json"?ed(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?ed(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 rE(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 sE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function iE(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:ed(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function ed(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:oE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function oE(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 aE(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"?Uy(t.repoTargets??[]):s?.pullRequest??(t?H(t):null),o=[lE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Vy(e,t,n),l=td(e,n),c=gE([{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,...SE(e,n)]}:{title:"",rows:[...o,...td(e,n)]}}function lE(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=nd(t),o=rd(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Fy(e){return[{text:" "},nd(e),{text:" "},rd(e)]}function qy(e){if(e.type==="project"&&e.repoTargets?.length){let n=Uy(e.repoTargets);return n?Fy(n):null}let t=H(e);return t?.number?Fy(t):null}function Uy(e){let t=e.filter(s=>s.status==="ready"),n=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(n.length===0)return null;let r=uE(n);return{number:-1,status:cE(n),draft:n.some(s=>s.draft),mergeable:n.length===t.length&&n.every(s=>s.mergeable),mergeStateStatus:null,reviewDecision:n.some(s=>s.reviewDecision==="CHANGES_REQUESTED")?"CHANGES_REQUESTED":n.some(s=>s.reviewDecision==="REVIEW_REQUIRED")?"REVIEW_REQUIRED":n.every(s=>s.reviewDecision==="APPROVED")?"APPROVED":null,requiredChecks:n.flatMap(s=>s.requiredChecks),aggregateReadiness:r}}function cE(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function uE(e){let t=e.map(n=>By(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 nd(e){return!e||!e.number?{text:Oy,style:{fg:"565f89"}}:e.status==="merged"?{text:$y,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Ny,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Hu,style:{fg:"565f89"}}:{text:Hu,style:{fg:"9ece6a"}}}function rd(e){return e?.aggregateReadiness?Ly(e.aggregateReadiness):Ly(By(e))}function Ly(e){return e==="failed"?{text:Xu,style:{fg:"f7768e"}}:e==="pending"?{text:zu,style:{fg:"e0af68"}}:e==="success"?{text:Ju,style:{fg:"9ece6a"}}:{text:Yu,style:{fg:"565f89"}}}function By(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")?Wy(e)?"failed":dE(e)?"success":"pending":"pending"}function dE(e){return!!(e.mergeable&&!e.draft&&!Wy(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Wy(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Vy(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return pE(e,t,n);let r=H(t),s=Hy("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),i=t.prs.filter(o=>o!==r&&(o.status==="merged"||o.status==="closed")).length;return i>0&&s.push({id:"pr-history",text:`+ ${i} previous PR${i!==1?"s":""}`,muted:!0}),s}var ra=32;function pE(e,t,n){let r=[],s=sd(t,n),i=e.selectedProjectTargetId??s[0]?.repoId??null,o=s.some(c=>c.repoId===i)?i:s[0]?.repoId??null;if(s.length===0)return[{id:"project-review-empty",text:"No repos with changes or pull requests.",muted:!0}];for(let c of s){let d=o===c.repoId,u=e.focusedRegion==="inspector"&&d,p=c.repoId.startsWith("repo_")?c.repoId.slice(5):c.repoId;if(c.status!=="ready"){let f=c.failureReason?c.failureReason.slice(0,14):c.status,m=ra-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=ra-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:d,focused:u,muted:!0})}else{let h=nd(c.pullRequest),f=rd(c.pullRequest),m=`${h.text} ${f.text}`,y=ra-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=ra-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:d,focused:u,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?fE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...Hy("target",a.branch,a.pullRequest)),l.length>0&&r.push({id:"target-pr-history",text:`+ ${l.length} previous PR${l.length!==1?"s":""}`,muted:!0})),r}function sd(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||Ky(e,r).length>0)}function fE(e,t){return Ky(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function Ky(e,t){let n=mE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function mE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=hE(e.pullRequest.url);if(n)return n;let r=t.filter(i=>e.pullRequest.number!==null&&i.number===e.pullRequest.number),s=r.length===1?r[0]:null;return s?.owner&&s.repo?{owner:s.owner.toLowerCase(),repo:s.repo.toLowerCase()}:null}function hE(e){let t=e?.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+(?:[/?#].*)?$/i);return t?.[1]&&t[2]?{owner:t[1].toLowerCase(),repo:t[2].toLowerCase()}:null}function Gy(e,t,n=null){return 3+Vy(e,t,n).length+td(e,n).length}function Hy(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=yE(n.reviewDecision,n.mergeStateStatus),c=l&&l!=="review approved"?"merge blocked":n.mergeable?"merge ready":n.mergeStateStatus?`merge ${n.mergeStateStatus}`:"merge unknown";l?s.push({id:r("pr-merge"),text:`${c} \xB7 ${l}`,muted:!0,segments:[{text:c},{text:" \xB7 "},{text:l,style:{fg:wE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Yy(n.lastSyncedAt)}`,muted:!0}),s.push({id:r("checks-spacer"),text:""}),s.push({id:r("checks-header"),text:"Checks"}),n.requiredChecks.length?s.push(...n.requiredChecks.map(kE)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let 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)=>TE(u,r(`comment:${p}`))))),s}function gE(e,t){if(t.focusedRegion!=="inspector"||t.inspectionMode!=="review"||e.length===0)return e;let n=Math.max(0,Math.min(t.reviewScrollOffset,e.length-1));return e.map((r,s)=>({...r,selected:t.reviewScrollOffset===0&&r.selected||s===n,focused:t.reviewScrollOffset===0&&r.focused||s===n}))}function yE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function wE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Yy(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/1e3);if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let s=Math.floor(r/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function kE(e){let{icon:t,color:n}=RE(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," ")} ${PE(e.status)}`,color:n,muted:!1}}function TE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Yy(e.createdAt)}`:"",s=bE(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 bE(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 RE(e){switch(e){case"success":return{icon:Ju,color:"9ece6a"};case"pending":return{icon:zu,color:"e0af68"};case"failed":return{icon:Xu,color:"f7768e"};case"skipped":return{icon:Yu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function PE(e){return e==="success"?"passing":e==="failed"?"failing":e}function SE(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=id(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)?Ay:Ey:Cy(l.label),p=l.kind==="directory"?"7aa2f7":Dy(l.label),h=" ".repeat(l.depth),f=p?{text:u,style:{fg:p}}:{text:u},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function id(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 td(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(IE(t))return vE(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(i=>i.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(i=>zy(i,e,t))))}return n}function IE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function vE(e,t){let n=[],r=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of r){let i=t.diffRows.filter(a=>a.path.startsWith(`${s}/`)),o=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:o,muted:!0});for(let a of["branch","staged","unstaged","untracked"]){let l=i.filter(c=>c.group===a);l.length!==0&&(n.push({id:`repo-diff:${s}:${a}`,text:` ${a}`,muted:!0}),n.push(...l.map(c=>zy(c,e,t,s.length+1))))}}return n}function zy(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 CE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:js.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function AE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function EE(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Jy(e,t,n,r,s=null,i=!1){if(s)return OE(e,t,n,r,s,i);let o=Au(e,t,{centerOnly:r,panelPolish:i});return $E(n,o)?{output:Yo(o.rows,n.rows,o.row,o.column),region:o}:null}function OE(e,t,n,r,s,i){let o=gg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!NE(n,o))return null;let a=n.rows.slice();return{output:o.rows.map(({index:c,row:d})=>a[c]===d?"":(a[c]=d,`\x1B[${o.row+c};${o.column}H${d}`)).join(""),region:{row:o.row,column:o.column,width:o.width,rows:a}}}function $E(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function NE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Xy(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!DE(o,a))return null;!o||!a||(s+=Yo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function DE(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 _E=["tasks","center","inspector"];function xE(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 ad(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return cd({...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 cd(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Xh(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return xE(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"&&(Lo(e.selectedLeftItemId)||Mo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:_o(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Qy(e,1);if(t==="SHIFT_TAB"||t==="[")return Qy(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===V?hn(e,-1,n):ad(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?hn(e,1,n):ad(e,1,n);if(t==="PAGE_UP")return hn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return hn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return hn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return hn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??gt,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=WE(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"&&Ns(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&ng(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&tw(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return od(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Zy(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return od(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Zy(e,1)}if(Qe(t)){if(e.focusedRegion==="tasks"&&(Lo(e.selectedLeftItemId)||Mo(e.selectedLeftItemId))){let r=jo(e.selectedLeftItemId),s=qo(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"&&Ns(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"&&tw(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Sr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===V)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:ME({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:V,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function hn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?nw(e,t,n):e.inspectionMode==="review"?ew(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return ew(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return jE(e,t,n)}return E({state:e})}function Qy(e,t){return ia(e,"focusedRegion",_E,t)}function od(e,t,n){let r=ia(e,"activeTab",n&&n.length>0?n:VE(e),t);return!r.changed||Qh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Sr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function ad(e,t,n){if(e.focusedRegion==="tasks")return FE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return od(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return nw(e,t,n);if(n.projectTargetIds?.length){let s=ld(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=ld(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:ia(e,"selectedActionId",Hh,t)}return ia(e,"selectedActionId",yu,t)}function FE(e,t,n){let r=ld(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Tu(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=jo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=qo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function LE(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?V:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function Zy(e,t){return LE(e,BE(e.inspectionMode,wu,t))}function nw(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Vt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?V:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function ME(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 ew(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Vt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function jE(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return qE(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=Vt(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let d=Vt(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Vt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function qE(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Vt(e.diffScrollOffset+t,0,i),a=UE(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 UE(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function ia(e,t,n,r){let s=n.indexOf(e[t]),i=Vt(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function ld(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Vt(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function BE(e,t,n){let r=t.indexOf(e);return t[Vt(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function tw(e,t){return t.includes(e)}function WE(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Sr(e.activeTab)??e.preferredPtyTabKind}function VE(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Vt(e,t,n){return Math.min(n,Math.max(t,e))}var rw=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>G(r.paths,e.selectedTaskId,i=>{let o=t??KE(i,e.activeTab,e.preferredPtyTabKind),a=aw(i,o,n??void 0,r.config);return{...i,ptyTabs:[...i.ptyTabs,a],selectedPtyTabId:a.id}}));return{updatedTask:s,nextShell:{activeTab:s.selectedPtyTabId??e.activeTab,selectedPtyTabId:s.selectedPtyTabId,preferredPtyTabKind:s.ptyTabs.at(-1)?.kind??e.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${s.ptyTabs.at(-1)?.title??"tab"}`}}},sw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await G(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},iw=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await G(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},ow=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await G(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=aw(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await G(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function KE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function aw(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var Or=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},lw=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 tt(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=wo();ko(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Or(c,d)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},cw=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},uw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await Lr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},dw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Lr(t.paths,n.id)))),$r=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await de.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var pw=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");let n=await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0}),r=n.tasks.filter(i=>i.status!=="closed");if(r.length>0)throw new Error(`Close tasks before removing workspace: ${r.map(i=>`${i.id} (${i.status})`).join(", ")}.`);await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId);let s=n.tasks.length>0;return s||await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks}),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:s?`Archived workspace ${e.selectedWorkspaceId}; closed task history preserved.`:`Removed workspace ${e.selectedWorkspaceId}`}}};var fw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},mw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},hw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var GE=250;function Kt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Gt(e,t){return Ut(t,e.ptyRuntime.getViewState(Nr(e,t)))}function Nr(e,t){let n=Kt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function v(e,t){return Gt(e,rg(t,e.model))}function gw(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:v(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function yw(e,t,n){return gw(e,t,n?{tone:"success",message:n}:null)}function ie(e,t,n){return gw(e,t,{tone:"error",message:n})}function te(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 Q(e,t){if(!e.uiStateFile)return;e.runtimeState=No(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>ht({uiStateFile:e.uiStateFile},n),()=>ht({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function ud(e,t){if(!e.uiStateFile){e.runtimeState={...No(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...No(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>ht({uiStateFile:e.uiStateFile},n),()=>ht({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function HE(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function oe(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:Te,queueTaskMutation:t=>HE(e,t)}}function dd(e,t){let n=Kt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?id(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:jn(e.model),centerTabIds:eg(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:Gy(t,n,s),pageRows:Math.max(5,Ue(e.activeTerminal.width,e.activeTerminal.height).height-X.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:sd(n,s).map(a=>a.repoId)}}async function ww(e,t){await iw(t,oe(e))}async function Pe(e){e.model=await Ir(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:v(e,e.state.shell)}:e.state={...e.state,shell:v(e,e.state.shell)}}function oa(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),...t.status==="closed"?[]:[t]].sort((n,r)=>n.id.localeCompare(r.id))}}async function aa(e,t){let n=++e.inspectionRefreshSequence,r=bu(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 Dh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Ir(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Q(e,e.state.shell),e.render())}function kw(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)&&aa(e,n).catch(r=>{let s=te(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},GE))}function Tw(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=hn(e.state.shell,n,dd(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render(),aa(e,e.state.shell).catch(s=>{let i=te(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render()}},16)))}function pd(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function fd(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 Rw(e){fd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function Pw(e,t){let n=v(e,t),r=Kt(e.model.tasks,n),s=Nr(e,n);if(!r||!s||!r.ptyTabs.some(a=>a.id===s))return n;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return Ut(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Bt(Ue(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Ut({...n,inputMode:"control"},o)}function md(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 hd(e,t){try{let n=v(e,t),r=Kt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await bw(e,r),await Pe(e),s=r.selectedPtyTabId)}r&&!s&&(r=await bw(e,r),await Pe(e),s=r.selectedPtyTabId);let i=v(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Ut({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Q(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Bt(Ue(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Wt(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Ut({...i,inputMode:"terminal"},o)},Q(e,e.state.shell)}catch(n){let r=te(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Wt(t.selectedPtyTabId)&&(await YE(e,t.selectedTaskId,r).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:ie(e,Jh(v(e,t),r),r)},Q(e,e.state.shell)}e.render()}async function YE(e,t,n){await cw(t,n,oe(e))}async function Sw(e,t,n,r){let s=v(e,t),{nextShell:i}=await rw(s,n,r,oe(e));return await Pe(e),v(e,{...s,...i})}async function Iw(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await sw(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Pe(e),v(e,{...n,...s})}async function vw(e,t){let n=v(e,t),r=jn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await uw(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Pe(e),v(e,{...n,...o,selectedLeftItemId:zE(r,jn(e.model),s)})}async function Cw(e,t){let n=v(e,t),{nextShell:r}=await pw(n,oe(e));return await Pe(e),v(e,{...n,...r})}async function bw(e,t){return ow(t,oe(e))}function la(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:Gt(e,e.state.shell)},e.render())},16))}function Aw(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:Gt(e,e.state.shell)},e.render())}function zE(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 Ow(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Ew(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await dw(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)oa(e,o);t.recordSuccess(i,Ew(e)),e.state={mode:"main",shell:v(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,$r("background PR polling",i,oe(e)))}}function Ew(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function $w(e,t){let n=v(e,t),r=Kt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Pe(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Pe(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${H(a)?.requiredChecks.length??0} reported`)}return v(e,{...yw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import e0 from"node:path";import{readdir as JE,stat as XE}from"node:fs/promises";import Nw from"node:path";async function QE(e){let t=await JE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Nw.join(e,r.name);n.push({name:r.name,path:s,kind:await ZE(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 Dw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function _w(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 ca(e,t){let n=await QE(t);e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function ZE(e){let t=Nw.join(e,".git");return await XE(t).catch(()=>null)!==null}function xw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Fw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function t0(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"",r=t.taskPromptTarget;if(!r||!r.repoId&&!r.workspaceId){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:v(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${r.name}...`})},e.render();let s=null;try{let i=await lw(r.repoId,r.workspaceId,n,t.selectedRunner,oe(e));s=i.task,await Pe(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??xg(s,"agent"),Bt(Ue(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Wt(o.selectedPtyTabId),e.state={mode:"main",shell:Ut(o,a)},Q(e,e.state.shell)}catch(i){i instanceof Or&&(s=i.task);let o=te(e,"create task",i,"Failed to create task.");s&&!(i instanceof Or)?(await G(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})):s&&(await G(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function n0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:v(e,{...n,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(Qe(t)){t0(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:v(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:v(e,{...n,selectedRunner:_o(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}ku(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function r0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell.workspaceBrowser;if(!n)return;if(t==="ESCAPE"){if(n.query!==null){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:"",selectedIndex:0}})},e.render();return}if(n.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=n.query.slice(0,-1);e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}if(n.query!==null&&t.length===1&&t>=" "){let s=n.query+t;e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=Dw(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){ca(e,e0.dirname(n.cwd)).catch(s=>{let i=te(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||Qe(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ca(e,s.path).catch(o=>{let a=te(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=oe(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Pe(e);let a=o.repos[0]??null,l=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Q(e,e.state.shell),e.render()}).catch(o=>{let a=te(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function s0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Py(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;i0(e,r)}}}async function i0(e,t){let n;try{n=await de.readLog(e.paths)}catch(r){let s=te(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 o0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Iy(xw(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"?fw(n.runner,n.enabled,oe(e)):mw(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:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=te(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ie(e,v(e,e.state.shell),i),runnerOptions:{...xw(e),message:i}},e.render()})}function a0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Sy(Fw(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){ud(e,{seenPreviewIds:[...De]});let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}hw(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=te(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ie(e,v(e,e.state.shell),s),previewOptions:{...Fw(e),message:s}},e.render()})}}function ua(e){let t=v(e,{...e.state.shell,inputMode:"control"});e.state={mode:"main",shell:t},e.pendingClear=!0,e.render(),e.bootHydrationReady.then(()=>{e.state.mode!=="main"||e.state.shell!==t||Pw(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Q(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=te(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ie(e,v(e,e.state.shell),r)},Q(e,e.state.shell),e.render()})})}function l0(e){return[...e instanceof Error?e.message:"npm could not install the update."].map(r=>{let s=r.charCodeAt(0);return s<=31||s>=127&&s<=159?" ":r}).join("").replace(/\s+/g," ").trim().slice(0,160)}function Lw(e){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let t=e.state.update.latest;e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"installing"}},e.render(),e.installUpdate(t).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update||(e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"success"}},e.pendingClear=!0,e.render())}).catch(n=>{if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let r=l0(n);te(e,"update Craig",n,r),e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"error",error:r}},e.pendingClear=!0,e.render()})}function c0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let n=e.state.update.phase;if(n==="installing")return;if(t==="ESCAPE"){ua(e);return}let r=n==="ready"?2:1;if(t==="UP"||t==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(t==="DOWN"||t==="j"){e.state={...e.state,menuIndex:Math.min(r,e.state.menuIndex+1)},e.render();return}if(Qe(t)){if(n==="ready"&&e.state.menuIndex===0){Lw(e);return}if(n==="ready"&&e.state.menuIndex===2){ud(e,{ignoredUpdateVersion:e.state.update.latest}),ua(e);return}if(n==="error"&&e.state.menuIndex===0){Lw(e);return}if(n==="success"&&e.state.menuIndex===1){e.exit(0);return}ua(e)}}function Mw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){n0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){r0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){d0(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=cd(e.state.shell,n,dd(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&Qe(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Fs(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(u0(e,n))return;e.lastTerminalKey=Fg(n)?{key:n,at:Date.now()}:null;let i=Lg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){la(e,i);return}ku(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Wt(e.state.shell.selectedPtyTabId)&&Aw(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Q(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ca(e,e.workspaceRoot).catch(s=>{let i=te(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Sw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{hd(e,s)}).catch(s=>{let i=te(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Iw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=te(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){$w(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=te(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Kt(e.model.tasks,r.state),i=s?H(s)?.url??null:null;i?_w(i).catch(o=>{let a=te(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ie(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ie(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){vw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=te(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Cw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=te(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){hd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){kw(e,e.state.shell);return}aa(e,e.state.shell).catch(s=>{let i=te(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},ww(e,e.state.shell).catch(()=>{}),Q(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){s0(e,n);return}if(e.state.variant==="runners"){o0(e,n);return}if(e.state.variant==="previews"){a0(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||Qe(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.variant==="update"){c0(e,n);return}if(e.state.optionsMessage){(n==="ESCAPE"||Qe(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(Qe(n)){if(e.state.menuIndex===0){e.state.variant==="boot"?ua(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),Rw(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 jw(e,t){let n=Bg(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=Fs(i);if(o){Uw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Du(i)){e.pendingTerminalKeySequence.raw=i,qw(e);return}da(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Q(e,e.state.shell),e.render();return}let r=Mg(n);if(r!==0){la(e,r);return}let s=Fs(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
284
289
|
`&&n!==`\r
|
|
285
|
-
`&&(e.suppressTerminalEnterOnAttach=!1),bg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function VE(e,t){if(e.pendingTerminalKeySequence){let n=kg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Os(r);if(s)return gw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Eu(r))return e.pendingTerminalKeySequence.raw=r,hw(e),!0}return oa(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>oa(e),30)},!0)}function hw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>oa(e),30))}function oa(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function gw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function yw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Jy(e,Au(t));return}let n=Au(t);n!==0&&sa(e,n)}function KE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var HE=GE(import.meta.url),YE=HE("terminal-kit"),zE=YE.terminal;function pd(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function ww(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function kw(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function JE(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 Tw(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ae(t),r=await T.load(n),s=T.runners.getEnabled(r),i=e.uiStateFile?await qn({uiStateFile:e.uiStateFile}):null,o=await Pr(t,void 0,s),a=vs(Wh(i,r),o);o=await Pr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>d(f),onActivityRemoved:f=>u(f),resolveSessionSpec:(f,m)=>mg(l.current,m,t)},h=e.ptyRuntime??await jg({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??zE,y=null,k=null,R=null,b=null,$=null,O=0,N=!1,x=new Map,v=h.managesPullRequestSync?null:new Ir({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Se=new pn({resolutionMs:zu,onError:(C,U)=>Cr(`heartbeat job "${C}"`,U,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:vs(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${T.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:C=>f(C)},w.ptyRuntime.setActivityEnabled?.(!0),c=C=>{w.state.mode==="main"&&($=JE($,C),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let U=$;if($=null,w.state.mode==="main"){let ee=hn(w,w.state.shell);if(w.state={mode:"main",shell:ee},!b||!k){w.render();return}let we=qe(m.width,m.height),me={...b,terminal:ee.terminal},ft=vy(we,me,k,ee.centerZoomed,U?.kind==="rows"?U.rowIndices:null);if(!ft){w.render();return}ft.output.length>0&&m.noFormat(ft.output),b=me,k=ft.region,R&&(R={...R,center:ft.region}),y=null,m.hideCursor(!0)}},0)))},d=C=>{w.state.mode==="main"&&Ut(C.tabId)&&x.get(C.tabId)!==Ot(C.tabId,[C],Date.now())&&w.render()},u=C=>{w.state.mode==="main"&&Ut(C)&&x.get(C)!=="idle"&&w.render()};let ye=Promise.resolve(),Y=C=>{ye=ye.then(async()=>{let U=await Promise.all([...new Set(C)].map(ee=>P.getTask(w.paths,ee)));for(let ee of U)na(w,ee);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(U=>Cr("daemon task-state refresh",U,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(Y);let gn=Promise.resolve(),aa=C=>{gn=gn.then(async()=>{let U=w.state.shell,ee=w.model.tasks.find(la=>la.id===U.selectedTaskId)??null,we=ee&&w.model.inspection?.taskId===ee.id?w.model.inspection:null;if(!ee||!we)throw new Error("Craig needs an active task before it can open a file from an agent session.");let me=await _h(C);w.model={...w.model,inspection:{...we,filePaths:[...new Set([...we.filePaths,C])],selectedFilePath:C,selectedFile:me,error:null}},w.ptyRuntime.detach();let ft=I(w,{...U,inputMode:"control",focusedRegion:"center",activeTab:B,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:C,selectedFilePath:C,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:ft},J(w,ft),w.render()}).catch(U=>Cr("open file from agent",U,oe(w)))};w.ptyRuntime.setOpenFileHandler?.(aa);let _s=C=>{let U=qe(m.width,m.height),ee=w.ptyRuntime.getActivitySnapshots?.()??[],we=Date.now(),me=my(I(w,C.shell),w.model,{snapshots:ee,now:we,animationFrame:O});x.clear();for(let la of w.model.tasks)for(let ca of la.ptyTabs)ca.kind==="agent"&&x.set(ca.id,Ot(ca.id,ee,we));let ft=sg(U,me,{centerOnly:C.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:me,presentation:ft}},fd=(C,U,ee,we)=>{if(!R)return!1;let me=Cy(R,U.regions,ee);return me?(me.output.length>0&&m.noFormat(me.output),b=C,R=me.regions,k=me.regions.center,y=we?U.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;ud(w),w.ptyRuntime.setPullRequestPollView?.(kw(w.state)),w.ptyRuntime.setViewedTab?.(Ar(w,w.state.shell));let{data:C,presentation:U}=_s(w.state);return fd(C,U,["rail","left","center","footer"],!1)},w.render=()=>{ud(w);let C=w.state;w.ptyRuntime.setPullRequestPollView?.(kw(C)),w.ptyRuntime.setViewedTab?.(C.mode==="main"?Ar(w,C.shell):null);let U=qe(m.width,m.height),ee,we=null;if(C.mode==="main"){let me=_s(C);if(we=me.presentation,ee=we.frame,!w.pendingClear&&fd(me.data,we,["rail","left","center","right","footer"],!0))return;b=me.data,k=we.center}else ee=C.variant==="boot"?eg(U,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="pause"?tg(U,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="options"?Uo(U,{menuIndex:C.menuIndex,optionsMenuItems:Wu}):C.variant==="runners"?Uo(U,{menuIndex:pd(C).menuIndex,optionsMenuItems:Bu(w.config,pd(C)),optionsMessage:Xg(pd(C)),optionsSubtitle:"Runners"}):C.variant==="previews"?Uo(U,{menuIndex:ww(C).menuIndex,optionsMenuItems:Qg(w.config),optionsMessage:Zg(ww(C)),optionsSubtitle:"Feature Previews - Experimental"}):C.variant==="logs"?rg(U,{logPath:C.log?.path??n.logFile,logLines:C.log?.lines??[]}):ng(U),b=null,k=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Pg(ee,y)),y=ee,R=we?.regions??null,m.hideCursor(!0)};let md=C=>fw(w,C),hd=C=>mw(w,C),gd=C=>yw(w,C),Rw=()=>{process.stdout.off("resize",yd),process.off("SIGCONT",wd),m.removeListener("key",md),m.removeListener("unknown",hd),m.removeListener("mouse",gd),w.scrollRenderTimer&&(clearTimeout(w.scrollRenderTimer),w.scrollRenderTimer=null),w.inspectionScrollRenderTimer&&(clearTimeout(w.inspectionScrollRenderTimer),w.inspectionScrollRenderTimer=null),w.leftNavInspectionTimer&&(clearTimeout(w.leftNavInspectionTimer),w.leftNavInspectionTimer=null),w.pendingTerminalKeySequence&&(clearTimeout(w.pendingTerminalKeySequence.timer),w.pendingTerminalKeySequence=null),w.ptyRenderTimer&&(clearTimeout(w.ptyRenderTimer),w.ptyRenderTimer=null),w.footerToastTimer&&(clearTimeout(w.footerToastTimer),w.footerToastTimer=null),w.focusFlashTimer&&(clearTimeout(w.focusFlashTimer),w.focusFlashTimer=null),Se.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=C=>{Rw(),f(C)};let yd=()=>{ld(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(dn(qe(m.width,m.height))),w.state={mode:"main",shell:hn(w,w.state.shell)}),w.render()},wd=()=>{ld(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(dn(qe(m.width,m.height))),w.state={mode:"main",shell:hn(w,w.state.shell)}),w.render()};process.stdout.on("resize",yd),process.on("SIGCONT",wd),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",md),m.on("unknown",hd),m.on("mouse",gd),v&&Se.register({id:"github.pull-requests",intervalMs:1e3,run:C=>ow(w,v,C)}),Se.register({id:"agent.activity-indicators",intervalMs:zu,run:()=>{let C=Date.now(),U=mi(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],C);(U||N)&&(O=(O+1)%uy,w.state.mode==="main"&&w.render()),N=U}}),Se.start(),T.version.checkForUpdate().then(C=>{C.updateAvailable&&C.latest&&(w.updateText=`Update available: v${C.latest}`,w.render())}),w.bootHydrationReady=cd(w).catch(()=>{}),w.render()})}async function QE(){try{if(process.argv[2]==="__craig-daemon"){let e=await bw(process.argv[3]??process.cwd()),t=Ae(e);return await qg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await bw(process.argv[3]??process.cwd()),t=Ae(e);return await Ug(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
286
|
-
`),1}return
|
|
290
|
+
`&&(e.suppressTerminalEnterOnAttach=!1),Ug(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function u0(e,t){if(e.pendingTerminalKeySequence){let n=jg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Fs(r);if(s)return Uw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Du(r))return e.pendingTerminalKeySequence.raw=r,qw(e),!0}return da(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>da(e),30)},!0)}function qw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>da(e),30))}function da(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Uw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Bw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Tw(e,Nu(t));return}let n=Nu(t);n!==0&&la(e,n)}function d0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var f0=p0(import.meta.url),m0=f0("terminal-kit"),h0=m0.terminal;function gd(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Ww(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Vw(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function g0(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 Kw(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ee(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Bn({uiStateFile:e.uiStateFile}):null,o=await Ir(t,void 0,s),a=$s(zh(i,r),o);o=await Ir(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>d(f),onActivityRemoved:f=>u(f),resolveSessionSpec:(f,m)=>_g(l.current,m,t)},h=e.ptyRuntime??await iy({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??h0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=new Map,A=h.managesPullRequestSync?null:new Er({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Se=new fn({resolutionMs:Qu,onError:(P,q)=>$r(`heartbeat job "${P}"`,q,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:$s(a,o)},get model(){return l.current},set model(P){l.current=P},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:P=>f(P),installUpdate:e.installUpdate??vy},w.ptyRuntime.setActivityEnabled?.(!0),c=P=>{w.state.mode==="main"&&($=g0($,P),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let q=$;if($=null,w.state.mode==="main"){let ne=Gt(w,w.state.shell);if(w.state={mode:"main",shell:ne},!b||!T){w.render();return}let we=Ue(m.width,m.height),me={...b,terminal:ne.terminal},mt=Jy(we,me,T,ne.centerZoomed,q?.kind==="rows"?q.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!mt){w.render();return}mt.output.length>0&&m.noFormat(mt.output),b=me,T=mt.region,R&&(R={...R,center:mt.region}),y=null,m.hideCursor(!0)}},0)))},d=P=>{w.state.mode==="main"&&Wt(P.tabId)&&_.get(P.tabId)!==$t(P.tabId,[P],Date.now())&&w.render()},u=P=>{w.state.mode==="main"&&Wt(P)&&_.get(P)!=="idle"&&w.render()};let ye=Promise.resolve(),z=P=>{ye=ye.then(async()=>{let q=await Promise.all([...new Set(P)].map(ne=>S.getTask(w.paths,ne)));for(let ne of q)oa(w,ne);w.state.mode==="main"?w.state={mode:"main",shell:v(w,w.state.shell)}:w.state={...w.state,shell:v(w,w.state.shell)},w.render()}).catch(q=>$r("daemon task-state refresh",q,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(z);let gn=Promise.resolve(),pa=P=>{gn=gn.then(async()=>{let q=w.state.shell,ne=w.model.tasks.find(Un=>Un.id===q.selectedTaskId)??null,we=ne&&w.model.inspection?.taskId===ne.id?w.model.inspection:null;if(!ne||!we)throw new Error("Craig needs an active task before it can open a file from an agent session.");let me=await Uh(P);w.model={...w.model,inspection:{...we,filePaths:[...new Set([...we.filePaths,P])],selectedFilePath:P,selectedFile:me,error:null}},w.ptyRuntime.detach();let mt=v(w,{...q,inputMode:"control",focusedRegion:"center",activeTab:V,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:P,selectedFilePath:P,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:mt},Q(w,mt),w.render()}).catch(q=>$r("open file from agent",q,oe(w)))};w.ptyRuntime.setOpenFileHandler?.(pa);let Dr=null,yd=P=>{let q=Ue(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Un=`${q.width}:${q.height}:${P.shell.centerZoomed}`;Dr!==Un&&(Dr=Un,w.ptyRuntime.resize(Bt(q,!0,P.shell.centerZoomed)),P.shell=Gt(w,P.shell))}else Dr=null;let ne=w.ptyRuntime.getActivitySnapshots?.()??[],we=Date.now(),me=My(v(w,P.shell),w.model,{snapshots:ne,now:we,animationFrame:N});_.clear();for(let Un of w.model.tasks)for(let fa of Un.ptyTabs)fa.kind==="agent"&&_.set(fa.id,$t(fa.id,ne,we));let mt=hg(q,me,{centerOnly:P.shell.centerZoomed,panelPolish:k.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:me,presentation:mt}},wd=(P,q,ne,we)=>{if(!R)return!1;let me=Xy(R,q.regions,ne);return me?(me.output.length>0&&m.noFormat(me.output),b=P,R=me.regions,T=me.regions.center,y=we?q.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;md(w),w.ptyRuntime.setPullRequestPollView?.(Vw(w.state)),w.ptyRuntime.setViewedTab?.(Nr(w,w.state.shell));let{data:P,presentation:q}=yd(w.state);return wd(P,q,["rail","left","center","footer"],!1)},w.render=()=>{md(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(Vw(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?Nr(w,P.shell):null);let q=Ue(m.width,m.height),ne,we=null;if(P.mode==="main"){let me=yd(P);if(we=me.presentation,ne=we.frame,!w.pendingClear&&wd(me.data,we,["rail","left","center","right","footer"],!0))return;b=me.data,T=we.center}else ne=P.variant==="boot"?ug(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="pause"?dg(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?Vo(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:Ty(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?Vo(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:gd(P).menuIndex,optionsMenuItems:Gu(w.config,gd(P)),optionsMessage:ky(gd(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?Vo(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Ww(P).menuIndex,optionsMenuItems:by(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:Ry(Ww(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?pg(q,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?mg(q,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):fg(q),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Wg(ne,y)),y=ne,R=we?.regions??null,m.hideCursor(!0)};let kd=P=>Mw(w,P),Td=P=>jw(w,P),bd=P=>Bw(w,P),Hw=()=>{process.stdout.off("resize",Rd),process.off("SIGCONT",Pd),m.removeListener("key",kd),m.removeListener("unknown",Td),m.removeListener("mouse",bd),w.scrollRenderTimer&&(clearTimeout(w.scrollRenderTimer),w.scrollRenderTimer=null),w.inspectionScrollRenderTimer&&(clearTimeout(w.inspectionScrollRenderTimer),w.inspectionScrollRenderTimer=null),w.leftNavInspectionTimer&&(clearTimeout(w.leftNavInspectionTimer),w.leftNavInspectionTimer=null),w.pendingTerminalKeySequence&&(clearTimeout(w.pendingTerminalKeySequence.timer),w.pendingTerminalKeySequence=null),w.ptyRenderTimer&&(clearTimeout(w.ptyRenderTimer),w.ptyRenderTimer=null),w.footerToastTimer&&(clearTimeout(w.footerToastTimer),w.footerToastTimer=null),w.focusFlashTimer&&(clearTimeout(w.focusFlashTimer),w.focusFlashTimer=null),Se.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{Hw(),f(P)};let Rd=()=>{pd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Bt(Ue(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Gt(w,w.state.shell)}),w.render()},Pd=()=>{pd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Bt(Ue(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Gt(w,w.state.shell)}),w.render()};process.stdout.on("resize",Rd),process.on("SIGCONT",Pd),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",kd),m.on("unknown",Td),m.on("mouse",bd),A&&Se.register({id:"github.pull-requests",intervalMs:1e3,run:P=>Ow(w,A,P)}),Se.register({id:"agent.activity-indicators",intervalMs:Qu,run:()=>{let P=Date.now(),q=ki(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(q||D)&&(N=(N+1)%_y,w.state.mode==="main"&&w.render()),D=q}}),Se.start(),(e.checkForUpdate??k.version.checkForUpdate)().then(P=>{if(P.updateAvailable&&P.latest){if(w.runtimeState?.ignoredUpdateVersion===P.latest)return;w.updateText=`Update available: v${P.latest}`,w.state.mode==="overlay"&&w.state.variant==="boot"&&(w.state={mode:"overlay",variant:"update",menuIndex:0,optionsMessage:null,shell:w.state.shell,update:{current:P.current,latest:P.latest,phase:"ready"}},w.pendingClear=!0),w.render()}}),w.bootHydrationReady=fd(w).catch(()=>{}),w.render()})}async function w0(){try{if(process.argv[2]==="__craig-daemon"){let e=await Gw(process.argv[3]??process.cwd()),t=Ee(e);return await oy(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Gw(process.argv[3]??process.cwd()),t=Ee(e);return await ay(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
291
|
+
`),1}return Oh({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=>Kw({uiStateFile:Ee(e).uiStateFile,workspaceRoot:e})})}async function Gw(e){return y0(e)}var k0=await w0();process.exit(k0);
|