craig-cli 0.15.3 → 0.15.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/cli.js +128 -126
- 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(Rw);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Pw(n))return{path:e.logFile,lines:[],empty:!0};throw n}},ra=async(e,t)=>Ws(e,{level:"error",component:"application",event:Sw(t.context),message:t.message,...t.details?{details:t.details}:{}}),hd=async(e,t)=>{try{await ra(e,t)}catch{}},gd=Bs,yd=async(e,t=fd)=>Bs(e,t);function Rw(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 Sw(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Pw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var ue={appendErrorLog:ra,appendErrorLogBestEffort:hd,appendLog:Ws,appendLogBestEffort:md,readLog:Bs,readErrorLog:gd,readRecentErrorLines:yd};function Sd(e){let{commandTokens:t,options:n,help:r}=vw(e);if(r)return kd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Ir(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:bd(o,"Repo path")};break;case"repo:list":Ir(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:bd(o,"Workspace path")};break;case"workspace:list":a=Cw(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"task:new":a=Ew(o);break;case"task:create-child":a=Ow(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=Aw(o);break;case"task:current":Ir(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:Z(o,"Task id")};break;case"task:pr":a=$w(o);break;case"task:wait":a=Mw(o);break;case"agent:list":Ir(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=_w(o);break;case"agent:send":a=xw(o);break;case"command:show":a={kind:"showPromptCommand",commandId:Z(o,"Command id")};break;case"command:list":Ir(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:Z(o,"Command id")};break;case"command:wait":a=Lw(o);break;case"events:list":a=wd(o,!1);break;case"events:watch":a=wd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:Z(o,"Fury file")};break;case"fury:plan":a=jw(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=qw(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=Uw(o);break;case"fury:reviews":a=Ww(o);break;case"fury:review":a=Bw(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:Rd(o,0,"Task id"),repoId:Rd(o,1,"Repo id")},la(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 P(`Unsupported command: ${t.join(" ")}`)}return kd(a,n)}function Pd(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 Iw(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.add",listTaskLinks:"link.list",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function 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 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 show [<id>] Show task details; omit id to use resolved context"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add a linked repo to a task"," craig link list <task-id> List linked repos for a task"].join(`
|
|
7
|
-
`)}function vw(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||!Td(l)){n.push(l);continue}if(s.has(l))throw P(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||Td(c))throw P(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=L(c,"Workspace root"):r.taskId=L(c,"Task id")}return{commandTokens:n,options:r,help:i}}function Cw(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw P(`Unsupported command: workspace list ${e.join(" ")}`)}function Aw(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:L(e[1],"Repo id")};throw P(`Unsupported command: task list ${e.join(" ")}`)}function Ew(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw P(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw P("Task option --repo may only be provided once.");t=L(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw P("Task option --workspace may only be provided once.");n=L(c,"Workspace id")}else{if(r!==void 0)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw P(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw P("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw P("Task creation accepts either '--repo' or '--workspace', not both.");let o=L(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Ow(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw P(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw P(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw P("Task option --parent may only be provided once.");t=L(d,"Parent task id")}else if(c==="--repo"){if(n)throw P("Task option --repo may only be provided once.");n=L(d,"Repo id")}else if(c==="--workspace"){if(r)throw P("Task option --workspace may only be provided once.");r=L(d,"Workspace id")}else if(c==="--runner"){if(s)throw P("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw P("Task option --idempotency-key may only be provided once.");i=L(d,"Idempotency key")}}if(n&&r)throw P("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:L(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function $w(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw P(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw P(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw P(`task pr ${t} accepts at most one task id.`);r=L(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw P(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw P("Task PR option --repo may only be provided once.");s=L(c,"Repo id")}else{if(i!==void 0)throw P("Task PR option --pr may only be provided once.");i=L(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw P(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw P(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw P(`Unsupported command: task pr ${e.join(" ")}`)}}var ia=300*1e3,Dw=new Set(["idle","working","ready","error"]),Nw=new Set(["queued","delivering","delivered","failed","cancelled"]);function _w(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:L(e[1],"Agent tab id")};throw P(`Unsupported command: agent status ${e.join(" ")}`)}function xw(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 P(`Unsupported agent send option: ${l}`);if(o.has(l))throw P(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw P("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw P("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:L(c,"Prompt")}:{source:"file",path:L(c,"Prompt file")}}else if(l==="--tab")n=L(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw P('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=aa(c):i=L(c,"Idempotency key")}if(!t)throw P("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Lw(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 P(`Unsupported command wait option: ${o}`);if(s.has(o))throw P(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw P(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Fw(a):r=aa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Fw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Nw.has(n)))throw P(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function wd(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw P(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw P("--format is supported only by events watch.");if(i.has(l))throw P(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=L(c,"Event type glob");else if(l==="--after")r=L(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw P('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function Mw(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 P(`Unsupported task wait option: ${a}`);if(t!==void 0)throw P("task wait accepts at most one task id.");t=L(a,"Task id");continue}if(i.has(a))throw P(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw P(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Vw(l):a==="--tab"?r=L(l,"Agent tab id"):s=aa(l)}if(!n)throw P("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function jw(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw P(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw P("fury plan accepts exactly one definition file.");t=L(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw P(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw P("Fury plan option --root-task may only be provided once.");n=L(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw P(`Invalid fury input "${o}". Use key=value.`);let l=L(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw P(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw P("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function qw(e){let t=L(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw P("fury watch supports --after and --format jsonl.");if(i==="--after")n=L(o,"Event cursor");else if(o==="jsonl")r=o;else throw P("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Uw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw P("fury step requires complete or fail.");let n=oa(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=L(n.get("--run")??"","Fury run id"),s=L(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw P("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:L(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw P("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw P("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function Ww(e){if(e[0]!=="list")throw P("fury reviews requires list.");let t=oa(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw P(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Bw(e){let t=e[0],n=L(e[1]??"","Fury review id");if(t==="show")return la(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw P("Unsupported fury review action.");let r=oa(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw P(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function oa(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw P(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw P(`Option ${s} requires a value.`);n.set(s,L(i,s))}return n}function Vw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Dw.has(n)))throw P(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function aa(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw P(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw P(`Duration "${e}" is too large.`);return s}function kd(e,t){return{mode:"command",command:e,commandName:Iw(e),options:t}}function Td(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Ir(e,t){la(e,0,t)}function la(e,t,n){if(e.length!==t)throw P(`Command ${n} received an unexpected number of arguments.`)}function Z(e,t){if(e.length!==1)throw P(`${t} is required and must be provided once.`);return L(e[0],t)}function bd(e,t){return L(e.join(" "),t)}function Rd(e,t,n){return L(e[t]??"",n)}function L(e,t){let n=e.trim();if(n.length===0)throw P(`${t} cannot be empty.`);return n}function P(e){return new g("CLI_USAGE",`${e}
|
|
2
|
+
var rw=Object.defineProperty;var Ds=(e,t)=>{for(var n in t)rw(e,n,{get:t[n],enumerable:!0})};import{realpath as bE}from"node:fs/promises";import ke from"node:path";function Ce(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 Kc from"node:path";import{readFile as uI}from"node:fs/promises";import{readFile as dw}from"node:fs/promises";import{randomUUID as sw}from"node:crypto";import{chmod as iw,open as ow,readFile as aw,rename as lw,rm as cw}from"node:fs/promises";import Xo from"node:path";async function q(e,t,n={}){let r=Xo.dirname(e),s=Xo.join(r,`.${Xo.basename(e)}.${process.pid}.${Date.now()}.${sw()}.tmp`),i=await ow(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 lw(s,e),n.mode!==void 0&&await iw(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await cw(s,{force:!0}).catch(()=>{}),o}}async function Ns(e){try{let t=await aw(e,"utf8");return JSON.parse(t)}catch(t){if(uw(t))return null;throw t}}function uw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function qn(e){try{let t=await dw(e.uiStateFile,"utf8"),n=JSON.parse(t);return pw(n,e.uiStateFile)}catch(t){if(mw(t))return null;throw t}}async function Ut(e,t){await q(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function xs(){return{version:1,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null,selectedPtyTabId:null,inputMode:"control",focusedRegion:"tasks",activeTab:"agent",inspectorSection:"task",inspectionMode:"files",openInspectionKind:null,selectedFileTreePath:null,selectedFilePath:null,selectedDiffPath:null,collapsedFileTreePaths:[],selectedActionId:"commit",updatedAt:new Date().toISOString()}}function pw(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")||!jn(e,"inputMode")||!jn(e,"focusedRegion")||!jn(e,"activeTab")||!jn(e,"inspectorSection")||!jn(e,"inspectionMode")||!_s(e,"openInspectionKind")||!_s(e,"selectedFileTreePath")||!_s(e,"selectedFilePath")||!_s(e,"selectedDiffPath")||!fw(e,"collapsedFileTreePaths")||!jn(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 jn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function _s(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function fw(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function mw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Qo={};Ds(Qo,{RUNNER_IDS:()=>ue,STABLE_RUNNER_IDS:()=>dt,assertEnabled:()=>id,buildCommand:()=>ld,getConfiguredProfile:()=>Fs,getDefault:()=>sd,getDisplayName:()=>ad,getEnabled:()=>Ls,getProfile:()=>Un,isRunnerType:()=>Ms,parse:()=>od,setRunnerEnabled:()=>cd,setRunnerPath:()=>ud});var dt=["codex","cursor","claude"],ue=[...dt,"pi"];var rd={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 Un=e=>rd[e];var Fs=(e,t={})=>{let n=Un(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Ls=(e={})=>ue.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var sd=(e={})=>{let t=Ls(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 id=(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 Ms=e=>ue.includes(e);var od=e=>{if(!e||e.length===0)return"codex";if(!Ms(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${ue.join(", ")}.`);return e};var ad=e=>Un(e).displayName;var ld=(e,t,n={})=>{let r=[Fs(e,n).executable];return t&&t.length>0&&r.push(t),r};var cd=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var ud=(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 Zo={};Ds(Zo,{PREVIEW_FEATURE_IDS:()=>Je,isEnabled:()=>dd,setEnabled:()=>pd});var Je=["agentOrchestration","piRunner","fileOpen"];function dd(e,t){return e.previews?.[t]===!0}function pd(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as hw,readFile as gw,writeFile as yw}from"node:fs/promises";import ww from"node:path";var kw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",fd=async e=>{try{return await gw(e,"utf8")}catch(t){if(kw(t))return null;throw t}},md=async(e,t)=>{await hw(ww.dirname(e),{recursive:!0}),await yw(e,t,"utf8")};var Tw=["incrementalCenterPane","agentActivityIndicators"],js=(e,t)=>{if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!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(!Tw.includes(r)&&!Je.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${Je.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var ea=async(e,t={readConfigFile:fd})=>{let n=await t.readConfigFile(e.configFile);if(!n)return{};if(n.trimStart()[0]!=="{")throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`);let r;try{r=JSON.parse(n)}catch{throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`)}return js(r,e.configFile)};var ta=async(e,t,n={writeConfigFile:md})=>{js(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`)};var na={};Ds(na,{checkForUpdate:()=>hd,getCurrent:()=>qs});var qs=()=>{try{return"0.15.5"}catch{return"unknown"}};var bw="https://registry.npmjs.org/craig-cli/latest",Rw=3600*1e3,Sw={value:null},Pw=(e,t)=>{let n=c=>c.split(".").map(Number),[r=0,s=0,i=0]=n(e),[o=0,a=0,l=0]=n(t);return r!==o?r>o:s!==a?s>a:i>l},hd=async(e={fetch:globalThis.fetch,getCurrent:qs,cache:Sw})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Rw)return e.cache.value.result;let r=null;try{let i=await e.fetch(bw,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&Pw(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:ea,save:ta,previews:Zo,runners:Qo,version:na};var gd={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=gd[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function ra(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Iw,mkdir as vw,readFile as Cw}from"node:fs/promises";import Aw from"node:path";var yd=80,Us=async(e,t)=>{await vw(Aw.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Iw(e.logFile,`${JSON.stringify(n)}
|
|
5
|
+
`,"utf8")},wd=async(e,t)=>{try{await Us(e,t)}catch{}},Ws=async(e,t=yd)=>{try{let s=(await Cw(e.logFile,"utf8")).trimEnd().split(`
|
|
6
|
+
`).filter(i=>i.length>0).map(Ew);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if($w(n))return{path:e.logFile,lines:[],empty:!0};throw n}},sa=async(e,t)=>Us(e,{level:"error",component:"application",event:Ow(t.context),message:t.message,...t.details?{details:t.details}:{}}),kd=async(e,t)=>{try{await sa(e,t)}catch{}},Td=Ws,bd=async(e,t=yd)=>Ws(e,t);function Ew(e){try{let t=JSON.parse(e);if(!t.timestamp||!t.level||!t.component||!t.event||!t.message)return e;let n=[t.taskId,t.tabId].filter(Boolean).join("/");return`[${t.timestamp}] ${t.level.toUpperCase().padEnd(5)} ${t.component}.${t.event}${n?` ${n}`:""} \u2014 ${t.message}`}catch{return e}}function Ow(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function $w(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var de={appendErrorLog:sa,appendErrorLogBestEffort:kd,appendLog:Us,appendLogBestEffort:wd,readLog:Ws,readErrorLog:Td,readRecentErrorLines:bd};function Cd(e){let{commandTokens:t,options:n,help:r}=Nw(e);if(r)return Sd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Cr(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Id(o,"Repo path")};break;case"repo:list":Cr(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:Id(o,"Workspace path")};break;case"workspace:list":a=_w(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=Fw(o);break;case"task:create-child":a=Lw(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:list":a=xw(o);break;case"task:current":Cr(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:X(o,"Task id")};break;case"task:pr":a=Mw(o);break;case"task:wait":a=Kw(o);break;case"agent:list":Cr(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Uw(o);break;case"agent:send":a=Ww(o);break;case"command:show":a={kind:"showPromptCommand",commandId:X(o,"Command id")};break;case"command:list":Cr(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:X(o,"Command id")};break;case"command:wait":a=Bw(o);break;case"events:list":a=Rd(o,!1);break;case"events:watch":a=Rd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:X(o,"Fury file")};break;case"fury:plan":a=Gw(o);break;case"fury:approve":a={kind:"approveFury",planId:X(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:X(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:X(o,"Fury run id")};break;case"fury:watch":a=Hw(o);break;case"fury:cancel":a={kind:"cancelFury",runId:X(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:X(o,"Fury run id")};break;case"fury:step":a=Yw(o);break;case"fury:reviews":a=zw(o);break;case"fury:review":a=Jw(o);break;case"task: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:vd(o,0,"Task id"),repoId:vd(o,1,"Repo id")},ca(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:X(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw P(`Unsupported command: ${t.join(" ")}`)}return Sd(a,n)}function Ad(e){let t=e[0]==="--"?e.slice(1):e,n=!0;for(let r of t){if(r==="--"){n=!1;continue}if(n&&r==="--json")return!0}return!1}function Dw(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.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 ia(){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 show [<id>] Show task details; omit id to use resolved context"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add a linked repo to a task"," craig link list <task-id> List linked repos for a task"].join(`
|
|
7
|
+
`)}function Nw(e){let t=[...e];t[0]==="--"&&t.shift();let n=[],r={json:!1,noInput:!1},s=new Set,i=!1,o=!0;for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--"){o=!1,n.push(l);continue}if(!o||!Pd(l)){n.push(l);continue}if(s.has(l))throw P(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||Pd(c))throw P(`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 _w(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw P(`Unsupported command: workspace list ${e.join(" ")}`)}function xw(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 P(`Unsupported command: task list ${e.join(" ")}`)}function Fw(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw P(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw P("Task option --repo may only be provided once.");t=F(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw P("Task option --workspace may only be provided once.");n=F(c,"Workspace id")}else{if(r!==void 0)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw P(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw P("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw P("Task creation accepts either '--repo' or '--workspace', not both.");let o=F(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Lw(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw P(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw P(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw P("Task option --parent may only be provided once.");t=F(d,"Parent task id")}else if(c==="--repo"){if(n)throw P("Task option --repo may only be provided once.");n=F(d,"Repo id")}else if(c==="--workspace"){if(r)throw P("Task option --workspace may only be provided once.");r=F(d,"Workspace id")}else if(c==="--runner"){if(s)throw P("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw P("Task option --idempotency-key may only be provided once.");i=F(d,"Idempotency key")}}if(n&&r)throw P("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:F(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function Mw(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw P(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw P(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw P(`task pr ${t} accepts at most one task id.`);r=F(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw P(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw P("Task PR option --repo may only be provided once.");s=F(c,"Repo id")}else{if(i!==void 0)throw P("Task PR option --pr may only be provided once.");i=F(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw P(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw P(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw P(`Unsupported command: task pr ${e.join(" ")}`)}}var oa=300*1e3,jw=new Set(["idle","working","ready","error"]),qw=new Set(["queued","delivering","delivered","failed","cancelled"]);function Uw(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:F(e[1],"Agent tab id")};throw P(`Unsupported command: agent status ${e.join(" ")}`)}function Ww(e){let t,n,r="when-ready",s=oa,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw P(`Unsupported agent send option: ${l}`);if(o.has(l))throw P(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw P("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw P("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text: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 P('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=la(c):i=F(c,"Idempotency key")}if(!t)throw P("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Bw(e){let t=F(e[0]??"","Command id"),n,r=oa,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw P(`Unsupported command wait option: ${o}`);if(s.has(o))throw P(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw P(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Vw(a):r=la(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Vw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!qw.has(n)))throw P(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Rd(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw P(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw P("--format is supported only by events watch.");if(i.has(l))throw P(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=F(c,"Event type glob");else if(l==="--after")r=F(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw P('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function Kw(e){let t,n,r,s=oa,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw P(`Unsupported task wait option: ${a}`);if(t!==void 0)throw P("task wait accepts at most one task id.");t=F(a,"Task id");continue}if(i.has(a))throw P(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw P(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Xw(l):a==="--tab"?r=F(l,"Agent tab id"):s=la(l)}if(!n)throw P("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Gw(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw P(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw P("fury plan accepts exactly one definition file.");t=F(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw P(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw P("Fury plan option --root-task may only be provided once.");n=F(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw P(`Invalid fury input "${o}". Use key=value.`);let l=F(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw P(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw P("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function Hw(e){let t=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 P("fury watch supports --after and --format jsonl.");if(i==="--after")n=F(o,"Event cursor");else if(o==="jsonl")r=o;else throw P("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Yw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw P("fury step requires complete or fail.");let n=aa(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 P("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 P("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw P("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function zw(e){if(e[0]!=="list")throw P("fury reviews requires list.");let t=aa(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw P(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Jw(e){let t=e[0],n=F(e[1]??"","Fury review id");if(t==="show")return ca(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw P("Unsupported fury review action.");let r=aa(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw P(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function aa(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw P(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw P(`Option ${s} requires a value.`);n.set(s,F(i,s))}return n}function Xw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!jw.has(n)))throw P(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function la(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw P(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw P(`Duration "${e}" is too large.`);return s}function Sd(e,t){return{mode:"command",command:e,commandName:Dw(e),options:t}}function Pd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Cr(e,t){ca(e,0,t)}function ca(e,t,n){if(e.length!==t)throw P(`Command ${n} received an unexpected number of arguments.`)}function X(e,t){if(e.length!==1)throw P(`${t} is required and must be provided once.`);return F(e[0],t)}function Id(e,t){return F(e.join(" "),t)}function vd(e,t,n){return F(e[t]??"",n)}function F(e,t){let n=e.trim();if(n.length===0)throw P(`${t} cannot be empty.`);return n}function P(e){return new g("CLI_USAGE",`${e}
|
|
8
8
|
|
|
9
|
-
${sa()}`,{})}var je=(e,t)=>{let n=ca(e);if(!Gw(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},ca=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:ua(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:zw(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Hw(t.repoTargets),runnerSession:t.runnerSession??Kw(t),checks:nk(t),lastCommit:t.lastCommit??null,prs:rk(t),artifacts:ak(t),cleanup:lk(t)}},Kw=e=>{if(typeof e.title!="string")return null;let t=ua(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Gw=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"&&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||Yw(t.repoTargets))&&Xw(t.runnerSession)&&Qw(t.prompt)&&Cd(t.checks)&&Ad(t.lastCommit)&&ek(t.prs)&&tk(t.artifacts)&&Od(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Hw=e=>{if(Array.isArray(e))return e.filter(Id)},Yw=e=>Array.isArray(e)&&e.every(Id),Id=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)&&Cd(t.checks)&&Ad(t.lastCommit)&&Ed(t.pullRequest)&&Od(t.cleanup)},zw=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 Jw(e.id,e.title,t,ua(e.runner))},Jw=(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}]},ua=e=>e&&k.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"),Xw=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),Qw=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Cd=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"),Ad=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Ed=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&Zw(e.requiredChecks),Zw=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)),ek=e=>Array.isArray(e)&&e.every(Ed),tk=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),Od=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),nk=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},rk=e=>{if(Array.isArray(e.prs))return e.prs.map(sk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:$d(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Dd(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},sk=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:$d(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:ik(t.reviewDecision),requiredChecks:Dd(t.requiredChecks),comments:ok(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},$d=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,ik=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ok=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}]}):[],Dd=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})):[],ak=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},lk=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as Gk}from"node:fs/promises";import{readFile as ck,readdir as uk,rm as dk}from"node:fs/promises";import Nd from"node:path";var da=(e,t)=>Nd.join(e.workspacesDir,`${t}.json`),pk=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"):[]}},_d=(e,t)=>{let n=pk(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},hn=async(e,t)=>{let n=da(e,t);try{let r=await ck(n,"utf8");return _d(JSON.parse(r),n)}catch(r){throw fk(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}},gn=async(e,t)=>{await q(da(e,t.id),{...t,updatedAt:new Date().toISOString()})},$e=async e=>{let t=await uk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>hn(e,Nd.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},xd=async(e,t)=>{await dk(da(e,t),{force:!0})},fk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as mk,readdir as hk,rm as gk}from"node:fs/promises";import Ld from"node:path";var pa=(e,t)=>Ld.join(e.reposDir,`${t}.json`),Fd=(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},dt=async(e,t)=>{let n=pa(e,t);try{let r=await mk(n,"utf8");return Fd(JSON.parse(r),n)}catch(r){throw yk(r)?new g("REPO_NOT_FOUND",`Craig repo "${t}" was not found.`,{details:{repoId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig repo record at ")?new g("REPO_RECORD_INVALID",r instanceof Error?r.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:r}):r}},fa=async(e,t)=>{await q(pa(e,t.id),{...t,updatedAt:new Date().toISOString()})},vr=async e=>{let t=await hk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>dt(e,Ld.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},Md=async(e,t)=>{await gk(pa(e,t),{force:!0})},yk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as wk}from"node:fs/promises";var kk=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"},Un=(e,t,n)=>{if(!kk(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Ce=async e=>{let t=await wk(e.indexFile,"utf8");return Un(JSON.parse(t),e.workspaceRoot,e.indexFile)},Rt=async(e,t)=>{await q(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Pk,stat as Ik}from"node:fs/promises";import Bn from"node:path";import{realpath as Ud}from"node:fs/promises";import Vs from"node:path";import{execFile as Tk}from"node:child_process";import{promisify as bk}from"node:util";var jd=bk(Tk);async function K(e,t,n={}){try{let r=await jd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(qd(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 jd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(qd(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function qd(e){return e instanceof Error}var ma=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Ud(n).catch(()=>Vs.resolve(n)),Ud(e).catch(()=>Vs.resolve(e))]);return r===s}catch{return!1}},ha=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 K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},Wd=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=Vs.resolve(e,n);return Vs.dirname(r)};import{mkdir as qe,readFile as Rk}from"node:fs/promises";var Sk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Wn=async e=>{let t=ve(e);await qe(t.craigDir,{recursive:!0}),await Promise.all([qe(t.reposDir,{recursive:!0}),qe(t.workspacesDir,{recursive:!0}),qe(t.runtimeDir,{recursive:!0}),qe(t.tasksDir,{recursive:!0}),qe(t.jobsDir,{recursive:!0}),qe(t.commandsDir,{recursive:!0}),qe(t.eventsDir,{recursive:!0}),qe(t.orchestrationDir,{recursive:!0}),qe(t.logsDir,{recursive:!0}),qe(t.artifactsDir,{recursive:!0}),qe(t.worktreesDir,{recursive:!0})]);try{let s=await Rk(t.indexFile,"utf8"),i=JSON.parse(s);return Un(i,e,t.indexFile)}catch(s){if(!Sk(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 Bd=(e,t,n)=>{let r=new Date().toISOString();return{id:vk(e,Bn.basename(t)),name:Bn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Vd=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},vk=(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},Ck=(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},Kd=async(e,t)=>{let n=await Ce(e);await Rt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},Ak=async(e,t)=>{let n=await Pk(t,{withFileTypes:!0}),r=await vr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Bn.join(t,i.name);if(!await ma(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await ha(o);s.push(a?Vd(a,l):Bd([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Ek=async(e,t)=>{let n=await ha(t),r=await vr(e),s=r.find(u=>u.rootPath===t)??null,i=s?Vd(s,n):Bd(r,t,n),o=`workspace_${i.id}`,l=(await $e(e)).find(u=>u.id===o)??null,c=new Date().toISOString(),d=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await fa(e,i),l||await gn(e,d),await Kd(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},Ok=async(e,t)=>{let n=await Ak(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await $e(e),s=Ck(r,Bn.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:Bn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>fa(e,c))),await gn(e,l),await Kd(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Cr=async(e,t)=>{await Wn(e.workspaceRoot);let n=Bn.resolve(e.workspaceRoot,t);if(!(await Ik(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await ma(n)?Ek(e,n):Ok(e,n)};var ga=async(e,t,n={listWorkspaceRecords:$e,ensureCraigState:Wn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var ya=async(e,t,n={readWorkspace:hn,writeWorkspace:gn})=>{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 wa=async(e,t)=>{let r={...await hn(e,t),status:"active",archivedAt:null};await gn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var yn=async(e,t,n={deleteWorkspace:xd,readCraigIndex:Ce,writeCraigIndex:Rt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var ka=async(e,t,n)=>{let r=await hn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await yn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as $k,realpath as Yd,stat as Dk}from"node:fs/promises";import Ks from"node:path";async function Ta(e){let t=await Jd(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Gd(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Gd(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Hd(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Wd(t);if(r){let s=await Hd(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 Gd(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Jd(Ks.resolve(n,e),s),o=await zd(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 Hd(e){let t=e;for(;;){let n=await zd(t);if(n)return n;let r=Ks.dirname(t);if(r===t)return null;t=r}}async function zd(e){let t=ve(e);try{let n=await $k(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Un(r,s,t.indexFile);if(await Yd(i.workspaceRoot).catch(()=>Ks.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(Nk(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 Jd(e,t){let n=Ks.resolve(e);try{if(!(await Dk(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Yd(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 Nk(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var ba={};Ns(ba,{addRepo:()=>Xd,listRegisteredRepos:()=>Qd,removeRepo:()=>Zd});import _k from"node:path";import{stat as xk}from"node:fs/promises";var Xd=async(e,t)=>{let n=_k.resolve(e.workspaceRoot,t);if(!(await xk(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Cr(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 Qd=async(e,t={listRepos:vr,ensureCraigState:Wn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Zd=async(e,t,n)=>{let r=await dt(e,t),i=(await $e(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>yn(e,c.id))),await Md(e,t);let l=await Ce(e);return await Rt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var we={addWorkspace:Cr,listWorkspaces:ga,archiveWorkspace:ya,restoreWorkspace:wa,removeWorkspace:ka,removeWorkspaceRecord:yn,resolveContext:Ta,repos:ba};import{mkdir as ep,readFile as Lk,rm as Hs,stat as Fk,writeFile as Mk}from"node:fs/promises";import Gs from"node:path";var jk=25,qk=3e4,Uk=5e3;async function Ut(e,t,n){let r=Gs.join(e.runtimeDir,"task-locks"),s=Gs.join(r,`${t}.lock`);await ep(r,{recursive:!0});let i=Date.now();for(;;)try{await ep(s);try{await Mk(Gs.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Hs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Vk(o))throw o;if(await Wk(s))continue;if(Date.now()-i>=qk)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Kk(jk)}try{return await n()}finally{await Hs(s,{recursive:!0,force:!0})}}async function Wk(e){let t=await Lk(Gs.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Bk(t.pid)?!1:(await Hs(e,{recursive:!0,force:!0}),!0);let n=await Fk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Uk?!1:(await Hs(e,{recursive:!0,force:!0}),!0)}function Bk(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 Vk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Kk=e=>new Promise(t=>setTimeout(t,e));var St=async(e,t)=>{let n=await Gk(Ys(e,t),"utf8");return JSON.parse(n)},Ar=async(e,t)=>{let n=await St(e,t);return je(n,Ys(e,t))},Pt=async(e,t)=>{let n=tp(t);await q(Ys(e,t.id),n)},V=async(e,t,n)=>Ut(e,t,async()=>{let r=await Ar(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=tp(s);return await q(Ys(e,t),i),i}),Ra=async(e,t)=>{let n=await Ce(e);n.taskIds.includes(t)||await Rt(e,{...n,taskIds:[...n.taskIds,t]})},Ys=(e,t)=>`${e.tasksDir}/${t}.json`,tp=e=>({...e,updatedAt:new Date().toISOString()});var W=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Wt=e=>e.status==="merged"||e.status==="closed",It=(e,t)=>{let n=e.prs.findIndex(s=>Vn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Vn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),wn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return Js(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},Js=e=>e.mergeable&&!Hk(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Hk=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Sa=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),vt=(e,t,n)=>{let r=e.isDraft??!1,s=Yk(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:zk(e.reviewDecision??null),requiredChecks:Pa(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:Zk(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}},Yk=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,zk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Pa=e=>{let t=e.map(r=>Jk(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||Xk(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},Jk=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:rp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:Qk(t)}:null},Xk=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):zs(e)&&!zs(t)?!0:!zs(e)&&zs(t)?!1:np(t.status)>=np(e.status),zs=e=>e.conclusion?.toUpperCase()==="CANCELLED",np=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},Qk=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},Zk=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(eT).filter(n=>n!==null).slice(-4):[]},eT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=tT(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},tT=e=>e.replace(/\s+/g," ").trim(),rp=(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?rp(r,r):"unknown"};var Ue=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as nT}from"node:fs/promises";import sp from"node:path";var F=async(e,t,n={readRawTask:St,validateTaskRecord:je})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw aT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):lT(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},me=async e=>{if(!await Ia(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Kn=(e,t)=>t.artifacts.logPath?sp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:sp.join(e.workspaceRoot,t.artifacts.logPath):null,Er=async(e,t)=>{let n=await Ia(t.worktreePath),r=Kn(e,t),s=r?await Ia(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:rT(t),lastCommitSummary:sT(t),prSummary:iT(t),cleanupSummary:oT(t)}},Ia=async e=>{try{return await nT(e),!0}catch{return!1}},rT=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}`},sT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",iT=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
|
+
${ia()}`,{})}var qe=(e,t)=>{let n=ua(e);if(!Zw(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},ua=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,delete r.tmuxWindowTarget,delete r.tmuxPage,delete r.tmuxTarget,delete r.layoutSlot,delete r.sessionId,{...r,runner:da(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(s=>typeof s=="string"):[],parentTaskId:typeof t.parentTaskId=="string"||t.parentTaskId===null?t.parentTaskId:null,rootTaskId:typeof t.rootTaskId=="string"?t.rootTaskId:t.id,delegationDepth:Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0?t.delegationDepth:0,delegationIdempotencyKey:typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null?t.delegationIdempotencyKey:null,furyRunId:typeof t.furyRunId=="string"||t.furyRunId===null?t.furyRunId:typeof n.swarmRunId=="string"?n.swarmRunId:null,furyStepId:typeof t.furyStepId=="string"||t.furyStepId===null?t.furyStepId:typeof n.swarmStepId=="string"?n.swarmStepId:null,ptyTabs:nk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:ek(t.repoTargets),runnerSession:t.runnerSession??Qw(t),checks:ck(t),lastCommit:t.lastCommit??null,prs:uk(t),artifacts:mk(t),cleanup:hk(t)}},Qw=e=>{if(typeof e.title!="string")return null;let t=da(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Zw=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.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"&&Od(t.ptyTabs)&&(t.bundlePath===void 0||t.bundlePath===null||typeof t.bundlePath=="string")&&(t.selectedRepoTargetId===void 0||t.selectedRepoTargetId===null||typeof t.selectedRepoTargetId=="string")&&(t.repoTargets===void 0||tk(t.repoTargets))&&sk(t.runnerSession)&&ik(t.prompt)&&$d(t.checks)&&Dd(t.lastCommit)&&ak(t.prs)&&lk(t.artifacts)&&_d(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},ek=e=>{if(Array.isArray(e))return e.filter(Ed)},tk=e=>Array.isArray(e)&&e.every(Ed),Ed=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)&&$d(t.checks)&&Dd(t.lastCommit)&&Nd(t.pullRequest)&&_d(t.cleanup)},nk=e=>{if(Od(e.ptyTabs))return e.ptyTabs;if(typeof e.id!="string"||typeof e.title!="string")return[];let t=typeof e.updatedAt=="string"?e.updatedAt:new Date().toISOString();return rk(e.id,e.title,t,da(e.runner))},rk=(e,t,n,r)=>{let s=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:k.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},da=e=>e&&k.runners.isRunnerType(e)?e:"codex",Od=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",$d=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"),Dd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Nd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&ok(e.requiredChecks),ok=e=>Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.name=="string"&&(t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown")&&(typeof t.conclusion=="string"||t.conclusion===null)),ak=e=>Array.isArray(e)&&e.every(Nd),lk=e=>typeof e=="object"&&e!==null&&(typeof e.logPath=="string"||e.logPath===null)&&(typeof e.checkSummaryPath=="string"||e.checkSummaryPath===null)&&(typeof e.prDraftPath=="string"||e.prDraftPath===null)&&(typeof e.prStatusPath=="string"||e.prStatusPath===null),_d=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),ck=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},uk=e=>{if(Array.isArray(e.prs))return e.prs.map(dk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:xd(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Fd(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},dk=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:xd(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:pk(t.reviewDecision),requiredChecks:Fd(t.requiredChecks),comments:fk(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},xd=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,pk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,fk=e=>Array.isArray(e)?e.flatMap(t=>{if(typeof t!="object"||t===null)return[];let n=t;return typeof n.body!="string"||!n.body.trim()?[]:[{author:typeof n.author=="string"?n.author:null,body:n.body,createdAt:typeof n.createdAt=="string"?n.createdAt:null,url:typeof n.url=="string"?n.url:null}]}):[],Fd=e=>Array.isArray(e)?e.map(t=>({...t,status:t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown"?t.status:"unknown",conclusion:t.conclusion??null})):[],mk=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},hk=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as Zk}from"node:fs/promises";import{readFile as gk,readdir as yk,rm as wk}from"node:fs/promises";import Ld from"node:path";var pa=(e,t)=>Ld.join(e.workspacesDir,`${t}.json`),kk=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=t.repoId??t.primaryRepoId;return{...t,kind:t.kind??"repo",name:t.name??n??t.id,rootPath:t.rootPath??"",primaryRepoId:t.primaryRepoId??n??"",repoId:t.kind==="project"?t.repoId:n,discoveredRepoIds:Array.isArray(t.discoveredRepoIds)?t.discoveredRepoIds.filter(r=>typeof r=="string"):t.kind==="project"?[]:n?[n]:[],linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(r=>typeof r=="string"):[]}},Md=(e,t)=>{let n=kk(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},gn=async(e,t)=>{let n=pa(e,t);try{let r=await gk(n,"utf8");return Md(JSON.parse(r),n)}catch(r){throw Tk(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}},yn=async(e,t)=>{await q(pa(e,t.id),{...t,updatedAt:new Date().toISOString()})},De=async e=>{let t=await yk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>gn(e,Ld.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},jd=async(e,t)=>{await wk(pa(e,t),{force:!0})},Tk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as bk,readdir as Rk,rm as Sk}from"node:fs/promises";import qd from"node:path";var fa=(e,t)=>qd.join(e.reposDir,`${t}.json`),Ud=(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},pt=async(e,t)=>{let n=fa(e,t);try{let r=await bk(n,"utf8");return Ud(JSON.parse(r),n)}catch(r){throw Pk(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}},ma=async(e,t)=>{await q(fa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ar=async e=>{let t=await Rk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>pt(e,qd.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},Wd=async(e,t)=>{await Sk(fa(e,t),{force:!0})},Pk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Ik}from"node:fs/promises";var vk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Wn=(e,t,n)=>{if(!vk(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Ae=async e=>{let t=await Ik(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},St=async(e,t)=>{await q(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as $k,stat as Dk}from"node:fs/promises";import Vn from"node:path";import{realpath as Kd}from"node:fs/promises";import Bs from"node:path";import{execFile as Ck}from"node:child_process";import{promisify as Ak}from"node:util";var Bd=Ak(Ck);async function G(e,t,n={}){try{let r=await Bd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Vd(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 Bd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Vd(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Vd(e){return e instanceof Error}var ha=async e=>{try{let n=(await G("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Kd(n).catch(()=>Bs.resolve(n)),Kd(e).catch(()=>Bs.resolve(e))]);return r===s}catch{return!1}},ga=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"},Gd=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=Bs.resolve(e,n);return Bs.dirname(r)};import{mkdir as Ue,readFile as Ek}from"node:fs/promises";var Ok=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Bn=async e=>{let t=Ce(e);await Ue(t.craigDir,{recursive:!0}),await Promise.all([Ue(t.reposDir,{recursive:!0}),Ue(t.workspacesDir,{recursive:!0}),Ue(t.runtimeDir,{recursive:!0}),Ue(t.tasksDir,{recursive:!0}),Ue(t.jobsDir,{recursive:!0}),Ue(t.commandsDir,{recursive:!0}),Ue(t.eventsDir,{recursive:!0}),Ue(t.orchestrationDir,{recursive:!0}),Ue(t.logsDir,{recursive:!0}),Ue(t.artifactsDir,{recursive:!0}),Ue(t.worktreesDir,{recursive:!0})]);try{let s=await Ek(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!Ok(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await q(t.indexFile,r),r};var Hd=(e,t,n)=>{let r=new Date().toISOString();return{id:Nk(e,Vn.basename(t)),name:Vn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Yd=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Nk=(e,t)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"repo",r=`repo_${n}`,s=2;for(;e.some(i=>i.id===r);)r=`repo_${n}_${s}`,s+=1;return r},_k=(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},zd=async(e,t)=>{let n=await Ae(e);await St(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},xk=async(e,t)=>{let n=await $k(t,{withFileTypes:!0}),r=await Ar(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Vn.join(t,i.name);if(!await ha(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await ga(o);s.push(a?Yd(a,l):Hd([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Fk=async(e,t)=>{let n=await ga(t),r=await Ar(e),s=r.find(u=>u.rootPath===t)??null,i=s?Yd(s,n):Hd(r,t,n),o=`workspace_${i.id}`,l=(await De(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 ma(e,i),l||await yn(e,d),await zd(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},Lk=async(e,t)=>{let n=await xk(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await De(e),s=_k(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=>ma(e,c))),await yn(e,l),await zd(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Er=async(e,t)=>{await Bn(e.workspaceRoot);let n=Vn.resolve(e.workspaceRoot,t);if(!(await Dk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await ha(n)?Fk(e,n):Lk(e,n)};var ya=async(e,t,n={listWorkspaceRecords:De,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 wa=async(e,t,n={readWorkspace:gn,writeWorkspace:yn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var ka=async(e,t)=>{let r={...await gn(e,t),status:"active",archivedAt:null};await yn(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 wn=async(e,t,n={deleteWorkspace:jd,readCraigIndex:Ae,writeCraigIndex:St})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Ta=async(e,t,n)=>{let r=await gn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await wn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as Mk,realpath as Qd,stat as jk}from"node:fs/promises";import Vs from"node:path";async function ba(e){let t=await ep(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Jd(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Jd(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Xd(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Gd(t);if(r){let s=await Xd(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 Jd(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await ep(Vs.resolve(n,e),s),o=await Zd(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 Xd(e){let t=e;for(;;){let n=await Zd(t);if(n)return n;let r=Vs.dirname(t);if(r===t)return null;t=r}}async function Zd(e){let t=Ce(e);try{let n=await Mk(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Wn(r,s,t.indexFile);if(await Qd(i.workspaceRoot).catch(()=>Vs.resolve(i.workspaceRoot))!==e)throw new Error(`Craig index at ${t.indexFile} belongs to ${i.workspaceRoot}, not ${e}. Remove or repair the file before rerunning Craig.`);return i.workspaceRoot}catch(n){if(qk(n))return null;throw n instanceof g?n:new g("WORKSPACE_CONTEXT_INVALID",n instanceof Error?n.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:n})}}async function ep(e,t){let n=Vs.resolve(e);try{if(!(await jk(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Qd(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 qk(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Ra={};Ds(Ra,{addRepo:()=>tp,listRegisteredRepos:()=>np,removeRepo:()=>rp});import Uk from"node:path";import{stat as Wk}from"node:fs/promises";var tp=async(e,t)=>{let n=Uk.resolve(e.workspaceRoot,t);if(!(await Wk(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Er(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var np=async(e,t={listRepos:Ar,ensureCraigState:Bn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var rp=async(e,t,n)=>{let r=await pt(e,t),i=(await De(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=>wn(e,c.id))),await Wd(e,t);let l=await Ae(e);return await St(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var Te={addWorkspace:Er,listWorkspaces:ya,archiveWorkspace:wa,restoreWorkspace:ka,removeWorkspace:Ta,removeWorkspaceRecord:wn,resolveContext:ba,repos:Ra};import{mkdir as sp,readFile as Bk,rm as Gs,stat as Vk,writeFile as Kk}from"node:fs/promises";import Ks from"node:path";var Gk=25,Hk=3e4,Yk=5e3;async function Wt(e,t,n){let r=Ks.join(e.runtimeDir,"task-locks"),s=Ks.join(r,`${t}.lock`);await sp(r,{recursive:!0});let i=Date.now();for(;;)try{await sp(s);try{await Kk(Ks.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Gs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Xk(o))throw o;if(await zk(s))continue;if(Date.now()-i>=Hk)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Qk(Gk)}try{return await n()}finally{await Gs(s,{recursive:!0,force:!0})}}async function zk(e){let t=await Bk(Ks.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Jk(t.pid)?!1:(await Gs(e,{recursive:!0,force:!0}),!0);let n=await Vk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Yk?!1:(await Gs(e,{recursive:!0,force:!0}),!0)}function Jk(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Xk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Qk=e=>new Promise(t=>setTimeout(t,e));var Pt=async(e,t)=>{let n=await Zk(Hs(e,t),"utf8");return JSON.parse(n)},Or=async(e,t)=>{let n=await Pt(e,t);return qe(n,Hs(e,t))},It=async(e,t)=>{let n=ip(t);await q(Hs(e,t.id),n)},K=async(e,t,n)=>Wt(e,t,async()=>{let r=await Or(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=ip(s);return await q(Hs(e,t),i),i}),Sa=async(e,t)=>{let n=await Ae(e);n.taskIds.includes(t)||await St(e,{...n,taskIds:[...n.taskIds,t]})},Hs=(e,t)=>`${e.tasksDir}/${t}.json`,ip=e=>({...e,updatedAt:new Date().toISOString()});var V=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Bt=e=>e.status==="merged"||e.status==="closed",vt=(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(),kn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return zs(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},zs=e=>e.mergeable&&!eT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),eT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Pa=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Ct=(e,t,n)=>{let r=e.isDraft??!1,s=tT(e.state,r);return{provider:"github",owner:n?.owner??t?.owner??null,repo:n?.name??t?.repo??null,number:e.number,url:e.url,title:e.title??t?.title??null,status:s,draft:r,baseBranch:e.baseRefName,headBranch:e.headRefName,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:nT(e.reviewDecision??null),requiredChecks:Ia(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:oT(e.comments),createdAt:e.createdAt??t?.createdAt??null,updatedAt:e.updatedAt??t?.updatedAt??null,mergedAt:e.mergedAt??t?.mergedAt??null,lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}},tT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,nT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ia=e=>{let t=e.map(r=>rT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||sT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},rT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=t.name??t.context,r=t.state??t.status??t.conclusion;return n?{name:n,status:ap(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:iT(t)}:null},sT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Ys(e)&&!Ys(t)?!0:!Ys(e)&&Ys(t)?!1:op(t.status)>=op(e.status),Ys=e=>e.conclusion?.toUpperCase()==="CANCELLED",op=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},iT=e=>{let t=e.completedAt??e.startedAt??e.createdAt??null;if(!t)return null;let n=new Date(t).getTime();return Number.isFinite(n)?n:null},oT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(aT).filter(n=>n!==null).slice(-4):[]},aT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=lT(t.bodyText??t.body??"");return n?{author:typeof t.author=="string"?t.author:t.author?.login??null,body:n,createdAt:t.createdAt??null,url:t.url??null}:null},lT=e=>e.replace(/\s+/g," ").trim(),ap=(e,t)=>{let n=e?.toUpperCase()??null,r=t?.toUpperCase()??null;return r==="SKIPPED"||n==="SKIPPED"?"skipped":n==="SUCCESS"||r==="SUCCESS"||r==="NEUTRAL"?"success":n==="PENDING"||n==="EXPECTED"||n==="IN_PROGRESS"||n==="QUEUED"||n==="REQUESTED"||n==="WAITING"?"pending":n==="FAILURE"||n==="FAILED"||n==="ERROR"||n==="TIMED_OUT"||n==="CANCELLED"||n==="ACTION_REQUIRED"||n==="STARTUP_FAILURE"||r==="FAILURE"||r==="FAILED"||r==="ERROR"||r==="TIMED_OUT"||r==="CANCELLED"||r==="ACTION_REQUIRED"||r==="STARTUP_FAILURE"?"failed":n==="COMPLETED"&&r===null?"unknown":n==="COMPLETED"&&r!==null?ap(r,r):"unknown"};var We=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as cT}from"node:fs/promises";import lp from"node:path";var L=async(e,t,n={readRawTask:Pt,validateTaskRecord:qe})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw mT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):hT(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.`)},Gn=(e,t)=>t.artifacts.logPath?lp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:lp.join(e.workspaceRoot,t.artifacts.logPath):null,$r=async(e,t)=>{let n=await va(t.worktreePath),r=Gn(e,t),s=r?await va(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:uT(t),lastCommitSummary:dT(t),prSummary:pT(t),cleanupSummary:fT(t)}},va=async e=>{try{return await cT(e),!0}catch{return!1}},uT=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}`},dT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",pT=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let 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=V(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})`},fT=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",mT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",hT=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var cp=async(e,t)=>{let n=await z("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.")},Ca=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await z("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 gT(e,s);await G("git",["worktree","add","-b",t,n,o],{cwd:e})},gT=async(e,t)=>(await z("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await z("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await z("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,Js=async e=>{let t=await z("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},up=async e=>{await G("git",["add","-A"],{cwd:e})},dp=async(e,t)=>{await G("git",["commit","-m",t],{cwd:e})},pp=async e=>{let t=await G("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
|
|
12
|
+
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},fp=async e=>{let t=await z("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var mp=async(e,t)=>{await G("git",["worktree","remove","--force",t],{cwd:e})};var Aa=async e=>Hn(e,e.repoRoot),Hn=async(e,t)=>{let n=await Ae(e),r=hp(new Date),s=gp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await cp(t,o))return i;s+=1}},Dr=async e=>{let t=await Ae(e),n=hp(new Date),r=gp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},hp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},gp=(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 Nr=async(e,t,n={readRawTask:Pt,validateTaskRecord:qe})=>{let r=await Ae(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(yT(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}},yT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var yp=["merge_ready","pr_open","checked","review","running","draft"],Ea=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Oa=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(wT)[0]?.id??null,wT=(e,t)=>{let n=wp(e.status),r=wp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},wp=e=>{let t=yp.indexOf(e);return t>=0?t:yp.length};import kp from"node:path";var Tn=(e,t)=>t?kp.isAbsolute(t)?t:kp.join(e.repoRoot,t):null;import{randomUUID as kT}from"node:crypto";import{mkdir as _r,rm as TT,writeFile as Xs}from"node:fs/promises";import H from"node:path";var bp=["AGENTS","md"].join("."),Yn=async(e,t,n,r={})=>{let s=await pt(e,t),[i,o]=await Promise.all([IT(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Hn(e,s.rootPath)]),a=`craig/${o}`,l=H.join(e.worktreesDir,s.id,o),c=H.join(e.logsDir,`${o}.log`),d=H.join(e.artifactsDir,o);await Promise.all([_r(H.dirname(l),{recursive:!0}),_r(d,{recursive:!0}),Xs(c,"","utf8")]);let u=bT(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 It(e,u),await Sa(e,o),await Ca(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},xr=async(e,t,n,r={})=>{let s=(await De(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 Yn(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 Dr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=H.join(e.craigDir,"task-bundles",o),u=H.join(e.logsDir,`${o}.log`),p=H.join(e.artifactsDir,o);await _r(d,{recursive:!0}),await _r(p,{recursive:!0}),await Xs(u,"","utf8");let m=await Promise.all(i.map(b=>pt(e,b))),h=ST(m),f=await Promise.all(m.map(b=>RT(e,b,o,c,H.join(d,h.get(b.id))))),y=f.find(b=>b.status==="ready")??f[0];if(!f.some(b=>b.status==="ready"))throw await TT(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${f.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Xs(H.join(d,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:n,repos:f.map(b=>({repoId:b.repoId,repoName:m.find(O=>O.id===b.repoId)?.name??b.repoId,path:H.relative(d,b.worktreePath),status:b.status,worktreePath:b.worktreePath,failureReason:b.failureReason}))},null,2),"utf8"),await Xs(H.join(d,bp),PT({taskId:o,workspaceId:t,prompt:n,repos:m,repoTargets:f,bundlePath:d}),"utf8");let T=Fr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Sp(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),...Rp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:f,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,u),checkSummaryPath:H.relative(e.workspaceRoot,H.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(p,"pr-status.json"))},cleanup:Qs(),lastFailureReason:f.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await It(e,R),await Sa(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:f}},Fr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${kT()}`}:{},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}]},bT=(e,t)=>{let n=new Date().toISOString(),r=Fr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Sp(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Rp(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:{...$a(H.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,H.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:Qs(),lastFailureReason:null,createdAt:n,updatedAt:n}},RT=async(e,t,n,r,s)=>{await _r(H.dirname(s),{recursive:!0});try{return await Ca(t.rootPath,r,s,t.defaultBranch),{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:$a(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Tp(),cleanup:Qs()}}catch(i){return{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:i instanceof Error?i.message:"Failed to create worktree.",checks:$a(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Tp(),cleanup:Qs()}}},ST=e=>{let t=new Set(["manifest.json",bp]),n=new Map;for(let r of e){let s=t.has(r.name)?`${r.name}-repo`:r.name,i=s,o=2;for(;t.has(i);)i=`${s}-${o}`,o+=1;t.add(i),n.set(r.id,i)}return n},PT=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=H.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
|
+
`)},$a=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Tp=()=>({provider:"github",number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}),Qs=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Rp=(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}),IT=async(e,t,n,r=!1)=>{let s=await De(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},Sp=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Da=async(e,t,n)=>{await K(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},Lr=async(e,t,n)=>K(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Mr=async(e,t)=>K(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 Na=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let l=(r.workspaceId?await xr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Yn(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 L(e,l.id):await Mr(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 Lr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as OT}from"node:fs/promises";import $T from"node:path";var At=async e=>{let t=await z("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Pp=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await G("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},zn=async(e,t)=>{let n=await G("gh",_a(e),{cwd:t});return JSON.parse(n.stdout)},Jn=async(e,t)=>{let n=await z("gh",_a(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Cp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Ip=async(e,t)=>{let n=await z("gh",_a(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Cp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},vp=async(e,t,n)=>{if(n.length===0)return[];let r=AT(n),s;try{s=await G("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw vT(a)?new We(a instanceof Error?a.message:String(a)):a}let o=JSON.parse(s.stdout).data?.repository??{};return n.map((a,l)=>{let c=o[`item${l}`],d=ET(c);return{id:a.id,found:d!==null,view:d}})},Zs=async e=>{let t=await z("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:CT(t.stdout.trim())},Vt=e=>{let t=e.trim().match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/([1-9]\d*)(?:[/?#].*)?$/);return!t?.[1]||!t[2]||!t[3]?null:{owner:t[1],name:t[2],number:Number(t[3])}},vT=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")},Cp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},_a=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],CT=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},AT=e=>`
|
|
15
15
|
query CraigPullRequestBatch($owner: String!, $name: String!) {
|
|
16
16
|
repository(owner: $owner, name: $name) {
|
|
17
17
|
${e.map((n,r)=>{let s=`item${r}`;return n.mode==="number"?`${s}: pullRequest(number: ${Number(n.selector)}) { ...PrFields }`:`${s}: pullRequests(headRefName: ${JSON.stringify(n.selector)}, states: OPEN, first: 1, orderBy: { field: UPDATED_AT, direction: DESC }) { nodes { ...PrFields } }`}).join(`
|
|
@@ -65,85 +65,85 @@ fragment PrFields on PullRequest {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
`,
|
|
68
|
+
`,ET=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 bn=async(e,t)=>{let n=Tn(e,t.artifacts.prStatusPath);n&&(await OT($T.dirname(n),{recursive:!0}),await q(n,{taskId:t.id,prs:t.prs}))},jr=async(e,t,n={writeTask:It,writePrStatusArtifact:bn})=>{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},qr=async(e,t,n,r,s={readRawTask:Pt,validateTaskRecord:qe,writeTask:It,writePrStatusArtifact:bn,withTaskLock:Wt})=>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=Ct(n,a),c=vt(o,l),d=o.status==="closed"?o.status:kn(c.prs),u={...c,status:d};return jr(e,u,s)}),Ur=async(e,t)=>{let n=V(t),r=n?.number?String(n.number):t.branch,s=await zn(r,t.worktreePath);return qr(e,t,s,n)},Wr=async(e,t)=>{for(let n of await xa(t)){let r=await Jn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await qr(e,t,r,null)}}return{discovered:!1,task:t}},xa=async e=>{let t=await fp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Br(e,t,n,r){return Wt(e,t,async()=>{let s=await L(e,t);if(!s.repoTargets?.find(m=>m.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Vt(r.url),a=s.prs.find(m=>o?Kn(m,{owner:o.owner,repo:o.name,number:r.number}):m.number===r.number)??null,l=Ct(r,a,o??void 0),c=DT(r),d=vt(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(m=>m.repoId===n?{...m,pullRequest:c}:m)},p={...u,status:u.status==="closed"?u.status:Fa(u)};return jr(e,p)})}function DT(e){let t=Vt(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:NT(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:_T(e.reviewDecision??null),requiredChecks:Ia(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function Fa(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 NT=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,_T=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var Xn=async(e,t,n)=>{let r=n.pullRequest.number?String(n.pullRequest.number):n.branch;if(n.pullRequest.number){let i=await zn(r,n.worktreePath);return await Br(e,t.id,n.repoId,i),"synced"}let s=await Jn(r,n.worktreePath);return s?(await Br(e,t.id,n.repoId,s),"discovered"):"not_found"};var Vr=async(e,t)=>{let n=await L(e,t),r=V(n);return r?.number?(await At(n.worktreePath),Bt(r)?(await Wr(e,n)).task:Ur(e,n)):n},Ma=async(e,t)=>{let n=await L(e,t);if(n.type==="project"&&n.repoTargets?.length)return await Qn(e,t),L(e,t);let r=V(n);if(await he(n),await At(n.worktreePath),!r?.number||Bt(r)){let i=await Wr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Ur(e,n)},Qn=async(e,t)=>{let n=await L(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await At(i.worktreePath);let o=i.pullRequest.number?await Xn(e,n,i):await Xn(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},ja=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=La(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p={id:`${i.id}:${u.repoId}`,task:i,targetRepoId:u.repoId,worktreePath:u.worktreePath,selector:u.pullRequest.number?String(u.pullRequest.number):u.branch,mode:u.pullRequest.number?"number":"head",fallbackSelectors:[]};await Ap(r,p).catch(async()=>{try{await At(u.worktreePath);let m=u.pullRequest.number?await Xn(e,i,u):await Xn(e,i,u);ei(o,m,u.pullRequest.number??null,u.pullRequest.url??null)}catch(m){if(m instanceof We)throw m;s.push(m)}})}continue}let a=V(i),l=a?.number&&!Bt(a),c=l?[]:await xa(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 Ap(r,d).catch(async()=>{try{let{disposition:u,task:p}=await ti(e,i.id),m=V(p);ei(o,u,m?.number??null,m?.url??null)}catch(u){if(u instanceof We)throw u;s.push(u)}})}for(let i of r.values())try{await At(i.worktreePath);let o=await vp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=La(n,l.task),u=a.get(l.id)?.view??await xT(i.worktreePath,l);if(!u){ei(c,"not_found",null,null);continue}if(l.targetRepoId)await Br(e,l.task.id,l.targetRepoId,u);else{let p=await Pt(e,l.task.id),m=qe(p,`${e.tasksDir}/${l.task.id}.json`);await qr(e,m,u,l.mode==="number"?V(m):null)}ei(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof We)throw o;s.push(o)}return FT(s),t.map(i=>La(n,i))},ti=async(e,t)=>{let n=await L(e,t);await he(n),await At(n.worktreePath);let r=V(n);if(r?.number&&!Bt(r))return{disposition:"synced",task:await Ur(e,n)};let s=await Wr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},xT=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Jn(n,e);if(r)return r}return null},Ap=async(e,t)=>{let n=await Zs(t.worktreePath);if(!n)throw new Error("GitHub repository remote could not be parsed.");let r=`${n.owner}/${n.name}`,s=e.get(r);if(s){s.items.push(t);return}e.set(r,{worktreePath:t.worktreePath,repository:n,items:[t]})},La=(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):!!V(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},ei=(e,t,n,r)=>{if(t==="synced"){e.synced+=1;return}if(t==="discovered"){e.discovered+=1,e.firstDiscoveredPrNumber??=n,e.firstDiscoveredPrUrl??=r;return}e.notFound+=1},FT=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var qa=async(e,t)=>{let n=await L(e,t);try{n.type==="project"&&n.repoTargets?.length?(await Qn(e,t),n=await L(e,t)):n.prs.some(s=>s.number)&&(n=await Vr(e,t))}catch{}let r=await $r(e,n);return{kind:"showTask",task:n,inspection:r}};var Ua=async(e,t)=>{let n=await L(e,t);if(await he(n),(await G("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await LT(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},LT=async e=>{let t=[],n=await G("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await MT(e);for(let s of r){let i=await z("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 DT}from"node:child_process";import{access as NT}from"node:fs/promises";var Ua=async(e,t)=>{let n=await F(e,t),r=Kn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await NT(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},Wa=async e=>{await new Promise((t,n)=>{let r=!1,s=DT("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 _T}from"node:fs/promises";import xT from"node:path";var Ba=async(e,t)=>{let n=await F(e,t);if(await me(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await Xs(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await V(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await 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}`,m=await V(e,n.id,h=>({...h,status:"review",checks:{...h.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Ip(e,m),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await V(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await Ip(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Ip=async(e,t)=>{let n=kn(e,t.artifacts.checkSummaryPath);n&&(await _T(xT.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 Va=async(e,t)=>{let n=await F(e,t);await me(n);let r=await Xs(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.prompt.value.trim();await op(n.worktreePath),await ap(n.worktreePath,s);let i=await lp(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 LT}from"node:fs/promises";var Ka=async(e,t)=>{let n=await F(e,t),r=await FT(n.worktreePath);return V(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},FT=async e=>{try{return await LT(e),!0}catch{return!1}};var Ga=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await up(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 Ha=async(e,t,n)=>{let r=await dt(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}},Ya=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>dt(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{spawn as MT}from"node:child_process";var za=async(e,t)=>{let n=await F(e,t);await me(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await jT(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},jT=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=MT(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 Cp}from"node:fs/promises";import Br from"node:path";async function Xa(e,t){if(t.explicitTaskId!==void 0){let l=await vp(e,t.explicitTaskId,"explicit");return Ja(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await vp(e,t.environmentTaskId,"environment");return Ja(l,"environment",t.environmentAgentTabId)}let n=await Cp(t.cwd).catch(()=>Br.resolve(t.cwd)),r=await $r(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await UT(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 Ja(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 vp(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 Ja(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 qT(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function UT(e,t){return(await Promise.all(qT(e).map(r=>Cp(r).catch(()=>Br.resolve(r))))).some(r=>WT(r,t))}function WT(e,t){let n=Br.relative(Br.resolve(e),t);return n===""||!n.startsWith("..")&&!Br.isAbsolute(n)}var Qa=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??W(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Tp(s.worktreePath,i,n)};var Vr={readTask:F,writeTask:Pt,withTaskLock:Ut,ensureGhAuthenticated:Ct,fetchPrView:Yn,discoverPrView:bp,getGitHubRepositoryLocator:ei,writePrStatusArtifact:Tn};async function el(e,t,n,r=Vr){let s=await r.readTask(e,t),i=await VT(s,n,r);return Vt(s,i,"showTaskPr","shown",[])}async function tl(e,t,n,r=Vr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await ol(s,n,null,r);await al(i,r);let o=await si(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Vt(s,i,"discoverTaskPr","not_found",[]);ll(o,i);let a=ii(s,i,o.number),l=await cl(e,s,i,o,r);return Vt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function nl(e,t,n,r,s=Vr){let i=il(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await ol(o,r,i.repository,s);Ep(i.repository,a),await al(a,s);let l=await si(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));KT(l,i),ll(l,a);let c=ii(o,a,l.number),d=ul(o,a),u=d&&!Vn(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 cl(e,o,a,l,s);return Vt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function BT(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Qn(e,t);let o=e.prs.find(a=>a.number===n.number)??W(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ri(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw Qn(e,t);let a=Ap(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&pt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ri(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&&pt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&pt({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 rl(e,t,n,r=Vr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await ol(s,n,null,r),o=ul(s,i);if(!o?.number)return Vt(s,i,"refreshTaskPr","not_found",[]);await al(i,r);let a=await si(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));ll(a,i);let l=await cl(e,s,i,a,r);return Vt(l,i,"refreshTaskPr","synced",[])})}async function sl(e,t,n,r,s=Vr){let i=il(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await BT(o,r,i,s);if(Ep(i.repository,a),!ii(o,a,i.number))return Vt(o,a,"unlinkTaskPr","unchanged",[]);let c=GT(o,a,i.number),d=await $p(e,c,s);return Vt(d,a,"unlinkTaskPr","unlinked",[])})}function il(e){let t=e.trim(),n=Bt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new g("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function ol(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Qn(e,t);return Za(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 Qn(e,t);return Za(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 Za(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&&pt(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 VT(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Qn(e,t);let s=W(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ri(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 Qn(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ri(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ri(e,t,n,r){let s=Ap(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Ap(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Bt(e.url):null}async function Za(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 al(e,t){await si("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function si(e,t){try{return await t()}catch(n){throw n instanceof g?n:new g("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function Ep(e,t){if(e&&!pt(e,t.repository))throw Op(e,t)}function KT(e,t){let n=Bt(e.url);if(!n||n.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!pt(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 ll(e,t){let n=Bt(e.url);if(!n||!pt(n,t.repository))throw Op(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 Op(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 Qn(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 pt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function cl(e,t,n,r,s){let i=ii(t,n,r.number),o=vt(r,i,n.repository),a=It(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:_p(o)}:l)}),$p(e,a,s)}function GT(e,t,n){let r=e.prs.filter(i=>!Np(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Dp(r.filter(o=>o.owner&&o.repo&&pt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?_p(i):YT(t.repository)}:o)}}return s}async function $p(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?xa(t):wn(t.prs),s={...t,status:r};return Fr(e,s,n)}function ii(e,t,n){return dl(e,t).find(r=>Np(r,t,n))??null}function ul(e,t){if(!t.projectTarget)return W(e);let n=dl(e,t);return Dp(n)}function Dp(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&&pt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?HT(r.pullRequest,t.repository):null;return s&&!n.some(i=>Vn(i,s))?[...n,s]:n}function Np(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||pt({owner:e.owner,name:e.repo},t.repository)}function Vt(e,t,n,r,s){let i=dl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:ul(e,t),warnings:s}}function _p(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 HT(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 YT(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:$r,getTask:F,provisionTask:Hn,provisionProjectTask:Nr,createTask:Da,showTask:ja,showTaskDiff:qa,prepareTaskLogs:Ua,streamTaskLogs:Wa,runChecks:Ba,commitTask:Va,closeTask:Ka,cleanupTask:Ga,addTaskLink:Ha,listTaskLinks:Ya,sortTasksForDisplay:Aa,resolveSelectedTaskId:Ea,allocateTaskId:Ca,allocateTaskIdForRepo:Gn,allocateProjectTaskId:Or,createDefaultTaskPtyTabs:_r,assertTaskWorktreeExists:me,resolveTaskLogPath:Kn,buildTaskInspection:Er,resolveArtifactPath:kn,openTask:za,markRunnerFailed:$a,recordStartupFailure:xr,markTaskStarted:Lr,resolveContext:Xa,prs:{refresh:Wr,refreshChecks:Fa,discoverOrRefresh:ni,discoverOrRefreshAll:Xn,discoverOrRefreshMany:Ma,show:el,discover:tl,link:nl,refreshAssociation:rl,unlink:sl,merge:Qa,getPrimaryPr:W,isPrTerminal:Wt,isMergeReady:Js,deriveTaskStatus:wn,upsertPr:It,normalizePr:vt,summarizeRequiredChecks:Sa,writePrStatusArtifact:Tn}};var xp={idle:0,ready:1,working:2,error:3};function At(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Kt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return At(t,n,r,i)}function Zn(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Kt(e,s.id,t,n);xp[i]>xp[r]&&(r=i)}return r}function oi(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&At(s.id,t,n)==="working"))}function ft(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=Kt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:Zn(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function pl(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=ft([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw Lp(e.id);let u=a-r();if(u<=0)throw zT(e.id,n.states,n.timeoutMs);let p=s;await new Promise((m,h)=>{let f=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),m()},y=()=>{clearTimeout(T),h(Lp(e.id))},T=setTimeout(f,u);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var zT=(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}}),Lp=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as ZT}from"node:net";import{createHash as JT}from"node:crypto";import{tmpdir as XT}from"node:os";import Fp from"node:path";var Kr=9,QT=new Set([6,7,8,Kr]);function Gt(e){return e!==void 0&&QT.has(e)}function Je(e){let t=JT("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Fp.join(XT(),`craig-${t}.sock`),pidPath:Fp.join(e.runtimeDir,"pty-daemon.pid")}}async function Mp(e){let t=null;try{let n=await eb(Je(e.paths).socketPath);return t=new ml(n,e),await t.ready(),t}catch{return t?.close(),null}}var ml=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Kr)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
|
+
`)},MT=async e=>(await G("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
|
|
71
|
+
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as jT}from"node:child_process";import{access as qT}from"node:fs/promises";var Wa=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 qT(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},Ba=async e=>{await new Promise((t,n)=>{let r=!1,s=jT("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 UT}from"node:fs/promises";import WT from"node:path";var Va=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 Js(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await K(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}`,m=await K(e,n.id,h=>({...h,status:"review",checks:{...h.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Ep(e,m),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await K(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 Ep(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Ep=async(e,t)=>{let n=Tn(e,t.artifacts.checkSummaryPath);n&&(await UT(WT.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 Ka=async(e,t)=>{let n=await L(e,t);await he(n);let r=await Js(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.prompt.value.trim();await up(n.worktreePath),await dp(n.worktreePath,s);let i=await pp(n.worktreePath),o=new Date().toISOString(),a=await K(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 BT}from"node:fs/promises";var Ga=async(e,t)=>{let n=await L(e,t),r=await VT(n.worktreePath);return K(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},VT=async e=>{try{return await BT(e),!0}catch{return!1}};var Ha=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await mp(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await K(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Ya=async(e,t,n)=>{let r=await pt(e,n),s=await K(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},za=async(e,t)=>{let n=await L(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>pt(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{spawn as KT}from"node:child_process";var Ja=async(e,t)=>{let n=await L(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 GT(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},GT=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=KT(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 $p}from"node:fs/promises";import Kr from"node:path";async function Qa(e,t){if(t.explicitTaskId!==void 0){let l=await Op(e,t.explicitTaskId,"explicit");return Xa(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Op(e,t.environmentTaskId,"environment");return Xa(l,"environment",t.environmentAgentTabId)}let n=await $p(t.cwd).catch(()=>Kr.resolve(t.cwd)),r=await Nr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await YT(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 Xa(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 Op(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 Xa(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 HT(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function YT(e,t){return(await Promise.all(HT(e).map(r=>$p(r).catch(()=>Kr.resolve(r))))).some(r=>zT(r,t))}function zT(e,t){let n=Kr.relative(Kr.resolve(e),t);return n===""||!n.startsWith("..")&&!Kr.isAbsolute(n)}var Za=async(e,t,n="merge",r)=>{let s=await L(e,t),i=r??V(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Pp(s.worktreePath,i,n)};var Gr={readTask:L,writeTask:It,withTaskLock:Wt,ensureGhAuthenticated:At,fetchPrView:zn,discoverPrView:Ip,getGitHubRepositoryLocator:Zs,writePrStatusArtifact:bn};async function tl(e,t,n,r=Gr){let s=await r.readTask(e,t),i=await XT(s,n,r);return Kt(s,i,"showTaskPr","shown",[])}async function nl(e,t,n,r=Gr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await al(s,n,null,r);await ll(i,r);let o=await ri(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Kt(s,i,"discoverTaskPr","not_found",[]);cl(o,i);let a=si(s,i,o.number),l=await ul(e,s,i,o,r);return Kt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function rl(e,t,n,r,s=Gr){let i=ol(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await al(o,r,i.repository,s);Np(i.repository,a),await ll(a,s);let l=await ri(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));QT(l,i),cl(l,a);let c=si(o,a,l.number),d=dl(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 ul(e,o,a,l,s);return Kt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function JT(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Zn(e,t);let o=e.prs.find(a=>a.number===n.number)??V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ni(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw Zn(e,t);let a=Dp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&ft({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ni(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&ft({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&ft({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 sl(e,t,n,r=Gr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await al(s,n,null,r),o=dl(s,i);if(!o?.number)return Kt(s,i,"refreshTaskPr","not_found",[]);await ll(i,r);let a=await ri(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));cl(a,i);let l=await ul(e,s,i,a,r);return Kt(l,i,"refreshTaskPr","synced",[])})}async function il(e,t,n,r,s=Gr){let i=ol(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await JT(o,r,i,s);if(Np(i.repository,a),!si(o,a,i.number))return Kt(o,a,"unlinkTaskPr","unchanged",[]);let c=ZT(o,a,i.number),d=await xp(e,c,s);return Kt(d,a,"unlinkTaskPr","unlinked",[])})}function ol(e){let t=e.trim(),n=Vt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new 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 Zn(e,t);return el(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw Zn(e,t);return el(o.repoId,o.branch,o.worktreePath,o,r)}if(!n)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:s.map(o=>o.repoId)}});let i=[];for(let o of s){let a=await el(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&ft(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 XT(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Zn(e,t);let s=V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ni(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw Zn(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ni(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ni(e,t,n,r){let s=Dp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Dp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Vt(e.url):null}async function el(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new g("EXTERNAL_DEPENDENCY_FAILED",`Repo ${e} does not have a supported GitHub origin remote.`,{details:{repoId:e,worktreePath:n}});return{repoId:e,branch:t,worktreePath:n,repository:i,projectTarget:r}}async function ll(e,t){await ri("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function ri(e,t){try{return await t()}catch(n){throw n instanceof g?n:new g("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function Np(e,t){if(e&&!ft(e,t.repository))throw _p(e,t)}function QT(e,t){let n=Vt(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&&!ft(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 cl(e,t){let n=Vt(e.url);if(!n||!ft(n,t.repository))throw _p(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 _p(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 Zn(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 ft(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function ul(e,t,n,r,s){let i=si(t,n,r.number),o=Ct(r,i,n.repository),a=vt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:Mp(o)}:l)}),xp(e,a,s)}function ZT(e,t,n){let r=e.prs.filter(i=>!Lp(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Fp(r.filter(o=>o.owner&&o.repo&&ft({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?Mp(i):tb(t.repository)}:o)}}return s}async function xp(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?Fa(t):kn(t.prs),s={...t,status:r};return jr(e,s,n)}function si(e,t,n){return pl(e,t).find(r=>Lp(r,t,n))??null}function dl(e,t){if(!t.projectTarget)return V(e);let n=pl(e,t);return Fp(n)}function Fp(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function pl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&ft({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?eb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Kn(i,s))?[...n,s]:n}function Lp(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||ft({owner:e.owner,name:e.repo},t.repository)}function Kt(e,t,n,r,s){let i=pl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:dl(e,t),warnings:s}}function Mp(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 eb(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 tb(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:Nr,getTask:L,provisionTask:Yn,provisionProjectTask:xr,createTask:Na,showTask:qa,showTaskDiff:Ua,prepareTaskLogs:Wa,streamTaskLogs:Ba,runChecks:Va,commitTask:Ka,closeTask:Ga,cleanupTask:Ha,addTaskLink:Ya,listTaskLinks:za,sortTasksForDisplay:Ea,resolveSelectedTaskId:Oa,allocateTaskId:Aa,allocateTaskIdForRepo:Hn,allocateProjectTaskId:Dr,createDefaultTaskPtyTabs:Fr,assertTaskWorktreeExists:he,resolveTaskLogPath:Gn,buildTaskInspection:$r,resolveArtifactPath:Tn,openTask:Ja,markRunnerFailed:Da,recordStartupFailure:Lr,markTaskStarted:Mr,resolveContext:Qa,prs:{refresh:Vr,refreshChecks:Ma,discoverOrRefresh:ti,discoverOrRefreshAll:Qn,discoverOrRefreshMany:ja,show:tl,discover:nl,link:rl,refreshAssociation:sl,unlink:il,merge:Za,getPrimaryPr:V,isPrTerminal:Bt,isMergeReady:zs,deriveTaskStatus:kn,upsertPr:vt,normalizePr:Ct,summarizeRequiredChecks:Pa,writePrStatusArtifact:bn}};var jp={idle:0,ready:1,working:2,error:3};function Et(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Gt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Et(t,n,r,i)}function er(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Gt(e,s.id,t,n);jp[i]>jp[r]&&(r=i)}return r}function ii(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Et(s.id,t,n)==="working"))}function mt(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=Gt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:er(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function fl(e,t,n){let r=n.now??Date.now;if(n.tabId&&!e.ptyTabs.some(l=>l.kind==="agent"&&l.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:n.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=r()+n.timeoutMs;try{for(;;){let l=r(),c=mt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw qp(e.id);let u=a-r();if(u<=0)throw nb(e.id,n.states,n.timeoutMs);let p=s;await new Promise((m,h)=>{let f=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),m()},y=()=>{clearTimeout(T),h(qp(e.id))},T=setTimeout(f,u);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var nb=(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}}),qp=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as ob}from"node:net";import{createHash as rb}from"node:crypto";import{tmpdir as sb}from"node:os";import Up from"node:path";var Rn=10,ib=new Set([6,7,8,9,Rn]);function Ht(e){return e!==void 0&&ib.has(e)}function Ne(e){let t=rb("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Up.join(sb(),`craig-${t}.sock`),pidPath:Up.join(e.runtimeDir,"pty-daemon.pid")}}async function Wp(e){let t=null;try{let n=await ab(Ne(e.paths).socketPath);return t=new hl(n,e),await t.ready(),t}catch{return t?.close(),null}}var hl=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Rn)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 eb(e){return new Promise((t,n)=>{let r=ZT(e);r.once("connect",()=>t(r)),r.once("error",n)})}var gl={openObserver:qp,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function tb(e,t,n=gl){let r=await jp(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...ft(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function nb(e,t,n=gl){let r=await jp(e,t.taskId,n),s=await n.openObserver(e);try{let i=ft(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 rb(e,t,n,r=gl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await pl(s,i,{...n,now:r.now})}finally{i.close()}}async function jp(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function qp(e){return hl.open(e)}async function sb(e){return qp(e)}var hl=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 Mp({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()}},Et={listAgents:tb,showAgentStatus:nb,waitForTask:rb,openObserver:sb};import{randomUUID as Ib}from"node:crypto";import{mkdir as cf,open as Cl,readdir as Al,readFile as Jr,rm as vb,stat as Cb}from"node:fs/promises";import di from"node:path";import{createHash as cb}from"node:crypto";import{mkdir as Gr,readdir as kl,readFile as Hr,writeFile as ub}from"node:fs/promises";import We from"node:path";import{mkdir as Up,readFile as ib,rm as yl,stat as ob,writeFile as ab}from"node:fs/promises";import wl from"node:path";async function er(e,t){let n=wl.join(e.runtimeDir,"fury-store.lock");await Up(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Up(n);try{await ab(wl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await yl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Wp(s,"EEXIST"))throw s;let i=await ib(wl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await ob(n).catch(()=>null);if(typeof i?.pid=="number"&&!lb(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await yl(n,{recursive:!0,force:!0});continue}if(Date.now()-r>3e4)throw new g("OPERATION_TIMEOUT","Timed out waiting for the fury store lock.",{retryable:!0});await new Promise(a=>setTimeout(a,20))}try{return await t()}finally{await yl(n,{recursive:!0,force:!0})}}function lb(e){try{return process.kill(e,0),!0}catch(t){return Wp(t,"EPERM")}}var Wp=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var he=e=>({root:We.join(e.craigDir,"fury"),definitions:We.join(e.craigDir,"fury","definitions"),plans:We.join(e.craigDir,"fury","plans"),approvals:We.join(e.craigDir,"fury","approvals"),runs:We.join(e.craigDir,"fury","runs"),reviews:We.join(e.craigDir,"fury","reviews")});function Tl(e){return cb("sha256").update(JSON.stringify(e)).digest("hex")}async function Vp(e,t,n){let r=he(e);await Gr(r.definitions,{recursive:!0});let s=We.join(r.definitions,`${t}.yaml`);await ub(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Ht(i,"EEXIST"))throw i})}async function Kp(e,t){return er(e,async()=>{let n=await Gp(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 Gr(he(e).plans,{recursive:!0}),await q(nf(e,i.id),i),i})}async function ai(e,t){ci(t,"plan");try{return db(JSON.parse(await Hr(nf(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Gp(e){let t=he(e).plans,n=await kl(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>ai(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Hp(e){let t=await Gp(e),n=await Promise.all(t.map(s=>Sl(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 Yp(e,t){return er(e,async()=>{let n=await Sl(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 Gr(he(e).approvals,{recursive:!0}),await q(rf(e,t.planId),t),{approval:t,created:!0}})}async function zp(e,t){ci(t,"plan");let n=await Sl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Jp(e,t){return er(e,async()=>{let r=(await Qp(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 Gr(he(e).runs,{recursive:!0}),await q(bl(e,t.id),t),{run:t,created:!0}})}async function de(e,t){ci(t,"run");try{return ef(JSON.parse(await Hr(bl(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Xp(e){return Qp(e)}async function Qp(e){let t=he(e).runs,n=await kl(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return ef(JSON.parse(await Hr(We.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ve(e,t,n){return er(e,async()=>{let r=await de(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await q(bl(e,t),s),s})}async function Zp(e,t){await Gr(he(e).reviews,{recursive:!0}),await q(Rl(e,t.id),t)}async function Yr(e,t,n){return er(e,async()=>{let r=await tr(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await q(Rl(e,t),s),s})}async function tr(e,t){ci(t,"review");try{return pb(JSON.parse(await Hr(Rl(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function li(e){let t=he(e).reviews,n=await kl(t).catch(r=>Ht(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>tr(e,r.slice(0,-5))))}function ef(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planId!="string"||!/^fury_plan_[A-Za-z0-9_-]+$/.test(e.planId)||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!n.includes(String(e.state))||!Ae(e.inputs)||!tf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!fb(e.stepRuns,e.order)||!zr(e.actor)||!Be(e.createdAt)||!Be(e.updatedAt)||!Be(e.stateChangedAt)||!Be(e.deadlineAt)||e.completedAt!==null&&!Be(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function db(e,t){if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!Ae(e.inputs)||!tf(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)||!Be(e.createdAt))throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} is invalid.`,{});let n={...e};if(delete n.id,delete n.planHash,delete n.createdBy,delete n.createdAt,Tl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function pb(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!Ae(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Be(e.requestedAt)||!Be(e.deadlineAt)||!Be(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!Bp(r))||e.lastDecision!==null&&!Bp(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function fb(e,t){return Ae(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&mb(e[n],n))}function mb(e,t){return!Ae(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!Ae(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Be(n))&&(e.completedBy===null||zr(e.completedBy))}function Bp(e){return Ae(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&zr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Be(e.occurredAt)}function tf(e){return Ae(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function zr(e){return Ae(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}var bl=(e,t)=>We.join(he(e).runs,`${t}.json`),nf=(e,t)=>We.join(he(e).plans,`${t}.json`),rf=(e,t)=>We.join(he(e).approvals,`${t}.json`),Rl=(e,t)=>We.join(he(e).reviews,`${t}.json`),ci=(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 Sl(e,t){try{let n=JSON.parse(await Hr(rf(e,t),"utf8"));if(!Ae(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!zr(n.approvedBy)||!Ae(n.approvedBy)||n.approvedBy.type!=="human"||!Be(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Ht(n,"ENOENT"))return null;throw n}}var Ae=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Be=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Ht=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as sf,readFile as hb,rm as ui,stat as gb,writeFile as yb}from"node:fs/promises";import Pl from"node:path";var wb=20,kb=3e4,Tb=5e3;async function of(e,t){let n=Pl.join(e.runtimeDir,"event-journal.lock");await sf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await sf(n);try{await yb(Pl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ui(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Sb(s))throw s;if(await bb(n))continue;if(Date.now()-r>=kb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await Pb(wb)}try{return await t()}finally{await ui(n,{recursive:!0,force:!0})}}async function bb(e){let t=await hb(Pl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Rb(t.pid)?!1:(await ui(e,{recursive:!0,force:!0}),!0);let n=await gb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Tb?!1:(await ui(e,{recursive:!0,force:!0}),!0)}function Rb(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 Sb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Pb=e=>new Promise(t=>setTimeout(t,e));var Ab=256*1024,Eb=16,Ob=64*1024;async function De(e,t,n={}){let r=vl(n.maxSegmentBytes??Ab,"Event journal segment size"),s=vl(n.maxSegments??Eb,"Event journal retention"),i=vl(n.maxRecordBytes??Ob,"Event record size");return of(e,async()=>{await cf(e.eventsDir,{recursive:!0}),await Lb(e);let o=await El(e),a=t.id??Ib(),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:jb(t.data)},u=`${JSON.stringify(d)}
|
|
75
|
-
`;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let m=(await
|
|
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 ab(e){return new Promise((t,n)=>{let r=ob(e);r.once("connect",()=>t(r)),r.once("error",n)})}var yl={openObserver:Vp,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function lb(e,t,n=yl){let r=await Bp(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...mt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function cb(e,t,n=yl){let r=await Bp(e,t.taskId,n),s=await n.openObserver(e);try{let i=mt(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 ub(e,t,n,r=yl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await fl(s,i,{...n,now:r.now})}finally{i.close()}}async function Bp(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Vp(e){return gl.open(e)}async function db(e){return Vp(e)}var gl=class e{listeners=new Set;snapshots=new Map;client=null;reconnectTimer=null;reconnectDelayMs=250;closed=!1;paths;constructor(t){this.paths=t}static async open(t){let n=new e(t);return await n.connect(),n}get daemonAvailable(){return this.client!==null}getSnapshots(){return[...this.snapshots.values()]}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}close(){this.closed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.client?.close(),this.client=null}async connect(){if(this.closed)return;let t=await Wp({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()}},Ot={listAgents:lb,showAgentStatus:cb,waitForTask:ub,openObserver:db};import{randomUUID as Db}from"node:crypto";import{mkdir as ff,open as Al,readdir as El,readFile as Xr,rm as Nb,stat as _b}from"node:fs/promises";import ui from"node:path";import{createHash as gb}from"node:crypto";import{mkdir as Hr,readdir as Tl,readFile as Yr,writeFile as yb}from"node:fs/promises";import Be from"node:path";import{mkdir as Kp,readFile as pb,rm as wl,stat as fb,writeFile as mb}from"node:fs/promises";import kl from"node:path";async function tr(e,t){let n=kl.join(e.runtimeDir,"fury-store.lock");await Kp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Kp(n);try{await mb(kl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await wl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Gp(s,"EEXIST"))throw s;let i=await pb(kl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await fb(n).catch(()=>null);if(typeof i?.pid=="number"&&!hb(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await wl(n,{recursive:!0,force:!0});continue}if(Date.now()-r>3e4)throw new g("OPERATION_TIMEOUT","Timed out waiting for the fury store lock.",{retryable:!0});await new Promise(a=>setTimeout(a,20))}try{return await t()}finally{await wl(n,{recursive:!0,force:!0})}}function hb(e){try{return process.kill(e,0),!0}catch(t){return Gp(t,"EPERM")}}var Gp=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ge=e=>({root:Be.join(e.craigDir,"fury"),definitions:Be.join(e.craigDir,"fury","definitions"),plans:Be.join(e.craigDir,"fury","plans"),approvals:Be.join(e.craigDir,"fury","approvals"),runs:Be.join(e.craigDir,"fury","runs"),reviews:Be.join(e.craigDir,"fury","reviews")});function bl(e){return gb("sha256").update(JSON.stringify(e)).digest("hex")}async function Yp(e,t,n){let r=ge(e);await Hr(r.definitions,{recursive:!0});let s=Be.join(r.definitions,`${t}.yaml`);await yb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Yt(i,"EEXIST"))throw i})}async function zp(e,t){return tr(e,async()=>{let n=await Jp(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 Hr(ge(e).plans,{recursive:!0}),await q(af(e,i.id),i),i})}async function oi(e,t){li(t,"plan");try{return wb(JSON.parse(await Yr(af(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Jp(e){let t=ge(e).plans,n=await Tl(t).catch(s=>Yt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>oi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Xp(e){let t=await Jp(e),n=await Promise.all(t.map(s=>Pl(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 Qp(e,t){return tr(e,async()=>{let n=await Pl(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 Hr(ge(e).approvals,{recursive:!0}),await q(lf(e,t.planId),t),{approval:t,created:!0}})}async function Zp(e,t){li(t,"plan");let n=await Pl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function ef(e,t){return tr(e,async()=>{let r=(await nf(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await Hr(ge(e).runs,{recursive:!0}),await q(Rl(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){li(t,"run");try{return sf(JSON.parse(await Yr(Rl(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function tf(e){return nf(e)}async function nf(e){let t=ge(e).runs,n=await Tl(t).catch(s=>Yt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return sf(JSON.parse(await Yr(Be.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ke(e,t,n){return tr(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(Rl(e,t),s),s})}async function rf(e,t){await Hr(ge(e).reviews,{recursive:!0}),await q(Sl(e,t.id),t)}async function zr(e,t,n){return tr(e,async()=>{let r=await nr(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await q(Sl(e,t),s),s})}async function nr(e,t){li(t,"review");try{return kb(JSON.parse(await Yr(Sl(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function ai(e){let t=ge(e).reviews,n=await Tl(t).catch(r=>Yt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>nr(e,r.slice(0,-5))))}function sf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ee(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))||!Ee(e.inputs)||!of(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!Tb(e.stepRuns,e.order)||!Jr(e.actor)||!Ve(e.createdAt)||!Ve(e.updatedAt)||!Ve(e.stateChangedAt)||!Ve(e.deadlineAt)||e.completedAt!==null&&!Ve(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function wb(e,t){if(!Ee(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||!Ee(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||!Jr(e.createdBy)||!Ve(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 kb(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ee(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&&(!Ee(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Ve(e.requestedAt)||!Ve(e.deadlineAt)||!Ve(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!Hp(r))||e.lastDecision!==null&&!Hp(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function Tb(e,t){return Ee(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&bb(e[n],n))}function bb(e,t){return!Ee(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")||!Ee(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Ve(n))&&(e.completedBy===null||Jr(e.completedBy))}function Hp(e){return Ee(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")&&Jr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ve(e.occurredAt)}function of(e){return Ee(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 Jr(e){return Ee(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 Rl=(e,t)=>Be.join(ge(e).runs,`${t}.json`),af=(e,t)=>Be.join(ge(e).plans,`${t}.json`),lf=(e,t)=>Be.join(ge(e).approvals,`${t}.json`),Sl=(e,t)=>Be.join(ge(e).reviews,`${t}.json`),li=(e,t)=>{if(!(t==="plan"?/^fury_plan_[A-Za-z0-9_-]+$/:t==="run"?/^fury_[A-Za-z0-9_-]+$/:/^review_[A-Za-z0-9_-]+$/).test(e))throw new g("CLI_USAGE",`Invalid fury ${t} id "${e}".`,{})};async function Pl(e,t){try{let n=JSON.parse(await Yr(lf(e,t),"utf8"));if(!Ee(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Jr(n.approvedBy)||!Ee(n.approvedBy)||n.approvedBy.type!=="human"||!Ve(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Yt(n,"ENOENT"))return null;throw n}}var Ee=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ve=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Yt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as cf,readFile as Rb,rm as ci,stat as Sb,writeFile as Pb}from"node:fs/promises";import Il from"node:path";var Ib=20,vb=3e4,Cb=5e3;async function uf(e,t){let n=Il.join(e.runtimeDir,"event-journal.lock");await cf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await cf(n);try{await Pb(Il.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ci(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Ob(s))throw s;if(await Ab(n))continue;if(Date.now()-r>=vb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await $b(Ib)}try{return await t()}finally{await ci(n,{recursive:!0,force:!0})}}async function Ab(e){let t=await Rb(Il.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Eb(t.pid)?!1:(await ci(e,{recursive:!0,force:!0}),!0);let n=await Sb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Cb?!1:(await ci(e,{recursive:!0,force:!0}),!0)}function Eb(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Ob=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",$b=e=>new Promise(t=>setTimeout(t,e));var xb=256*1024,Fb=16,Lb=64*1024;async function _e(e,t,n={}){let r=Cl(n.maxSegmentBytes??xb,"Event journal segment size"),s=Cl(n.maxSegments??Fb,"Event journal retention"),i=Cl(n.maxRecordBytes??Lb,"Event record size");return uf(e,async()=>{await ff(e.eventsDir,{recursive:!0}),await Bb(e);let o=await Ol(e),a=t.id??Db(),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:Gb(t.data)},u=`${JSON.stringify(d)}
|
|
75
|
+
`;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let m=(await di(e)).at(-1),h=!m||await Mb(m.path,u,r);if(h&&(m={name:pf(c),path:ui.join(e.eventsDir,pf(c)),startSequence:c}),!m)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let f=await Al(m.path,"a");try{await f.writeFile(u,"utf8"),await f.sync()}finally{await f.close()}return h&&await hf(e.eventsDir),await jb(e,s),d})}async function Sn(e,t={}){let n=await Ol(e),r=Vb(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?Kb(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 Ol(e)).events}async function Ol(e){await ff(e.eventsDir,{recursive:!0});let t=await di(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await Xr(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 Lb(e){let t=(await pi(e)).at(-1);if(!t)return;let n=await Jr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Cl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function Fb(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 Il(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}}):Il(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 Mb(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 jb(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 qb(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Yt(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!nr(i.workspaceId)||!nr(i.taskId)||!nr(i.agentTabId)||!nr(i.commandId)||!nr(i.furyRunId)||!nr(i.furyStepId)||!Ub(i.actor)||!("data"in i))throw Yt(t,`record at line ${n} has an invalid schema`);return i}function Ub(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 nr=e=>e===null||typeof e=="string",lf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Yt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Il=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Ol=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function vl(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 df(e){let t=await Cl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as mf,readdir as Qb,readFile as hf}from"node:fs/promises";import gf from"node:path";import{mkdir as pf,readFile as Wb,rm as fi,stat as Bb,writeFile as Vb}from"node:fs/promises";import $l from"node:path";var Kb=20,Gb=3e4,Hb=5e3;async function Dl(e,t){let n=$l.join(e.runtimeDir,"command-store.lock");await pf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await pf(n);try{await Vb($l.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await fi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Jb(s))throw s;if(await Yb(n))continue;if(Date.now()-r>=Gb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await Xb(Kb)}try{return await t()}finally{await fi(n,{recursive:!0,force:!0})}}async function Yb(e){let t=await Wb($l.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return zb(t.pid)?!1:(await fi(e,{recursive:!0,force:!0}),!0);let n=await Bb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Hb?!1:(await fi(e,{recursive:!0,force:!0}),!0)}function zb(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 Jb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Xb=e=>new Promise(t=>setTimeout(t,e));async function gi(e,t){Nl(t);try{let n=JSON.parse(await hf(Xr(e,t),"utf8"));return wf(n,Xr(e,t),t)}catch(n){throw nR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?hi(t,Xr(e,t),n):n}}async function Ke(e){await mf(e.commandsDir,{recursive:!0});let t=await Qb(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=gf.join(e.commandsDir,r);try{n.push(wf(JSON.parse(await hf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:hi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function yf(e,t){return Nl(t.id),Dl(e,async()=>{await mf(e.commandsDir,{recursive:!0});let n=await Ke(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!Zb(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(Xr(e,t.id),t),{command:t,created:!0}})}async function Qr(e,t,n){return Nl(t),Dl(e,async()=>{let r=await gi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await q(Xr(e,t),s),s})}function Zb(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 wf(e,t,n){if(!mi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw hi("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||!mi(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!tR(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||!rr(e.expiresAt)||!rr(e.createdAt)||!rr(e.updatedAt)||e.deliveryStartedAt!==null&&!rr(e.deliveryStartedAt)||e.deliveredAt!==null&&!rr(e.deliveredAt)||e.cancelledAt!==null&&!rr(e.cancelledAt)||e.cancelledBy!==null&&!ff(e.cancelledBy)||!ff(e.actor)||!eR(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 hi(r,t);return e}function ff(e){return!mi(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 eR(e){return e===null||mi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var Xr=(e,t)=>gf.join(e.commandsDir,`${t}.json`),Nl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},rr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),tR=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}),mi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),nR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",hi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function kf(e,t=new Date){return yi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Tf(e,t=new Date){return e.state==="delivered"?e:(yi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function bf(e,t,n=new Date){return e.state==="failed"?e:(yi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Rf(e,t,n=new Date){return e.state==="cancelled"?e:(yi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function yi(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 rR}from"node:crypto";var _l=32*1024,Sf=1440*60*1e3,xl=256,sR=["delivered","failed","cancelled"],Ll={type:"system",component:"orchestration-supervisor"};async function iR(e,t){if(fR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Sf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Sf}});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)>xl)throw new g("CLI_USAGE",`Idempotency key exceeds ${xl} characters.`,{details:{maxIdempotencyKeyLength:xl}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${rR()}`,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 yf(e,r);if(s.created)try{await Rn(e,s.command,"command.queued")}catch(i){throw Pf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function oR(e,t){return{kind:"showPromptCommand",command:await gi(e,t)}}async function aR(e,t){let n=await Ke(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function lR(e,t,n){let r=!1,s=await Qr(e,t,i=>{if(i.state==="cancelled")return i;let o=Rf(i,n??i.actor);return r=!0,o});if(r)try{await Rn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Pf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function cR(e,t){let n=await Qr(e,t,r=>kf(r));return await Rn(e,n,"command.delivering",Ll),n}async function uR(e,t){let n=await Qr(e,t,r=>Tf(r));return await Rn(e,n,"command.delivered",Ll),n}async function dR(e,t,n){let r=await Qr(e,t,s=>bf(s,n));return await Rn(e,r,"command.failed",Ll),r}async function pR(e,t,n){let r=[...n.states??sR],s=Date.now()+n.timeoutMs;for(;;){let i=await gi(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 mR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function fR(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>_l)throw new g("CLI_USAGE",`Prompt exceeds the ${_l}-byte limit.`,{details:{maxPromptBytes:_l,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 Rn(e,t,n,r=t.actor){await De(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function mR(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 Pf=(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}),oe={create:iR,show:oR,list:aR,cancel:lR,wait:pR,beginDelivery:cR,completeDelivery:uR,fail:dR};import{randomUUID as vf,timingSafeEqual as hR}from"node:crypto";import{mkdir as gR,readFile as yR,readdir as wR}from"node:fs/promises";import Cf from"node:path";var kR=10080*60*1e3,TR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},bR=["task.create-child","task.children","task.cancel-tree"],RR=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Xe(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await gR(ql(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_${vf()}`,c=await wi(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 SR(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 SR(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${vf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...bR],targetPolicy:"children-only",limits:{...TR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+kR).toISOString(),revokedAt:null,revokedBy:null};return await q(Ul(e,o.id),o,{mode:384}),o}async function Ge(e,t,n,r){let s=await IR(e,t);return s.revokedAt&&Sn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Sn(s.id,"expired"),!RR.has(n)&&!s.allowedCommandFamilies.includes(n)&&Sn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await PR(e,s.taskId,r)&&Sn(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 PR(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 Af(e,t,n){let r=await wi(e,t);r&&(r.revokedAt||await q(Ul(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function jl(e,t,n){let r=await wR(ql(e)).catch(i=>Ef(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 wi(e,o[1]);!a||!t.has(a.taskId)||(await Af(e,a.id,n),s.push(a.id))}return s}async function IR(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Sn("<redacted>","token is invalid");let s=await wi(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||!hR(i,o))&&Sn(r,"token is invalid"),s}async function wi(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Sn(t,"identifier is invalid");try{let n=JSON.parse(await yR(Ul(e,t),"utf8"));if(!vR(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Ef(n))return null;throw n}}function vR(e,t){if(!Ml(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"&&CR(r))&&e.targetPolicy==="children-only"&&Ml(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Fl(e.createdAt)&&Fl(e.expiresAt)&&If(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Fl(e.revokedAt)&&If(e.revokedBy))}function If(e){return Ml(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 Sn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var ql=e=>Cf.join(e.orchestrationDir,"capabilities"),Ul=(e,t)=>Cf.join(ql(e),`${t}.json`),CR=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Ml=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Fl=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Ef=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Of,readFile as AR,rm as Wl,stat as ER,writeFile as OR}from"node:fs/promises";import Bl from"node:path";var $R=20,DR=3e4,NR=5e3;async function Vl(e,t){let n=Bl.join(e.runtimeDir,"delegation.lock");await Of(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Of(n);try{await OR(Bl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Wl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!LR(s))throw s;if(await _R(n))continue;if(Date.now()-r>=DR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,$R))}try{return await t()}finally{await Wl(n,{recursive:!0,force:!0})}}async function _R(e){let t=await AR(Bl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&xR(t.pid))return!1;let n=await ER(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<NR?!1:(await Wl(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 LR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var FR={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Kl(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function Gl(e,t,n={}){return Vl(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await Ge(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??FR,a=MR(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&&ki("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&ki("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(!jR(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 $f(y,!0)}}u.length>=o.maxChildren&&ki("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&ki("concurrent children",o.maxConcurrentChildren);let h=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await Xe(e,y,i)})}),f=await S.getTask(e,h.taskId);try{await De(e,{workspaceId:f.workspaceId,taskId:f.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:f.rootTaskId,delegationDepth:f.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${f.id} was created, but its audit event could not be recorded.`,{details:{taskId:f.id,parentTaskId:r.id,persisted:!0},cause:y})}return $f(f,!1)})}async function Hl(e,t,n){n&&await Ge(e,n,"task.children",t),await S.getTask(e,t);let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function Yl(e,t,n){return Vl(e,async()=>{let s=(n?await Ge(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(h=>[h.id,h])),a=new Map;for(let h of i)h.parentTaskId&&a.set(h.parentTaskId,[...a.get(h.parentTaskId)??[],h]);let l=[],c=new Set,d=h=>{if(c.has(h))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${h}.`,{details:{taskId:h,rootTaskId:t}});let f=o.get(h);if(f){c.add(h),l.push(f);for(let y of(a.get(h)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],m=[];try{await jl(e,new Set(l.map(h=>h.id)),s)}catch{m.push(...l.map(h=>h.id))}for(let h of l){let f=h.status;if(f==="closed"){u.push({taskId:h.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,h,{preserveWorktree:!0});let y=await S.closeTask(e,h.id);u.push({taskId:h.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await De(e,{workspaceId:h.workspaceId,taskId:h.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(h.id)}}if(p.length>0||m.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:m,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function $f(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 MR(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 jR(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function ki(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ti=Symbol.for("yaml.alias"),bi=Symbol.for("yaml.document"),Qe=Symbol.for("yaml.map"),zl=Symbol.for("yaml.pair"),Ne=Symbol.for("yaml.scalar"),Ot=Symbol.for("yaml.seq"),Pe=Symbol.for("yaml.node.type"),_e=e=>!!e&&typeof e=="object"&&e[Pe]===Ti,mt=e=>!!e&&typeof e=="object"&&e[Pe]===bi,Ze=e=>!!e&&typeof e=="object"&&e[Pe]===Qe,M=e=>!!e&&typeof e=="object"&&e[Pe]===zl,_=e=>!!e&&typeof e=="object"&&e[Pe]===Ne,et=e=>!!e&&typeof e=="object"&&e[Pe]===Ot;function U(e){if(e&&typeof e=="object")switch(e[Pe]){case Qe:case Ot:return!0}return!1}function j(e){if(e&&typeof e=="object")switch(e[Pe]){case Ti:case Qe:case Ne:case Ot:return!0}return!1}var Ri=e=>(_(e)||U(e))&&!!e.anchor;var Ee=Symbol("break visit"),Df=Symbol("skip children"),ht=Symbol("remove node");function He(e,t){let n=Nf(t);mt(e)?sr(null,e.contents,n,Object.freeze([e]))===ht&&(e.contents=null):sr(null,e,n,Object.freeze([]))}He.BREAK=Ee;He.SKIP=Df;He.REMOVE=ht;function sr(e,t,n,r){let s=_f(e,t,n,r);if(j(s)||M(s))return xf(e,r,s),sr(e,s,n,r);if(typeof s!="symbol"){if(U(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=sr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===ht&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=sr("key",t.key,n,r);if(i===Ee)return Ee;i===ht&&(t.key=null);let o=sr("value",t.value,n,r);if(o===Ee)return Ee;o===ht&&(t.value=null)}}return s}async function Si(e,t){let n=Nf(t);mt(e)?await ir(null,e.contents,n,Object.freeze([e]))===ht&&(e.contents=null):await ir(null,e,n,Object.freeze([]))}Si.BREAK=Ee;Si.SKIP=Df;Si.REMOVE=ht;async function ir(e,t,n,r){let s=await _f(e,t,n,r);if(j(s)||M(s))return xf(e,r,s),ir(e,s,n,r);if(typeof s!="symbol"){if(U(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await ir(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===ht&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await ir("key",t.key,n,r);if(i===Ee)return Ee;i===ht&&(t.key=null);let o=await ir("value",t.value,n,r);if(o===Ee)return Ee;o===ht&&(t.value=null)}}return s}function Nf(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 _f(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Ze(t))return n.Map?.(e,t,r);if(et(t))return n.Seq?.(e,t,r);if(M(t))return n.Pair?.(e,t,r);if(_(t))return n.Scalar?.(e,t,r);if(_e(t))return n.Alias?.(e,t,r)}function xf(e,t,n){let r=t[t.length-1];if(U(r))r.items[e]=n;else if(M(r))e==="key"?r.key=n:r.value=n;else if(mt(r))r.contents=n;else{let s=_e(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var qR={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},UR=e=>e.replace(/[!,[\]{}]/g,t=>qR[t]),gt=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&(this.yaml={explicit:e.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},e.defaultTags),this.atNextDocument=!1);let r=t.trim().split(/[ \t]+/),s=r.shift();switch(s){case"%TAG":{if(r.length!==2&&(n(0,"%TAG directive should contain exactly two parts"),r.length<2))return!1;let[i,o]=r;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,r.length!==1)return n(0,"%YAML directive should contain exactly one part"),!1;let[i]=r;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{let o=/^\d+\.\d+$/.test(i);return n(6,`Unsupported YAML version ${i}`,o),!1}}default:return n(0,`Unknown directive ${s}`,!0),!1}}tagName(t,n){if(t==="!")return"!";if(t[0]!=="!")return n(`Not a valid tag: ${t}`),null;if(t[1]==="<"){let o=t.slice(2,-1);return o==="!"||o==="!!"?(n(`Verbatim tags aren't resolved, so ${t} is invalid.`),null):(t[t.length-1]!==">"&&n("Verbatim tags must end with a >"),o)}let[,r,s]=t.match(/^(.*!)([^!]*)$/s);s||n(`The ${t} tag has no suffix`);let i=this.tags[r];if(i)try{return i+decodeURIComponent(s)}catch(o){return n(String(o)),null}return r==="!"?t:(n(`Could not resolve tag: ${t}`),null)}tagString(t){for(let[n,r]of Object.entries(this.tags))if(t.startsWith(r))return n+UR(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&j(t.contents)){let i={};He(t.contents,(o,a)=>{j(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
|
|
79
|
-
`)}};
|
|
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=Hb(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 m=n.at(-1);if(m&&p.sequence!==m.sequence+1)throw zt(i.name,`non-monotonic sequence ${p.sequence} after ${m.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function di(e){return(await El(e.eventsDir).catch(n=>{if($l(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:ui.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function Mb(e,t,n){let r=await _b(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function jb(e,t){let n=await di(e),r=Math.max(0,n.length-t),s=await Ub(e),i=await qb(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await Wb(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await Nb(a.path,{force:!0});o.length>0&&await hf(e.eventsDir)}async function qb(e){let t=ge(e).runs,n=await El(t).catch(s=>{if($l(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await Xr(ui.join(t,s),"utf8"));typeof i.id=="string"&&["pending","running","waiting_for_review"].includes(String(i.state))&&r.add(i.id)}catch{return null}return r}async function Ub(e){let t=await El(e.commandsDir).catch(r=>{if($l(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await Xr(ui.join(e.commandsDir,r),"utf8"));typeof s.id=="string"&&(s.state==="queued"||s.state==="delivering")&&n.add(s.id)}catch{return null}return n}async function Wb(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await Xr(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 Bb(e){let t=(await di(e)).at(-1);if(!t)return;let n=await Xr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Al(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function Vb(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 vl(t);return df(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}}):vl(t);return df(t,s.sequence,n),s.sequence}function df(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 Kb(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 Gb(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 Hb(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))||!rr(i.workspaceId)||!rr(i.taskId)||!rr(i.agentTabId)||!rr(i.commandId)||!rr(i.furyRunId)||!rr(i.furyStepId)||!Yb(i.actor)||!("data"in i))throw zt(t,`record at line ${n} has an invalid schema`);return i}function Yb(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 rr=e=>e===null||typeof e=="string",pf=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}}),vl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),$l=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Cl(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 hf(e){let t=await Al(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as wf,readdir as iR,readFile as kf}from"node:fs/promises";import Tf from"node:path";import{mkdir as gf,readFile as zb,rm as pi,stat as Jb,writeFile as Xb}from"node:fs/promises";import Dl from"node:path";var Qb=20,Zb=3e4,eR=5e3;async function Nl(e,t){let n=Dl.join(e.runtimeDir,"command-store.lock");await gf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await gf(n);try{await Xb(Dl.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(!rR(s))throw s;if(await tR(n))continue;if(Date.now()-r>=Zb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await sR(Qb)}try{return await t()}finally{await pi(n,{recursive:!0,force:!0})}}async function tR(e){let t=await zb(Dl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return nR(t.pid)?!1:(await pi(e,{recursive:!0,force:!0}),!0);let n=await Jb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<eR?!1:(await pi(e,{recursive:!0,force:!0}),!0)}function nR(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 rR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",sR=e=>new Promise(t=>setTimeout(t,e));async function hi(e,t){_l(t);try{let n=JSON.parse(await kf(Qr(e,t),"utf8"));return Rf(n,Qr(e,t),t)}catch(n){throw cR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?mi(t,Qr(e,t),n):n}}async function Ge(e){await wf(e.commandsDir,{recursive:!0});let t=await iR(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Tf.join(e.commandsDir,r);try{n.push(Rf(JSON.parse(await kf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:mi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function bf(e,t){return _l(t.id),Nl(e,async()=>{await wf(e.commandsDir,{recursive:!0});let n=await Ge(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!oR(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(Qr(e,t.id),t),{command:t,created:!0}})}async function Zr(e,t,n){return _l(t),Nl(e,async()=>{let r=await hi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await q(Qr(e,t),s),s})}function oR(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 Rf(e,t,n){if(!fi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw mi("unknown",t);let r=e.id,s=["queued","delivering","delivered","failed","cancelled"];if(r!==n||e.idempotencyKey!==null&&(typeof e.idempotencyKey!="string"||e.idempotencyKey.length>256)||typeof e.taskId!="string"||e.taskId.length===0||typeof e.agentTabId!="string"||e.agentTabId.length===0||!fi(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!lR(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||!sr(e.expiresAt)||!sr(e.createdAt)||!sr(e.updatedAt)||e.deliveryStartedAt!==null&&!sr(e.deliveryStartedAt)||e.deliveredAt!==null&&!sr(e.deliveredAt)||e.cancelledAt!==null&&!sr(e.cancelledAt)||e.cancelledBy!==null&&!yf(e.cancelledBy)||!yf(e.actor)||!aR(e.lastError)||e.state==="delivered"!=(e.deliveredAt!==null)||e.state==="failed"!=(e.lastError!==null)||Number(e.attempts)>0!=(e.deliveryStartedAt!==null)||e.state==="cancelled"!=(e.cancelledAt!==null&&e.cancelledBy!==null))throw mi(r,t);return e}function yf(e){return!fi(e)||typeof e.type!="string"?!1:e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component))}function aR(e){return e===null||fi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var Qr=(e,t)=>Tf.join(e.commandsDir,`${t}.json`),_l=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},sr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),lR=e=>e.trim().length>0&&Buffer.byteLength(e)<=32*1024&&![...e].some(t=>{let n=t.charCodeAt(0);return n<=8||n>=11&&n<=31||n>=127&&n<=159}),fi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),cR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",mi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Sf(e,t=new Date){return gi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Pf(e,t=new Date){return e.state==="delivered"?e:(gi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function If(e,t,n=new Date){return e.state==="failed"?e:(gi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function vf(e,t,n=new Date){return e.state==="cancelled"?e:(gi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function gi(e,t,n){if(!t.includes(e.state))throw new g("COMMAND_STATE_CONFLICT",`Cannot ${n} command ${e.id} while it is ${e.state}.`,{details:{commandId:e.id,state:e.state,allowedStates:t}})}import{randomUUID as uR}from"node:crypto";var xl=32*1024,Cf=1440*60*1e3,Fl=256,dR=["delivered","failed","cancelled"],Ll={type:"system",component:"orchestration-supervisor"};async function pR(e,t){if(TR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Cf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Cf}});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)>Fl)throw new g("CLI_USAGE",`Idempotency key exceeds ${Fl} characters.`,{details:{maxIdempotencyKeyLength:Fl}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${uR()}`,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 bf(e,r);if(s.created)try{await Pn(e,s.command,"command.queued")}catch(i){throw Af(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function fR(e,t){return{kind:"showPromptCommand",command:await hi(e,t)}}async function mR(e,t){let n=await Ge(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function hR(e,t,n){let r=!1,s=await Zr(e,t,i=>{if(i.state==="cancelled")return i;let o=vf(i,n??i.actor);return r=!0,o});if(r)try{await Pn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Af(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function gR(e,t){let n=await Zr(e,t,r=>Sf(r));return await Pn(e,n,"command.delivering",Ll),n}async function yR(e,t){let n=await Zr(e,t,r=>Pf(r));return await Pn(e,n,"command.delivered",Ll),n}async function wR(e,t,n){let r=await Zr(e,t,s=>If(s,n));return await Pn(e,r,"command.failed",Ll),r}async function kR(e,t,n){let r=[...n.states??dR],s=Date.now()+n.timeoutMs;for(;;){let i=await hi(e,t);if(r.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:r};if(n.signal?.aborted)throw new g("OPERATION_CANCELLED",`Cancelled while waiting for command ${t}.`,{retryable:!0,details:{commandId:t,cancelled:!0}});let o=s-Date.now();if(o<=0)throw new g("OPERATION_TIMEOUT",`Timed out after ${n.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:r,timeoutMs:n.timeoutMs}});await bR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function TR(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 Pn(e,t,n,r=t.actor){await _e(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 bR(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 Af=(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:pR,show:fR,list:mR,cancel:hR,wait:kR,beginDelivery:gR,completeDelivery:yR,fail:wR};import{randomUUID as Of,timingSafeEqual as RR}from"node:crypto";import{mkdir as SR,readFile as PR,readdir as IR}from"node:fs/promises";import $f from"node:path";var vR=10080*60*1e3,CR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},AR=["task.create-child","task.children","task.cancel-tree"],ER=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Xe(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await SR(Ul(e),{recursive:!0,mode:448}),await K(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_${Of()}`,c=await yi(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new g("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await OR(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 OR(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Of()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...AR],targetPolicy:"children-only",limits:{...CR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+vR).toISOString(),revokedAt:null,revokedBy:null};return await q(Wl(e,o.id),o,{mode:384}),o}async function He(e,t,n,r){let s=await DR(e,t);return s.revokedAt&&In(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&In(s.id,"expired"),!ER.has(n)&&!s.allowedCommandFamilies.includes(n)&&In(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await $R(e,s.taskId,r)&&In(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 $R(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 Df(e,t,n){let r=await yi(e,t);r&&(r.revokedAt||await q(Wl(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function ql(e,t,n){let r=await IR(Ul(e)).catch(i=>Nf(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await yi(e,o[1]);!a||!t.has(a.taskId)||(await Df(e,a.id,n),s.push(a.id))}return s}async function DR(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||In("<redacted>","token is invalid");let s=await yi(e,r);if(!s)throw new g("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!RR(i,o))&&In(r,"token is invalid"),s}async function yi(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||In(t,"identifier is invalid");try{let n=JSON.parse(await PR(Wl(e,t),"utf8"));if(!NR(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Nf(n))return null;throw n}}function NR(e,t){if(!jl(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"&&_R(r))&&e.targetPolicy==="children-only"&&jl(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Ml(e.createdAt)&&Ml(e.expiresAt)&&Ef(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Ml(e.revokedAt)&&Ef(e.revokedBy))}function Ef(e){return jl(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 In(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var Ul=e=>$f.join(e.orchestrationDir,"capabilities"),Wl=(e,t)=>$f.join(Ul(e),`${t}.json`),_R=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),jl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ml=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Nf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as _f,readFile as xR,rm as Bl,stat as FR,writeFile as LR}from"node:fs/promises";import Vl from"node:path";var MR=20,jR=3e4,qR=5e3;async function Kl(e,t){let n=Vl.join(e.runtimeDir,"delegation.lock");await _f(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await _f(n);try{await LR(Vl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Bl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!BR(s))throw s;if(await UR(n))continue;if(Date.now()-r>=jR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,MR))}try{return await t()}finally{await Bl(n,{recursive:!0,force:!0})}}async function UR(e){let t=await xR(Vl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&WR(t.pid))return!1;let n=await FR(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<qR?!1:(await Bl(e,{recursive:!0,force:!0}),!0)}function WR(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 BR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var VR={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Gl(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function Hl(e,t,n={}){return Kl(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await He(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??VR,a=KR(r,t),l=t.prompt.trim();if(l.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});Buffer.byteLength(l)>o.maxPromptBytes&&wi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&wi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(T=>T.delegationIdempotencyKey===p);if(y){if(!GR(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 xf(y,!0)}}u.length>=o.maxChildren&&wi("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&wi("concurrent children",o.maxConcurrentChildren);let h=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await Xe(e,y,i)})}),f=await S.getTask(e,h.taskId);try{await _e(e,{workspaceId:f.workspaceId,taskId:f.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:f.rootTaskId,delegationDepth:f.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${f.id} was created, but its audit event could not be recorded.`,{details:{taskId:f.id,parentTaskId:r.id,persisted:!0},cause:y})}return xf(f,!1)})}async function Yl(e,t,n){n&&await He(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 zl(e,t,n){return Kl(e,async()=>{let s=(n?await He(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(h=>[h.id,h])),a=new Map;for(let h of i)h.parentTaskId&&a.set(h.parentTaskId,[...a.get(h.parentTaskId)??[],h]);let l=[],c=new Set,d=h=>{if(c.has(h))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${h}.`,{details:{taskId:h,rootTaskId:t}});let f=o.get(h);if(f){c.add(h),l.push(f);for(let y of(a.get(h)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],m=[];try{await ql(e,new Set(l.map(h=>h.id)),s)}catch{m.push(...l.map(h=>h.id))}for(let h of l){let f=h.status;if(f==="closed"){u.push({taskId:h.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,h,{preserveWorktree:!0});let y=await S.closeTask(e,h.id);u.push({taskId:h.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await _e(e,{workspaceId:h.workspaceId,taskId:h.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(h.id)}}if(p.length>0||m.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:m,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function xf(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 KR(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 GR(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function wi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var ki=Symbol.for("yaml.alias"),Ti=Symbol.for("yaml.document"),Qe=Symbol.for("yaml.map"),Jl=Symbol.for("yaml.pair"),xe=Symbol.for("yaml.scalar"),$t=Symbol.for("yaml.seq"),Ie=Symbol.for("yaml.node.type"),Fe=e=>!!e&&typeof e=="object"&&e[Ie]===ki,ht=e=>!!e&&typeof e=="object"&&e[Ie]===Ti,Ze=e=>!!e&&typeof e=="object"&&e[Ie]===Qe,M=e=>!!e&&typeof e=="object"&&e[Ie]===Jl,_=e=>!!e&&typeof e=="object"&&e[Ie]===xe,et=e=>!!e&&typeof e=="object"&&e[Ie]===$t;function W(e){if(e&&typeof e=="object")switch(e[Ie]){case Qe:case $t:return!0}return!1}function j(e){if(e&&typeof e=="object")switch(e[Ie]){case ki:case Qe:case xe:case $t:return!0}return!1}var bi=e=>(_(e)||W(e))&&!!e.anchor;var Oe=Symbol("break visit"),Ff=Symbol("skip children"),gt=Symbol("remove node");function Ye(e,t){let n=Lf(t);ht(e)?ir(null,e.contents,n,Object.freeze([e]))===gt&&(e.contents=null):ir(null,e,n,Object.freeze([]))}Ye.BREAK=Oe;Ye.SKIP=Ff;Ye.REMOVE=gt;function ir(e,t,n,r){let s=Mf(e,t,n,r);if(j(s)||M(s))return jf(e,r,s),ir(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=ir(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Oe)return Oe;o===gt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=ir("key",t.key,n,r);if(i===Oe)return Oe;i===gt&&(t.key=null);let o=ir("value",t.value,n,r);if(o===Oe)return Oe;o===gt&&(t.value=null)}}return s}async function Ri(e,t){let n=Lf(t);ht(e)?await or(null,e.contents,n,Object.freeze([e]))===gt&&(e.contents=null):await or(null,e,n,Object.freeze([]))}Ri.BREAK=Oe;Ri.SKIP=Ff;Ri.REMOVE=gt;async function or(e,t,n,r){let s=await Mf(e,t,n,r);if(j(s)||M(s))return jf(e,r,s),or(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 or(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Oe)return Oe;o===gt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await or("key",t.key,n,r);if(i===Oe)return Oe;i===gt&&(t.key=null);let o=await or("value",t.value,n,r);if(o===Oe)return Oe;o===gt&&(t.value=null)}}return s}function Lf(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 Mf(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Ze(t))return n.Map?.(e,t,r);if(et(t))return n.Seq?.(e,t,r);if(M(t))return n.Pair?.(e,t,r);if(_(t))return n.Scalar?.(e,t,r);if(Fe(t))return n.Alias?.(e,t,r)}function jf(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(ht(r))r.contents=n;else{let s=Fe(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var HR={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},YR=e=>e.replace(/[!,[\]{}]/g,t=>HR[t]),yt=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+YR(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={};Ye(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
|
+
`)}};yt.defaultYaml={explicit:!1,version:"1.2"};yt.defaultTags={"!!":"tag:yaml.org,2002:"};function Si(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let n=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw new Error(n)}return!0}function Xl(e){let t=new Set;return Ye(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function Ql(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function qf(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Xl(e));let o=Ql(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(_(o.node)||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 Jt(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=Jt(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=Jt(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=Jt(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=Jt(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function le(e,t,n){if(Array.isArray(e))return e.map((r,s)=>le(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!bi(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=e.toJSON(t,n);return n.onCreate&&n.onCreate(s),s}return typeof e=="bigint"&&!n?.keep?Number(e):e}var Xt=class{constructor(t){Object.defineProperty(this,Ie,{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(!ht(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"?Jt(i,{"":a},"",a):a}};var Dt=class extends Xt{constructor(t){super(ki),this.source=t,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(t,n){if(n?.maxAliasCount===0)throw new ReferenceError("Alias resolution is disabled");let r;n?.aliasResolveCache?r=n.aliasResolveCache:(r=[],Ye(t,{Node:(i,o)=>{(Fe(o)||bi(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(t,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=r.get(o);if(a||(le(o,null,n),a=r.get(o)),a?.res===void 0){let l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Pi(s,o,r)),a.count*a.aliasCount>i)){let l="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(l)}return a.res}toString(t,n,r){let s=`*${this.source}`;if(t){if(Si(this.source),t.options.verifyAliasOrder&&!t.anchors.has(this.source)){let i=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(i)}if(t.implicitKey)return`${s} `}return s}};function Pi(e,t,n){if(Fe(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=Pi(e,s,n);i>r&&(r=i)}return r}else if(M(t)){let r=Pi(e,t.key,n),s=Pi(e,t.value,n);return Math.max(r,s)}return 1}var Ii=e=>!e||typeof e!="function"&&typeof e!="object",E=class extends Xt{constructor(t){super(xe),this.value=t}toJSON(t,n){return n?.keep?this.value:le(this.value,t,n)}toString(){return String(this.value)}};E.BLOCK_FOLDED="BLOCK_FOLDED";E.BLOCK_LITERAL="BLOCK_LITERAL";E.PLAIN="PLAIN";E.QUOTE_DOUBLE="QUOTE_DOUBLE";E.QUOTE_SINGLE="QUOTE_SINGLE";var zR="tag:yaml.org,2002:";function JR(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 Nt(e,t,n){if(ht(e)&&(e=e.contents),j(e))return e;if(M(e)){let u=n.schema[Qe].createNode?.(n.schema,null,n);return u.items.push(e),u}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<"u"&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,l;if(r&&e&&typeof e=="object"){if(l=a.get(e),l)return l.anchor??(l.anchor=s(e)),new Dt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=zR+t.slice(2));let c=JR(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new E(e);return l&&(l.node=u),u}c=e instanceof Map?o[Qe]:Symbol.iterator in Object(e)?o[$t]:o[Qe]}i&&(i(c),delete n.onTagObj);let d=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new E(e);return t?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function es(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 Nt(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 lr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,ar=class extends Xt{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>j(r)||M(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(lr(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,es(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&&_(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&&_(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,es(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var Uf=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function ze(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var wt=(e,t,n)=>e.endsWith(`
|
|
80
|
+
`)?ze(n,t):n.includes(`
|
|
81
81
|
`)?`
|
|
82
|
-
`+
|
|
83
|
-
`)n===
|
|
82
|
+
`+ze(n,t):(e.endsWith(" ")?"":" ")+n;var Zl="flow",vi="block",ts="quoted";function ns(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,m,h=!1,f=-1,y=-1,T=-1;n===vi&&(f=Wf(e,f,t.length),f!==-1&&(u=f+l));for(let b;b=e[f+=1];){if(n===ts&&b==="\\"){switch(y=f,e[f+1]){case"x":f+=3;break;case"u":f+=5;break;case"U":f+=9;break;default:f+=1}T=f}if(b===`
|
|
83
|
+
`)n===vi&&(f=Wf(e,f,t.length)),u=f+t.length+l,p=void 0;else{if(b===" "&&m&&m!==" "&&m!==`
|
|
84
84
|
`&&m!==" "){let O=e[f+1];O&&O!==" "&&O!==`
|
|
85
|
-
`&&O!==" "&&(p=f)}if(f>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===
|
|
86
|
-
${t}${e.slice(0,$)}`:(n===
|
|
87
|
-
${t}${e.slice(O+1,$)}`)}return R}function
|
|
88
|
-
`);r=t,s=t+1,i=e[s]}return r}var
|
|
89
|
-
`){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function
|
|
85
|
+
`&&O!==" "&&(p=f)}if(f>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===ts){for(;m===" "||m===" ";)m=b,b=e[f+=1],h=!0;let O=f>T+1?f-2:y-1;if(d[O])return e;c.push(O),d[O]=!0,u=O+l,p=void 0}else h=!0}m=b}if(h&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let b=0;b<c.length;++b){let O=c[b],$=c[b+1]||e.length;O===0?R=`
|
|
86
|
+
${t}${e.slice(0,$)}`:(n===ts&&d[O]&&(R+=`${e[O]}\\`),R+=`
|
|
87
|
+
${t}${e.slice(O+1,$)}`)}return R}function Wf(e,t,n){let r=t,s=t+1,i=e[s];for(;i===" "||i===" ";)if(t<s+n)i=e[++t];else{do i=e[++t];while(i&&i!==`
|
|
88
|
+
`);r=t,s=t+1,i=e[s]}return r}var Ai=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Ei=e=>/^(%|---|\.\.\.)/m.test(e);function XR(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 rs(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Ei(e)?" ":""),o="",a=0;for(let l=0,c=n[l];c;c=n[++l])if(c===" "&&n[l+1]==="\\"&&n[l+2]==="n"&&(o+=n.slice(a,l)+"\\ ",l+=1,a=l,c="\\"),c==="\\")switch(n[l+1]){case"u":{o+=n.slice(a,l);let d=n.substr(l+2,4);switch(d){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:d.substr(0,2)==="00"?o+="\\x"+d.substr(2):o+=n.substr(l,6)}l+=5,a=l+1}break;case"n":if(r||n[l+2]==='"'||n.length<s)l+=1;else{for(o+=n.slice(a,l)+`
|
|
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:ns(o,i,ts,Ai(t,!1))}function ec(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
|
|
93
|
+
`)||/[ \t]\n|\n[ \t]/.test(e))return rs(e,t);let n=t.indent||(Ei(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
|
|
94
|
+
${n}`)+"'";return t.implicitKey?r:ns(r,n,Zl,Ai(t,!1))}function cr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=rs;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=ec:i&&!s?r=rs:r=n?ec:rs}return r(e,t)}var tc;try{tc=new RegExp(`(^|(?<!
|
|
95
95
|
))
|
|
96
96
|
+(?!
|
|
97
|
-
|$)`,"g")}catch{
|
|
97
|
+
|$)`,"g")}catch{tc=/\n+(?!\n|$)/g}function Ci({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return cr(n,r);let c=r.indent||(r.forceBlockIndent||Ei(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===E.BLOCK_FOLDED?!1:t===E.BLOCK_LITERAL?!0:!XR(n,l,c.length);if(!n)return d?`|
|
|
98
98
|
`:`>
|
|
99
99
|
`;let u,p;for(p=n.length;p>0;--p){let $=n[p-1];if($!==`
|
|
100
100
|
`&&$!==" "&&$!==" ")break}let m=n.substring(p),h=m.indexOf(`
|
|
101
101
|
`);h===-1?u="-":n===m||h!==m.length-1?(u="+",i&&i()):u="",m&&(n=n.slice(0,-m.length),m[m.length-1]===`
|
|
102
|
-
`&&(m=m.slice(0,-1)),m=m.replace(
|
|
102
|
+
`&&(m=m.slice(0,-1)),m=m.replace(tc,`$&${c}`));let f=!1,y,T=-1;for(y=0;y<n.length;++y){let $=n[y];if($===" ")f=!0;else if($===`
|
|
103
103
|
`)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let O=(f?c?"2":"1":"")+u;if(e&&(O+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let $=n.replace(/\n+/g,`
|
|
104
|
-
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,x=
|
|
104
|
+
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,x=Ai(r,!0);o!=="folded"&&t!==E.BLOCK_FOLDED&&(x.onOverflow=()=>{D=!0});let v=ns(`${R}${$}${m}`,c,vi,x);if(!D)return`>${O}
|
|
105
105
|
${c}${v}`}return n=n.replace(/\n+/g,`$&${c}`),`|${O}
|
|
106
|
-
${c}${R}${n}${m}`}function
|
|
107
|
-
`)||d&&/[[\]{},]/.test(i))return
|
|
108
|
-
`)?
|
|
109
|
-
`))return
|
|
110
|
-
${l}`);if(o){let p=f=>f.default&&f.tag!=="tag:yaml.org,2002:str"&&f.test?.test(u),{compat:m,tags:h}=t.doc.schema;if(h.some(p)||m?.some(p))return
|
|
111
|
-
${t.indent}${a}`:a}function
|
|
112
|
-
${a}:`):(y=`${y}:`,p&&(y+=
|
|
106
|
+
${c}${R}${n}${m}`}function QR(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 cr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
|
|
108
|
+
`)?cr(i,t):Ci(e,t,n,r);if(!a&&!d&&s!==E.PLAIN&&i.includes(`
|
|
109
|
+
`))return Ci(e,t,n,r);if(Ei(i)){if(l==="")return t.forceBlockIndent=!0,Ci(e,t,n,r);if(a&&l===c)return cr(i,t)}let u=i.replace(/\n+/g,`$&
|
|
110
|
+
${l}`);if(o){let p=f=>f.default&&f.tag!=="tag:yaml.org,2002:str"&&f.test?.test(u),{compat:m,tags:h}=t.doc.schema;if(h.some(p)||m?.some(p))return cr(i,t)}return a?u:ns(u,l,Zl,Ai(t,!1))}function vn(e,t,n,r){let{implicitKey:s,inFlow:i}=t,o=typeof e.value=="string"?e:Object.assign({},e,{value:String(e.value)}),{type:a}=e;a!==E.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=E.QUOTE_DOUBLE);let l=d=>{switch(d){case E.BLOCK_FOLDED:case E.BLOCK_LITERAL:return s||i?cr(o.value,t):Ci(o,t,n,r);case E.QUOTE_DOUBLE:return rs(o.value,t);case E.QUOTE_SINGLE:return ec(o.value,t);case E.PLAIN:return QR(o,t,n,r);default:return null}},c=l(a);if(c===null){let{defaultKeyType:d,defaultStringType:u}=t.options,p=s&&d||u;if(c=l(p),c===null)throw new Error(`Unsupported default string type ${p}`)}return c}function Oi(e,t){let n=Object.assign({blockQuote:!0,commentString:Uf,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 ZR(e,t){if(t.tag){let s=e.filter(i=>i.tag===t.tag);if(s.length>0)return s.find(i=>i.format===t.format)??s[0]}let n,r;if(_(t)){r=t.value;let s=e.filter(i=>i.identify?.(r));if(s.length>1){let i=s.filter(o=>o.test);i.length>0&&(s=i)}n=s.find(i=>i.format===t.format)??s.find(i=>!i.format)}else r=t,n=e.find(s=>s.nodeClass&&r instanceof s.nodeClass);if(!n){let s=r?.constructor?.name??(r===null?"null":typeof r);throw new Error(`Tag not resolved for ${s} value`)}return n}function eS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(_(e)||W(e))&&e.anchor;i&&Si(i)&&(n.add(i),s.push(`&${i}`));let o=e.tag??(t.default?null:t.tag);return o&&s.push(r.directives.tagString(o)),s.join(" ")}function _t(e,t,n,r){if(M(e))return e.toString(t,n,r);if(Fe(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=j(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=ZR(t.doc.schema.tags,i));let o=eS(i,s,t);o.length>0&&(t.indentAtStart=(t.indentAtStart??0)+o.length+1);let a=typeof s.stringify=="function"?s.stringify(i,t,n,r):_(i)?vn(i,t,n,r):i.toString(t,n,r);return o?_(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
|
|
111
|
+
${t.indent}${a}`:a}function Bf({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:d,simpleKeys:u}}=n,p=j(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!j(e)&&typeof e=="object"){let x="With simple keys, collection cannot be used as a key value";throw new Error(x)}}let m=!u&&(!e||p&&t==null&&!n.inFlow||W(e)||(_(e)?e.type===E.BLOCK_FOLDED||e.type===E.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!m&&(u||!i),indent:a+l});let h=!1,f=!1,y=_t(e,n,()=>h=!0,()=>f=!0);if(!m&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");m=!0}if(n.inFlow){if(i||t==null)return h&&r&&r(),y===""?"?":m?`? ${y}`:y}else if(i&&!u||t==null&&m)return y=`? ${y}`,p&&!h?y+=wt(y,n.indent,c(p)):f&&s&&s(),y;h&&(p=null),m?(p&&(y+=wt(y,n.indent,c(p))),y=`? ${y}
|
|
112
|
+
${a}:`):(y=`${y}:`,p&&(y+=wt(y,n.indent,c(p))));let T,R,b;j(t)?(T=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(T=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!m&&!p&&_(t)&&(n.indentAtStart=y.length+1),f=!1,!d&&l.length>=2&&!n.inFlow&&!m&&et(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let O=!1,$=_t(t,n,()=>O=!0,()=>f=!0),D=" ";if(p||T||R){if(D=T?`
|
|
113
113
|
`:"",R){let x=c(R);D+=`
|
|
114
|
-
${
|
|
114
|
+
${ze(x,n.indent)}`}$===""&&!n.inFlow?D===`
|
|
115
115
|
`&&b&&(D=`
|
|
116
116
|
|
|
117
117
|
`):D+=`
|
|
118
|
-
${n.indent}`}else if(!m&&
|
|
119
|
-
`),w=v!==-1,
|
|
118
|
+
${n.indent}`}else if(!m&&W(t)){let x=$[0],v=$.indexOf(`
|
|
119
|
+
`),w=v!==-1,Pe=n.inFlow??t.flow??t.items.length===0;if(w||!Pe){let ye=!1;if(w&&(x==="&"||x==="!")){let Y=$.indexOf(" ");x==="&"&&Y!==-1&&Y<v&&$[Y+1]==="!"&&(Y=$.indexOf(" ",Y+1)),(Y===-1||v<Y)&&(ye=!0)}ye||(D=`
|
|
120
120
|
${n.indent}`)}}else($===""||$[0]===`
|
|
121
|
-
`)&&(D="");return y+=D+$,n.inFlow?O&&r&&r():b&&!O?y+=
|
|
121
|
+
`)&&(D="");return y+=D+$,n.inFlow?O&&r&&r():b&&!O?y+=wt(y,n.indent,c(b)):f&&s&&s(),y}function nc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var $i="<<",tt={identify:e=>e===$i||typeof e=="symbol"&&e.description===$i,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new E(Symbol($i)),{addToJSMap:sc}),stringify:()=>$i},Vf=(e,t)=>(tt.identify(t)||_(t)&&(!t.type||t.type===E.PLAIN)&&tt.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===tt.tag&&n.default);function sc(e,t,n){let r=Kf(e,n);if(et(r))for(let s of r.items)rc(e,t,s);else if(Array.isArray(r))for(let s of r)rc(e,t,s);else rc(e,t,r)}function rc(e,t,n){let r=Kf(e,n);if(!Ze(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,e,Map);for(let[i,o]of s)t instanceof Map?t.has(i)||t.set(i,o):t instanceof Set?t.add(i):Object.prototype.hasOwnProperty.call(t,i)||Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return t}function Kf(e,t){return e&&Fe(t)?t.resolve(e.doc,e):t}function Di(e,t,{key:n,value:r}){if(j(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Vf(e,n))sc(e,t,r);else{let s=le(n,"",e);if(t instanceof Map)t.set(s,le(r,s,e));else if(t instanceof Set)t.add(s);else{let i=tS(n,s,e),o=le(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function tS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(j(e)&&n?.doc){let r=Oi(n.doc,{});r.anchors=new Set;for(let i of n.anchors.keys())r.anchors.add(i.anchor);r.inFlow=!0,r.inStringifyKey=!0;let s=e.toString(r);if(!n.mapKeyWarned){let i=JSON.stringify(s);i.length>40&&(i=i.substring(0,36)+'..."'),nc(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 ur(e,t,n){let r=Nt(e,void 0,n),s=Nt(t,void 0,n);return new Q(r,s)}var Q=class e{constructor(t,n=null){Object.defineProperty(this,Ie,{value:Jl}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return j(n)&&(n=n.clone(t)),j(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return Di(n,r,this)}toString(t,n,r){return t?.doc?Bf(this,t,n,r):JSON.stringify(this)}};function _i(e,t,n){return(t.inFlow??e.flow?rS:nS)(e,t,n)}function nS({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,d=Object.assign({},n,{indent:i,type:null}),u=!1,p=[];for(let h=0;h<t.length;++h){let f=t[h],y=null;if(j(f))!u&&f.spaceBefore&&p.push(""),Ni(n,p,f.commentBefore,u),f.comment&&(y=f.comment);else if(M(f)){let R=j(f.key)?f.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Ni(n,p,R.commentBefore,u))}u=!1;let T=_t(f,d,()=>y=null,()=>u=!0);y&&(T+=wt(T,i,c(y))),u&&y&&(u=!1),p.push(r+T)}let m;if(p.length===0)m=s.start+s.end;else{m=p[0];for(let h=1;h<p.length;++h){let f=p[h];m+=f?`
|
|
122
122
|
${l}${f}`:`
|
|
123
123
|
`}}return e?(m+=`
|
|
124
|
-
`+
|
|
125
|
-
`)),h<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=
|
|
124
|
+
`+ze(c(e),l),a&&a()):u&&o&&o(),m}function rS({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,d=0,u=[];for(let h=0;h<e.length;++h){let f=e[h],y=null;if(j(f))f.spaceBefore&&u.push(""),Ni(t,u,f.commentBefore,!1),f.comment&&(y=f.comment);else if(M(f)){let R=j(f.key)?f.key:null;R&&(R.spaceBefore&&u.push(""),Ni(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=j(f.value)?f.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):f.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=_t(f,l,()=>y=null);c||(c=u.length>d||T.includes(`
|
|
125
|
+
`)),h<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=wt(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:m}=n;if(u.length===0)return p+m;if(!c){let h=u.reduce((f,y)=>f+y.length+2,2);c=t.options.lineWidth>0&&h>t.options.lineWidth}if(c){let h=p;for(let f of u)h+=f?`
|
|
126
126
|
${i}${s}${f}`:`
|
|
127
127
|
`;return`${h}
|
|
128
|
-
${s}${m}`}else return`${p}${o}${u.join(" ")}${o}${m}`}function
|
|
129
|
-
`:" ")}return
|
|
128
|
+
${s}${m}`}else return`${p}${o}${u.join(" ")}${o}${m}`}function Ni({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=ze(t(r),e);n.push(i.trimStart())}}function Qt(e,t){let n=_(t)?t.value:t;for(let r of e)if(M(r)&&(r.key===t||r.key===n||_(r.key)&&r.key.value===n))return r}var te=class extends ar{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(Qe,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(ur(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 Q(t,t?.value):r=new Q(t.key,t.value);let s=Qt(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);_(s.value)&&Ii(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=Qt(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=Qt(this.items,t)?.value;return(!n&&_(s)?s.value:s)??void 0}has(t){return!!Qt(this.items,t)}set(t,n){this.add(new Q(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)Di(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!M(s))throw new Error(`Map items must all be pairs; found ${JSON.stringify(s)} instead`);return!t.allNullValues&&this.hasAllNullValues(!1)&&(t=Object.assign({},t,{allNullValues:!0})),_i(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var nt={collection:"map",default:!0,nodeClass:te,tag:"tag:yaml.org,2002:map",resolve(e,t){return Ze(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>te.from(e,t,n)};var be=class extends ar{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super($t,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=xi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=xi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&_(s)?s.value:s}has(t){let n=xi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=xi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];_(s)&&Ii(n)?s.value=n:this.items[r]=n}toJSON(t,n){let r=[];n?.onCreate&&n.onCreate(r);let s=0;for(let i of this.items)r.push(le(i,String(s++),n));return r}toString(t,n,r){return t?_i(this,t,{blockItemPrefix:"- ",flowChars:{start:"[",end:"]"},itemIndent:(t.indent||"")+" ",onChompKeep:r,onComment:n}):JSON.stringify(this)}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n)){let o=0;for(let a of n){if(typeof s=="function"){let l=n instanceof Set?a:String(o++);a=s.call(n,l,a)}i.items.push(Nt(a,void 0,r))}}return i}};function xi(e){let t=_(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var rt={collection:"seq",default:!0,nodeClass:be,tag:"tag:yaml.org,2002:seq",resolve(e,t){return et(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>be.from(e,t,n)};var Zt={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),vn(e,t,n,r)}};var Cn={identify:e=>e==null,createNode:()=>new E(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new E(null),stringify:({source:e},t)=>typeof e=="string"&&Cn.test.test(e)?e:t.options.nullStr};var ss={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new E(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&ss.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 Fi={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},Li={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)}},Mi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new E(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:Re};var ji=e=>typeof e=="bigint"||Number.isInteger(e),ic=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function Gf(e,t,n){let{value:r}=e;return ji(r)&&r>=0?n+r.toString(t):Re(e)}var qi={identify:e=>ji(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>ic(e,2,8,n),stringify:e=>Gf(e,8,"0o")},Ui={identify:ji,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>ic(e,0,10,n),stringify:Re},Wi={identify:e=>ji(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>ic(e,2,16,n),stringify:e=>Gf(e,16,"0x")};var Hf=[nt,rt,Zt,Cn,ss,qi,Ui,Wi,Fi,Li,Mi];function Yf(e){return typeof e=="bigint"||Number.isInteger(e)}var Bi=({value:e})=>JSON.stringify(e),sS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:Bi},{identify:e=>e==null,createNode:()=>new E(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Bi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:Bi},{identify:Yf,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})=>Yf(e)?e.toString():JSON.stringify(e)},{identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:e=>parseFloat(e),stringify:Bi}],iS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},zf=[nt,rt].concat(sS,iS);var is={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=E.BLOCK_LITERAL),t!==E.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),d=new Array(c);for(let u=0,p=0;u<c;++u,p+=l)d[u]=a.substr(p,l);a=d.join(t===E.BLOCK_LITERAL?`
|
|
129
|
+
`:" ")}return vn({comment:e,type:t,value:a},r,s,i)}};function oc(e,t){if(et(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!M(r)){if(Ze(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new Q(new E(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 Q(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(ur(a,l,n))}return s}var os={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:oc,createNode:ac};var dr=class e extends be{constructor(){super(),this.add=te.prototype.add.bind(this),this.delete=te.prototype.delete.bind(this),this.get=te.prototype.get.bind(this),this.has=te.prototype.has.bind(this),this.set=te.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(M(s)?(i=le(s.key,"",n),o=le(s.value,i,n)):i=le(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=ac(t,n,r),i=new this;return i.items=s.items,i}};dr.tag="tag:yaml.org,2002:omap";var as={collection:"seq",identify:e=>e instanceof Map,nodeClass:dr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=oc(e,t),r=[];for(let{key:s}of n.items)_(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new dr,n)},createNode:(e,t,n)=>dr.from(e,t,n)};function Jf({value:e,source:t},n){return t&&(e?lc:cc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var lc={identify:e=>e===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new E(!0),stringify:Jf},cc={identify:e=>e===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new E(!1),stringify:Jf};var Xf={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},Qf={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)}},Zf={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new E(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:Re};var ls=e=>typeof e=="bigint"||Number.isInteger(e);function Vi(e,t,n,{intAsBigInt:r}){let s=e[0];if((s==="-"||s==="+")&&(t+=1),e=e.substring(t).replace(/_/g,""),r){switch(n){case 2:e=`0b${e}`;break;case 8:e=`0o${e}`;break;case 16:e=`0x${e}`;break}let o=BigInt(e);return s==="-"?BigInt(-1)*o:o}let i=parseInt(e,n);return s==="-"?-1*i:i}function uc(e,t,n){let{value:r}=e;if(ls(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Re(e)}var em={identify:ls,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>Vi(e,2,2,n),stringify:e=>uc(e,2,"0b")},tm={identify:ls,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>Vi(e,1,8,n),stringify:e=>uc(e,8,"0")},nm={identify:ls,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>Vi(e,0,10,n),stringify:Re},rm={identify:ls,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>Vi(e,2,16,n),stringify:e=>uc(e,16,"0x")};var pr=class e extends te{constructor(t){super(t),this.tag=e.tag}add(t){let n;M(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new Q(t.key,null):n=new Q(t,null),Qt(this.items,n.key)||this.items.push(n)}get(t,n){let r=Qt(this.items,t);return!n&&M(r)?_(r.key)?r.key.value:r.key:r}set(t,n){if(typeof n!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof n}`);let r=Qt(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new Q(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(ur(o,null,r));return i}};pr.tag="tag:yaml.org,2002:set";var cs={collection:"map",identify:e=>e instanceof Set,nodeClass:pr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>pr.from(e,t,n),resolve(e,t){if(Ze(e)){if(e.hasAllNullValues(!0))return Object.assign(new pr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function dc(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 sm(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 Ki={identify:e=>typeof e=="bigint"||Number.isInteger(e),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(e,t,{intAsBigInt:n})=>dc(e,n),stringify:sm},Gi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:e=>dc(e,!1),stringify:sm},fr={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(fr.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=dc(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 pc=[nt,rt,Zt,Cn,lc,cc,em,tm,nm,rm,Xf,Qf,Zf,is,tt,as,os,cs,Ki,Gi,fr];var im=new Map([["core",Hf],["failsafe",[nt,rt,Zt]],["json",zf],["yaml11",pc],["yaml-1.1",pc]]),om={binary:is,bool:ss,float:Mi,floatExp:Li,floatNaN:Fi,floatTime:Gi,int:Ui,intHex:Wi,intOct:qi,intTime:Ki,map:nt,merge:tt,null:Cn,omap:as,pairs:os,seq:rt,set:cs,timestamp:fr},am={"tag:yaml.org,2002:binary":is,"tag:yaml.org,2002:merge":tt,"tag:yaml.org,2002:omap":as,"tag:yaml.org,2002:pairs":os,"tag:yaml.org,2002:set":cs,"tag:yaml.org,2002:timestamp":fr};function Hi(e,t,n){let r=im.get(t);if(r&&!e)return n&&!r.includes(tt)?r.concat(tt):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(im.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${t}"; use one of ${i} or define customTags array`)}if(Array.isArray(e))for(let i of e)s=s.concat(i);else typeof e=="function"&&(s=e(s.slice()));return n&&(s=s.concat(tt)),s.reduce((i,o)=>{let a=typeof o=="string"?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 oS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,us=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?Hi(t,"compat"):t?Hi(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?am:{},this.tags=Hi(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,Qe,{value:nt}),Object.defineProperty(this,xe,{value:Zt}),Object.defineProperty(this,$t,{value:rt}),this.sortMapEntries=typeof o=="function"?o:o===!0?oS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function lm(e,t){let n=[],r=t.directives===!0;if(t.directives!==!1&&e.directives){let l=e.directives.toString(e);l?(n.push(l),r=!0):e.directives.docStart&&(r=!0)}r&&n.push("---");let s=Oi(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(ze(l,""))}let o=!1,a=null;if(e.contents){if(j(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let d=i(e.contents.commentBefore);n.push(ze(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=_t(e.contents,s,()=>a=null,l);a&&(c+=wt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(_t(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
|
|
132
|
+
`)?(n.push("..."),n.push(ze(l,""))):n.push(`... ${l}`)}else n.push("...");else{let l=e.comment;l&&o&&(l=l.replace(/^\n+/,"")),l&&((!o||a)&&n[n.length-1]!==""&&n.push(""),n.push(ze(i(l),"")))}return n.join(`
|
|
133
133
|
`)+`
|
|
134
|
-
`}var
|
|
134
|
+
`}var en=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ie,{value:Ti});let s=null;typeof n=="function"||Array.isArray(n)?s=n:r===void 0&&n&&(r=n,n=void 0);let i=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},r);this.options=i;let{version:o}=i;r?._directives?(this.directives=r._directives.atDocument(),this.directives.yaml.explicit&&(o=this.directives.yaml.version)):this.directives=new yt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Ie]:{value:Ti}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=j(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){mr(this.contents)&&this.contents.add(t)}addIn(t,n){mr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=Xl(this);t.anchor=!n||r.has(n)?Ql(n||"a",r):n}return new Dt(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:d}=r??{},{onAnchor:u,setAnchors:p,sourceObjects:m}=qf(this,o||"a"),h={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:m},f=Nt(t,d,h);return a&&W(f)&&(f.flow=!0),p(),f}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new Q(s,i)}delete(t){return mr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return lr(t)?this.contents==null?!1:(this.contents=null,!0):mr(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 lr(t)?!n&&_(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 lr(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=es(this.schema,[t],n):mr(this.contents)&&this.contents.set(t,n)}setIn(t,n){lr(t)?this.contents=n:this.contents==null?this.contents=es(this.schema,Array.from(t),n):mr(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 yt({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 yt({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 us(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"?Jt(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return lm(this,t)}};function mr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ds=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},st=class extends ds{constructor(t,n,r){super("YAMLParseError",t,n,r)}},ps=class extends ds{constructor(t,n,r){super("YAMLWarning",t,n,r)}},fc=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>t.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
|
|
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
|
-
`+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||
|
|
142
|
-
`+b.comment:R.comment=b.comment);let O=new
|
|
143
|
-
`+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&
|
|
144
|
-
`+x:v.comment=x,D.comment=D.comment.substring(x.length+1)}}if(!o&&!O&&!D.found){let x=$?e(n,$,D,s):t(n,D.end,O,null,D,s);c.items.push(x),u=x.range[2],
|
|
145
|
-
`+w.comment:v.comment=w.comment);let
|
|
146
|
-
`+y.comment:c.comment=y.comment),c.range=[r.offset,f,y.offset]}else c.range=[r.offset,f,f];return c}function
|
|
139
|
+
`}};function kt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",m=!1,h=!1,f=null,y=null,T=null,R=null,b=null,O=null,$=null;for(let v of e)switch(h&&(v.type!=="space"&&v.type!=="newline"&&v.type!=="comma"&&i(v.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),h=!1),f&&(c&&v.type!=="comment"&&v.type!=="newline"&&i(f,"TAB_AS_INDENT","Tabs are not allowed as indentation"),f=null),v.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&v.source.includes(" ")&&(f=v),d=!0;break;case"comment":{d||i(v,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=v.source.substring(1)||" ";u?u+=p+w:u=w,p="",c=!1;break}case"newline":c?u?u+=v.source:(!O||n!=="seq-item-ind")&&(l=!0):p+=v.source,c=!0,m=!0,(y||T)&&(R=v),d=!0;break;case"anchor":y&&i(v,"MULTIPLE_ANCHORS","A node can have at most one anchor"),v.source.endsWith(":")&&i(v.offset+v.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=v,$??($=v.offset),c=!1,d=!1,h=!0;break;case"tag":{T&&i(v,"MULTIPLE_TAGS","A node can have at most one tag"),T=v,$??($=v.offset),c=!1,d=!1,h=!0;break}case n:(y||T)&&i(v,"BAD_PROP_ORDER",`Anchors and tags must be after the ${v.source} indicator`),O&&i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.source} in ${t??"collection"}`),O=v,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(v,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=v,c=!1,d=!1;break}default:i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.type} token`),c=!1,d=!1}let D=e[e.length-1],x=D?D.offset+D.source.length:s;return h&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f&&(c&&f.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(f,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:O,spaceBefore:l,comment:u,hasNewline:m,anchor:y,tag:T,newlineAfterProp:R,end:x,start:$??x}}function tn(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(tn(t.key)||tn(t.value))return!0}return!1;default:return!0}}function fs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&tn(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function Yi(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||_(i)&&_(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var cm="All mapping items must start at the same column";function um({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:m,value:h}=d,f=kt(u,{indicator:"explicit-key-ind",next:p??m?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!f.found;if(y){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",cm)),!f.anchor&&!f.tag&&!m){c=f.end,f.comment&&(a.comment?a.comment+=`
|
|
141
|
+
`+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||tn(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else f.found?.indent!==r.indent&&s(l,"BAD_INDENT",cm);n.atKey=!0;let T=f.end,R=p?e(n,p,f,s):t(n,T,u,null,f,s);n.schema.compat&&fs(r.indent,p,s),n.atKey=!1,Yi(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=kt(m??[],{indicator:"map-value-ind",next:h,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(h?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&f.start<b.found.offset-1024&&s(R.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));let O=h?e(n,h,b,s):t(n,l,m,null,b,s);n.schema.compat&&fs(r.indent,h,s),l=O.range[2];let $=new Q(R,O);n.options.keepSourceTokens&&($.srcToken=d),a.items.push($)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),b.comment&&(R.comment?R.comment+=`
|
|
142
|
+
`+b.comment:R.comment=b.comment);let O=new Q(R);n.options.keepSourceTokens&&(O.srcToken=d),a.items.push(O)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function dm({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=kt(d,{indicator:"seq-item-ind",next:u,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||u)u?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let m=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&fs(r.indent,u,s),l=m.range[2],a.items.push(m)}return a.range=[r.offset,l,c??l],a}function Tt(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 mc="Block collections are not allowed within flow collections",hc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function pm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?te: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:O,value:$}=T,D=kt(R,{flow:a,indicator:"explicit-key-ind",next:b??O?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!O&&!$){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
|
|
143
|
+
`+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&tn(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let x="";e:for(let v of R)switch(v.type){case"comma":case"space":break;case"comment":x=v.source.substring(1);break e;default:break e}if(x){let v=c.items[c.items.length-1];M(v)&&(v=v.value??v.key),v.comment?v.comment+=`
|
|
144
|
+
`+x:v.comment=x,D.comment=D.comment.substring(x.length+1)}}if(!o&&!O&&!D.found){let x=$?e(n,$,D,s):t(n,D.end,O,null,D,s);c.items.push(x),u=x.range[2],hc($)&&s(x.range,"BLOCK_IN_FLOW",mc)}else{n.atKey=!0;let x=D.end,v=b?e(n,b,D,s):t(n,x,R,null,D,s);hc(b)&&s(v.range,"BLOCK_IN_FLOW",mc),n.atKey=!1;let w=kt(O??[],{flow:a,indicator:"map-value-ind",next:$,offset:v.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if(O)for(let Y of O){if(Y===w.found)break;if(Y.type==="newline"){s(Y,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else $&&("source"in $&&$.source?.[0]===":"?s($,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Pe=$?e(n,$,w,s):w.found?t(n,w.end,O,null,w,s):null;Pe?hc($)&&s(Pe.range,"BLOCK_IN_FLOW",mc):w.comment&&(v.comment?v.comment+=`
|
|
145
|
+
`+w.comment:v.comment=w.comment);let ye=new Q(v,Pe);if(n.options.keepSourceTokens&&(ye.srcToken=T),o){let Y=c;Yi(n,Y.items,v)&&s(x,"DUPLICATE_KEY","Map keys must be unique"),Y.items.push(ye)}else{let Y=new te(n.schema);Y.flow=!0,Y.items.push(ye);let hn=(Pe??v).range;Y.range=[v.range[0],hn[1],hn[2]],c.items.push(Y)}u=Pe?Pe.range[2]:w.end}}let p=o?"}":"]",[m,...h]=r.end,f=u;if(m?.source===p)f=m.offset+m.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),m&&m.source.length!==1&&h.unshift(m)}if(h.length>0){let y=Tt(h,f,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
|
|
146
|
+
`+y.comment:c.comment=y.comment),c.range=[r.offset,f,y.offset]}else c.range=[r.offset,f,f];return c}function gc(e,t,n,r,s,i){let o=n.type==="block-map"?um(e,t,n,r,i):n.type==="block-seq"?dm(e,t,n,r,i):pm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function fm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:m}=r,h=p&&i?p.offset>i.offset?p:i:p??i;h&&(!m||m.offset<h.offset)&&s(h,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===te.tagName&&a==="map"||o===be.tagName&&a==="seq")return gc(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),gc(e,t,n,s,o)}let c=gc(e,t,n,s,o,l),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=j(d)?d:new E(d);return u.range=c.range,u.tag=o,l?.format&&(u.format=l.format),u}function yc(e,t,n){let r=t.offset,s=aS(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?E.BLOCK_FOLDED:E.BLOCK_LITERAL,o=t.source?lS(t.source):[],a=o.length;for(let f=o.length-1;f>=0;--f){let y=o[f][1];if(y===""||y==="\r")a=f;else break}if(a===0){let f=s.chomp==="+"&&o.length>0?`
|
|
147
147
|
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:f,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let f=0;f<a;++f){let[y,T]=o[f];if(T===""||T==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),d=f,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+T.length+1}for(let f=o.length-1;f>=a;--f)o[f][0].length>l&&(a=f+1);let u="",p="",m=!1;for(let f=0;f<d;++f)u+=o[f][0].slice(l)+`
|
|
148
148
|
`;for(let f=d;f<a;++f){let[y,T]=o[f];c+=y.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&y.length<l){let O=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",O),y=""}i===E.BLOCK_LITERAL?(u+=p+y.slice(l)+T,p=`
|
|
149
149
|
`):y.length>l||T[0]===" "?(p===" "?p=`
|
|
@@ -158,63 +158,65 @@ ${c}
|
|
|
158
158
|
`+o[f][0].slice(l);u[u.length-1]!==`
|
|
159
159
|
`&&(u+=`
|
|
160
160
|
`);break;default:u+=`
|
|
161
|
-
`}let h=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,h,h]}}function
|
|
161
|
+
`}let h=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,h,h]}}function aS({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let m=s[p];if(!a&&(m==="-"||m==="+"))a=m;else{let h=Number(m);!o&&h?o=h:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let m=t[p];switch(m.type){case"space":c=!0;case"newline":u+=m.source.length;break;case"comment":n&&!c&&r(m,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=m.source.length,d=m.source.substring(1);break;case"error":r(m,"UNEXPECTED_TOKEN",m.message),u+=m.source.length;break;default:{let h=`Unexpected token in block scalar header: ${m.type}`;r(m,"UNEXPECTED_TOKEN",h);let f=m.source;f&&typeof f=="string"&&(u+=f.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function lS(e){let t=e.split(/\n( *)/),n=t[0],r=n.match(/^( *)/),i=[r?.[1]?[r[1],n.slice(r[1].length)]:["",n]];for(let o=1;o<t.length;o+=2)i.push([t[o],t[o+1]]);return i}function wc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,m,h)=>n(r+p,m,h);switch(s){case"scalar":a=E.PLAIN,l=cS(i,c);break;case"single-quoted-scalar":a=E.QUOTE_SINGLE,l=uS(i,c);break;case"double-quoted-scalar":a=E.QUOTE_DOUBLE,l=dS(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=Tt(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function cS(e,t){let n="";switch(e[0]){case" ":n="a tab character";break;case",":n="flow indicator character ,";break;case"%":n="directive indicator character %";break;case"|":case">":{n=`block scalar indicator ${e[0]}`;break}case"@":case"`":{n=`reserved character ${e[0]}`;break}}return n&&t(0,"BAD_SCALAR_START",`Plain value cannot start with ${n}`),mm(e)}function uS(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 dS(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}=pS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=fS[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+=mS(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
|
|
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 pS(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 fS={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
|
|
176
|
+
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function mS(e,t,n,r){let s=e.substr(t,n),o=s.length===n&&/^[0-9a-fA-F]+$/.test(s)?parseInt(s,16):NaN;try{return String.fromCodePoint(o)}catch{let a=e.substr(t-2,n+2);return r(t-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),a}}function kc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?yc(e,t,r):wc(t,e.options.strict,r),l=n?e.directives.tagName(n.source,u=>r(n,"TAG_RESOLVE_FAILED",u)):null,c;e.options.stringKeys&&e.atKey?c=e.schema[xe]:l?c=hS(e.schema,s,l,n,r):t.type==="scalar"?c=gS(e,s,t,r):c=e.schema[xe];let d;try{let u=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);d=_(u)?u:new E(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new E(s)}return d.range=a,d.source=s,i&&(d.type=i),l&&(d.tag=l),c.format&&(d.format=c.format),o&&(d.comment=o),d}function hS(e,t,n,r,s){if(n==="!")return e[xe];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[xe])}function gS({atKey:e,directives:t,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||e&&a.default==="key")&&a.test?.test(r))||n[xe];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[xe];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 hm(e,t,n){if(t){n??(n=t.length);for(let r=n-1;r>=0;--r){let s=t[r];switch(s.type){case"space":case"comment":case"newline":e-=s.source.length;continue}for(s=t[++r];s?.type==="space";)e+=s.source.length,s=t[++r];break}}return e}var yS={composeNode:Tc,composeEmptyNode:zi};function Tc(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=wS(e,t,r),(a||l)&&r(t,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":c=kc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=fm(yS,e,t,n,r),a&&(c.anchor=a.source.substring(1))}catch(u){let p=u instanceof Error?u.message:String(u);r(t,"RESOURCE_EXHAUSTION",p)}break;default:{let u=t.type==="error"?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",u),d=!1}}return c??(c=zi(e,t.offset,void 0,null,n,r)),a&&c.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&e.options.stringKeys&&(!_(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&r(l??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(c.spaceBefore=!0),o&&(t.type==="scalar"&&t.source===""?c.comment=o:c.commentBefore=o),e.options.keepSourceTokens&&d&&(c.srcToken=t),c}function zi(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:hm(t,n,r),indent:-1,source:""},u=kc(e,d,a,c);return o&&(u.anchor=o.source.substring(1),u.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(u.spaceBefore=!0),i&&(u.comment=i,u.range[2]=l),u}function wS({options:e},{offset:t,source:n,end:r},s){let i=new Dt(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=Tt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function gm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new en(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=kt(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?Tc(c,s,d,o):zi(c,d.end,r,null,d,o);let u=l.contents.range[2],p=Tt(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function ms(e){if(typeof e=="number")return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n=="string"?n.length:1)]}function ym(e){let t="",n=!1,r=!1;for(let s=0;s<e.length;++s){let i=e[s];switch(i[0]){case"#":t+=(t===""?"":r?`
|
|
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
|
|
180
|
-
${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(
|
|
179
|
+
`)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var hs=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=ms(n);i?this.warnings.push(new ps(o,r,s)):this.errors.push(new st(o,r,s))},this.directives=new yt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=ym(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
|
|
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 st(
|
|
182
|
+
${o}`:r}}if(n){for(let i=0;i<this.errors.length;++i)t.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)t.warnings.push(this.warnings[i])}else t.errors=this.errors,t.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:ym(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=ms(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=gm(this.options,this.directives,t,this.onError);this.atDirectives&&!n.directives.docStart&&this.onError(t,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(n,!1),this.doc&&(yield this.doc),this.doc=n,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(t.source);break;case"error":{let n=t.source?`${t.message}: ${JSON.stringify(t.source)}`:t.message,r=new st(ms(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new st(ms(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Tt(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
|
|
183
|
+
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new st(ms(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 en(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"),kS=Symbol("skip children"),wm=Symbol("remove item");function An(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),km(Object.freeze([]),e,t)}An.BREAK=bc;An.SKIP=kS;An.REMOVE=wm;An.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};An.parentCollection=(e,t)=>{let n=An.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],s=n?.[r];if(s&&"items"in s)return s;throw new Error("Parent collection not found")};function km(e,t,n){let r=n(t,e);if(typeof r=="symbol")return r;for(let s of["key","value"]){let i=t[s];if(i&&"items"in i){for(let o=0;o<i.items.length;++o){let a=km(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===bc)return bc;a===wm&&(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 Rc="\uFEFF",Sc="",Pc="",Ji="";function Tm(e){switch(e){case Rc:return"byte-order-mark";case Sc:return"doc-mode";case Pc:return"flow-error-end";case Ji:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
|
|
184
184
|
`:case`\r
|
|
185
185
|
`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function it(e){switch(e){case void 0:case" ":case`
|
|
186
|
-
`:case"\r":case" ":return!0;default:return!1}}var
|
|
187
|
-
\r `),
|
|
186
|
+
`:case"\r":case" ":return!0;default:return!1}}var bm=new Set("0123456789ABCDEFabcdef"),bS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Xi=new Set(",[]{}"),RS=new Set(` ,[]{}
|
|
187
|
+
\r `),Ic=e=>!e||RS.has(e),gs=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
|
|
188
188
|
`?!0:n==="\r"?this.buffer[t+1]===`
|
|
189
189
|
`:!1}charAt(t){return this.buffer[this.pos+t]}continueScalar(t){let n=this.buffer[t];if(this.indentNext>0){let r=0;for(;n===" ";)n=this.buffer[++r+t];if(n==="\r"){let s=this.buffer[r+t+1];if(s===`
|
|
190
190
|
`||!s&&!this.atEnd)return t+r+1}return n===`
|
|
191
191
|
`||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&it(this.buffer[t+3]))return-1}return t}getLine(){let t=this.lineEndPos;return(typeof t!="number"||t!==-1&&t<this.pos)&&(t=this.buffer.indexOf(`
|
|
192
|
-
`,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===
|
|
192
|
+
`,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===Rc&&(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 Sc,yield*this.parseLineStart()}*parseLineStart(){let t=this.charAt(0);if(!t&&!this.atEnd)return this.setNext("line-start");if(t==="-"||t==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");let n=this.peek(3);if((n==="---"||n==="...")&&it(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,n==="---"?"doc":"stream"}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!it(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[t,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((t==="-"||t==="?"||t===":")&&it(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let t=this.getLine();if(t===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(t[n]){case"#":yield*this.pushCount(t.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(Ic),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(t.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let t,n,r=-1;do t=yield*this.pushNewline(),t>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(t+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r<this.indentNext&&s[0]!=="#"||r===0&&(s.startsWith("---")||s.startsWith("..."))&&it(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Pc,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(Ic),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||it(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
|
|
193
193
|
`,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
|
|
194
194
|
`,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>it(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
|
|
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 Ji,yield*this.pushToIndex(t+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let t=this.flowLevel>0,n=this.pos-1,r=this.pos-1,s;for(;s=this.buffer[++r];)if(s===":"){let i=this.buffer[r+1];if(it(i)||t&&Xi.has(i))break;n=r}else if(it(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
|
|
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&&Xi.has(i))break;if(s===`
|
|
202
|
+
`){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&Xi.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield Ji,yield*this.pushToIndex(n+1,!0),t?"flow":"doc")}*pushCount(t){return t>0?(yield this.buffer.substr(this.pos,t),this.pos+=t,t):0}*pushToIndex(t,n){let r=this.buffer.slice(this.pos,t);return r?(yield r,this.pos+=r.length,r.length):(n&&(yield""),0)}*pushIndicators(){let t=0;e:for(;;){switch(this.charAt(0)){case"!":t+=yield*this.pushTag(),t+=yield*this.pushSpaces(!0);continue e;case"&":t+=yield*this.pushUntil(Ic),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(it(r)||n&&Xi.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,t+=yield*this.pushCount(1),t+=yield*this.pushSpaces(!0);continue e}}}break e}return t}*pushTag(){if(this.charAt(1)==="<"){let t=this.pos+2,n=this.buffer[t];for(;!it(n)&&n!==">";)n=this.buffer[++t];return yield*this.pushToIndex(n===">"?t+1:t,!1)}else{let t=this.pos+1,n=this.buffer[t];for(;n;)if(bS.has(n))n=this.buffer[++t];else if(n==="%"&&bm.has(this.buffer[t+1])&&bm.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 ys=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 nn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Rm(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 Pm(e){switch(e?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return!0;default:return!1}}function Qi(e){switch(e.type){case"document":return e.start;case"block-map":{let t=e.items[e.items.length-1];return t.sep??t.start}case"block-seq":return e.items[e.items.length-1].start;default:return[]}}function hr(e){if(e.length===0)return[];let t=e.length;e:for(;--t>=0;)switch(e[t].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;e[++t]?.type==="space";);return e.splice(t,e.length)}function Zi(e,t){if(t.length<1e5)Array.prototype.push.apply(e,t);else for(let n=0;n<t.length;++n)e.push(t[n])}function Sm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!nn(t.start,"explicit-key-ind")&&!nn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Pm(t.value)?t.value.end?Zi(t.value.end,t.sep):t.value.end=t.sep:Zi(t.start,t.sep),delete t.sep)}var ws=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 gs,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=Tm(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"&&Sm(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&&Rm(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":{Rm(t.start)!==-1?(yield*this.pop(),yield*this.step()):t.start.push(this.sourceToken);return}case"anchor":case"tag":case"space":case"comment":case"newline":t.start.push(this.sourceToken);return}let n=this.startBlockValue(t);n?this.stack.push(n):yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}*scalar(t){if(this.type==="map-value-ind"){let n=Qi(this.peek(2)),r=hr(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)){Zi(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(nn(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(Pm(n.key)&&!nn(n.sep,"newline")){let o=hr(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(nn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=hr(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]}):nn(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&&!nn(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){Zi(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||nn(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){let r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){let n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}let r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=Qi(r),i=hr(s);Sm(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=Zi(t),r=mr(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=Zi(t),r=mr(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 gS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new gs||null,prettyErrors:t}}function Ic(e,t={}){let{lineCounter:n,prettyErrors:r}=gS(t),s=new ys(n?.addNewLine),i=new ms(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new st(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(pc(e,n)),o.warnings.forEach(pc(e,n))),o}var ws=1024*1024;function vc(e,t){Buffer.byteLength(e)>ws&&to(t,[`Definition exceeds ${ws} bytes.`]);let n=Ic(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];He(n,(i,o)=>{_e(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&to(t,s),n.contents===null&&to(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){to(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function to(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}import{createHash as wS}from"node:crypto";var hr=/^[a-z][a-z0-9_-]{0,63}$/,bm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Rm=32,Sm=128,kS=16,TS=32,bS=10080*60*1e3,gr=32*1024,Pm=16;function Ec(e,t){let n=[],r=xe(e,"$",n);ot(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=DS(r.name,"$.name",n),i=SS(r.limits,n),o=PS(r.inputs,n),a=IS(r.steps,n);a.length>Sm&&n.push(`$.steps may contain at most ${Sm} 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&&ES(a,o,c.ancestors,n),n.length>0&&xS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:wS("sha256").update(Ac(d)).digest("hex"),order:c.order,waves:RS(c.waves,i.maxConcurrency)}}function RS(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 SS(e,t){let n=xe(e,"$.limits",t);ot(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Im(n.max_concurrency,"$.limits.max_concurrency",1,kS,t),s=Im(n.max_tasks,"$.limits.max_tasks",1,TS,t),i=Am(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function PS(e,t){if(e===void 0)return{};let n=xe(e,"$.inputs",t),r=Object.entries(n);r.length>Rm&&t.push(`$.inputs may contain at most ${Rm} inputs.`);let s={};for(let[i,o]of r){hr.test(i)||t.push(`$.inputs key "${i}" must match ${hr}.`);let a=xe(o,`$.inputs.${i}`,t);ot(a,["type","required","default"],`$.inputs.${i}`,t);let l=_S(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:NS(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&&!vm(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&vm(a.default,l)?{defaultValue:a.default}:{}}}return s}function IS(e,t){let n=xe(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{hr.test(s)||t.push(`$.steps key "${s}" must match ${hr}.`);let o=xe(i,`$.steps.${s}`,t),a=Cm(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?CS(s,o,a,t):vS(s,o,a,t)})}function vS(e,t,n,r){ot(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?_t(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=xe(t.create_child,`$.steps.${e}.create_child`,r);ot(u,["repo","workspace"],`$.steps.${e}.create_child`,r),u.repo!==void 0&&u.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...u.repo!==void 0?{repo:_t(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:_t(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=xe(t.agent,`$.steps.${e}.agent`,r);if(ot(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(_t(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=_t(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>gr&&r.push(`$.steps.${e}.prompt exceeds ${gr} bytes.`);let d;if(t.output!==void 0){let u=xe(t.output,`$.steps.${e}.output`,r);ot(u,["schema"],`$.steps.${e}.output`,r),d=Cc(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 CS(e,t,n,r){ot(t,["needs","human_review"],`$.steps.${e}`,r);let s=xe(t.human_review,`$.steps.${e}.human_review`,r);ot(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=xe(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ot(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=_t(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:_t(s.title,`$.steps.${e}.human_review.title`,r),summary:_t(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:Am(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Cc(e,t,n,r){if(r>Pm)return n.push(`${t} exceeds the maximum schema depth of ${Pm}.`),{};let s=xe(e,t,n);ot(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&Cm(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=xe(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Cc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Cc(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((m,h)=>r.get(m)-r.get(h));let u=o;l.push(u),a.push(...u);let p=[];for(let m of u)for(let h of i.get(m)??[]){let f=s.get(h)-1;s.set(h,f),f===0&&p.push(h)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let m of c.get(u).needs){p.add(m);for(let h of d.get(m)??[])p.add(h)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function ES(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(bm)],c=a.replace(bm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)OS(d[1].trim(),i,t,n,s,r)}}}function OS(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&&$S(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function $S(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(!no(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(!no(a))return;i=a}}function Ac(e){return Array.isArray(e)?`[${e.map(Ac).join(",")}]`:no(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ac(e[t])}`).join(",")}}`:JSON.stringify(e)}function xe(e,t,n){return no(e)?e:(n.push(`${t} must be an object.`),{})}function ot(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function DS(e,t,n){let r=_t(e,t,n);return hr.test(r)||n.push(`${t} must match ${hr}.`),r}function _t(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Cm(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 Im(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 NS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function _S(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function vm(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function Am(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>bS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function xS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var no=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as LS,stat as FS}from"node:fs/promises";var MS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Oc(e){let t=await Em(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 $c(e,t){let n=await Em(e),r=jS(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:Cn(l.title,r,`$.steps.${a}.human_review.title`),summary:Cn(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?Cn(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:Cn(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:Cn(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:Cn(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:WS(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 Em(e){let t;try{let n=await FS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>ws)throw new Error(`Definition exceeds ${ws} bytes.`);t=await LS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Ec(vc(t,e),e)}function jS(e,t){let n=[];for(let s of Object.keys(t))e[s]||n.push(`Input "${s}" is not declared.`);let r={};for(let[s,i]of Object.entries(e)){let o=t[s];o!==void 0?r[s]=qS(o,i.type,s,n):i.defaultValue!==void 0?r[s]=i.defaultValue:i.required&&n.push(`Required input "${s}" was not provided.`)}if(n.length>0)throw new g("FURY_INPUT_INVALID","Fury inputs are invalid.",{details:{issues:n}});return r}function qS(e,t,n,r){if(t==="string")return e;if(t==="number"){if(e.trim().length===0)return r.push(`Input "${n}" must be a finite number.`),0;let s=Number(e);return Number.isFinite(s)?s:(r.push(`Input "${n}" must be a finite number.`),0)}return e==="true"?!0:(e==="false"||r.push(`Input "${n}" must be true or false.`),!1)}function US(e,t){return e.replace(MS,(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 Cn(e,t,n){let r=US(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 WS(e,t,n){let r=`$.steps.${n}.prompt`,s=Cn(e,t,r);if(Buffer.byteLength(s)>gr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${gr} bytes.`,{details:{location:r,maxBytes:gr}});return s}import{createHash as Om}from"node:crypto";import BS from"node:path";import{mkdir as VS}from"node:fs/promises";var Dc={type:"system",component:"heartbeat"};async function nn(e,t={}){await VS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Et.listAgents(e),uf(e),XS(e)]),o=r??ft(n.tasks.filter(h=>h.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=JS(i),l=a!==i,c=[],d=Nc(s.filter(zS),h=>h.taskId),u=Nc(s.filter(h=>h.type.startsWith("task.pr.")),h=>h.taskId),p=Nc(s.filter(h=>h.type==="agent.state.changed"),h=>h.agentTabId);for(let h of n.tasks){let f=KS(h),y=d.get(h.id),T=xc(y?.data)??a.tasks[h.id]??null,R=y?.id??a.tasks[h.id]?.eventId??null;if(T?.signature!==f.signature){let x=T?h.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await De(e,{id:_c(x,h.id,f.signature),type:x,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:Dc,data:{...f,changedFields:T?HS(T,f):[]}});c.push(v),R=v.id}a.tasks[h.id]={...f,eventId:R};let b=YS(h.prs),O=u.get(h.id),$=xc(O?.data)??a.pullRequests[h.id]??null,D=O?.id??a.pullRequests[h.id]?.eventId??null;if(($||b.associations.length>0)&&$?.signature!==b.signature){let x=Array.isArray($?.associations)?$.associations.length:0,v=b.associations.length>x?"task.pr.linked":b.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await De(e,{id:_c(v,h.id,b.signature),type:v,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:Dc,data:b});c.push(w),D=w.id}a.pullRequests[h.id]={...b,eventId:D}}let m=new Map(o.tasks.map(h=>[h.taskId,h.state]));for(let h of o.agents){let f=p.get(h.tabId),y=xc(f?.data)??a.agents[h.tabId]??null;if(y?.state===h.state){a.agents[h.tabId]={state:h.state,eventId:f?.id??a.agents[h.tabId]?.eventId??null};continue}let T=[f?.id??a.agents[h.tabId]?.eventId??"initial",h.state,h.sessionState??"none",h.lastActivityAt??"none",h.exitCode??"none",h.error??"none"].join(":"),R=await De(e,{id:_c("agent.state.changed",h.tabId,T),type:"agent.state.changed",taskId:h.taskId,agentTabId:h.tabId,actor:Dc,data:{previousState:typeof y?.state=="string"?y.state:null,state:h.state,taskState:m.get(h.taskId)??"idle",sessionState:h.sessionState,lastActivityAt:h.lastActivityAt,exitCode:h.exitCode,error:h.error}});c.push(R),a.agents[h.tabId]={state:h.state,eventId:R.id}}return(c.length>0||l)&&await q(Dm(e),a),c}function KS(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:$m(t)}}var GS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function HS(e,t){return GS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function YS(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:$m(t)}}function Nc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var zS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",$m=e=>Om("sha256").update(JSON.stringify(e)).digest("hex"),_c=(...e)=>Om("sha256").update(e.join("\0")).digest("hex"),xc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Dm=e=>BS.join(e.orchestrationDir,"event-reconciliation.json");function JS(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 XS(e){try{return await _s(Dm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function QS(e,t){return await Lc(e),await nn(e),bn(e,t)}async function ZS(e,t,n){await Lc(e);let r=await Et.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await nn(e,{agentObserver:r});let a=await bn(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 Nm(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function eP(e,t,n){await Lc(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 Et.openObserver(e);try{await nn(e,{agentObserver:s});let o=(await bn(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=ft([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw nP(t);let u=a-Date.now();if(u<=0)throw tP(t,n.states,n.timeoutMs);await nn(e,{agentObserver:s}),o=(await bn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await Nm(Math.min(250,u),n.signal)}}finally{s.close()}}async function Lc(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 Nm(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 tP=(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}}),nP=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),ro={list:QS,watch:ZS,waitForTaskState:eP,reconcile:nn};import{readFile as yP}from"node:fs/promises";import{mkdir as dP,readFile as Fm,rm as Mm}from"node:fs/promises";import{createConnection as pP}from"node:net";import fP from"node:path";import{spawn as aP}from"node:child_process";import{closeSync as lP,openSync as cP}from"node:fs";import Mc from"node:path";import{accessSync as rP,constants as sP}from"node:fs";import{homedir as _m}from"node:os";import rn from"node:path";var iP=[rn.join(_m(),".local","bin"),rn.join(_m(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Lm(e=process.env){return oP([...(e.PATH??"").split(rn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:iP])}function so(e=process.env){return{...e,PATH:Lm(e).join(rn.delimiter)}}function Fc(e,t={}){if(e.includes(rn.sep)){let n=rn.isAbsolute(e)?e:rn.resolve(t.cwd??process.cwd(),e);return xm(n)?n:null}for(let n of Lm(t.env)){let r=rn.join(n,e);if(xm(r))return r}return null}function io(e,t={}){let n=Fc(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 xm(e){try{return rP(e,sP.X_OK),!0}catch{return!1}}function oP(e){return[...new Set(e)]}function oo(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=uP(e.workspaceRoot),s=cP(Mc.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return aP(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{lP(s)}})().unref()}function uP(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=Mc.resolve(Mc.dirname(t),"..","node_modules",".bin","tsx");return{command:Fc("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 xt(e){let t=await lo(Je(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await An(t,{type:"ping"});return Gt(n.protocolVersion)?(await An(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function ao(e,t){if(t.length===0)return!0;let n=await lo(Je(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await An(n,{type:"ping"});if(!Gt(r.protocolVersion))return!1;for(let s of t)await An(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function qm(e,t){await mP(e);let n=await lo(Je(e).socketPath);try{let r=await An(n,{type:"ping"});if(!Gt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await An(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 mP(e){let t=Je(e),n=await jm(t.socketPath).catch(()=>null);if(Gt(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await dP(e.runtimeDir,{recursive:!0});let r=await Fm(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&hP(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([Mm(t.socketPath,{force:!0}),Mm(t.pidPath,{force:!0})]),oo(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await jm(t.socketPath).catch(()=>null);if(Gt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await Fm(fP.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=Qi(t),r=hr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=Qi(t),r=hr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function SS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new ys||null,prettyErrors:t}}function vc(e,t={}){let{lineCounter:n,prettyErrors:r}=SS(t),s=new ws(n?.addNewLine),i=new hs(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new st(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(fc(e,n)),o.warnings.forEach(fc(e,n))),o}var ks=1024*1024;function Cc(e,t){Buffer.byteLength(e)>ks&&eo(t,[`Definition exceeds ${ks} bytes.`]);let n=vc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Ye(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&&eo(t,s),n.contents===null&&eo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){eo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function eo(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}import{createHash as IS}from"node:crypto";var gr=/^[a-z][a-z0-9_-]{0,63}$/,Im=/\$\{\{\s*([^{}]+?)\s*\}\}/g,vm=32,Cm=128,vS=16,CS=32,AS=10080*60*1e3,yr=32*1024,Am=16;function Oc(e,t){let n=[],r=Le(e,"$",n);ot(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=jS(r.name,"$.name",n),i=OS(r.limits,n),o=$S(r.inputs,n),a=DS(r.steps,n);a.length>Cm&&n.push(`$.steps may contain at most ${Cm} 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=xS(a,n);c&&FS(a,o,c.ancestors,n),n.length>0&&WS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:IS("sha256").update(Ec(d)).digest("hex"),order:c.order,waves:ES(c.waves,i.maxConcurrency)}}function ES(e,t){return e.flatMap(n=>{let r=[];for(let s=0;s<n.length;s+=t)r.push(n.slice(s,s+t));return r})}function OS(e,t){let n=Le(e,"$.limits",t);ot(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Em(n.max_concurrency,"$.limits.max_concurrency",1,vS,t),s=Em(n.max_tasks,"$.limits.max_tasks",1,CS,t),i=Dm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function $S(e,t){if(e===void 0)return{};let n=Le(e,"$.inputs",t),r=Object.entries(n);r.length>vm&&t.push(`$.inputs may contain at most ${vm} inputs.`);let s={};for(let[i,o]of r){gr.test(i)||t.push(`$.inputs key "${i}" must match ${gr}.`);let a=Le(o,`$.inputs.${i}`,t);ot(a,["type","required","default"],`$.inputs.${i}`,t);let l=US(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:qS(a.required,`$.inputs.${i}.required`,t);c&&a.default!==void 0&&t.push(`$.inputs.${i} cannot be required and have a default.`),a.default!==void 0&&!Om(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Om(a.default,l)?{defaultValue:a.default}:{}}}return s}function DS(e,t){let n=Le(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{gr.test(s)||t.push(`$.steps key "${s}" must match ${gr}.`);let o=Le(i,`$.steps.${s}`,t),a=$m(o.needs,`$.steps.${s}.needs`,t);return new Set(a).size!==a.length&&t.push(`$.steps.${s}.needs cannot contain duplicates.`),o.human_review!==void 0?_S(s,o,a,t):NS(s,o,a,t)})}function NS(e,t,n,r){ot(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?xt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=Le(t.create_child,`$.steps.${e}.create_child`,r);ot(u,["repo","workspace"],`$.steps.${e}.create_child`,r),u.repo!==void 0&&u.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...u.repo!==void 0?{repo:xt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:xt(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=Le(t.agent,`$.steps.${e}.agent`,r);if(ot(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(xt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=xt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>yr&&r.push(`$.steps.${e}.prompt exceeds ${yr} bytes.`);let d;if(t.output!==void 0){let u=Le(t.output,`$.steps.${e}.output`,r);ot(u,["schema"],`$.steps.${e}.output`,r),d=Ac(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 _S(e,t,n,r){ot(t,["needs","human_review"],`$.steps.${e}`,r);let s=Le(t.human_review,`$.steps.${e}.human_review`,r);ot(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Le(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ot(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=xt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:xt(s.title,`$.steps.${e}.human_review.title`,r),summary:xt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:Dm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Ac(e,t,n,r){if(r>Am)return n.push(`${t} exceeds the maximum schema depth of ${Am}.`),{};let s=Le(e,t,n);ot(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&$m(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=Le(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Ac(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Ac(s.items,`${t}.items`,n,r+1),s}function xS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((m,h)=>r.get(m)-r.get(h));let u=o;l.push(u),a.push(...u);let p=[];for(let m of u)for(let h of i.get(m)??[]){let f=s.get(h)-1;s.set(h,f),f===0&&p.push(h)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let m of c.get(u).needs){p.add(m);for(let h of d.get(m)??[])p.add(h)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function FS(e,t,n,r){let s=new Map(e.map(i=>[i.id,i]));for(let i of e){let o=i.kind==="agent"?[i.task,i.createChild?.repo,i.prompt]:[i.title,i.summary,i.feedbackTask];for(let a of o){if(a===void 0)continue;let l=[...a.matchAll(Im)],c=a.replace(Im,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)LS(d[1].trim(),i,t,n,s,r)}}}function LS(e,t,n,r,s,i){let o=/^inputs\.([a-z][a-z0-9_-]{0,63})$/.exec(e);if(o){n[o[1]]||i.push(`$.steps.${t.id} references undeclared input "${o[1]}".`);return}let a=/^steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)$/.exec(e);if(!a){i.push(`$.steps.${t.id} contains unsupported reference "${e}".`);return}let l=a[1];if(!(r.get(t.id)?.has(l)??!1)){i.push(`$.steps.${t.id} references step "${l}" without depending on it.`);return}let c=s.get(l);!c||c.kind!=="agent"?i.push(`$.steps.${t.id} references an output from non-agent step "${l}".`):a[2].startsWith("output")&&!c.outputSchema?i.push(`$.steps.${t.id} references output from step "${l}" without a declared output schema.`):a[2].startsWith("output.")&&c.outputSchema&&MS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function MS(e,t,n,r,s){let i=r;for(let o of n){if(i.type!=="object"){s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}if(!to(i.properties)){i.additionalProperties===!1&&s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}if(!Object.hasOwn(i.properties,o)){s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}let a=i.properties[o];if(!to(a))return;i=a}}function Ec(e){return Array.isArray(e)?`[${e.map(Ec).join(",")}]`:to(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ec(e[t])}`).join(",")}}`:JSON.stringify(e)}function Le(e,t,n){return to(e)?e:(n.push(`${t} must be an object.`),{})}function ot(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function jS(e,t,n){let r=xt(e,t,n);return gr.test(r)||n.push(`${t} must match ${gr}.`),r}function xt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function $m(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 Em(e,t,n,r,s){return Number.isInteger(e)&&Number(e)>=n&&Number(e)<=r?Number(e):(s.push(`${t} must be an integer from ${n} through ${r}.`),n)}function qS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function US(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Om(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function Dm(e,t,n){if(typeof e!="string")return n.push(`${t} must be a duration such as 30m, 2h, or 1d.`),1;let r=/^(\d+)(ms|s|m|h|d)$/.exec(e);if(!r)return n.push(`${t} must be a duration such as 30m, 2h, or 1d.`),1;let s={ms:1,s:1e3,m:6e4,h:36e5,d:864e5},i=Number(r[1])*s[r[2]];return!Number.isSafeInteger(i)||i<1||i>AS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function WS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var to=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as BS,stat as VS}from"node:fs/promises";var KS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function $c(e){let t=await Nm(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 Dc(e,t){let n=await Nm(e),r=GS(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:En(l.title,r,`$.steps.${a}.human_review.title`),summary:En(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?En(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:En(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:En(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:En(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:zS(l.prompt,r,a),outputSchema:l.outputSchema??null,review:null}});return{schemaVersion:1,file:e,definitionHash:n.hash,name:n.definition.name,inputs:r,limits:n.definition.limits,order:n.order,waves:n.waves,steps:o}}async function Nm(e){let t;try{let n=await VS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>ks)throw new Error(`Definition exceeds ${ks} bytes.`);t=await BS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Oc(Cc(t,e),e)}function GS(e,t){let n=[];for(let s of Object.keys(t))e[s]||n.push(`Input "${s}" is not declared.`);let r={};for(let[s,i]of Object.entries(e)){let o=t[s];o!==void 0?r[s]=HS(o,i.type,s,n):i.defaultValue!==void 0?r[s]=i.defaultValue:i.required&&n.push(`Required input "${s}" was not provided.`)}if(n.length>0)throw new g("FURY_INPUT_INVALID","Fury inputs are invalid.",{details:{issues:n}});return r}function HS(e,t,n,r){if(t==="string")return e;if(t==="number"){if(e.trim().length===0)return r.push(`Input "${n}" must be a finite number.`),0;let s=Number(e);return Number.isFinite(s)?s:(r.push(`Input "${n}" must be a finite number.`),0)}return e==="true"?!0:(e==="false"||r.push(`Input "${n}" must be true or false.`),!1)}function YS(e,t){return e.replace(KS,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function En(e,t,n){let r=YS(e,t);if(r.trim().length===0)throw new g("FURY_INPUT_INVALID",`Resolved ${n} must be a non-empty string.`,{details:{location:n}});return r}function zS(e,t,n){let r=`$.steps.${n}.prompt`,s=En(e,t,r);if(Buffer.byteLength(s)>yr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${yr} bytes.`,{details:{location:r,maxBytes:yr}});return s}import{createHash as _m}from"node:crypto";import JS from"node:path";import{mkdir as XS}from"node:fs/promises";var Nc={type:"system",component:"heartbeat"};async function rn(e,t={}){await XS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Ot.listAgents(e),mf(e),sP(e)]),o=r??mt(n.tasks.filter(h=>h.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=rP(i),l=a!==i,c=[],d=_c(s.filter(nP),h=>h.taskId),u=_c(s.filter(h=>h.type.startsWith("task.pr.")),h=>h.taskId),p=_c(s.filter(h=>h.type==="agent.state.changed"),h=>h.agentTabId);for(let h of n.tasks){let f=QS(h),y=d.get(h.id),T=Fc(y?.data)??a.tasks[h.id]??null,R=y?.id??a.tasks[h.id]?.eventId??null;if(T?.signature!==f.signature){let x=T?h.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await _e(e,{id:xc(x,h.id,f.signature),type:x,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:Nc,data:{...f,changedFields:T?eP(T,f):[]}});c.push(v),R=v.id}a.tasks[h.id]={...f,eventId:R};let b=tP(h.prs),O=u.get(h.id),$=Fc(O?.data)??a.pullRequests[h.id]??null,D=O?.id??a.pullRequests[h.id]?.eventId??null;if(($||b.associations.length>0)&&$?.signature!==b.signature){let x=Array.isArray($?.associations)?$.associations.length:0,v=b.associations.length>x?"task.pr.linked":b.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await _e(e,{id:xc(v,h.id,b.signature),type:v,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:Nc,data:b});c.push(w),D=w.id}a.pullRequests[h.id]={...b,eventId:D}}let m=new Map(o.tasks.map(h=>[h.taskId,h.state]));for(let h of o.agents){let f=p.get(h.tabId),y=Fc(f?.data)??a.agents[h.tabId]??null;if(y?.state===h.state){a.agents[h.tabId]={state:h.state,eventId:f?.id??a.agents[h.tabId]?.eventId??null};continue}let T=[f?.id??a.agents[h.tabId]?.eventId??"initial",h.state,h.sessionState??"none",h.lastActivityAt??"none",h.exitCode??"none",h.error??"none"].join(":"),R=await _e(e,{id:xc("agent.state.changed",h.tabId,T),type:"agent.state.changed",taskId:h.taskId,agentTabId:h.tabId,actor:Nc,data:{previousState:typeof y?.state=="string"?y.state:null,state:h.state,taskState:m.get(h.taskId)??"idle",sessionState:h.sessionState,lastActivityAt:h.lastActivityAt,exitCode:h.exitCode,error:h.error}});c.push(R),a.agents[h.tabId]={state:h.state,eventId:R.id}}return(c.length>0||l)&&await q(Fm(e),a),c}function QS(e){let t={status:e.status,title:e.title,runner:e.runner,branch:e.branch,lastCommitSha:e.lastCommit?.sha??null,checksStatus:e.checks.status,checksLastRunAt:e.checks.lastRunAt,sourceUpdatedAt:e.updatedAt,agentTabIds:e.ptyTabs.filter(n=>n.kind==="agent").map(n=>n.id)};return{...t,signature:xm(t)}}var ZS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function eP(e,t){return ZS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function tP(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:xm(t)}}function _c(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var nP=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",xm=e=>_m("sha256").update(JSON.stringify(e)).digest("hex"),xc=(...e)=>_m("sha256").update(e.join("\0")).digest("hex"),Fc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Fm=e=>JS.join(e.orchestrationDir,"event-reconciliation.json");function rP(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 sP(e){try{return await Ns(Fm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function iP(e,t){return await Lc(e),await rn(e),Sn(e,t)}async function oP(e,t,n){await Lc(e);let r=await Ot.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await rn(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 Lm(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function aP(e,t,n){await Lc(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 Ot.openObserver(e);try{await rn(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=mt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw cP(t);let u=a-Date.now();if(u<=0)throw lP(t,n.states,n.timeoutMs);await rn(e,{agentObserver:s}),o=(await Sn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await Lm(Math.min(250,u),n.signal)}}finally{s.close()}}async function Lc(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 Lm(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 lP=(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}}),cP=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),no={list:iP,watch:oP,waitForTaskState:aP,reconcile:rn};import{readFile as PP}from"node:fs/promises";import{mkdir as wP,readFile as Um,rm as Wm}from"node:fs/promises";import{createConnection as kP}from"node:net";import TP from"node:path";import{spawn as mP}from"node:child_process";import{closeSync as hP,openSync as gP}from"node:fs";import jc from"node:path";import{accessSync as uP,constants as dP}from"node:fs";import{homedir as Mm}from"node:os";import sn from"node:path";var pP=[sn.join(Mm(),".local","bin"),sn.join(Mm(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function qm(e=process.env){return fP([...(e.PATH??"").split(sn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:pP])}function ro(e=process.env){return{...e,PATH:qm(e).join(sn.delimiter)}}function Mc(e,t={}){if(e.includes(sn.sep)){let n=sn.isAbsolute(e)?e:sn.resolve(t.cwd??process.cwd(),e);return jm(n)?n:null}for(let n of qm(t.env)){let r=sn.join(n,e);if(jm(r))return r}return null}function so(e,t={}){let n=Mc(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 jm(e){try{return uP(e,dP.X_OK),!0}catch{return!1}}function fP(e){return[...new Set(e)]}function io(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=yP(e.workspaceRoot),s=gP(jc.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return mP(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{hP(s)}})().unref()}function yP(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=jc.resolve(jc.dirname(t),"..","node_modules",".bin","tsx");return{command:Mc("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 ao(Ne(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await On(t,{type:"ping"});return Ht(n.protocolVersion)?(await On(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function oo(e,t){if(t.length===0)return!0;let n=await ao(Ne(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await On(n,{type:"ping"});if(!Ht(r.protocolVersion))return!1;for(let s of t)await On(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Vm(e,t){await bP(e);let n=await ao(Ne(e).socketPath);try{let r=await On(n,{type:"ping"});if(!Ht(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await On(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 bP(e){let t=Ne(e),n=await Bm(t.socketPath).catch(()=>null);if(Ht(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 wP(e.runtimeDir,{recursive:!0});let r=await Um(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&RP(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([Wm(t.socketPath,{force:!0}),Wm(t.pidPath,{force:!0})]),io(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Bm(t.socketPath).catch(()=>null);if(Ht(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await Um(TP.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
+
${o.slice(-2e3)}`:""}`)}async function Bm(e){let t=await ao(e);try{return await On(t,{type:"ping"})}finally{t.end()}}function RP(e){try{return process.kill(e,0),!0}catch{return!1}}var SP=1;function On(e,t){let n=SP++;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 ao(e){return new Promise((t,n)=>{let r=kP(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function IP(e,t){await $P(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 OP(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 Ft(e),a}return await qc(e,o.command.id),o}async function qc(e,t){if((await ae.show(e,t)).command.state==="delivered"||await Ft(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 vP(e,t){return ae.show(e,t)}async function CP(e,t){return ae.list(e,t)}async function AP(e,t){let n;try{n=await ae.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Ft(e),r}return await Ft(e),n}async function EP(e,t,n){return ae.wait(e,t,n)}async function OP(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await PP(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 $P(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 wr={send:IP,show:vP,list:CP,cancel:AP,wait:EP};var DP=6e4;async function lo(e,t){return Hl(e,t,{createTask:NP})}async function Km(e,t,n,r={}){return Gl(e,t,n,{...r,launchProvisioned:(s,i)=>Gm(e,s,i,!1)})}async function NP(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>Gm(e,s,i,!0)})}async function Gm(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 Vm(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:r?s.command:t.runnerSession.command,...n?{env:n}:{}}),!r)return;let i=await ae.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:DP,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await qc(e,i.command.id)}catch(i){throw await oo(e,[s.id]),i}}async function co(e,t,n){let r=(await S.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await zl(e,t,n);return await oo(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await oo(e,o),a}}import{randomUUID as zm}from"node:crypto";import{readFile as _P,realpath as Hm}from"node:fs/promises";import Uc from"node:path";var ne={type:"system",component:"orchestration-supervisor"},xP=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function FP(e,t,n,r,s,i){await _n(e);let o=await JP(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 He(e,i,"fury.plan",r)}let a=await Dc(t,n);XP(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_${zm()}`,planHash:bl(c),createdBy:s,createdAt:l};await Yp(e,a.definitionHash,await _P(t,"utf8"));let u=await zp(e,d);try{await _e(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 LP(e,t,n){if(await _n(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await oi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await Qp(e,s);try{await _e(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 MP(e,t,n,r){await _n(e);let s=await oi(e,t);if((await Zp(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 He(e,r,"fury.run",s.rootTaskId)}await Xe(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${zm()}`,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 ef(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 Nn(e,c.run.id),await Ft(e),{kind:"runFury",run:await pe(e,c.run.id),created:c.created}}async function jP(e,t){return await _n(e),await Nn(e,t),{kind:"showFury",run:await pe(e,t)}}async function po(e,t={}){let n=await k.load(e);if(k.previews.isEnabled(n,"agentOrchestration"))for(let r of await tf(e))await Nn(e,r.id,t)}async function Nn(e,t,n={}){let r=await pe(e,t);if(await tI(e,r),bt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ke(e,t,o=>eI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await zr(e,o.reviewId,a=>({...a,state:"timed_out",version:a.version+1,updatedAt:new Date().toISOString()}));await ce(e,r,null,"fury.run.timed_out",ne,{state:r.state});return}let s=new Map((await Ge(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 Ym(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await uo(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",ne));let l=!a.commandId||s.get(a.commandId)?.state==="delivered";a.state==="running"&&a.agentTabId&&l&&n.isAgentAvailable&&a.startedAt&&Date.now()-Date.parse(a.startedAt)>2e3&&!n.isAgentAvailable(a.agentTabId)&&(r=await uo(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,ne)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await Ke(e,r.id,c=>on(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await ce(e,r,a.id,"fury.step.timed_out",ne,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await zr(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ke(e,r.id,c=>on(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await ce(e,r,a.id,"fury.review.timed_out",ne,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await fo(e,r.id,"failed",ne);return}let i=Object.values(r.stepRuns).filter(o=>o.state==="running").length;for(let o of r.order){if(i>=r.limits.maxConcurrency)break;let a=r.stepRuns[o];a.state!=="pending"||!a.needs.every(l=>r.stepRuns[l]?.state==="succeeded")||(a.kind==="human_review"?r=await qP(e,r,a):(r=await Ym(e,r,a),i+=1))}await ZP(e,r.id)}async function Ym(e,t,n){let r=new Date;t=await Ke(e,t.id,o=>on(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await ce(e,t,n.id,"fury.step.started",ne,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${Dn(s.plan.prompt,t)}
|
|
212
212
|
|
|
213
|
-
${
|
|
213
|
+
${QP(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await lo(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:Dn(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:Dn(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=Dn(s.plan.target.task,t);let c=await S.getTask(e,o),d=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!d)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await Xe(e,c,ne,d.id),a=d.id,l=(await ae.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:ne})).command.id}return t=await Ke(e,t.id,c=>on(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await ce(e,t,n.id,"fury.step.dispatched",ne,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return uo(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",ne)}}async function qP(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?Dn(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:Dn(r.title,t),summary:Dn(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 rf(e,l),t=await Ke(e,t.id,c=>on(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await ce(e,t,n.id,"fury.review.requested",ne,{reviewId:i,title:l.title}),t}async function UP(e,t,n,r,s,i){let o=await pe(e,t),a=Xm(o,n);await Jm(e,a,s,i,"fury.step.complete"),zP(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ke(e,t,c=>{if(bt(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return on(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ce(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Nn(e,t),o=await pe(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function WP(e,t,n,r,s,i){let o=await pe(e,t),a=Xm(o,n);await Jm(e,a,s,i,"fury.step.fail");let l=await uo(e,t,n,r,s);return await fo(e,t,"failed",s),{kind:"failFuryStep",run:await pe(e,t),step:l.stepRuns[n]}}async function BP(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 He(e,r,"fury.cancel",s.rootTaskId)}if(bt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ke(e,t,c=>bt(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 Ge(e);for(let c of Object.values(a.stepRuns)){let d=c.commandId?l.find(u=>u.id===c.commandId):null;d?.state==="queued"&&await ae.cancel(e,d.id,n),c.taskId&&c.plan.target?.type==="create_child"&&await co(e,c.taskId).catch(()=>{}),c.reviewId&&await zr(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 VP(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 He(e,r,"fury.resume",s.rootTaskId)}if(bt(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await Nn(e,t),await Ft(e),{kind:"resumeFury",run:await pe(e,t)}}async function KP(e,t,n){return await _n(e),{kind:"listFuryReviews",reviews:(await ai(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function GP(e,t){return await _n(e),{kind:"showFuryReview",review:await nr(e,t)}}async function HP(e,t,n,r,s,i){let o=await nr(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 He(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let m=await S.getTask(e,o.feedbackTarget.taskId),h=o.feedbackTarget.agentTabId?m.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):m.ptyTabs.find(y=>y.kind==="agent");if(!h)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${m.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:m.id,agentTabId:h.id,prompt:{source:"inline",text:`Fury review changes requested:
|
|
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 zr(e,t,m=>{if(!(n==="resubmit"?m.state==="changes_requested":m.state==="waiting_for_review")||m.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...m,state:p,round:n==="resubmit"?m.round+1:m.round,version:m.version+1,lastDecision:u,history:[...m.history,u],updatedAt:d}}),a=await Ke(e,a.id,m=>{if(bt(m))throw new g("FURY_STATE_CONFLICT",`Run ${m.id} is ${m.state}.`,{});return on(m,o.stepId,n==="approve"?{state:"succeeded",completedAt:d,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:d,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await ce(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await fo(e,a.id,"failed",s):await Nn(e,a.id),c&&await Ft(e),{kind:"actFuryReview",review:o,run:await pe(e,a.id)}}async function YP(e,t,n,r){await _n(e),await pe(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await Nn(e,t);let a=await Sn(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,bt(await pe(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await nI(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function Dn(e,t){return e.replace(xP,(n,r,s)=>{let i=t.stepRuns[r];if(!i||i.state!=="succeeded")throw new g("FURY_STATE_CONFLICT",`Step ${r} is not complete.`,{});if(s==="task_id")return i.taskId??"";let o=i.output;for(let a of s.split(".").slice(1))o=$n(o)?o[a]:void 0;if(o===void 0)throw new g("FURY_OUTPUT_INVALID",`Step ${r} has no output at ${s}.`,{});return typeof o=="string"?o:JSON.stringify(o)})}function zP(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(Wc(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function Wc(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?$n(e):s==="integer"?Number.isInteger(e):s==="number"?typeof e=="number"&&Number.isFinite(e):typeof e===s)){r.push(`${n} must be ${String(s)}.`);return}if(Array.isArray(t.enum)&&!t.enum.some(o=>JSON.stringify(o)===JSON.stringify(e))&&r.push(`${n} is not in enum.`),s==="object"&&$n(e)){let o=$n(t.properties)?t.properties:{};for(let a of Array.isArray(t.required)?t.required:[])typeof a=="string"&&!Object.hasOwn(e,a)&&r.push(`${n}.${a} is required.`);for(let[a,l]of Object.entries(e))$n(o[a])?Wc(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&$n(t.items)&&e.forEach((o,a)=>Wc(o,t.items,`${n}[${a}]`,r))}async function Jm(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 He(e,r,s,n.taskId)}}function Xm(e,t){if(bt(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 JP(e,t){let[n,r]=await Promise.all([Hm(ge(e).root),Hm(t)]),s=Uc.relative(n,r);if(!s||s.startsWith("..")||Uc.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 Uc.join(".craig","fury",s)}function XP(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 QP(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 po(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ve(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(Tt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,sn(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await le(e,a,n,"fury.step.failed",s,{reason:r}),a}function sn(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function GP(e,t){let n=await de(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await mo(e,t,s,te)}async function mo(e,t,n,r){let s=await de(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ve(e,t,l=>Tt(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function HP(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:te}]))}}async function le(e,t,n,r,s,i){let o=En(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await De(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function YP(e,t){await le(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await le(e,t,null,`fury.run.${t.state}`,te,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",te,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",te,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await le(e,t,n.id,`fury.step.${n.state}`,n.completedBy??te,{reason:n.error}),!n.reviewId)continue;let r=await tr(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",te,{reviewId:r.id,title:r.title});for(let s of r.history)await le(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function Dn(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 Tt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function En(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function zP(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Le={plan:EP,approve:OP,run:$P,show:DP,watch:UP,cancel:LP,resume:FP,completeStep:_P,failStep:xP,listReviews:MP,showReview:jP,actOnReview:qP,reconcile:fo};async function zm(e,t){switch(e.kind){case"addWorkspace":{let n=await we.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Wc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await we.repos.addRepo(t.paths,e.path);return await Wc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return we.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await jn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await $e(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await we.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await qt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await qt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return we.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await we.archiveWorkspace(t.paths,e.workspaceId);return await QP(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await we.restoreWorkspace(t.paths,e.workspaceId);return await Wc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return we.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Um(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 Nn(t),co(t.paths,{parentTaskId:e.parentTaskId??an(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Nn(t),Hl(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Nn(t),uo(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"validateFury":return await Ym(t),Oc(Bc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Ym(t),Le.plan(t.paths,Bc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??an(t).task.id,on(t),t.agentCapabilityId);case"approveFury":return Le.approve(t.paths,e.planId,on(t));case"runFury":return Nn(t),Le.run(t.paths,e.planId,on(t),t.agentCapabilityId);case"showFury":return Le.show(t.paths,e.runId);case"watchFury":return Le.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Le.cancel(t.paths,e.runId,on(t),t.agentCapabilityId);case"resumeFury":return Le.resume(t.paths,e.runId,on(t),t.agentCapabilityId);case"completeFuryStep":return Nn(t),Le.completeStep(t.paths,e.runId,e.stepId,await XP(e.output,t),on(t),t.agentCapabilityId);case"failFuryStep":return Nn(t),Le.failStep(t.paths,e.runId,e.stepId,e.reason,on(t),t.agentCapabilityId);case"listFuryReviews":return Le.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Le.showReview(t.paths,e.reviewId);case"actFuryReview":return Nn(t),Le.actOnReview(t.paths,e.reviewId,e.action,e.message??null,on(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=an(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,an(t).task.id);case"showTaskPr":return S.prs.show(t.paths,_n(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,_n(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,_n(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,_n(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,_n(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return Et.listAgents(t.paths,e.taskId);case"showAgentStatus":return Et.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=_n(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?ro.waitForTaskState(t.paths,r,n):Et.waitForTask(t.paths,r,n)}case"listEvents":return ro.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return ro.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 yr.send(t.paths,{taskId:_n(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 yr.show(t.paths,e.commandId);case"listPromptCommands":return yr.list(t.paths,e.taskId);case"cancelPromptCommand":return yr.cancel(t.paths,e.commandId);case"waitPromptCommand":return yr.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,wr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,wr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,wr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,wr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,wr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,wr(t,"commit"));case"showContext":{let n=eI(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 ZP(e)}}function Nn(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 Ym(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function on(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=an(e);if(!e.agentCapabilityId||!t.agentTabId)throw new g("CAPABILITY_DENIED","This agent session has no scoped capability.",{});return{type:"agent",taskId:t.task.id,agentTabId:t.agentTabId,capabilityId:e.agentCapabilityId.split(".",1)[0]}}async function XP(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await JP(Bc.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 Wc(e,t,n){let r=await jn({uiStateFile:e.uiStateFile})??Ls();await qt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function QP(e,t){let n=await jn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await qt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function ZP(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function wr(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function an(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function _n(e,t){return e??an(t).task.id}function eI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Xm(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
217
|
+
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function uo(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ke(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(bt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,on(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await ce(e,a,n,"fury.step.failed",s,{reason:r}),a}function on(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function ZP(e,t){let n=await pe(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await fo(e,t,s,ne)}async function fo(e,t,n,r){let s=await pe(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ke(e,t,l=>bt(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 eI(e){let t=new Date().toISOString();return{...e,state:"timed_out",updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:ne}]))}}async function ce(e,t,n,r,s,i){let o=$n(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await _e(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 tI(e,t){await ce(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await ce(e,t,null,`fury.run.${t.state}`,ne,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await ce(e,t,n.id,"fury.step.started",ne,{}),n.taskId&&await ce(e,t,n.id,"fury.step.dispatched",ne,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await ce(e,t,n.id,`fury.step.${n.state}`,n.completedBy??ne,{reason:n.error}),!n.reviewId)continue;let r=await nr(e,n.reviewId);await ce(e,t,n.id,"fury.review.requested",ne,{reviewId:r.id,title:r.title});for(let s of r.history)await ce(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function _n(e){if(!k.previews.isEnabled(await k.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function bt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function $n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nI(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 Me={plan:FP,approve:LP,run:MP,show:jP,watch:YP,cancel:BP,resume:VP,completeStep:UP,failStep:WP,listReviews:KP,showReview:GP,actOnReview:HP,reconcile:po};import{access as rI,stat as sI}from"node:fs/promises";import iI from"node:path";import{constants as oI}from"node:fs";async function Bc(e,t){let n=iI.resolve(e,t),r;try{r=await sI(n),await rI(n,oI.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 aI}from"node:net";async function Zm(e,t){let n=await cI(Ne(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await Qm(n,{type:"ping"})).protocolVersion!==Rn?!1:((await Qm(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var lI=1;function Qm(e,t){let n=lI++;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
|
+
`);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 cI(e){return new Promise((t,n)=>{let r=aI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function th(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 Vc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await Te.repos.addRepo(t.paths,e.path);return await Vc(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 De(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 Ut({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await Ut({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 pI(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await Te.restoreWorkspace(t.paths,e.workspaceId);return await Vc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return Te.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Km(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 xn(t),lo(t.paths,{parentTaskId:e.parentTaskId??ln(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 xn(t),Yl(t.paths,e.taskId??ln(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return xn(t),co(t.paths,e.taskId??ln(t).task.id,t.agentCapabilityId);case"validateFury":return await eh(t),$c(Kc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await eh(t),Me.plan(t.paths,Kc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??ln(t).task.id,an(t),t.agentCapabilityId);case"approveFury":return Me.approve(t.paths,e.planId,an(t));case"runFury":return xn(t),Me.run(t.paths,e.planId,an(t),t.agentCapabilityId);case"showFury":return Me.show(t.paths,e.runId);case"watchFury":return Me.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Me.cancel(t.paths,e.runId,an(t),t.agentCapabilityId);case"resumeFury":return Me.resume(t.paths,e.runId,an(t),t.agentCapabilityId);case"completeFuryStep":return xn(t),Me.completeStep(t.paths,e.runId,e.stepId,await dI(e.output,t),an(t),t.agentCapabilityId);case"failFuryStep":return xn(t),Me.failStep(t.paths,e.runId,e.stepId,e.reason,an(t),t.agentCapabilityId);case"listFuryReviews":return Me.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Me.showReview(t.paths,e.reviewId);case"actFuryReview":return xn(t),Me.actOnReview(t.paths,e.reviewId,e.action,e.message??null,an(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=ln(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"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 Bc(t.cwd??process.cwd(),e.path),s=await Zm(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,ln(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Fn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Fn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Fn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return Ot.listAgents(t.paths,e.taskId);case"showAgentStatus":return Ot.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Fn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?no.waitForTaskState(t.paths,r,n):Ot.waitForTask(t.paths,r,n)}case"listEvents":return no.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return no.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return wr.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 wr.show(t.paths,e.commandId);case"listPromptCommands":return wr.list(t.paths,e.taskId);case"cancelPromptCommand":return wr.cancel(t.paths,e.commandId);case"waitPromptCommand":return wr.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,kr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,kr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,kr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,kr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,kr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,kr(t,"commit"));case"showContext":{let n=mI(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:ia()};case"exit":return{kind:"exit"};default:return fI(e)}}function xn(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 eh(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 an(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=ln(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 dI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await uI(Kc.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 Vc(e,t,n){let r=await qn({uiStateFile:e.uiStateFile})??xs();await Ut({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function pI(e,t){let n=await qn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await Ut({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function fI(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function kr(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function ln(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Fn(e,t){return e??ln(t).task.id}function mI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function rh(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(`
|
|
218
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(`
|
|
219
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(`
|
|
220
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(`
|
|
@@ -224,58 +226,58 @@ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>
|
|
|
224
226
|
`);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
|
|
225
227
|
`);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
|
|
226
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(`
|
|
227
|
-
`);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return
|
|
228
|
-
`);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 hI(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 nh(e.review);case"actFuryReview":return`${nh(e.review)}
|
|
229
231
|
Run: ${e.run.state}`;case"watchFury":return"";case"addTaskLink":return`Linked repo ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`;case"listTaskLinks":return e.repos.length===0?`Task ${e.taskId} has no linked repos.`:["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
230
|
-
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${
|
|
231
|
-
`);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...
|
|
232
|
+
`);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} ${bI(t)} ${RI(t)} ${t.title}`)].join(`
|
|
233
|
+
`);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}`,...kI(e)].join(`
|
|
232
234
|
`);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(`
|
|
233
|
-
`);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return
|
|
234
|
-
`);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return
|
|
235
|
+
`);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return wI(e);case"listAgents":case"showAgentStatus":return yI(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(Gc).join(`
|
|
236
|
+
`);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 gI(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(`
|
|
235
237
|
`);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(`
|
|
236
|
-
`);case"streamTaskLogs":return`Streaming logs for ${e.taskId} from ${e.logPath}`;case"showTaskDiff":return e.isEmpty?`Task ${e.taskId} has no uncommitted diff.`:e.diffText;case"openTask":return e.launched?`Opened task ${e.taskId} at ${e.worktreePath}`:e.worktreePath;case"runChecks":return`Checks ${e.status} for ${e.taskId}: ${e.commands.join(", ")}`;case"commitTask":return[`Committed task ${e.taskId}`,`Status: ${e.status}`,`Commit: ${e.commitSha}`,`Message: ${e.message}`].join(`
|
|
237
|
-
`);default:return
|
|
238
|
-
`)}function
|
|
239
|
-
`)}function
|
|
240
|
-
`)}function
|
|
241
|
-
`)}function
|
|
242
|
-
`)}function
|
|
243
|
-
`)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let d=n?
|
|
244
|
-
`),0}catch(r){let s=
|
|
245
|
-
`),s.exitCode}}function
|
|
246
|
-
`).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function
|
|
247
|
-
`)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function
|
|
248
|
-
`),byteLength:
|
|
249
|
-
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await
|
|
250
|
-
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await
|
|
251
|
-
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await z("git",["diff","--no-index","--stat","--patch",`--unified=${
|
|
238
|
+
`);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(`
|
|
239
|
+
`);default:return TI(e)}}function hI(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(`
|
|
240
|
+
`)}function nh(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(`
|
|
241
|
+
`)}function gI(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(`
|
|
242
|
+
`)}function Gc(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function yI(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(`
|
|
243
|
+
`)}function wI(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(`
|
|
244
|
+
`)}function kI(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 TI(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function bI(e){return e.checks.status}function RI(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 sh(e,t){let{data:n,warnings:r}=SI(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function SI(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function ih(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 Hc(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=Ce(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=Ad(e.argv);try{let r=Cd(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||$I(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 Hc({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.",{});vI(r.command,r.options.taskId);let s=AI(r.command,r.options.taskId),i=II(s);CI(s,r.options.taskId,i);let o=i!=="none",a=await Hc({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:PI(s),resolveTask:i!=="none",requireTask:i==="required"}),l=EI(s,e.signal),c;try{c=await th(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):Gc(u)}
|
|
245
|
+
`)}:{},...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?sh(t,c):rh(c);return d.length>0&&e.writeStdout(`${d}
|
|
246
|
+
`),0}catch(r){let s=ra(r),i=n?ih(t,s):s.message;return e.writeStderr(`${i}
|
|
247
|
+
`),s.exitCode}}function PI(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function II(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||OI(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 vI(e,t){let n=ah(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 CI(e,t,n){if(!(t===void 0||n!=="none"||ah(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 ah(e){switch(e.kind){case"showTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"createChildTask":return e.parentTaskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":return e.taskId;default:return}}function AI(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function EI(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 OI(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function $I(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as gE}from"node:module";import{readFile as DI,stat as NI}from"node:fs/promises";import Yc from"node:path";var _I=200*1024,xI=500*1024,mo="100000";async function ch(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return FI(e,t,n);try{let r=cn(n.selectedFilePath??null,t.filePaths),s=cn(n.selectedDiffPath??null,t.diffPaths),i=s?await Ts(e.worktreePath):null,[o,a]=await Promise.all([go(e.worktreePath,r),s?zc(e.worktreePath,s,t.diffRows,i):Promise.resolve(ve("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 FI(e,t,n){let r=cn(n.selectedFilePath??null,t.filePaths),s=cn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([dh(e,r),(async()=>{if(!s)return ve("No diff selected","No local changes found.","empty");let l=ho(e,s),c=l?await Ts(l.target.worktreePath).catch(()=>null):null;return ph(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function uh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return LI(e,t);try{await he(e);let n=await Ts(e.worktreePath),[r,s]=await Promise.all([fh(e.worktreePath),mh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=cn(t.selectedFilePath??null,r),a=cn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([go(e.worktreePath,o),a?zc(e.worktreePath,a,s,n):Promise.resolve(ve("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:kh(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:ve("Files unavailable",r,"error"),selectedDiff:ve("Diff unavailable",r,"error"),error:r}}}async function LI(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let m=await Ts(p.worktreePath).catch(()=>null),[h,f]=await Promise.all([fh(p.worktreePath).catch(()=>[]),mh(p.worktreePath,m).catch(()=>[])]);return{target:p,baseRef:m,targetFiles:h,targetDiffRows:f}})),s=[],i=[];for(let{target:p,targetFiles:m,targetDiffRows:h}of r)s.push(...m.map(f=>`${p.repoId}/${f}`)),i.push(...h.map(f=>({...f,path:`${p.repoId}/${f.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=cn(t.selectedFilePath??null,s),l=cn(t.selectedDiffPath??null,o),[c,d]=await Promise.all([dh(e,a),(async()=>{if(!l)return ve("No diff selected","No local changes found.","empty");let p=ho(e,l),m=p?r.find(h=>h.target.repoId===p.target.repoId):null;return ph(e,l,i,m?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:kh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function dh(e,t){let n=ho(e,t);if(!n)return ve("No file selected","No Git-visible files found.","empty");let r=await go(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function ph(e,t,n,r=null){let s=ho(e,t);return s?{...await zc(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}:ve(t,"Repo target is unavailable.","error",t)}function ho(e,t){if(!t)return null;let[n,...r]=t.split("/"),s=r.join("/"),i=(e.repoTargets??[]).find(o=>o.repoId===n&&o.status==="ready")??null;return!i||s.length===0?null:{target:i,relativePath:s}}async function fh(e){let t=await G("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return Th(t.stdout)}async function mh(e,t){let[n,r,s,i]=await Promise.all([MI(e,t),lh(e,"staged"),lh(e,"unstaged"),jI(e)]);return[...n,...r,...s,...i]}async function MI(e,t){if(!t)return[];let[n,r]=await Promise.all([G("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),G("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=hh(n.stdout),i=gh(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 lh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([G("git",[...n,"--name-status"],{cwd:e}),G("git",[...n,"--numstat"],{cwd:e})]),i=hh(r.stdout),o=gh(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 jI(e){let t=await G("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=Th(t.stdout);return await Promise.all(n.map(async s=>{let i=await go(e,s),o=i.status==="ready"?qI(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function hh(e){return e.split(`
|
|
248
|
+
`).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 gh(e){let t=new Map;for(let n of e.split(`
|
|
249
|
+
`)){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 Ts(e){return(await z("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await z("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function go(e,t){if(!t)return ve("No file selected","No Git-visible files found.","empty");let n=UI(e,t);return wh(n,t)}async function yh(e){return wh(e,e)}async function wh(e,t){try{let n=await NI(e);if(n.size>_I)return ve(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await DI(e);return WI(r)?ve(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
|
|
250
|
+
`),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return ve(t,r,"missing",t,null)}}async function zc(e,t,n,r=null){if(!t)return ve("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 Ts(e);if(a){let l=await G("git",["diff","--stat","--patch",`--unified=${mo}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
|
|
251
|
+
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await G("git",["diff","--cached","--stat","--patch",`--unified=${mo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
|
|
252
|
+
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await G("git",["diff","--stat","--patch",`--unified=${mo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
|
|
253
|
+
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await z("git",["diff","--no-index","--stat","--patch",`--unified=${mo}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
|
|
252
254
|
${a.stdout.trimEnd()}`)}let o=s.join(`
|
|
253
255
|
|
|
254
|
-
`);return o.length>
|
|
255
|
-
`):["No diff for this file."],byteLength:o.length}}function
|
|
256
|
-
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function
|
|
257
|
-
`}function bh(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Jc(e){return Sh(e)||kr(e)!==null}function Rh(e){return mh.includes(e)}function Sh(e){return fh.includes(e)}function Ph(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[B]:[]]}function $I(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function DI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Ts(e,t,n){return t.includes(e??"")?e:n}function NI(e){return e==="tabs"?"center":Ts(e,EI,"tasks")}function _I(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ts(e,zc,t)}function xI(e){return e==="file"||e==="diff"?e:null}function LI(e){return e==="terminal"?"terminal":"agent"}function FI(e){return e==="terminal"?"terminal":"control"}function MI(e,t=[...ut],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function wo(e,t=ut){let n=t.length>0?t:ut,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function kr(e){let t=ce.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function jI(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(Sh(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 qI(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?UI(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function UI(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 WI(e,t){let n=xn(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 xn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of bs(ko(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 bs(To(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function ko(e,t){return Ih(e,n=>n.workspaceId===t)}function To(e,t){return Ih(e,n=>n.repoId===t)}function BI(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function Ih(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function bs(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 Xc(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 Lt(e){return typeof e=="string"?e:null}function VI(e){return e?`task:${e}`:null}function Ss(e){return typeof e=="string"&&e.startsWith("task:")}function bo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Ro(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function vh(e){return typeof e=="string"&&e.startsWith("workspace:")}function Qc(e){return bo(e)?e.slice(9):null}function Zc(e){return Ro(e)?e.slice(19):null}async function Tr(e,t,n){let r=ve(e),[s,i]=await Promise.all([we.repos.listRegisteredRepos(r),we.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await Xe(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r);let[h,f]=await Promise.all([Hp(r),li(r)]);c=h.length+f.filter(y=>y.state==="waiting_for_review").length}let d=eu(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await sh(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 eu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Ch(e,t){return Rs(e,t)}import uu from"node:path";import aB from"picocolors";var KI=[" \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 tu(){return[...KI]}var So={width:120,height:36},X={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Fe(e,t){return{width:Math.max(e??So.width,So.width),height:Math.max(t??So.height,So.height)}}var GI=["Start","Options","Exit"],HI=["Resume","Options","Exit"],Io=2,vo=2,Co=2,YI=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),zI=new RegExp("\x1B\\[(?:0)?m","g"),JI=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),XI=/https?:\/\/[^\s<>"']+/g,ru="\x1B[0m",su="\x1B]8;;\x1B\\",N={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},nu=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Oh(e,t={}){return ou(e,{subtitle:"crAIg is that you?",menuItems:GI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function $h(e,t={}){return ou(e,{subtitle:"Control mode is paused.",menuItems:HI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Po=[" 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."],QI=["Help"],ZI=5;function Oo(e,t={}){return ou(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??QI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Dh(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(ne(" ".repeat(e.width),n,r)),i=tu(),o=Math.max(1,Math.floor((e.height-i.length-2-Po.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=ne(Uh(i[d]??"",e.width),n,N.overlayLogo);let a=Math.max(...Po.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Po.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Po[d]??"";s[u]=ne(bt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
258
|
-
`)}function
|
|
259
|
-
`)}function
|
|
260
|
-
`),center:f,regions:{rail:D,left:x,center:f,right:v,footer:w}}}function
|
|
261
|
-
`)}function
|
|
256
|
+
`);return o.length>xI?ve(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?ve(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(`
|
|
257
|
+
`):["No diff for this file."],byteLength:o.length}}function kh(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function cn(e,t){return e&&t.includes(e)?e:t[0]??null}function qI(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Th(e){return[...new Set(e.split(`
|
|
258
|
+
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function UI(e,t){let n=Yc.resolve(e,t),r=Yc.resolve(e);if(n!==r&&!n.startsWith(`${r}${Yc.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function WI(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function ve(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var BI=["tasks","center","inspector","actions"],bh=["agent","terminal"],Rh=[],B="inspection",RB=[...bh,...Rh],Jc=["commit","push","refresh-checks","close-task"],Sh=["refresh-checks","close-task"],Ph=["task","checks","pr","setup-run","actions","next-action"],Xc=["files","review"];function Ih(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=zI(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:XI(e?.inputMode),focusedRegion:HI(e?.focusedRegion),selectedRepoId:Lt(e?.selectedRepoId),selectedWorkspaceId:Lt(e?.selectedWorkspaceId),selectedTaskId:Lt(e?.selectedTaskId),selectedPtyTabId:Lt(e?.selectedPtyTabId),selectedLeftItemId:sv(Lt(e?.selectedTaskId)),activeTab:n?B:Lt(e?.activeTab)??"agent",preferredPtyTabKind:JI(e?.preferredPtyTabKind),inspectorSection:bs(e?.inspectorSection,Ph,"task"),inspectionMode:YI(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:Lt(e?.selectedFileTreePath),selectedFilePath:Lt(e?.selectedFilePath),selectedDiffPath:Lt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:bs(e?.selectedActionId,Jc,"commit"),selectedProjectTargetId:null,selectedRunner:QI(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:VI(),centerZoomed:!1}}function VI(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function vh(e,t){return{...e??xs(),selectedRepoId:t.selectedRepoId,selectedWorkspaceId:t.selectedWorkspaceId,selectedTaskId:t.selectedTaskId,selectedPtyTabId:t.selectedPtyTabId,inputMode:t.inputMode,focusedRegion:t.focusedRegion,activeTab:t.activeTab,preferredPtyTabKind:t.preferredPtyTabKind,inspectorSection:t.inspectorSection,inspectionMode:t.inspectionMode,openInspectionKind:t.openInspectionKind,selectedFileTreePath:t.selectedFileTreePath,selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath,collapsedFileTreePaths:t.collapsedFileTreePaths,selectedActionId:t.selectedActionId,selectedRunner:t.selectedRunner}}function Ss(e,t,n={}){let r=nv(e,t),s=Zc(r),i=s?.kind==="task"?t.tasks.find(p=>p.id===s.id)??null:null,o=i?rv(t.tasks,i):null,a=(s?.kind==="workspace"?t.workspaces?.find(p=>p.id===s.id)??null:null)??(o?t.workspaces?.find(p=>p.id===o.workspaceId)??null:null)??t.workspaces?.find(p=>p.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,c=((s?.kind==="repo"?t.repos.find(p=>p.id===s.id)??null:o?t.repos.find(p=>p.id===o.repoId)??null:null)??(a?.kind==="project"?t.repos.find(p=>p.id===e.selectedRepoId&&a.discoveredRepoIds?.includes(p.id))??null:null)??(a?.kind!=="project"?t.repos.find(p=>p.id===a?.primaryRepoId)??null:null)??t.repos.find(p=>p.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,d=a?wo(t.tasks,a.id):c?ko(t.tasks,c):[],u=(s?.kind==="task"?d.find(p=>p.id===s.id)??null:null)??d.find(p=>p.id===e.selectedTaskId)??d[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:a?.id??null,selectedRepoId:c,selectedTaskId:u?.id??null,...ZI(u,e.activeTab,e.selectedPtyTabId),selectedFilePath:GI(e,t,u?.id??null),...ev(e,t,u?.id??null),selectedDiffPath:KI(e,t,u?.id??null),inspectorSection:bs(e.inspectorSection,Ph,"task")}}function Mt(e,t){return{...e,terminal:t}}function Ch(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Ah(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function at(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
259
|
+
`}function Eh(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Qc(e){return $h(e)||Tr(e)!==null}function Oh(e){return Rh.includes(e)}function $h(e){return bh.includes(e)}function Dh(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[B]:[]]}function KI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function GI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function bs(e,t,n){return t.includes(e??"")?e:n}function HI(e){return e==="tabs"?"center":bs(e,BI,"tasks")}function YI(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":bs(e,Xc,t)}function zI(e){return e==="file"||e==="diff"?e:null}function JI(e){return e==="terminal"?"terminal":"agent"}function XI(e){return e==="terminal"?"terminal":"control"}function QI(e,t=[...dt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function yo(e,t=dt){let n=t.length>0?t:dt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Tr(e){let t=ue.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function ZI(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($h(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 ev(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?tv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function tv(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 nv(e,t){let n=Ln(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function Ln(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Rs(wo(e.tasks,n.id)))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let{task:r}of Rs(ko(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function wo(e,t){return Nh(e,n=>n.workspaceId===t)}function ko(e,t){return Nh(e,n=>n.repoId===t)}function rv(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function Nh(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Rs(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 Zc(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 Lt(e){return typeof e=="string"?e:null}function sv(e){return e?`task:${e}`:null}function Ps(e){return typeof e=="string"&&e.startsWith("task:")}function To(e){return typeof e=="string"&&e.startsWith("new-task:")}function bo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function _h(e){return typeof e=="string"&&e.startsWith("workspace:")}function eu(e){return To(e)?e.slice(9):null}function tu(e){return bo(e)?e.slice(19):null}async function br(e,t,n){let r=Ce(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 m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await Xe(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r);let[h,f]=await Promise.all([Xp(r),ai(r)]);c=h.length+f.filter(y=>y.state==="waiting_for_review").length}let d=nu(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await uh(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 nu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function xh(e,t){return Ss(e,t)}import pu from"node:path";import NB from"picocolors";var iv=[" \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[...iv]}var Ro={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function je(e,t){return{width:Math.max(e??Ro.width,Ro.width),height:Math.max(t??Ro.height,Ro.height)}}var ov=["Start","Options","Exit"],av=["Resume","Options","Exit"],Po=2,Io=2,vo=2,lv=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),cv=new RegExp("\x1B\\[(?:0)?m","g"),uv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),dv=/https?:\/\/[^\s<>"']+/g,iu="\x1B[0m",ou="\x1B]8;;\x1B\\",N={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},su=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Mh(e,t={}){return lu(e,{subtitle:"crAIg is that you?",menuItems:ov,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function jh(e,t={}){return lu(e,{subtitle:"Control mode is paused.",menuItems:av,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var So=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],pv=["Help"],fv=5;function Eo(e,t={}){return lu(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??pv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function qh(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=ru(),o=Math.max(1,Math.floor((e.height-i.length-2-So.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=re(zh(i[d]??"",e.width),n,N.overlayLogo);let a=Math.max(...So.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<So.length;d+=1){let u=c+d;if(u>=e.height)break;let p=So[d]??"";s[u]=re(Rt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
260
|
+
`)}function Uh(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i="Logs",o=t.logPath??"",a=t.logLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),d=[{text:i,tone:"selected"},{text:o,tone:"muted"},lt(),...a.length>0?a.map(m=>({text:m,tone:mv(m)})):[{text:"No Craig activity has been logged.",tone:"muted"}],lt(),{text:"Esc returns to Options.",tone:"muted"}],u=Is(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let m=0;m<u.length;m+=1){let h=p+m;if(h>=e.height)break;let f=u[m]??lt(),y=`${" ".repeat(c)}${Oo(f.text,l)}`,T=f.tone==="selected"?N.overlayMenuSelected:f.tone==="info"?{...N.overlay,fg:N.accent.fg}:f.tone==="warning"?{...N.overlay,fg:N.pending.fg}:f.tone==="error"?{...N.overlay,fg:N.error.fg}:f.tone==="muted"?N.overlay:N.panelBg;s[h]=re(Rt(y,e.width),n,T)}return s.join(`
|
|
261
|
+
`)}function mv(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function Wh(e,t,n={}){let r=n.color??!0,s=Z.leftWidth,i=Z.rightWidth,o=n.centerOnly??!1,a=e.height-Z.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:N.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:N.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:N.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,m=re(Rt(p,e.width),r,N.rail),h=gv(t,s-Po-Io,a,r),f=au(e,t,{color:r,centerOnly:o}),y=kv(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let ye=0;ye<a;ye+=1)if(!o){let Y=Co(h[ye]??lt(),s,r,"left"),hn=re("\u2502",r,d),Yo=re("\u2502",r,u),$s=Co(y[ye]??lt(),i,r,"right");R.push(`${Y}${hn}`),b.push(`${Yo}${$s}`)}let O=T||t.modalInput?N.panelBg:N.panelMuted,$=hv(t.footerText,t.footerToast,e.width,r,O),D={row:1,column:1,width:e.width,rows:[m]},x=o?null:{row:Z.topRailHeight+1,column:1,width:s+Z.dividerWidth,rows:R},v=o?null:{row:Z.topRailHeight+1,column:f.column+f.width,width:Z.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[$]},Pe=o?f.rows:f.rows.map((ye,Y)=>`${R[Y]??""}${ye}${b[Y]??""}`);return{frame:[m,...Pe,$].join(`
|
|
262
|
+
`),center:f,regions:{rail:D,left:x,center:f,right:v,footer:w}}}function au(e,t,n={}){let r=n.color??!0,s=Vh(e,n.centerOnly??!1),i=yv(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Co(o,s.width,r,"center"))}}function Bh(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Qc(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;let i=r.color??!0,o=Vh(e,r.centerOnly??!1),a=Kh(t,o.width,i).length,l=[...new Set(n)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:d})=>({index:d,row:Co(Gh(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function Vh(e,t){return{row:Z.topRailHeight+1,column:t?1:Z.leftWidth+Z.dividerWidth+1,width:t?e.width:e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth*2,rowCount:e.height-Z.topRailHeight-1}}function hv(e,t,n,r,s){let i=` ${e}`;if(!t)return re(Rt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=$e(o),l=$e(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?Oo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-$e(d)-a-2),p=t.tone==="error"?Mv(o,r,s):Rr(o,r,s),m=`${d}${" ".repeat(u)}${p} `;return re(Rt(m,n),r,s)}function lu(e,t){let n=new Array(e.height).fill(re(" ".repeat(e.width),t.color,N.overlay)),r=ru(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<fv;)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=zh(a[c]??"",e.width);if(c<r.length){n[l+c]=re(d,t.color,N.overlayLogo);continue}if(c===r.length+1){n[l+c]=re(d,t.color,N.overlaySubtitle);continue}let u=c-(r.length+3),m=u>=0&&u<t.menuItems.length&&u===t.menuIndex?N.overlayMenuSelected:N.overlay;n[l+c]=re(d,t.color,m)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-$e(d)));n[e.height-1]=re(`${u}${du(d,t.color,N.overlay)}`,t.color,N.overlay)}return n.join(`
|
|
263
|
+
`)}function gv(e,t,n,r){let s=Rv(e.runners),i=1,o=e.leftTree.map(l=>bv(l,t,r));return[...Is(o,n-i),s]}function yv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Qc(s)?e.centerTranscript.map(o=>({...o})):wv(e);return Is([...Kh(e,t,r),...i],n)}function Kh(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:xv(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Rr(a,n,N.panelBg):Ao(a,n,N.panelMuted)}`,c=[`${Ao(e.centerHeader.tabLabel,n,N.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=Sv(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,m=e.inputMode==="terminal"?Rr(`${u}\u25CF `,n,N.panelBg):"",h=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-$e(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${h}${m}`:d},{text:l,tone:"muted"},{text:c},lt()]}function wv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},lt(),{text:e.terminal.error},lt(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(Gh)}function Gh(e){return{text:uu(e.segments),segments:e.segments,fullBleed:!0}}function kv(e,t,n,r){let s=e.rightInspection?Tv(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):Is([{text:"CONTEXT"},lt(),...e.rightContext.map(i=>Pv(i,r)),...e.actionMessage?[lt(),{text:e.actionMessage}]:[]],n);return Is(s,n)}function Tv(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:Lv(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>Fh(a)),...r.slice(o,o+s).map(a=>Fh(a))]}function Fh(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 bv(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Rr("\u25CF",n,e.selected?N.panelSelected:N.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((h,f)=>h+$e(f.text),0):0,l=t-$e(i)-$e(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?Rr(e.text,n,N.panelBg):e.panelHeader?Ao(e.text,n,N.panelMuted):e.text,u=Rt(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let h=`${r}${e.selected?"\u25B8":" "} `,f=u.slice(h.length+2),y=[{text:h},Hh(e.activity,e.activityAnimationFrame??0),{text:` ${f}${i}${o}`},...e.prBadge??[]];return{text:uu(y),segments:y,tone:p}}if(e.prBadge){let h=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:h,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function Rv(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:N.success.fg}}):n.push({text:s.text,style:{fg:N.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function Sv(e,t,n){return e.map(r=>{let s=r.active?n?Rr(r.label,t,N.panelBg):Ao(r.label,t,N.panelBg):du(r.label,t,N.panelBg),i=r.activity?cu(Hh(r.activity,r.activityAnimationFrame??0),t,N.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Hh(e,t){return{text:"\u25CF",style:{fg:e==="working"?su[t%su.length]??su[0]:e==="ready"?N.success.fg:e==="error"?N.error.fg:N.panelMuted.fg}}}function Pv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?du(e.value,t,N.panelBg):e.value}`}}function Co(e,t,n,r){let s=Iv(r,e.tone??"default"),i=vv(e,n,s);if(r==="left"){if(e.fullBleed)return re(Rt(i,t),n,s);let a=t-Po-Io;if(e.rightAlign){let c=$e(i),d=Math.max(0,a-c),u=`${" ".repeat(Po)}${" ".repeat(d)}${i}${" ".repeat(Io)}`;return re(u,n,s)}let l=`${" ".repeat(Po)}${Rt(i,a)}${" ".repeat(Io)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?Cv(e,t,n,s):re(Rt(` ${i}`,t),n,s)}function Iv(e,t){return t==="selected"||t==="focused"?N.panelSelected:t==="muted"?N.panelMuted:N.panelBg}function Is(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(lt());return n}function lt(){return{text:""}}function vv(e,t,n){return e.segments?e.segments.map(r=>cu(r,t,n)).join(""):e.text}function Cv(e,t,n,r){let s=" ".repeat(vo),i=Math.max(0,t-vo*2);if(!e.segments)return re(`${s}${Rt(e.text,i)}${s}`,n,r);let o=Ov(e.segments,i),a=`${s}${o.map(l=>cu(l,n,r)).join("")}${s}${n?ou:""}`;return re(a,n,r)}function cu(e,t,n){let r=e.href?`${Yh(e.href)}${e.text}${ou}`:Av(e.text);return!t||!e.style?r:`${vs(Nv(e.style,n))}${_v(e.style)}${r}${iu}${vs(n)}`}function Av(e){return e.replace(dv,t=>{let[n,r]=Ev(t);return`${Yh(n)}${n}${ou}${r}`})}function Ev(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Yh(e){return`\x1B]8;;${e}\x1B\\`}function Ov(e,t){let n=$v(e,t);return Dv(n,t)}function $v(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=$e(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Oo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function Dv(e,t){let n=$e(uu(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 Nv(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 _v(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 xv(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 zh(e,t){let n=Math.max(0,t-$e(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function Rt(e,t){let n=$e(e);return n>=t?Fv(e,t):e+" ".repeat(t-n)}function Fv(e,t){if(t<=0)return"";if($e(e)<=t)return e;let n=Xh(e);return Oo(n,Math.max(0,t-1))+"\u2026"}function $e(e){let t=0;for(let n of Array.from(Xh(e)))t+=Jh(n);return t}function Oo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Jh(s);if(r+i>t)break;n+=s,r+=i}return n}function Jh(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 Lv(e,t,n){return Math.min(Math.max(e,t),n)}function Xh(e){return e.replace(uv,"").replace(lv,"")}function uu(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=vs(n),s=e.replace(cv,`${iu}${r}`);return`${r}${s}${iu}`}function vs(e){let t=[];return e.fg&&t.push(`38;2;${Lh(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Lh(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Lh(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Rr(e,t,n){return $o(e,t,N.success.fg,n)}function Mv(e,t,n){return $o(e,t,N.error.fg,n)}function Ao(e,t,n){return $o(e,t,N.accent.fg,n)}function du(e,t,n){return $o(e,t,N.mutedfg.fg,n)}function $o(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${vs(s)}${e}${vs(r)}`}function Qh(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"?qv(s):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:jv(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function jv(e,t){let n=(e??"").split(pu.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(pu.delimiter):[...n,t].join(pu.delimiter)}function qv(e){return e.command.length>0?e.command:["codex"]}function Zh(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 un(e){return{columns:Math.max(20,e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth-vo*2),rows:Math.max(5,e.height-Z.topRailHeight-5)}}function eg(e){return e.length===1||at(e)||e==="BACKSPACE"||e==="TAB"}function dn(e){return typeof e=="string"&&new RegExp(`:(?:agent|${ue.join("|")})(?:-\\d+)?$`).test(e)}function tg(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 fu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function ng(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 Cs(e){return sg.includes(e)?"SHIFT_ENTER":null}function mu(e){return sg.some(t=>t.startsWith(e))}function rg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var sg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function ig(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
262
264
|
`||n===`\r
|
|
263
|
-
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function
|
|
265
|
+
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function og(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function ag(e,t=null){let n=t?.split(`
|
|
264
266
|
`)??[];return e.split(`
|
|
265
|
-
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function No(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as TC,createConnection as dg}from"node:net";import{mkdir as bC,readFile as pg,rm as As,writeFile as RC}from"node:fs/promises";import SC from"node:path";import{setTimeout as Mv}from"node:timers/promises";var dn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=fu(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:fu(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=fu(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 fu(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as eg,readFile as Cv,rm as mu,stat as Av,writeFile as Ev}from"node:fs/promises";import hu from"node:path";async function gu(e){let t=hu.join(e.runtimeDir,"orchestration-supervisor.lock");await eg(e.runtimeDir,{recursive:!0});try{await eg(t)}catch(r){if(!$v(r))throw r;let s=await Cv(hu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Av(t).catch(()=>null);if(typeof s?.pid=="number"&&!Ov(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await mu(t,{recursive:!0,force:!0}),gu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Ev(hu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await mu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await mu(t,{recursive:!0,force:!0}))}}}function Ov(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 $v=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var Dv="\x1B[200~",Nv="\x1B[201~";function tg(e,t){switch(e){case"codex":return _o(t,50);case"cursor":return _o(t,50);case"claude":return _o(t,50);case"pi":return _o(t,50);default:return _v(e)}}function _o(e,t){return{paste:`${Dv}${e}${Nv}`,submit:"\r",submitDelayMs:t}}function _v(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import xv from"node:path";var Lv={type:"system",component:"orchestration-supervisor"};async function ng(e){let t=xv.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await _s(t)??{version:1,commands:{}},r=await Ke(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of Fv(i))o.has(a)||(await Rn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:Lv),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await q(t,n)}function Fv(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var xo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new dn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await gu(this.paths);try{await this.reconcile(),this.heartbeat.start()}catch(t){throw await this.lease.release(),this.lease=null,t}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await ng(this.paths);let t=await Ke(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Cs("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Cs("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,Cs("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,Cs("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Kt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await oe.beginDelivery(this.paths,t.id);try{let o=tg(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await Mv(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,Cs("PROMPT_DELIVERY_UNCERTAIN",o instanceof Error?o.message:"Prompt delivery failed after it began.",!1,!0));return}let i=await oe.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(i)}async failCommand(t,n){let r=await oe.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!jv(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}.`)}}},jv=e=>e.idempotencyKey===`task-start:${e.taskId}`,Cs=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var qv={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Rr=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...qv,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,n){let r=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,n);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:r,lastPollAt:null}),r>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,r+a)),l.intervalMs=a,r>=this.notBefore&&r>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let n=this.now();for(let r of t){let s=this.scheduledTasks.get(r);if(!s)continue;let i=s.lastPollAt===null?n:Math.max(n,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,n){let r=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,n);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:r+i,lastPollAt:r})}}recordFailure(t,n){let r=this.now(),s=n instanceof Ue,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=r+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=r+i,a.lastPollAt=r)}}getTaskIntervalMs(t,n){let r=Uv(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(Wv);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 Uv(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 Wv(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as Bv}from"node:fs";var Lo=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=At(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=Bv(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 Vv={selectedTaskId:null,reviewVisible:!1},Kv={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))))},Fo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??Kv,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Rr({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Lo(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=Hv(s);i.length>0&&await this.onTasksChanged(i);let o=Gv(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new dn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=Vv;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,rg(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)!==rg(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 Gv(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=Jv(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&zv.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 Hv(e){let t=new Set;for(let n of e)n.taskId&&Yv(n)&&t.add(n.taskId);return[...t]}function Yv(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var zv=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),Jv=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function rg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as oC}from"node:module";import Xv from"@xterm/headless";var Qv=1e3,Zv=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function ig(e){return new Xv.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:Qv,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function og(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function wu(e,t){return new Promise(n=>{e.write(t,n)})}function ag(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let d=0;d<e.cols;d+=1){let u=l.getCell(d,s);!u||u.getWidth()===0||c.push({text:u.getChars()||" ",style:nC(u,o+a===i&&d===n.cursorX)})}r.push({segments:eC(tC(c))})}return r}function eC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&iC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};lg(n.style)||(s.style=n.style),t.push(s)}return t}function tC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!lg(n.style))break;t-=1}return e.slice(0,t)}function nC(e,t){let n={},r=sg(e,"fg"),s=sg(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 sg(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"):Zv[s]??rC(s)}function rC(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(sC).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 sC(e){return e===0?0:55+e*40}function iC(e,t){return yu(e)===yu(t)}function yu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function lg(e){return yu(e)===""}var aC=oC(import.meta.url),lC=/^CTRL_([A-Z])$/,cC="\x1B[6n",uC="\x1B[c",dC="\x1B[?u",pC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
266
|
-
`,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},
|
|
267
|
-
`))&&this.touchActivity(n))}writeKey(t){let n=
|
|
268
|
-
[process exited ${m.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function
|
|
267
|
+
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Do(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as _C,createConnection as kg}from"node:net";import{mkdir as xC,readFile as Tg,rm as Es,writeFile as FC}from"node:fs/promises";import LC from"node:path";import{setTimeout as Qv}from"node:timers/promises";var pn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=hu(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:hu(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=hu(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 hu(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as lg,readFile as Uv,rm as gu,stat as Wv,writeFile as Bv}from"node:fs/promises";import yu from"node:path";async function wu(e){let t=yu.join(e.runtimeDir,"orchestration-supervisor.lock");await lg(e.runtimeDir,{recursive:!0});try{await lg(t)}catch(r){if(!Kv(r))throw r;let s=await Uv(yu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Wv(t).catch(()=>null);if(typeof s?.pid=="number"&&!Vv(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await gu(t,{recursive:!0,force:!0}),wu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Bv(yu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await gu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await gu(t,{recursive:!0,force:!0}))}}}function Vv(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 Kv=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var Gv="\x1B[200~",Hv="\x1B[201~";function cg(e,t){switch(e){case"codex":return No(t,50);case"cursor":return No(t,50);case"claude":return No(t,50);case"pi":return No(t,50);default:return Yv(e)}}function No(e,t){return{paste:`${Gv}${e}${Hv}`,submit:"\r",submitDelayMs:t}}function Yv(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import zv from"node:path";var Jv={type:"system",component:"orchestration-supervisor"};async function ug(e){let t=zv.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ns(t)??{version:1,commands:{}},r=await Ge(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of Xv(i))o.has(a)||(await Pn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:Jv),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await q(t,n)}function Xv(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 _o=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 wu(this.paths);try{await this.reconcile(),this.heartbeat.start()}catch(t){throw await this.lease.release(),this.lease=null,t}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await po(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await ug(this.paths);let t=await Ge(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,As("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await po(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,As("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,As("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,As("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Gt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=cg(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await Qv(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,As("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(!Zv(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}.`)}}},Zv=e=>e.idempotencyKey===`task-start:${e.taskId}`,As=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var eC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Sr=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...eC,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,n){let r=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,n);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:r,lastPollAt:null}),r>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,r+a)),l.intervalMs=a,r>=this.notBefore&&r>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let n=this.now();for(let r of t){let s=this.scheduledTasks.get(r);if(!s)continue;let i=s.lastPollAt===null?n:Math.max(n,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,n){let r=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,n);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:r+i,lastPollAt:r})}}recordFailure(t,n){let r=this.now(),s=n instanceof We,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=r+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=r+i,a.lastPollAt=r)}}getTaskIntervalMs(t,n){let r=tC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(nC);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 tC(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 nC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as rC}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=Et(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=rC(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 sC={selectedTaskId:null,reviewVisible:!1},iC={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))))},Fo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??iC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Sr({...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=aC(s);i.length>0&&await this.onTasksChanged(i);let o=oC(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=sC;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,dg(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)!==dg(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 oC(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=uC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&cC.has(i))&&t.add(n.taskId);continue}n.type==="agent.state.changed"&&r?.previousState==="working"&&(r.state==="ready"||r.state==="idle"||r.state==="error")&&t.add(n.taskId)}return[...t]}function aC(e){let t=new Set;for(let n of e)n.taskId&&lC(n)&&t.add(n.taskId);return[...t]}function lC(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var cC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),uC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function dg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as TC}from"node:module";import dC from"@xterm/headless";var pC=1e3,fC=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function fg(e){return new dC.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:pC,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function mg(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Tu(e,t){return new Promise(n=>{e.write(t,n)})}function hg(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let d=0;d<e.cols;d+=1){let u=l.getCell(d,s);!u||u.getWidth()===0||c.push({text:u.getChars()||" ",style:gC(u,o+a===i&&d===n.cursorX)})}r.push({segments:mC(hC(c))})}return r}function mC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&kC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};gg(n.style)||(s.style=n.style),t.push(s)}return t}function hC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!gg(n.style))break;t-=1}return e.slice(0,t)}function gC(e,t){let n={},r=pg(e,"fg"),s=pg(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 pg(e,t){if(t==="fg"?e.isFgDefault():e.isBgDefault())return;let r=t==="fg"?e.isFgRGB():e.isBgRGB(),s=t==="fg"?e.getFgColor():e.getBgColor();return r?s.toString(16).padStart(6,"0"):fC[s]??yC(s)}function yC(e){if(e>=16&&e<=231){let t=e-16,n=Math.floor(t/36),r=Math.floor(t%36/6),s=t%6;return[n,r,s].map(wC).map(i=>i.toString(16).padStart(2,"0")).join("")}if(e>=232&&e<=255){let t=8+(e-232)*10;return[t,t,t].map(n=>n.toString(16).padStart(2,"0")).join("")}return"e6e6e6"}function wC(e){return e===0?0:55+e*40}function kC(e,t){return ku(e)===ku(t)}function ku(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function gg(e){return ku(e)===""}var bC=TC(import.meta.url),RC=/^CTRL_([A-Z])$/,SC="\x1B[6n",PC="\x1B[c",IC="\x1B[?u",vC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
268
|
+
`,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},Lo=class{sessions=new Map;activitySnapshots=new Map;shell;env;spawn;onUpdate;onActivity;onActivityRemoved;activityEnabled;resolveSessionSpec;attachedTabId=null;constructor(t){this.shell=t.shell??process.env.SHELL??"/bin/zsh",this.env=t.env??process.env,this.spawn=t.spawn,this.onUpdate=t.onUpdate,this.onActivity=t.onActivity,this.onActivityRemoved=t.onActivityRemoved,this.activityEnabled=t.activityEnabled??!0,this.resolveSessionSpec=t.resolveSessionSpec??(()=>({cwd:t.workspaceRoot,command:[]}))}ensureSession(t,n,r,s){let i=this.sessions.get(n);if(i)if(i.status!=="running")bu(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,yg(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(`
|
|
269
|
+
`))&&this.touchActivity(n))}writeKey(t){let n=CC(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&&yg(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&&(bu(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())bu(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:AC(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??OC().spawn,o=fg(r),a=s??this.resolveSessionSpec(t,n),l=ro({...this.env,...a.env??{}}),{executable:c,args:d}=$C(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:DC(l)}),p={taskId:t,tabId:n,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(u.onData(m=>{this.touchActivity(p),NC(u,m),Tu(p.terminal,m).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(m=>{p.status="exited",p.exitCode=m.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),Tu(p.terminal,`\r
|
|
270
|
+
[process exited ${m.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function CC(e){if(e.length===1)return e;let t=vC[e];if(t!==void 0)return t;let n=RC.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function yg(e,t){EC(e.pty,t),mg(e.terminal,t),e.screenDirty=!0}function AC(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=hg(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function bu(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function EC(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function OC(){return bC("node-pty")}function $C(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[so(t[0],n),...t.slice(1)].map(wg).join(" ")}; exec ${wg(e)} -l`;return{executable:e,args:["-lc",s]}}function wg(e){return`'${e.replaceAll("'","'\\''")}'`}function DC(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 NC(e,t){for(let n=0;n<Ru(t,SC);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Ru(t,PC);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Ru(t,IC);n+=1)e.write("\x1B[?0u")}function Ru(e,t){if(t.length===0)return 0;let n=0,r=e.indexOf(t);for(;r!==-1;)n+=1,r=e.indexOf(t,r+t.length);return n}var Mo=Rn,MC=16,jC=250;async function bg(e){let t=Ne(e.paths);await BC(t,e.paths,e.spawnDaemon);let n=await Eg(t.socketPath),r=new Su(n,e);return await r.ready(),r}async function Rg(e,t={}){let n=Ne(e);await xC(e.runtimeDir,{recursive:!0}),await Es(n.socketPath,{force:!0});let r=new Pu(e,t),s=_C(i=>r.handleConnection(i));try{await r.start(),await HC(s,n.socketPath),await FC(n.pidPath,String(process.pid),"utf8"),await de.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${Mo}.`,details:{pid:process.pid,protocolVersion:Mo}}),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 Es(n.socketPath,{force:!0}),await Es(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function Sg(e){let t=Ne(e);return await vg(t.socketPath)?(await GC(t.socketPath),!0):!1}var Su=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,this.openFileHandler=n.onOpenFile,t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>{this.closed||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;openFileHandler;buffer="";closed=!1;protocolVersion=Mo;options;async ready(){let t=await this.send({type:"ping"});if(!Ig(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)}
|
|
269
271
|
`);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
270
272
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
271
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=
|
|
273
|
+
`)}}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=WC(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)}}},Pu=class{onShutdown=null;clients=new Set;subscriptions=new Map;updateTimers=new Map;activityTimers=new Map;pendingActivities=new Map;runtime;paths;orchestrationSupervisor=null;orchestrationSupervisorStartup=null;pullRequestSyncSupervisor=null;pullRequestEventReconciliationEnabled=!1;pullRequestSyncOptions;attachedTabId=null;constructor(t,n){this.paths=t,this.pullRequestSyncOptions=n.pullRequestSync;let r={...n};delete r.pullRequestSync,this.runtime=new Lo({...r,workspaceRoot:t.workspaceRoot,activityEnabled:!1,onUpdate:s=>this.handleRuntimeUpdate(s.tabId),onActivity:s=>this.handleActivityUpdate(s),onActivityRemoved:s=>this.handleActivityRemoved(s)})}async start(){let t=await k.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>rn(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new Fo(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 Ge(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(`
|
|
272
274
|
`);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
|
|
273
|
-
`)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}sessionCount(){return this.runtime.sessionTabIds().length}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{
|
|
274
|
-
${s.slice(-2e3)}`:""}`)}async function
|
|
275
|
+
`)}});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{fn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);fn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:Mo,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);fn(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 zC(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(Iu),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)fn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(fn(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)},jC))}}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&&fn(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&&fn(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 _o(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)},MC))}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=qC(s,n),o=UC(s.view,n);s.view=n,s.rowKeys=n.rows.map(Iu),(i.rows.length>0||o)&&fn(r,{type:"update",tabId:t,patch:i})}}};function qC(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Iu(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 UC(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 WC(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Iu(e){return JSON.stringify(e)}async function BC(e,t,n){if(await VC(e.socketPath,1e3))return;if(await vg(e.socketPath)){let i=await Cg(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 KC(e,t),io(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await Pg(e.socketPath))return;await Og(50)}let s=await Tg(LC.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
|
|
276
|
+
${s.slice(-2e3)}`:""}`)}async function Pg(e){let t=await Cg(e).catch(()=>null);return t?.ok===!0&&Ig(t.protocolVersion)}function Ig(e){return Ht(e)}async function VC(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await Pg(e))return!0;await Og(50)}return!1}async function KC(e,t){let n=await Tg(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&YC(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 Es(e.socketPath,{force:!0}),await Es(e.pidPath,{force:!0})}async function vg(e){let t=await Eg(e).catch(()=>null);return t?(t.end(),!0):!1}async function GC(e){await Ag(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Cg(e){return Ag(e,{id:1,type:"ping"})}function Ag(e,t){return new Promise((n,r)=>{let s=kg(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)}
|
|
275
277
|
`)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
|
|
276
|
-
`);if(c===-1)return;let d=i.slice(0,c);a(),s.end();try{n(JSON.parse(d))}catch(u){r(u instanceof Error?u:new Error(String(u)))}}),s.once("close",()=>a())})}function
|
|
277
|
-
`)}catch{}}function
|
|
278
|
-
`}function FC(e){return e.length===1&&e>=" "&&e!==""}import Es from"node:path";function $g(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 Dg="\u{F024B} ",Ng="\u{F0DCF} ",_g="\u25CB",Cu="\uEA64",xg="\uEAFE",Lg="\uEBDA",Au="\u25CB",Eu="\u25CF",Ou="\u2713",$u="\u2715";function Fg(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 Du=150,Mg=6;var Wo="empty",pe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Wg(e,t,n){let r=qC(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=TA(t.tasks),d=BC(e,a),u=WC(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},m=t.inspection?.taskId===a?.id?t.inspection:null,h=s?.name??"no repo",f=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ss(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":d===B?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Es.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Es.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:MC(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>bA(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:h,agent:f},centerTranscript:UC(d,e,s,a,e.workspaceBrowser,m,r),tabs:u,rightContext:kA(s,a),rightInspection:nA(e,a,m)}}function MC(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 jC(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=ko(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 bs(c)){let p=e.selectedLeftItemId===`task:${d.id}`,m=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,h={id:`task:${d.id}`,taskId:d.id,text:n?m:`${p?"\u25B8":"\u2022"} ${m}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:Zn(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=Vg(d);f&&(h.prBadge=f),r.push(h)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function jC(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=To(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 bs(l)){let m=t.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:s?h:`${m?"\u25B8":"\u2022"} ${h}`,indent:p===0?2:4,selected:m,focused:m&&t.focusedRegion==="tasks",...s?{activity:Zn(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Vg(u);y&&(f.prBadge=y),e.push(f)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function qC(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 UC(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let m=p===s.selectedIndex?"\u25B8":" ",h=u.kind==="repo"?" [git repo]":"/";return`${m} ${u.name}${h}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ct(["Browse for a workspace to register.",s.cwd,...d?[d]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return ct(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,d=l?"Project Task":"Task";return ct([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===B&&t.openInspectionKind==="file"?GC(r,i,t.fileScrollOffset):e===B&&t.openInspectionKind==="diff"?HC(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ct(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ct(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function WC(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:VC(o),...o.kind==="agent"&&r&&t?{activity:Kt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:Wo,label:"EMPTY",active:n===Wo,focused:e.focusedRegion==="center"&&n===Wo}];let i=e.openInspectionKind||n===B?[{id:B,label:KC(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function BC(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:Wo}function VC(e){return e.title.toUpperCase()}function KC(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Es.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function GC(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ct(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Bg(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:""},...YC(r.lines,n,s)]}function HC(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ct(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Bg(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:""},...zC(r.lines,n,s)]}function ct(e){return e.map(t=>({text:t}))}function YC(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:pe.lineNumber}},{text:" \u2502 ",style:{fg:pe.gutter}},...Nu(i,n)],tone:"default"}})}function zC(e,t,n){let r=JC(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>XC(i,n))}function JC(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 XC(e,t){let n=jg(e.oldNumber),r=jg(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:pe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:pe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?ZC(Nu(e.text,t),i.bg,i.fallbackFg):Nu(e.text,t),l=i?{fg:pe.lineNumber,bg:i.bg}:{fg:pe.lineNumber},c=i?{fg:pe.gutter,bg:i.bg}:{fg:pe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function jg(e){return e===null?" ":String(e).padStart(4," ")}function Bg(e){let t=Es.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 Nu(e,t){return t==="diff"?QC(e):t==="markdown"?eA(e):t==="json"?_u(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?_u(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 QC(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:pe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:pe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:pe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:pe.diffMeta}}]:[{text:e}]}function ZC(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function eA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:pe.markup,bold:!0}}]:_u(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function _u(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:tA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function tA(e){return e.startsWith("//")||e.startsWith("/*")?{fg:pe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:pe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:pe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:pe.markup}:{fg:pe.keyword}}function nA(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"?Kg(t.repoTargets??[]):s?.pullRequest??(t?W(t):null),o=[rA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Yg(e,t),l=xu(e,n),c=lA([{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,...gA(e,n)]}:{title:"",rows:[...o,...xu(e,n)]}}function rA(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=Lu(t),o=Fu(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function qg(e){return[{text:" "},Lu(e),{text:" "},Fu(e)]}function Vg(e){if(e.type==="project"&&e.repoTargets?.length){let n=Kg(e.repoTargets);return n?qg(n):null}let t=W(e);return t?.number?qg(t):null}function Kg(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=iA(n);return{number:-1,status:sA(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 sA(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 iA(e){let t=e.map(n=>Gg(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 Lu(e){return!e||!e.number?{text:_g,style:{fg:"565f89"}}:e.status==="merged"?{text:xg,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Lg,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Cu,style:{fg:"565f89"}}:{text:Cu,style:{fg:"9ece6a"}}}function Fu(e){return e?.aggregateReadiness?Ug(e.aggregateReadiness):Ug(Gg(e))}function Ug(e){return e==="failed"?{text:$u,style:{fg:"f7768e"}}:e==="pending"?{text:Eu,style:{fg:"e0af68"}}:e==="success"?{text:Ou,style:{fg:"9ece6a"}}:{text:Au,style:{fg:"565f89"}}}function Gg(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")?Hg(e)?"failed":oA(e)?"success":"pending":"pending"}function oA(e){return!!(e.mergeable&&!e.draft&&!Hg(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Hg(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Yg(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return aA(e,t);let n=W(t),r=Jg("pr",t.branch,n??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(i=>i!==n&&(i.status==="merged"||i.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),r}var Uo=32;function aA(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let o of r){let a=s===o.repoId,l=e.focusedRegion==="inspector"&&a,c=o.repoId.startsWith("repo_")?o.repoId.slice(5):o.repoId;if(o.status!=="ready"){let u=o.failureReason?o.failureReason.slice(0,14):o.status,p=Uo-u.length-1,m=c.length>p?c.slice(0,p-1)+"\u2026":c,h=Uo-m.length-u.length;n.push({id:`project-review:${o.repoId}`,text:m+" ".repeat(Math.max(1,h))+u,selected:a,focused:l,muted:!0})}else{let d=Lu(o.pullRequest),u=Fu(o.pullRequest),p=`${d.text} ${u.text}`,m=Uo-p.length-1,h=c.length>m?c.slice(0,m-1)+"\u2026":c,f=Uo-h.length-p.length,y=h+" ".repeat(Math.max(1,f));n.push({id:`project-review:${o.repoId}`,text:y+p,selected:a,focused:l,segments:[{text:y},{...d,text:d.text},{text:" "},{...u,text:u.text}]})}}let i=r.find(o=>o.repoId===s)??null;return i?.status==="ready"&&i.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...Jg("target",i.branch,i.pullRequest))),n}function zg(e,t,n=null){return 3+Yg(e,t).length+xu(e,n).length}function Jg(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=cA(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:uA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Xg(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(dA)):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)=>pA(u,r(`comment:${p}`))))),s}function lA(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 cA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function uA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Xg(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 dA(e){let{icon:t,color:n}=mA(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," ")} ${hA(e.status)}`,color:n,muted:!1}}function pA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Xg(e.createdAt)}`:"",s=fA(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 fA(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 mA(e){switch(e){case"success":return{icon:Ou,color:"9ece6a"};case"pending":return{icon:Eu,color:"e0af68"};case"failed":return{icon:$u,color:"f7768e"};case"skipped":return{icon:Au,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function hA(e){return e==="success"?"passing":e==="failed"?"failing":e}function gA(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=Mu(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)?Dg:Ng:$g(l.label),p=l.kind==="directory"?"7aa2f7":Fg(l.label),m=" ".repeat(l.depth),h=p?{text:u,style:{fg:p}}:{text:u},f=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:m},h,f];return{id:l.path,text:`${m}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function Mu(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 xu(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(yA(t))return wA(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=>Qg(i,e,t))))}return n}function yA(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function wA(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=>Qg(c,e,t,s.length+1))))}}return n}function Qg(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 kA(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:Es.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 TA(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function bA(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Zg(e,t,n,r,s=null){if(s)return RA(e,t,n,r,s);let i=iu(e,t,{centerOnly:r});return SA(n,i)?{output:No(i.rows,n.rows,i.row,i.column),region:i}:null}function RA(e,t,n,r,s){let i=xh(e,t,s,{centerOnly:r});if(!i||!PA(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 SA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function PA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function ey(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!IA(o,a))return null;!o||!a||(s+=No(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function IA(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 vA=["tasks","center","inspector"];function CA(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 qu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return Wu({...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 Wu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Th(t)?A({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):A({state:e});if(e.fileSearchQuery!==null)return CA(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"&&(bo(e.selectedLeftItemId)||Ro(e.selectedLeftItemId)))return A({state:{...e,selectedRunner:wo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return ty(e,1);if(t==="SHIFT_TAB"||t==="[")return ty(e,-1);if(t==="z"||t==="Z")return A({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===B?pn(e,-1,n):qu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===B?pn(e,1,n):qu(e,1,n);if(t==="PAGE_UP")return pn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return pn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return pn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return pn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??ut,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=xA(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"&&Ss(e.selectedLeftItemId)&&e.selectedTaskId)return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&vh(e.selectedLeftItemId)&&e.selectedWorkspaceId)return A({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&sy(e.activeTab,n.ptyTabIds??[]))return A({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return ju(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return ny(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return ju(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return ny(e,1)}if(at(t)){if(e.focusedRegion==="tasks"&&(bo(e.selectedLeftItemId)||Ro(e.selectedLeftItemId))){let r=Qc(e.selectedLeftItemId),s=Zc(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"&&Ss(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return A({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:kr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&sy(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return A({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:kr(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:OA({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return A({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:B,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?A({state:{...e,selectedDiffPath:r,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?A({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):A({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?A({state:e}):e.selectedActionId==="refresh-checks"?A({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?A({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):A({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return A({state:e})}function pn(e,t,n){if(t===0)return A({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?iy(e,t,n):e.inspectionMode==="review"?ry(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):A({state:e});if(e.focusedRegion==="center"&&e.activeTab===B){if(e.openInspectionKind==="file")return ry(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return $A(e,t,n)}return A({state:e})}function ty(e,t){return Bo(e,"focusedRegion",vA,t)}function ju(e,t,n){let r=Bo(e,"activeTab",n&&n.length>0?n:LA(e),t);return!r.changed||Rh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:kr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function qu(e,t,n){if(e.focusedRegion==="tasks")return AA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return ju(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return iy(e,t,n);if(n.projectTargetIds?.length){let s=Uu(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Uu(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Bo(e,"selectedActionId",hh,t)}return Bo(e,"selectedActionId",Yc,t)}function AA(e,t,n){let r=Uu(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Xc(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=Qc(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Zc(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function EA(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 ny(e,t){return EA(e,_A(e.inspectionMode,zc,t))}function iy(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=Mt(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 OA(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 ry(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Mt(e[t]+n,0,i);return o===e[t]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function $A(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return DA(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=Mt(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=Mt(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=Mt(o,0,i);return c===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function DA(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Mt(e.diffScrollOffset+t,0,i),a=NA(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 NA(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Bo(e,t,n,r){let s=n.indexOf(e[t]),i=Mt(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 Uu(e,t,n,r,s=!1){if(n.length===0)return A({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Mt(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 _A(e,t,n){let r=t.indexOf(e);return t[Mt(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 sy(e,t){return t.includes(e)}function xA(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":kr(e.activeTab)??e.preferredPtyTabKind}function LA(e){return[e.selectedPtyTabId,e.openInspectionKind?B:null].filter(t=>typeof t=="string")}function Mt(e,t,n){return Math.min(n,Math.max(t,e))}var oy=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??FA(i,e.activeTab,e.preferredPtyTabKind),a=uy(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"}`}}},ay=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}`}}},ly=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})})},cy=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=uy(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 FA(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function uy(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(m=>m.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var Sr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},dy=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=so();io(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Sr(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}},py=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},fy=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 Ar(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}`}}},my=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Ar(t.paths,n.id)))),Os=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await ue.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var hy=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var gy=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},yy=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},wy=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var MA=250;function jt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Fn(e,t){return Ft(t,e.ptyRuntime.getViewState(Pr(e,t)))}function Pr(e,t){let n=jt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function I(e,t){return Fn(e,Ch(t,e.model))}function ky(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 Ty(e,t,n){return ky(e,t,n?{tone:"success",message:n}:null)}function re(e,t,n){return ky(e,t,{tone:"error",message:n})}function se(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return ue.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Q(e,t){if(!e.uiStateFile)return;e.runtimeState=wh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>qt({uiStateFile:e.uiStateFile},n),()=>qt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function jA(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function ie(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:we,queueTaskMutation:t=>jA(e,t)}}function Bu(e,t){let n=jt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?Mu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:xn(e.model),centerTabIds:Ph(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:zg(t,n,s),pageRows:Math.max(5,Fe(e.activeTerminal.width,e.activeTerminal.height).height-X.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function by(e,t){await ly(t,ie(e))}async function be(e){e.model=await Tr(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 Vo(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),t].sort((n,r)=>n.id.localeCompare(r.id))}}async function Ko(e,t){let n=++e.inspectionRefreshSequence,r=eu(e.model.tasks,t),s=e.model.inspection,i=t.focusedRegion==="inspector"&&t.inspectionMode==="review"&&t.openInspectionKind!=="diff",o;if(r&&s?.taskId===r.id&&!i){let a={selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath},l=await rh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Tr(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)},Q(e,e.state.shell),e.render())}function Ry(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)&&Ko(e,n).catch(r=>{let s=se(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:re(e,I(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},MA))}function Sy(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=pn(e.state.shell,n,Bu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},Q(e,e.state.shell),e.render(),Ko(e,e.state.shell).catch(s=>{let i=se(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:re(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:I(e,r.state)},Q(e,e.state.shell),e.render()}},16)))}function Vu(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Ku(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 Iy(e){Ku(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function vy(e,t){let n=I(e,t),r=jt(e.model.tasks,n),s=Pr(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 Ft(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));return Ft({...n,inputMode:"control"},o)}function Gu(e){let t=e.state.mode==="main"&&e.state.shell.inputMode==="terminal"?"terminal":"control";t!==e.inputCaptureMode&&(e.inputCaptureMode=t,e.activeTerminal.grabInput(t==="terminal"?{mouse:"button"}:!0))}async function Hu(e,t){try{let n=I(e,t),r=jt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await Py(e,r),await be(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Py(e,r),await be(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:Ft({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Q(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Ft({...i,inputMode:"terminal"},o)},Q(e,e.state.shell)}catch(n){let r=se(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&un(t.selectedPtyTabId)&&(await qA(e,t.selectedTaskId,r).catch(()=>{}),await be(e).catch(()=>{})),e.state={mode:"main",shell:re(e,kh(I(e,t),r),r)},Q(e,e.state.shell)}e.render()}async function qA(e,t,n){await py(t,n,ie(e))}async function Cy(e,t,n,r){let s=I(e,t),{nextShell:i}=await oy(s,n,r,ie(e));return await be(e),I(e,{...s,...i})}async function Ay(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await ay(n,ie(e));return e.ptyRuntime.disposeSession(r.id),await be(e),I(e,{...n,...s})}async function Ey(e,t){let n=I(e,t),r=xn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await fy(n,ie(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await be(e),I(e,{...n,...o,selectedLeftItemId:UA(r,xn(e.model),s)})}async function Oy(e,t){let n=I(e,t),{nextShell:r}=await hy(n,ie(e));return await be(e),I(e,{...n,...r})}async function Py(e,t){return cy(t,ie(e))}function Go(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:Fn(e,e.state.shell)},e.render())},16))}function UA(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 Dy(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=$y(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await my(s,ie(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Vo(e,o);t.recordSuccess(i,$y(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,Os("background PR polling",i,ie(e)))}}function $y(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Ny(e,t){let n=I(e,t),r=jt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await be(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 be(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${W(a)?.requiredChecks.length??0} reported`)}return I(e,{...Ty(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import GA from"node:path";import{readdir as WA,stat as BA}from"node:fs/promises";import _y from"node:path";async function VA(e){let t=await WA(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=_y.join(e,r.name);n.push({name:r.name,path:s,kind:await KA(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 xy(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Ly(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 Ho(e,t){let n=await VA(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 KA(e){let t=_y.join(e,".git");return await BA(t).catch(()=>null)!==null}function Fy(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function My(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function HA(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"";if(!t.selectedRepoId&&!t.selectedWorkspaceId){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:I(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let r=null;try{let s=await dy(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,ie(e));r=s.task,await be(e);let i=I(e,{...e.state.shell,...s.nextShell,selectedLeftItemId:`task:${r.id}`,inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),o=await e.ptyRuntime.ensureSession(r.id,i.selectedPtyTabId??Kh(r,"agent"),cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(i.selectedPtyTabId),e.state={mode:"main",shell:Ft(i,o)},Q(e,e.state.shell)}catch(s){s instanceof Sr&&(r=s.task);let i=se(e,"create task",s,"Failed to create task.");r&&!(s instanceof Sr)?(await V(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await be(e).catch(()=>{})):r&&(await V(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await be(e).catch(()=>{})),e.state={mode:"main",shell:re(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function YA(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(at(t)){HA(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:I(e,{...n,selectedRunner:wo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}bh(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function zA(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=xy(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"){Ho(e,GA.dirname(n.cwd)).catch(s=>{let i=se(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:re(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||at(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Ho(e,s.path).catch(o=>{let a=se(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:re(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=ie(e);i.addWorkspace(e.paths,s.path).then(async o=>{await be(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},Q(e,e.state.shell),e.render()}).catch(o=>{let a=se(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:re(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function JA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Ag(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;XA(e,r)}}}async function XA(e,t){let n;try{n=await ue.readLog(e.paths)}catch(r){let s=se(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function QA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Og(Fy(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"?gy(n.runner,n.enabled,ie(e)):yy(n.runner,n.path,ie(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=se(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:re(e,I(e,e.state.shell),i),runnerOptions:{...Fy(e),message:i}},e.render()})}function ZA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Eg(My(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}wy(n.feature,n.enabled,ie(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:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=se(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:re(e,I(e,e.state.shell),s),previewOptions:{...My(e),message:s}},e.render()})}}function jy(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){YA(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){zA(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){tE(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=Wu(e.state.shell,n,Bu(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)},Q(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)},Q(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&at(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=vs(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(eE(e,n))return;e.lastTerminalKey=Gh(n)?{key:n,at:Date.now()}:null;let i=Hh(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Go(e,i);return}e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:I(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){e.state={mode:"main",shell:I(e,r.state)},Q(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Ho(e,e.workspaceRoot).catch(s=>{let i=se(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:re(e,I(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Cy(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Hu(e,s)}).catch(s=>{let i=se(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:re(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Ay(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=se(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:re(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){Ny(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=se(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:re(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=jt(e.model.tasks,r.state),i=s?W(s)?.url??null:null;i?Ly(i).catch(o=>{let a=se(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:re(e,I(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:re(e,I(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){Ey(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=se(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:re(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Oy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=se(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:re(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Hu(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},Q(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ry(e,e.state.shell);return}Ko(e,e.state.shell).catch(s=>{let i=se(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:re(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:I(e,r.state)},by(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:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){JA(e,n);return}if(e.state.variant==="runners"){QA(e,n);return}if(e.state.variant==="previews"){ZA(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||at(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.optionsMessage){(n==="ESCAPE"||at(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(at(n)){if(e.state.menuIndex===0){let r=e.state.variant==="boot";e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),r?e.bootHydrationReady.then(()=>{if(e.state.mode!=="main")return;let s=e.state.shell;vy(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},Q(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=se(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:re(e,I(e,e.state.shell),o)},Q(e,e.state.shell),e.render()})}):Iy(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 qy(e,t){let n=Qh(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=vs(i);if(o){Wy(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(pu(i)){e.pendingTerminalKeySequence.raw=i,Uy(e);return}Yo(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"})},Q(e,e.state.shell),e.render();return}let r=Yh(n);if(r!==0){Go(e,r);return}let s=vs(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
278
|
+
`);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 Eg(e){return new Promise((t,n)=>{let r=kg(e);r.once("connect",()=>t(r)),r.once("error",n)})}function HC(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function fn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
|
|
279
|
+
`)}catch{}}function YC(e){try{return process.kill(e,0),!0}catch{return!1}}function Og(e){return new Promise(t=>setTimeout(t,e))}function zC(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Cu=["Runners","Feature Previews","Logs","Help"],Dg={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner"};function Au(e,t){return vu(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 Ng(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 _g(e){return Je.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Dg[t]}`)}function xg(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Fg(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Cu.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:jo(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Lg(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(Je.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!jo(n))return{kind:"noop",state:e};let r=Je[e.menuIndex]??Je[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Dg[r]} ${s?"enabled":"disabled"}.`}}}function Mg(e,t,n,r){if(e.pathEdit)return JC({...e,pathEdit:e.pathEdit},t,n);let s=Au(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=vu(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!jo(n))return{kind:"noop",state:e};let i=vu(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 vu(e){return ue.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function JC(e,t,n){if(n==="ESCAPE")return{kind:"render",state:$g({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(jo(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:$g({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return XC(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function $g(e){let t={...e};return delete t.pathEdit,t}function jo(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
280
|
+
`}function XC(e){return e.length===1&&e>=" "&&e!==""}import Os from"node:path";function jg(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 qg="\u{F024B} ",Ug="\u{F0DCF} ",Wg="\u25CB",Eu="\uEA64",Bg="\uEAFE",Vg="\uEBDA",Ou="\u25CB",$u="\u25CF",Du="\u2713",Nu="\u2715";function Kg(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 _u=150,Gg=6;var Uo="empty",fe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Jg(e,t,n){let r=eA(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=_A(t.tasks),d=rA(e,a),u=nA(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},m=t.inspection?.taskId===a?.id?t.inspection:null,h=s?.name??"no repo",f=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ps(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":d===B?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Os.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Os.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:QC(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>xA(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:h,agent:f},centerTranscript:tA(d,e,s,a,e.workspaceBrowser,m,r),tabs:u,rightContext:NA(s,a),rightInspection:gA(e,a,m)}}function QC(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 ZC(r,e,t.repos,t.tasks,n);let s=t.workspaces;if(s.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of s){let a=e.selectedLeftItemId===`workspace:${o.id}`;r.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:a,focused:a&&e.focusedRegion==="tasks"});let l=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],c=wo(t.tasks,o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:u}of Rs(c)){let p=e.selectedLeftItemId===`task:${d.id}`,m=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,h={id:`task:${d.id}`,taskId:d.id,text:n?m:`${p?"\u25B8":"\u2022"} ${m}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:er(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=Qg(d);f&&(h.prBadge=f),r.push(h)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function ZC(e,t,n,r,s){if(n.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let o of n){let a=t.selectedLeftItemId===`repo:${o.id}`;e.push({id:`repo:${o.id}`,text:`\u2013 ${o.name}`,selected:a,focused:a&&t.focusedRegion==="tasks"});let l=ko(r,o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:p}of Rs(l)){let m=t.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:s?h:`${m?"\u25B8":"\u2022"} ${h}`,indent:p===0?2:4,selected:m,focused:m&&t.focusedRegion==="tasks",...s?{activity:er(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Qg(u);y&&(f.prBadge=y),e.push(f)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function eA(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 tA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let m=p===s.selectedIndex?"\u25B8":" ",h=u.kind==="repo"?" [git repo]":"/";return`${m} ${u.name}${h}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ct(["Browse for a workspace to register.",s.cwd,...d?[d]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return ct(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,d=l?"Project Task":"Task";return ct([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===B&&t.openInspectionKind==="file"?oA(r,i,t.fileScrollOffset):e===B&&t.openInspectionKind==="diff"?aA(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ct(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ct(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function nA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:sA(o),...o.kind==="agent"&&r&&t?{activity:Gt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:Uo,label:"EMPTY",active:n===Uo,focused:e.focusedRegion==="center"&&n===Uo}];let i=e.openInspectionKind||n===B?[{id:B,label:iA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function rA(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===B&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??B:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??B:Uo}function sA(e){return e.title.toUpperCase()}function iA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Os.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function oA(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ct(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Xg(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:""},...lA(r.lines,n,s)]}function aA(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ct(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Xg(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:""},...cA(r.lines,n,s)]}function ct(e){return e.map(t=>({text:t}))}function lA(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}},...xu(i,n)],tone:"default"}})}function cA(e,t,n){let r=uA(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>dA(i,n))}function uA(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 dA(e,t){let n=Hg(e.oldNumber),r=Hg(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?fA(xu(e.text,t),i.bg,i.fallbackFg):xu(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 Hg(e){return e===null?" ":String(e).padStart(4," ")}function Xg(e){let t=Os.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 xu(e,t){return t==="diff"?pA(e):t==="markdown"?mA(e):t==="json"?Fu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Fu(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 pA(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 fA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function mA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:Fu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Fu(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:hA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function hA(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 gA(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"?Zg(t.repoTargets??[]):s?.pullRequest??(t?V(t):null),o=[yA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=ny(e,t),l=Lu(e,n),c=RA([{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,...OA(e,n)]}:{title:"",rows:[...o,...Lu(e,n)]}}function yA(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=Mu(t),o=ju(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Yg(e){return[{text:" "},Mu(e),{text:" "},ju(e)]}function Qg(e){if(e.type==="project"&&e.repoTargets?.length){let n=Zg(e.repoTargets);return n?Yg(n):null}let t=V(e);return t?.number?Yg(t):null}function Zg(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=kA(n);return{number:-1,status:wA(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 wA(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 kA(e){let t=e.map(n=>ey(n));return t.some(n=>n==="failed")?"failed":t.some(n=>n==="pending")?"pending":t.length>0&&t.every(n=>n==="success")?"success":"none"}function Mu(e){return!e||!e.number?{text:Wg,style:{fg:"565f89"}}:e.status==="merged"?{text:Bg,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Vg,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Eu,style:{fg:"565f89"}}:{text:Eu,style:{fg:"9ece6a"}}}function ju(e){return e?.aggregateReadiness?zg(e.aggregateReadiness):zg(ey(e))}function zg(e){return e==="failed"?{text:Nu,style:{fg:"f7768e"}}:e==="pending"?{text:$u,style:{fg:"e0af68"}}:e==="success"?{text:Du,style:{fg:"9ece6a"}}:{text:Ou,style:{fg:"565f89"}}}function ey(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")?ty(e)?"failed":TA(e)?"success":"pending":"pending"}function TA(e){return!!(e.mergeable&&!e.draft&&!ty(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function ty(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function ny(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return bA(e,t);let n=V(t),r=sy("pr",t.branch,n??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(i=>i!==n&&(i.status==="merged"||i.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),r}var qo=32;function bA(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let o of r){let a=s===o.repoId,l=e.focusedRegion==="inspector"&&a,c=o.repoId.startsWith("repo_")?o.repoId.slice(5):o.repoId;if(o.status!=="ready"){let u=o.failureReason?o.failureReason.slice(0,14):o.status,p=qo-u.length-1,m=c.length>p?c.slice(0,p-1)+"\u2026":c,h=qo-m.length-u.length;n.push({id:`project-review:${o.repoId}`,text:m+" ".repeat(Math.max(1,h))+u,selected:a,focused:l,muted:!0})}else{let d=Mu(o.pullRequest),u=ju(o.pullRequest),p=`${d.text} ${u.text}`,m=qo-p.length-1,h=c.length>m?c.slice(0,m-1)+"\u2026":c,f=qo-h.length-p.length,y=h+" ".repeat(Math.max(1,f));n.push({id:`project-review:${o.repoId}`,text:y+p,selected:a,focused:l,segments:[{text:y},{...d,text:d.text},{text:" "},{...u,text:u.text}]})}}let i=r.find(o=>o.repoId===s)??null;return i?.status==="ready"&&i.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...sy("target",i.branch,i.pullRequest))),n}function ry(e,t,n=null){return 3+ny(e,t).length+Lu(e,n).length}function sy(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=SA(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:PA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${iy(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(IA)):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)=>vA(u,r(`comment:${p}`))))),s}function RA(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 SA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function PA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function iy(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 IA(e){let{icon:t,color:n}=AA(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," ")} ${EA(e.status)}`,color:n,muted:!1}}function vA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${iy(e.createdAt)}`:"",s=CA(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 CA(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 AA(e){switch(e){case"success":return{icon:Du,color:"9ece6a"};case"pending":return{icon:$u,color:"e0af68"};case"failed":return{icon:Nu,color:"f7768e"};case"skipped":return{icon:Ou,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function EA(e){return e==="success"?"passing":e==="failed"?"failing":e}function OA(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=qu(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)?qg:Ug:jg(l.label),p=l.kind==="directory"?"7aa2f7":Kg(l.label),m=" ".repeat(l.depth),h=p?{text:u,style:{fg:p}}:{text:u},f=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:m},h,f];return{id:l.path,text:`${m}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function qu(e,t){let n=new Set(t);return e.filter(r=>{let s=r.path.split("/");for(let i=1;i<s.length;i+=1)if(n.has(s.slice(0,i).join("/")))return!1;return!0})}function Lu(e,t){if(!t)return[{id:"empty",text:"No task diff index.",muted:!0}];if(t.error)return[{id:"error",text:t.error,muted:!0}];if(t.diffRows.length===0)return[{id:"empty",text:t.filePaths.some(s=>s.startsWith("repo_"))?"No changes in project task worktrees. Edits in the original repos are outside this task.":"No local changes.",muted:!0}];if($A(t))return DA(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=>oy(i,e,t))))}return n}function $A(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function DA(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=>oy(c,e,t,s.length+1))))}}return n}function oy(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 NA(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:Os.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 _A(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function xA(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function ay(e,t,n,r,s=null){if(s)return FA(e,t,n,r,s);let i=au(e,t,{centerOnly:r});return LA(n,i)?{output:Do(i.rows,n.rows,i.row,i.column),region:i}:null}function FA(e,t,n,r,s){let i=Bh(e,t,s,{centerOnly:r});if(!i||!MA(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 LA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function MA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function ly(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!jA(o,a))return null;!o||!a||(s+=Do(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function jA(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 qA=["tasks","center","inspector"];function UA(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 Wu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return Vu({...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 Vu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Ah(t)?A({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):A({state:e});if(e.fileSearchQuery!==null)return UA(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return A({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return A({state:e,exit:!0});if(t==="ESCAPE")return A({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return A({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(To(e.selectedLeftItemId)||bo(e.selectedLeftItemId)))return A({state:{...e,selectedRunner:yo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return cy(e,1);if(t==="SHIFT_TAB"||t==="[")return cy(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):Wu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===B?mn(e,1,n):Wu(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??dt,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=zA(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"&&Ps(e.selectedLeftItemId)&&e.selectedTaskId)return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&_h(e.selectedLeftItemId)&&e.selectedWorkspaceId)return A({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&py(e.activeTab,n.ptyTabIds??[]))return A({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Uu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return uy(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Uu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return uy(e,1)}if(at(t)){if(e.focusedRegion==="tasks"&&(To(e.selectedLeftItemId)||bo(e.selectedLeftItemId))){let r=eu(e.selectedLeftItemId),s=tu(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"&&Ps(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return A({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Tr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&py(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return A({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Tr(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:VA({...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"?fy(e,t,n):e.inspectionMode==="review"?dy(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):A({state:e});if(e.focusedRegion==="center"&&e.activeTab===B){if(e.openInspectionKind==="file")return dy(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return KA(e,t,n)}return A({state:e})}function cy(e,t){return Wo(e,"focusedRegion",qA,t)}function Uu(e,t,n){let r=Wo(e,"activeTab",n&&n.length>0?n:JA(e),t);return!r.changed||Oh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Tr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Wu(e,t,n){if(e.focusedRegion==="tasks")return WA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Uu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return fy(e,t,n);if(n.projectTargetIds?.length){let s=Bu(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Bu(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Wo(e,"selectedActionId",Sh,t)}return Wo(e,"selectedActionId",Jc,t)}function WA(e,t,n){let r=Bu(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Zc(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=eu(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=tu(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function BA(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 uy(e,t){return BA(e,YA(e.inspectionMode,Xc,t))}function fy(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=jt(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 VA(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 dy(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=jt(e[t]+n,0,i);return o===e[t]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function KA(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return GA(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=jt(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=jt(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=jt(o,0,i);return c===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function GA(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=jt(e.diffScrollOffset+t,0,i),a=HA(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 HA(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Wo(e,t,n,r){let s=n.indexOf(e[t]),i=jt(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 Bu(e,t,n,r,s=!1){if(n.length===0)return A({state:e});let i=n.indexOf(e[t]??n[0]??""),o=jt(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 YA(e,t,n){let r=t.indexOf(e);return t[jt(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 py(e,t){return t.includes(e)}function zA(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Tr(e.activeTab)??e.preferredPtyTabKind}function JA(e){return[e.selectedPtyTabId,e.openInspectionKind?B:null].filter(t=>typeof t=="string")}function jt(e,t,n){return Math.min(n,Math.max(t,e))}var my=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>K(r.paths,e.selectedTaskId,i=>{let o=t??XA(i,e.activeTab,e.preferredPtyTabKind),a=wy(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"}`}}},hy=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 K(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}`}}},gy=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await K(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},yy=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await K(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=wy(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await K(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 XA(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function wy(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(m=>m.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var Pr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},ky=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=ro();so(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Pr(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}},Ty=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},by=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 Or(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}`}}},Ry=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Or(t.paths,n.id)))),Ir=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 Sy=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var Py=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Iy=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},vy=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var QA=250;function qt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Mn(e,t){return Mt(t,e.ptyRuntime.getViewState(vr(e,t)))}function vr(e,t){let n=qt(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 Mn(e,xh(t,e.model))}function Cy(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 Ay(e,t,n){return Cy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return Cy(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=vh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>Ut({uiStateFile:e.uiStateFile},n),()=>Ut({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function ZA(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=>ZA(e,t)}}function Ku(e,t){let n=qt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?qu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Ln(e.model),centerTabIds:Dh(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,je(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function Ey(e,t){await gy(t,oe(e))}async function Se(e){e.model=await br(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:I(e,e.state.shell)}:e.state={...e.state,shell:I(e,e.state.shell)}}function Bo(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),...t.status==="closed"?[]:[t]].sort((n,r)=>n.id.localeCompare(r.id))}}async function Vo(e,t){let n=++e.inspectionRefreshSequence,r=nu(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 ch(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await br(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 Oy(e,t){e.pendingLeftNavInspectionShell=t,!e.leftNavInspectionTimer&&(e.leftNavInspectionTimer=setTimeout(()=>{e.leftNavInspectionTimer=null;let n=e.pendingLeftNavInspectionShell;e.pendingLeftNavInspectionShell=null,!(!n||e.state.mode!=="main"||e.state.shell!==n)&&Vo(e,n).catch(r=>{let s=ie(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},QA))}function $y(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,Ku(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(),Vo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:I(e,r.state)},J(e,e.state.shell),e.render()}},16)))}function Gu(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Hu(e){let t=e.model.tasks.flatMap(n=>n.ptyTabs.map(r=>r.id));await e.ptyRuntime.pruneStale?.(t),await e.ptyRuntime.hydrateSessions?.(t)}function Ny(e){Hu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function _y(e,t){let n=I(e,t),r=qt(e.model.tasks,n),s=vr(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 Mt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,un(je(e.activeTerminal.width,e.activeTerminal.height)));return Mt({...n,inputMode:"control"},o)}function Yu(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 zu(e,t){try{let n=I(e,t),r=qt(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 Dy(e,r),await Se(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Dy(e,r),await Se(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:Mt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},J(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,un(je(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=dn(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Mt({...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&&dn(t.selectedPtyTabId)&&(await eE(e,t.selectedTaskId,r).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:se(e,Ch(I(e,t),r),r)},J(e,e.state.shell)}e.render()}async function eE(e,t,n){await Ty(t,n,oe(e))}async function xy(e,t,n,r){let s=I(e,t),{nextShell:i}=await my(s,n,r,oe(e));return await Se(e),I(e,{...s,...i})}async function Fy(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await hy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Se(e),I(e,{...n,...s})}async function Ly(e,t){let n=I(e,t),r=Ln(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await by(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Se(e),I(e,{...n,...o,selectedLeftItemId:tE(r,Ln(e.model),s)})}async function My(e,t){let n=I(e,t),{nextShell:r}=await Sy(n,oe(e));return await Se(e),I(e,{...n,...r})}async function Dy(e,t){return yy(t,oe(e))}function Ko(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:Mn(e,e.state.shell)},e.render())},16))}function tE(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 qy(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=jy(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Ry(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Bo(e,o);t.recordSuccess(i,jy(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,Ir("background PR polling",i,oe(e)))}}function jy(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Uy(e,t){let n=I(e,t),r=qt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Se(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Se(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${V(a)?.requiredChecks.length??0} reported`)}return I(e,{...Ay(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import oE from"node:path";import{readdir as nE,stat as rE}from"node:fs/promises";import Wy from"node:path";async function sE(e){let t=await nE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Wy.join(e,r.name);n.push({name:r.name,path:s,kind:await iE(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 By(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Vy(e){let{spawn:t}=await import("node:child_process"),n=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";await new Promise((r,s)=>{let i=t(n,[e],{stdio:"ignore",detached:!0});i.unref(),i.on("error",s),i.on("spawn",r)})}async function Go(e,t){let n=await sE(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 iE(e){let t=Wy.join(e,".git");return await rE(t).catch(()=>null)!==null}function Ky(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Gy(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function aE(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"";if(!t.selectedRepoId&&!t.selectedWorkspaceId){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:I(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let r=null;try{let s=await ky(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,await Se(e);let i=I(e,{...e.state.shell,...s.nextShell,selectedLeftItemId:`task:${r.id}`,inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),o=await e.ptyRuntime.ensureSession(r.id,i.selectedPtyTabId??Zh(r,"agent"),un(je(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=dn(i.selectedPtyTabId),e.state={mode:"main",shell:Mt(i,o)},J(e,e.state.shell)}catch(s){s instanceof Pr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof Pr)?(await K(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Se(e).catch(()=>{})):r&&(await K(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function lE(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(at(t)){aE(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:I(e,{...n,selectedRunner:yo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Eh(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function cE(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=By(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){Go(e,oE.dirname(n.cwd)).catch(s=>{let i=ie(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||at(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Go(e,s.path).catch(o=>{let a=ie(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=oe(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Se(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 uE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Fg(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;dE(e,r)}}}async function dE(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 pE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Mg(Ky(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"?Py(n.runner,n.enabled,oe(e)):Iy(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=ie(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:se(e,I(e,e.state.shell),i),runnerOptions:{...Ky(e),message:i}},e.render()})}function fE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Lg(Gy(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}vy(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:I(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=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:{...Gy(e),message:s}},e.render()})}}function Hy(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){lE(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){cE(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){hE(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=Vu(e.state.shell,n,Ku(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&&at(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Cs(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(mE(e,n))return;e.lastTerminalKey=eg(n)?{key:n,at:Date.now()}:null;let i=tg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Ko(e,i);return}e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:I(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){e.state={mode:"main",shell:I(e,r.state)},J(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Go(e,e.workspaceRoot).catch(s=>{let i=ie(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:se(e,I(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){xy(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{zu(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){Fy(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){Uy(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=qt(e.model.tasks,r.state),i=s?V(s)?.url??null:null;i?Vy(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){Ly(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){My(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){zu(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"){Oy(e,e.state.shell);return}Vo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:I(e,r.state)},Ey(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"){uE(e,n);return}if(e.state.variant==="runners"){pE(e,n);return}if(e.state.variant==="previews"){fE(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||at(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.optionsMessage){(n==="ESCAPE"||at(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(at(n)){if(e.state.menuIndex===0){let r=e.state.variant==="boot";e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),r?e.bootHydrationReady.then(()=>{if(e.state.mode!=="main")return;let s=e.state.shell;_y(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()})}):Ny(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 Yy(e,t){let n=og(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=Cs(i);if(o){Jy(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(mu(i)){e.pendingTerminalKeySequence.raw=i,zy(e);return}Ho(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},J(e,e.state.shell),e.render();return}let r=ng(n);if(r!==0){Ko(e,r);return}let s=Cs(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
279
281
|
`&&n!==`\r
|
|
280
|
-
`&&(e.suppressTerminalEnterOnAttach=!1),Xh(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function eE(e,t){if(e.pendingTerminalKeySequence){let n=zh(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=vs(r);if(s)return Wy(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(pu(r))return e.pendingTerminalKeySequence.raw=r,Uy(e),!0}return Yo(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Yo(e),30)},!0)}function Uy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Yo(e),30))}function Yo(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Wy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function By(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Sy(e,du(t));return}let n=du(t);n!==0&&Go(e,n)}function tE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var rE=nE(import.meta.url),sE=rE("terminal-kit"),iE=sE.terminal;function Yu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Vy(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Ky(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function oE(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 Gy(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=ve(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await jn({uiStateFile:e.uiStateFile}):null,o=await Tr(t,void 0,s),a=Rs(yh(i,r),o);o=await Tr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:h=>c(h),onActivity:h=>d(h),onActivityRemoved:h=>u(h),resolveSessionSpec:(h,f)=>Vh(l.current,f,t)},m=e.ptyRuntime??await fg({...p,paths:n,activityEnabled:!0});return new Promise(h=>{let f=e.terminal??iE,y=null,T=null,R=null,b=null,O=null,$=0,D=!1,x=new Map,v=m.managesPullRequestSync?null:new Rr({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Re=new dn({resolutionMs:Du,onError:(C,Y)=>Os(`heartbeat job "${C}"`,Y,ie(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Rs(a,o)},get model(){return l.current},set model(C){l.current=C},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:f,ptyRuntime:m,resolve:h,render:()=>{},renderTaskNavigation:()=>!1,exit:C=>h(C)},w.ptyRuntime.setActivityEnabled?.(!0),c=C=>{w.state.mode==="main"&&(O=oE(O,C),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let Y=O;if(O=null,w.state.mode==="main"){let fe=Fn(w,w.state.shell);if(w.state={mode:"main",shell:fe},!b||!T){w.render();return}let Me=Fe(f.width,f.height),Se={...b,terminal:fe.terminal},mn=Zg(Me,Se,T,fe.centerZoomed,Y?.kind==="rows"?Y.rowIndices:null);if(!mn){w.render();return}mn.output.length>0&&f.noFormat(mn.output),b=Se,T=mn.region,R&&(R={...R,center:mn.region}),y=null,f.hideCursor(!0)}},0)))},d=C=>{w.state.mode==="main"&&un(C.tabId)&&x.get(C.tabId)!==At(C.tabId,[C],Date.now())&&w.render()},u=C=>{w.state.mode==="main"&&un(C)&&x.get(C)!=="idle"&&w.render()};let ge=Promise.resolve(),H=C=>{ge=ge.then(async()=>{let Y=await Promise.all([...new Set(C)].map(fe=>S.getTask(w.paths,fe)));for(let fe of Y)Vo(w,fe);w.state.mode==="main"?w.state={mode:"main",shell:I(w,w.state.shell)}:w.state={...w.state,shell:I(w,w.state.shell)},w.render()}).catch(Y=>Os("daemon task-state refresh",Y,ie(w)))};w.ptyRuntime.setTasksChangedHandler?.(H);let fn=C=>{let Y=Fe(f.width,f.height),fe=w.ptyRuntime.getActivitySnapshots?.()??[],Me=Date.now(),Se=Wg(I(w,C.shell),w.model,{snapshots:fe,now:Me,animationFrame:$});x.clear();for(let zy of w.model.tasks)for(let zo of zy.ptyTabs)zo.kind==="agent"&&x.set(zo.id,At(zo.id,fe,Me));let mn=_h(Y,Se,{centerOnly:C.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Se,presentation:mn}},$s=(C,Y,fe,Me)=>{if(!R)return!1;let Se=ey(R,Y.regions,fe);return Se?(Se.output.length>0&&f.noFormat(Se.output),b=C,R=Se.regions,T=Se.regions.center,y=Me?Y.frame:null,f.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Gu(w),w.ptyRuntime.setPullRequestPollView?.(Ky(w.state)),w.ptyRuntime.setViewedTab?.(Pr(w,w.state.shell));let{data:C,presentation:Y}=fn(w.state);return $s(C,Y,["rail","left","center","footer"],!1)},w.render=()=>{Gu(w);let C=w.state;w.ptyRuntime.setPullRequestPollView?.(Ky(C)),w.ptyRuntime.setViewedTab?.(C.mode==="main"?Pr(w,C.shell):null);let Y=Fe(f.width,f.height),fe,Me=null;if(C.mode==="main"){let Se=fn(C);if(Me=Se.presentation,fe=Me.frame,!w.pendingClear&&$s(Se.data,Me,["rail","left","center","right","footer"],!0))return;b=Se.data,T=Me.center}else fe=C.variant==="boot"?Oh(Y,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="pause"?$h(Y,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="options"?Oo(Y,{menuIndex:C.menuIndex,optionsMenuItems:Iu}):C.variant==="runners"?Oo(Y,{menuIndex:Yu(C).menuIndex,optionsMenuItems:vu(w.config,Yu(C)),optionsMessage:Ig(Yu(C)),optionsSubtitle:"Runners"}):C.variant==="previews"?Oo(Y,{menuIndex:Vy(C).menuIndex,optionsMenuItems:vg(w.config),optionsMessage:Cg(Vy(C)),optionsSubtitle:"Feature Previews - Experimental"}):C.variant==="logs"?Nh(Y,{logPath:C.log?.path??n.logFile,logLines:C.log?.lines??[]}):Dh(Y),b=null,T=null,R=null;w.pendingClear&&(f.moveTo(1,1),f.eraseDisplayBelow(),w.pendingClear=!1,y=null),f.noFormat(Zh(fe,y)),y=fe,R=Me?.regions??null,f.hideCursor(!0)};let Ds=C=>jy(w,C),zu=C=>qy(w,C),Ju=C=>By(w,C),Yy=()=>{process.stdout.off("resize",Xu),process.off("SIGCONT",Qu),f.removeListener("key",Ds),f.removeListener("unknown",zu),f.removeListener("mouse",Ju),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),Re.stop(),w.ptyRuntime.disposeAll(),f.grabInput(!1),f.hideCursor(!1),f.fullscreen(!1)};w.exit=C=>{Yy(),h(C)};let Xu=()=>{Vu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(cn(Fe(f.width,f.height))),w.state={mode:"main",shell:Fn(w,w.state.shell)}),w.render()},Qu=()=>{Vu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(cn(Fe(f.width,f.height))),w.state={mode:"main",shell:Fn(w,w.state.shell)}),w.render()};process.stdout.on("resize",Xu),process.on("SIGCONT",Qu),f.grabInput(!0),w.inputCaptureMode="control",f.hideCursor(!0),f.fullscreen(!0),f.on("key",Ds),f.on("unknown",zu),f.on("mouse",Ju),v&&Re.register({id:"github.pull-requests",intervalMs:1e3,run:C=>Dy(w,v,C)}),Re.register({id:"agent.activity-indicators",intervalMs:Du,run:()=>{let C=Date.now(),Y=oi(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],C);(Y||D)&&($=($+1)%Mg,w.state.mode==="main"&&w.render()),D=Y}}),Re.start(),k.version.checkForUpdate().then(C=>{C.updateAvailable&&C.latest&&(w.updateText=`Update available: v${C.latest}`,w.render())}),w.bootHydrationReady=Ku(w).catch(()=>{}),w.render()})}async function lE(){try{if(process.argv[2]==="__craig-daemon"){let e=await Hy(process.argv[3]??process.cwd()),t=ve(e);return await mg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Hy(process.argv[3]??process.cwd()),t=ve(e);return await hg(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
281
|
-
`),1}return
|
|
282
|
+
`&&(e.suppressTerminalEnterOnAttach=!1),ig(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function mE(e,t){if(e.pendingTerminalKeySequence){let n=rg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Cs(r);if(s)return Jy(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(mu(r))return e.pendingTerminalKeySequence.raw=r,zy(e),!0}return Ho(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Ho(e),30)},!0)}function zy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Ho(e),30))}function Ho(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Jy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Xy(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){$y(e,fu(t));return}let n=fu(t);n!==0&&Ko(e,n)}function hE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var yE=gE(import.meta.url),wE=yE("terminal-kit"),kE=wE.terminal;function Ju(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Qy(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Zy(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function TE(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 ew(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ce(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await qn({uiStateFile:e.uiStateFile}):null,o=await br(t,void 0,s),a=Ss(Ih(i,r),o);o=await br(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:h=>c(h),onActivity:h=>d(h),onActivityRemoved:h=>u(h),resolveSessionSpec:(h,f)=>Qh(l.current,f,t)},m=e.ptyRuntime??await bg({...p,paths:n,activityEnabled:!0});return new Promise(h=>{let f=e.terminal??kE,y=null,T=null,R=null,b=null,O=null,$=0,D=!1,x=new Map,v=m.managesPullRequestSync?null:new Sr({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Pe=new pn({resolutionMs:_u,onError:(C,U)=>Ir(`heartbeat job "${C}"`,U,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Ss(a,o)},get model(){return l.current},set model(C){l.current=C},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:f,ptyRuntime:m,resolve:h,render:()=>{},renderTaskNavigation:()=>!1,exit:C=>h(C)},w.ptyRuntime.setActivityEnabled?.(!0),c=C=>{w.state.mode==="main"&&(O=TE(O,C),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let U=O;if(O=null,w.state.mode==="main"){let ee=Mn(w,w.state.shell);if(w.state={mode:"main",shell:ee},!b||!T){w.render();return}let we=je(f.width,f.height),me={...b,terminal:ee.terminal},ut=ay(we,me,T,ee.centerZoomed,U?.kind==="rows"?U.rowIndices:null);if(!ut){w.render();return}ut.output.length>0&&f.noFormat(ut.output),b=me,T=ut.region,R&&(R={...R,center:ut.region}),y=null,f.hideCursor(!0)}},0)))},d=C=>{w.state.mode==="main"&&dn(C.tabId)&&x.get(C.tabId)!==Et(C.tabId,[C],Date.now())&&w.render()},u=C=>{w.state.mode==="main"&&dn(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=>S.getTask(w.paths,ee)));for(let ee of U)Bo(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=>Ir("daemon task-state refresh",U,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(Y);let hn=Promise.resolve(),Yo=C=>{hn=hn.then(async()=>{let U=w.state.shell,ee=w.model.tasks.find(zo=>zo.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 yh(C);w.model={...w.model,inspection:{...we,filePaths:[...new Set([...we.filePaths,C])],selectedFilePath:C,selectedFile:me,error:null}},w.ptyRuntime.detach();let ut=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:ut},J(w,ut),w.render()}).catch(U=>Ir("open file from agent",U,oe(w)))};w.ptyRuntime.setOpenFileHandler?.(Yo);let $s=C=>{let U=je(f.width,f.height),ee=w.ptyRuntime.getActivitySnapshots?.()??[],we=Date.now(),me=Jg(I(w,C.shell),w.model,{snapshots:ee,now:we,animationFrame:$});x.clear();for(let zo of w.model.tasks)for(let Jo of zo.ptyTabs)Jo.kind==="agent"&&x.set(Jo.id,Et(Jo.id,ee,we));let ut=Wh(U,me,{centerOnly:C.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:me,presentation:ut}},Xu=(C,U,ee,we)=>{if(!R)return!1;let me=ly(R,U.regions,ee);return me?(me.output.length>0&&f.noFormat(me.output),b=C,R=me.regions,T=me.regions.center,y=we?U.frame:null,f.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Yu(w),w.ptyRuntime.setPullRequestPollView?.(Zy(w.state)),w.ptyRuntime.setViewedTab?.(vr(w,w.state.shell));let{data:C,presentation:U}=$s(w.state);return Xu(C,U,["rail","left","center","footer"],!1)},w.render=()=>{Yu(w);let C=w.state;w.ptyRuntime.setPullRequestPollView?.(Zy(C)),w.ptyRuntime.setViewedTab?.(C.mode==="main"?vr(w,C.shell):null);let U=je(f.width,f.height),ee,we=null;if(C.mode==="main"){let me=$s(C);if(we=me.presentation,ee=we.frame,!w.pendingClear&&Xu(me.data,we,["rail","left","center","right","footer"],!0))return;b=me.data,T=we.center}else ee=C.variant==="boot"?Mh(U,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="pause"?jh(U,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="options"?Eo(U,{menuIndex:C.menuIndex,optionsMenuItems:Cu}):C.variant==="runners"?Eo(U,{menuIndex:Ju(C).menuIndex,optionsMenuItems:Au(w.config,Ju(C)),optionsMessage:Ng(Ju(C)),optionsSubtitle:"Runners"}):C.variant==="previews"?Eo(U,{menuIndex:Qy(C).menuIndex,optionsMenuItems:_g(w.config),optionsMessage:xg(Qy(C)),optionsSubtitle:"Feature Previews - Experimental"}):C.variant==="logs"?Uh(U,{logPath:C.log?.path??n.logFile,logLines:C.log?.lines??[]}):qh(U),b=null,T=null,R=null;w.pendingClear&&(f.moveTo(1,1),f.eraseDisplayBelow(),w.pendingClear=!1,y=null),f.noFormat(ag(ee,y)),y=ee,R=we?.regions??null,f.hideCursor(!0)};let Qu=C=>Hy(w,C),Zu=C=>Yy(w,C),ed=C=>Xy(w,C),nw=()=>{process.stdout.off("resize",td),process.off("SIGCONT",nd),f.removeListener("key",Qu),f.removeListener("unknown",Zu),f.removeListener("mouse",ed),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),Pe.stop(),w.ptyRuntime.disposeAll(),f.grabInput(!1),f.hideCursor(!1),f.fullscreen(!1)};w.exit=C=>{nw(),h(C)};let td=()=>{Gu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(un(je(f.width,f.height))),w.state={mode:"main",shell:Mn(w,w.state.shell)}),w.render()},nd=()=>{Gu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(un(je(f.width,f.height))),w.state={mode:"main",shell:Mn(w,w.state.shell)}),w.render()};process.stdout.on("resize",td),process.on("SIGCONT",nd),f.grabInput(!0),w.inputCaptureMode="control",f.hideCursor(!0),f.fullscreen(!0),f.on("key",Qu),f.on("unknown",Zu),f.on("mouse",ed),v&&Pe.register({id:"github.pull-requests",intervalMs:1e3,run:C=>qy(w,v,C)}),Pe.register({id:"agent.activity-indicators",intervalMs:_u,run:()=>{let C=Date.now(),U=ii(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],C);(U||D)&&($=($+1)%Gg,w.state.mode==="main"&&w.render()),D=U}}),Pe.start(),k.version.checkForUpdate().then(C=>{C.updateAvailable&&C.latest&&(w.updateText=`Update available: v${C.latest}`,w.render())}),w.bootHydrationReady=Hu(w).catch(()=>{}),w.render()})}async function RE(){try{if(process.argv[2]==="__craig-daemon"){let e=await tw(process.argv[3]??process.cwd()),t=Ce(e);return await Rg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await tw(process.argv[3]??process.cwd()),t=Ce(e);return await Sg(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
283
|
+
`),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=>ew({uiStateFile:Ce(e).uiStateFile,workspaceRoot:e})})}async function tw(e){return bE(e)}var SE=await RE();process.exit(SE);
|