craig-cli 0.19.5 → 0.19.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +127 -127
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var ak=Object.defineProperty;var Ws=(e,t)=>{for(var n in t)ak(e,n,{get:t[n],enumerable:!0})};import{realpath as
|
|
3
|
-
`;await i.writeFile(o,"utf8"),await i.sync(),await i.close(),await pk(s,e),n.mode!==void 0&&await ck(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await fk(s,{force:!0}).catch(()=>{}),o}}async function Vs(e){try{let t=await uk(e,"utf8");return JSON.parse(t)}catch(t){if(mk(t))return null;throw t}}function mk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Un(e){try{let t=await hk(e.uiStateFile,"utf8"),n=JSON.parse(t);return gk(n,e.uiStateFile)}catch(t){if(yk(t))return null;throw t}}async function
|
|
4
|
-
`)};var
|
|
2
|
+
var ak=Object.defineProperty;var Ws=(e,t)=>{for(var n in t)ak(e,n,{get:t[n],enumerable:!0})};import{realpath as D0}from"node:fs/promises";import Te from"node:path";function Oe(e){let t=Te.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:Te.join(t,"index.json"),reposDir:Te.join(t,"repos"),workspacesDir:Te.join(t,"workspaces"),runtimeDir:Te.join(t,"runtime"),uiStateFile:Te.join(t,"runtime","ui-state.json"),tasksDir:Te.join(t,"tasks"),jobsDir:Te.join(t,"jobs"),commandsDir:Te.join(t,"commands"),eventsDir:Te.join(t,"events"),orchestrationDir:Te.join(t,"orchestration"),logsDir:Te.join(t,"logs"),logFile:Te.join(t,"logs","craig.jsonl"),artifactsDir:Te.join(t,"artifacts"),worktreesDir:Te.join(t,"worktrees"),configFile:Te.join(t,"config.json")}}import Rd from"node:path";import{readFile as Iv}from"node:fs/promises";import{readFile as hk}from"node:fs/promises";import{randomUUID as lk}from"node:crypto";import{chmod as ck,open as dk,readFile as uk,rename as pk,rm as fk}from"node:fs/promises";import Ta from"node:path";async function U(e,t,n={}){let r=Ta.dirname(e),s=Ta.join(r,`.${Ta.basename(e)}.${process.pid}.${Date.now()}.${lk()}.tmp`),i=await dk(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 pk(s,e),n.mode!==void 0&&await ck(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await fk(s,{force:!0}).catch(()=>{}),o}}async function Vs(e){try{let t=await uk(e,"utf8");return JSON.parse(t)}catch(t){if(mk(t))return null;throw t}}function mk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Un(e){try{let t=await hk(e.uiStateFile,"utf8"),n=JSON.parse(t);return gk(n,e.uiStateFile)}catch(t){if(yk(t))return null;throw t}}async function yt(e,t){await U(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Gs(){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 gk(e,t){if(typeof e!="object"||e===null||e.version!==1||!(e.selectedRepoId===null||typeof e.selectedRepoId=="string")||!(e.selectedWorkspaceId===null||typeof e.selectedWorkspaceId=="string")||!(e.selectedTaskId===null||typeof e.selectedTaskId=="string")||!(e.selectedPtyTabId===void 0||e.selectedPtyTabId===null||typeof e.selectedPtyTabId=="string")||!wn(e,"inputMode")||!wn(e,"focusedRegion")||!wn(e,"activeTab")||!wn(e,"inspectorSection")||!wn(e,"inspectionMode")||!Ks(e,"openInspectionKind")||!Ks(e,"selectedFileTreePath")||!Ks(e,"selectedFilePath")||!Ks(e,"selectedDiffPath")||!$u(e,"collapsedFileTreePaths")||!wn(e,"ignoredUpdateVersion")||!$u(e,"seenPreviewIds")||!wn(e,"selectedActionId")||!wk(e,"readAgentActivityAt")||typeof e.updatedAt!="string")throw new Error(`Craig UI state at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e}function wn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Ks(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function $u(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function yk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}function wk(e,t){if(!(t in e))return!0;let n=e[t];return typeof n=="object"&&n!==null&&!Array.isArray(n)&&Object.values(n).every(r=>typeof r=="number"&&Number.isFinite(r)&&r>=0)}var ba={};Ws(ba,{RUNNER_IDS:()=>me,STABLE_RUNNER_IDS:()=>wt,assertEnabled:()=>_u,buildCommand:()=>Lu,getConfiguredProfile:()=>Hs,getDefault:()=>Du,getDisplayName:()=>Fu,getEnabled:()=>Ys,getProfile:()=>Bn,isRunnerType:()=>zs,parse:()=>xu,setRunnerEnabled:()=>Mu,setRunnerPath:()=>ju});var wt=["codex","cursor","claude"],me=[...wt,"pi"];var Nu={codex:{id:"codex",displayName:"Codex",executable:"codex",defaultAgentTitle:"Codex"},cursor:{id:"cursor",displayName:"Cursor",executable:"cursor-agent",defaultAgentTitle:"Cursor"},claude:{id:"claude",displayName:"Claude",executable:"claude",defaultAgentTitle:"Claude"},pi:{id:"pi",displayName:"Pi",executable:"pi",defaultAgentTitle:"Pi"}};var Bn=e=>Nu[e];var Hs=(e,t={})=>{let n=Bn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Ys=(e={})=>me.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var Du=(e={})=>{let t=Ys(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 _u=(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 zs=e=>me.includes(e);var xu=e=>{if(!e||e.length===0)return"codex";if(!zs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${me.join(", ")}.`);return e};var Fu=e=>Bn(e).displayName;var Lu=(e,t,n={})=>{let r=[Hs(e,n).executable];return t&&t.length>0&&r.push(t),r};var Mu=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var ju=(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 Ra={};Ws(Ra,{PREVIEW_FEATURE_IDS:()=>kt,isEnabled:()=>qu,setEnabled:()=>Uu});var kt=["agentOrchestration","piRunner","fileOpen","panelPolish"];function qu(e,t){return e.previews?.[t]===!0}function Uu(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as kk,readFile as Tk,writeFile as bk}from"node:fs/promises";import Rk from"node:path";var Pk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Bu=async e=>{try{return await Tk(e,"utf8")}catch(t){if(Pk(t))return null;throw t}},Wu=async(e,t)=>{await kk(Rk.dirname(e),{recursive:!0}),await bk(e,t,"utf8")};var Js=(e,t)=>{if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!me.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${me.join(", ")}.`);if(typeof s!="object"||s===null||Array.isArray(s))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" must be an object.`);let i=s;if(i.enabled!==void 0&&typeof i.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${r}.enabled" must be a boolean.`);if(i.path!==void 0&&(typeof i.path!="string"||i.path.trim().length===0))throw new Error(`Craig config at ${t} is invalid. "runners.${r}.path" must be a non-empty string.`)}}if(n.checks!==void 0&&(typeof n.checks!="object"||n.checks===null||!Array.isArray(n.checks.commands)||!n.checks.commands.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "checks.commands" must be an array of strings.`);if(n.open!==void 0&&(typeof n.open!="object"||n.open===null||!Array.isArray(n.open.command)||!n.open.command.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "open.command" must be an array of strings.`);if(n.github!==void 0){if(typeof n.github!="object"||n.github===null)throw new Error(`Craig config at ${t} is invalid. "github" must be an object.`);if(n.github.mergeMethod!==void 0&&n.github.mergeMethod!=="merge"&&n.github.mergeMethod!=="rebase"&&n.github.mergeMethod!=="squash")throw new Error(`Craig config at ${t} is invalid. "github.mergeMethod" must be "merge", "rebase", or "squash".`);if(n.github.watchIntervalSeconds!==void 0&&(!Number.isInteger(n.github.watchIntervalSeconds)||n.github.watchIntervalSeconds<=0))throw new Error(`Craig config at ${t} is invalid. "github.watchIntervalSeconds" must be a positive integer.`)}if(n.previews!==void 0){if(typeof n.previews!="object"||n.previews===null||Array.isArray(n.previews))throw new Error(`Craig config at ${t} is invalid. "previews" must be an object.`);for(let[r,s]of Object.entries(n.previews))if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}return n};var Pa=async(e,t={readConfigFile:Bu})=>{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 Sa=async(e,t,n={writeConfigFile:Wu})=>{Js(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`)};var va={};Ws(va,{checkForUpdate:()=>Ku,getCurrent:()=>Xs,isNewer:()=>Ia});var Xs=()=>{try{return"0.19.6"}catch{return"unknown"}};var Sk="https://registry.npmjs.org/craig-cli/latest",Ik=3600*1e3,vk={value:null},Vu=/^\d+\.\d+\.\d+$/,Ia=(e,t)=>{if(!Vu.test(e)||!Vu.test(t))return!1;let n=c=>c.split(".").map(Number),[r=0,s=0,i=0]=n(e),[o=0,a=0,l=0]=n(t);return r!==o?r>o:s!==a?s>a:i>l},Ku=async(e={fetch:globalThis.fetch,getCurrent:Xs,cache:vk})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Ik)return e.cache.value.result;let r=null;try{let i=await e.fetch(Sk,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&Ia(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:Pa,save:Sa,previews:Ra,runners:ba,version:va};var Gu={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=Gu[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function Ca(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Ck,mkdir as Ak,readFile as Ek}from"node:fs/promises";import Ok from"node:path";var Hu=80,Qs=async(e,t)=>{await Ak(Ok.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Ck(e.logFile,`${JSON.stringify(n)}
|
|
5
5
|
`,"utf8")},Yu=async(e,t)=>{try{await Qs(e,t)}catch{}},Zs=async(e,t=Hu)=>{try{let s=(await Ek(e.logFile,"utf8")).trimEnd().split(`
|
|
6
|
-
`).filter(i=>i.length>0).map($k);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Dk(n))return{path:e.logFile,lines:[],empty:!0};throw n}},Ca=async(e,t)=>Qs(e,{level:"error",component:"application",event:Nk(t.context),message:t.message,...t.details?{details:t.details}:{}}),zu=async(e,t)=>{try{await Ca(e,t)}catch{}},Ju=Zs,Xu=async(e,t=Hu)=>Zs(e,t);function $k(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 Nk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Dk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var ue={appendErrorLog:Ca,appendErrorLogBestEffort:zu,appendLog:Qs,appendLogBestEffort:Yu,readLog:Zs,readErrorLog:Ju,readRecentErrorLines:Xu};function tp(e){let{commandTokens:t,options:n,help:r}=xk(e);if(r)return Zu({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Dr(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Aa(o,"Repo path")};break;case"repo:list":Dr(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:re(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Aa(o,"Workspace path")};break;case"workspace:list":a=Fk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:re(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:re(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:re(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:re(o,"File path")};break;case"task:new":a=Mk(o);break;case"task:create-child":a=jk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:re(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:re(o,"Task id")}};break;case"task:list":a=Lk(o);break;case"task:current":Dr(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Aa(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:re(o,"Task id")};break;case"task:pr":a=qk(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);ti(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:ei(o,1,"Task id"),repoId:ei(o,2,"Repo id")};break;case"task:wait":a=Hk(o);break;case"agent:list":Dr(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Wk(o);break;case"agent:send":a=Vk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:re(o,"Command id")};break;case"command:list":Dr(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:re(o,"Command id")};break;case"command:wait":a=Kk(o);break;case"events:list":a=Qu(o,!1);break;case"events:watch":a=Qu(o,!0);break;case"fury:validate":a={kind:"validateFury",file:re(o,"Fury file")};break;case"fury:plan":a=Yk(o);break;case"fury:approve":a={kind:"approveFury",planId:re(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:re(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:re(o,"Fury run id")};break;case"fury:watch":a=zk(o);break;case"fury:cancel":a={kind:"cancelFury",runId:re(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:re(o,"Fury run id")};break;case"fury:step":a=Jk(o);break;case"fury:reviews":a=Xk(o);break;case"fury:review":a=Qk(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:re(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:re(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:re(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:re(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:re(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:ei(o,0,"Task id"),repoId:ei(o,1,"Repo id")},ti(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:re(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return Zu(a,n)}function np(e){let t=e[0]==="--"?e.slice(1):e,n=!0;for(let r of t){if(r==="--"){n=!1;continue}if(n&&r==="--json")return!0}return!1}function _k(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",renameTask:"task.rename",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.add",addTaskRepoTarget:"task.repo.add",listTaskLinks:"link.list",openFile:"file.open",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function Ea(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig file open <path> Open a readable file in the active Craig TUI (preview)"," craig task new --repo <repo-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude|pi] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task rename <name> Rename the resolved task without changing its ID or worktree"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task repo add <task-id> <repo-id> Provision a repo target in an existing project task"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add contextual repo linkage only (does not provision a target)"," craig link list <task-id> List linked repos for a task"].join(`
|
|
7
|
-
`)}function xk(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||!ep(l)){n.push(l);continue}if(s.has(l))throw I(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||ep(c))throw I(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=M(c,"Workspace root"):r.taskId=M(c,"Task id")}return{commandTokens:n,options:r,help:i}}function Fk(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw I(`Unsupported command: workspace list ${e.join(" ")}`)}function Lk(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:M(e[1],"Repo id")};throw I(`Unsupported command: task list ${e.join(" ")}`)}function Mk(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw I(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw I(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw I("Task option --repo may only be provided once.");t=M(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw I("Task option --workspace may only be provided once.");n=M(c,"Workspace id")}else{if(r!==void 0)throw I("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw I(u instanceof Error?u.message:"Unsupported runner.")}}}if(!t&&!n)throw I("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw I("Task creation accepts either '--repo' or '--workspace', not both.");let o=M(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function jk(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw I(`Unsupported task create-child option: ${c}`);o.push(c);continue}let u=e[l+1];if(u===void 0||u==="--")throw I(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw I("Task option --parent may only be provided once.");t=M(u,"Parent task id")}else if(c==="--repo"){if(n)throw I("Task option --repo may only be provided once.");n=M(u,"Repo id")}else if(c==="--workspace"){if(r)throw I("Task option --workspace may only be provided once.");r=M(u,"Workspace id")}else if(c==="--runner"){if(s)throw I("Task option --runner may only be provided once.");try{s=k.runners.parse(u)}catch(d){throw I(d instanceof Error?d.message:"Unsupported runner.")}}else{if(i)throw I("Task option --idempotency-key may only be provided once.");i=M(u,"Idempotency key")}}if(n&&r)throw I("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:M(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function qk(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw I(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw I(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw I(`task pr ${t} accepts at most one task id.`);r=M(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw I(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw I("Task PR option --repo may only be provided once.");s=M(c,"Repo id")}else{if(i!==void 0)throw I("Task PR option --pr may only be provided once.");i=M(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw I(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw I(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw I(`Unsupported command: task pr ${e.join(" ")}`)}}var Oa=300*1e3,Uk=new Set(["idle","working","ready","error"]),Bk=new Set(["queued","delivering","delivered","failed","cancelled"]);function Wk(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:M(e[1],"Agent tab id")};throw I(`Unsupported command: agent status ${e.join(" ")}`)}function Vk(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 I(`Unsupported agent send option: ${l}`);if(o.has(l))throw I(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw I("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw I("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:M(c,"Prompt")}:{source:"file",path:M(c,"Prompt file")}}else if(l==="--tab")n=M(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw I('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=Na(c):i=M(c,"Idempotency key")}if(!t)throw I("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Kk(e){let t=M(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 I(`Unsupported command wait option: ${o}`);if(s.has(o))throw I(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw I(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Gk(a):r=Na(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Gk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Bk.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Qu(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw I(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw I("--format is supported only by events watch.");if(i.has(l))throw I(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=M(c,"Event type glob");else if(l==="--after")r=M(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw I('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function Hk(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 I(`Unsupported task wait option: ${a}`);if(t!==void 0)throw I("task wait accepts at most one task id.");t=M(a,"Task id");continue}if(i.has(a))throw I(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw I(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Zk(l):a==="--tab"?r=M(l,"Agent tab id"):s=Na(l)}if(!n)throw I("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Yk(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw I(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw I("fury plan accepts exactly one definition file.");t=M(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw I(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw I("Fury plan option --root-task may only be provided once.");n=M(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw I(`Invalid fury input "${o}". Use key=value.`);let l=M(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw I(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw I("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function zk(e){let t=M(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw I("fury watch supports --after and --format jsonl.");if(i==="--after")n=M(o,"Event cursor");else if(o==="jsonl")r=o;else throw I("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Jk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=$a(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=M(n.get("--run")??"","Fury run id"),s=M(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw I("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:M(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw I("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw I("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function Xk(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=$a(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw I(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Qk(e){let t=e[0],n=M(e[1]??"","Fury review id");if(t==="show")return ti(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw I("Unsupported fury review action.");let r=$a(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw I(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function $a(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw I(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw I(`Option ${s} requires a value.`);n.set(s,M(i,s))}return n}function Zk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Uk.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Na(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw I(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw I(`Duration "${e}" is too large.`);return s}function Zu(e,t){return{mode:"command",command:e,commandName:_k(e),options:t}}function ep(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Dr(e,t){ti(e,0,t)}function ti(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function re(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return M(e[0],t)}function Aa(e,t){return M(e.join(" "),t)}function ei(e,t,n){return M(e[t]??"",n)}function M(e,t){let n=e.trim();if(n.length===0)throw I(`${t} cannot be empty.`);return n}function I(e){return new g("CLI_USAGE",`${e}
|
|
6
|
+
`).filter(i=>i.length>0).map($k);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Dk(n))return{path:e.logFile,lines:[],empty:!0};throw n}},Aa=async(e,t)=>Qs(e,{level:"error",component:"application",event:Nk(t.context),message:t.message,...t.details?{details:t.details}:{}}),zu=async(e,t)=>{try{await Aa(e,t)}catch{}},Ju=Zs,Xu=async(e,t=Hu)=>Zs(e,t);function $k(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 Nk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Dk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var pe={appendErrorLog:Aa,appendErrorLogBestEffort:zu,appendLog:Qs,appendLogBestEffort:Yu,readLog:Zs,readErrorLog:Ju,readRecentErrorLines:Xu};function tp(e){let{commandTokens:t,options:n,help:r}=xk(e);if(r)return Zu({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":_r(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Ea(o,"Repo path")};break;case"repo:list":_r(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:se(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Ea(o,"Workspace path")};break;case"workspace:list":a=Fk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:se(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:se(o,"File path")};break;case"task:new":a=Mk(o);break;case"task:create-child":a=jk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:list":a=Lk(o);break;case"task:current":_r(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Ea(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:se(o,"Task id")};break;case"task:pr":a=qk(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);ti(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:ei(o,1,"Task id"),repoId:ei(o,2,"Repo id")};break;case"task:wait":a=Hk(o);break;case"agent:list":_r(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Wk(o);break;case"agent:send":a=Vk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:se(o,"Command id")};break;case"command:list":_r(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:se(o,"Command id")};break;case"command:wait":a=Kk(o);break;case"events:list":a=Qu(o,!1);break;case"events:watch":a=Qu(o,!0);break;case"fury:validate":a={kind:"validateFury",file:se(o,"Fury file")};break;case"fury:plan":a=Yk(o);break;case"fury:approve":a={kind:"approveFury",planId:se(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:se(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:se(o,"Fury run id")};break;case"fury:watch":a=zk(o);break;case"fury:cancel":a={kind:"cancelFury",runId:se(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:se(o,"Fury run id")};break;case"fury:step":a=Jk(o);break;case"fury:reviews":a=Xk(o);break;case"fury:review":a=Qk(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:se(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:se(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:se(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:se(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:se(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:ei(o,0,"Task id"),repoId:ei(o,1,"Repo id")},ti(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:se(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return Zu(a,n)}function np(e){let t=e[0]==="--"?e.slice(1):e,n=!0;for(let r of t){if(r==="--"){n=!1;continue}if(n&&r==="--json")return!0}return!1}function _k(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",renameTask:"task.rename",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.add",addTaskRepoTarget:"task.repo.add",listTaskLinks:"link.list",openFile:"file.open",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function Oa(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig file open <path> Open a readable file in the active Craig TUI (preview)"," craig task new --repo <repo-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude|pi] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task rename <name> Rename the resolved task without changing its ID or worktree"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task repo add <task-id> <repo-id> Provision a repo target in an existing project task"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add contextual repo linkage only (does not provision a target)"," craig link list <task-id> List linked repos for a task"].join(`
|
|
7
|
+
`)}function xk(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||!ep(l)){n.push(l);continue}if(s.has(l))throw I(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||ep(c))throw I(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=M(c,"Workspace root"):r.taskId=M(c,"Task id")}return{commandTokens:n,options:r,help:i}}function Fk(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw I(`Unsupported command: workspace list ${e.join(" ")}`)}function Lk(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:M(e[1],"Repo id")};throw I(`Unsupported command: task list ${e.join(" ")}`)}function Mk(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw I(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw I(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw I("Task option --repo may only be provided once.");t=M(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw I("Task option --workspace may only be provided once.");n=M(c,"Workspace id")}else{if(r!==void 0)throw I("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw I(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw I("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw I("Task creation accepts either '--repo' or '--workspace', not both.");let o=M(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function jk(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw I(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw I(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw I("Task option --parent may only be provided once.");t=M(d,"Parent task id")}else if(c==="--repo"){if(n)throw I("Task option --repo may only be provided once.");n=M(d,"Repo id")}else if(c==="--workspace"){if(r)throw I("Task option --workspace may only be provided once.");r=M(d,"Workspace id")}else if(c==="--runner"){if(s)throw I("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw I(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw I("Task option --idempotency-key may only be provided once.");i=M(d,"Idempotency key")}}if(n&&r)throw I("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:M(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function qk(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw I(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw I(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw I(`task pr ${t} accepts at most one task id.`);r=M(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw I(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw I("Task PR option --repo may only be provided once.");s=M(c,"Repo id")}else{if(i!==void 0)throw I("Task PR option --pr may only be provided once.");i=M(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw I(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw I(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw I(`Unsupported command: task pr ${e.join(" ")}`)}}var $a=300*1e3,Uk=new Set(["idle","working","ready","error"]),Bk=new Set(["queued","delivering","delivered","failed","cancelled"]);function Wk(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:M(e[1],"Agent tab id")};throw I(`Unsupported command: agent status ${e.join(" ")}`)}function Vk(e){let t,n,r="when-ready",s=$a,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw I(`Unsupported agent send option: ${l}`);if(o.has(l))throw I(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw I("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw I("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:M(c,"Prompt")}:{source:"file",path:M(c,"Prompt file")}}else if(l==="--tab")n=M(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw I('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=Da(c):i=M(c,"Idempotency key")}if(!t)throw I("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Kk(e){let t=M(e[0]??"","Command id"),n,r=$a,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw I(`Unsupported command wait option: ${o}`);if(s.has(o))throw I(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw I(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Gk(a):r=Da(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Gk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Bk.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Qu(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw I(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw I("--format is supported only by events watch.");if(i.has(l))throw I(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=M(c,"Event type glob");else if(l==="--after")r=M(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw I('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function Hk(e){let t,n,r,s=$a,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw I(`Unsupported task wait option: ${a}`);if(t!==void 0)throw I("task wait accepts at most one task id.");t=M(a,"Task id");continue}if(i.has(a))throw I(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw I(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Zk(l):a==="--tab"?r=M(l,"Agent tab id"):s=Da(l)}if(!n)throw I("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Yk(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw I(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw I("fury plan accepts exactly one definition file.");t=M(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw I(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw I("Fury plan option --root-task may only be provided once.");n=M(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw I(`Invalid fury input "${o}". Use key=value.`);let l=M(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw I(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw I("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function zk(e){let t=M(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw I("fury watch supports --after and --format jsonl.");if(i==="--after")n=M(o,"Event cursor");else if(o==="jsonl")r=o;else throw I("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Jk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=Na(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=M(n.get("--run")??"","Fury run id"),s=M(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw I("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:M(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw I("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw I("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function Xk(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=Na(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw I(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Qk(e){let t=e[0],n=M(e[1]??"","Fury review id");if(t==="show")return ti(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw I("Unsupported fury review action.");let r=Na(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw I(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function Na(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw I(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw I(`Option ${s} requires a value.`);n.set(s,M(i,s))}return n}function Zk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Uk.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Da(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw I(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw I(`Duration "${e}" is too large.`);return s}function Zu(e,t){return{mode:"command",command:e,commandName:_k(e),options:t}}function ep(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function _r(e,t){ti(e,0,t)}function ti(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function se(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return M(e[0],t)}function Ea(e,t){return M(e.join(" "),t)}function ei(e,t,n){return M(e[t]??"",n)}function M(e,t){let n=e.trim();if(n.length===0)throw I(`${t} cannot be empty.`);return n}function I(e){return new g("CLI_USAGE",`${e}
|
|
8
8
|
|
|
9
|
-
${Ea()}`,{})}var Ke=(e,t)=>{let n=Da(e);if(!tT(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Da=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,delete r.tmuxWindowTarget,delete r.tmuxPage,delete r.tmuxTarget,delete r.layoutSlot,delete r.sessionId,{...r,runner:_a(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(s=>typeof s=="string"):[],parentTaskId:typeof t.parentTaskId=="string"||t.parentTaskId===null?t.parentTaskId:null,rootTaskId:typeof t.rootTaskId=="string"?t.rootTaskId:t.id,delegationDepth:Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0?t.delegationDepth:0,delegationIdempotencyKey:typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null?t.delegationIdempotencyKey:null,furyRunId:typeof t.furyRunId=="string"||t.furyRunId===null?t.furyRunId:typeof n.swarmRunId=="string"?n.swarmRunId:null,furyStepId:typeof t.furyStepId=="string"||t.furyStepId===null?t.furyStepId:typeof n.swarmStepId=="string"?n.swarmStepId:null,ptyTabs:sT(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:nT(t.repoTargets),runnerSession:t.runnerSession??eT(t),checks:uT(t),lastCommit:t.lastCommit??null,prs:pT(t),artifacts:gT(t),cleanup:yT(t)}},eT=e=>{if(typeof e.title!="string")return null;let t=_a(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},tT=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"&&sp(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||rT(t.repoTargets))&&oT(t.runnerSession)&&aT(t.prompt)&&ip(t.checks)&&op(t.lastCommit)&&cT(t.prs)&&dT(t.artifacts)&&lp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},nT=e=>{if(Array.isArray(e))return e.filter(rp)},rT=e=>Array.isArray(e)&&e.every(rp),rp=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)&&ip(t.checks)&&op(t.lastCommit)&&ap(t.pullRequest)&&lp(t.cleanup)},sT=e=>{if(sp(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 iT(e.id,e.title,t,_a(e.runner))},iT=(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}]},_a=e=>e&&k.runners.isRunnerType(e)?e:"codex",sp=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"),oT=e=>typeof e=="object"&&e!==null&&Array.isArray(e.command)&&e.command.every(t=>typeof t=="string")&&(typeof e.pid=="number"||e.pid===null)&&(typeof e.startedAt=="string"||e.startedAt===null)&&(e.lastKnownState==="starting"||e.lastKnownState==="running"||e.lastKnownState==="exited"||e.lastKnownState==="failed")&&(typeof e.exitCode=="number"||e.exitCode===null)&&(typeof e.exitedAt=="string"||e.exitedAt===null),aT=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",ip=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"),op=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",ap=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&lT(e.requiredChecks),lT=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)),cT=e=>Array.isArray(e)&&e.every(ap),dT=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),lp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),uT=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},pT=e=>{if(Array.isArray(e.prs))return e.prs.map(fT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:cp(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:dp(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},fT=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:cp(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:mT(t.reviewDecision),requiredChecks:dp(t.requiredChecks),comments:hT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},cp=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,mT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,hT=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}]}):[],dp=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})):[],gT=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},yT=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as tb}from"node:fs/promises";import{readFile as wT,readdir as kT,rm as TT}from"node:fs/promises";import up from"node:path";var xa=(e,t)=>up.join(e.workspacesDir,`${t}.json`),bT=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=t.repoId??t.primaryRepoId;return{...t,kind:t.kind??"repo",name:t.name??n??t.id,rootPath:t.rootPath??"",primaryRepoId:t.primaryRepoId??n??"",repoId:t.kind==="project"?t.repoId:n,discoveredRepoIds:Array.isArray(t.discoveredRepoIds)?t.discoveredRepoIds.filter(r=>typeof r=="string"):t.kind==="project"?[]:n?[n]:[],linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(r=>typeof r=="string"):[]}},pp=(e,t)=>{let n=bT(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},kn=async(e,t)=>{let n=xa(e,t);try{let r=await wT(n,"utf8");return pp(JSON.parse(r),n)}catch(r){throw RT(r)?new g("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig workspace record at ")?new g("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},Tn=async(e,t)=>{await U(xa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await kT(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>kn(e,up.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},fp=async(e,t)=>{await TT(xa(e,t),{force:!0})},RT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as PT,readdir as ST,rm as IT}from"node:fs/promises";import mp from"node:path";var Fa=(e,t)=>mp.join(e.reposDir,`${t}.json`),hp=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},xe=async(e,t)=>{let n=Fa(e,t);try{let r=await PT(n,"utf8");return hp(JSON.parse(r),n)}catch(r){throw vT(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}},La=async(e,t)=>{await U(Fa(e,t.id),{...t,updatedAt:new Date().toISOString()})},_r=async e=>{let t=await ST(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>xe(e,mp.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},gp=async(e,t)=>{await IT(Fa(e,t),{force:!0})},vT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as CT}from"node:fs/promises";var AT=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(!AT(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},$e=async e=>{let t=await CT(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},Et=async(e,t)=>{await U(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as DT,stat as _T}from"node:fs/promises";import Kn from"node:path";import{realpath as kp}from"node:fs/promises";import ni from"node:path";import{execFile as ET}from"node:child_process";import{promisify as OT}from"node:util";var yp=OT(ET);async function K(e,t,n={}){try{let r=await yp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(wp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function X(e,t,n={}){try{let r=await yp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(wp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function wp(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([kp(n).catch(()=>ni.resolve(n)),kp(e).catch(()=>ni.resolve(e))]);return r===s}catch{return!1}},ja=async e=>{let t=await X("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 X("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"},Tp=async e=>{let t=await X("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=ni.resolve(e,n);return ni.dirname(r)};import{mkdir as Ge,readFile as $T}from"node:fs/promises";var NT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=Oe(e);await Ge(t.craigDir,{recursive:!0}),await Promise.all([Ge(t.reposDir,{recursive:!0}),Ge(t.workspacesDir,{recursive:!0}),Ge(t.runtimeDir,{recursive:!0}),Ge(t.tasksDir,{recursive:!0}),Ge(t.jobsDir,{recursive:!0}),Ge(t.commandsDir,{recursive:!0}),Ge(t.eventsDir,{recursive:!0}),Ge(t.orchestrationDir,{recursive:!0}),Ge(t.logsDir,{recursive:!0}),Ge(t.artifactsDir,{recursive:!0}),Ge(t.worktreesDir,{recursive:!0})]);try{let s=await $T(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!NT(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await U(t.indexFile,r),r};var bp=(e,t,n)=>{let r=new Date().toISOString();return{id:xT(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Rp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},xT=(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},FT=(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},Pp=async(e,t)=>{let n=await $e(e);await Et(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},LT=async(e,t)=>{let n=await DT(t,{withFileTypes:!0}),r=await _r(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Kn.join(t,i.name);if(!await Ma(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await ja(o);s.push(a?Rp(a,l):bp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},MT=async(e,t)=>{let n=await ja(t),r=await _r(e),s=r.find(d=>d.rootPath===t)??null,i=s?Rp(s,n):bp(r,t,n),o=`workspace_${i.id}`,l=(await Ie(e)).find(d=>d.id===o)??null,c=new Date().toISOString(),u=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await La(e,i),l||await Tn(e,u),await Pp(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},jT=async(e,t)=>{let n=await LT(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Ie(e),s=FT(r,Kn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Kn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>La(e,c))),await Tn(e,l),await Pp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},xr=async(e,t)=>{await Vn(e.workspaceRoot);let n=Kn.resolve(e.workspaceRoot,t);if(!(await _T(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Ma(n)?MT(e,n):jT(e,n)};var qa=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Vn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Ua=async(e,t,n={readWorkspace:kn,writeWorkspace:Tn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var Ba=async(e,t)=>{let r={...await kn(e,t),status:"active",archivedAt:null};await Tn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var bn=async(e,t,n={deleteWorkspace:fp,readCraigIndex:$e,writeCraigIndex:Et})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Wa=async(e,t,n)=>{let r=await kn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await bn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as qT,realpath as vp,stat as UT}from"node:fs/promises";import ri from"node:path";async function Va(e){let t=await Ap(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Sp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Sp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Ip(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Tp(t);if(r){let s=await Ip(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 Sp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Ap(ri.resolve(n,e),s),o=await Cp(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 Ip(e){let t=e;for(;;){let n=await Cp(t);if(n)return n;let r=ri.dirname(t);if(r===t)return null;t=r}}async function Cp(e){let t=Oe(e);try{let n=await qT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Wn(r,s,t.indexFile);if(await vp(i.workspaceRoot).catch(()=>ri.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(BT(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 Ap(e,t){let n=ri.resolve(e);try{if(!(await UT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await vp(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 BT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Ka={};Ws(Ka,{addRepo:()=>Ep,listRegisteredRepos:()=>Op,removeRepo:()=>$p});import WT from"node:path";import{stat as VT}from"node:fs/promises";var Ep=async(e,t)=>{let n=WT.resolve(e.workspaceRoot,t);if(!(await VT(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await xr(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var Op=async(e,t={listRepos:_r,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var $p=async(e,t,n)=>{let r=await xe(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>bn(e,c.id))),await gp(e,t);let l=await $e(e);return await Et(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var be={addWorkspace:xr,listWorkspaces:qa,archiveWorkspace:Ua,restoreWorkspace:Ba,removeWorkspace:Wa,removeWorkspaceRecord:bn,resolveContext:Va,repos:Ka};import{mkdir as Np,readFile as KT,rm as ii,stat as GT,writeFile as HT}from"node:fs/promises";import si from"node:path";var YT=25,zT=3e4,JT=5e3;async function tt(e,t,n){let r=si.join(e.runtimeDir,"task-locks"),s=si.join(r,`${t}.lock`);await Np(r,{recursive:!0});let i=Date.now();for(;;)try{await Np(s);try{await HT(si.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ii(s,{recursive:!0,force:!0}),o}break}catch(o){if(!ZT(o))throw o;if(await XT(s))continue;if(Date.now()-i>=zT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await eb(YT)}try{return await n()}finally{await ii(s,{recursive:!0,force:!0})}}async function XT(e){let t=await KT(si.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return QT(t.pid)?!1:(await ii(e,{recursive:!0,force:!0}),!0);let n=await GT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<JT?!1:(await ii(e,{recursive:!0,force:!0}),!0)}function QT(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 ZT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",eb=e=>new Promise(t=>setTimeout(t,e));var Ot=async(e,t)=>{let n=await tb(oi(e,t),"utf8");return JSON.parse(n)},Fr=async(e,t)=>{let n=await Ot(e,t);return Ke(n,oi(e,t))},nt=async(e,t)=>{let n=Dp(t);await U(oi(e,t.id),n)},G=async(e,t,n)=>tt(e,t,async()=>{let r=await Fr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=Dp(s);return await U(oi(e,t),i),i}),Ga=async(e,t)=>{let n=await $e(e);n.taskIds.includes(t)||await Et(e,{...n,taskIds:[...n.taskIds,t]})},oi=(e,t)=>`${e.tasksDir}/${t}.json`,Dp=e=>({...e,updatedAt:new Date().toISOString()});var H=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,zt=e=>e.status==="merged"||e.status==="closed",$t=(e,t)=>{let n=e.prs.findIndex(s=>Gn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Gn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),Rn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return li(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},li=e=>e.mergeable&&!nb(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),nb=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ha=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Nt=(e,t,n)=>{let r=e.isDraft??!1,s=rb(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:sb(e.reviewDecision??null),requiredChecks:Ya(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:lb(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}},rb=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,sb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ya=e=>{let t=e.map(r=>ib(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||ob(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},ib=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:xp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:ab(t)}:null},ob=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):ai(e)&&!ai(t)?!0:!ai(e)&&ai(t)?!1:_p(t.status)>=_p(e.status),ai=e=>e.conclusion?.toUpperCase()==="CANCELLED",_p=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},ab=e=>{let t=e.completedAt??e.startedAt??e.createdAt??null;if(!t)return null;let n=new Date(t).getTime();return Number.isFinite(n)?n:null},lb=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(cb).filter(n=>n!==null).slice(-4):[]},cb=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=db(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},db=e=>e.replace(/\s+/g," ").trim(),xp=(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?xp(r,r):"unknown"};var He=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as ub}from"node:fs/promises";import Fp from"node:path";var F=async(e,t,n={readRawTask:Ot,validateTaskRecord:Ke})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw gb(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):yb(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},we=async e=>{if(!await za(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Hn=(e,t)=>t.artifacts.logPath?Fp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Fp.join(e.workspaceRoot,t.artifacts.logPath):null,Lr=async(e,t)=>{let n=await za(t.worktreePath),r=Hn(e,t),s=r?await za(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:pb(t),lastCommitSummary:fb(t),prSummary:mb(t),cleanupSummary:hb(t)}},za=async e=>{try{return await ub(e),!0}catch{return!1}},pb=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}`},fb=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",mb=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let u=c.pullRequest.status??"unknown";return l[u]=(l[u]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
|
|
9
|
+
${Oa()}`,{})}var Ke=(e,t)=>{let n=_a(e);if(!tT(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},_a=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:xa(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:sT(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:nT(t.repoTargets),runnerSession:t.runnerSession??eT(t),checks:uT(t),lastCommit:t.lastCommit??null,prs:pT(t),artifacts:gT(t),cleanup:yT(t)}},eT=e=>{if(typeof e.title!="string")return null;let t=xa(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},tT=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"&&sp(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||rT(t.repoTargets))&&oT(t.runnerSession)&&aT(t.prompt)&&ip(t.checks)&&op(t.lastCommit)&&cT(t.prs)&&dT(t.artifacts)&&lp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},nT=e=>{if(Array.isArray(e))return e.filter(rp)},rT=e=>Array.isArray(e)&&e.every(rp),rp=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)&&ip(t.checks)&&op(t.lastCommit)&&ap(t.pullRequest)&&lp(t.cleanup)},sT=e=>{if(sp(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 iT(e.id,e.title,t,xa(e.runner))},iT=(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}]},xa=e=>e&&k.runners.isRunnerType(e)?e:"codex",sp=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"),oT=e=>typeof e=="object"&&e!==null&&Array.isArray(e.command)&&e.command.every(t=>typeof t=="string")&&(typeof e.pid=="number"||e.pid===null)&&(typeof e.startedAt=="string"||e.startedAt===null)&&(e.lastKnownState==="starting"||e.lastKnownState==="running"||e.lastKnownState==="exited"||e.lastKnownState==="failed")&&(typeof e.exitCode=="number"||e.exitCode===null)&&(typeof e.exitedAt=="string"||e.exitedAt===null),aT=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",ip=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"),op=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",ap=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&lT(e.requiredChecks),lT=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)),cT=e=>Array.isArray(e)&&e.every(ap),dT=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),lp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),uT=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},pT=e=>{if(Array.isArray(e.prs))return e.prs.map(fT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:cp(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:dp(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},fT=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:cp(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:mT(t.reviewDecision),requiredChecks:dp(t.requiredChecks),comments:hT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},cp=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,mT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,hT=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}]}):[],dp=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})):[],gT=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},yT=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as tb}from"node:fs/promises";import{readFile as wT,readdir as kT,rm as TT}from"node:fs/promises";import up from"node:path";var Fa=(e,t)=>up.join(e.workspacesDir,`${t}.json`),bT=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=t.repoId??t.primaryRepoId;return{...t,kind:t.kind??"repo",name:t.name??n??t.id,rootPath:t.rootPath??"",primaryRepoId:t.primaryRepoId??n??"",repoId:t.kind==="project"?t.repoId:n,discoveredRepoIds:Array.isArray(t.discoveredRepoIds)?t.discoveredRepoIds.filter(r=>typeof r=="string"):t.kind==="project"?[]:n?[n]:[],linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(r=>typeof r=="string"):[]}},pp=(e,t)=>{let n=bT(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},kn=async(e,t)=>{let n=Fa(e,t);try{let r=await wT(n,"utf8");return pp(JSON.parse(r),n)}catch(r){throw RT(r)?new g("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig workspace record at ")?new g("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},Tn=async(e,t)=>{await U(Fa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await kT(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>kn(e,up.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},fp=async(e,t)=>{await TT(Fa(e,t),{force:!0})},RT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as PT,readdir as ST,rm as IT}from"node:fs/promises";import mp from"node:path";var La=(e,t)=>mp.join(e.reposDir,`${t}.json`),hp=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},xe=async(e,t)=>{let n=La(e,t);try{let r=await PT(n,"utf8");return hp(JSON.parse(r),n)}catch(r){throw vT(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 U(La(e,t.id),{...t,updatedAt:new Date().toISOString()})},xr=async e=>{let t=await ST(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>xe(e,mp.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},gp=async(e,t)=>{await IT(La(e,t),{force:!0})},vT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as CT}from"node:fs/promises";var AT=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(!AT(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},$e=async e=>{let t=await CT(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},Ot=async(e,t)=>{await U(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as DT,stat as _T}from"node:fs/promises";import Kn from"node:path";import{realpath as kp}from"node:fs/promises";import ni from"node:path";import{execFile as ET}from"node:child_process";import{promisify as OT}from"node:util";var yp=OT(ET);async function K(e,t,n={}){try{let r=await yp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(wp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function Q(e,t,n={}){try{let r=await yp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(wp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function wp(e){return e instanceof Error}var ja=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([kp(n).catch(()=>ni.resolve(n)),kp(e).catch(()=>ni.resolve(e))]);return r===s}catch{return!1}},qa=async e=>{let t=await Q("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await Q("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},Tp=async e=>{let t=await Q("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=ni.resolve(e,n);return ni.dirname(r)};import{mkdir as Ge,readFile as $T}from"node:fs/promises";var NT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=Oe(e);await Ge(t.craigDir,{recursive:!0}),await Promise.all([Ge(t.reposDir,{recursive:!0}),Ge(t.workspacesDir,{recursive:!0}),Ge(t.runtimeDir,{recursive:!0}),Ge(t.tasksDir,{recursive:!0}),Ge(t.jobsDir,{recursive:!0}),Ge(t.commandsDir,{recursive:!0}),Ge(t.eventsDir,{recursive:!0}),Ge(t.orchestrationDir,{recursive:!0}),Ge(t.logsDir,{recursive:!0}),Ge(t.artifactsDir,{recursive:!0}),Ge(t.worktreesDir,{recursive:!0})]);try{let s=await $T(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!NT(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await U(t.indexFile,r),r};var bp=(e,t,n)=>{let r=new Date().toISOString();return{id:xT(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Rp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},xT=(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},FT=(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},Pp=async(e,t)=>{let n=await $e(e);await Ot(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},LT=async(e,t)=>{let n=await DT(t,{withFileTypes:!0}),r=await xr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Kn.join(t,i.name);if(!await ja(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await qa(o);s.push(a?Rp(a,l):bp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},MT=async(e,t)=>{let n=await qa(t),r=await xr(e),s=r.find(u=>u.rootPath===t)??null,i=s?Rp(s,n):bp(r,t,n),o=`workspace_${i.id}`,l=(await Ie(e)).find(u=>u.id===o)??null,c=new Date().toISOString(),d=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await Ma(e,i),l||await Tn(e,d),await Pp(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},jT=async(e,t)=>{let n=await LT(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Ie(e),s=FT(r,Kn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Kn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>Ma(e,c))),await Tn(e,l),await Pp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Fr=async(e,t)=>{await Vn(e.workspaceRoot);let n=Kn.resolve(e.workspaceRoot,t);if(!(await _T(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await ja(n)?MT(e,n):jT(e,n)};var Ua=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Vn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Ba=async(e,t,n={readWorkspace:kn,writeWorkspace:Tn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var Wa=async(e,t)=>{let r={...await kn(e,t),status:"active",archivedAt:null};await Tn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var bn=async(e,t,n={deleteWorkspace:fp,readCraigIndex:$e,writeCraigIndex:Ot})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Va=async(e,t,n)=>{let r=await kn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await bn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as qT,realpath as vp,stat as UT}from"node:fs/promises";import ri from"node:path";async function Ka(e){let t=await Ap(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Sp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Sp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Ip(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Tp(t);if(r){let s=await Ip(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 Sp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Ap(ri.resolve(n,e),s),o=await Cp(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 Ip(e){let t=e;for(;;){let n=await Cp(t);if(n)return n;let r=ri.dirname(t);if(r===t)return null;t=r}}async function Cp(e){let t=Oe(e);try{let n=await qT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Wn(r,s,t.indexFile);if(await vp(i.workspaceRoot).catch(()=>ri.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(BT(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 Ap(e,t){let n=ri.resolve(e);try{if(!(await UT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await vp(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 BT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Ga={};Ws(Ga,{addRepo:()=>Ep,listRegisteredRepos:()=>Op,removeRepo:()=>$p});import WT from"node:path";import{stat as VT}from"node:fs/promises";var Ep=async(e,t)=>{let n=WT.resolve(e.workspaceRoot,t);if(!(await VT(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Fr(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var Op=async(e,t={listRepos:xr,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var $p=async(e,t,n)=>{let r=await xe(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>bn(e,c.id))),await gp(e,t);let l=await $e(e);return await Ot(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var be={addWorkspace:Fr,listWorkspaces:Ua,archiveWorkspace:Ba,restoreWorkspace:Wa,removeWorkspace:Va,removeWorkspaceRecord:bn,resolveContext:Ka,repos:Ga};import{mkdir as Np,readFile as KT,rm as ii,stat as GT,writeFile as HT}from"node:fs/promises";import si from"node:path";var YT=25,zT=3e4,JT=5e3;async function tt(e,t,n){let r=si.join(e.runtimeDir,"task-locks"),s=si.join(r,`${t}.lock`);await Np(r,{recursive:!0});let i=Date.now();for(;;)try{await Np(s);try{await HT(si.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ii(s,{recursive:!0,force:!0}),o}break}catch(o){if(!ZT(o))throw o;if(await XT(s))continue;if(Date.now()-i>=zT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await eb(YT)}try{return await n()}finally{await ii(s,{recursive:!0,force:!0})}}async function XT(e){let t=await KT(si.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return QT(t.pid)?!1:(await ii(e,{recursive:!0,force:!0}),!0);let n=await GT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<JT?!1:(await ii(e,{recursive:!0,force:!0}),!0)}function QT(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 ZT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",eb=e=>new Promise(t=>setTimeout(t,e));var $t=async(e,t)=>{let n=await tb(oi(e,t),"utf8");return JSON.parse(n)},Lr=async(e,t)=>{let n=await $t(e,t);return Ke(n,oi(e,t))},nt=async(e,t)=>{let n=Dp(t);await U(oi(e,t.id),n)},G=async(e,t,n)=>tt(e,t,async()=>{let r=await Lr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=Dp(s);return await U(oi(e,t),i),i}),Ha=async(e,t)=>{let n=await $e(e);n.taskIds.includes(t)||await Ot(e,{...n,taskIds:[...n.taskIds,t]})},oi=(e,t)=>`${e.tasksDir}/${t}.json`,Dp=e=>({...e,updatedAt:new Date().toISOString()});var H=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Jt=e=>e.status==="merged"||e.status==="closed",Nt=(e,t)=>{let n=e.prs.findIndex(s=>Gn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Gn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),Rn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return li(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},li=e=>e.mergeable&&!nb(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),nb=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ya=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Dt=(e,t,n)=>{let r=e.isDraft??!1,s=rb(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:sb(e.reviewDecision??null),requiredChecks:za(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:lb(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}},rb=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,sb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,za=e=>{let t=e.map(r=>ib(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||ob(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},ib=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:xp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:ab(t)}:null},ob=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):ai(e)&&!ai(t)?!0:!ai(e)&&ai(t)?!1:_p(t.status)>=_p(e.status),ai=e=>e.conclusion?.toUpperCase()==="CANCELLED",_p=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},ab=e=>{let t=e.completedAt??e.startedAt??e.createdAt??null;if(!t)return null;let n=new Date(t).getTime();return Number.isFinite(n)?n:null},lb=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(cb).filter(n=>n!==null).slice(-4):[]},cb=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=db(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},db=e=>e.replace(/\s+/g," ").trim(),xp=(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?xp(r,r):"unknown"};var He=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as ub}from"node:fs/promises";import Fp from"node:path";var F=async(e,t,n={readRawTask:$t,validateTaskRecord:Ke})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw gb(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):yb(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},we=async e=>{if(!await Ja(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Hn=(e,t)=>t.artifacts.logPath?Fp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Fp.join(e.workspaceRoot,t.artifacts.logPath):null,Mr=async(e,t)=>{let n=await Ja(t.worktreePath),r=Hn(e,t),s=r?await Ja(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:pb(t),lastCommitSummary:fb(t),prSummary:mb(t),cleanupSummary:hb(t)}},Ja=async e=>{try{return await ub(e),!0}catch{return!1}},pb=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}`},fb=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",mb=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let d=c.pullRequest.status??"unknown";return l[d]=(l[d]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
|
|
10
10
|
${i.join(`
|
|
11
|
-
`)}`}let t=H(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},hb=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",gb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",yb=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var
|
|
12
|
-
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},qp=async e=>{let t=await
|
|
11
|
+
`)}`}let t=H(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},hb=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",gb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",yb=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var jr=async(e,t)=>{let n=await Q("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},Xa=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await Q("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await wb(e,s);await K("git",["worktree","add","-b",t,n,o],{cwd:e})},wb=async(e,t)=>(await Q("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await Q("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await Q("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,ci=async e=>{let t=await Q("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},Lp=async e=>{await K("git",["add","-A"],{cwd:e})},Mp=async(e,t)=>{await K("git",["commit","-m",t],{cwd:e})},jp=async e=>{let t=await K("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
|
|
12
|
+
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},qp=async e=>{let t=await Q("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var di=async(e,t)=>{await K("git",["worktree","remove","--force",t],{cwd:e})},Up=async(e,t)=>{await K("git",["branch","-D",t],{cwd:e})};var Qa=async e=>Yn(e,e.repoRoot),Yn=async(e,t)=>{let n=await $e(e),r=Bp(new Date),s=Wp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await jr(t,o))return i;s+=1}},qr=async e=>{let t=await $e(e),n=Bp(new Date),r=Wp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Bp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Wp=(e,t)=>{let n=e.filter(r=>r.startsWith(`task_${t}_`)).map(r=>Number.parseInt(r.slice(-2),10)).filter(r=>Number.isInteger(r));return n.length===0?1:Math.max(...n)+1};var Ur=async(e,t,n={readRawTask:$t,validateTaskRecord:Ke})=>{let r=await $e(e),s=[],i=[];await Promise.all(r.taskIds.map(async l=>{try{let c=await n.readRawTask(e,l);s.push(n.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(kb(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}},kb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Vp=["merge_ready","pr_open","checked","review","running","draft"],Za=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),el=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(Tb)[0]?.id??null,Tb=(e,t)=>{let n=Kp(e.status),r=Kp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Kp=e=>{let t=Vp.indexOf(e);return t>=0?t:Vp.length};import Gp from"node:path";var Pn=(e,t)=>t?Gp.isAbsolute(t)?t:Gp.join(e.repoRoot,t):null;import{randomUUID as bb}from"node:crypto";import{mkdir as Wr,rm as Rb,writeFile as ui}from"node:fs/promises";import J from"node:path";var Br=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Hp=["AGENTS","md"].join("."),zn=async(e,t,n,r={})=>{let s=await xe(e,t),[i,o]=await Promise.all([Cb(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Yn(e,s.rootPath)]),a=`craig/${o}`,l=J.join(e.worktreesDir,s.id,o),c=J.join(e.logsDir,`${o}.log`),d=J.join(e.artifactsDir,o);await Promise.all([Wr(J.dirname(l),{recursive:!0}),Wr(d,{recursive:!0}),ui(c,"","utf8")]);let u=Pb(e,{taskId:o,repoId:s.id,workspaceId:i.id,repoRoot:s.rootPath,prompt:n,runner:r.runner??"codex",config:r.config??{},branch:a,worktreePath:l,...r.lineage?{lineage:r.lineage}:{}});return await nt(e,u),await Ha(e,o),await Xa(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},Vr=async(e,t,n,r={})=>{let s=(await Ie(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await zn(e,s.primaryRepoId,n,r);return{...b,bundlePath:b.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await qr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=J.join(e.craigDir,"task-bundles",o),u=J.join(e.logsDir,`${o}.log`),p=J.join(e.artifactsDir,o);await Wr(d,{recursive:!0}),await Wr(p,{recursive:!0}),await ui(u,"","utf8");let h=await Promise.all(i.map(b=>xe(e,b))),f=Ib(h),m=await Promise.all(h.map(b=>Sb(e,b,o,c,J.join(d,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await Rb(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${m.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await nl({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:m,bundlePath:d});let T=Kr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Br(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:T[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...zp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:J.relative(e.workspaceRoot,u),checkSummaryPath:J.relative(e.workspaceRoot,J.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:J.relative(e.workspaceRoot,J.join(p,"pr-status.json"))},cleanup:pi(),lastFailureReason:m.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await nt(e,R),await Ha(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:m}},Kr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${bb()}`}:{},title:i.defaultAgentTitle,command:k.runners.buildCommand(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},Pb=(e,t)=>{let n=new Date().toISOString(),r=Kr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Br(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...zp(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:{...rl(J.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:J.relative(e.workspaceRoot,J.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:J.relative(e.workspaceRoot,J.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:J.relative(e.workspaceRoot,J.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:pi(),lastFailureReason:null,createdAt:n,updatedAt:n}},Sb=async(e,t,n,r,s)=>{try{return await tl(e,t,r,s)}catch(i){return{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:i instanceof Error?i.message:"Failed to create worktree.",checks:rl(J.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Yp(),cleanup:pi()}}},tl=async(e,t,n,r)=>(await Wr(J.dirname(r),{recursive:!0}),await Xa(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:rl(J.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Yp(),cleanup:pi()}),Ib=e=>{let t=new Set(["manifest.json",Hp]),n=new Map;for(let r of e){let s=t.has(r.name)?`${r.name}-repo`:r.name,i=s,o=2;for(;t.has(i);)i=`${s}-${o}`,o+=1;t.add(i),n.set(r.id,i)}return n},vb=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=J.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
|
|
13
13
|
`);return["# Craig Project Task Bundle","","This directory is a Craig project task bundle. Repo work must happen inside the child repo worktrees listed below.","","Run repo Git commands from a repo worktree directory, not from the bundle root. Use `manifest.json` as the machine-readable source of truth for this bundle.","",`Task: \`${e.taskId}\``,`Workspace: \`${e.workspaceId}\``,`Prompt: ${e.prompt}`,"","## Repo Worktrees","",n,""].join(`
|
|
14
|
-
`)},
|
|
14
|
+
`)},nl=async e=>{await ui(J.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:J.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await ui(J.join(e.bundlePath,Hp),vb(e),"utf8")},rl=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Yp=()=>({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}),pi=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),zp=(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}),Cb=async(e,t,n,r=!1)=>{let s=await Ie(e),i=n?s.find(o=>o.id===n&&o.status==="active"&&(o.kind==="project"?r||o.discoveredRepoIds?.includes(t):o.primaryRepoId===t)):s.find(o=>o.kind!=="project"&&o.primaryRepoId===t&&o.status==="active");if(!i)throw new Error(n?`Repo ${t} is not available in active workspace ${n}.`:`Repo ${t} does not have an active workspace.`);return i};var sl=async(e,t,n)=>{await G(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},Gr=async(e,t,n)=>G(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Hr=async(e,t)=>G(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});var il=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let l=(r.workspaceId?await Vr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await zn(e,t,s,{runner:o,config:i,...r.owningWorkspaceId?{workspaceId:r.owningWorkspaceId,allowLinkedProjectRepo:r.allowLinkedProjectRepo??!1}:{},...r.lineage?{lineage:r.lineage}:{}})).task;try{let c=await r.onProvisioned?.(l);if(!r.launchProvisioned)throw new Error("Craig task creation requires the PTY daemon launcher.");await r.launchProvisioned(l,c||void 0);let d=r.markStartedAfterLaunch===!1?await F(e,l.id):await Hr(e,l.id),u=d.ptyTabs.find(p=>p.kind==="agent");return{kind:"createTask",taskId:d.id,repoId:d.repoId,workspaceId:d.workspaceId,agentTabId:u.id,status:d.status,branch:d.branch,worktreePath:d.worktreePath,runner:d.runner}}catch(c){throw await Gr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as Nb}from"node:fs/promises";import Db from"node:path";var _t=async e=>{let t=await Q("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Jp=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await K("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Jn=async(e,t)=>{let n=await K("gh",ol(e),{cwd:t});return JSON.parse(n.stdout)},Xn=async(e,t)=>{let n=await Q("gh",ol(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Zp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Xp=async(e,t)=>{let n=await Q("gh",ol(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Zp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Qp=async(e,t,n)=>{if(n.length===0)return[];let r=Ob(n),s;try{s=await K("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw Ab(a)?new He(a instanceof Error?a.message:String(a)):a}let o=JSON.parse(s.stdout).data?.repository??{};return n.map((a,l)=>{let c=o[`item${l}`],d=$b(c);return{id:a.id,found:d!==null,view:d}})},fi=async e=>{let t=await Q("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:Eb(t.stdout.trim())},Xt=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])}},Ab=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")},Zp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},ol=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],Eb=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},Ob=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,51 +65,51 @@ fragment PrFields on PullRequest {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
`,$b=e=>{if(!e||typeof e!="object")return null;let t="nodes"in e?e.nodes?.[0]??null:e;if(!t||typeof t!="object")return null;let n=t,r=n.statusCheckRollup?.contexts?.nodes??[];return{number:n.number,url:n.url,baseRefName:n.baseRefName,headRefName:n.headRefName,headRefOid:n.headRefOid??null,state:n.state,isDraft:n.isDraft??!1,title:n.title??null,createdAt:n.createdAt??null,updatedAt:n.updatedAt??null,mergedAt:n.mergedAt??null,mergeable:n.mergeable,mergeStateStatus:n.mergeStateStatus,reviewDecision:n.reviewDecision??null,statusCheckRollup:r,comments:n.comments?.nodes??[]}};var Sn=async(e,t)=>{let n=Pn(e,t.artifacts.prStatusPath);n&&(await Nb(Db.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,prs:t.prs}))},Qn=async(e,t,n={writeTask:nt,writePrStatusArtifact:Sn})=>{await n.writeTask(e,t);try{await n.writePrStatusArtifact(e,t)}catch(r){throw new g("PARTIAL_RESULT",`Task ${t.id} was updated, but its PR status artifact could not be written.`,{retryable:!0,details:{taskId:t.id},cause:r})}return t},
|
|
68
|
+
`,$b=e=>{if(!e||typeof e!="object")return null;let t="nodes"in e?e.nodes?.[0]??null:e;if(!t||typeof t!="object")return null;let n=t,r=n.statusCheckRollup?.contexts?.nodes??[];return{number:n.number,url:n.url,baseRefName:n.baseRefName,headRefName:n.headRefName,headRefOid:n.headRefOid??null,state:n.state,isDraft:n.isDraft??!1,title:n.title??null,createdAt:n.createdAt??null,updatedAt:n.updatedAt??null,mergedAt:n.mergedAt??null,mergeable:n.mergeable,mergeStateStatus:n.mergeStateStatus,reviewDecision:n.reviewDecision??null,statusCheckRollup:r,comments:n.comments?.nodes??[]}};var Sn=async(e,t)=>{let n=Pn(e,t.artifacts.prStatusPath);n&&(await Nb(Db.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,prs:t.prs}))},Qn=async(e,t,n={writeTask:nt,writePrStatusArtifact:Sn})=>{await n.writeTask(e,t);try{await n.writePrStatusArtifact(e,t)}catch(r){throw new g("PARTIAL_RESULT",`Task ${t.id} was updated, but its PR status artifact could not be written.`,{retryable:!0,details:{taskId:t.id},cause:r})}return t},Yr=async(e,t,n,r,s={readRawTask:$t,validateTaskRecord:Ke,writeTask:nt,writePrStatusArtifact:Sn,withTaskLock:tt})=>s.withTaskLock(e,t.id,async()=>{let i=await s.readRawTask(e,t.id),o=s.validateTaskRecord(i,`${e.tasksDir}/${t.id}.json`),a=o.prs.find(p=>r?.number!==null&&p.number===r?.number)??r,l=Dt(n,a),c=Nt(o,l),d=o.status==="closed"?o.status:Rn(c.prs),u={...c,status:d};return Qn(e,u,s)}),zr=async(e,t)=>{let n=H(t),r=n?.number?String(n.number):t.branch,s=await Jn(r,t.worktreePath);return Yr(e,t,s,n)},Jr=async(e,t)=>{for(let n of await al(t)){let r=await Xn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Yr(e,t,r,null)}}return{discovered:!1,task:t}},al=async e=>{let t=await qp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Xr(e,t,n,r){return tt(e,t,async()=>{let s=await F(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Xt(r.url),a=s.prs.find(h=>o?Gn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=Dt(r,a,o??void 0),c=_b(r),d=Nt(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:Zn(h)?h.pullRequest:ef(h.pullRequest)}:h)},p={...u,status:u.status==="closed"?u.status:hi(u)};return Qn(e,p)})}async function mi(e,t,n){return tt(e,t,async()=>{let r=await F(e,t),s=r.repoTargets?.find(a=>a.repoId===n);if(!s)throw new Error(`Project task ${t} has no repo target ${n}.`);if(s.pullRequest.number===null||Zn(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:ef(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:hi(i)};return Qn(e,o)})}function Zn(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function _b(e){let t=Xt(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:xb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Fb(e.reviewDecision??null),requiredChecks:za(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function hi(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 xb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Fb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ef=e=>({provider:"github",owner:e.owner??null,repo:e.repo??null,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null});var er=async(e,t,n)=>{if(Zn(n)){let s=String(n.pullRequest.number),i=await Jn(s,n.worktreePath);return await Xr(e,t.id,n.repoId,i),"synced"}let r=await Xn(n.branch,n.worktreePath);return r?(await Xr(e,t.id,n.repoId,r),"discovered"):(await mi(e,t.id,n.repoId),"not_found")};var Qr=async(e,t)=>{let n=await F(e,t),r=H(n);return r?.number?(await _t(n.worktreePath),Jt(r)?(await Jr(e,n)).task:zr(e,n)):n},cl=async(e,t)=>{let n=await F(e,t);if(n.type==="project"&&n.repoTargets?.length)return await tr(e,t),F(e,t);let r=H(n);if(await we(n),await _t(n.worktreePath),!r?.number||Jt(r)){let i=await Jr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await zr(e,n)},tr=async(e,t)=>{let n=await F(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await _t(i.worktreePath);let o=i.pullRequest.number?await er(e,n,i):await er(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},dl=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=ll(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p=Zn(u),h={id:`${i.id}:${u.repoId}`,task:i,targetRepoId:u.repoId,worktreePath:u.worktreePath,selector:p?String(u.pullRequest.number):u.branch,mode:p?"number":"head",fallbackSelectors:[]};await tf(r,h).catch(async()=>{try{await _t(u.worktreePath);let f=u.pullRequest.number?await er(e,i,u):await er(e,i,u);gi(o,f,u.pullRequest.number??null,u.pullRequest.url??null)}catch(f){if(f instanceof He)throw f;s.push(f)}})}continue}let a=H(i),l=a?.number&&!Jt(a),c=l?[]:await al(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 tf(r,d).catch(async()=>{try{let{disposition:u,task:p}=await yi(e,i.id),h=H(p);gi(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof He)throw u;s.push(u)}})}for(let i of r.values())try{await _t(i.worktreePath);let o=await Qp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=ll(n,l.task),u=a.get(l.id)?.view??await Lb(i.worktreePath,l);if(!u){l.targetRepoId&&l.mode==="head"&&await mi(e,l.task.id,l.targetRepoId),gi(c,"not_found",null,null);continue}if(l.targetRepoId)await Xr(e,l.task.id,l.targetRepoId,u);else{let p=await $t(e,l.task.id),h=Ke(p,`${e.tasksDir}/${l.task.id}.json`);await Yr(e,h,u,l.mode==="number"?H(h):null)}gi(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof He)throw o;s.push(o)}return Mb(s),t.map(i=>ll(n,i))},yi=async(e,t)=>{let n=await F(e,t);await we(n),await _t(n.worktreePath);let r=H(n);if(r?.number&&!Jt(r))return{disposition:"synced",task:await zr(e,n)};let s=await Jr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},Lb=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Xn(n,e);if(r)return r}return null},tf=async(e,t)=>{let n=await fi(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]})},ll=(e,t)=>{let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!H(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},gi=(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},Mb=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var ul=async(e,t)=>{let n=await F(e,t);try{n.type==="project"&&n.repoTargets?.length?(await tr(e,t),n=await F(e,t)):n.prs.some(s=>s.number)&&(n=await Qr(e,t))}catch{}let r=await Mr(e,n);return{kind:"showTask",task:n,inspection:r}};var pl=async(e,t)=>{let n=await F(e,t);if(await we(n),(await K("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await jb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},jb=async e=>{let t=[],n=await K("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await qb(e);for(let s of r){let i=await Q("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
|
|
69
69
|
|
|
70
70
|
`)},qb=async e=>(await K("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
|
|
71
|
-
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as Ub}from"node:child_process";import{access as Bb}from"node:fs/promises";var pl=async(e,t)=>{let n=await F(e,t),r=Hn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await Bb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},fl=async e=>{await new Promise((t,n)=>{let r=!1,s=Ub("tail",["-n","+1","-f",e],{stdio:"inherit"}),i=()=>{r=!0,s.kill("SIGINT")};process.on("SIGINT",i),s.on("error",a=>{o(),n(a)}),s.on("exit",(a,l)=>{if(o(),r||l==="SIGINT"){t();return}if(a===0){t();return}n(new Error(`tail -n +1 -f ${e} failed with exit code ${a??"unknown"}.`))});function o(){process.off("SIGINT",i)}})};import{mkdir as Wb}from"node:fs/promises";import Vb from"node:path";var ml=async(e,t)=>{let n=await F(e,t);if(await we(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await ci(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await G(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await X("sh",["-lc",a],{cwd:n.worktreePath}),u=new Date().toISOString(),d=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:u,exitCode:d}),d!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await G(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await nf(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await G(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await nf(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},nf=async(e,t)=>{let n=Pn(e,t.artifacts.checkSummaryPath);n&&(await Wb(Vb.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var hl=async(e,t)=>{let n=await F(e,t);await we(n);let r=await ci(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.title.trim();await Lp(n.worktreePath),await Mp(n.worktreePath,s);let i=await jp(n.worktreePath),o=new Date().toISOString(),a=await G(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as Kb}from"node:fs/promises";var gl=async(e,t)=>{let n=await F(e,t),r=await Gb(n.worktreePath);return G(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Gb=async e=>{try{return await Kb(e),!0}catch{return!1}};var yl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await di(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await G(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var wl=async(e,t,n)=>{let r=await xe(e,n),s=await G(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},kl=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>xe(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as Hb,readFile as rf,rm as Yb,writeFile as sf}from"node:fs/promises";import wi from"node:path";var af=["AGENTS","md"].join("."),Tl=async(e,t,n)=>tt(e,t,async()=>{let r=await F(e,t);zb(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return of(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([xe(e,n),Ie(e).then(f=>f.find(m=>m.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=wi.join(a,Jb(i.name,r)),c=wi.join(a,"manifest.json"),u=wi.join(a,af),[d,p,h]=await Promise.all([rf(c,"utf8"),rf(u,"utf8"),Mr(i.rootPath,r.branch)]);try{let f=await el(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(T=>xe(e,T.repoId)));return await tl({taskId:r.id,workspaceId:r.workspaceId,prompt:Xb(d)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await nt(e,m),of(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await Qb({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:d,guidePath:u,guideBackup:p});throw m.length>0?new g("PARTIAL_RESULT",`Failed to attach repo ${i.id} to task ${r.id}, and rollback was incomplete.`,{retryable:!0,details:{taskId:r.id,repoId:i.id,rollbackFailures:m.map(y=>y instanceof Error?y.message:String(y))},cause:f}):f}}),zb=e=>{if(e.type!=="project"||!e.bundlePath)throw new g("TASK_CONTEXT_CONFLICT",`Task ${e.id} is not a project task and cannot accept repository targets.`,{details:{taskId:e.id,taskType:e.type}})},Jb=(e,t)=>{let n=new Set(["manifest.json",af,...(t.repoTargets??[]).map(o=>wi.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},Xb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},Qb=async e=>{let t=[];return await sf(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await sf(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await Hb(e.worktreePath).then(()=>!0).catch(()=>!1)&&await di(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await Yb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await Mr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Up(e.repoRoot,e.branch).catch(s=>t.push(s)),t},of=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as Zb}from"node:child_process";var bl=async(e,t)=>{let n=await F(e,t);await we(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await eR(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},eR=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=Zb(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 cf}from"node:fs/promises";import Qr from"node:path";async function Pl(e,t){if(t.explicitTaskId!==void 0){let l=await lf(e,t.explicitTaskId,"explicit");return Rl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await lf(e,t.environmentTaskId,"environment");return Rl(l,"environment",t.environmentAgentTabId)}let n=await cf(t.cwd).catch(()=>Qr.resolve(t.cwd)),r=await qr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await nR(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 Rl(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 lf(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 Rl(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 tR(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function nR(e,t){return(await Promise.all(tR(e).map(r=>cf(r).catch(()=>Qr.resolve(r))))).some(r=>rR(r,t))}function rR(e,t){let n=Qr.relative(Qr.resolve(e),t);return n===""||!n.startsWith("..")&&!Qr.isAbsolute(n)}var Sl=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await G(e,t,o=>(s=o.title,{...o,title:r,slug:Ur(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var Il=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??H(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Jp(s.worktreePath,i,n)};var Zr={readTask:F,writeTask:nt,withTaskLock:tt,ensureGhAuthenticated:Dt,fetchPrView:Jn,discoverPrView:Xp,getGitHubRepositoryLocator:fi,writePrStatusArtifact:Sn};async function Cl(e,t,n,r=Zr){let s=await r.readTask(e,t),i=await iR(s,n,r);return Xt(s,i,"showTaskPr","shown",[])}async function Al(e,t,n,r=Zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Dl(s,n,null,r);await _l(i,r);let o=await Ti(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Xt(s,i,"discoverTaskPr","not_found",[]);xl(o,i);let a=bi(s,i,o.number),l=await Fl(e,s,i,o,r);return Xt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function El(e,t,n,r,s=Zr){let i=Nl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Dl(o,r,i.repository,s);uf(i.repository,a),await _l(a,s);let l=await Ti(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));oR(l,i),xl(l,a);let c=bi(o,a,l.number),u=Ll(o,a),d=u&&!Gn(u,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&u.status!=="closed"&&u.status!=="merged"?[`Pull request #${l.number} becomes active; #${u.number} remains in task history.`]:[],p=await Fl(e,o,a,l,s);return Xt(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function sR(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);let o=e.prs.find(a=>a.number===n.number)??H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ki(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw nr(e,t);let a=df(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&kt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ki(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&kt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&kt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function Ol(e,t,n,r=Zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Dl(s,n,null,r),o=Ll(s,i);if(!o?.number)return Xt(s,i,"refreshTaskPr","not_found",[]);await _l(i,r);let a=await Ti(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));xl(a,i);let l=await Fl(e,s,i,a,r);return Xt(l,i,"refreshTaskPr","synced",[])})}async function $l(e,t,n,r,s=Zr){let i=Nl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await sR(o,r,i,s);if(uf(i.repository,a),!bi(o,a,i.number))return Xt(o,a,"unlinkTaskPr","unchanged",[]);let c=aR(o,a,i.number),u=await ff(e,c,s);return Xt(u,a,"unlinkTaskPr","unlinked",[])})}function Nl(e){let t=e.trim(),n=Jt(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 Dl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);return vl(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw nr(e,t);return vl(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 vl(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&kt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function iR(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);let s=H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ki(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw nr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ki(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ki(e,t,n,r){let s=df(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function df(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Jt(e.url):null}async function vl(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new g("EXTERNAL_DEPENDENCY_FAILED",`Repo ${e} does not have a supported GitHub origin remote.`,{details:{repoId:e,worktreePath:n}});return{repoId:e,branch:t,worktreePath:n,repository:i,projectTarget:r}}async function _l(e,t){await Ti("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function Ti(e,t){try{return await t()}catch(n){throw n instanceof g?n:new g("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function uf(e,t){if(e&&!kt(e,t.repository))throw pf(e,t)}function oR(e,t){let n=Jt(e.url);if(!n||n.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!kt(t.repository,n))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function xl(e,t){let n=Jt(e.url);if(!n||!kt(n,t.repository))throw pf(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 pf(e,t){return new g("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function nr(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function kt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Fl(e,t,n,r,s){let i=bi(t,n,r.number),o=Nt(r,i,n.repository),a=$t(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:gf(o)}:l)}),ff(e,a,s)}function aR(e,t,n){let r=e.prs.filter(i=>!hf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=mf(r.filter(o=>o.owner&&o.repo&&kt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?gf(i):cR(t.repository)}:o)}}return s}async function ff(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?hi(t):Rn(t.prs),s={...t,status:r};return Qn(e,s,n)}function bi(e,t,n){return Ml(e,t).find(r=>hf(r,t,n))??null}function Ll(e,t){if(!t.projectTarget)return H(e);let n=Ml(e,t);return mf(n)}function mf(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Ml(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&kt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?lR(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function hf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||kt({owner:e.owner,name:e.repo},t.repository)}function Xt(e,t,n,r,s){let i=Ml(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Ll(e,t),warnings:s}}function gf(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 lR(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 cR(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var S={listTasks:qr,getTask:F,provisionTask:zn,provisionProjectTask:Wr,createTask:sl,showTask:dl,showTaskDiff:ul,prepareTaskLogs:pl,streamTaskLogs:fl,runChecks:ml,commitTask:hl,closeTask:gl,cleanupTask:yl,addTaskLink:wl,addTaskRepoTarget:Tl,listTaskLinks:kl,sortTasksForDisplay:Qa,resolveSelectedTaskId:Za,allocateTaskId:Xa,allocateTaskIdForRepo:Yn,allocateProjectTaskId:jr,createDefaultTaskPtyTabs:Vr,assertTaskWorktreeExists:we,resolveTaskLogPath:Hn,buildTaskInspection:Lr,resolveArtifactPath:Pn,openTask:bl,markRunnerFailed:rl,recordStartupFailure:Kr,markTaskStarted:Gr,renameTask:Sl,resolveContext:Pl,prs:{refresh:Xr,refreshChecks:ll,discoverOrRefresh:yi,discoverOrRefreshAll:tr,discoverOrRefreshMany:cl,show:Cl,discover:Al,link:El,refreshAssociation:Ol,unlink:$l,merge:Il,getPrimaryPr:H,isPrTerminal:zt,isMergeReady:li,deriveTaskStatus:Rn,upsertPr:$t,normalizePr:Nt,summarizeRequiredChecks:Ha,writePrStatusArtifact:Sn}};var yf={idle:0,ready:1,working:2,error:3};function Ye(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Tt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ye(t,n,r,i)}function rr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Tt(e,s.id,t,n);yf[i]>yf[r]&&(r=i)}return r}function Ri(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ye(s.id,t,n)==="working"))}function bt(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=Tt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:rr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function jl(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=bt([e],t.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw wf(e.id);let d=a-r();if(d<=0)throw dR(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(T),f(wf(e.id))},T=setTimeout(m,d);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var dR=(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}}),wf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as mR}from"node:net";import{createHash as uR}from"node:crypto";import{tmpdir as pR}from"node:os";import kf from"node:path";var Rt=10,fR=new Set([6,7,8,9,Rt]);function Qt(e){return e!==void 0&&fR.has(e)}function Fe(e){let t=uR("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:kf.join(pR(),`craig-${t}.sock`),pidPath:kf.join(e.runtimeDir,"pty-daemon.pid")}}async function Tf(e){let t=null;try{let n=await hR(Fe(e.paths).socketPath);return t=new Ul(n,e),await t.ready(),t}catch{return t?.close(),null}}var Ul=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!==Rt)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})}
|
|
71
|
+
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as Ub}from"node:child_process";import{access as Bb}from"node:fs/promises";var fl=async(e,t)=>{let n=await F(e,t),r=Hn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await Bb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},ml=async e=>{await new Promise((t,n)=>{let r=!1,s=Ub("tail",["-n","+1","-f",e],{stdio:"inherit"}),i=()=>{r=!0,s.kill("SIGINT")};process.on("SIGINT",i),s.on("error",a=>{o(),n(a)}),s.on("exit",(a,l)=>{if(o(),r||l==="SIGINT"){t();return}if(a===0){t();return}n(new Error(`tail -n +1 -f ${e} failed with exit code ${a??"unknown"}.`))});function o(){process.off("SIGINT",i)}})};import{mkdir as Wb}from"node:fs/promises";import Vb from"node:path";var hl=async(e,t)=>{let n=await F(e,t);if(await we(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await ci(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await G(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await Q("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await G(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await nf(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await G(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await nf(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},nf=async(e,t)=>{let n=Pn(e,t.artifacts.checkSummaryPath);n&&(await Wb(Vb.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var gl=async(e,t)=>{let n=await F(e,t);await we(n);let r=await ci(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.title.trim();await Lp(n.worktreePath),await Mp(n.worktreePath,s);let i=await jp(n.worktreePath),o=new Date().toISOString(),a=await G(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as Kb}from"node:fs/promises";var yl=async(e,t)=>{let n=await F(e,t),r=await Gb(n.worktreePath);return G(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Gb=async e=>{try{return await Kb(e),!0}catch{return!1}};var wl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await di(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await G(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var kl=async(e,t,n)=>{let r=await xe(e,n),s=await G(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},Tl=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>xe(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as Hb,readFile as rf,rm as Yb,writeFile as sf}from"node:fs/promises";import wi from"node:path";var af=["AGENTS","md"].join("."),bl=async(e,t,n)=>tt(e,t,async()=>{let r=await F(e,t);zb(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return of(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([xe(e,n),Ie(e).then(f=>f.find(m=>m.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=wi.join(a,Jb(i.name,r)),c=wi.join(a,"manifest.json"),d=wi.join(a,af),[u,p,h]=await Promise.all([rf(c,"utf8"),rf(d,"utf8"),jr(i.rootPath,r.branch)]);try{let f=await tl(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(T=>xe(e,T.repoId)));return await nl({taskId:r.id,workspaceId:r.workspaceId,prompt:Xb(u)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await nt(e,m),of(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await Qb({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:u,guidePath:d,guideBackup:p});throw m.length>0?new g("PARTIAL_RESULT",`Failed to attach repo ${i.id} to task ${r.id}, and rollback was incomplete.`,{retryable:!0,details:{taskId:r.id,repoId:i.id,rollbackFailures:m.map(y=>y instanceof Error?y.message:String(y))},cause:f}):f}}),zb=e=>{if(e.type!=="project"||!e.bundlePath)throw new g("TASK_CONTEXT_CONFLICT",`Task ${e.id} is not a project task and cannot accept repository targets.`,{details:{taskId:e.id,taskType:e.type}})},Jb=(e,t)=>{let n=new Set(["manifest.json",af,...(t.repoTargets??[]).map(o=>wi.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},Xb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},Qb=async e=>{let t=[];return await sf(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await sf(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await Hb(e.worktreePath).then(()=>!0).catch(()=>!1)&&await di(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await Yb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await jr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Up(e.repoRoot,e.branch).catch(s=>t.push(s)),t},of=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as Zb}from"node:child_process";var Rl=async(e,t)=>{let n=await F(e,t);await we(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await eR(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},eR=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=Zb(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 cf}from"node:fs/promises";import Zr from"node:path";async function Sl(e,t){if(t.explicitTaskId!==void 0){let l=await lf(e,t.explicitTaskId,"explicit");return Pl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await lf(e,t.environmentTaskId,"environment");return Pl(l,"environment",t.environmentAgentTabId)}let n=await cf(t.cwd).catch(()=>Zr.resolve(t.cwd)),r=await Ur(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await nR(l,n)})))).filter(l=>l.matches).map(l=>l.task),o=[...new Map(i.map(l=>[l.id,l])).values()];if(o.length>1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Multiple Craig tasks match ${n}: ${o.map(l=>l.id).join(", ")}. Use --task <id>.`,{details:{cwd:n,taskIds:o.map(l=>l.id)}});let a=o[0];if(a)return Pl(a,"cwd",t.environmentAgentTabId);if(t.environmentAgentTabId!==void 0)throw new g("TASK_CONTEXT_CONFLICT",`CRAIG_AGENT_TAB_ID is set to ${t.environmentAgentTabId}, but no task context could be resolved.`,{details:{agentTabId:t.environmentAgentTabId}});if(t.required)throw new g("TASK_CONTEXT_NOT_FOUND",`No Craig task was found from ${n}. Use --task <id> or run the command inside a task worktree.`,{details:{cwd:n}});return null}async function lf(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 Pl(e,t,n){let r=n??null;if(r!==null){let s=e.ptyTabs.find(i=>i.id===r);if(!s||s.kind!=="agent")throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${r} does not belong to Craig task ${e.id}.`,{details:{taskId:e.id,agentTabId:r}})}return{task:e,source:t,agentTabId:r}}function tR(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function nR(e,t){return(await Promise.all(tR(e).map(r=>cf(r).catch(()=>Zr.resolve(r))))).some(r=>rR(r,t))}function rR(e,t){let n=Zr.relative(Zr.resolve(e),t);return n===""||!n.startsWith("..")&&!Zr.isAbsolute(n)}var Il=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await G(e,t,o=>(s=o.title,{...o,title:r,slug:Br(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var vl=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??H(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Jp(s.worktreePath,i,n)};var es={readTask:F,writeTask:nt,withTaskLock:tt,ensureGhAuthenticated:_t,fetchPrView:Jn,discoverPrView:Xp,getGitHubRepositoryLocator:fi,writePrStatusArtifact:Sn};async function Al(e,t,n,r=es){let s=await r.readTask(e,t),i=await iR(s,n,r);return Qt(s,i,"showTaskPr","shown",[])}async function El(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await _l(s,n,null,r);await xl(i,r);let o=await Ti(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Qt(s,i,"discoverTaskPr","not_found",[]);Fl(o,i);let a=bi(s,i,o.number),l=await Ll(e,s,i,o,r);return Qt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function Ol(e,t,n,r,s=es){let i=Dl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await _l(o,r,i.repository,s);uf(i.repository,a),await xl(a,s);let l=await Ti(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));oR(l,i),Fl(l,a);let c=bi(o,a,l.number),d=Ml(o,a),u=d&&!Gn(d,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&d.status!=="closed"&&d.status!=="merged"?[`Pull request #${l.number} becomes active; #${d.number} remains in task history.`]:[],p=await Ll(e,o,a,l,s);return Qt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function sR(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);let o=e.prs.find(a=>a.number===n.number)??H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ki(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw nr(e,t);let a=df(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&Tt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ki(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&Tt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&Tt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function $l(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await _l(s,n,null,r),o=Ml(s,i);if(!o?.number)return Qt(s,i,"refreshTaskPr","not_found",[]);await xl(i,r);let a=await Ti(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));Fl(a,i);let l=await Ll(e,s,i,a,r);return Qt(l,i,"refreshTaskPr","synced",[])})}async function Nl(e,t,n,r,s=es){let i=Dl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await sR(o,r,i,s);if(uf(i.repository,a),!bi(o,a,i.number))return Qt(o,a,"unlinkTaskPr","unchanged",[]);let c=aR(o,a,i.number),d=await ff(e,c,s);return Qt(d,a,"unlinkTaskPr","unlinked",[])})}function Dl(e){let t=e.trim(),n=Xt(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 _l(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);return Cl(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw nr(e,t);return Cl(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 Cl(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&Tt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function iR(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);let s=H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ki(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw nr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ki(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ki(e,t,n,r){let s=df(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function df(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Xt(e.url):null}async function Cl(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 xl(e,t){await Ti("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function Ti(e,t){try{return await t()}catch(n){throw n instanceof g?n:new g("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function uf(e,t){if(e&&!Tt(e,t.repository))throw pf(e,t)}function oR(e,t){let n=Xt(e.url);if(!n||n.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!Tt(t.repository,n))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function Fl(e,t){let n=Xt(e.url);if(!n||!Tt(n,t.repository))throw pf(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 pf(e,t){return new g("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function nr(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function Tt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Ll(e,t,n,r,s){let i=bi(t,n,r.number),o=Dt(r,i,n.repository),a=Nt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:gf(o)}:l)}),ff(e,a,s)}function aR(e,t,n){let r=e.prs.filter(i=>!hf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=mf(r.filter(o=>o.owner&&o.repo&&Tt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?gf(i):cR(t.repository)}:o)}}return s}async function ff(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?hi(t):Rn(t.prs),s={...t,status:r};return Qn(e,s,n)}function bi(e,t,n){return jl(e,t).find(r=>hf(r,t,n))??null}function Ml(e,t){if(!t.projectTarget)return H(e);let n=jl(e,t);return mf(n)}function mf(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function jl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&Tt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?lR(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function hf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||Tt({owner:e.owner,name:e.repo},t.repository)}function Qt(e,t,n,r,s){let i=jl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Ml(e,t),warnings:s}}function gf(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 lR(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 cR(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var S={listTasks:Ur,getTask:F,provisionTask:zn,provisionProjectTask:Vr,createTask:il,showTask:ul,showTaskDiff:pl,prepareTaskLogs:fl,streamTaskLogs:ml,runChecks:hl,commitTask:gl,closeTask:yl,cleanupTask:wl,addTaskLink:kl,addTaskRepoTarget:bl,listTaskLinks:Tl,sortTasksForDisplay:Za,resolveSelectedTaskId:el,allocateTaskId:Qa,allocateTaskIdForRepo:Yn,allocateProjectTaskId:qr,createDefaultTaskPtyTabs:Kr,assertTaskWorktreeExists:we,resolveTaskLogPath:Hn,buildTaskInspection:Mr,resolveArtifactPath:Pn,openTask:Rl,markRunnerFailed:sl,recordStartupFailure:Gr,markTaskStarted:Hr,renameTask:Il,resolveContext:Sl,prs:{refresh:Qr,refreshChecks:cl,discoverOrRefresh:yi,discoverOrRefreshAll:tr,discoverOrRefreshMany:dl,show:Al,discover:El,link:Ol,refreshAssociation:$l,unlink:Nl,merge:vl,getPrimaryPr:H,isPrTerminal:Jt,isMergeReady:li,deriveTaskStatus:Rn,upsertPr:Nt,normalizePr:Dt,summarizeRequiredChecks:Ya,writePrStatusArtifact:Sn}};var yf={idle:0,ready:1,working:2,error:3};function Ye(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function bt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ye(t,n,r,i)}function rr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=bt(e,s.id,t,n);yf[i]>yf[r]&&(r=i)}return r}function Ri(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ye(s.id,t,n)==="working"))}function Rt(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=bt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:rr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function ql(e,t,n){let r=n.now??Date.now;if(n.tabId&&!e.ptyTabs.some(l=>l.kind==="agent"&&l.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:n.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=r()+n.timeoutMs;try{for(;;){let l=r(),c=Rt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw wf(e.id);let u=a-r();if(u<=0)throw dR(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(T),f(wf(e.id))},T=setTimeout(m,u);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var dR=(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}}),wf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as mR}from"node:net";import{createHash as uR}from"node:crypto";import{tmpdir as pR}from"node:os";import kf from"node:path";var Pt=10,fR=new Set([6,7,8,9,Pt]);function Zt(e){return e!==void 0&&fR.has(e)}function Fe(e){let t=uR("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:kf.join(pR(),`craig-${t}.sock`),pidPath:kf.join(e.runtimeDir,"pty-daemon.pid")}}async function Tf(e){let t=null;try{let n=await hR(Fe(e.paths).socketPath);return t=new Bl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Bl=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Pt)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
|
|
72
72
|
`);let s=await r;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
73
73
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
74
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="activity"?(this.recordSnapshot(n.snapshot),this.options.onActivity?.(n.snapshot)):n.type==="activityRemoved"&&(this.removeSnapshot(n.tabId),this.options.onActivityRemoved?.(n.tabId))}replaceSnapshots(t,n){let r=new Map;for(let[s,i]of this.revisionByTabId)i>n&&r.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of r)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let n of this.snapshots.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(r),this.options.onActivity?.(r)}this.options.onDaemonClose?.()}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}};function hR(e){return new Promise((t,n)=>{let r=mR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Wl={openObserver:Rf,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function gR(e,t,n=Wl){let r=await bf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...bt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function yR(e,t,n=Wl){let r=await bf(e,t.taskId,n),s=await n.openObserver(e);try{let i=bt(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 wR(e,t,n,r=Wl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await jl(s,i,{...n,now:r.now})}finally{i.close()}}async function bf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Rf(e){return Bl.open(e)}async function kR(e){return Rf(e)}var Bl=class e{listeners=new Set;snapshots=new Map;client=null;reconnectTimer=null;reconnectDelayMs=250;closed=!1;paths;constructor(t){this.paths=t}static async open(t){let n=new e(t);return await n.connect(),n}get daemonAvailable(){return this.client!==null}getSnapshots(){return[...this.snapshots.values()]}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}close(){this.closed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.client?.close(),this.client=null}async connect(){if(this.closed)return;let t=await Tf({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},_t={listAgents:gR,showAgentStatus:yR,waitForTask:wR,openObserver:kR};import{randomUUID as qR}from"node:crypto";import{mkdir as Wf,open as ec,readdir as tc,readFile as is,rm as UR,stat as BR}from"node:fs/promises";import Ci from"node:path";import{createHash as SR}from"node:crypto";import{mkdir as es,readdir as Gl,readFile as ts,writeFile as IR}from"node:fs/promises";import ze from"node:path";import{mkdir as Pf,readFile as TR,rm as Vl,stat as bR,writeFile as RR}from"node:fs/promises";import Kl from"node:path";async function sr(e,t){let n=Kl.join(e.runtimeDir,"fury-store.lock");await Pf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Pf(n);try{await RR(Kl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Vl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Sf(s,"EEXIST"))throw s;let i=await TR(Kl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await bR(n).catch(()=>null);if(typeof i?.pid=="number"&&!PR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Vl(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 Vl(n,{recursive:!0,force:!0})}}function PR(e){try{return process.kill(e,0),!0}catch(t){return Sf(t,"EPERM")}}var Sf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ke=e=>({root:ze.join(e.craigDir,"fury"),definitions:ze.join(e.craigDir,"fury","definitions"),plans:ze.join(e.craigDir,"fury","plans"),approvals:ze.join(e.craigDir,"fury","approvals"),runs:ze.join(e.craigDir,"fury","runs"),reviews:ze.join(e.craigDir,"fury","reviews")});function Hl(e){return SR("sha256").update(JSON.stringify(e)).digest("hex")}async function vf(e,t,n){let r=ke(e);await es(r.definitions,{recursive:!0});let s=ze.join(r.definitions,`${t}.yaml`);await IR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!en(i,"EEXIST"))throw i})}async function Cf(e,t){return sr(e,async()=>{let n=await Af(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await es(ke(e).plans,{recursive:!0}),await U(Lf(e,i.id),i),i})}async function Pi(e,t){Ii(t,"plan");try{return vR(JSON.parse(await ts(Lf(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Af(e){let t=ke(e).plans,n=await Gl(t).catch(s=>en(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>Pi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ef(e){let t=await Af(e),n=await Promise.all(t.map(s=>Jl(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 Of(e,t){return sr(e,async()=>{let n=await Jl(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await es(ke(e).approvals,{recursive:!0}),await U(Mf(e,t.planId),t),{approval:t,created:!0}})}async function $f(e,t){Ii(t,"plan");let n=await Jl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Nf(e,t){return sr(e,async()=>{let r=(await Df(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await es(ke(e).runs,{recursive:!0}),await U(Yl(e,t.id),t),{run:t,created:!0}})}async function oe(e,t){Ii(t,"run");try{return xf(JSON.parse(await ts(Yl(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Si(e){return Df(e)}async function Df(e){let t=ke(e).runs,n=await Gl(t).catch(s=>en(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return xf(JSON.parse(await ts(ze.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function ve(e,t,n){return sr(e,async()=>{let r=await oe(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await U(Yl(e,t),s),s})}async function _f(e,t){await es(ke(e).reviews,{recursive:!0}),await U(zl(e,t.id),t)}async function ns(e,t,n){return sr(e,async()=>{let r=await Zt(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await U(zl(e,t),s),s})}async function Zt(e,t){Ii(t,"review");try{return CR(JSON.parse(await ts(zl(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function rs(e){let t=ke(e).reviews,n=await Gl(t).catch(r=>en(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>Zt(e,r.slice(0,-5))))}function xf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ne(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))||!Ne(e.inputs)||!Ff(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!AR(e.stepRuns,e.order)||!ss(e.actor)||e.cleanupPending!==void 0&&typeof e.cleanupPending!="boolean"||e.cleanupError!==void 0&&e.cleanupError!==null&&typeof e.cleanupError!="string"||!Je(e.createdAt)||!Je(e.updatedAt)||!Je(e.stateChangedAt)||!Je(e.deadlineAt)||e.completedAt!==null&&!Je(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function vR(e,t){if(!Ne(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||!Ne(e.inputs)||!Ff(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||!Array.isArray(e.waves)||e.waves.some(r=>!Array.isArray(r)||r.some(s=>typeof s!="string"))||!Array.isArray(e.steps)||e.steps.length!==e.order.length||!ss(e.createdBy)||!Je(e.createdAt))throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} is invalid.`,{});let n={...e};if(delete n.id,delete n.planHash,delete n.createdBy,delete n.createdAt,Hl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function CR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ne(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&&(!Ne(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Je(e.requestedAt)||!Je(e.deadlineAt)||!Je(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!If(r))||e.lastDecision!==null&&!If(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function AR(e,t){return Ne(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&ER(e[n],n))}function ER(e,t){return!Ne(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")||!Ne(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Je(n))&&(e.completedBy===null||ss(e.completedBy))}function If(e){return Ne(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&ss(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Je(e.occurredAt)}function Ff(e){return Ne(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function ss(e){return Ne(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 Yl=(e,t)=>ze.join(ke(e).runs,`${t}.json`),Lf=(e,t)=>ze.join(ke(e).plans,`${t}.json`),Mf=(e,t)=>ze.join(ke(e).approvals,`${t}.json`),zl=(e,t)=>ze.join(ke(e).reviews,`${t}.json`),Ii=(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 Jl(e,t){try{let n=JSON.parse(await ts(Mf(e,t),"utf8"));if(!Ne(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!ss(n.approvedBy)||!Ne(n.approvedBy)||n.approvedBy.type!=="human"||!Je(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(en(n,"ENOENT"))return null;throw n}}var Ne=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Je=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),en=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as jf,readFile as OR,rm as vi,stat as $R,writeFile as NR}from"node:fs/promises";import Xl from"node:path";var DR=20,_R=3e4,xR=5e3;async function qf(e,t){let n=Xl.join(e.runtimeDir,"event-journal.lock");await jf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await jf(n);try{await NR(Xl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await vi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!MR(s))throw s;if(await FR(n))continue;if(Date.now()-r>=_R)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await jR(DR)}try{return await t()}finally{await vi(n,{recursive:!0,force:!0})}}async function FR(e){let t=await OR(Xl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return LR(t.pid)?!1:(await vi(e,{recursive:!0,force:!0}),!0);let n=await $R(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<xR?!1:(await vi(e,{recursive:!0,force:!0}),!0)}function LR(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 MR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",jR=e=>new Promise(t=>setTimeout(t,e));var WR=256*1024,VR=16,KR=64*1024;async function Le(e,t,n={}){let r=Zl(n.maxSegmentBytes??WR,"Event journal segment size"),s=Zl(n.maxSegments??VR,"Event journal retention"),i=Zl(n.maxRecordBytes??KR,"Event record size");return qf(e,async()=>{await Wf(e.eventsDir,{recursive:!0}),await XR(e);let o=await nc(e),a=t.id??qR(),l=o.events.find(y=>y.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,u={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,furyRunId:t.furyRunId??null,furyStepId:t.furyStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:eP(t.data)},d=`${JSON.stringify(u)}
|
|
75
|
-
`;if(Buffer.byteLength(
|
|
74
|
+
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="activity"?(this.recordSnapshot(n.snapshot),this.options.onActivity?.(n.snapshot)):n.type==="activityRemoved"&&(this.removeSnapshot(n.tabId),this.options.onActivityRemoved?.(n.tabId))}replaceSnapshots(t,n){let r=new Map;for(let[s,i]of this.revisionByTabId)i>n&&r.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of r)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let n of this.snapshots.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(r),this.options.onActivity?.(r)}this.options.onDaemonClose?.()}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}};function hR(e){return new Promise((t,n)=>{let r=mR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Vl={openObserver:Rf,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function gR(e,t,n=Vl){let r=await bf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...Rt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function yR(e,t,n=Vl){let r=await bf(e,t.taskId,n),s=await n.openObserver(e);try{let i=Rt(r,s.getSnapshots(),n.now()),o=t.tabId?i.agents.filter(l=>l.tabId===t.tabId):i.agents;if(t.tabId&&o.length===0)throw new g("TASK_CONTEXT_NOT_FOUND",`Agent tab ${t.tabId} was not found${t.taskId?` in task ${t.taskId}`:""}.`,{details:{taskId:t.taskId??null,tabId:t.tabId}});let a=new Set(o.map(l=>l.taskId));return{kind:"showAgentStatus",agents:o,tasks:t.tabId?i.tasks.filter(l=>a.has(l.taskId)):i.tasks,daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function wR(e,t,n,r=Vl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await ql(s,i,{...n,now:r.now})}finally{i.close()}}async function bf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Rf(e){return Wl.open(e)}async function kR(e){return Rf(e)}var Wl=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 Tf({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},xt={listAgents:gR,showAgentStatus:yR,waitForTask:wR,openObserver:kR};import{randomUUID as qR}from"node:crypto";import{mkdir as Wf,open as tc,readdir as nc,readFile as is,rm as UR,stat as BR}from"node:fs/promises";import Ci from"node:path";import{createHash as SR}from"node:crypto";import{mkdir as ts,readdir as Hl,readFile as ns,writeFile as IR}from"node:fs/promises";import ze from"node:path";import{mkdir as Pf,readFile as TR,rm as Kl,stat as bR,writeFile as RR}from"node:fs/promises";import Gl from"node:path";async function sr(e,t){let n=Gl.join(e.runtimeDir,"fury-store.lock");await Pf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Pf(n);try{await RR(Gl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Kl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Sf(s,"EEXIST"))throw s;let i=await TR(Gl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await bR(n).catch(()=>null);if(typeof i?.pid=="number"&&!PR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Kl(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 Kl(n,{recursive:!0,force:!0})}}function PR(e){try{return process.kill(e,0),!0}catch(t){return Sf(t,"EPERM")}}var Sf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ke=e=>({root:ze.join(e.craigDir,"fury"),definitions:ze.join(e.craigDir,"fury","definitions"),plans:ze.join(e.craigDir,"fury","plans"),approvals:ze.join(e.craigDir,"fury","approvals"),runs:ze.join(e.craigDir,"fury","runs"),reviews:ze.join(e.craigDir,"fury","reviews")});function Yl(e){return SR("sha256").update(JSON.stringify(e)).digest("hex")}async function vf(e,t,n){let r=ke(e);await ts(r.definitions,{recursive:!0});let s=ze.join(r.definitions,`${t}.yaml`);await IR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!en(i,"EEXIST"))throw i})}async function Cf(e,t){return sr(e,async()=>{let n=await Af(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await ts(ke(e).plans,{recursive:!0}),await U(Lf(e,i.id),i),i})}async function Pi(e,t){Ii(t,"plan");try{return vR(JSON.parse(await ns(Lf(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Af(e){let t=ke(e).plans,n=await Hl(t).catch(s=>en(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>Pi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ef(e){let t=await Af(e),n=await Promise.all(t.map(s=>Xl(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 Of(e,t){return sr(e,async()=>{let n=await Xl(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await ts(ke(e).approvals,{recursive:!0}),await U(Mf(e,t.planId),t),{approval:t,created:!0}})}async function $f(e,t){Ii(t,"plan");let n=await Xl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Nf(e,t){return sr(e,async()=>{let r=(await Df(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await ts(ke(e).runs,{recursive:!0}),await U(zl(e,t.id),t),{run:t,created:!0}})}async function te(e,t){Ii(t,"run");try{return xf(JSON.parse(await ns(zl(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Si(e){return Df(e)}async function Df(e){let t=ke(e).runs,n=await Hl(t).catch(s=>en(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return xf(JSON.parse(await ns(ze.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function ve(e,t,n){return sr(e,async()=>{let r=await te(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await U(zl(e,t),s),s})}async function _f(e,t){await ts(ke(e).reviews,{recursive:!0}),await U(Jl(e,t.id),t)}async function ir(e,t,n){return sr(e,async()=>{let r=await rt(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await U(Jl(e,t),s),s})}async function rt(e,t){Ii(t,"review");try{return CR(JSON.parse(await ns(Jl(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function rs(e){let t=ke(e).reviews,n=await Hl(t).catch(r=>en(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rt(e,r.slice(0,-5))))}function xf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ne(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))||!Ne(e.inputs)||!Ff(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!AR(e.stepRuns,e.order)||!ss(e.actor)||e.cleanupPending!==void 0&&typeof e.cleanupPending!="boolean"||e.cleanupError!==void 0&&e.cleanupError!==null&&typeof e.cleanupError!="string"||!Je(e.createdAt)||!Je(e.updatedAt)||!Je(e.stateChangedAt)||!Je(e.deadlineAt)||e.completedAt!==null&&!Je(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function vR(e,t){if(!Ne(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||!Ne(e.inputs)||!Ff(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||!Array.isArray(e.waves)||e.waves.some(r=>!Array.isArray(r)||r.some(s=>typeof s!="string"))||!Array.isArray(e.steps)||e.steps.length!==e.order.length||!ss(e.createdBy)||!Je(e.createdAt))throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} is invalid.`,{});let n={...e};if(delete n.id,delete n.planHash,delete n.createdBy,delete n.createdAt,Yl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function CR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ne(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&&(!Ne(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Je(e.requestedAt)||!Je(e.deadlineAt)||!Je(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!If(r))||e.lastDecision!==null&&!If(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function AR(e,t){return Ne(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&ER(e[n],n))}function ER(e,t){return!Ne(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")||!Ne(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Je(n))&&(e.completedBy===null||ss(e.completedBy))}function If(e){return Ne(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&ss(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Je(e.occurredAt)}function Ff(e){return Ne(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function ss(e){return Ne(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 zl=(e,t)=>ze.join(ke(e).runs,`${t}.json`),Lf=(e,t)=>ze.join(ke(e).plans,`${t}.json`),Mf=(e,t)=>ze.join(ke(e).approvals,`${t}.json`),Jl=(e,t)=>ze.join(ke(e).reviews,`${t}.json`),Ii=(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 Xl(e,t){try{let n=JSON.parse(await ns(Mf(e,t),"utf8"));if(!Ne(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!ss(n.approvedBy)||!Ne(n.approvedBy)||n.approvedBy.type!=="human"||!Je(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(en(n,"ENOENT"))return null;throw n}}var Ne=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Je=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),en=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as jf,readFile as OR,rm as vi,stat as $R,writeFile as NR}from"node:fs/promises";import Ql from"node:path";var DR=20,_R=3e4,xR=5e3;async function qf(e,t){let n=Ql.join(e.runtimeDir,"event-journal.lock");await jf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await jf(n);try{await NR(Ql.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await vi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!MR(s))throw s;if(await FR(n))continue;if(Date.now()-r>=_R)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await jR(DR)}try{return await t()}finally{await vi(n,{recursive:!0,force:!0})}}async function FR(e){let t=await OR(Ql.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return LR(t.pid)?!1:(await vi(e,{recursive:!0,force:!0}),!0);let n=await $R(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<xR?!1:(await vi(e,{recursive:!0,force:!0}),!0)}function LR(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 MR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",jR=e=>new Promise(t=>setTimeout(t,e));var WR=256*1024,VR=16,KR=64*1024;async function Le(e,t,n={}){let r=ec(n.maxSegmentBytes??WR,"Event journal segment size"),s=ec(n.maxSegments??VR,"Event journal retention"),i=ec(n.maxRecordBytes??KR,"Event record size");return qf(e,async()=>{await Wf(e.eventsDir,{recursive:!0}),await XR(e);let o=await rc(e),a=t.id??qR(),l=o.events.find(y=>y.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,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:eP(t.data)},u=`${JSON.stringify(d)}
|
|
75
|
+
`;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let h=(await Ai(e)).at(-1),f=!h||await GR(h.path,u,r);if(f&&(h={name:Bf(c),path:Ci.join(e.eventsDir,Bf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await tc(h.path,"a");try{await m.writeFile(u,"utf8"),await m.sync()}finally{await m.close()}return f&&await Kf(e.eventsDir),await HR(e,s),d})}async function In(e,t={}){let n=await rc(e),r=QR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?ZR(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 Vf(e){return(await rc(e)).events}async function rc(e){await Wf(e.eventsDir,{recursive:!0});let t=await Ai(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await is(i.path,"utf8"),a=s===t.length-1,l=o.split(`
|
|
76
76
|
`);if(o.endsWith(`
|
|
77
|
-
`))l.pop();else{if(!a)throw tn(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let
|
|
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 XR(e){let t=(await Ai(e)).at(-1);if(!t)return;let n=await is(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await ec(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function QR(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 Ql(t);return Uf(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}}):Ql(t);return Uf(t,s.sequence,n),s.sequence}function Uf(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 ZR(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 eP(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 tP(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw tn(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!ir(i.workspaceId)||!ir(i.taskId)||!ir(i.agentTabId)||!ir(i.commandId)||!ir(i.furyRunId)||!ir(i.furyStepId)||!nP(i.actor)||!("data"in i))throw tn(t,`record at line ${n} has an invalid schema`);return i}function nP(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var ir=e=>e===null||typeof e=="string",Bf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,tn=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Ql=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),rc=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Zl(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 Kf(e){let t=await ec(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Yf,readdir as fP,readFile as zf}from"node:fs/promises";import Jf from"node:path";import{mkdir as Gf,readFile as rP,rm as Ei,stat as sP,writeFile as iP}from"node:fs/promises";import sc from"node:path";var oP=20,aP=3e4,lP=5e3;async function ic(e,t){let n=sc.join(e.runtimeDir,"command-store.lock");await Gf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Gf(n);try{await iP(sc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ei(n,{recursive:!0,force:!0}),s}break}catch(s){if(!uP(s))throw s;if(await cP(n))continue;if(Date.now()-r>=aP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await pP(oP)}try{return await t()}finally{await Ei(n,{recursive:!0,force:!0})}}async function cP(e){let t=await rP(sc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return dP(t.pid)?!1:(await Ei(e,{recursive:!0,force:!0}),!0);let n=await sP(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<lP?!1:(await Ei(e,{recursive:!0,force:!0}),!0)}function dP(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 uP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",pP=e=>new Promise(t=>setTimeout(t,e));async function Ni(e,t){oc(t);try{let n=JSON.parse(await zf(os(e,t),"utf8"));return Qf(n,os(e,t),t)}catch(n){throw yP(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?$i(t,os(e,t),n):n}}async function Me(e){await Yf(e.commandsDir,{recursive:!0});let t=await fP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Jf.join(e.commandsDir,r);try{n.push(Qf(JSON.parse(await zf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:$i(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Xf(e,t){return oc(t.id),ic(e,async()=>{await Yf(e.commandsDir,{recursive:!0});let n=await Me(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!mP(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await U(os(e,t.id),t),{command:t,created:!0}})}async function as(e,t,n){return oc(t),ic(e,async()=>{let r=await Ni(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await U(os(e,t),s),s})}function mP(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 Qf(e,t,n){if(!Oi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw $i("unknown",t);let r=e.id,s=["queued","delivering","delivered","failed","cancelled"];if(r!==n||e.idempotencyKey!==null&&(typeof e.idempotencyKey!="string"||e.idempotencyKey.length>256)||typeof e.taskId!="string"||e.taskId.length===0||typeof e.agentTabId!="string"||e.agentTabId.length===0||!Oi(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!gP(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!or(e.expiresAt)||!or(e.createdAt)||!or(e.updatedAt)||e.deliveryStartedAt!==null&&!or(e.deliveryStartedAt)||e.deliveredAt!==null&&!or(e.deliveredAt)||e.cancelledAt!==null&&!or(e.cancelledAt)||e.cancelledBy!==null&&!Hf(e.cancelledBy)||!Hf(e.actor)||!hP(e.lastError)||e.state==="delivered"!=(e.deliveredAt!==null)||e.state==="failed"!=(e.lastError!==null)||Number(e.attempts)>0!=(e.deliveryStartedAt!==null)||e.state==="cancelled"!=(e.cancelledAt!==null&&e.cancelledBy!==null))throw $i(r,t);return e}function Hf(e){return!Oi(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 hP(e){return e===null||Oi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var os=(e,t)=>Jf.join(e.commandsDir,`${t}.json`),oc=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},or=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),gP=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}),Oi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),yP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",$i=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Zf(e,t=new Date){return Di(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function em(e,t=new Date){return e.state==="delivered"?e:(Di(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function tm(e,t,n=new Date){return e.state==="failed"?e:(Di(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function nm(e,t,n=new Date){return e.state==="cancelled"?e:(Di(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Di(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 wP}from"node:crypto";var ac=32*1024,rm=1440*60*1e3,lc=256,kP=["delivered","failed","cancelled"],cc={type:"system",component:"orchestration-supervisor"};async function TP(e,t){if(AP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>rm)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:rm}});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)>lc)throw new g("CLI_USAGE",`Idempotency key exceeds ${lc} characters.`,{details:{maxIdempotencyKeyLength:lc}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${wP()}`,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 Xf(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw sm(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function bP(e,t){return{kind:"showPromptCommand",command:await Ni(e,t)}}async function RP(e,t){let n=await Me(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function PP(e,t,n){let r=!1,s=await as(e,t,i=>{if(i.state==="cancelled")return i;let o=nm(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw sm(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function SP(e,t){let n=await as(e,t,r=>Zf(r));return await vn(e,n,"command.delivering",cc),n}async function IP(e,t){let n=await as(e,t,r=>em(r));return await vn(e,n,"command.delivered",cc),n}async function vP(e,t,n){let r=await as(e,t,s=>tm(s,n));return await vn(e,r,"command.failed",cc),r}async function CP(e,t,n){let r=[...n.states??kP],s=Date.now()+n.timeoutMs;for(;;){let i=await Ni(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 EP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function AP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>ac)throw new g("CLI_USAGE",`Prompt exceeds the ${ac}-byte limit.`,{details:{maxPromptBytes:ac,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new g("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await Le(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function EP(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 sm=(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}),pe={create:TP,show:bP,list:RP,cancel:PP,wait:CP,beginDelivery:SP,completeDelivery:IP,fail:vP};import{randomUUID as om,timingSafeEqual as OP}from"node:crypto";import{mkdir as $P,readFile as NP,readdir as DP}from"node:fs/promises";import am from"node:path";var _P=10080*60*1e3,xP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},FP=["task.create-child","task.children","task.cancel-tree"],LP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function rt(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await $P(fc(e),{recursive:!0,mode:448}),await G(e,t.id,async o=>{let a=o.ptyTabs.find(d=>d.id===s.id&&d.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${om()}`,c=await _i(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new g("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await MP(e,l,o.id,a.id,n)).token,a.capabilityId?o:{...o,ptyTabs:o.ptyTabs.map(d=>d.id===a.id?{...d,capabilityId:l}:d)}}),!i)throw new g("INTERNAL_ERROR",`Failed to issue a capability for ${s.id}.`,{});return{CRAIG_AGENT_CAPABILITY:i}}async function MP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${om()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...FP],targetPolicy:"children-only",limits:{...xP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+_P).toISOString(),revokedAt:null,revokedBy:null};return await U(mc(e,o.id),o,{mode:384}),o}async function Xe(e,t,n,r){let s=await qP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!LP.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await jP(e,s.taskId,r)&&Cn(s.id,`target task ${r} is outside the capability task subtree`),{capability:s,actor:{type:"agent",taskId:s.taskId,agentTabId:s.agentTabId,capabilityId:s.id}}}async function jP(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 lm(e,t,n){let r=await _i(e,t);r&&(r.revokedAt||await U(mc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function pc(e,t,n){let r=await DP(fc(e)).catch(i=>cm(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await _i(e,o[1]);!a||!t.has(a.taskId)||(await lm(e,a.id,n),s.push(a.id))}return s}async function qP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Cn("<redacted>","token is invalid");let s=await _i(e,r);if(!s)throw new g("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!OP(i,o))&&Cn(r,"token is invalid"),s}async function _i(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await NP(mc(e,t),"utf8"));if(!UP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(cm(n))return null;throw n}}function UP(e,t){if(!uc(e)||e.schemaVersion!==1||e.id!==t)return!1;let n=e.limits;return typeof e.token=="string"&&e.token.startsWith(`${t}.`)&&e.token.length>t.length+1&&typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&Array.isArray(e.allowedCommandFamilies)&&e.allowedCommandFamilies.length>0&&e.allowedCommandFamilies.every(r=>typeof r=="string"&&BP(r))&&e.targetPolicy==="children-only"&&uc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&dc(e.createdAt)&&dc(e.expiresAt)&&im(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||dc(e.revokedAt)&&im(e.revokedBy))}function im(e){return uc(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}function Cn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var fc=e=>am.join(e.orchestrationDir,"capabilities"),mc=(e,t)=>am.join(fc(e),`${t}.json`),BP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),uc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),dc=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),cm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as dm,readFile as WP,rm as hc,stat as VP,writeFile as KP}from"node:fs/promises";import gc from"node:path";var GP=20,HP=3e4,YP=5e3;async function yc(e,t){let n=gc.join(e.runtimeDir,"delegation.lock");await dm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await dm(n);try{await KP(gc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await hc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!XP(s))throw s;if(await zP(n))continue;if(Date.now()-r>=HP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,GP))}try{return await t()}finally{await hc(n,{recursive:!0,force:!0})}}async function zP(e){let t=await WP(gc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&JP(t.pid))return!1;let n=await VP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<YP?!1:(await hc(e,{recursive:!0,force:!0}),!0)}function JP(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 XP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var QP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function wc(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await rt(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function kc(e,t,n={}){return yc(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await Xe(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??QP,a=ZP(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&&xi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&xi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let d=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=d.find(T=>T.delegationIdempotencyKey===p);if(y){if(!eS(y,a)||y.prompt.value!==l||t.runner&&y.runner!==t.runner)throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${p}" is already used by child ${y.id}.`,{details:{idempotencyKey:p,taskId:y.id}});return um(y,!0)}}d.length>=o.maxChildren&&xi("children",o.maxChildren),d.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&xi("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await rt(e,y,i)})}),m=await S.getTask(e,f.taskId);try{await Le(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return um(m,!1)})}async function Tc(e,t,n){n&&await Xe(e,n,"task.children",t),await S.getTask(e,t);let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function bc(e,t,n){return yc(e,async()=>{let s=(n?await Xe(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,u=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))u(y.id)}};u(t);let d=[],p=[],h=[];try{await pc(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){d.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,f,{preserveWorktree:!0});let y=await S.closeTask(e,f.id);d.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await Le(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:d,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:d}})}function um(e,t){let n=e.type==="project"?"workspace":"repo",r=e.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new g("TASK_RECORD_INVALID",`Child task ${e.id} has no agent tab.`,{});return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,targetType:n,targetId:n==="workspace"?e.workspaceId:e.repoId,repoId:e.repoId,workspaceId:e.workspaceId,agentTabId:r.id,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function ZP(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 eS(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function xi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Fi=Symbol.for("yaml.alias"),Li=Symbol.for("yaml.document"),st=Symbol.for("yaml.map"),Rc=Symbol.for("yaml.pair"),je=Symbol.for("yaml.scalar"),xt=Symbol.for("yaml.seq"),Ce=Symbol.for("yaml.node.type"),qe=e=>!!e&&typeof e=="object"&&e[Ce]===Fi,Pt=e=>!!e&&typeof e=="object"&&e[Ce]===Li,it=e=>!!e&&typeof e=="object"&&e[Ce]===st,j=e=>!!e&&typeof e=="object"&&e[Ce]===Rc,x=e=>!!e&&typeof e=="object"&&e[Ce]===je,ot=e=>!!e&&typeof e=="object"&&e[Ce]===xt;function W(e){if(e&&typeof e=="object")switch(e[Ce]){case st:case xt:return!0}return!1}function q(e){if(e&&typeof e=="object")switch(e[Ce]){case Fi:case st:case je:case xt:return!0}return!1}var Mi=e=>(x(e)||W(e))&&!!e.anchor;var De=Symbol("break visit"),pm=Symbol("skip children"),St=Symbol("remove node");function Qe(e,t){let n=fm(t);Pt(e)?ar(null,e.contents,n,Object.freeze([e]))===St&&(e.contents=null):ar(null,e,n,Object.freeze([]))}Qe.BREAK=De;Qe.SKIP=pm;Qe.REMOVE=St;function ar(e,t,n,r){let s=mm(e,t,n,r);if(q(s)||j(s))return hm(e,r,s),ar(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===De)return De;o===St&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=ar("key",t.key,n,r);if(i===De)return De;i===St&&(t.key=null);let o=ar("value",t.value,n,r);if(o===De)return De;o===St&&(t.value=null)}}return s}async function ji(e,t){let n=fm(t);Pt(e)?await lr(null,e.contents,n,Object.freeze([e]))===St&&(e.contents=null):await lr(null,e,n,Object.freeze([]))}ji.BREAK=De;ji.SKIP=pm;ji.REMOVE=St;async function lr(e,t,n,r){let s=await mm(e,t,n,r);if(q(s)||j(s))return hm(e,r,s),lr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await lr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===De)return De;o===St&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=await lr("key",t.key,n,r);if(i===De)return De;i===St&&(t.key=null);let o=await lr("value",t.value,n,r);if(o===De)return De;o===St&&(t.value=null)}}return s}function fm(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 mm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(it(t))return n.Map?.(e,t,r);if(ot(t))return n.Seq?.(e,t,r);if(j(t))return n.Pair?.(e,t,r);if(x(t))return n.Scalar?.(e,t,r);if(qe(t))return n.Alias?.(e,t,r)}function hm(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(j(r))e==="key"?r.key=n:r.value=n;else if(Pt(r))r.contents=n;else{let s=qe(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var tS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},nS=e=>e.replace(/[!,[\]{}]/g,t=>tS[t]),It=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+nS(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&q(t.contents)){let i={};Qe(t.contents,(o,a)=>{q(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
|
|
79
|
-
`)}};
|
|
77
|
+
`))l.pop();else{if(!a)throw tn(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let d=l[c];if(d.length===0)throw tn(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw tn(i.name,`invalid JSON at line ${c+1}`)}let p=tP(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw tn(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw tn(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw tn(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Ai(e){return(await nc(e.eventsDir).catch(n=>{if(sc(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Ci.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function GR(e,t,n){let r=await BR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function HR(e,t){let n=await Ai(e),r=Math.max(0,n.length-t),s=await zR(e),i=await YR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await JR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await UR(a.path,{force:!0});o.length>0&&await Kf(e.eventsDir)}async function YR(e){let t=ke(e).runs,n=await nc(t).catch(s=>{if(sc(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await is(Ci.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 zR(e){let t=await nc(e.commandsDir).catch(r=>{if(sc(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await is(Ci.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 JR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await is(e,"utf8");for(let s of r.split(`
|
|
78
|
+
`))if(s)try{let i=JSON.parse(s);if(typeof i.commandId=="string"&&t.has(i.commandId)||typeof i.furyRunId=="string"&&n.has(i.furyRunId))return!0}catch{return!0}return!1}async function XR(e){let t=(await Ai(e)).at(-1);if(!t)return;let n=await is(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await tc(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function QR(e,t,n,r){if(t===void 0)return 0;if(/^\d+$/.test(t)){let i=Number(t);if(!Number.isSafeInteger(i)||r===null&&i!==0||r!==null&&i>r)throw Zl(t);return Uf(t,i,n),i}let s=e.find(i=>i.id===t);if(!s)throw n!==null&&n>1?new g("EVENT_CURSOR_EXPIRED",`Event cursor ${t} has expired.`,{details:{cursor:t,earliestAvailableSequence:n,resumeAfter:n-1}}):Zl(t);return Uf(t,s.sequence,n),s.sequence}function Uf(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 ZR(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 eP(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 tP(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw tn(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!or(i.workspaceId)||!or(i.taskId)||!or(i.agentTabId)||!or(i.commandId)||!or(i.furyRunId)||!or(i.furyStepId)||!nP(i.actor)||!("data"in i))throw tn(t,`record at line ${n} has an invalid schema`);return i}function nP(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var or=e=>e===null||typeof e=="string",Bf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,tn=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Zl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),sc=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function ec(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 Kf(e){let t=await tc(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Yf,readdir as fP,readFile as zf}from"node:fs/promises";import Jf from"node:path";import{mkdir as Gf,readFile as rP,rm as Ei,stat as sP,writeFile as iP}from"node:fs/promises";import ic from"node:path";var oP=20,aP=3e4,lP=5e3;async function oc(e,t){let n=ic.join(e.runtimeDir,"command-store.lock");await Gf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Gf(n);try{await iP(ic.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ei(n,{recursive:!0,force:!0}),s}break}catch(s){if(!uP(s))throw s;if(await cP(n))continue;if(Date.now()-r>=aP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await pP(oP)}try{return await t()}finally{await Ei(n,{recursive:!0,force:!0})}}async function cP(e){let t=await rP(ic.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return dP(t.pid)?!1:(await Ei(e,{recursive:!0,force:!0}),!0);let n=await sP(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<lP?!1:(await Ei(e,{recursive:!0,force:!0}),!0)}function dP(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 uP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",pP=e=>new Promise(t=>setTimeout(t,e));async function Ni(e,t){ac(t);try{let n=JSON.parse(await zf(os(e,t),"utf8"));return Qf(n,os(e,t),t)}catch(n){throw yP(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?$i(t,os(e,t),n):n}}async function Me(e){await Yf(e.commandsDir,{recursive:!0});let t=await fP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Jf.join(e.commandsDir,r);try{n.push(Qf(JSON.parse(await zf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:$i(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Xf(e,t){return ac(t.id),oc(e,async()=>{await Yf(e.commandsDir,{recursive:!0});let n=await Me(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!mP(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await U(os(e,t.id),t),{command:t,created:!0}})}async function as(e,t,n){return ac(t),oc(e,async()=>{let r=await Ni(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await U(os(e,t),s),s})}function mP(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 Qf(e,t,n){if(!Oi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw $i("unknown",t);let r=e.id,s=["queued","delivering","delivered","failed","cancelled"];if(r!==n||e.idempotencyKey!==null&&(typeof e.idempotencyKey!="string"||e.idempotencyKey.length>256)||typeof e.taskId!="string"||e.taskId.length===0||typeof e.agentTabId!="string"||e.agentTabId.length===0||!Oi(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!gP(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!ar(e.expiresAt)||!ar(e.createdAt)||!ar(e.updatedAt)||e.deliveryStartedAt!==null&&!ar(e.deliveryStartedAt)||e.deliveredAt!==null&&!ar(e.deliveredAt)||e.cancelledAt!==null&&!ar(e.cancelledAt)||e.cancelledBy!==null&&!Hf(e.cancelledBy)||!Hf(e.actor)||!hP(e.lastError)||e.state==="delivered"!=(e.deliveredAt!==null)||e.state==="failed"!=(e.lastError!==null)||Number(e.attempts)>0!=(e.deliveryStartedAt!==null)||e.state==="cancelled"!=(e.cancelledAt!==null&&e.cancelledBy!==null))throw $i(r,t);return e}function Hf(e){return!Oi(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 hP(e){return e===null||Oi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var os=(e,t)=>Jf.join(e.commandsDir,`${t}.json`),ac=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},ar=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),gP=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}),Oi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),yP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",$i=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Zf(e,t=new Date){return Di(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function em(e,t=new Date){return e.state==="delivered"?e:(Di(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function tm(e,t,n=new Date){return e.state==="failed"?e:(Di(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function nm(e,t,n=new Date){return e.state==="cancelled"?e:(Di(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Di(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 wP}from"node:crypto";var lc=32*1024,rm=1440*60*1e3,cc=256,kP=["delivered","failed","cancelled"],dc={type:"system",component:"orchestration-supervisor"};async function TP(e,t){if(AP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>rm)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:rm}});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)>cc)throw new g("CLI_USAGE",`Idempotency key exceeds ${cc} characters.`,{details:{maxIdempotencyKeyLength:cc}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${wP()}`,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 Xf(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw sm(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function bP(e,t){return{kind:"showPromptCommand",command:await Ni(e,t)}}async function RP(e,t){let n=await Me(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function PP(e,t,n){let r=!1,s=await as(e,t,i=>{if(i.state==="cancelled")return i;let o=nm(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw sm(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function SP(e,t){let n=await as(e,t,r=>Zf(r));return await vn(e,n,"command.delivering",dc),n}async function IP(e,t){let n=await as(e,t,r=>em(r));return await vn(e,n,"command.delivered",dc),n}async function vP(e,t,n){let r=await as(e,t,s=>tm(s,n));return await vn(e,r,"command.failed",dc),r}async function CP(e,t,n){let r=[...n.states??kP],s=Date.now()+n.timeoutMs;for(;;){let i=await Ni(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 EP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function AP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>lc)throw new g("CLI_USAGE",`Prompt exceeds the ${lc}-byte limit.`,{details:{maxPromptBytes:lc,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new g("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await Le(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function EP(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 sm=(e,t)=>new g("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),ue={create:TP,show:bP,list:RP,cancel:PP,wait:CP,beginDelivery:SP,completeDelivery:IP,fail:vP};import{randomUUID as om,timingSafeEqual as OP}from"node:crypto";import{mkdir as $P,readFile as NP,readdir as DP}from"node:fs/promises";import am from"node:path";var _P=10080*60*1e3,xP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},FP=["task.create-child","task.children","task.cancel-tree"],LP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function st(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await $P(mc(e),{recursive:!0,mode:448}),await G(e,t.id,async o=>{let a=o.ptyTabs.find(u=>u.id===s.id&&u.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${om()}`,c=await _i(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new g("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await MP(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 MP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${om()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...FP],targetPolicy:"children-only",limits:{...xP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+_P).toISOString(),revokedAt:null,revokedBy:null};return await U(hc(e,o.id),o,{mode:384}),o}async function Xe(e,t,n,r){let s=await qP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!LP.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await jP(e,s.taskId,r)&&Cn(s.id,`target task ${r} is outside the capability task subtree`),{capability:s,actor:{type:"agent",taskId:s.taskId,agentTabId:s.agentTabId,capabilityId:s.id}}}async function jP(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 lm(e,t,n){let r=await _i(e,t);r&&(r.revokedAt||await U(hc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function fc(e,t,n){let r=await DP(mc(e)).catch(i=>cm(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await _i(e,o[1]);!a||!t.has(a.taskId)||(await lm(e,a.id,n),s.push(a.id))}return s}async function qP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Cn("<redacted>","token is invalid");let s=await _i(e,r);if(!s)throw new g("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!OP(i,o))&&Cn(r,"token is invalid"),s}async function _i(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await NP(hc(e,t),"utf8"));if(!UP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(cm(n))return null;throw n}}function UP(e,t){if(!pc(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"&&BP(r))&&e.targetPolicy==="children-only"&&pc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&uc(e.createdAt)&&uc(e.expiresAt)&&im(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||uc(e.revokedAt)&&im(e.revokedBy))}function im(e){return pc(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}function Cn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var mc=e=>am.join(e.orchestrationDir,"capabilities"),hc=(e,t)=>am.join(mc(e),`${t}.json`),BP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),pc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),uc=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),cm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as dm,readFile as WP,rm as gc,stat as VP,writeFile as KP}from"node:fs/promises";import yc from"node:path";var GP=20,HP=3e4,YP=5e3;async function wc(e,t){let n=yc.join(e.runtimeDir,"delegation.lock");await dm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await dm(n);try{await KP(yc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await gc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!XP(s))throw s;if(await zP(n))continue;if(Date.now()-r>=HP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,GP))}try{return await t()}finally{await gc(n,{recursive:!0,force:!0})}}async function zP(e){let t=await WP(yc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&JP(t.pid))return!1;let n=await VP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<YP?!1:(await gc(e,{recursive:!0,force:!0}),!0)}function JP(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 XP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var QP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function kc(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await st(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function Tc(e,t,n={}){return wc(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await Xe(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??QP,a=ZP(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&&xi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&xi("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(!eS(y,a)||y.prompt.value!==l||t.runner&&y.runner!==t.runner)throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${p}" is already used by child ${y.id}.`,{details:{idempotencyKey:p,taskId:y.id}});return um(y,!0)}}u.length>=o.maxChildren&&xi("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&xi("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await st(e,y,i)})}),m=await S.getTask(e,f.taskId);try{await Le(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return um(m,!1)})}async function bc(e,t,n){n&&await Xe(e,n,"task.children",t),await S.getTask(e,t);let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function Rc(e,t,n){return wc(e,async()=>{let s=(n?await Xe(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,d=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await fc(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){u.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,f,{preserveWorktree:!0});let y=await S.closeTask(e,f.id);u.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await Le(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function um(e,t){let n=e.type==="project"?"workspace":"repo",r=e.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new g("TASK_RECORD_INVALID",`Child task ${e.id} has no agent tab.`,{});return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,targetType:n,targetId:n==="workspace"?e.workspaceId:e.repoId,repoId:e.repoId,workspaceId:e.workspaceId,agentTabId:r.id,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function ZP(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 eS(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function xi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Fi=Symbol.for("yaml.alias"),Li=Symbol.for("yaml.document"),it=Symbol.for("yaml.map"),Pc=Symbol.for("yaml.pair"),je=Symbol.for("yaml.scalar"),Ft=Symbol.for("yaml.seq"),Ce=Symbol.for("yaml.node.type"),qe=e=>!!e&&typeof e=="object"&&e[Ce]===Fi,St=e=>!!e&&typeof e=="object"&&e[Ce]===Li,ot=e=>!!e&&typeof e=="object"&&e[Ce]===it,j=e=>!!e&&typeof e=="object"&&e[Ce]===Pc,x=e=>!!e&&typeof e=="object"&&e[Ce]===je,at=e=>!!e&&typeof e=="object"&&e[Ce]===Ft;function W(e){if(e&&typeof e=="object")switch(e[Ce]){case it:case Ft:return!0}return!1}function q(e){if(e&&typeof e=="object")switch(e[Ce]){case Fi:case it:case je:case Ft:return!0}return!1}var Mi=e=>(x(e)||W(e))&&!!e.anchor;var De=Symbol("break visit"),pm=Symbol("skip children"),It=Symbol("remove node");function Qe(e,t){let n=fm(t);St(e)?lr(null,e.contents,n,Object.freeze([e]))===It&&(e.contents=null):lr(null,e,n,Object.freeze([]))}Qe.BREAK=De;Qe.SKIP=pm;Qe.REMOVE=It;function lr(e,t,n,r){let s=mm(e,t,n,r);if(q(s)||j(s))return hm(e,r,s),lr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=lr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===De)return De;o===It&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=lr("key",t.key,n,r);if(i===De)return De;i===It&&(t.key=null);let o=lr("value",t.value,n,r);if(o===De)return De;o===It&&(t.value=null)}}return s}async function ji(e,t){let n=fm(t);St(e)?await cr(null,e.contents,n,Object.freeze([e]))===It&&(e.contents=null):await cr(null,e,n,Object.freeze([]))}ji.BREAK=De;ji.SKIP=pm;ji.REMOVE=It;async function cr(e,t,n,r){let s=await mm(e,t,n,r);if(q(s)||j(s))return hm(e,r,s),cr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await cr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===De)return De;o===It&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=await cr("key",t.key,n,r);if(i===De)return De;i===It&&(t.key=null);let o=await cr("value",t.value,n,r);if(o===De)return De;o===It&&(t.value=null)}}return s}function fm(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 mm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(ot(t))return n.Map?.(e,t,r);if(at(t))return n.Seq?.(e,t,r);if(j(t))return n.Pair?.(e,t,r);if(x(t))return n.Scalar?.(e,t,r);if(qe(t))return n.Alias?.(e,t,r)}function hm(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(j(r))e==="key"?r.key=n:r.value=n;else if(St(r))r.contents=n;else{let s=qe(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var tS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},nS=e=>e.replace(/[!,[\]{}]/g,t=>tS[t]),vt=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&(this.yaml={explicit:e.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},e.defaultTags),this.atNextDocument=!1);let r=t.trim().split(/[ \t]+/),s=r.shift();switch(s){case"%TAG":{if(r.length!==2&&(n(0,"%TAG directive should contain exactly two parts"),r.length<2))return!1;let[i,o]=r;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,r.length!==1)return n(0,"%YAML directive should contain exactly one part"),!1;let[i]=r;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{let o=/^\d+\.\d+$/.test(i);return n(6,`Unsupported YAML version ${i}`,o),!1}}default:return n(0,`Unknown directive ${s}`,!0),!1}}tagName(t,n){if(t==="!")return"!";if(t[0]!=="!")return n(`Not a valid tag: ${t}`),null;if(t[1]==="<"){let o=t.slice(2,-1);return o==="!"||o==="!!"?(n(`Verbatim tags aren't resolved, so ${t} is invalid.`),null):(t[t.length-1]!==">"&&n("Verbatim tags must end with a >"),o)}let[,r,s]=t.match(/^(.*!)([^!]*)$/s);s||n(`The ${t} tag has no suffix`);let i=this.tags[r];if(i)try{return i+decodeURIComponent(s)}catch(o){return n(String(o)),null}return r==="!"?t:(n(`Could not resolve tag: ${t}`),null)}tagString(t){for(let[n,r]of Object.entries(this.tags))if(t.startsWith(r))return n+nS(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&q(t.contents)){let i={};Qe(t.contents,(o,a)=>{q(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
|
|
79
|
+
`)}};vt.defaultYaml={explicit:!1,version:"1.2"};vt.defaultTags={"!!":"tag:yaml.org,2002:"};function qi(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 Sc(e){let t=new Set;return Qe(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function Ic(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function gm(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Sc(e));let o=Ic(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(x(o.node)||W(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function nn(e,t,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s<i;++s){let o=r[s],a=nn(e,r,String(s),o);a===void 0?delete r[s]:a!==o&&(r[s]=a)}else if(r instanceof Map)for(let s of Array.from(r.keys())){let i=r.get(s),o=nn(e,r,s,i);o===void 0?r.delete(s):o!==i&&r.set(s,o)}else if(r instanceof Set)for(let s of Array.from(r)){let i=nn(e,r,s,s);i===void 0?r.delete(s):i!==s&&(r.delete(s),r.add(i))}else for(let[s,i]of Object.entries(r)){let o=nn(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function fe(e,t,n){if(Array.isArray(e))return e.map((r,s)=>fe(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Mi(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=e.toJSON(t,n);return n.onCreate&&n.onCreate(s),s}return typeof e=="bigint"&&!n?.keep?Number(e):e}var rn=class{constructor(t){Object.defineProperty(this,Ce,{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(!St(t))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:t,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=fe(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?nn(i,{"":a},"",a):a}};var Lt=class extends rn{constructor(t){super(Fi),this.source=t,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(t,n){if(n?.maxAliasCount===0)throw new ReferenceError("Alias resolution is disabled");let r;n?.aliasResolveCache?r=n.aliasResolveCache:(r=[],Qe(t,{Node:(i,o)=>{(qe(o)||Mi(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(t,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=r.get(o);if(a||(fe(o,null,n),a=r.get(o)),a?.res===void 0){let l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Ui(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(qi(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 Ui(e,t,n){if(qe(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(W(t)){let r=0;for(let s of t.items){let i=Ui(e,s,n);i>r&&(r=i)}return r}else if(j(t)){let r=Ui(e,t.key,n),s=Ui(e,t.value,n);return Math.max(r,s)}return 1}var Bi=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends rn{constructor(t){super(je),this.value=t}toJSON(t,n){return n?.keep?this.value:fe(this.value,t,n)}toString(){return String(this.value)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var rS="tag:yaml.org,2002:";function sS(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 Mt(e,t,n){if(St(e)&&(e=e.contents),q(e))return e;if(j(e)){let u=n.schema[it].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 Lt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=rS+t.slice(2));let c=sS(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new O(e);return l&&(l.node=u),u}c=e instanceof Map?o[it]:Symbol.iterator in Object(e)?o[Ft]:o[it]}i&&(i(c),delete n.onTagObj);let d=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new O(e);return t?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function ls(e,t,n){let r=n;for(let s=t.length-1;s>=0;--s){let i=t[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return Mt(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var ur=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,dr=class extends rn{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>q(r)||j(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(ur(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(W(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,ls(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(W(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&x(i)?i.value:i:W(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!j(n))return!1;let r=n.value;return r==null||t&&x(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(t){let[n,...r]=t;if(r.length===0)return this.has(n);let s=this.get(n,!0);return W(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(W(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,ls(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var ym=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Ze(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var Ct=(e,t,n)=>e.endsWith(`
|
|
80
80
|
`)?Ze(n,t):n.includes(`
|
|
81
81
|
`)?`
|
|
82
|
-
`+Ze(n,t):(e.endsWith(" ")?"":" ")+n;var
|
|
83
|
-
`)n===Wi&&(m=wm(e,m,t.length)),
|
|
82
|
+
`+Ze(n,t):(e.endsWith(" ")?"":" ")+n;var vc="flow",Wi="block",cs="quoted";function ds(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,h,f=!1,m=-1,y=-1,T=-1;n===Wi&&(m=wm(e,m,t.length),m!==-1&&(u=m+l));for(let b;b=e[m+=1];){if(n===cs&&b==="\\"){switch(y=m,e[m+1]){case"x":m+=3;break;case"u":m+=5;break;case"U":m+=9;break;default:m+=1}T=m}if(b===`
|
|
83
|
+
`)n===Wi&&(m=wm(e,m,t.length)),u=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
|
|
84
84
|
`&&h!==" "){let $=e[m+1];$&&$!==" "&&$!==`
|
|
85
|
-
`&&$!==" "&&(p=m)}if(m>=
|
|
86
|
-
${t}${e.slice(0,N)}`:(n===cs&&
|
|
85
|
+
`&&$!==" "&&(p=m)}if(m>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===cs){for(;h===" "||h===" ";)h=b,b=e[m+=1],f=!0;let $=m>T+1?m-2:y-1;if(d[$])return e;c.push($),d[$]=!0,u=$+l,p=void 0}else f=!0}h=b}if(f&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let b=0;b<c.length;++b){let $=c[b],N=c[b+1]||e.length;$===0?R=`
|
|
86
|
+
${t}${e.slice(0,N)}`:(n===cs&&d[$]&&(R+=`${e[$]}\\`),R+=`
|
|
87
87
|
${t}${e.slice($+1,N)}`)}return R}function wm(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
88
|
`);r=t,s=t+1,i=e[s]}return r}var Ki=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Gi=e=>/^(%|---|\.\.\.)/m.test(e);function iS(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 us(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Gi(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
|
|
89
|
+
`){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function us(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Gi(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:ds(o,i,cs,Ki(t,!1))}function
|
|
92
|
+
`,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:ds(o,i,cs,Ki(t,!1))}function Cc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
|
|
93
93
|
`)||/[ \t]\n|\n[ \t]/.test(e))return us(e,t);let n=t.indent||(Gi(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
|
|
94
|
-
${n}`)+"'";return t.implicitKey?r:ds(r,n,
|
|
94
|
+
${n}`)+"'";return t.implicitKey?r:ds(r,n,vc,Ki(t,!1))}function pr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=us;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=Cc:i&&!s?r=us:r=n?Cc:us}return r(e,t)}var Ac;try{Ac=new RegExp(`(^|(?<!
|
|
95
95
|
))
|
|
96
96
|
+(?!
|
|
97
|
-
|$)`,"g")}catch{
|
|
97
|
+
|$)`,"g")}catch{Ac=/\n+(?!\n|$)/g}function Vi({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return pr(n,r);let c=r.indent||(r.forceBlockIndent||Gi(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!iS(n,l,c.length);if(!n)return d?`|
|
|
98
98
|
`:`>
|
|
99
|
-
`;let
|
|
99
|
+
`;let u,p;for(p=n.length;p>0;--p){let N=n[p-1];if(N!==`
|
|
100
100
|
`&&N!==" "&&N!==" ")break}let h=n.substring(p),f=h.indexOf(`
|
|
101
|
-
`);f===-1?
|
|
102
|
-
`&&(h=h.slice(0,-1)),h=h.replace(
|
|
103
|
-
`)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let $=(m?c?"2":"1":"")+
|
|
101
|
+
`);f===-1?u="-":n===h||f!==h.length-1?(u="+",i&&i()):u="",h&&(n=n.slice(0,-h.length),h[h.length-1]===`
|
|
102
|
+
`&&(h=h.slice(0,-1)),h=h.replace(Ac,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let N=n[y];if(N===" ")m=!0;else if(N===`
|
|
103
|
+
`)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let $=(m?c?"2":"1":"")+u;if(e&&($+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let N=n.replace(/\n+/g,`
|
|
104
104
|
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,_=Ki(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let A=ds(`${R}${N}${h}`,c,Wi,_);if(!D)return`>${$}
|
|
105
105
|
${c}${A}`}return n=n.replace(/\n+/g,`$&${c}`),`|${$}
|
|
106
|
-
${c}${R}${n}${h}`}function oS(e,t,n,r){let{type:s,value:i}=e,{actualString:o,implicitKey:a,indent:l,indentStep:c,inFlow:
|
|
107
|
-
`)||
|
|
108
|
-
`)?
|
|
109
|
-
`))return Vi(e,t,n,r);if(Gi(i)){if(l==="")return t.forceBlockIndent=!0,Vi(e,t,n,r);if(a&&l===c)return
|
|
110
|
-
${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(
|
|
111
|
-
${t.indent}${a}`:a}function km({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:
|
|
112
|
-
${a}:`):(y=`${y}:`,p&&(y+=
|
|
106
|
+
${c}${R}${n}${h}`}function oS(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 pr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
|
|
108
|
+
`)?pr(i,t):Vi(e,t,n,r);if(!a&&!d&&s!==O.PLAIN&&i.includes(`
|
|
109
|
+
`))return Vi(e,t,n,r);if(Gi(i)){if(l==="")return t.forceBlockIndent=!0,Vi(e,t,n,r);if(a&&l===c)return pr(i,t)}let u=i.replace(/\n+/g,`$&
|
|
110
|
+
${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(u),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return pr(i,t)}return a?u:ds(u,l,vc,Ki(t,!1))}function An(e,t,n,r){let{implicitKey:s,inFlow:i}=t,o=typeof e.value=="string"?e:Object.assign({},e,{value:String(e.value)}),{type:a}=e;a!==O.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=O.QUOTE_DOUBLE);let l=d=>{switch(d){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?pr(o.value,t):Vi(o,t,n,r);case O.QUOTE_DOUBLE:return us(o.value,t);case O.QUOTE_SINGLE:return Cc(o.value,t);case O.PLAIN:return oS(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 Hi(e,t){let n=Object.assign({blockQuote:!0,commentString:ym,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trailingComma:!1,trueStr:"true",verifyAliasOrder:!0},e.schema.toStringOptions,t),r;switch(n.collectionStyle){case"block":r=!1;break;case"flow":r=!0;break;default:r=null}return{anchors:new Set,doc:e,flowCollectionPadding:n.flowCollectionPadding?" ":"",indent:"",indentStep:typeof n.indent=="number"?" ".repeat(n.indent):" ",inFlow:r,options:n}}function aS(e,t){if(t.tag){let s=e.filter(i=>i.tag===t.tag);if(s.length>0)return s.find(i=>i.format===t.format)??s[0]}let n,r;if(x(t)){r=t.value;let s=e.filter(i=>i.identify?.(r));if(s.length>1){let i=s.filter(o=>o.test);i.length>0&&(s=i)}n=s.find(i=>i.format===t.format)??s.find(i=>!i.format)}else r=t,n=e.find(s=>s.nodeClass&&r instanceof s.nodeClass);if(!n){let s=r?.constructor?.name??(r===null?"null":typeof r);throw new Error(`Tag not resolved for ${s} value`)}return n}function lS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||W(e))&&e.anchor;i&&qi(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 jt(e,t,n,r){if(j(e))return e.toString(t,n,r);if(qe(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=q(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=aS(t.doc.schema.tags,i));let o=lS(i,s,t);o.length>0&&(t.indentAtStart=(t.indentAtStart??0)+o.length+1);let a=typeof s.stringify=="function"?s.stringify(i,t,n,r):x(i)?An(i,t,n,r):i.toString(t,n,r);return o?x(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
|
|
111
|
+
${t.indent}${a}`:a}function km({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:d,simpleKeys:u}}=n,p=q(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!q(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!u&&(!e||p&&t==null&&!n.inFlow||W(e)||(x(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(u||!i),indent:a+l});let f=!1,m=!1,y=jt(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return f&&r&&r(),y===""?"?":h?`? ${y}`:y}else if(i&&!u||t==null&&h)return y=`? ${y}`,p&&!f?y+=Ct(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=Ct(y,n.indent,c(p))),y=`? ${y}
|
|
112
|
+
${a}:`):(y=`${y}:`,p&&(y+=Ct(y,n.indent,c(p))));let T,R,b;q(t)?(T=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(T=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&x(t)&&(n.indentAtStart=y.length+1),m=!1,!d&&l.length>=2&&!n.inFlow&&!h&&at(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=jt(t,n,()=>$=!0,()=>m=!0),D=" ";if(p||T||R){if(D=T?`
|
|
113
113
|
`:"",R){let _=c(R);D+=`
|
|
114
114
|
${Ze(_,n.indent)}`}N===""&&!n.inFlow?D===`
|
|
115
115
|
`&&b&&(D=`
|
|
@@ -118,47 +118,47 @@ ${Ze(_,n.indent)}`}N===""&&!n.inFlow?D===`
|
|
|
118
118
|
${n.indent}`}else if(!h&&W(t)){let _=N[0],A=N.indexOf(`
|
|
119
119
|
`),Y=A!==-1,_e=n.inFlow??t.flow??t.items.length===0;if(Y||!_e){let w=!1;if(Y&&(_==="&"||_==="!")){let z=N.indexOf(" ");_==="&"&&z!==-1&&z<A&&N[z+1]==="!"&&(z=N.indexOf(" ",z+1)),(z===-1||A<z)&&(w=!0)}w||(D=`
|
|
120
120
|
${n.indent}`)}}else(N===""||N[0]===`
|
|
121
|
-
`)&&(D="");return y+=D+N,n.inFlow?$&&r&&r():b&&!$?y+=
|
|
121
|
+
`)&&(D="");return y+=D+N,n.inFlow?$&&r&&r():b&&!$?y+=Ct(y,n.indent,c(b)):m&&s&&s(),y}function Ec(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Yi="<<",lt={identify:e=>e===Yi||typeof e=="symbol"&&e.description===Yi,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Yi)),{addToJSMap:$c}),stringify:()=>Yi},Tm=(e,t)=>(lt.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&<.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===lt.tag&&n.default);function $c(e,t,n){let r=bm(e,n);if(at(r))for(let s of r.items)Oc(e,t,s);else if(Array.isArray(r))for(let s of r)Oc(e,t,s);else Oc(e,t,r)}function Oc(e,t,n){let r=bm(e,n);if(!ot(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,e,Map);for(let[i,o]of s)t instanceof Map?t.has(i)||t.set(i,o):t instanceof Set?t.add(i):Object.prototype.hasOwnProperty.call(t,i)||Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return t}function bm(e,t){return e&&qe(t)?t.resolve(e.doc,e):t}function zi(e,t,{key:n,value:r}){if(q(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Tm(e,n))$c(e,t,r);else{let s=fe(n,"",e);if(t instanceof Map)t.set(s,fe(r,s,e));else if(t instanceof Set)t.add(s);else{let i=cS(n,s,e),o=fe(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function cS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(q(e)&&n?.doc){let r=Hi(n.doc,{});r.anchors=new Set;for(let i of n.anchors.keys())r.anchors.add(i.anchor);r.inFlow=!0,r.inStringifyKey=!0;let s=e.toString(r);if(!n.mapKeyWarned){let i=JSON.stringify(s);i.length>40&&(i=i.substring(0,36)+'..."'),Ec(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${i}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return s}return JSON.stringify(t)}function fr(e,t,n){let r=Mt(e,void 0,n),s=Mt(t,void 0,n);return new ie(r,s)}var ie=class e{constructor(t,n=null){Object.defineProperty(this,Ce,{value:Pc}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return q(n)&&(n=n.clone(t)),q(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return zi(n,r,this)}toString(t,n,r){return t?.doc?km(this,t,n,r):JSON.stringify(this)}};function Xi(e,t,n){return(t.inFlow??e.flow?uS:dS)(e,t,n)}function dS({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,d=Object.assign({},n,{indent:i,type:null}),u=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],y=null;if(q(m))!u&&m.spaceBefore&&p.push(""),Ji(n,p,m.commentBefore,u),m.comment&&(y=m.comment);else if(j(m)){let R=q(m.key)?m.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Ji(n,p,R.commentBefore,u))}u=!1;let T=jt(m,d,()=>y=null,()=>u=!0);y&&(T+=Ct(T,i,c(y))),u&&y&&(u=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
|
|
122
122
|
${l}${m}`:`
|
|
123
123
|
`}}return e?(h+=`
|
|
124
|
-
`+Ze(c(e),l),a&&a()):
|
|
125
|
-
`)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=
|
|
124
|
+
`+Ze(c(e),l),a&&a()):u&&o&&o(),h}function uS({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,d=0,u=[];for(let f=0;f<e.length;++f){let m=e[f],y=null;if(q(m))m.spaceBefore&&u.push(""),Ji(t,u,m.commentBefore,!1),m.comment&&(y=m.comment);else if(j(m)){let R=q(m.key)?m.key:null;R&&(R.spaceBefore&&u.push(""),Ji(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=q(m.value)?m.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=jt(m,l,()=>y=null);c||(c=u.length>d||T.includes(`
|
|
125
|
+
`)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=Ct(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:h}=n;if(u.length===0)return p+h;if(!c){let f=u.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of u)f+=m?`
|
|
126
126
|
${i}${s}${m}`:`
|
|
127
127
|
`;return`${f}
|
|
128
|
-
${s}${h}`}else return`${p}${o}${
|
|
129
|
-
`:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function
|
|
128
|
+
${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function Ji({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Ze(t(r),e);n.push(i.trimStart())}}function sn(e,t){let n=x(t)?t.value:t;for(let r of e)if(j(r)&&(r.key===t||r.key===n||x(r.key)&&r.key.value===n))return r}var ae=class extends dr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(it,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(fr(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;j(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new ie(t,t?.value):r=new ie(t.key,t.value);let s=sn(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&Bi(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=sn(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=sn(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!sn(this.items,t)}set(t,n){this.add(new ie(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)zi(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!j(s))throw new Error(`Map items must all be pairs; found ${JSON.stringify(s)} instead`);return!t.allNullValues&&this.hasAllNullValues(!1)&&(t=Object.assign({},t,{allNullValues:!0})),Xi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var ct={collection:"map",default:!0,nodeClass:ae,tag:"tag:yaml.org,2002:map",resolve(e,t){return ot(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>ae.from(e,t,n)};var Re=class extends dr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Ft,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Qi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Qi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=Qi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Qi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&Bi(n)?s.value=n:this.items[r]=n}toJSON(t,n){let r=[];n?.onCreate&&n.onCreate(r);let s=0;for(let i of this.items)r.push(fe(i,String(s++),n));return r}toString(t,n,r){return t?Xi(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(Mt(a,void 0,r))}}return i}};function Qi(e){let t=x(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var dt={collection:"seq",default:!0,nodeClass:Re,tag:"tag:yaml.org,2002:seq",resolve(e,t){return at(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>Re.from(e,t,n)};var on={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),An(e,t,n,r)}};var En={identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&En.test.test(e)?e:t.options.nullStr};var ps={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new O(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&ps.test.test(e)){let r=e[0]==="t"||e[0]==="T";if(t===r)return e}return t?n.options.trueStr:n.options.falseStr}};function Pe({format:e,minFractionDigits:t,tag:n,value:r}){if(typeof r=="bigint")return String(r);let s=typeof r=="number"?r:Number(r);if(!isFinite(s))return isNaN(s)?".nan":s<0?"-.inf":".inf";let i=Object.is(r,-0)?"-0":JSON.stringify(r);if(!e&&t&&(!n||n==="tag:yaml.org,2002:float")&&/^-?\d/.test(i)&&!i.includes("e")){let o=i.indexOf(".");o<0&&(o=i.length,i+=".");let a=t-(i.length-o-1);for(;a-- >0;)i+="0"}return i}var Zi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Pe},eo={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():Pe(e)}},to={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new O(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:Pe};var no=e=>typeof e=="bigint"||Number.isInteger(e),Nc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function Rm(e,t,n){let{value:r}=e;return no(r)&&r>=0?n+r.toString(t):Pe(e)}var ro={identify:e=>no(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>Nc(e,2,8,n),stringify:e=>Rm(e,8,"0o")},so={identify:no,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>Nc(e,0,10,n),stringify:Pe},io={identify:e=>no(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>Nc(e,2,16,n),stringify:e=>Rm(e,16,"0x")};var Pm=[ct,dt,on,En,ps,ro,so,io,Zi,eo,to];function Sm(e){return typeof e=="bigint"||Number.isInteger(e)}var oo=({value:e})=>JSON.stringify(e),pS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:oo},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:oo},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:oo},{identify:Sm,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})=>Sm(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:oo}],fS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},Im=[ct,dt].concat(pS,fS);var fs={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=O.BLOCK_LITERAL),t!==O.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),d=new Array(c);for(let u=0,p=0;u<c;++u,p+=l)d[u]=a.substr(p,l);a=d.join(t===O.BLOCK_LITERAL?`
|
|
129
|
+
`:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function Dc(e,t){if(at(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!j(r)){if(ot(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new ie(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
|
|
130
130
|
${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment}
|
|
131
|
-
${i.comment}`:r.comment}r=s}e.items[n]=j(r)?r:new
|
|
131
|
+
${i.comment}`:r.comment}r=s}e.items[n]=j(r)?r:new ie(r)}}else t("Expected a sequence for this tag");return e}function _c(e,t,n){let{replacer:r}=n,s=new Re(e);s.tag="tag:yaml.org,2002:pairs";let i=0;if(t&&Symbol.iterator in Object(t))for(let o of t){typeof r=="function"&&(o=r.call(t,String(i++),o));let a,l;if(Array.isArray(o))if(o.length===2)a=o[0],l=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let c=Object.keys(o);if(c.length===1)a=c[0],l=o[a];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else a=o;s.items.push(fr(a,l,n))}return s}var ms={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Dc,createNode:_c};var mr=class e extends Re{constructor(){super(),this.add=ae.prototype.add.bind(this),this.delete=ae.prototype.delete.bind(this),this.get=ae.prototype.get.bind(this),this.has=ae.prototype.has.bind(this),this.set=ae.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(j(s)?(i=fe(s.key,"",n),o=fe(s.value,i,n)):i=fe(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=_c(t,n,r),i=new this;return i.items=s.items,i}};mr.tag="tag:yaml.org,2002:omap";var hs={collection:"seq",identify:e=>e instanceof Map,nodeClass:mr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=Dc(e,t),r=[];for(let{key:s}of n.items)x(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new mr,n)},createNode:(e,t,n)=>mr.from(e,t,n)};function vm({value:e,source:t},n){return t&&(e?xc:Fc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var xc={identify:e=>e===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new O(!0),stringify:vm},Fc={identify:e=>e===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new O(!1),stringify:vm};var Cm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Pe},Am={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,"")),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():Pe(e)}},Em={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new O(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:Pe};var gs=e=>typeof e=="bigint"||Number.isInteger(e);function ao(e,t,n,{intAsBigInt:r}){let s=e[0];if((s==="-"||s==="+")&&(t+=1),e=e.substring(t).replace(/_/g,""),r){switch(n){case 2:e=`0b${e}`;break;case 8:e=`0o${e}`;break;case 16:e=`0x${e}`;break}let o=BigInt(e);return s==="-"?BigInt(-1)*o:o}let i=parseInt(e,n);return s==="-"?-1*i:i}function Lc(e,t,n){let{value:r}=e;if(gs(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Pe(e)}var Om={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>ao(e,2,2,n),stringify:e=>Lc(e,2,"0b")},$m={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>ao(e,1,8,n),stringify:e=>Lc(e,8,"0")},Nm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>ao(e,0,10,n),stringify:Pe},Dm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>ao(e,2,16,n),stringify:e=>Lc(e,16,"0x")};var hr=class e extends ae{constructor(t){super(t),this.tag=e.tag}add(t){let n;j(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new ie(t.key,null):n=new ie(t,null),sn(this.items,n.key)||this.items.push(n)}get(t,n){let r=sn(this.items,t);return!n&&j(r)?x(r.key)?r.key.value:r.key:r}set(t,n){if(typeof n!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof n}`);let r=sn(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new ie(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(fr(o,null,r));return i}};hr.tag="tag:yaml.org,2002:set";var ys={collection:"map",identify:e=>e instanceof Set,nodeClass:hr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>hr.from(e,t,n),resolve(e,t){if(ot(e)){if(e.hasAllNullValues(!0))return Object.assign(new hr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Mc(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 _m(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return Pe(e);let r="";t<0&&(r="-",t*=n(-1));let s=n(60),i=[t%s];return t<60?i.unshift(0):(t=(t-i[0])/s,i.unshift(t%s),t>=60&&(t=(t-i[0])/s,i.unshift(t))),r+i.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var lo={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})=>Mc(e,n),stringify:_m},co={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=>Mc(e,!1),stringify:_m},gr={identify:e=>e instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(e){let t=e.match(gr.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),d=t[8];if(d&&d!=="Z"){let u=Mc(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 jc=[ct,dt,on,En,xc,Fc,Om,$m,Nm,Dm,Cm,Am,Em,fs,lt,hs,ms,ys,lo,co,gr];var xm=new Map([["core",Pm],["failsafe",[ct,dt,on]],["json",Im],["yaml11",jc],["yaml-1.1",jc]]),Fm={binary:fs,bool:ps,float:to,floatExp:eo,floatNaN:Zi,floatTime:co,int:so,intHex:io,intOct:ro,intTime:lo,map:ct,merge:lt,null:En,omap:hs,pairs:ms,seq:dt,set:ys,timestamp:gr},Lm={"tag:yaml.org,2002:binary":fs,"tag:yaml.org,2002:merge":lt,"tag:yaml.org,2002:omap":hs,"tag:yaml.org,2002:pairs":ms,"tag:yaml.org,2002:set":ys,"tag:yaml.org,2002:timestamp":gr};function uo(e,t,n){let r=xm.get(t);if(r&&!e)return n&&!r.includes(lt)?r.concat(lt):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(xm.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${t}"; use one of ${i} or define customTags array`)}if(Array.isArray(e))for(let i of e)s=s.concat(i);else typeof e=="function"&&(s=e(s.slice()));return n&&(s=s.concat(lt)),s.reduce((i,o)=>{let a=typeof o=="string"?Fm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(Fm).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 mS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ws=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?uo(t,"compat"):t?uo(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?Lm:{},this.tags=uo(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,it,{value:ct}),Object.defineProperty(this,je,{value:on}),Object.defineProperty(this,Ft,{value:dt}),this.sortMapEntries=typeof o=="function"?o:o===!0?mS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function Mm(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=Hi(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Ze(l,""))}let o=!1,a=null;if(e.contents){if(q(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let d=i(e.contents.commentBefore);n.push(Ze(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=jt(e.contents,s,()=>a=null,l);a&&(c+=Ct(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(jt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
|
|
132
132
|
`)?(n.push("..."),n.push(Ze(l,""))):n.push(`... ${l}`)}else n.push("...");else{let l=e.comment;l&&o&&(l=l.replace(/^\n+/,"")),l&&((!o||a)&&n[n.length-1]!==""&&n.push(""),n.push(Ze(i(l),"")))}return n.join(`
|
|
133
133
|
`)+`
|
|
134
|
-
`}var an=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ce,{value:Li});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
|
|
134
|
+
`}var an=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ce,{value:Li});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 vt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Ce]:{value:Li}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=q(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){yr(this.contents)&&this.contents.add(t)}addIn(t,n){yr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=Sc(this);t.anchor=!n||r.has(n)?Ic(n||"a",r):n}return new Lt(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:d}=r??{},{onAnchor:u,setAnchors:p,sourceObjects:h}=gm(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=Mt(t,d,f);return a&&W(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new ie(s,i)}delete(t){return yr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return ur(t)?this.contents==null?!1:(this.contents=null,!0):yr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return W(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return ur(t)?!n&&x(this.contents)?this.contents.value:this.contents:W(this.contents)?this.contents.getIn(t,n):void 0}has(t){return W(this.contents)?this.contents.has(t):!1}hasIn(t){return ur(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=ls(this.schema,[t],n):yr(this.contents)&&this.contents.set(t,n)}setIn(t,n){ur(t)?this.contents=n:this.contents==null?this.contents=ls(this.schema,Array.from(t),n):yr(this.contents)&&this.contents.setIn(t,n)}setSchema(t,n={}){typeof t=="number"&&(t=String(t));let r;switch(t){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new vt({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 vt({version:t}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(t);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new ws(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=fe(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:d}of a.anchors.values())i(d,c);return typeof o=="function"?nn(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return Mm(this,t)}};function yr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ks=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},ut=class extends ks{constructor(t,n,r){super("YAMLParseError",t,n,r)}},Ts=class extends ks{constructor(t,n,r){super("YAMLWarning",t,n,r)}},qc=(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(ln(t.key)||ln(t.value))return!0}return!1;default:return!0}}function bs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&ln(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function po(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||x(i)&&x(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var jm="All mapping items must start at the same column";function qm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??ae,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let
|
|
141
|
-
`+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||ln(p))&&s(p??
|
|
142
|
-
`+b.comment:R.comment=b.comment);let $=new
|
|
143
|
-
`+D.comment:c.comment=D.comment),
|
|
144
|
-
`+_:A.comment=_,D.comment=D.comment.substring(_.length+1)}}if(!o&&!$&&!D.found){let _=N?e(n,N,D,s):t(n,D.end,$,null,D,s);c.items.push(_),
|
|
145
|
-
`+Y.comment:A.comment=Y.comment);let w=new
|
|
146
|
-
`+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function
|
|
147
|
-
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,
|
|
148
|
-
`;for(let m=
|
|
139
|
+
`}};function At(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,b=null,$=null,N=null;for(let A of e)switch(f&&(A.type!=="space"&&A.type!=="newline"&&A.type!=="comma"&&i(A.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&A.type!=="comment"&&A.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),A.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&A.source.includes(" ")&&(m=A),d=!0;break;case"comment":{d||i(A,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let Y=A.source.substring(1)||" ";u?u+=p+Y:u=Y,p="",c=!1;break}case"newline":c?u?u+=A.source:(!$||n!=="seq-item-ind")&&(l=!0):p+=A.source,c=!0,h=!0,(y||T)&&(R=A),d=!0;break;case"anchor":y&&i(A,"MULTIPLE_ANCHORS","A node can have at most one anchor"),A.source.endsWith(":")&&i(A.offset+A.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=A,N??(N=A.offset),c=!1,d=!1,f=!0;break;case"tag":{T&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),T=A,N??(N=A.offset),c=!1,d=!1,f=!0;break}case n:(y||T)&&i(A,"BAD_PROP_ORDER",`Anchors and tags must be after the ${A.source} indicator`),$&&i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.source} in ${t??"collection"}`),$=A,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(A,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=A,c=!1,d=!1;break}default:i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.type} token`),c=!1,d=!1}let D=e[e.length-1],_=D?D.offset+D.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:$,spaceBefore:l,comment:u,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:_,start:N??_}}function ln(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
|
|
140
|
+
`))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(ln(t.key)||ln(t.value))return!0}return!1;default:return!0}}function bs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&ln(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function po(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||x(i)&&x(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var jm="All mapping items must start at the same column";function qm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??ae,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:h,value:f}=d,m=At(u,{indicator:"explicit-key-ind",next:p??h?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!m.found;if(y){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",jm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
|
|
141
|
+
`+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||ln(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",jm);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,u,null,m,s);n.schema.compat&&bs(r.indent,p,s),n.atKey=!1,po(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=At(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(f?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.start<b.found.offset-1024&&s(R.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));let $=f?e(n,f,b,s):t(n,l,h,null,b,s);n.schema.compat&&bs(r.indent,f,s),l=$.range[2];let N=new ie(R,$);n.options.keepSourceTokens&&(N.srcToken=d),a.items.push(N)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),b.comment&&(R.comment?R.comment+=`
|
|
142
|
+
`+b.comment:R.comment=b.comment);let $=new ie(R);n.options.keepSourceTokens&&($.srcToken=d),a.items.push($)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function Um({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??Re,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:d,value:u}of r.items){let p=At(d,{indicator:"seq-item-ind",next:u,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||u)u?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let h=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&bs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function Et(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 Uc="Block collections are not allowed within flow collections",Bc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Bm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?ae:Re),c=new l(n.schema);c.flow=!0;let d=n.atRoot;d&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let u=r.offset+r.start.source.length;for(let y=0;y<r.items.length;++y){let T=r.items[y],{start:R,key:b,sep:$,value:N}=T,D=At(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!$&&!N){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
|
|
143
|
+
`+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&ln(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let _="";e:for(let A of R)switch(A.type){case"comma":case"space":break;case"comment":_=A.source.substring(1);break e;default:break e}if(_){let A=c.items[c.items.length-1];j(A)&&(A=A.value??A.key),A.comment?A.comment+=`
|
|
144
|
+
`+_:A.comment=_,D.comment=D.comment.substring(_.length+1)}}if(!o&&!$&&!D.found){let _=N?e(n,N,D,s):t(n,D.end,$,null,D,s);c.items.push(_),u=_.range[2],Bc(N)&&s(_.range,"BLOCK_IN_FLOW",Uc)}else{n.atKey=!0;let _=D.end,A=b?e(n,b,D,s):t(n,_,R,null,D,s);Bc(b)&&s(A.range,"BLOCK_IN_FLOW",Uc),n.atKey=!1;let Y=At($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(Y.found){if(!o&&!D.found&&n.options.strict){if($)for(let z of $){if(z===Y.found)break;if(z.type==="newline"){s(z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<Y.found.offset-1024&&s(Y.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(Y.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let _e=N?e(n,N,Y,s):Y.found?t(n,Y.end,$,null,Y,s):null;_e?Bc(N)&&s(_e.range,"BLOCK_IN_FLOW",Uc):Y.comment&&(A.comment?A.comment+=`
|
|
145
|
+
`+Y.comment:A.comment=Y.comment);let w=new ie(A,_e);if(n.options.keepSourceTokens&&(w.srcToken=T),o){let z=c;po(n,z.items,A)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),z.items.push(w)}else{let z=new ae(n.schema);z.flow=!0,z.items.push(w);let yn=(_e??A).range;z.range=[A.range[0],yn[1],yn[2]],c.items.push(z)}u=_e?_e.range[2]:Y.end}}let p=o?"}":"]",[h,...f]=r.end,m=u;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=Et(f,m,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
|
|
146
|
+
`+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function Wc(e,t,n,r,s,i){let o=n.type==="block-map"?qm(e,t,n,r,i):n.type==="block-seq"?Um(e,t,n,r,i):Bm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Wm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===ae.tagName&&a==="map"||o===Re.tagName&&a==="seq")return Wc(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),Wc(e,t,n,s,o)}let c=Wc(e,t,n,s,o,l),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=q(d)?d:new O(d);return u.range=c.range,u.tag=o,l?.format&&(u.format=l.format),u}function Vc(e,t,n){let r=t.offset,s=hS(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?O.BLOCK_FOLDED:O.BLOCK_LITERAL,o=t.source?gS(t.source):[],a=o.length;for(let m=o.length-1;m>=0;--m){let y=o[m][1];if(y===""||y==="\r")a=m;else break}if(a===0){let m=s.chomp==="+"&&o.length>0?`
|
|
147
|
+
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let m=0;m<a;++m){let[y,T]=o[m];if(T===""||T==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),d=m,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+T.length+1}for(let m=o.length-1;m>=a;--m)o[m][0].length>l&&(a=m+1);let u="",p="",h=!1;for(let m=0;m<d;++m)u+=o[m][0].slice(l)+`
|
|
148
|
+
`;for(let m=d;m<a;++m){let[y,T]=o[m];c+=y.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&y.length<l){let $=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",$),y=""}i===O.BLOCK_LITERAL?(u+=p+y.slice(l)+T,p=`
|
|
149
149
|
`):y.length>l||T[0]===" "?(p===" "?p=`
|
|
150
150
|
`:!h&&p===`
|
|
151
151
|
`&&(p=`
|
|
152
152
|
|
|
153
|
-
`),
|
|
153
|
+
`),u+=p+y.slice(l)+T,p=`
|
|
154
154
|
`,h=!0):T===""?p===`
|
|
155
|
-
`?
|
|
155
|
+
`?u+=`
|
|
156
156
|
`:p=`
|
|
157
|
-
`:(
|
|
158
|
-
`+o[m][0].slice(l);
|
|
159
|
-
`&&(
|
|
160
|
-
`);break;default:
|
|
161
|
-
`}let f=r+s.length+t.source.length;return{value:
|
|
157
|
+
`:(u+=p+T,p=" ",h=!1)}switch(s.chomp){case"-":break;case"+":for(let m=a;m<o.length;++m)u+=`
|
|
158
|
+
`+o[m][0].slice(l);u[u.length-1]!==`
|
|
159
|
+
`&&(u+=`
|
|
160
|
+
`);break;default:u+=`
|
|
161
|
+
`}let f=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,f,f]}}function hS({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let f=Number(h);!o&&f?o=f:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":u+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=h.source.length,d=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),u+=h.source.length;break;default:{let f=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",f);let m=h.source;m&&typeof m=="string"&&(u+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function gS(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 Kc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,f)=>n(r+p,h,f);switch(s){case"scalar":a=O.PLAIN,l=yS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=wS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=kS(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=Et(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function yS(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}`),Vm(e)}function wS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Vm(e.slice(1,-1)).replace(/''/g,"'")}function Vm(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=`
|
|
@@ -173,53 +173,53 @@ ${c}
|
|
|
173
173
|
`);)r===`
|
|
174
174
|
`&&(n+=`
|
|
175
175
|
`),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var bS={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
|
|
176
|
-
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function RS(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
|
|
176
|
+
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function RS(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 Gc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Vc(e,t,r):Kc(t,e.options.strict,r),l=n?e.directives.tagName(n.source,u=>r(n,"TAG_RESOLVE_FAILED",u)):null,c;e.options.stringKeys&&e.atKey?c=e.schema[je]:l?c=PS(e.schema,s,l,n,r):t.type==="scalar"?c=SS(e,s,t,r):c=e.schema[je];let d;try{let u=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);d=x(u)?u:new O(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new O(s)}return d.range=a,d.source=s,i&&(d.type=i),l&&(d.tag=l),c.format&&(d.format=c.format),o&&(d.comment=o),d}function PS(e,t,n,r,s){if(n==="!")return e[je];let i=[];for(let a of e.tags)if(!a.collection&&a.tag===n)if(a.default&&a.test)i.push(a);else return a;for(let a of i)if(a.test?.test(t))return a;let o=e.knownTags[n];return o&&!o.collection?(e.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(s(r,"TAG_RESOLVE_FAILED",`Unresolved tag: ${n}`,n!=="tag:yaml.org,2002:str"),e[je])}function SS({atKey:e,directives:t,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||e&&a.default==="key")&&a.test?.test(r))||n[je];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[je];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),d=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",d,!0)}}return o}function Km(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 IS={composeNode:Hc,composeEmptyNode:fo};function Hc(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=vS(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=Gc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Wm(IS,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=fo(e,t.offset,void 0,null,n,r)),a&&c.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&e.options.stringKeys&&(!x(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&r(l??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(c.spaceBefore=!0),o&&(t.type==="scalar"&&t.source===""?c.comment=o:c.commentBefore=o),e.options.keepSourceTokens&&d&&(c.srcToken=t),c}function fo(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:Km(t,n,r),indent:-1,source:""},u=Gc(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 vS({options:e},{offset:t,source:n,end:r},s){let i=new Lt(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=Et(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 an(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=At(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?Hc(c,s,d,o):fo(c,d.end,r,null,d,o);let u=l.contents.range[2],p=Et(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function Rs(e){if(typeof e=="number")return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n=="string"?n.length:1)]}function Hm(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 Ps=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Rs(n);i?this.warnings.push(new Ts(o,r,s)):this.errors.push(new
|
|
179
|
+
`)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var Ps=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Rs(n);i?this.warnings.push(new Ts(o,r,s)):this.errors.push(new ut(o,r,s))},this.directives=new vt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Hm(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
|
|
180
180
|
${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(W(i)&&!i.flow&&i.items.length>0){let o=i.items[0];j(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r}
|
|
181
181
|
${a}`:r}else{let o=i.commentBefore;i.commentBefore=o?`${r}
|
|
182
|
-
${o}`:r}}if(n){for(let i=0;i<this.errors.length;++i)t.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)t.warnings.push(this.warnings[i])}else t.errors=this.errors,t.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Hm(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=Rs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=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
|
|
183
|
-
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new
|
|
182
|
+
${o}`:r}}if(n){for(let i=0;i<this.errors.length;++i)t.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)t.warnings.push(this.warnings[i])}else t.errors=this.errors,t.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Hm(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=Rs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=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 ut(Rs(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new ut(Rs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Et(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
|
|
183
|
+
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new ut(Rs(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new an(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};var Yc=Symbol("break visit"),CS=Symbol("skip children"),Ym=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),zm(Object.freeze([]),e,t)}On.BREAK=Yc;On.SKIP=CS;On.REMOVE=Ym;On.itemAtPath=(e,t)=>{let n=e;for(let[r,s]of t){let i=n?.[r];if(i&&"items"in i)n=i.items[s];else return}return n};On.parentCollection=(e,t)=>{let n=On.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],s=n?.[r];if(s&&"items"in s)return s;throw new Error("Parent collection not found")};function zm(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=zm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Yc)return Yc;a===Ym&&(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 zc="\uFEFF",Jc="",Xc="",mo="";function Jm(e){switch(e){case zc:return"byte-order-mark";case Jc:return"doc-mode";case Xc:return"flow-error-end";case mo:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
|
|
184
184
|
`:case`\r
|
|
185
|
-
`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function
|
|
185
|
+
`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function pt(e){switch(e){case void 0:case" ":case`
|
|
186
186
|
`:case"\r":case" ":return!0;default:return!1}}var Xm=new Set("0123456789ABCDEFabcdef"),ES=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),ho=new Set(",[]{}"),OS=new Set(` ,[]{}
|
|
187
|
-
\r `),
|
|
187
|
+
\r `),Qc=e=>!e||OS.has(e),Ss=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
|
|
188
188
|
`?!0:n==="\r"?this.buffer[t+1]===`
|
|
189
189
|
`:!1}charAt(t){return this.buffer[this.pos+t]}continueScalar(t){let n=this.buffer[t];if(this.indentNext>0){let r=0;for(;n===" ";)n=this.buffer[++r+t];if(n==="\r"){let s=this.buffer[r+t+1];if(s===`
|
|
190
190
|
`||!s&&!this.atEnd)return t+r+1}return n===`
|
|
191
|
-
`||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&
|
|
192
|
-
`,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===
|
|
191
|
+
`||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&pt(this.buffer[t+3]))return-1}return t}getLine(){let t=this.lineEndPos;return(typeof t!="number"||t!==-1&&t<this.pos)&&(t=this.buffer.indexOf(`
|
|
192
|
+
`,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===zc&&(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 Jc,yield*this.parseLineStart()}*parseLineStart(){let t=this.charAt(0);if(!t&&!this.atEnd)return this.setNext("line-start");if(t==="-"||t==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");let n=this.peek(3);if((n==="---"||n==="...")&&pt(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,n==="---"?"doc":"stream"}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!pt(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[t,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((t==="-"||t==="?"||t===":")&&pt(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let t=this.getLine();if(t===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(t[n]){case"#":yield*this.pushCount(t.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(Qc),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(t.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let t,n,r=-1;do t=yield*this.pushNewline(),t>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(t+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r<this.indentNext&&s[0]!=="#"||r===0&&(s.startsWith("---")||s.startsWith("..."))&&pt(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Xc,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(Qc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||pt(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
|
|
193
193
|
`,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
|
|
194
|
-
`,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>
|
|
194
|
+
`,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>pt(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
|
|
195
195
|
`:t=i,n=0;break;case"\r":{let o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
|
|
196
196
|
`)break}default:break e}if(!r&&!this.atEnd)return this.setNext("block-scalar");if(n>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=n:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let i=this.continueScalar(t+1);if(i===-1)break;t=this.buffer.indexOf(`
|
|
197
197
|
`,i)}while(t!==-1);if(t===-1){if(!this.atEnd)return this.setNext("block-scalar");t=this.buffer.length}}let s=t+1;for(r=this.buffer[s];r===" ";)r=this.buffer[++s];if(r===" "){for(;r===" "||r===" "||r==="\r"||r===`
|
|
198
198
|
`;)r=this.buffer[++s];t=s-1}else if(!this.blockScalarKeep)do{let i=t-1,o=this.buffer[i];o==="\r"&&(o=this.buffer[--i]);let a=i;for(;o===" ";)o=this.buffer[--i];if(o===`
|
|
199
|
-
`&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield mo,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(
|
|
199
|
+
`&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield mo,yield*this.pushToIndex(t+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let t=this.flowLevel>0,n=this.pos-1,r=this.pos-1,s;for(;s=this.buffer[++r];)if(s===":"){let i=this.buffer[r+1];if(pt(i)||t&&ho.has(i))break;n=r}else if(pt(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
|
|
200
200
|
`?(r+=1,s=`
|
|
201
201
|
`,i=this.buffer[r+1]):n=r),i==="#"||t&&ho.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&&ho.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield mo,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(
|
|
202
|
+
`){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&ho.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield mo,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(Qc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(pt(r)||n&&ho.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,t+=yield*this.pushCount(1),t+=yield*this.pushSpaces(!0);continue e}}}break e}return t}*pushTag(){if(this.charAt(1)==="<"){let t=this.pos+2,n=this.buffer[t];for(;!pt(n)&&n!==">";)n=this.buffer[++t];return yield*this.pushToIndex(n===">"?t+1:t,!1)}else{let t=this.pos+1,n=this.buffer[t];for(;n;)if(ES.has(n))n=this.buffer[++t];else if(n==="%"&&Xm.has(this.buffer[t+1])&&Xm.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 Is=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function cn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Qm(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 eh(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 go(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
|
|
204
|
+
`?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var Is=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function cn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Qm(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 eh(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 go(e){switch(e.type){case"document":return e.start;case"block-map":{let t=e.items[e.items.length-1];return t.sep??t.start}case"block-seq":return e.items[e.items.length-1].start;default:return[]}}function wr(e){if(e.length===0)return[];let t=e.length;e:for(;--t>=0;)switch(e[t].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;e[++t]?.type==="space";);return e.splice(t,e.length)}function yo(e,t){if(t.length<1e5)Array.prototype.push.apply(e,t);else for(let n=0;n<t.length;++n)e.push(t[n])}function Zm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!cn(t.start,"explicit-key-ind")&&!cn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,eh(t.value)?t.value.end?yo(t.value.end,t.sep):t.value.end=t.sep:yo(t.start,t.sep),delete t.sep)}var vs=class{constructor(t){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new Ss,this.onNewLine=t}*parse(t,n=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let r of this.lexer.lex(t,n))yield*this.next(r);n||(yield*this.end())}*next(t){if(this.source=t,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=t.length;return}let n=Jm(t);if(n)if(n==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=n,yield*this.step(),n){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+t.length);break;case"space":this.atNewLine&&t[0]===" "&&(this.indent+=t.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=t.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=t.length}else{let r=`Not a YAML token: ${t}`;yield*this.pop({type:"error",offset:this.offset,message:r,source:t}),this.offset+=t.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let t=this.peek(1);if(this.type==="doc-end"&&t?.type!=="doc-end"){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!t)return yield*this.stream();switch(t.type){case"document":return yield*this.document(t);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(t);case"block-scalar":return yield*this.blockScalar(t);case"block-map":return yield*this.blockMap(t);case"block-seq":return yield*this.blockSequence(t);case"flow-collection":return yield*this.flowCollection(t);case"doc-end":return yield*this.documentEnd(t)}yield*this.pop()}peek(t){return this.stack[this.stack.length-t]}*pop(t){let n=t??this.stack.pop();if(!n)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield n;else{let r=this.peek(1);switch(n.type==="block-scalar"?n.indent="indent"in r?r.indent:0:n.type==="flow-collection"&&r.type==="document"&&(n.indent=0),n.type==="flow-collection"&&Zm(n),r.type){case"document":r.value=n;break;case"block-scalar":r.props.push(n);break;case"block-map":{let s=r.items[r.items.length-1];if(s.value){r.items.push({start:[],key:n,sep:[]}),this.onKeyLine=!0;return}else if(s.sep)s.value=n;else{Object.assign(s,{key:n,sep:[]}),this.onKeyLine=!s.explicitKey;return}break}case"block-seq":{let s=r.items[r.items.length-1];s.value?r.items.push({start:[],value:n}):s.value=n;break}case"flow-collection":{let s=r.items[r.items.length-1];!s||s.value?r.items.push({start:[],key:n,sep:[]}):s.sep?s.value=n:Object.assign(s,{key:n,sep:[]});return}default:yield*this.pop(),yield*this.pop(n)}if((r.type==="document"||r.type==="block-map"||r.type==="block-seq")&&(n.type==="block-map"||n.type==="block-seq")){let s=n.items[n.items.length-1];s&&!s.sep&&!s.value&&s.start.length>0&&Qm(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":{Qm(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=go(this.peek(2)),r=wr(n),s;t.end?(s=t.end,s.push(this.sourceToken),delete t.end):s=[this.sourceToken];let i={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:r,key:t,sep:s}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(t)}*blockScalar(t){switch(this.type){case"space":case"comment":case"newline":t.props.push(this.sourceToken);return;case"scalar":if(t.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let n=this.source.indexOf(`
|
|
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)){yo(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(cn(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(eh(n.key)&&!cn(n.sep,"newline")){let o=
|
|
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)){yo(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(cn(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(eh(n.key)&&!cn(n.sep,"newline")){let o=wr(n.start),a=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(cn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=wr(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?t.items.push({start:i,key:null,sep:[this.sourceToken]}):cn(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(t.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(t);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!cn(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){yo(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||cn(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){let r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){let n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}let r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=go(r),i=wr(s);Zm(t);let o=t.end.splice(1,t.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:i,key:t,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(t)}}flowScalar(t){if(this.onNewLine){let n=this.source.indexOf(`
|
|
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=go(t),r=yr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=go(t),r=yr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function $S(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Is||null,prettyErrors:t}}function Qc(e,t={}){let{lineCounter:n,prettyErrors:r}=$S(t),s=new vs(n?.addNewLine),i=new Ps(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new dt(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(jc(e,n)),o.warnings.forEach(jc(e,n))),o}var Cs=1024*1024;function Zc(e,t){Buffer.byteLength(e)>Cs&&wo(t,[`Definition exceeds ${Cs} bytes.`]);let n=Qc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Qe(n,(i,o)=>{qe(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&wo(t,s),n.contents===null&&wo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){wo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function wo(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 DS}from"node:crypto";var wr=/^[a-z][a-z0-9_-]{0,63}$/,th=/\$\{\{\s*([^{}]+?)\s*\}\}/g,nh=32,rh=128,_S=16,xS=32,FS=10080*60*1e3,kr=32*1024,sh=16;function nd(e,t){let n=[],r=Ue(e,"$",n);pt(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=HS(r.name,"$.name",n),i=MS(r.limits,n),o=jS(r.inputs,n),a=qS(r.steps,n);a.length>rh&&n.push(`$.steps may contain at most ${rh} steps.`),a.filter(d=>d.kind==="agent"&&d.createChild).length>i.maxTasks&&n.push("$.steps creates more child tasks than limits.max_tasks allows.");let l=new Set(a.map(d=>d.id));for(let d of a)for(let p of d.needs)l.has(p)||n.push(`$.steps.${d.id}.needs references missing step "${p}".`),p===d.id&&n.push(`$.steps.${d.id}.needs cannot reference itself.`);let c=WS(a,n);c&&VS(a,o,c.ancestors,n),n.length>0&&JS(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:DS("sha256").update(td(u)).digest("hex"),order:c.order,waves:LS(c.waves,i.maxConcurrency)}}function LS(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 MS(e,t){let n=Ue(e,"$.limits",t);pt(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=ih(n.max_concurrency,"$.limits.max_concurrency",1,_S,t),s=ih(n.max_tasks,"$.limits.max_tasks",1,xS,t),i=lh(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function jS(e,t){if(e===void 0)return{};let n=Ue(e,"$.inputs",t),r=Object.entries(n);r.length>nh&&t.push(`$.inputs may contain at most ${nh} inputs.`);let s={};for(let[i,o]of r){wr.test(i)||t.push(`$.inputs key "${i}" must match ${wr}.`);let a=Ue(o,`$.inputs.${i}`,t);pt(a,["type","required","default"],`$.inputs.${i}`,t);let l=zS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:YS(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&&!oh(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&oh(a.default,l)?{defaultValue:a.default}:{}}}return s}function qS(e,t){let n=Ue(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{wr.test(s)||t.push(`$.steps key "${s}" must match ${wr}.`);let o=Ue(i,`$.steps.${s}`,t),a=ah(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?BS(s,o,a,t):US(s,o,a,t)})}function US(e,t,n,r){pt(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?jt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=Ue(t.create_child,`$.steps.${e}.create_child`,r);pt(d,["repo","workspace"],`$.steps.${e}.create_child`,r),d.repo!==void 0&&d.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...d.repo!==void 0?{repo:jt(d.repo,`$.steps.${e}.create_child.repo`,r)}:{},...d.workspace!==void 0?{workspace:jt(d.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let d=Ue(t.agent,`$.steps.${e}.agent`,r);if(pt(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=k.runners.parse(jt(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=jt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>kr&&r.push(`$.steps.${e}.prompt exceeds ${kr} bytes.`);let u;if(t.output!==void 0){let d=Ue(t.output,`$.steps.${e}.output`,r);pt(d,["schema"],`$.steps.${e}.output`,r),u=ed(d.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...u?{outputSchema:u}:{}}}function BS(e,t,n,r){pt(t,["needs","human_review"],`$.steps.${e}`,r);let s=Ue(t.human_review,`$.steps.${e}.human_review`,r);pt(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Ue(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);pt(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=jt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:jt(s.title,`$.steps.${e}.human_review.title`,r),summary:jt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:lh(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function ed(e,t,n,r){if(r>sh)return n.push(`${t} exceeds the maximum schema depth of ${sh}.`),{};let s=Ue(e,t,n);pt(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&ah(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=Ue(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))ed(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&ed(s.items,`${t}.items`,n,r+1),s}function WS(e,t){let n=new Set(e.map(d=>d.id));if(e.some(d=>d.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((d,p)=>[d.id,p])),s=new Map(e.map(d=>[d.id,d.needs.length])),i=new Map;for(let d of e)for(let p of d.needs)i.set(p,[...i.get(p)??[],d.id]);let o=e.filter(d=>d.needs.length===0).map(d=>d.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let d=o;l.push(d),a.push(...d);let p=[];for(let h of d)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(d=>[d.id,d])),u=new Map;for(let d of a){let p=new Set;for(let h of c.get(d).needs){p.add(h);for(let f of u.get(h)??[])p.add(f)}u.set(d,p)}return{order:a,waves:l,ancestors:u}}function VS(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(th)],c=a.replace(th,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)KS(u[1].trim(),i,t,n,s,r)}}}function KS(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&&GS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function GS(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(!ko(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(!ko(a))return;i=a}}function td(e){return Array.isArray(e)?`[${e.map(td).join(",")}]`:ko(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${td(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ue(e,t,n){return ko(e)?e:(n.push(`${t} must be an object.`),{})}function pt(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function HS(e,t,n){let r=jt(e,t,n);return wr.test(r)||n.push(`${t} must match ${wr}.`),r}function jt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function ah(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 ih(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 YS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function zS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function oh(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function lh(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>FS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function JS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var ko=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as XS,stat as QS}from"node:fs/promises";var ZS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function rd(e){let t=await ch(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 sd(e,t){let n=await ch(e),r=eI(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:$n(l.title,r,`$.steps.${a}.human_review.title`),summary:$n(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?$n(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:$n(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:$n(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:$n(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:rI(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 ch(e){let t;try{let n=await QS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Cs)throw new Error(`Definition exceeds ${Cs} bytes.`);t=await XS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return nd(Zc(t,e),e)}function eI(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]=tI(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 tI(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 nI(e,t){return e.replace(ZS,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function $n(e,t,n){let r=nI(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 rI(e,t,n){let r=`$.steps.${n}.prompt`,s=$n(e,t,r);if(Buffer.byteLength(s)>kr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${kr} bytes.`,{details:{location:r,maxBytes:kr}});return s}import{createHash as dh}from"node:crypto";import sI from"node:path";import{mkdir as iI}from"node:fs/promises";var id={type:"system",component:"heartbeat"};async function dn(e,t={}){await iI(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):_t.listAgents(e),Vf(e),pI(e)]),o=r??bt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=uI(i),l=a!==i,c=[],u=od(s.filter(dI),f=>f.taskId),d=od(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=od(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=oI(f),y=u.get(f.id),T=ld(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await Le(e,{id:ad(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:id,data:{...m,changedFields:T?lI(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=cI(f.prs),$=d.get(f.id),N=ld($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",Y=await Le(e,{id:ad(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:id,data:b});c.push(Y),D=Y.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=ld(m?.data)??a.agents[f.tabId]??null;if(y?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let T=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await Le(e,{id:ad("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:id,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await U(ph(e),a),c}function oI(e){let t={status:e.status,title:e.title,runner:e.runner,branch:e.branch,lastCommitSha:e.lastCommit?.sha??null,checksStatus:e.checks.status,checksLastRunAt:e.checks.lastRunAt,sourceUpdatedAt:e.updatedAt,agentTabIds:e.ptyTabs.filter(n=>n.kind==="agent").map(n=>n.id)};return{...t,signature:uh(t)}}var aI=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function lI(e,t){return aI.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function cI(e){let t=e.map(n=>({provider:n.provider,owner:n.owner,repo:n.repo,number:n.number,url:n.url,status:n.status,draft:n.draft,headBranch:n.headBranch,lastSyncedAt:n.lastSyncedAt,lastSyncedHeadSha:n.lastSyncedHeadSha}));return{associations:t,signature:uh(t)}}function od(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var dI=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",uh=e=>dh("sha256").update(JSON.stringify(e)).digest("hex"),ad=(...e)=>dh("sha256").update(e.join("\0")).digest("hex"),ld=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,ph=e=>sI.join(e.orchestrationDir,"event-reconciliation.json");function uI(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 pI(e){try{return await Vs(ph(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function fI(e,t){return await cd(e),await dn(e),In(e,t)}async function mI(e,t,n){await cd(e);let r=await _t.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await dn(e,{agentObserver:r});let a=await In(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await fh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function hI(e,t,n){await cd(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 _t.openObserver(e);try{await dn(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=bt([r],s.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw yI(t);let d=a-Date.now();if(d<=0)throw gI(t,n.states,n.timeoutMs);await dn(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await fh(Math.min(250,d),n.signal)}}finally{s.close()}}async function cd(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 fh(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 gI=(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}}),yI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),To={list:fI,watch:mI,waitForTaskState:hI,reconcile:dn};import{readFile as xI}from"node:fs/promises";import{mkdir as EI,readFile as bh,rm as Rh}from"node:fs/promises";import{createConnection as OI}from"node:net";import $I from"node:path";import{spawn as RI}from"node:child_process";import{closeSync as PI,openSync as SI}from"node:fs";import ud from"node:path";import{accessSync as wI,constants as kI}from"node:fs";import{homedir as mh}from"node:os";import un from"node:path";var TI=[un.join(mh(),".local","bin"),un.join(mh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function gh(e=process.env){return bI([...(e.PATH??"").split(un.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:TI])}function bo(e=process.env){return{...e,PATH:gh(e).join(un.delimiter)}}function dd(e,t={}){if(e.includes(un.sep)){let n=un.isAbsolute(e)?e:un.resolve(t.cwd??process.cwd(),e);return hh(n)?n:null}for(let n of gh(t.env)){let r=un.join(n,e);if(hh(r))return r}return null}function Ro(e,t={}){let n=dd(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 hh(e){try{return wI(e,kI.X_OK),!0}catch{return!1}}function bI(e){return[...new Set(e)]}function Po(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=II(e.workspaceRoot),s=SI(ud.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return RI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{PI(s)}})().unref()}function II(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=ud.resolve(ud.dirname(t),"..","node_modules",".bin","tsx");return{command:dd("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}import{mkdir as yh,readFile as wh,rm as pd,stat as kh,utimes as vI,writeFile as CI}from"node:fs/promises";import As from"node:path";async function fd(e){let t=As.join(e.runtimeDir,"orchestration-supervisor.lock","owner.json");try{let[n,r]=await Promise.all([wh(t,"utf8").then(i=>JSON.parse(i)),kh(t)]),s=Date.now()-r.mtimeMs;return n.protocolVersion===Rt&&s>=-1e3&&s<5e3&&typeof n.pid=="number"&&Th(n.pid)}catch{return!1}}async function md(e){let t=As.join(e.runtimeDir,"orchestration-supervisor.lock");await yh(e.runtimeDir,{recursive:!0});try{await yh(t)}catch(r){if(!AI(r))throw r;let s=await wh(As.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await kh(t).catch(()=>null);if(typeof s?.pid=="number"&&!Th(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await pd(t,{recursive:!0,force:!0}),md(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await CI(As.join(t,"owner.json"),JSON.stringify({pid:process.pid,protocolVersion:Rt,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await pd(t,{recursive:!0,force:!0}),r}let n=!1;return{async heartbeat(){if(n)return;let r=new Date;await vI(As.join(t,"owner.json"),r,r)},async release(){n||(n=!0,await pd(t,{recursive:!0,force:!0}))}}}function Th(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 AI=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";async function Dn(e){let t=await Io(Fe(e).socketPath).catch(()=>null);if(!t)return fd(e);try{let n=await Nn(t,{type:"ping"});return Qt(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return fd(e)}finally{t.end()}}async function So(e,t){if(t.length===0)return!0;let n=await Io(Fe(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!Qt(r.protocolVersion))return!1;for(let s of t)await Nn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Sh(e,t){await NI(e);let n=await Io(Fe(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!Qt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Nn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function NI(e){let t=Fe(e),n=await Ph(t.socketPath).catch(()=>null);if(Qt(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await EI(e.runtimeDir,{recursive:!0});let r=await bh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&DI(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([Rh(t.socketPath,{force:!0}),Rh(t.pidPath,{force:!0})]),Po(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Ph(t.socketPath).catch(()=>null);if(Qt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await bh($I.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
-
${o.slice(-2e3)}`:""}`)}async function Ph(e){let t=await Io(e);try{return await Nn(t,{type:"ping"})}finally{t.end()}}function DI(e){try{return process.kill(e,0),!0}catch{return!1}}var _I=1;function Nn(e,t){let n=_I++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig PTY daemon request timed out."))},1e3),a=c=>{i+=String(c);let
|
|
210
|
-
`);if(
|
|
211
|
-
`)})}function Io(e){return new Promise((t,n)=>{let r=OI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function FI(e,t){await BI(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 UI(t.prompt,t.readStdin),o;try{o=await pe.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await Dn(e),a}return await hd(e,o.command.id),o}async function hd(e,t){if((await pe.show(e,t)).command.state==="delivered"||await Dn(e))return;let r=(await pe.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await pe.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 LI(e,t){return pe.show(e,t)}async function MI(e,t){return pe.list(e,t)}async function jI(e,t){let n;try{n=await pe.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Dn(e),r}return await Dn(e),n}async function qI(e,t,n){return pe.wait(e,t,n)}async function UI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await xI(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 BI(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Tr={send:FI,show:LI,list:MI,cancel:jI,wait:qI};function vo(e,t){if(t!=="codex")return e;let[n="codex",...r]=e,s=["--no-alt-screen","--no-daemon"].filter(a=>!r.includes(a)),i="check_for_update_on_startup=false",o=r.includes(i)?[]:["-c",i];return[n,...s,...r,...o]}var WI=6e4;async function Co(e,t){return kc(e,t,{createTask:VI})}async function Ih(e,t,n,r={}){return wc(e,t,n,{...r,launchProvisioned:(s,i)=>vh(e,s,i,!1)})}async function VI(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>vh(e,s,i,!0)})}async function vh(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 Sh(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:vo(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await pe.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:WI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await hd(e,i.command.id)}catch(i){throw await So(e,[s.id]),i}}async function Ao(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 bc(e,t,n);if(!await So(e,o))throw new g("PARTIAL_RESULT","The task tree was closed, but Craig could not stop its agent sessions. Retry cancellation after the daemon is available.",{retryable:!0,details:{taskId:t,persisted:!0,sessionsStopped:!1}});return a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await So(e,o),a}}import{randomUUID as Eh}from"node:crypto";import{readFile as KI,realpath as Ch}from"node:fs/promises";import gd from"node:path";var Q={type:"system",component:"orchestration-supervisor"},GI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function HI(e,t,n,r,s,i){await wd(e);let o=await lv(e,t);if(await S.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new g("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await Xe(e,i,"fury.plan",r)}let a=await sd(t,n);cv(a.steps,r);let l=new Date().toISOString(),c={schemaVersion:1,definitionHash:a.definitionHash,name:a.name,sourceFile:o,rootTaskId:r,inputs:a.inputs,limits:a.limits,order:a.order,waves:a.waves,steps:a.steps},u={...c,id:`fury_plan_${Eh()}`,planHash:Hl(c),createdBy:s,createdAt:l};await vf(e,a.definitionHash,await KI(t,"utf8"));let d=await Cf(e,u);try{await Le(e,{id:`${d.id}:fury.plan.created`,taskId:r,type:"fury.plan.created",occurredAt:d.createdAt,actor:d.createdBy,data:{planId:d.id,planHash:d.planHash,name:d.name}})}catch(p){throw new g("PARTIAL_RESULT",`Fury plan ${d.id} was persisted, but its audit event could not be recorded.`,{details:{planId:d.id,planHash:d.planHash,persisted:!0},cause:p})}return{kind:"planFury",plan:d}}async function YI(e,t,n){if(await wd(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await Pi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await Of(e,s);try{await Le(e,{id:`${r.id}:fury.plan.approved`,taskId:r.rootTaskId,type:"fury.plan.approved",occurredAt:i.approval.approvedAt,actor:i.approval.approvedBy,data:{planId:r.id,planHash:r.planHash}})}catch(o){throw new g("PARTIAL_RESULT",`Fury plan ${r.id} was approved, but its audit event could not be recorded.`,{details:{planId:r.id,planHash:r.planHash,persisted:!0,approved:!0},cause:o})}return{kind:"approveFury",plan:r,approval:i.approval,created:i.created}}async function zI(e,t,n,r){await wd(e);let s=await Pi(e,t);if((await $f(e,t)).planHash!==s.planHash)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} changed after approval.`,{});if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury run requires an agent capability.",{});await Xe(e,r,"fury.run",s.rootTaskId)}await rt(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Eh()}`,planId:s.id,planHash:s.planHash,definitionHash:s.definitionHash,name:s.name,sourceFile:s.sourceFile,rootTaskId:s.rootTaskId,state:"pending",inputs:s.inputs,limits:s.limits,order:s.order,stepRuns:Object.fromEntries(s.steps.map(u=>[u.id,{id:u.id,kind:u.kind,needs:u.needs,state:"pending",plan:u,taskId:null,agentTabId:null,commandId:null,reviewId:null,output:null,error:null,startedAt:null,completedAt:null,deadlineAt:null,completedBy:null}])),actor:n,createdAt:o.toISOString(),updatedAt:o.toISOString(),stateChangedAt:o.toISOString(),deadlineAt:new Date(o.getTime()+s.limits.timeoutMs).toISOString(),completedAt:null},c=await Nf(e,l);try{await le(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(u){throw new g("PARTIAL_RESULT",`Fury run ${c.run.id} was persisted, but its audit event could not be recorded.`,{details:{runId:c.run.id,planId:c.run.planId,persisted:!0},cause:u})}return te(c.run)||await Fn(e,c.run.id),{kind:"runFury",run:await oe(e,c.run.id),created:c.created}}async function JI(e,t){return{kind:"showFury",run:await oe(e,t)}}async function Oo(e,t={}){let n=await k.load(e),r=k.previews.isEnabled(n,"agentOrchestration");for(let s of await Si(e))await XI(e,s.id,{...t,allowScheduling:r})}async function XI(e,t,n={}){let r=n.allowScheduling??k.previews.isEnabled(await k.load(e),"agentOrchestration"),s=await oe(e,t);if(await fv(e,s),te(s)){s.cleanupPending&&await mv(e,s);return}if(s=await hv(e,s),Date.now()>=Date.parse(s.deadlineAt)){if(s=await ve(e,t,a=>te(a)?a:pv(a)),s.state!=="timed_out")return;for(let a of Object.values(s.stepRuns))a.reviewId&&await ns(e,a.reviewId,l=>["waiting_for_review","changes_requested"].includes(l.state)?{...l,state:"timed_out",version:l.version+1,updatedAt:new Date().toISOString()}:l);await le(e,s,null,"fury.run.timed_out",Q,{state:s.state});return}let i=new Map((await Me(e)).map(a=>[a.id,a]));for(let a of s.order){let l=s.stepRuns[a];if(r&&l.state==="running"&&!l.taskId){s=await Ah(e,s,l);continue}l.state==="running"&&l.commandId&&i.get(l.commandId)?.state==="failed"&&(s=await Eo(e,s.id,l.id,i.get(l.commandId)?.lastError?.message??"Prompt delivery failed.",Q));let c=!l.commandId||i.get(l.commandId)?.state==="delivered";l.state==="running"&&l.agentTabId&&c&&n.isAgentAvailable&&l.startedAt&&Date.now()-Date.parse(l.startedAt)>2e3&&!n.isAgentAvailable(l.agentTabId)&&(s=await Eo(e,s.id,l.id,`Agent session ${l.agentTabId} disappeared.`,Q)),l.state==="running"&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(s=await ve(e,s.id,u=>te(u)?u:qt(u,l.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:Q})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.step.timed_out",Q,{})),(l.state==="waiting_for_review"||l.state==="changes_requested")&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(l.reviewId&&await ns(e,l.reviewId,u=>({...u,state:"timed_out",version:u.version+1,updatedAt:new Date().toISOString()})),s=await ve(e,s.id,u=>te(u)?u:qt(u,l.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:Q})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.review.timed_out",Q,{reviewId:l.reviewId}))}if(Object.values(s.stepRuns).some(a=>a.state==="failed"||a.state==="timed_out")){await $o(e,s.id,"failed",Q);return}let o=Object.values(s.stepRuns).filter(a=>a.state==="running").length;for(let a of s.order){if(o>=s.limits.maxConcurrency)break;let l=s.stepRuns[a];l.state!=="pending"||!l.needs.every(c=>s.stepRuns[c]?.state==="succeeded")||(l.kind==="human_review"?s=await QI(e,s,l):r&&(s=await Ah(e,s,l),o+=1))}await uv(e,s.id)}async function Ah(e,t,n){let r=new Date;if(t=await ve(e,t.id,i=>te(i)?i:qt(i,n.id,{state:"running",startedAt:i.stepRuns[n.id]?.startedAt??r.toISOString(),deadlineAt:i.deadlineAt})),te(t))return t;await le(e,t,n.id,"fury.step.started",Q,{});let s=t.stepRuns[n.id];if(s.taskId)return t;try{let i=`${xn(s.plan.prompt,t)}
|
|
208
|
+
`,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=go(t),r=wr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=go(t),r=wr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function $S(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Is||null,prettyErrors:t}}function Zc(e,t={}){let{lineCounter:n,prettyErrors:r}=$S(t),s=new vs(n?.addNewLine),i=new Ps(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new ut(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(qc(e,n)),o.warnings.forEach(qc(e,n))),o}var Cs=1024*1024;function ed(e,t){Buffer.byteLength(e)>Cs&&wo(t,[`Definition exceeds ${Cs} bytes.`]);let n=Zc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Qe(n,(i,o)=>{qe(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&wo(t,s),n.contents===null&&wo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){wo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function wo(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 DS}from"node:crypto";var kr=/^[a-z][a-z0-9_-]{0,63}$/,th=/\$\{\{\s*([^{}]+?)\s*\}\}/g,nh=32,rh=128,_S=16,xS=32,FS=10080*60*1e3,Tr=32*1024,sh=16;function rd(e,t){let n=[],r=Ue(e,"$",n);ft(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=HS(r.name,"$.name",n),i=MS(r.limits,n),o=jS(r.inputs,n),a=qS(r.steps,n);a.length>rh&&n.push(`$.steps may contain at most ${rh} 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=WS(a,n);c&&VS(a,o,c.ancestors,n),n.length>0&&JS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:DS("sha256").update(nd(d)).digest("hex"),order:c.order,waves:LS(c.waves,i.maxConcurrency)}}function LS(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 MS(e,t){let n=Ue(e,"$.limits",t);ft(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=ih(n.max_concurrency,"$.limits.max_concurrency",1,_S,t),s=ih(n.max_tasks,"$.limits.max_tasks",1,xS,t),i=lh(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function jS(e,t){if(e===void 0)return{};let n=Ue(e,"$.inputs",t),r=Object.entries(n);r.length>nh&&t.push(`$.inputs may contain at most ${nh} inputs.`);let s={};for(let[i,o]of r){kr.test(i)||t.push(`$.inputs key "${i}" must match ${kr}.`);let a=Ue(o,`$.inputs.${i}`,t);ft(a,["type","required","default"],`$.inputs.${i}`,t);let l=zS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:YS(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&&!oh(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&oh(a.default,l)?{defaultValue:a.default}:{}}}return s}function qS(e,t){let n=Ue(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{kr.test(s)||t.push(`$.steps key "${s}" must match ${kr}.`);let o=Ue(i,`$.steps.${s}`,t),a=ah(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?BS(s,o,a,t):US(s,o,a,t)})}function US(e,t,n,r){ft(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?qt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=Ue(t.create_child,`$.steps.${e}.create_child`,r);ft(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:qt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:qt(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=Ue(t.agent,`$.steps.${e}.agent`,r);if(ft(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(qt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=qt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>Tr&&r.push(`$.steps.${e}.prompt exceeds ${Tr} bytes.`);let d;if(t.output!==void 0){let u=Ue(t.output,`$.steps.${e}.output`,r);ft(u,["schema"],`$.steps.${e}.output`,r),d=td(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 BS(e,t,n,r){ft(t,["needs","human_review"],`$.steps.${e}`,r);let s=Ue(t.human_review,`$.steps.${e}.human_review`,r);ft(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Ue(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ft(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=qt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:qt(s.title,`$.steps.${e}.human_review.title`,r),summary:qt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:lh(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function td(e,t,n,r){if(r>sh)return n.push(`${t} exceeds the maximum schema depth of ${sh}.`),{};let s=Ue(e,t,n);ft(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&ah(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=Ue(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))td(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&td(s.items,`${t}.items`,n,r+1),s}function WS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let f of d.get(h)??[])p.add(f)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function VS(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(th)],c=a.replace(th,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)KS(d[1].trim(),i,t,n,s,r)}}}function KS(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&&GS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function GS(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(!ko(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(!ko(a))return;i=a}}function nd(e){return Array.isArray(e)?`[${e.map(nd).join(",")}]`:ko(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${nd(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ue(e,t,n){return ko(e)?e:(n.push(`${t} must be an object.`),{})}function ft(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function HS(e,t,n){let r=qt(e,t,n);return kr.test(r)||n.push(`${t} must match ${kr}.`),r}function qt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function ah(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 ih(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 YS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function zS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function oh(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function lh(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>FS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function JS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var ko=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as XS,stat as QS}from"node:fs/promises";var ZS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function sd(e){let t=await ch(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 id(e,t){let n=await ch(e),r=eI(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:$n(l.title,r,`$.steps.${a}.human_review.title`),summary:$n(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?$n(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:$n(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:$n(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:$n(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:rI(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 ch(e){let t;try{let n=await QS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Cs)throw new Error(`Definition exceeds ${Cs} bytes.`);t=await XS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return rd(ed(t,e),e)}function eI(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]=tI(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 tI(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 nI(e,t){return e.replace(ZS,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function $n(e,t,n){let r=nI(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 rI(e,t,n){let r=`$.steps.${n}.prompt`,s=$n(e,t,r);if(Buffer.byteLength(s)>Tr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${Tr} bytes.`,{details:{location:r,maxBytes:Tr}});return s}import{createHash as dh}from"node:crypto";import sI from"node:path";import{mkdir as iI}from"node:fs/promises";var od={type:"system",component:"heartbeat"};async function dn(e,t={}){await iI(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):xt.listAgents(e),Vf(e),pI(e)]),o=r??Rt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=uI(i),l=a!==i,c=[],d=ad(s.filter(dI),f=>f.taskId),u=ad(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=ad(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=oI(f),y=d.get(f.id),T=cd(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await Le(e,{id:ld(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:od,data:{...m,changedFields:T?lI(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=cI(f.prs),$=u.get(f.id),N=cd($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",Y=await Le(e,{id:ld(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:od,data:b});c.push(Y),D=Y.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=cd(m?.data)??a.agents[f.tabId]??null;if(y?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let T=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await Le(e,{id:ld("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:od,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await U(ph(e),a),c}function oI(e){let t={status:e.status,title:e.title,runner:e.runner,branch:e.branch,lastCommitSha:e.lastCommit?.sha??null,checksStatus:e.checks.status,checksLastRunAt:e.checks.lastRunAt,sourceUpdatedAt:e.updatedAt,agentTabIds:e.ptyTabs.filter(n=>n.kind==="agent").map(n=>n.id)};return{...t,signature:uh(t)}}var aI=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function lI(e,t){return aI.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function cI(e){let t=e.map(n=>({provider:n.provider,owner:n.owner,repo:n.repo,number:n.number,url:n.url,status:n.status,draft:n.draft,headBranch:n.headBranch,lastSyncedAt:n.lastSyncedAt,lastSyncedHeadSha:n.lastSyncedHeadSha}));return{associations:t,signature:uh(t)}}function ad(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var dI=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",uh=e=>dh("sha256").update(JSON.stringify(e)).digest("hex"),ld=(...e)=>dh("sha256").update(e.join("\0")).digest("hex"),cd=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,ph=e=>sI.join(e.orchestrationDir,"event-reconciliation.json");function uI(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 pI(e){try{return await Vs(ph(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function fI(e,t){return await dd(e),await dn(e),In(e,t)}async function mI(e,t,n){await dd(e);let r=await xt.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await dn(e,{agentObserver:r});let a=await In(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await fh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function hI(e,t,n){await dd(e);let r=await S.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await xt.openObserver(e);try{await dn(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=Rt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw yI(t);let u=a-Date.now();if(u<=0)throw gI(t,n.states,n.timeoutMs);await dn(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await fh(Math.min(250,u),n.signal)}}finally{s.close()}}async function dd(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 fh(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 gI=(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}}),yI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),To={list:fI,watch:mI,waitForTaskState:hI,reconcile:dn};import{readFile as xI}from"node:fs/promises";import{mkdir as EI,readFile as bh,rm as Rh}from"node:fs/promises";import{createConnection as OI}from"node:net";import $I from"node:path";import{spawn as RI}from"node:child_process";import{closeSync as PI,openSync as SI}from"node:fs";import pd from"node:path";import{accessSync as wI,constants as kI}from"node:fs";import{homedir as mh}from"node:os";import un from"node:path";var TI=[un.join(mh(),".local","bin"),un.join(mh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function gh(e=process.env){return bI([...(e.PATH??"").split(un.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:TI])}function bo(e=process.env){return{...e,PATH:gh(e).join(un.delimiter)}}function ud(e,t={}){if(e.includes(un.sep)){let n=un.isAbsolute(e)?e:un.resolve(t.cwd??process.cwd(),e);return hh(n)?n:null}for(let n of gh(t.env)){let r=un.join(n,e);if(hh(r))return r}return null}function Ro(e,t={}){let n=ud(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 hh(e){try{return wI(e,kI.X_OK),!0}catch{return!1}}function bI(e){return[...new Set(e)]}function Po(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=II(e.workspaceRoot),s=SI(pd.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return RI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{PI(s)}})().unref()}function II(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=pd.resolve(pd.dirname(t),"..","node_modules",".bin","tsx");return{command:ud("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}import{mkdir as yh,readFile as wh,rm as fd,stat as kh,utimes as vI,writeFile as CI}from"node:fs/promises";import As from"node:path";async function md(e){let t=As.join(e.runtimeDir,"orchestration-supervisor.lock","owner.json");try{let[n,r]=await Promise.all([wh(t,"utf8").then(i=>JSON.parse(i)),kh(t)]),s=Date.now()-r.mtimeMs;return n.protocolVersion===Pt&&s>=-1e3&&s<5e3&&typeof n.pid=="number"&&Th(n.pid)}catch{return!1}}async function hd(e){let t=As.join(e.runtimeDir,"orchestration-supervisor.lock");await yh(e.runtimeDir,{recursive:!0});try{await yh(t)}catch(r){if(!AI(r))throw r;let s=await wh(As.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await kh(t).catch(()=>null);if(typeof s?.pid=="number"&&!Th(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await fd(t,{recursive:!0,force:!0}),hd(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await CI(As.join(t,"owner.json"),JSON.stringify({pid:process.pid,protocolVersion:Pt,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await fd(t,{recursive:!0,force:!0}),r}let n=!1;return{async heartbeat(){if(n)return;let r=new Date;await vI(As.join(t,"owner.json"),r,r)},async release(){n||(n=!0,await fd(t,{recursive:!0,force:!0}))}}}function Th(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 AI=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";async function Dn(e){let t=await Io(Fe(e).socketPath).catch(()=>null);if(!t)return md(e);try{let n=await Nn(t,{type:"ping"});return Zt(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return md(e)}finally{t.end()}}async function So(e,t){if(t.length===0)return!0;let n=await Io(Fe(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!Zt(r.protocolVersion))return!1;for(let s of t)await Nn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Sh(e,t){await NI(e);let n=await Io(Fe(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!Zt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Nn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function NI(e){let t=Fe(e),n=await Ph(t.socketPath).catch(()=>null);if(Zt(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await EI(e.runtimeDir,{recursive:!0});let r=await bh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&DI(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([Rh(t.socketPath,{force:!0}),Rh(t.pidPath,{force:!0})]),Po(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Ph(t.socketPath).catch(()=>null);if(Zt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await bh($I.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
+
${o.slice(-2e3)}`:""}`)}async function Ph(e){let t=await Io(e);try{return await Nn(t,{type:"ping"})}finally{t.end()}}function DI(e){try{return process.kill(e,0),!0}catch{return!1}}var _I=1;function Nn(e,t){let n=_I++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig PTY daemon request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
|
|
210
|
+
`);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?r(u):s(new Error(u.error??"Craig PTY daemon request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
|
|
211
|
+
`)})}function Io(e){return new Promise((t,n)=>{let r=OI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function FI(e,t){await BI(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 UI(t.prompt,t.readStdin),o;try{o=await ue.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await Dn(e),a}return await gd(e,o.command.id),o}async function gd(e,t){if((await ue.show(e,t)).command.state==="delivered"||await Dn(e))return;let r=(await ue.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ue.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function LI(e,t){return ue.show(e,t)}async function MI(e,t){return ue.list(e,t)}async function jI(e,t){let n;try{n=await ue.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Dn(e),r}return await Dn(e),n}async function qI(e,t,n){return ue.wait(e,t,n)}async function UI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await xI(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 BI(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 br={send:FI,show:LI,list:MI,cancel:jI,wait:qI};function vo(e,t){if(t!=="codex")return e;let[n="codex",...r]=e,s=["--no-alt-screen","--no-daemon"].filter(a=>!r.includes(a)),i="check_for_update_on_startup=false",o=r.includes(i)?[]:["-c",i];return[n,...s,...r,...o]}var WI=6e4;async function Co(e,t){return Tc(e,t,{createTask:VI})}async function Ih(e,t,n,r={}){return kc(e,t,n,{...r,launchProvisioned:(s,i)=>vh(e,s,i,!1)})}async function VI(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>vh(e,s,i,!0)})}async function vh(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 Sh(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:vo(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await ue.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:WI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await gd(e,i.command.id)}catch(i){throw await So(e,[s.id]),i}}async function Ao(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 Rc(e,t,n);if(!await So(e,o))throw new g("PARTIAL_RESULT","The task tree was closed, but Craig could not stop its agent sessions. Retry cancellation after the daemon is available.",{retryable:!0,details:{taskId:t,persisted:!0,sessionsStopped:!1}});return a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await So(e,o),a}}import{randomUUID as Eh}from"node:crypto";import{readFile as KI,realpath as Ch}from"node:fs/promises";import yd from"node:path";var X={type:"system",component:"orchestration-supervisor"},GI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function HI(e,t,n,r,s,i){await kd(e);let o=await lv(e,t);if(await S.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new g("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await Xe(e,i,"fury.plan",r)}let a=await id(t,n);cv(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_${Eh()}`,planHash:Yl(c),createdBy:s,createdAt:l};await vf(e,a.definitionHash,await KI(t,"utf8"));let u=await Cf(e,d);try{await Le(e,{id:`${u.id}:fury.plan.created`,taskId:r,type:"fury.plan.created",occurredAt:u.createdAt,actor:u.createdBy,data:{planId:u.id,planHash:u.planHash,name:u.name}})}catch(p){throw new g("PARTIAL_RESULT",`Fury plan ${u.id} was persisted, but its audit event could not be recorded.`,{details:{planId:u.id,planHash:u.planHash,persisted:!0},cause:p})}return{kind:"planFury",plan:u}}async function YI(e,t,n){if(await kd(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await Pi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await Of(e,s);try{await Le(e,{id:`${r.id}:fury.plan.approved`,taskId:r.rootTaskId,type:"fury.plan.approved",occurredAt:i.approval.approvedAt,actor:i.approval.approvedBy,data:{planId:r.id,planHash:r.planHash}})}catch(o){throw new g("PARTIAL_RESULT",`Fury plan ${r.id} was approved, but its audit event could not be recorded.`,{details:{planId:r.id,planHash:r.planHash,persisted:!0,approved:!0},cause:o})}return{kind:"approveFury",plan:r,approval:i.approval,created:i.created}}async function zI(e,t,n,r){await kd(e);let s=await Pi(e,t);if((await $f(e,t)).planHash!==s.planHash)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} changed after approval.`,{});if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury run requires an agent capability.",{});await Xe(e,r,"fury.run",s.rootTaskId)}await st(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Eh()}`,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 Nf(e,l);try{await le(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 ne(c.run)||await Fn(e,c.run.id),{kind:"runFury",run:await te(e,c.run.id),created:c.created}}async function JI(e,t){return{kind:"showFury",run:await te(e,t)}}async function Oo(e,t={}){let n=await k.load(e),r=k.previews.isEnabled(n,"agentOrchestration");for(let s of await Si(e))await XI(e,s.id,{...t,allowScheduling:r})}async function XI(e,t,n={}){let r=n.allowScheduling??k.previews.isEnabled(await k.load(e),"agentOrchestration"),s=await te(e,t);if(await fv(e,s),ne(s)){s.cleanupPending&&await mv(e,s);return}if(s=await gv(e,s),await hv(e,s),Date.now()>=Date.parse(s.deadlineAt)){if(s=await ve(e,t,a=>ne(a)?a:pv(a)),s.state!=="timed_out")return;for(let a of Object.values(s.stepRuns))a.reviewId&&await ir(e,a.reviewId,l=>["waiting_for_review","changes_requested"].includes(l.state)?{...l,state:"timed_out",version:l.version+1,updatedAt:new Date().toISOString()}:l);await le(e,s,null,"fury.run.timed_out",X,{state:s.state});return}let i=new Map((await Me(e)).map(a=>[a.id,a]));for(let a of s.order){let l=s.stepRuns[a];if(r&&l.state==="running"&&!l.taskId){s=await Ah(e,s,l);continue}l.state==="running"&&l.commandId&&i.get(l.commandId)?.state==="failed"&&(s=await Eo(e,s.id,l.id,i.get(l.commandId)?.lastError?.message??"Prompt delivery failed.",X));let c=!l.commandId||i.get(l.commandId)?.state==="delivered";l.state==="running"&&l.agentTabId&&c&&n.isAgentAvailable&&l.startedAt&&Date.now()-Date.parse(l.startedAt)>2e3&&!n.isAgentAvailable(l.agentTabId)&&(s=await Eo(e,s.id,l.id,`Agent session ${l.agentTabId} disappeared.`,X)),l.state==="running"&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(s=await ve(e,s.id,d=>ne(d)?d:Ut(d,l.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.step.timed_out",X,{})),(l.state==="waiting_for_review"||l.state==="changes_requested")&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(l.reviewId&&await ir(e,l.reviewId,d=>({...d,state:"timed_out",version:d.version+1,updatedAt:new Date().toISOString()})),s=await ve(e,s.id,d=>ne(d)?d:Ut(d,l.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.review.timed_out",X,{reviewId:l.reviewId}))}if(Object.values(s.stepRuns).some(a=>a.state==="failed"||a.state==="timed_out")){await $o(e,s.id,"failed",X);return}let o=Object.values(s.stepRuns).filter(a=>a.state==="running").length;for(let a of s.order){if(o>=s.limits.maxConcurrency)break;let l=s.stepRuns[a];l.state!=="pending"||!l.needs.every(c=>s.stepRuns[c]?.state==="succeeded")||(l.kind==="human_review"?s=await QI(e,s,l):r&&(s=await Ah(e,s,l),o+=1))}await uv(e,s.id)}async function Ah(e,t,n){let r=new Date;if(t=await ve(e,t.id,i=>ne(i)?i:Ut(i,n.id,{state:"running",startedAt:i.stepRuns[n.id]?.startedAt??r.toISOString(),deadlineAt:i.deadlineAt})),ne(t))return t;await le(e,t,n.id,"fury.step.started",X,{});let s=t.stepRuns[n.id];if(s.taskId)return t;try{let i=`${xn(s.plan.prompt,t)}
|
|
212
212
|
|
|
213
|
-
${dv(t.id,n.id,s.plan.outputSchema)}`,o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await Co(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:xn(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:xn(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),u=await S.getTask(e,c.taskId),d=u.ptyTabs.find(p=>p.kind==="agent");if(!d)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${u.id} has no agent tab.`,{});o=u.id,a=d.id,l=(await Me(e)).find(p=>p.idempotencyKey===`task-start:${u.id}`)?.id??null}else{o=xn(s.plan.target.task,t);let c=await S.getTask(e,o),u=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!u)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await rt(e,c,Q,u.id),a=u.id,l=(await pe.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:Q})).command.id}return t=await ve(e,t.id,c=>te(c)?{...c,cleanupPending:!0}:qt(c,n.id,{taskId:o,agentTabId:a,commandId:l})),te(t)||await le(e,t,n.id,"fury.step.dispatched",Q,{taskId:o,agentTabId:a,commandId:l}),t}catch(i){let o=await oe(e,t.id);return te(o)?o:Eo(e,t.id,n.id,i instanceof Error?i.message:"Step dispatch failed.",Q)}}async function QI(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?xn(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(u=>u.taskId===o&&u.agentTabId):null,l=await Zt(e,i).catch(u=>{if(u instanceof g&&u.code==="FURY_REVIEW_NOT_FOUND")return null;throw u}),c=l??{schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:xn(r.title,t),summary:xn(r.summary,t),feedbackTarget:o?{taskId:o,agentTabId:a?.agentTabId??null}:null,round:1,requestedAt:s.toISOString(),deadlineAt:new Date(Math.min(Date.parse(t.deadlineAt),s.getTime()+r.timeoutMs)).toISOString(),version:1,lastDecision:null,history:[],updatedAt:s.toISOString()};return l||await _f(e,c),t=await ve(e,t.id,u=>te(u)?{...u,cleanupPending:!0}:qt(u,n.id,{state:"waiting_for_review",reviewId:i,startedAt:c.requestedAt,deadlineAt:c.deadlineAt})),te(t)||await le(e,t,n.id,"fury.review.requested",Q,{reviewId:i,title:c.title}),t}async function ZI(e,t,n,r,s,i){let o=await oe(e,t),a=$h(o,n);await Oh(e,a,s,i,"fury.step.complete"),av(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await ve(e,t,c=>{if(te(c)||c.stepRuns[n]?.state!=="running"||Date.now()>=Date.parse(c.deadlineAt))throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running or its deadline has elapsed.`,{});return qt(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Fn(e,t),o=await oe(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function ev(e,t,n,r,s,i){let o=await oe(e,t),a=$h(o,n);await Oh(e,a,s,i,"fury.step.fail");let l=await Eo(e,t,n,r,s);return await $o(e,t,"failed",s),await Fn(e,t),{kind:"failFuryStep",run:await oe(e,t),step:l.stepRuns[n]}}async function tv(e,t,n,r){let s=await oe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Xe(e,r,"fury.cancel",s.rootTaskId)}if(te(s))return s.cleanupPending&&await Fn(e,t),{kind:"cancelFury",run:await oe(e,t),changed:!1};let i=new Date().toISOString(),o=!1,a=await ve(e,t,l=>te(l)?l:(o=!0,{...l,state:"cancelled",cleanupPending:!0,cleanupError:null,completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,u])=>[c,u.state==="succeeded"?u:{...u,state:"cancelled",completedAt:i,completedBy:n}]))}));return o?(await le(e,a,null,"fury.run.cancelled",n,{}),await Fn(e,t),{kind:"cancelFury",run:await oe(e,t),changed:o}):{kind:"cancelFury",run:a,changed:!1}}async function nv(e,t,n,r){let s=await oe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Xe(e,r,"fury.resume",s.rootTaskId)}if(te(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await Fn(e,t),{kind:"resumeFury",run:await oe(e,t)}}async function rv(e,t,n){return{kind:"listFuryReviews",reviews:(await rs(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function sv(e,t){return{kind:"showFuryReview",review:await Zt(e,t)}}async function iv(e,t,n,r,s,i){let o=await Zt(e,t),a=await oe(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can decide a fury review.",{});if(n==="resubmit"&&s.type!=="human"&&s.type!=="agent")throw new g("CAPABILITY_DENIED","Only a human or the feedback-target agent can resubmit a review.",{});if(n==="resubmit"&&s.type==="agent"){if(!o.feedbackTarget||s.taskId!==o.feedbackTarget.taskId||!i)throw new g("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await Xe(e,i,"fury.review.resubmit",s.taskId)}if(te(a)||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(o.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} belongs to a terminal or expired run.`,{});if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await S.getTask(e,o.feedbackTarget.taskId),f=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!f)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await pe.create(e,{taskId:h.id,agentTabId:f.id,prompt:{source:"inline",text:`Fury review ${t} changes requested:
|
|
213
|
+
${dv(t.id,n.id,s.plan.outputSchema)}`,o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await Co(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:xn(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:xn(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),d=await S.getTask(e,c.taskId),u=d.ptyTabs.find(p=>p.kind==="agent");if(!u)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${d.id} has no agent tab.`,{});o=d.id,a=u.id,l=(await Me(e)).find(p=>p.idempotencyKey===`task-start:${d.id}`)?.id??null}else{o=xn(s.plan.target.task,t);let c=await S.getTask(e,o),d=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!d)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await st(e,c,X,d.id),a=d.id,l=(await ue.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:X})).command.id}return t=await ve(e,t.id,c=>ne(c)?{...c,cleanupPending:!0}:Ut(c,n.id,{taskId:o,agentTabId:a,commandId:l})),ne(t)||await le(e,t,n.id,"fury.step.dispatched",X,{taskId:o,agentTabId:a,commandId:l}),t}catch(i){let o=await te(e,t.id);return ne(o)?o:Eo(e,t.id,n.id,i instanceof Error?i.message:"Step dispatch failed.",X)}}async function QI(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?xn(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(d=>d.taskId===o&&d.agentTabId):null,l=await rt(e,i).catch(d=>{if(d instanceof g&&d.code==="FURY_REVIEW_NOT_FOUND")return null;throw d}),c=l??{schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:xn(r.title,t),summary:xn(r.summary,t),feedbackTarget:o?{taskId:o,agentTabId:a?.agentTabId??null}:null,round:1,requestedAt:s.toISOString(),deadlineAt:new Date(Math.min(Date.parse(t.deadlineAt),s.getTime()+r.timeoutMs)).toISOString(),version:1,lastDecision:null,history:[],updatedAt:s.toISOString()};return l||await _f(e,c),t=await ve(e,t.id,d=>ne(d)?{...d,cleanupPending:!0}:Ut(d,n.id,{state:"waiting_for_review",reviewId:i,startedAt:c.requestedAt,deadlineAt:c.deadlineAt})),ne(t)||await le(e,t,n.id,"fury.review.requested",X,{reviewId:i,title:c.title}),t}async function ZI(e,t,n,r,s,i){let o=await te(e,t),a=$h(o,n);await Oh(e,a,s,i,"fury.step.complete"),av(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await ve(e,t,c=>{if(ne(c)||c.stepRuns[n]?.state!=="running"||Date.now()>=Date.parse(c.deadlineAt))throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running or its deadline has elapsed.`,{});return Ut(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Fn(e,t),o=await te(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function ev(e,t,n,r,s,i){let o=await te(e,t),a=$h(o,n);await Oh(e,a,s,i,"fury.step.fail");let l=await Eo(e,t,n,r,s);return await $o(e,t,"failed",s),await Fn(e,t),{kind:"failFuryStep",run:await te(e,t),step:l.stepRuns[n]}}async function tv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Xe(e,r,"fury.cancel",s.rootTaskId)}if(ne(s))return s.cleanupPending&&await Fn(e,t),{kind:"cancelFury",run:await te(e,t),changed:!1};let i=new Date().toISOString(),o=!1,a=await ve(e,t,l=>ne(l)?l:(o=!0,{...l,state:"cancelled",cleanupPending:!0,cleanupError:null,completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,d])=>[c,d.state==="succeeded"?d:{...d,state:"cancelled",completedAt:i,completedBy:n}]))}));return o?(await le(e,a,null,"fury.run.cancelled",n,{}),await Fn(e,t),{kind:"cancelFury",run:await te(e,t),changed:o}):{kind:"cancelFury",run:a,changed:!1}}async function nv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Xe(e,r,"fury.resume",s.rootTaskId)}if(ne(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await Fn(e,t),{kind:"resumeFury",run:await te(e,t)}}async function rv(e,t,n){return{kind:"listFuryReviews",reviews:(await rs(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function sv(e,t){return{kind:"showFuryReview",review:await rt(e,t)}}async function iv(e,t,n,r,s,i){let o=await rt(e,t),a=await te(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can decide a fury review.",{});if(n==="resubmit"&&s.type!=="human"&&s.type!=="agent")throw new g("CAPABILITY_DENIED","Only a human or the feedback-target agent can resubmit a review.",{});if(n==="resubmit"&&s.type==="agent"){if(!o.feedbackTarget||s.taskId!==o.feedbackTarget.taskId||!i)throw new g("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await Xe(e,i,"fury.review.resubmit",s.taskId)}if(ne(a)||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(o.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} belongs to a terminal or expired run.`,{});if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await S.getTask(e,o.feedbackTarget.taskId);if(!(o.feedbackTarget.agentTabId?h.ptyTabs.find(m=>m.kind==="agent"&&m.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(m=>m.kind==="agent")))throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{})}let 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 ir(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(h.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:u,history:[...h.history,u],updatedAt:d}}),a=await ve(e,a.id,h=>{if(ne(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return Ut(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:d,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:d,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await le(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"&&await $o(e,a.id,"failed",s),await Fn(e,a.id),{kind:"actFuryReview",review:o,run:await te(e,a.id)}}async function ov(e,t,n,r){await te(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){let a=await In(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,ne(await te(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await yv(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function xn(e,t){return e.replace(GI,(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 av(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(wd(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function wd(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])?wd(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)=>wd(o,t.items,`${n}[${a}]`,r))}async function Oh(e,t,n,r,s){if(n.type!=="human"){if(n.type!=="agent"||!r||n.taskId!==t.taskId)throw new g("CAPABILITY_DENIED","The step actor does not own this fury step.",{});await Xe(e,r,s,n.taskId)}}function $h(e,t){if(ne(e))throw new g("FURY_STATE_CONFLICT",`Run ${e.id} is ${e.state}.`,{});let n=e.stepRuns[t];if(!n)throw new g("FURY_STATE_CONFLICT",`Run ${e.id} has no step ${t}.`,{});if(n.kind!=="agent"||n.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${t} is ${n.state}.`,{});return n}async function lv(e,t){let[n,r]=await Promise.all([Ch(ke(e).root),Ch(t)]),s=yd.relative(n,r);if(!s||s.startsWith("..")||yd.isAbsolute(s)||!/\.ya?ml$/i.test(s))throw new g("FURY_DEFINITION_INVALID","Fury plans must use a YAML definition stored under .craig/fury/.",{details:{file:t,furyRoot:ke(e).root}});return yd.join(".craig","fury",s)}function cv(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 dv(e,t,n){return n?`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --output '<json matching ${JSON.stringify(n)}>' --json
|
|
214
|
+
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`:`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --json
|
|
215
|
+
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function Eo(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(ne(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,Ut(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 Ut(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function uv(e,t){let n=await te(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await $o(e,t,s,X)}async function $o(e,t,n,r){let s=await te(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await ve(e,t,l=>ne(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null,...["failed","cancelled","timed_out"].includes(n)?{cleanupPending:!0,cleanupError:null,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,d])=>[c,["pending","running","waiting_for_review","changes_requested"].includes(d.state)?{...d,state:"cancelled",completedAt:o,completedBy:X}:d]))}:{}});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function pv(e){let t=new Date().toISOString();return{...e,state:"timed_out",cleanupPending:!0,cleanupError:null,updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:X}]))}}async function le(e,t,n,r,s,i){let o=_n(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await Le(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function fv(e,t){await le(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await le(e,t,null,`fury.run.${t.state}`,X,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",X,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",X,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await le(e,t,n.id,`fury.step.${n.state}`,n.completedBy??X,{reason:n.error}),!n.reviewId)continue;let r=await rt(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",X,{reviewId:r.id,title:r.title});for(let s of r.history)await le(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function mv(e,t){try{let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(c=>c.furyRunId===t.id&&(t.state==="cancelled"||t.stepRuns[c.furyStepId??""]?.state!=="succeeded")),s=new Set(r.map(c=>c.id)),i=new Set(Object.values(t.stepRuns).map(c=>c.commandId).filter(Boolean)),o=(await rs(e)).filter(c=>c.runId===t.id),a=new Set(o.map(c=>c.id));for(let c of await Me(e)){let d=c.idempotencyKey?.match(/^fury-review:([^:]+):[0-9]+$/)?.[1];c.state==="queued"&&(i.has(c.id)||s.has(c.taskId)||d&&a.has(d))&&await ue.cancel(e,c.id,X)}for(let c of r)await Ao(e,c.id);for(let c of o)await ir(e,c.id,d=>["waiting_for_review","changes_requested"].includes(d.state)?{...d,state:t.state==="timed_out"?"timed_out":"cancelled",version:d.version+1,updatedAt:new Date().toISOString()}:d);let l=await ve(e,t.id,c=>({...c,cleanupPending:!1,cleanupError:null}));await le(e,l,null,"fury.run.cleanup_completed",X,{})}catch(n){let r=n instanceof Error?n.message:"Fury cleanup failed.";await ve(e,t.id,s=>({...s,cleanupPending:!0,cleanupError:r})),t.cleanupError!==r&&await le(e,t,null,"fury.run.cleanup_failed",X,{reason:r})}}async function Fn(e,t){if(!await Dn(e))throw new g("PARTIAL_RESULT",`Fury run ${t} was saved, but its supervisor is unavailable. Start Craig for this workspace and resume the run.`,{retryable:!0,details:{runId:t,persisted:!0,reason:"ORCHESTRATION_UNAVAILABLE"}})}async function hv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId)continue;let r=await rt(e,n.reviewId),s=r.lastDecision;if(r.state!=="changes_requested"||!r.feedbackTarget||s?.action!=="request_changes"||s.feedbackCommandId||Date.now()>=Math.min(Date.parse(t.deadlineAt),Date.parse(r.deadlineAt)))continue;let i=await S.getTask(e,r.feedbackTarget.taskId),o=r.feedbackTarget.agentTabId?i.ptyTabs.find(l=>l.kind==="agent"&&l.id===r.feedbackTarget.agentTabId):i.ptyTabs.find(l=>l.kind==="agent");if(!o)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${i.id} has no agent tab.`,{});let{command:a}=await ue.create(e,{taskId:i.id,agentTabId:o.id,prompt:{source:"inline",text:`Fury review ${r.id} changes requested:
|
|
214
216
|
|
|
215
|
-
${
|
|
217
|
+
${s.message}
|
|
216
218
|
|
|
217
|
-
After revisions, resubmit with: craig fury review resubmit ${
|
|
218
|
-
Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min(
|
|
219
|
-
|
|
220
|
-
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function Eo(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(te(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,qt(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 qt(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function uv(e,t){let n=await oe(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 $o(e,t,s,Q)}async function $o(e,t,n,r){let s=await oe(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=>te(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null,...["failed","cancelled","timed_out"].includes(n)?{cleanupPending:!0,cleanupError:null}:{}});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function pv(e){let t=new Date().toISOString();return{...e,state:"timed_out",cleanupPending:!0,cleanupError:null,updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:Q}]))}}async function le(e,t,n,r,s,i){let o=_n(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await Le(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function fv(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}`,Q,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",Q,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",Q,{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??Q,{reason:n.error}),!n.reviewId)continue;let r=await Zt(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",Q,{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 mv(e,t){try{let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(a=>a.furyRunId===t.id&&(t.state==="cancelled"||t.stepRuns[a.furyStepId??""]?.state!=="succeeded")),s=new Set(r.map(a=>a.id)),i=new Set(Object.values(t.stepRuns).map(a=>a.commandId).filter(Boolean));for(let a of await Me(e))a.state==="queued"&&(i.has(a.id)||s.has(a.taskId))&&await pe.cancel(e,a.id,Q);for(let a of r)await Ao(e,a.id);for(let a of(await rs(e)).filter(l=>l.runId===t.id))await ns(e,a.id,l=>["waiting_for_review","changes_requested"].includes(l.state)?{...l,state:t.state==="timed_out"?"timed_out":"cancelled",version:l.version+1,updatedAt:new Date().toISOString()}:l);let o=await ve(e,t.id,a=>({...a,cleanupPending:!1,cleanupError:null}));await le(e,o,null,"fury.run.cleanup_completed",Q,{})}catch(n){let r=n instanceof Error?n.message:"Fury cleanup failed.";await ve(e,t.id,s=>({...s,cleanupPending:!0,cleanupError:r})),t.cleanupError!==r&&await le(e,t,null,"fury.run.cleanup_failed",Q,{reason:r})}}async function Fn(e,t){if(!await Dn(e))throw new g("PARTIAL_RESULT",`Fury run ${t} was saved, but its supervisor is unavailable. Start Craig for this workspace and resume the run.`,{retryable:!0,details:{runId:t,persisted:!0,reason:"ORCHESTRATION_UNAVAILABLE"}})}async function hv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId||n.kind!=="human_review")continue;let r=await Zt(e,n.reviewId),s=r.state==="approved"?"succeeded":r.state==="rejected"?"failed":r.state;n.state!==s&&(t=await ve(e,t.id,i=>te(i)?i:qt(i,n.id,{state:s,completedBy:r.lastDecision?.actor??Q,...["succeeded","failed","timed_out","cancelled"].includes(s)?{completedAt:r.updatedAt}:{}})))}return t}async function wd(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 te(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function _n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function gv(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Be={plan:HI,approve:YI,run:zI,show:JI,watch:ov,cancel:tv,resume:nv,completeStep:ZI,failStep:ev,listReviews:rv,showReview:sv,actOnReview:iv,reconcile:Oo};import{access as yv,stat as wv}from"node:fs/promises";import kv from"node:path";import{constants as Tv}from"node:fs";async function kd(e,t){let n=kv.resolve(e,t),r;try{r=await wv(n),await yv(n,Tv.R_OK)}catch(s){throw new g("CLI_USAGE",`File is not readable: ${n}`,{cause:s,details:{path:n}})}if(!r.isFile())throw new g("CLI_USAGE",`Path is not a regular file: ${n}`,{details:{path:n}});return n}import{createConnection as bv}from"node:net";async function Dh(e,t){let n=await Pv(Fe(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await Nh(n,{type:"ping"})).protocolVersion!==Rt?!1:((await Nh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var Rv=1;function Nh(e,t){let n=Rv++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig UI navigation request timed out."))},1e3),a=c=>{i+=String(c);let u=i.indexOf(`
|
|
221
|
-
`);if(u===-1)return;l();let d=JSON.parse(i.slice(0,u));d.ok?r(d):s(new Error(d.error??"Craig UI navigation request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
|
|
222
|
-
`)})}function Pv(e){return new Promise((t,n)=>{let r=bv(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function xh(e,t){switch(e.kind){case"addWorkspace":{let n=await be.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Td(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await be.repos.addRepo(t.paths,e.path);return await Td(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return be.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await be.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await gt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await gt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return be.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await be.archiveWorkspace(t.paths,e.workspaceId);return await vv(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await be.restoreWorkspace(t.paths,e.workspaceId);return await Td(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return be.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Ih(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),Co(t.paths,{parentTaskId:e.parentTaskId??Ut(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Ln(t),Tc(t.paths,e.taskId??Ut(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),Ao(t.paths,e.taskId??Ut(t).task.id,t.agentCapabilityId);case"validateFury":return await _h(t),rd(bd.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await _h(t),Be.plan(t.paths,bd.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Ut(t).task.id,pn(t),t.agentCapabilityId);case"approveFury":return Be.approve(t.paths,e.planId,pn(t));case"runFury":return Ln(t),Be.run(t.paths,e.planId,pn(t),t.agentCapabilityId);case"showFury":return Be.show(t.paths,e.runId);case"watchFury":return Be.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Be.cancel(t.paths,e.runId,pn(t),t.agentCapabilityId);case"resumeFury":return Be.resume(t.paths,e.runId,pn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),Be.completeStep(t.paths,e.runId,e.stepId,await Iv(e.output,t),pn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),Be.failStep(t.paths,e.runId,e.stepId,e.reason,pn(t),t.agentCapabilityId);case"listFuryReviews":return Be.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Be.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),Be.actOnReview(t.paths,e.reviewId,e.action,e.message??null,pn(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=Ut(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??Ut(t).task.id,e.title);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return S.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await kd(t.cwd??process.cwd(),e.path),s=await Dh(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,Ut(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Mn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Mn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Mn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return _t.listAgents(t.paths,e.taskId);case"showAgentStatus":return _t.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Mn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?To.waitForTaskState(t.paths,r,n):_t.waitForTask(t.paths,r,n)}case"listEvents":return To.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return To.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Tr.send(t.paths,{taskId:Mn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Tr.show(t.paths,e.commandId);case"listPromptCommands":return Tr.list(t.paths,e.taskId);case"cancelPromptCommand":return Tr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Tr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,br(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,br(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,br(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,br(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,br(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,br(t,"commit"));case"showContext":{let n=Av(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:Ea()};case"exit":return{kind:"exit"};default:return Cv(e)}}function Ln(e){if(!(!e.agentContext||e.agentCapabilityId))throw new g("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function _h(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function pn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Ut(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 Iv(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await Sv(bd.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 Td(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??Gs();await gt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function vv(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await gt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function Cv(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function br(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function Ut(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??Ut(t).task.id}function Av(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Lh(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
219
|
+
After revisions, resubmit with: craig fury review resubmit ${r.id} --summary '<revised summary>' --json
|
|
220
|
+
Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${r.id}:${s.round}`,actor:s.actor});await ir(e,r.id,l=>{if(l.state!=="changes_requested"||l.version!==r.version)return l;let c={...s,feedbackCommandId:a.id};return{...l,lastDecision:c,history:l.history.map(d=>d.sequence===s.sequence?c:d)}})}}async function gv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId||n.kind!=="human_review")continue;let r=await rt(e,n.reviewId),s=r.state==="approved"?"succeeded":r.state==="rejected"?"failed":r.state;n.state!==s&&(t=await ve(e,t.id,i=>ne(i)?i:Ut(i,n.id,{state:s,completedBy:r.lastDecision?.actor??X,...["succeeded","failed","timed_out","cancelled"].includes(s)?{completedAt:r.updatedAt}:{}})))}return t}async function kd(e){if(!k.previews.isEnabled(await k.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function ne(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function _n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function yv(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Be={plan:HI,approve:YI,run:zI,show:JI,watch:ov,cancel:tv,resume:nv,completeStep:ZI,failStep:ev,listReviews:rv,showReview:sv,actOnReview:iv,reconcile:Oo};import{access as wv,stat as kv}from"node:fs/promises";import Tv from"node:path";import{constants as bv}from"node:fs";async function Td(e,t){let n=Tv.resolve(e,t),r;try{r=await kv(n),await wv(n,bv.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 Rv}from"node:net";async function Dh(e,t){let n=await Sv(Fe(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await Nh(n,{type:"ping"})).protocolVersion!==Pt?!1:((await Nh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var Pv=1;function Nh(e,t){let n=Pv++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig UI navigation request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
|
|
221
|
+
`);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?r(u):s(new Error(u.error??"Craig UI navigation request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
|
|
222
|
+
`)})}function Sv(e){return new Promise((t,n)=>{let r=Rv(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function xh(e,t){switch(e.kind){case"addWorkspace":{let n=await be.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await bd(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await be.repos.addRepo(t.paths,e.path);return await bd(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return be.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await be.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return be.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await be.archiveWorkspace(t.paths,e.workspaceId);return await Cv(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await be.restoreWorkspace(t.paths,e.workspaceId);return await bd(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return be.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Ih(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),Co(t.paths,{parentTaskId:e.parentTaskId??Bt(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Ln(t),bc(t.paths,e.taskId??Bt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),Ao(t.paths,e.taskId??Bt(t).task.id,t.agentCapabilityId);case"validateFury":return await _h(t),sd(Rd.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await _h(t),Be.plan(t.paths,Rd.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Bt(t).task.id,pn(t),t.agentCapabilityId);case"approveFury":return Be.approve(t.paths,e.planId,pn(t));case"runFury":return Ln(t),Be.run(t.paths,e.planId,pn(t),t.agentCapabilityId);case"showFury":return Be.show(t.paths,e.runId);case"watchFury":return Be.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Be.cancel(t.paths,e.runId,pn(t),t.agentCapabilityId);case"resumeFury":return Be.resume(t.paths,e.runId,pn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),Be.completeStep(t.paths,e.runId,e.stepId,await vv(e.output,t),pn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),Be.failStep(t.paths,e.runId,e.stepId,e.reason,pn(t),t.agentCapabilityId);case"listFuryReviews":return Be.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Be.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),Be.actOnReview(t.paths,e.reviewId,e.action,e.message??null,pn(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=Bt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??Bt(t).task.id,e.title);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return S.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await Td(t.cwd??process.cwd(),e.path),s=await Dh(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,Bt(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Mn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Mn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Mn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return xt.listAgents(t.paths,e.taskId);case"showAgentStatus":return xt.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Mn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?To.waitForTaskState(t.paths,r,n):xt.waitForTask(t.paths,r,n)}case"listEvents":return To.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return To.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return br.send(t.paths,{taskId:Mn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return br.show(t.paths,e.commandId);case"listPromptCommands":return br.list(t.paths,e.taskId);case"cancelPromptCommand":return br.cancel(t.paths,e.commandId);case"waitPromptCommand":return br.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,Rr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,Rr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,Rr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,Rr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,Rr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,Rr(t,"commit"));case"showContext":{let n=Ev(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:Oa()};case"exit":return{kind:"exit"};default:return Av(e)}}function Ln(e){if(!(!e.agentContext||e.agentCapabilityId))throw new g("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function _h(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function pn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Bt(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 vv(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await Iv(Rd.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 bd(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??Gs();await yt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function Cv(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await yt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function Av(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Rr(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function Bt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??Bt(t).task.id}function Ev(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Lh(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
223
223
|
`);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
|
|
224
224
|
`);case"listRepos":return e.repos.length===0?"No repos registered yet. Use 'craig repo add <path>'.":["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
225
225
|
`);case"removeRepo":return`Removed repo ${e.repoId} (${e.rootPath})`;case"listWorkspaces":return e.workspaces.length===0?e.archivedOnly?"No archived workspaces.":"No active workspaces yet. Register one with 'craig workspace add <path>'.":["ID KIND STATUS REPOS PATH",...e.workspaces.map(t=>`${t.id} ${t.kind??"repo"} ${t.status} ${(t.discoveredRepoIds??[t.primaryRepoId]).join(",")} ${t.rootPath??""}`)].join(`
|
|
@@ -229,67 +229,67 @@ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>
|
|
|
229
229
|
`);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
|
|
230
230
|
`);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
|
|
231
231
|
`);case"planFury":return[`Planned fury ${e.plan.name}`,`Plan: ${e.plan.id}`,`Root task: ${e.plan.rootTaskId}`,`Hash: ${e.plan.planHash}`,`Steps: ${e.plan.steps.length}`,...e.plan.waves.map((t,n)=>`Wave ${n}: ${t.join(", ")}`),`Approval required: craig fury approve ${e.plan.id} --json`].join(`
|
|
232
|
-
`);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return
|
|
232
|
+
`);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return Ov(e.run);case"completeFuryStep":case"failFuryStep":return`${e.run.id} step ${e.step.id}: ${e.step.state}`;case"listFuryReviews":return e.reviews.length===0?"No fury reviews found.":["ID RUN STEP STATE ROUND TITLE",...e.reviews.map(t=>`${t.id} ${t.runId} ${t.stepId} ${t.state} ${t.round} ${t.title}`)].join(`
|
|
233
233
|
`);case"showFuryReview":return Fh(e.review);case"actFuryReview":return`${Fh(e.review)}
|
|
234
234
|
Run: ${e.run.state}`;case"watchFury":return"";case"addTaskLink":return[`Added contextual repo link ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`,`This does not provision a project task target. Use 'craig task repo add ${e.taskId} ${e.repoId}' for that.`].join(`
|
|
235
235
|
`);case"addTaskRepoTarget":return[`${e.disposition==="added"?"Added":"Found"} repo target ${e.repoId} for task ${e.taskId}`,`Branch: ${e.branch}`,`Worktree: ${e.worktreePath}`].join(`
|
|
236
236
|
`);case"listTaskLinks":return e.repos.length===0?`Task ${e.taskId} has no linked repos.`:["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
237
|
-
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${
|
|
238
|
-
`);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...
|
|
237
|
+
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${Fv(t)} ${Lv(t)} ${t.title}`)].join(`
|
|
238
|
+
`);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,..._v(e)].join(`
|
|
239
239
|
`);case"currentTask":return[`${e.task.id}: ${e.task.title}`,`Workspace: ${e.task.workspaceId}`,`Repo: ${e.task.repoId}`,`Worktree: ${e.task.worktreePath}`,`Context source: ${e.context.source}`,`Agent tab: ${e.context.agentTabId??"none"}`].join(`
|
|
240
|
-
`);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return
|
|
241
|
-
`);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return
|
|
240
|
+
`);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return Dv(e);case"listAgents":case"showAgentStatus":return Nv(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(Pd).join(`
|
|
241
|
+
`);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return $v(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
|
|
242
242
|
`);case"cancelPromptCommand":return`${e.changed?"Cancelled":"Command already cancelled:"} ${e.command.id}`;case"waitPromptCommand":return`Command ${e.command.id} reached ${e.command.state}.`;case"showContext":return[`Workspace: ${e.workspace.root}`,`Workspace source: ${e.workspace.source}`,`Initialized: ${e.workspace.initialized?"yes":"no"}`,`Task: ${e.task?.id??"none"}`,`Task source: ${e.task?.source??"none"}`,`Agent tab: ${e.task?.agentTabId??"none"}`].join(`
|
|
243
243
|
`);case"streamTaskLogs":return`Streaming logs for ${e.taskId} from ${e.logPath}`;case"showTaskDiff":return e.isEmpty?`Task ${e.taskId} has no uncommitted diff.`:e.diffText;case"openTask":return e.launched?`Opened task ${e.taskId} at ${e.worktreePath}`:e.worktreePath;case"openFile":return`Opened ${e.path} in Craig.`;case"runChecks":return`Checks ${e.status} for ${e.taskId}: ${e.commands.join(", ")}`;case"commitTask":return[`Committed task ${e.taskId}`,`Status: ${e.status}`,`Commit: ${e.commitSha}`,`Message: ${e.message}`].join(`
|
|
244
|
-
`);default:return
|
|
244
|
+
`);default:return xv(e)}}function Ov(e){return[`${e.id}: ${e.state}`,`Definition: ${e.name} (${e.definitionHash})`,`Root task: ${e.rootTaskId}`,...e.order.map(t=>{let n=e.stepRuns[t];return`${t}: ${n.state}${n.taskId?` (${n.taskId})`:""}${n.error?` - ${n.error}`:""}`})].join(`
|
|
245
245
|
`)}function Fh(e){return[`${e.id}: ${e.state}`,`Run: ${e.runId}`,`Step: ${e.stepId}`,`Round: ${e.round}`,`Title: ${e.title}`,`Summary: ${e.summary}`,`Deadline: ${e.deadlineAt}`].join(`
|
|
246
|
-
`)}function
|
|
247
|
-
`)}function
|
|
248
|
-
`)}function
|
|
249
|
-
`)}function
|
|
250
|
-
`)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let
|
|
251
|
-
`),0}catch(r){let s=
|
|
252
|
-
`),s.exitCode}}function
|
|
246
|
+
`)}function $v(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
|
|
247
|
+
`)}function Pd(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function Nv(e){return e.agents.length===0?"No agent tabs found.":["TASK TAB RUNNER STATE SESSION ERROR",...e.agents.map(t=>`${t.taskId} ${t.tabId} ${t.runner} ${t.state} ${t.sessionState??"none"} ${t.error??""}`),...e.daemonAvailable?[]:["Warning: PTY daemon unavailable; live agent tabs report idle unless a durable startup failure exists."]].join(`
|
|
248
|
+
`)}function Dv(e){let t=`${e.taskId} (${e.repoId}): ${e.disposition}`,n=e.pullRequests.length===0?["No pull requests associated."]:["PR STATUS HEAD URL",...e.pullRequests.map(r=>`#${r.number??"-"} ${r.status??"unknown"} ${r.headBranch??"-"} ${r.url??"-"}`)];return[t,...n,...e.warnings.map(r=>`Warning: ${r}`)].join(`
|
|
249
|
+
`)}function _v(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 xv(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function Fv(e){return e.checks.status}function Lv(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 Mh(e,t){let{data:n,warnings:r}=Mv(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function Mv(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function jh(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 Sd(e){let t=await be.resolveContext({cwd:e.cwd,...e.explicitWorkspaceRoot!==void 0?{explicitWorkspaceRoot:e.explicitWorkspaceRoot}:{},...e.environmentWorkspaceRoot!==void 0?{environmentWorkspaceRoot:e.environmentWorkspaceRoot}:{},...e.allowUninitializedWorkspace!==void 0?{allowUninitializedCwd:e.allowUninitializedWorkspace}:{}}),n=Oe(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 qh(e){let t="cli",n=np(e.argv);try{let r=tp(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||Gv(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 Sd({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.",{});Uv(r.command,r.options.taskId);let s=Wv(r.command,r.options.taskId),i=qv(s);Bv(s,r.options.taskId,i);let o=i!=="none",a=await Sd({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:jv(s),resolveTask:i!=="none",requireTask:i==="required"}),l=Vv(s,e.signal),c;try{c=await xh(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):Pd(u)}
|
|
250
|
+
`)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let d=n?Mh(t,c):Lh(c);return d.length>0&&e.writeStdout(`${d}
|
|
251
|
+
`),0}catch(r){let s=Ca(r),i=n?jh(t,s):s.message;return e.writeStderr(`${i}
|
|
252
|
+
`),s.exitCode}}function jv(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function qv(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="renameTask"?e.taskId?"none":"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||Kv(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 Uv(e,t){let n=Uh(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 Bv(e,t,n){if(!(t===void 0||n!=="none"||Uh(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 Uh(e){switch(e.kind){case"showTask":case"renameTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"createChildTask":return e.parentTaskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":case"addTaskRepoTarget":return e.taskId;default:return}}function Wv(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask"||e.kind==="renameTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function Vv(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 Kv(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function Gv(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as A0}from"node:module";import{readFile as Hv,stat as Yv}from"node:fs/promises";import Id from"node:path";var zv=200*1024,Jv=500*1024,No="100000";async function Wh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return Xv(e,t,n);try{let r=fn(n.selectedFilePath??null,t.filePaths),s=fn(n.selectedDiffPath??null,t.diffPaths),i=s?await Es(e.worktreePath):null,[o,a]=await Promise.all([_o(e.worktreePath,r),s?vd(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ae("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 Xv(e,t,n){let r=fn(n.selectedFilePath??null,t.filePaths),s=fn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([Kh(e,r),(async()=>{if(!s)return Ae("No diff selected","No local changes found.","empty");let l=Do(e,s),c=l?await Es(l.target.worktreePath).catch(()=>null):null;return Gh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Vh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return Qv(e,t);try{await we(e);let n=await Es(e.worktreePath),[r,s]=await Promise.all([Hh(e.worktreePath),Yh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=fn(t.selectedFilePath??null,r),a=fn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([_o(e.worktreePath,o),a?vd(e.worktreePath,a,s,n):Promise.resolve(Ae("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:Zh(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:Ae("Files unavailable",r,"error"),selectedDiff:Ae("Diff unavailable",r,"error"),error:r}}}async function Qv(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Es(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([Hh(p.worktreePath).catch(()=>[]),Yh(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:f,targetDiffRows:m}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:f}of r)s.push(...h.map(m=>`${p.repoId}/${m}`)),i.push(...f.map(m=>({...m,path:`${p.repoId}/${m.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=fn(t.selectedFilePath??null,s),l=fn(t.selectedDiffPath??null,o),[c,d]=await Promise.all([Kh(e,a),(async()=>{if(!l)return Ae("No diff selected","No local changes found.","empty");let p=Do(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return Gh(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:Zh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function Kh(e,t){let n=Do(e,t);if(!n)return Ae("No file selected","No Git-visible files found.","empty");let r=await _o(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Gh(e,t,n,r=null){let s=Do(e,t);return s?{...await vd(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}:Ae(t,"Repo target is unavailable.","error",t)}function Do(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 Hh(e){let t=await K("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return eg(t.stdout)}async function Yh(e,t){let[n,r,s,i]=await Promise.all([Zv(e,t),Bh(e,"staged"),Bh(e,"unstaged"),eC(e)]);return[...n,...r,...s,...i]}async function Zv(e,t){if(!t)return[];let[n,r]=await Promise.all([K("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),K("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=zh(n.stdout),i=Jh(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 Bh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([K("git",[...n,"--name-status"],{cwd:e}),K("git",[...n,"--numstat"],{cwd:e})]),i=zh(r.stdout),o=Jh(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 eC(e){let t=await K("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=eg(t.stdout);return await Promise.all(n.map(async s=>{let i=await _o(e,s),o=i.status==="ready"?tC(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function zh(e){return e.split(`
|
|
253
253
|
`).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function Jh(e){let t=new Map;for(let n of e.split(`
|
|
254
|
-
`)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function Es(e){return(await
|
|
255
|
-
`),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Ae(t,r,"missing",t,null)}}async function
|
|
254
|
+
`)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function Es(e){return(await Q("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await Q("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function _o(e,t){if(!t)return Ae("No file selected","No Git-visible files found.","empty");let n=nC(e,t);return Qh(n,t)}async function Xh(e){return Qh(e,e)}async function Qh(e,t){try{let n=await Yv(e);if(n.size>zv)return Ae(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await Hv(e);return rC(r)?Ae(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
|
|
255
|
+
`),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Ae(t,r,"missing",t,null)}}async function vd(e,t,n,r=null){if(!t)return Ae("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 Es(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${No}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
|
|
256
256
|
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await K("git",["diff","--cached","--stat","--patch",`--unified=${No}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
|
|
257
257
|
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await K("git",["diff","--stat","--patch",`--unified=${No}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
|
|
258
|
-
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await
|
|
258
|
+
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await Q("git",["diff","--no-index","--stat","--patch",`--unified=${No}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
|
|
259
259
|
${a.stdout.trimEnd()}`)}let o=s.join(`
|
|
260
260
|
|
|
261
|
-
`);return o.length>
|
|
262
|
-
`):["No diff for this file."],byteLength:o.length}}function Zh(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function fn(e,t){return e&&t.includes(e)?e:t[0]??null}function
|
|
263
|
-
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function
|
|
264
|
-
`}function Ad(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Fo(e){return cg(e)||Rr(e)!==null}function lg(e){return ng.includes(e)}function cg(e){return tg.includes(e)}function dg(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[V]:[]]}function iC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function oC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Os(e,t,n){return t.includes(e??"")?e:n}function aC(e){return e==="tabs"?"center":Os(e,rC,"tasks")}function lC(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Os(e,Cd,t)}function cC(e){return e==="file"||e==="diff"?e:null}function dC(e){return e==="terminal"?"terminal":"agent"}function uC(e){return e==="terminal"?"terminal":"control"}function pC(e,t=[...yt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function Lo(e,t=yt){let n=t.length>0?t:yt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Rr(e){let t=me.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function fC(e,t,n){if(!e)return{activeTab:t===V?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(cg(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??V,selectedPtyTabId:l?.id??null}}if(t===V)return{activeTab:V,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??V,selectedPtyTabId:o?.id??null}}function mC(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?hC(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function hC(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 gC(e,t){let n=jn(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function jn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of $s(Mo(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 $s(jo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Mo(e,t){return ug(e,n=>n.workspaceId===t)}function jo(e,t){return ug(e,n=>n.repoId===t)}function yC(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function ug(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function $s(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 Ed(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 Bt(e){return typeof e=="string"?e:null}function wC(e){return e?`task:${e}`:null}function Ds(e){return typeof e=="string"&&e.startsWith("task:")}function qo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Uo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function pg(e){return typeof e=="string"&&e.startsWith("workspace:")}function Bo(e){return qo(e)?e.slice(9):null}function Wo(e){return Uo(e)?e.slice(19):null}async function Pr(e,t,n){let r=Oe(e),[s,i]=await Promise.all([be.repos.listRegisteredRepos(r),be.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await rt(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r)}let[u,d]=await Promise.all([k.previews.isEnabled(l,"agentOrchestration")?Ef(r):[],rs(r)]);c=(k.previews.isEnabled(l,"agentOrchestration")?u.length:0)+d.filter(m=>m.state==="waiting_for_review"||m.state==="changes_requested").length;let p=Od(o.tasks,t),h=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},f=p?await Vh(p,h):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:f,furyApprovalCount:c,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function Od(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function fg(e,t){return Ns(e,t)}import Ud from"node:path";import mK from"picocolors";var kC=[" \u2584\u2588\u2588\u2588\u2588\u2584 \u2588\u2588\u2580\u2588\u2588\u2588 \u2584\u2584\u2584 \u2588\u2588\u2593 \u2584\u2588\u2588\u2588\u2588"," \u2592\u2588\u2588\u2580 \u2580\u2588 \u2593\u2588\u2588 \u2592 \u2588\u2588\u2592\u2592\u2588\u2588\u2588\u2588\u2584 \u2593\u2588\u2588\u2592 \u2588\u2588\u2592 \u2580\u2588\u2592"," \u2592\u2593\u2588 \u2584 \u2593\u2588\u2588 \u2591\u2584\u2588 \u2592\u2592\u2588\u2588 \u2580\u2588\u2584 \u2592\u2588\u2588\u2592\u2592\u2588\u2588\u2591\u2584\u2584\u2584\u2591"," \u2592\u2593\u2593\u2584 \u2584\u2588\u2588\u2592\u2592\u2588\u2588\u2580\u2580\u2588\u2584 \u2591\u2588\u2588\u2584\u2584\u2584\u2584\u2588\u2588 \u2591\u2588\u2588\u2591\u2591\u2593\u2588 \u2588\u2588\u2593"," \u2592 \u2593\u2588\u2588\u2588\u2580 \u2591\u2591\u2588\u2588\u2593 \u2592\u2588\u2588\u2592 \u2593\u2588 \u2593\u2588\u2588\u2592\u2591\u2588\u2588\u2591\u2591\u2592\u2593\u2588\u2588\u2588\u2580\u2592"," \u2591 \u2591\u2592 \u2592 \u2591\u2591 \u2592\u2593 \u2591\u2592\u2593\u2591 \u2592\u2592 \u2593\u2592\u2588\u2591\u2591\u2593 \u2591\u2592 \u2592"," \u2591 \u2592 \u2591\u2592 \u2591 \u2592\u2591 \u2592 \u2592\u2592 \u2591 \u2592 \u2591 \u2591 \u2591"," \u2591 \u2591\u2591 \u2591 \u2591 \u2592 \u2592 \u2591\u2591 \u2591 \u2591"," \u2591 \u2591 \u2591 \u2591 \u2591 \u2591 \u2591"," \u2591"];function $d(){return[...kC]}var Vo={width:120,height:36},ee={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function We(e,t){return{width:Math.max(e??Vo.width,Vo.width),height:Math.max(t??Vo.height,Vo.height)}}function _s(e,t=!1){let s=ee.topRailHeight+1,i=e.height-ee.topRailHeight-1,o={row:s,height:i,column:t?2:35,width:t?e.width-2:e.width-32-34-4};return{left:t?null:{row:s,height:i,column:2,width:32},center:o,right:t?null:{row:s,height:i,column:e.width-34,width:34}}}function mg(e,t=!1){let n=_s(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var TC=["Start","Options","Exit"],bC=["Resume","Options","Exit"],wg=2,kg=2,Go=2,RC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),PC=new RegExp("\x1B\\[(?:0)?m","g"),SC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),IC=/https?:\/\/[^\s<>"']+/g,Dd="\x1B[0m",Fd="\x1B]8;;\x1B\\",C={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},Nd=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Tg(e,t={}){let n=t.panelPolish?t.splashSummary:void 0,r=n&&(n.workspaceCount>0||n.taskCount>0);return Yo(e,{panelPolish:t.panelPolish??!1,subtitle:t.panelPolish?"A workspace for your coding agents.":"crAIg is that you?",details:n?vC(n,t.color??!0):[],menuItems:r?["Resume workspace","Options","Exit"]:TC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function vC(e,t){let n=(i,o,a=`${o}s`)=>`${i} ${i===1?o:a}`;if(e.workspaceCount===0&&e.taskCount===0)return["Your workspace starts here.","Add a repo, then start your first task."];let r=`${n(e.workspaceCount,"workspace")} \xB7 ${n(e.taskCount,"open task")}`;if(!e.activityKnown)return[`${r} \xB7 Checking agent activity\u2026`];let s=[...e.workingAgents?[`${n(e.workingAgents,"agent")} working`]:[],...e.readyAgents?[`${e.readyAgents} ready`]:[],...e.attentionAgents?[Fs(`${e.attentionAgents} ${e.attentionAgents===1?"needs":"need"} attention`,t,C.pending.fg,C.overlay)]:[]];return[`${r} \xB7 ${s.join(" \xB7 ")||"No agents running"}`]}function bg(e,t={}){return Yo(e,{panelPolish:t.panelPolish??!1,subtitle:"Control mode is paused.",menuItems:bC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Rg(e,t,n={}){let r=`npm install -g craig-cli@${t.latest}`,i=t.phase==="installing"?{subtitle:`Updating Craig \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Updating\u2026"],message:r}:t.phase==="success"?{subtitle:`Craig ${t.latest} installed \xB7 restart to use it`,menuItems:["Continue","Exit Craig"],message:"The current Craig session is still running the previous version."}:t.phase==="error"?{subtitle:"Craig update failed",menuItems:["Retry","Continue"],message:t.error??"npm could not install the update."}:{subtitle:`Update available \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Update now","Continue","Ignore this version"],message:`Release notes: https://github.com/hallsamuel90/craig/releases/latest
|
|
265
|
-
Runs: ${r}`};return
|
|
266
|
-
`)}function Sg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i="Logs",o=t.logPath??"",a=t.logLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),
|
|
267
|
-
`)}function
|
|
268
|
-
`),center:m,regions:{rail:D,left:_,center:m,right:A,footer:Y}}}function
|
|
269
|
-
`),center:i,regions:{rail:l,left:c,center:i,right:
|
|
270
|
-
`),s={bg:C.overlay.bg,fg:C.accent.fg},i=B(" ",t.color,C.overlay),o=B("\u2502",t.color,s);return[
|
|
271
|
-
`)}function hg(e,t){let n=new Array(e.height).fill(B(" ".repeat(e.width),t.color,C.overlay)),r
|
|
272
|
-
`)]:[],o=[...s,...i];for(;o.length<
|
|
273
|
-
`)}function zo(e,t,n,r,s){let i=[n.versionText,n.updateText].filter(Boolean).join(" ");if(!i)return B(mt(e,t),r,s);let o=jd(i,Math.max(0,t-2)),a=Math.max(0,t-Ee(o)-2),l=n.updateText?Cr(o,r,s):xs(o,r,s);return B(`${mt(e,a)} ${l} `,r,s)}function Ng(e,t,n,r){let s=_C(e.runners),i=1,o=e.leftTree.map(l=>DC(l,t,r));return[...Ir(o,n-i),s]}function $C(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Fo(s)?e.centerTranscript.map(o=>({...o})):_g(e);return Ir([...Dg(e,t,r),...i],n)}function Dg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:KC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?qn(a,n,C.panelBg):Cr(a,n,C.panelMuted)}`,c=[`${Cr(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),u=Fg(e.tabs,n,e.focusedRegion==="center"),d=" engaged ",p=d.length+2,h=e.inputMode==="terminal"?qn(`${d}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ee(u)-p)):"";return[{text:e.inputMode==="terminal"?`${u}${f}${h}`:u},{text:l,tone:"muted"},{text:c},ft()]}function _g(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},ft(),{text:e.terminal.error},ft(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(xd)}function xd(e){return{text:qd(e.segments),segments:e.segments,fullBleed:!0}}function xg(e,t,n,r){let s=e.rightInspection?NC(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,n):Ir([{text:"CONTEXT"},ft(),...e.rightContext.map(i=>xC(i,r)),...e.actionMessage?[ft(),{text:e.actionMessage}]:[]],n);return Ir(s,n)}function NC(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:GC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>gg(a)),...r.slice(o,o+s).map(a=>gg(a))]}function gg(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 DC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${qn("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ee(m.text),0):0,l=t-Ee(i)-Ee(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",u=e.selected?e.text:e.focused?qn(e.text,n,C.panelBg):e.panelHeader?Cr(e.text,n,C.panelMuted):e.text,d=mt(`${r}${c}${u}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=d.slice(f.length+2),y=[{text:f},Lg(e.activity,e.activityAnimationFrame??0,e.unread),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:qd(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${d}${i}${o}`},...e.prBadge];return{text:`${d}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${d}${i}${o}`,tone:p}}function _C(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:C.success.fg}}):n.push({text:s.text,style:{fg:C.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function Fg(e,t,n){return e.map(r=>{let s=r.active?n?qn(r.label,t,C.panelBg):Cr(r.label,t,C.panelBg):xs(r.label,t,C.panelBg),i=r.activity?Md(Lg(r.activity,r.activityAnimationFrame??0,r.unread),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Lg(e,t,n=!0){let r=e==="working"?Nd[t%Nd.length]??Nd[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg;return{text:e==="ready"&&!n?"\u25CB":"\u25CF",style:{fg:r}}}function xC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xs(e.value,t,C.panelBg):e.value}`}}function Sr(e,t,n,r,s=!1){let i=FC(r,e.tone??"default"),o=Mg(e,n,i);if(r==="left"){let l=s?1:wg,c=s?1:kg;if(e.fullBleed)return B(mt(o,t),n,i);let u=t-l-c;if(e.rightAlign){let p=Ee(o),h=Math.max(0,u-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return B(f,n,i)}let d=`${" ".repeat(l)}${mt(o,u)}${" ".repeat(c)}`;return B(d,n,i)}return r==="center"&&e.fullBleed?LC(e,t,n,i):B(mt(` ${o}`,t),n,i)}function FC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function Ir(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(ft());return n}function ft(){return{text:""}}function Mg(e,t,n){return e.segments?e.segments.map(r=>Md(r,t,n)).join(""):e.text}function LC(e,t,n,r){let s=" ".repeat(Go),i=Math.max(0,t-Go*2);if(!e.segments)return B(`${s}${mt(e.text,i)}${s}`,n,r);let o=qC(e.segments,i),a=`${s}${o.map(l=>Md(l,n,r)).join("")}${s}${n?Fd:""}`;return B(a,n,r)}function Md(e,t,n){let r=e.href?`${jg(e.href)}${e.text}${Fd}`:MC(e.text);return!t||!e.style?r:`${vr(WC(e.style,n))}${VC(e.style)}${r}${Dd}${vr(n)}`}function MC(e){return e.replace(IC,t=>{let[n,r]=jC(t);return`${jg(n)}${n}${Fd}${r}`})}function jC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function jg(e){return`\x1B]8;;${e}\x1B\\`}function qC(e,t){let n=UC(e,t);return BC(n,t)}function UC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ee(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Jo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function BC(e,t){let n=Ee(qd(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 WC(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 VC(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 KC(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 qg(e,t){let n=Math.max(0,t-Ee(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function mt(e,t){let n=Ee(e);return n>=t?jd(e,t):e+" ".repeat(t-n)}function jd(e,t){if(t<=0)return"";if(Ee(e)<=t)return e;let n=Bg(e);return Jo(n,Math.max(0,t-1))+"\u2026"}function Ee(e){let t=0;for(let n of Array.from(Bg(e)))t+=Ug(n);return t}function Jo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Ug(s);if(r+i>t)break;n+=s,r+=i}return n}function Ug(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 GC(e,t,n){return Math.min(Math.max(e,t),n)}function Bg(e){return e.replace(SC,"").replace(RC,"")}function qd(e){return e.map(t=>t.text).join("")}function B(e,t,n){if(!t)return e;let r=vr(n),s=e.replace(PC,`${Dd}${r}`);return`${r}${s}${Dd}`}function vr(e){let t=[];return e.fg&&t.push(`38;2;${yg(e.fg).join(";")}`),e.bg&&t.push(`48;2;${yg(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function yg(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function qn(e,t,n){return Fs(e,t,C.success.fg,n)}function HC(e,t,n){return Fs(e,t,C.error.fg,n)}function Cr(e,t,n){return Fs(e,t,C.accent.fg,n)}function xs(e,t,n){return Fs(e,t,C.mutedfg.fg,n)}function Fs(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${vr(s)}${e}${vr(r)}`}function Wg(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"?zC(s,r?.runner):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:YC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function YC(e,t){let n=(e??"").split(Ud.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Ud.delimiter):[...n,t].join(Ud.delimiter)}function zC(e,t){let n=e.command.length>0?e.command:["codex"];return vo(n,e.runner??t??"codex")}function Vg(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 Vt(e,t=!1,n=!1){if(t){let r=mg(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth-Go*2),rows:Math.max(5,e.height-ee.topRailHeight-5)}}function Kg(e){return e.length===1||et(e)||e==="BACKSPACE"||e==="TAB"}function Kt(e){return typeof e=="string"&&new RegExp(`:(?:agent|${me.join("|")})(?:-\\d+)?$`).test(e)}function Gg(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 Bd(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Hg(e){let t=new RegExp("\x1B\\[<(\\d+);\\d+;\\d+[mM]").exec(e);if(!t?.[1])return 0;let n=Number.parseInt(t[1],10);return n===64?-3:n===65?3:0}function Ls(e){return zg.includes(e)?"SHIFT_ENTER":null}function Wd(e){return zg.some(t=>t.startsWith(e))}function Yg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var zg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Jg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
261
|
+
`);return o.length>Jv?Ae(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ae(t,"Binary diff preview is not available in Craig.","binary",t,o.length):{path:t,status:o.length>0?"ready":"empty",title:t,lines:o.length>0?o.split(`
|
|
262
|
+
`):["No diff for this file."],byteLength:o.length}}function Zh(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function fn(e,t){return e&&t.includes(e)?e:t[0]??null}function tC(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function eg(e){return[...new Set(e.split(`
|
|
263
|
+
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function nC(e,t){let n=Id.resolve(e,t),r=Id.resolve(e);if(n!==r&&!n.startsWith(`${r}${Id.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function rC(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ae(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var sC=["tasks","center","inspector","actions"],tg=["agent","terminal"],ng=[],V="inspection",sK=[...tg,...ng],Cd=["commit","push","refresh-checks","close-task"],rg=["refresh-checks","close-task"],sg=["task","checks","pr","setup-run","actions","next-action"],Ad=["files","review"];function ig(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=dC(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:pC(e?.inputMode),focusedRegion:lC(e?.focusedRegion),selectedRepoId:Wt(e?.selectedRepoId),selectedWorkspaceId:Wt(e?.selectedWorkspaceId),selectedTaskId:Wt(e?.selectedTaskId),selectedPtyTabId:Wt(e?.selectedPtyTabId),selectedLeftItemId:kC(Wt(e?.selectedTaskId)),activeTab:n?V:Wt(e?.activeTab)??"agent",preferredPtyTabKind:uC(e?.preferredPtyTabKind),inspectorSection:Os(e?.inspectorSection,sg,"task"),inspectionMode:cC(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:Wt(e?.selectedFileTreePath),selectedFilePath:Wt(e?.selectedFilePath),selectedDiffPath:Wt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Os(e?.selectedActionId,Cd,"commit"),selectedProjectTargetId:null,selectedRunner:fC(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:iC(),centerZoomed:!1,readAgentActivityAt:e?.readAgentActivityAt??{}}}function iC(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function xo(e,t){return{...e??Gs(),selectedRepoId:t.selectedRepoId,selectedWorkspaceId:t.selectedWorkspaceId,selectedTaskId:t.selectedTaskId,selectedPtyTabId:t.selectedPtyTabId,inputMode:t.inputMode,focusedRegion:t.focusedRegion,activeTab:t.activeTab,preferredPtyTabKind:t.preferredPtyTabKind,inspectorSection:t.inspectorSection,inspectionMode:t.inspectionMode,openInspectionKind:t.openInspectionKind,selectedFileTreePath:t.selectedFileTreePath,selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath,collapsedFileTreePaths:t.collapsedFileTreePaths,selectedActionId:t.selectedActionId,selectedRunner:t.selectedRunner,readAgentActivityAt:t.readAgentActivityAt}}function Ns(e,t,n={}){let r=yC(e,t),s=Od(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?wC(t.tasks,i):null,a=Wo(r),l=Bo(r),c=t.workspaces?.find(f=>f.id===a)??(l?t.workspaces?.find(f=>f.kind==="repo"&&f.primaryRepoId===l):null)??(s?.kind==="workspace"?t.workspaces?.find(f=>f.id===s.id)??null:null)??(o?t.workspaces?.find(f=>f.id===o.workspaceId)??null:null)??t.workspaces?.find(f=>f.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,u=(t.repos.find(f=>f.id===l)??(s?.kind==="repo"?t.repos.find(f=>f.id===s.id)??null:o?t.repos.find(f=>f.id===o.repoId)??null:null)??(c?.kind==="project"?t.repos.find(f=>f.id===e.selectedRepoId&&c.discoveredRepoIds?.includes(f.id))??null:null)??(c?.kind!=="project"?t.repos.find(f=>f.id===c?.primaryRepoId)??null:null)??t.repos.find(f=>f.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,p=c?Mo(t.tasks,c.id):u?jo(t.tasks,u):[],h=(s?.kind==="task"?p.find(f=>f.id===s.id)??null:null)??p.find(f=>f.id===e.selectedTaskId)??p[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:c?.id??null,selectedRepoId:u,selectedTaskId:h?.id??null,...mC(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:aC(e,t,h?.id??null),...hC(e,t,h?.id??null),selectedDiffPath:oC(e,t,h?.id??null),inspectorSection:Os(e.inspectorSection,sg,"task")}}function Vt(e,t){return{...e,terminal:t}}function og(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function ag(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function et(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
264
|
+
`}function Ed(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Fo(e){return cg(e)||Pr(e)!==null}function lg(e){return ng.includes(e)}function cg(e){return tg.includes(e)}function dg(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[V]:[]]}function oC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function aC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Os(e,t,n){return t.includes(e??"")?e:n}function lC(e){return e==="tabs"?"center":Os(e,sC,"tasks")}function cC(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Os(e,Ad,t)}function dC(e){return e==="file"||e==="diff"?e:null}function uC(e){return e==="terminal"?"terminal":"agent"}function pC(e){return e==="terminal"?"terminal":"control"}function fC(e,t=[...wt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function Lo(e,t=wt){let n=t.length>0?t:wt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Pr(e){let t=me.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function mC(e,t,n){if(!e)return{activeTab:t===V?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(cg(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??V,selectedPtyTabId:l?.id??null}}if(t===V)return{activeTab:V,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??V,selectedPtyTabId:o?.id??null}}function hC(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?gC(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function gC(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 yC(e,t){let n=jn(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function jn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of $s(Mo(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 $s(jo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Mo(e,t){return ug(e,n=>n.workspaceId===t)}function jo(e,t){return ug(e,n=>n.repoId===t)}function wC(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function ug(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function $s(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 Od(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 Wt(e){return typeof e=="string"?e:null}function kC(e){return e?`task:${e}`:null}function Ds(e){return typeof e=="string"&&e.startsWith("task:")}function qo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Uo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function pg(e){return typeof e=="string"&&e.startsWith("workspace:")}function Bo(e){return qo(e)?e.slice(9):null}function Wo(e){return Uo(e)?e.slice(19):null}async function Sr(e,t,n){let r=Oe(e),[s,i]=await Promise.all([be.repos.listRegisteredRepos(r),be.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await st(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r)}let[d,u]=await Promise.all([k.previews.isEnabled(l,"agentOrchestration")?Ef(r):[],rs(r)]);c=(k.previews.isEnabled(l,"agentOrchestration")?d.length:0)+u.filter(m=>m.state==="waiting_for_review"||m.state==="changes_requested").length;let p=$d(o.tasks,t),h=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},f=p?await Vh(p,h):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:f,furyApprovalCount:c,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function $d(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function fg(e,t){return Ns(e,t)}import Ud from"node:path";import hK from"picocolors";var TC=[" \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 Nd(){return[...TC]}var Vo={width:120,height:36},ee={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function We(e,t){return{width:Math.max(e??Vo.width,Vo.width),height:Math.max(t??Vo.height,Vo.height)}}function _s(e,t=!1){let s=ee.topRailHeight+1,i=e.height-ee.topRailHeight-1,o={row:s,height:i,column:t?2:35,width:t?e.width-2:e.width-32-34-4};return{left:t?null:{row:s,height:i,column:2,width:32},center:o,right:t?null:{row:s,height:i,column:e.width-34,width:34}}}function mg(e,t=!1){let n=_s(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var bC=["Start","Options","Exit"],RC=["Resume","Options","Exit"],wg=2,kg=2,Go=2,PC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),SC=new RegExp("\x1B\\[(?:0)?m","g"),IC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),vC=/https?:\/\/[^\s<>"']+/g,_d="\x1B[0m",Ld="\x1B]8;;\x1B\\",C={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},Dd=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Tg(e,t={}){let n=t.panelPolish?t.splashSummary:void 0,r=n&&(n.workspaceCount>0||n.taskCount>0);return zo(e,{panelPolish:t.panelPolish??!1,subtitle:t.panelPolish?"A workspace for your coding agents.":"crAIg is that you?",details:n?CC(n,t.color??!0):[],menuItems:r?["Resume workspace","Options","Exit"]:bC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function CC(e,t){let n=(i,o,a=`${o}s`)=>`${i} ${i===1?o:a}`;if(e.workspaceCount===0&&e.taskCount===0)return["Your workspace starts here.","Add a repo, then start your first task."];let r=`${n(e.workspaceCount,"workspace")} \xB7 ${n(e.taskCount,"open task")}`;if(!e.activityKnown)return[`${r} \xB7 Checking agent activity\u2026`];let s=[...e.workingAgents?[`${n(e.workingAgents,"agent")} working`]:[],...e.readyAgents?[`${e.readyAgents} ready`]:[],...e.attentionAgents?[Fs(`${e.attentionAgents} ${e.attentionAgents===1?"needs":"need"} attention`,t,C.pending.fg,C.overlay)]:[]];return[`${r} \xB7 ${s.join(" \xB7 ")||"No agents running"}`]}function bg(e,t={}){return zo(e,{panelPolish:t.panelPolish??!1,subtitle:"Control mode is paused.",menuItems:RC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Rg(e,t,n={}){let r=`npm install -g craig-cli@${t.latest}`,i=t.phase==="installing"?{subtitle:`Updating Craig \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Updating\u2026"],message:r}:t.phase==="success"?{subtitle:`Craig ${t.latest} installed \xB7 restart to use it`,menuItems:["Continue","Exit Craig"],message:"The current Craig session is still running the previous version."}:t.phase==="error"?{subtitle:"Craig update failed",menuItems:["Retry","Continue"],message:t.error??"npm could not install the update."}:{subtitle:`Update available \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Update now","Continue","Ignore this version"],message:`Release notes: https://github.com/hallsamuel90/craig/releases/latest
|
|
265
|
+
Runs: ${r}`};return zo(e,{subtitle:i.subtitle,menuItems:i.menuItems,menuIndex:n.menuIndex??0,optionsMessage:i.message,color:n.color??!0})}var Ko=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],AC=["Help"],EC=5;function Yo(e,t={}){return zo(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??AC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Pg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i=Nd(),o=Math.max(1,Math.floor((e.height-i.length-2-Ko.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=B(qg(i[d]??"",e.width),n,C.overlayLogo);let a=Math.max(...Ko.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Ko.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Ko[d]??"";s[u]=B(ht(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
266
|
+
`)}function Sg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i="Logs",o=t.logPath??"",a=t.logLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),d=[{text:i,tone:"selected"},{text:o,tone:"muted"},mt(),...a.length>0?a.map(h=>({text:h,tone:OC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],mt(),{text:"Esc returns to Options.",tone:"muted"}],u=vr(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let f=p+h;if(f>=e.height)break;let m=u[h]??mt(),y=`${" ".repeat(c)}${Xo(m.text,l)}`,T=m.tone==="selected"?C.overlayMenuSelected:m.tone==="info"?{...C.overlay,fg:C.accent.fg}:m.tone==="warning"?{...C.overlay,fg:C.pending.fg}:m.tone==="error"?{...C.overlay,fg:C.error.fg}:m.tone==="muted"?C.overlay:C.panelBg;s[f]=B(ht(y,e.width),n,T)}return s.join(`
|
|
267
|
+
`)}function OC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function Ig(e,t,n={}){if(n.panelPolish)return $C(e,t,n);let r=n.color??!0,s=ee.leftWidth,i=ee.rightWidth,o=n.centerOnly??!1,a=e.height-ee.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:C.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:C.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:C.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=Jo(p,e.width,n,r,C.rail),f=Ng(t,s-wg-kg,a,r),m=Md(e,t,{color:r,centerOnly:o}),y=xg(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let w=0;w<a;w+=1)if(!o){let z=Ir(f[w]??mt(),s,r,"left"),yn=B("\u2502",r,d),ya=B("\u2502",r,u),qs=Ir(y[w]??mt(),i,r,"right");R.push(`${z}${yn}`),b.push(`${ya}${qs}`)}let $=T||t.modalInput?C.panelBg:C.panelMuted,N=$g(t.footerText,t.footerToast,e.width,r,$),D={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:ee.topRailHeight+1,column:1,width:s+ee.dividerWidth,rows:R},A=o?null:{row:ee.topRailHeight+1,column:m.column+m.width,width:ee.dividerWidth+i,rows:b},Y={row:e.height,column:1,width:e.width,rows:[N]},_e=o?m.rows:m.rows.map((w,z)=>`${R[z]??""}${w}${b[z]??""}`);return{frame:[h,..._e,N].join(`
|
|
268
|
+
`),center:m,regions:{rail:D,left:_,center:m,right:A,footer:Y}}}function Md(e,t,n={}){if(n.panelPolish)return Cg(e,t,n);let r=n.color??!0,s=Og(e,n.centerOnly??!1),i=NC(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Ir(o,s.width,r,"center"))}}function vg(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Fo(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;if(r.panelPolish){let c=_s(e,r.centerOnly).center;return{row:c.row,column:c.column,width:c.width,rowCount:c.height,rows:[...new Set(n)].filter(d=>d+2<c.height-1).map(d=>({index:d+2,row:Eg(Fd(t.terminal.rows[d]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=Og(e,r.centerOnly??!1),a=Dg(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:Ir(Fd(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function $C(e,t,n){let r=n.color??!0,s=_s(e,n.centerOnly),i=Cg(e,t,n),o=B(" ",r,C.panelBg),a=` CRAIG ${xs("/",r,C.panelBg)} ${xs(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[Jo(a,e.width,n,r,C.rail)]},c=null,d=null;if(s.left&&s.right){let y=t.leftTree.filter(_=>!_.panelHeader).map(_=>({..._,indent:Math.floor((_.indent??0)/2)})),T=Ng({...t,leftTree:y},s.left.width-4,s.left.height-2,r),R=t.focusedRegion==="tasks"?qn("WORKSPACES",r,C.panelBg):Ar("WORKSPACES",r,C.panelBg),b=xd(T,R,s.left,t.focusedRegion==="tasks",r,"left");c={row:s.left.row,column:1,width:s.left.width+2,rows:b.map(_=>`${o}${_}${o}`)};let $=xg(t,s.right.width-2,s.right.height-1,r),N=Mg($[0]??{text:"Inspector"},r,C.panelBg).trim(),D=xd($.slice(1),N,s.right,t.focusedRegion==="inspector"||t.focusedRegion==="actions",r,"right");d={row:s.right.row,column:i.column+i.width,width:s.right.width+2,rows:D.map(_=>`${o}${_}${o}`)}}let u=t.modalInput?C.panelBg:C.panelMuted,p=$g(t.footerText,t.footerToast,e.width,r,u),h=t.modalInput?p:p.replace(/( {2,})(Tab|Enter|Esc|Ctrl\+\]|[ntxar?q+z]|↑↓\/PgUp\/PgDn)(?= )/g,(y,T,R)=>`${T}${B(R,r,C.panelSelected)}${r?Cr(u):""}`),f={row:e.height,column:1,width:e.width,rows:[h]},m=i.rows.map((y,T)=>c&&d?`${c.rows[T]}${y}${d.rows[T]}`:`${o}${y}${o}`);return{frame:[l.rows[0],...m,f.rows[0]].join(`
|
|
269
|
+
`),center:i,regions:{rail:l,left:c,center:i,right:d,footer:f}}}function Cg(e,t,n){let r=n.color??!0,s=_s(e,n.centerOnly).center,i=t.tabs.find(d=>d.active)?.id??"agent",o=t.centerHeader.tabLabel==="BROWSER"||!Fo(i)?t.centerTranscript.map(d=>({...d})):_g(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=Fg(t.tabs,r,t.focusedRegion==="center"),c=xd([{text:a,tone:"muted"},...o],l,s,t.focusedRegion==="center",r,"center",t.inputMode==="terminal");return{row:s.row,column:s.column,width:s.width,rows:c}}function Ag(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function xd(e,t,n,r,s,i,o=!1){let a=Ag(r,o),l=jd(t,n.width-6),c=`${B("\u256D\u2500 ",s,a)}${B(l,s,r?a:C.panelMuted)}${B(` ${"\u2500".repeat(Math.max(0,n.width-Ee(l)-5))}\u256E`,s,a)}`,d=vr(e,n.height-2).map(u=>Eg(u,n.width,r,s,i,o));return[c,...d,B(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function Eg(e,t,n,r,s,i=!1){let o=B("\u2502",r,Ag(n,i)),a=s==="right"?`${Ir(e,t-3,r,s)}${B(" ",r,C.panelBg)}`:Ir(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function Og(e,t){return{row:ee.topRailHeight+1,column:t?1:ee.leftWidth+ee.dividerWidth+1,width:t?e.width:e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth*2,rowCount:e.height-ee.topRailHeight-1}}function $g(e,t,n,r,s){let i=` ${e}`;if(!t)return B(ht(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ee(o),l=Ee(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?Xo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Ee(d)-a-2),p=t.tone==="error"?YC(o,r,s):qn(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return B(ht(h,n),r,s)}function zo(e,t){if(!t.panelPolish)return hg(e,t);let n=e.width-4,r=hg({width:n,height:e.height-4},{...t,versionText:null,updateText:null}).split(`
|
|
270
|
+
`),s={bg:C.overlay.bg,fg:C.accent.fg},i=B(" ",t.color,C.overlay),o=B("\u2502",t.color,s);return[Jo("",e.width,t,t.color,C.overlay),`${i}${B(`\u256D${"\u2500".repeat(n)}\u256E`,t.color,s)}${i}`,...r.map(a=>`${i}${o}${a}${o}${i}`),`${i}${B(`\u2570${"\u2500".repeat(n)}\u256F`,t.color,s)}${i}`,B(" ".repeat(e.width),t.color,C.overlay)].join(`
|
|
271
|
+
`)}function hg(e,t){let n=new Array(e.height).fill(B(" ".repeat(e.width),t.color,C.overlay)),r=Nd(),s=t.menuItems.map((d,u)=>`${u===t.menuIndex?">":" "} ${d}`),i=t.optionsMessage?["",...t.optionsMessage.split(`
|
|
272
|
+
`)]:[],o=[...s,...i];for(;o.length<EC;)o.push("");let a=t.details?.length?["",...t.details]:[],l=[...r,"",t.subtitle,...a,"",...o],c=Math.max(1,Math.floor((e.height-l.length)/2));for(let d=0;d<l.length;d+=1){let u=qg(l[d]??"",e.width);if(d<r.length){n[c+d]=B(u,t.color,C.overlayLogo);continue}if(d===r.length+1){n[c+d]=B(u,t.color,C.overlaySubtitle);continue}let p=d-(r.length+3+a.length),f=p>=0&&p<t.menuItems.length&&p===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[c+d]=B(u,t.color,f)}return n[0]=Jo("",e.width,t,t.color,C.overlay),n.join(`
|
|
273
|
+
`)}function Jo(e,t,n,r,s){let i=[n.versionText,n.updateText].filter(Boolean).join(" ");if(!i)return B(ht(e,t),r,s);let o=jd(i,Math.max(0,t-2)),a=Math.max(0,t-Ee(o)-2),l=n.updateText?Ar(o,r,s):xs(o,r,s);return B(`${ht(e,a)} ${l} `,r,s)}function Ng(e,t,n,r){let s=xC(e.runners),i=1,o=e.leftTree.map(l=>_C(l,t,r));return[...vr(o,n-i),s]}function NC(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Fo(s)?e.centerTranscript.map(o=>({...o})):_g(e);return vr([...Dg(e,t,r),...i],n)}function Dg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:GC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?qn(a,n,C.panelBg):Ar(a,n,C.panelMuted)}`,c=[`${Ar(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=Fg(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?qn(`${u}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ee(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${f}${h}`:d},{text:l,tone:"muted"},{text:c},mt()]}function _g(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},mt(),{text:e.terminal.error},mt(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(Fd)}function Fd(e){return{text:qd(e.segments),segments:e.segments,fullBleed:!0}}function xg(e,t,n,r){let s=e.rightInspection?DC(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,n):vr([{text:"CONTEXT"},mt(),...e.rightContext.map(i=>FC(i,r)),...e.actionMessage?[mt(),{text:e.actionMessage}]:[]],n);return vr(s,n)}function DC(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:HC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>gg(a)),...r.slice(o,o+s).map(a=>gg(a))]}function gg(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 _C(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${qn("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ee(m.text),0):0,l=t-Ee(i)-Ee(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?qn(e.text,n,C.panelBg):e.panelHeader?Ar(e.text,n,C.panelMuted):e.text,u=ht(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=u.slice(f.length+2),y=m.trimEnd(),T=m.slice(y.length),R=[{text:f},Lg(e.activity,e.activityAnimationFrame??0),{text:" "},{text:y,style:{bold:e.unread===!0}},{text:`${T}${i}${o}`},...e.prBadge??[]];return{text:qd(R),segments:R,tone:p}}if(e.prBadge){let f=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function xC(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:C.success.fg}}):n.push({text:s.text,style:{fg:C.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function Fg(e,t,n){return e.map(r=>{let s=r.active?n?qn(r.label,t,C.panelBg):Ar(r.label,t,C.panelBg):xs(r.label,t,C.panelBg);r.unread&&(s=Ho({text:s,style:{bold:!0}},t,C.panelBg));let i=r.activity?Ho(Lg(r.activity,r.activityAnimationFrame??0),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Lg(e,t){return{text:"\u25CF",style:{fg:e==="working"?Dd[t%Dd.length]??Dd[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg}}}function FC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xs(e.value,t,C.panelBg):e.value}`}}function Ir(e,t,n,r,s=!1){let i=LC(r,e.tone??"default"),o=Mg(e,n,i);if(r==="left"){let l=s?1:wg,c=s?1:kg;if(e.fullBleed)return B(ht(o,t),n,i);let d=t-l-c;if(e.rightAlign){let p=Ee(o),h=Math.max(0,d-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return B(f,n,i)}let u=`${" ".repeat(l)}${ht(o,d)}${" ".repeat(c)}`;return B(u,n,i)}return r==="center"&&e.fullBleed?MC(e,t,n,i):B(ht(` ${o}`,t),n,i)}function LC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function vr(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(mt());return n}function mt(){return{text:""}}function Mg(e,t,n){return e.segments?e.segments.map(r=>Ho(r,t,n)).join(""):e.text}function MC(e,t,n,r){let s=" ".repeat(Go),i=Math.max(0,t-Go*2);if(!e.segments)return B(`${s}${ht(e.text,i)}${s}`,n,r);let o=UC(e.segments,i),a=`${s}${o.map(l=>Ho(l,n,r)).join("")}${s}${n?Ld:""}`;return B(a,n,r)}function Ho(e,t,n){let r=e.href?`${jg(e.href)}${e.text}${Ld}`:jC(e.text);return!t||!e.style?r:`${Cr(VC(e.style,n))}${KC(e.style)}${r}${_d}${Cr(n)}`}function jC(e){return e.replace(vC,t=>{let[n,r]=qC(t);return`${jg(n)}${n}${Ld}${r}`})}function qC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function jg(e){return`\x1B]8;;${e}\x1B\\`}function UC(e,t){let n=BC(e,t);return WC(n,t)}function BC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ee(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Xo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function WC(e,t){let n=Ee(qd(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 VC(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 KC(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 GC(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 qg(e,t){let n=Math.max(0,t-Ee(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function ht(e,t){let n=Ee(e);return n>=t?jd(e,t):e+" ".repeat(t-n)}function jd(e,t){if(t<=0)return"";if(Ee(e)<=t)return e;let n=Bg(e);return Xo(n,Math.max(0,t-1))+"\u2026"}function Ee(e){let t=0;for(let n of Array.from(Bg(e)))t+=Ug(n);return t}function Xo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Ug(s);if(r+i>t)break;n+=s,r+=i}return n}function Ug(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 HC(e,t,n){return Math.min(Math.max(e,t),n)}function Bg(e){return e.replace(IC,"").replace(PC,"")}function qd(e){return e.map(t=>t.text).join("")}function B(e,t,n){if(!t)return e;let r=Cr(n),s=e.replace(SC,`${_d}${r}`);return`${r}${s}${_d}`}function Cr(e){let t=[];return e.fg&&t.push(`38;2;${yg(e.fg).join(";")}`),e.bg&&t.push(`48;2;${yg(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function yg(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function qn(e,t,n){return Fs(e,t,C.success.fg,n)}function YC(e,t,n){return Fs(e,t,C.error.fg,n)}function Ar(e,t,n){return Fs(e,t,C.accent.fg,n)}function xs(e,t,n){return Fs(e,t,C.mutedfg.fg,n)}function Fs(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Cr(s)}${e}${Cr(r)}`}function Wg(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"?JC(s,r?.runner):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:zC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function zC(e,t){let n=(e??"").split(Ud.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Ud.delimiter):[...n,t].join(Ud.delimiter)}function JC(e,t){let n=e.command.length>0?e.command:["codex"];return vo(n,e.runner??t??"codex")}function Vg(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 Kt(e,t=!1,n=!1){if(t){let r=mg(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth-Go*2),rows:Math.max(5,e.height-ee.topRailHeight-5)}}function Kg(e){return e.length===1||et(e)||e==="BACKSPACE"||e==="TAB"}function Gt(e){return typeof e=="string"&&new RegExp(`:(?:agent|${me.join("|")})(?:-\\d+)?$`).test(e)}function Gg(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 Bd(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Hg(e){let t=new RegExp("\x1B\\[<(\\d+);\\d+;\\d+[mM]").exec(e);if(!t?.[1])return 0;let n=Number.parseInt(t[1],10);return n===64?-3:n===65?3:0}function Ls(e){return zg.includes(e)?"SHIFT_ENTER":null}function Wd(e){return zg.some(t=>t.startsWith(e))}function Yg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var zg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Jg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
274
274
|
`||n===`\r
|
|
275
275
|
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Xg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Qg(e,t=null){let n=t?.split(`
|
|
276
276
|
`)??[];return e.split(`
|
|
277
|
-
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Xo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as jA,createConnection as py}from"node:net";import{mkdir as qA,readFile as fy,rm as Ms,writeFile as UA}from"node:fs/promises";import BA from"node:path";import{setTimeout as nA}from"node:timers/promises";var mn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Vd(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:Vd(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=Vd(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 Vd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}var JC="\x1B[200~",XC="\x1B[201~";function Zg(e,t){return e==="codex"&&/Trust this folder\?/i.test(t)&&/Trust and continue/i.test(t)?"Codex requires folder trust before it can receive work.":e==="codex"&&/Update available/i.test(t)&&/Update now|Install update/i.test(t)?"Codex is displaying an update dialog instead of the agent input.":e==="cursor"&&/Press any key to log in/i.test(t)?"Cursor requires authentication before it can receive work.":null}function ey(e,t){switch(e){case"codex":return Qo(t,50);case"cursor":return Qo(t,50);case"claude":return Qo(t,50);case"pi":return Qo(t,50);default:return QC(e)}}function Qo(e,t){return{paste:`${JC}${e}${XC}`,submit:"\r",submitDelayMs:t}}function QC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import ZC from"node:path";var eA={type:"system",component:"orchestration-supervisor"};async function ty(e){let t=ZC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Vs(t)??{version:1,commands:{}},r=await Me(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of tA(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:eA),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await U(t,n)}function tA(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var Zo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new mn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()}),this.heartbeat.register({id:"orchestration.liveness",intervalMs:1e3,run:async()=>{await this.lease?.heartbeat()}})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(t={}){if(!this.lease){this.lease=await md(this.paths);try{t.deferReconciliation||await this.reconcile(),this.heartbeat.start()}catch(n){throw await this.lease.release(),this.lease=null,n}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await Oo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await ty(this.paths);let t=await Me(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Ar("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await Oo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Ar("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await S.getTask(this.paths,t.taskId).catch(a=>{if(a instanceof g&&a.code==="TASK_NOT_FOUND")return null;throw a}),r=n?.ptyTabs.find(a=>a.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await this.failCommand(t,Ar("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(a=>a.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await this.failCommand(t,Ar("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Tt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;let i=this.runtime.getStartupBlocker?.(t.agentTabId,r.runner??n.runner);if(i){await this.failCommand(t,Ar("PROMPT_STARTUP_BLOCKED",i,!0,!1));return}await pe.beginDelivery(this.paths,t.id);try{let a=ey(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,a.paste),await nA(a.submitDelayMs),this.runtime.writeToSession(t.agentTabId,a.submit)}catch(a){await this.failCommand(t,Ar("PROMPT_DELIVERY_UNCERTAIN",a instanceof Error?a.message:"Prompt delivery failed after it began.",!1,!0));return}let o=await pe.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(o)}async failCommand(t,n){let r=await pe.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!rA(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}.`)}}},rA=e=>e.idempotencyKey===`task-start:${e.taskId}`,Ar=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var sA={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Er=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...sA,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,n){let r=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,n);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:r,lastPollAt:null}),r>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,r+a)),l.intervalMs=a,r>=this.notBefore&&r>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let n=this.now();for(let r of t){let s=this.scheduledTasks.get(r);if(!s)continue;let i=s.lastPollAt===null?n:Math.max(n,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,n){let r=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,n);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:r+i,lastPollAt:r})}}recordFailure(t,n){let r=this.now(),s=n instanceof He,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=r+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=r+i,a.lastPollAt=r)}}getTaskIntervalMs(t,n){let r=iA(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(oA);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 iA(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 oA(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as aA}from"node:fs";var ea=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watchers=[];debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){this.running||(this.running=!0,this.baselineComplete=!1,this.watchPath(this.paths.tasksDir,()=>this.schedule(this.taskDebounceMs)),this.watchPath(this.paths.craigDir,(t,n)=>{let r=n===null?"":String(n);(r==="index.json"||r.startsWith(".index.json."))&&this.schedule(this.taskDebounceMs)}),this.schedule(0))}notifyActivity(t){if(!this.running)return;let n=Ye(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1;for(let t of this.watchers.splice(0))t.close();this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}watchPath(t,n){try{let r=aA(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 lA={selectedTaskId:null,reviewVisible:!1},cA={listTasks:async e=>(await S.listTasks(e)).tasks,syncTasks:async(e,t)=>(await S.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>S.getTask(e,n.id))))},ta=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??cA,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Er({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new ea(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=uA(s);i.length>0&&await this.onTasksChanged(i);let o=dA(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new mn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=lA;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,ny(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)!==ny(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 dA(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=mA(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&fA.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 uA(e){let t=new Set;for(let n of e)n.taskId&&pA(n)&&t.add(n.taskId);return[...t]}function pA(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var fA=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),mA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function ny(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as IA}from"node:module";import gA from"@xterm/headless";var hA=new RegExp("^\x1B\\[(\\d*)S$"),na=class{constructor(t){this.terminal=t;t.onResize(()=>{this.top=0,this.bottom=null}),t.parser.registerCsiHandler({final:"r"},n=>{if(t.buffer.active.type!=="normal")return!1;let r=Number(n[0]||1)-1,s=Math.min(Number(n[1]||t.rows),t.rows)-1;return r>=0&&r<s&&s<t.rows&&(this.top=r,this.bottom=s),!1});for(let n of["h","l"])t.parser.registerCsiHandler({prefix:"?",final:n},r=>(t.buffer.active.type==="normal"&&r.includes(6)&&(this.originMode=n==="h"),!1));t.parser.registerEscHandler({final:"c"},()=>(this.top=0,this.bottom=null,this.originMode=!1,!1)),t.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>(t.buffer.active.type==="normal"&&(this.top=0,this.bottom=null,this.originMode=!1),!1))}terminal;top=0;bottom=null;originMode=!1;state="text";pending="";queue=Promise.resolve();write(t){return this.queue=this.queue.then(()=>this.writeChunk(t)),this.queue}async writeChunk(t){let n="";for(let r of t){if(this.state==="string"||this.state==="stringEscape"){n+=r,r==="\x07"||this.state==="stringEscape"&&r==="\\"?this.state="text":this.state=r==="\x1B"?"stringEscape":"string";continue}if(this.state==="text"){r==="\x1B"?(this.pending=r,this.state="escape"):n+=r;continue}if(this.pending+=r,this.state==="escape"){r==="["?this.state="csi":("]PX^_".includes(r)?this.state="string":this.state="text",n+=this.pending,this.pending="");continue}if(r<"@"||r>"~")continue;let s=this.pending;this.pending="",this.state="text";let i=hA.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
|
|
278
|
-
`.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function ry(e,t){let n=t;if(!n.hasExtendedAttrs?.())return;let r=n.extended?.urlId;if(!r)return;let s=e._core?._oscLinkService?.getLinkData(r)?.uri;if(!(!s||!/^(https?:|file:|mailto:)/i.test(s))&&![...s].some(i=>i.charCodeAt(0)<32||i.charCodeAt(0)>=127&&i.charCodeAt(0)<=159))return s}var
|
|
279
|
-
`,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},
|
|
280
|
-
`))&&this.touchActivity(n))}writeKey(t){let n=
|
|
281
|
-
`);return Zg(n,i)}createSession(t,n,r,s){let i=this.spawn??
|
|
282
|
-
[process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function
|
|
277
|
+
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Qo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as qA,createConnection as py}from"node:net";import{mkdir as UA,readFile as fy,rm as Ms,writeFile as BA}from"node:fs/promises";import WA from"node:path";import{setTimeout as rA}from"node:timers/promises";var mn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Vd(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:Vd(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=Vd(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 Vd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}var XC="\x1B[200~",QC="\x1B[201~";function Zg(e,t){return e==="codex"&&/Trust this folder\?/i.test(t)&&/Trust and continue/i.test(t)?"Codex requires folder trust before it can receive work.":e==="codex"&&/Update available/i.test(t)&&/Update now|Install update/i.test(t)?"Codex is displaying an update dialog instead of the agent input.":e==="cursor"&&/Press any key to log in/i.test(t)?"Cursor requires authentication before it can receive work.":null}function ey(e,t){switch(e){case"codex":return Zo(t,50);case"cursor":return Zo(t,50);case"claude":return Zo(t,50);case"pi":return Zo(t,50);default:return ZC(e)}}function Zo(e,t){return{paste:`${XC}${e}${QC}`,submit:"\r",submitDelayMs:t}}function ZC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import eA from"node:path";var tA={type:"system",component:"orchestration-supervisor"};async function ty(e){let t=eA.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Vs(t)??{version:1,commands:{}},r=await Me(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of nA(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:tA),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await U(t,n)}function nA(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 ea=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new mn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()}),this.heartbeat.register({id:"orchestration.liveness",intervalMs:1e3,run:async()=>{await this.lease?.heartbeat()}})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(t={}){if(!this.lease){this.lease=await hd(this.paths);try{t.deferReconciliation||await this.reconcile(),this.heartbeat.start()}catch(n){throw await this.lease.release(),this.lease=null,n}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await Oo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await ty(this.paths);let t=await Me(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Er("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 Oo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){let n=t.idempotencyKey?.match(/^fury-review:([^:]+):([0-9]+)$/);if(n){let l=await rt(this.paths,n[1]),c=await te(this.paths,l.runId);if(l.state!=="changes_requested"||l.round!==Number(n[2])||["succeeded","failed","cancelled","timed_out"].includes(c.state)||Date.now()>=Math.min(Date.parse(c.deadlineAt),Date.parse(l.deadlineAt))){await ue.cancel(this.paths,t.id,{type:"system",component:"orchestration-supervisor"});return}}if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Er("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let r=await S.getTask(this.paths,t.taskId).catch(l=>{if(l instanceof g&&l.code==="TASK_NOT_FOUND")return null;throw l}),s=r?.ptyTabs.find(l=>l.id===t.agentTabId);if(!r||!s||s.kind!=="agent"||r.status==="closed"){await this.failCommand(t,Er("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let i=this.runtime.getActivitySnapshots().find(l=>l.tabId===t.agentTabId);if(i&&i.sessionState!=="running"){await this.failCommand(t,Er("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&bt(r,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;let o=this.runtime.getStartupBlocker?.(t.agentTabId,s.runner??r.runner);if(o){await this.failCommand(t,Er("PROMPT_STARTUP_BLOCKED",o,!0,!1));return}await ue.beginDelivery(this.paths,t.id);try{let l=ey(s.runner??r.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,l.paste),await rA(l.submitDelayMs),this.runtime.writeToSession(t.agentTabId,l.submit)}catch(l){await this.failCommand(t,Er("PROMPT_DELIVERY_UNCERTAIN",l instanceof Error?l.message:"Prompt delivery failed after it began.",!1,!0));return}let a=await ue.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(a)}async failCommand(t,n){let r=await ue.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!sA(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}.`)}}},sA=e=>e.idempotencyKey===`task-start:${e.taskId}`,Er=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var iA={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Or=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...iA,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,n){let r=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,n);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:r,lastPollAt:null}),r>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,r+a)),l.intervalMs=a,r>=this.notBefore&&r>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let n=this.now();for(let r of t){let s=this.scheduledTasks.get(r);if(!s)continue;let i=s.lastPollAt===null?n:Math.max(n,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,n){let r=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,n);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:r+i,lastPollAt:r})}}recordFailure(t,n){let r=this.now(),s=n instanceof He,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=r+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=r+i,a.lastPollAt=r)}}getTaskIntervalMs(t,n){let r=oA(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(aA);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 oA(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 aA(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as lA}from"node:fs";var ta=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watchers=[];debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){this.running||(this.running=!0,this.baselineComplete=!1,this.watchPath(this.paths.tasksDir,()=>this.schedule(this.taskDebounceMs)),this.watchPath(this.paths.craigDir,(t,n)=>{let r=n===null?"":String(n);(r==="index.json"||r.startsWith(".index.json."))&&this.schedule(this.taskDebounceMs)}),this.schedule(0))}notifyActivity(t){if(!this.running)return;let n=Ye(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1;for(let t of this.watchers.splice(0))t.close();this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}watchPath(t,n){try{let r=lA(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 cA={selectedTaskId:null,reviewVisible:!1},dA={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))))},na=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??dA,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Or({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new ta(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=pA(s);i.length>0&&await this.onTasksChanged(i);let o=uA(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new mn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=cA;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,ny(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)!==ny(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 uA(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=hA(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&mA.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 pA(e){let t=new Set;for(let n of e)n.taskId&&fA(n)&&t.add(n.taskId);return[...t]}function fA(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var mA=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),hA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function ny(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as vA}from"node:module";import yA from"@xterm/headless";var gA=new RegExp("^\x1B\\[(\\d*)S$"),ra=class{constructor(t){this.terminal=t;t.onResize(()=>{this.top=0,this.bottom=null}),t.parser.registerCsiHandler({final:"r"},n=>{if(t.buffer.active.type!=="normal")return!1;let r=Number(n[0]||1)-1,s=Math.min(Number(n[1]||t.rows),t.rows)-1;return r>=0&&r<s&&s<t.rows&&(this.top=r,this.bottom=s),!1});for(let n of["h","l"])t.parser.registerCsiHandler({prefix:"?",final:n},r=>(t.buffer.active.type==="normal"&&r.includes(6)&&(this.originMode=n==="h"),!1));t.parser.registerEscHandler({final:"c"},()=>(this.top=0,this.bottom=null,this.originMode=!1,!1)),t.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>(t.buffer.active.type==="normal"&&(this.top=0,this.bottom=null,this.originMode=!1),!1))}terminal;top=0;bottom=null;originMode=!1;state="text";pending="";queue=Promise.resolve();write(t){return this.queue=this.queue.then(()=>this.writeChunk(t)),this.queue}async writeChunk(t){let n="";for(let r of t){if(this.state==="string"||this.state==="stringEscape"){n+=r,r==="\x07"||this.state==="stringEscape"&&r==="\\"?this.state="text":this.state=r==="\x1B"?"stringEscape":"string";continue}if(this.state==="text"){r==="\x1B"?(this.pending=r,this.state="escape"):n+=r;continue}if(this.pending+=r,this.state==="escape"){r==="["?this.state="csi":("]PX^_".includes(r)?this.state="string":this.state="text",n+=this.pending,this.pending="");continue}if(r<"@"||r>"~")continue;let s=this.pending;this.pending="",this.state="text";let i=gA.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
|
|
278
|
+
`.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function ry(e,t){let n=t;if(!n.hasExtendedAttrs?.())return;let r=n.extended?.urlId;if(!r)return;let s=e._core?._oscLinkService?.getLinkData(r)?.uri;if(!(!s||!/^(https?:|file:|mailto:)/i.test(s))&&![...s].some(i=>i.charCodeAt(0)<32||i.charCodeAt(0)>=127&&i.charCodeAt(0)<=159))return s}var wA=1e3,iy=new WeakMap,kA=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function oy(e){let t=new yA.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:wA,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return iy.set(t,new ra(t)),t}function ay(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Gd(e,t){let n=iy.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function ly(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let d=0;d<e.cols;d+=1){let u=l.getCell(d,s);if(!u||u.getWidth()===0)continue;let p=ry(e,u);c.push({text:u.getChars()||" ",style:RA(u,o+a===i&&d===n.cursorX),...p?{href:p}:{}})}r.push({segments:TA(bA(c))})}return r}function TA(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&IA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),cy(n.style)||(s.style=n.style),t.push(s)}return t}function bA(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!cy(n.style))break;t-=1}return e.slice(0,t)}function RA(e,t){let n={},r=sy(e,"fg"),s=sy(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 sy(e,t){if(t==="fg"?e.isFgDefault():e.isBgDefault())return;let r=t==="fg"?e.isFgRGB():e.isBgRGB(),s=t==="fg"?e.getFgColor():e.getBgColor();return r?s.toString(16).padStart(6,"0"):kA[s]??PA(s)}function PA(e){if(e>=16&&e<=231){let t=e-16,n=Math.floor(t/36),r=Math.floor(t%36/6),s=t%6;return[n,r,s].map(SA).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 SA(e){return e===0?0:55+e*40}function IA(e,t){return Kd(e)===Kd(t)}function Kd(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function cy(e){return Kd(e)===""}var CA=vA(import.meta.url),AA=/^CTRL_([A-Z])$/,EA="\x1B[6n",OA="\x1B[c",$A="\x1B[?u",NA={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
279
|
+
`,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},sa=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")Hd(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,dy(i,r),this.getViewState(n);let o;try{o=this.createSession(t,n,r,s)}catch(a){throw this.recordActivity({taskId:t,tabId:n,sessionState:"failed",lastActivityAt:Date.now(),exitCode:null,error:a instanceof Error?a.message:String(a)}),a}return this.sessions.set(n,o),this.notifyActivity(o),this.attachedTabId=n,this.getViewState(n)}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||(n.pty.write(t),(t.includes("\r")||t.includes(`
|
|
280
|
+
`))&&this.touchActivity(n))}writeKey(t){let n=DA(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&&dy(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&&(Hd(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Hd(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:_A(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getStartupBlocker(t,n){let r=this.sessions.get(t);if(!r)return null;let s=r.terminal.buffer.active,i=Array.from({length:r.terminal.rows},(o,a)=>s.getLine(s.baseY+a)?.translateToString(!0)??"").join(`
|
|
281
|
+
`);return Zg(n,i)}createSession(t,n,r,s){let i=this.spawn??FA().spawn,o=oy(r),a=s??this.resolveSessionSpec(t,n),l=bo({...this.env,...a.env??{}}),{executable:c,args:d}=LA(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:MA(l)}),p={taskId:t,tabId:n,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(u.onData(h=>{this.touchActivity(p),jA(u,h),Gd(p.terminal,h).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(h=>{p.status="exited",p.exitCode=h.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),Gd(p.terminal,`\r
|
|
282
|
+
[process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function DA(e){if(e.length===1)return e;let t=NA[e];if(t!==void 0)return t;let n=AA.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function dy(e,t){xA(e.pty,t),ay(e.terminal,t),e.screenDirty=!0}function _A(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=ly(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Hd(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function xA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function FA(){return CA("node-pty")}function LA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[Ro(t[0],n),...t.slice(1)].map(uy).join(" ")}; exec ${uy(e)} -l`;return{executable:e,args:["-lc",s]}}function uy(e){return`'${e.replaceAll("'","'\\''")}'`}function MA(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 jA(e,t){for(let n=0;n<Yd(t,EA);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Yd(t,OA);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Yd(t,$A);n+=1)e.write("\x1B[?0u")}function Yd(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 ia=Pt,VA=16,KA=250;async function my(e){let t=Fe(e.paths);await zA(t,e.paths,e.spawnDaemon);let n=await Ry(t.socketPath),r=new zd(n,e);return await r.ready(),r}async function hy(e,t={}){let n=Fe(e);await UA(e.runtimeDir,{recursive:!0}),await Ms(n.socketPath,{force:!0});let r=new Jd(e,t),s=qA(i=>r.handleConnection(i));try{await ZA(s,n.socketPath),await r.start(),await BA(n.pidPath,String(process.pid),"utf8"),await pe.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${ia}.`,details:{pid:process.pid,protocolVersion:ia}}),await new Promise(i=>{let o=!1,a=()=>{o||(o=!0,r.closeClients(),s.close(()=>{process.removeListener("SIGTERM",a),process.removeListener("SIGINT",a),i()}))};r.onShutdown=a,process.once("SIGTERM",a),process.once("SIGINT",a)})}catch(i){throw await pe.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{r.closeClients(),s.listening&&await new Promise(i=>s.close(()=>i())),await pe.appendLogBestEffort(e,{level:"info",component:"daemon",event:"stopped",message:"PTY daemon stopped and disposed its remaining sessions.",details:{pid:process.pid,remainingSessionCount:r.sessionCount()}}),r.onShutdown=null,await Ms(n.socketPath,{force:!0}),await Ms(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function gy(e){let t=Fe(e);return await ky(t.socketPath)?(await QA(t.socketPath),!0):!1}var zd=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=ia;options;async ready(){let t=await this.send({type:"ping"});if(!wy(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.protocolVersion>=10&&await this.send({type:"subscribeNavigation"}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&(this.viewCache.set(n,r.view),r.view.status==="idle"&&pe.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}setOpenFileHandler(t){this.openFileHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
|
|
283
283
|
`);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
284
284
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
285
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=
|
|
285
|
+
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=YA(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)}}},Jd=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 sa({...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??(()=>dn(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new na(this.paths,{...r,reconcileEvents:s,minimumIntervalMs:r.minimumIntervalMs??(t.github?.watchIntervalSeconds??5)*1e3,onTasksChanged:async i=>{this.broadcastTasksChanged(i),await r.onTasksChanged?.(i)},onError:async i=>{await pe.appendErrorLogBestEffort(this.paths,{context:"pull request sync supervisor",message:i instanceof Error?i.message:String(i)}),await r.onError?.(i)}}),this.pullRequestSyncSupervisor.start(),this.updateRuntimeActivityEnabled()}let n=(await Me(this.paths)).some(r=>r.state==="queued"||r.state==="delivering")||(await Si(this.paths)).some(r=>r.cleanupPending||!["succeeded","failed","cancelled","timed_out"].includes(r.state));(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
|
|
286
286
|
`);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
|
|
287
|
-
`)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}sessionCount(){return this.runtime.sessionTabIds().length}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{hn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);hn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:
|
|
288
|
-
${s.slice(-2e3)}`:""}`)}async function yy(e){let t=await Ty(e).catch(()=>null);return t?.ok===!0&&wy(t.protocolVersion)}function wy(e){return
|
|
287
|
+
`)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}sessionCount(){return this.runtime.sessionTabIds().length}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{hn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);hn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:ia,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);hn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec);return r||this.log({level:"info",component:"pty",event:"spawned",message:"PTY session spawned.",taskId:n.taskId,tabId:n.tabId}),this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,s)}case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),this.orchestrationSupervisor.wake().catch(r=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor wake",message:r instanceof Error?r.message:String(r)})),null;case"shutdown":return this.log({level:"warn",component:"daemon",event:"shutdown.requested",message:"PTY daemon shutdown was explicitly requested.",details:{liveSessionCount:this.runtime.sessionTabIds().length}}),setTimeout(()=>this.onShutdown?.(),0),null;default:return tE(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(Xd),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!1}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)hn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(hn(s,{type:"openFile",path:n}),r+=1);return r}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},KA))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&hn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&hn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new ea(this.paths,this.runtime,{onError:n=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start({deferReconciliation:!0}),await pe.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){pe.appendLogBestEffort(this.paths,t)}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},VA))}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=GA(s,n),o=HA(s.view,n);s.view=n,s.rowKeys=n.rows.map(Xd),(i.rows.length>0||o)&&hn(r,{type:"update",tabId:t,patch:i})}}};function GA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Xd(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 HA(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 YA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Xd(e){return JSON.stringify(e)}async function zA(e,t,n){if(await JA(e.socketPath,1e3))return;if(await ky(e.socketPath)){let i=await Ty(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await pe.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.")}await XA(e,t),Po(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await yy(e.socketPath))return;await Py(50)}let s=await fy(WA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
|
|
288
|
+
${s.slice(-2e3)}`:""}`)}async function yy(e){let t=await Ty(e).catch(()=>null);return t?.ok===!0&&wy(t.protocolVersion)}function wy(e){return Zt(e)}async function JA(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await yy(e))return!0;await Py(50)}return!1}async function XA(e,t){let n=await fy(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&eE(r))return;await pe.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"previous_exit.unclean",message:"Found stale daemon state from a process that is no longer running.",details:{previousPid:Number.isInteger(r)?r:null}})}await Ms(e.socketPath,{force:!0}),await Ms(e.pidPath,{force:!0})}async function ky(e){let t=await Ry(e).catch(()=>null);return t?(t.end(),!0):!1}async function QA(e){await by(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Ty(e){return by(e,{id:1,type:"ping"})}function by(e,t){return new Promise((n,r)=>{let s=py(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)}
|
|
289
289
|
`)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
|
|
290
|
-
`);if(c===-1)return;let
|
|
291
|
-
`)}catch{}}function
|
|
292
|
-
`}function nE(e){return e.length===1&&e>=" "&&e!==""}var rE=/^\d+\.\d+\.\d+$/;async function xy(e,t={runCommand:K}){if(!rE.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}var eu=150,Fy=6;function Ly(e,t,n,r){if(e.inputMode!=="terminal"&&e.focusedRegion!=="center"||e.terminal.scrolledBack||e.terminal.rows.length===0)return e;let i=t.find(a=>a.id===e.selectedTaskId)?.ptyTabs.find(a=>a.id===e.activeTab||e.activeTab==="agent"&&a.kind==="agent");if(i?.kind!=="agent")return e;let o=n.find(a=>a.tabId===i.id);return!o||Ye(i.id,n,r)!=="ready"||e.readAgentActivityAt[i.id]===o.lastActivityAt?e:{...e,readAgentActivityAt:{...e.readAgentActivityAt,[i.id]:o.lastActivityAt}}}function oa(e,t,n,r){return t.some(s=>e.includes(s.tabId)&&Ye(s.tabId,t,n)==="ready"&&s.lastActivityAt>(r[s.tabId]??-1))}function My(e,t,n,r){let s=e.tasks.filter(o=>o.status!=="closed"&&o.status!=="merged"),i={workspaceCount:e.workspaces?.filter(o=>o.status==="active").length??e.repos.length,taskCount:s.length,workingAgents:0,readyAgents:0,attentionAgents:0,activityKnown:r};if(!r)return i;for(let o of s)for(let a of o.ptyTabs){if(a.kind!=="agent")continue;let l=Tt(o,a.id,t,n);l==="working"&&i.workingAgents++,l==="ready"&&i.readyAgents++,l==="error"&&i.attentionAgents++}return i}import js from"node:path";function jy(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"\u{F06E6} ";case"js":case"jsx":case"mjs":case"cjs":return"\u{F031E} ";case"json":case"jsonc":return"\u{F0871} ";case"md":case"mdx":return"\u{F0354} ";case"yaml":case"yml":return"\u{F0B10} ";case"sh":case"bash":case"zsh":return"\u{F018D} ";case"css":case"scss":case"sass":return"\u{F031C} ";case"html":case"htm":return"\u{F031D} ";case"py":return"\u{F0320} ";case"go":return"\u{F07D3} ";case"rs":return"\u{F1617} ";case"lock":return"\u{F033E} ";case"png":case"jpg":case"jpeg":case"gif":case"svg":case"webp":return"\u{F02E9} ";default:return"\u{F0214} "}}var qy="\u{F024B} ",Uy="\u{F0DCF} ",By="\u25CB",tu="\uEA64",Wy="\uEAFE",Vy="\uEBDA",nu="\u25CB",ru="\u25CF",su="\u2713",iu="\u2715";function Ky(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 la="empty",he={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function zy(e,t,n){let r=oE(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=WE(t.tasks),u=cE(e,a),d=lE(e,a,u,n),p=d.find(y=>y.id===u)??d[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ds(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":u===V?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:js.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${js.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:sE(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>VE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:aE(u,e,s,a,e.workspaceBrowser,h,r),tabs:d,rightContext:BE(s,a),rightInspection:RE(e,a,h)}}function sE(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 iE(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=Mo(t.tasks,o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:d}of $s(c)){let p=e.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:d===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:rr(u,n.snapshots,n.now),activityAnimationFrame:n.animationFrame,unread:oa(u.ptyTabs.filter(y=>y.kind==="agent").map(y=>y.id),n.snapshots,n.now,e.readAgentActivityAt)}:{}},m=Xy(u);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let u=`new-task-workspace:${o.id}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}if(o.kind==="repo"){let u=`new-task:${o.primaryRepoId}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let u of l.slice(0,6)){let d=t.repos.find(p=>p.id===u);r.push({text:` \xB7 ${d?.name??u}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function iE(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=jo(r,o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of $s(l)){let h=t.selectedLeftItemId===`task:${d.id}`,f=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,m={id:`task:${d.id}`,taskId:d.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:rr(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame,unread:oa(d.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),s.snapshots,s.now,t.readAgentActivityAt)}:{}},y=Xy(d);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,u=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:u,focused:u&&t.focusedRegion==="tasks",muted:!u})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function oE(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 aE(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(d=>d.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((d,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=d.kind==="repo"?" [git repo]":"/";return`${h} ${d.name}${f}`}),u=s.query!==null?`Search: ${s.query}\u2588`:"";return ht(["Browse for a workspace to register.",s.cwd,...u?[u]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return ht(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,u=l?"Project Task":"Task";return ht([`No tasks in ${c}.`,"",`Press n or choose + New ${u} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ht([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):ht([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===V&&t.openInspectionKind==="file"?pE(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?fE(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ht(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ht(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function lE(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:dE(o),...o.kind==="agent"&&r&&t?{activity:Tt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame,unread:oa([o.id],r.snapshots,r.now,e.readAgentActivityAt)}:{}}))??[];if(!t)return[{id:la,label:"EMPTY",active:n===la,focused:e.focusedRegion==="center"&&n===la}];let i=e.openInspectionKind||n===V?[{id:V,label:uE(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function cE(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===V&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??V:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??V:la}function dE(e){return e.title.toUpperCase()}function uE(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?js.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function pE(e,t,n){if(!e)return ht(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ht(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Jy(r.path??r.title);return[{text:r.title},{text:`${r.byteLength===null?"size unknown":`${r.byteLength} bytes`} \xB7 ${r.lines.length} lines \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...mE(r.lines,n,s)]}function fE(e,t,n){if(!e)return ht(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ht(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Jy(r.path??r.title);return[{text:r.title},{text:`${t.diffPaths.length} changed files \xB7 ${r.lines.length} rows \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...hE(r.lines,n,s)]}function ht(e){return e.map(t=>({text:t}))}function mE(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:he.lineNumber}},{text:" \u2502 ",style:{fg:he.gutter}},...ou(i,n)],tone:"default"}})}function hE(e,t,n){let r=gE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>yE(i,n))}function gE(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 yE(e,t){let n=Gy(e.oldNumber),r=Gy(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:he.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:he.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?kE(ou(e.text,t),i.bg,i.fallbackFg):ou(e.text,t),l=i?{fg:he.lineNumber,bg:i.bg}:{fg:he.lineNumber},c=i?{fg:he.gutter,bg:i.bg}:{fg:he.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Gy(e){return e===null?" ":String(e).padStart(4," ")}function Jy(e){let t=js.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function ou(e,t){return t==="diff"?wE(e):t==="markdown"?TE(e):t==="json"?au(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?au(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 wE(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:he.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:he.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:he.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:he.diffMeta}}]:[{text:e}]}function kE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function TE(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:he.markup,bold:!0}}]:au(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function au(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:bE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function bE(e){return e.startsWith("//")||e.startsWith("/*")?{fg:he.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:he.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:he.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:he.markup}:{fg:he.keyword}}function RE(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"?Qy(t.repoTargets??[]):s?.pullRequest??(t?H(t):null),o=[PE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=tw(e,t,n),l=lu(e,n),c=$E([{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,...jE(e,n)]}:{title:"",rows:[...o,...lu(e,n)]}}function PE(e,t){let n=e.inspectionMode,r=[{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let c=r[l];l>0&&s.push({text:" "});let u=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:u}})}let i=cu(t),o=du(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Hy(e){return[{text:" "},cu(e),{text:" "},du(e)]}function Xy(e){if(e.type==="project"&&e.repoTargets?.length){let n=Qy(e.repoTargets);return n?Hy(n):null}let t=H(e);return t?.number?Hy(t):null}function Qy(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=IE(n);return{number:-1,status:SE(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 SE(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 IE(e){let t=e.map(n=>Zy(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 cu(e){return!e||!e.number?{text:By,style:{fg:"565f89"}}:e.status==="merged"?{text:Wy,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Vy,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:tu,style:{fg:"565f89"}}:{text:tu,style:{fg:"9ece6a"}}}function du(e){return e?.aggregateReadiness?Yy(e.aggregateReadiness):Yy(Zy(e))}function Yy(e){return e==="failed"?{text:iu,style:{fg:"f7768e"}}:e==="pending"?{text:ru,style:{fg:"e0af68"}}:e==="success"?{text:su,style:{fg:"9ece6a"}}:{text:nu,style:{fg:"565f89"}}}function Zy(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")?ew(e)?"failed":vE(e)?"success":"pending":"pending"}function vE(e){return!!(e.mergeable&&!e.draft&&!ew(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function ew(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function tw(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return CE(e,t,n);let r=H(t),s=sw("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),i=t.prs.filter(o=>o!==r&&(o.status==="merged"||o.status==="closed")).length;return i>0&&s.push({id:"pr-history",text:`+ ${i} previous PR${i!==1?"s":""}`,muted:!0}),s}var aa=32;function CE(e,t,n){let r=[],s=uu(t,n),i=e.selectedProjectTargetId??s[0]?.repoId??null,o=s.some(c=>c.repoId===i)?i:s[0]?.repoId??null;if(s.length===0)return[{id:"project-review-empty",text:"No repos with changes or pull requests.",muted:!0}];for(let c of s){let u=o===c.repoId,d=e.focusedRegion==="inspector"&&u,p=c.repoId.startsWith("repo_")?c.repoId.slice(5):c.repoId;if(c.status!=="ready"){let f=c.failureReason?c.failureReason.slice(0,14):c.status,m=aa-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=aa-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:u,focused:d,muted:!0})}else{let h=cu(c.pullRequest),f=du(c.pullRequest),m=`${h.text} ${f.text}`,y=aa-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=aa-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:u,focused:d,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?AE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...sw("target",a.branch,a.pullRequest)),l.length>0&&r.push({id:"target-pr-history",text:`+ ${l.length} previous PR${l.length!==1?"s":""}`,muted:!0})),r}function uu(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||nw(e,r).length>0)}function AE(e,t){return nw(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function nw(e,t){let n=EE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function EE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=OE(e.pullRequest.url);if(n)return n;let r=t.filter(i=>e.pullRequest.number!==null&&i.number===e.pullRequest.number),s=r.length===1?r[0]:null;return s?.owner&&s.repo?{owner:s.owner.toLowerCase(),repo:s.repo.toLowerCase()}:null}function OE(e){let t=e?.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+(?:[/?#].*)?$/i);return t?.[1]&&t[2]?{owner:t[1].toLowerCase(),repo:t[2].toLowerCase()}:null}function rw(e,t,n=null){return 3+tw(e,t,n).length+lu(e,n).length}function sw(e,t,n){let r=d=>`${e}-${d}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],i=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${i} Open in GitHub \u2197`,segments:[{text:i},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:i});let o=n.baseBranch??"?",a=n.headBranch??t;s.push({id:r("pr-branches"),text:`${o} \u2192 ${a}`,muted:!0});let l=NE(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:DE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${iw(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(_E)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let u=n.comments??[];return u.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${u.length})`}),s.push(...u.slice(-4).flatMap((d,p)=>xE(d,r(`comment:${p}`))))),s}function $E(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 NE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function DE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function iw(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 _E(e){let{icon:t,color:n}=LE(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," ")} ${ME(e.status)}`,color:n,muted:!1}}function xE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${iw(e.createdAt)}`:"",s=FE(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 FE(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 LE(e){switch(e){case"success":return{icon:su,color:"9ece6a"};case"pending":return{icon:ru,color:"e0af68"};case"failed":return{icon:iu,color:"f7768e"};case"skipped":return{icon:nu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function ME(e){return e==="success"?"passing":e==="failed"?"failing":e}function jE(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=pu(t.fileRows,e.collapsedFileTreePaths),s=e.fileSearchQuery,i=s?r.filter(l=>l.path.toLowerCase().includes(s.toLowerCase())):r,o=s!==null?[{id:"file-search",text:`Search: ${s}\u2588`,muted:!1}]:[],a=e.selectedFileTreePath??t.selectedFilePath;return[...o,...i.map(l=>{let c=l.kind==="file"?n.get(l.path):void 0,u=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,d=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?qy:Uy:jy(l.label),p=l.kind==="directory"?"7aa2f7":Ky(l.label),h=" ".repeat(l.depth),f=p?{text:d,style:{fg:p}}:{text:d},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:u?{text:l.label,style:{fg:u}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${d}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function pu(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(qE(t))return UE(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=>ow(i,e,t))))}return n}function qE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function UE(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=>ow(c,e,t,s.length+1))))}}return n}function ow(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 BE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:js.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function WE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function VE(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function aw(e,t,n,r,s=null,i=!1){if(s)return KE(e,t,n,r,s,i);let o=Ld(e,t,{centerOnly:r,panelPolish:i});return GE(n,o)?{output:Xo(o.rows,n.rows,o.row,o.column),region:o}:null}function KE(e,t,n,r,s,i){let o=vg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!HE(n,o))return null;let a=n.rows.slice();return{output:o.rows.map(({index:c,row:u})=>a[c]===u?"":(a[c]=u,`\x1B[${o.row+c};${o.column}H${u}`)).join(""),region:{row:o.row,column:o.column,width:o.width,rows:a}}}function GE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function HE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function lw(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!YE(o,a))return null;!o||!a||(s+=Xo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function YE(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 zE=["tasks","center","inspector"];function JE(e,t,n){if(t==="ESCAPE")return E({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return E({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return mu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return gu({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return E({state:{...e,fileSearchQuery:r},changed:!0})}return E({state:e})}function gu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return ag(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return JE(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return E({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return E({state:e,exit:!0});if(t==="ESCAPE")return E({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return E({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(qo(e.selectedLeftItemId)||Uo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:Lo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return cw(e,1);if(t==="SHIFT_TAB"||t==="[")return cw(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===V?gn(e,-1,n):mu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?gn(e,1,n):mu(e,1,n);if(t==="PAGE_UP")return gn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return gn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return gn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return gn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??yt,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=s0(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Ds(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&pg(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&pw(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return fu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return dw(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return fu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return dw(e,1)}if(et(t)){if(e.focusedRegion==="tasks"&&(qo(e.selectedLeftItemId)||Uo(e.selectedLeftItemId))){let r=Bo(e.selectedLeftItemId),s=Wo(e.selectedLeftItemId);return E({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Ds(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Rr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&pw(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Rr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===V)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:ZE({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:V,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function gn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?fw(e,t,n):e.inspectionMode==="review"?uw(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return uw(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return e0(e,t,n)}return E({state:e})}function cw(e,t){return ca(e,"focusedRegion",zE,t)}function fu(e,t,n){let r=ca(e,"activeTab",n&&n.length>0?n:i0(e),t);return!r.changed||lg(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Rr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function mu(e,t,n){if(e.focusedRegion==="tasks")return XE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return fu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return fw(e,t,n);if(n.projectTargetIds?.length){let s=hu(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=hu(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:ca(e,"selectedActionId",rg,t)}return ca(e,"selectedActionId",vd,t)}function XE(e,t,n){let r=hu(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Ed(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=Bo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Wo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function QE(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?V:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function dw(e,t){return QE(e,r0(e.inspectionMode,Cd,t))}function fw(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Gt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?V:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function ZE(e){if(!e.selectedFileTreePath)return e;let t=new Set(e.collapsedFileTreePaths);return t.has(e.selectedFileTreePath)?t.delete(e.selectedFileTreePath):t.add(e.selectedFileTreePath),{...e,collapsedFileTreePaths:[...t].sort((n,r)=>n.localeCompare(r)),actionMessage:null}}function uw(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Gt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function e0(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return t0(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=e.diffScrollOffset+t,a=n.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let u=Gt(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let u=Gt(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}if(t>0&&o>i){let u=a[l+1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let u=a[l-1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:V,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Gt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function t0(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Gt(e.diffScrollOffset+t,0,i),a=n0(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?E({state:e}):E({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function n0(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function ca(e,t,n,r){let s=n.indexOf(e[t]),i=Gt(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function hu(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Gt(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function r0(e,t,n){let r=t.indexOf(e);return t[Gt(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function pw(e,t){return t.includes(e)}function s0(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Rr(e.activeTab)??e.preferredPtyTabKind}function i0(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Gt(e,t,n){return Math.min(n,Math.max(t,e))}var mw=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>G(r.paths,e.selectedTaskId,i=>{let o=t??o0(i,e.activeTab,e.preferredPtyTabKind),a=ww(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"}`}}},hw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await G(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},gw=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await G(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},yw=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await G(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=ww(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await G(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function o0(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function ww(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,u=a;for(;l.has(u);)c+=1,u=`${a}-${c}`;let d=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:u,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:d,updatedAt:d}}var Or=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},kw=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await rt(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=bo();Ro(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",u=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Or(c,u)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},Tw=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},bw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await Fr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},Rw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Fr(t.paths,n.id)))),$r=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await ue.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var Pw=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");let n=await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0}),r=n.tasks.filter(i=>i.status!=="closed");if(r.length>0)throw new Error(`Close tasks before removing workspace: ${r.map(i=>`${i.id} (${i.status})`).join(", ")}.`);await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId);let s=n.tasks.length>0;return s||await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks}),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:s?`Archived workspace ${e.selectedWorkspaceId}; closed task history preserved.`:`Removed workspace ${e.selectedWorkspaceId}`}}};var Sw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Iw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},vw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var a0=250;function Ht(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Yt(e,t){return Wt(t,e.ptyRuntime.getViewState(Nr(e,t)))}function Nr(e,t){let n=Ht(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function v(e,t){return Yt(e,fg(t,e.model))}function Cw(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:v(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function Aw(e,t,n){return Cw(e,t,n?{tone:"success",message:n}:null)}function ce(e,t,n){return Cw(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 ue.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=xo(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>gt({uiStateFile:e.uiStateFile},n),()=>gt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function yu(e,t){if(!e.uiStateFile){e.runtimeState={...xo(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...xo(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>gt({uiStateFile:e.uiStateFile},n),()=>gt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function l0(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function de(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:be,queueTaskMutation:t=>l0(e,t)}}function wu(e,t){let n=Ht(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?pu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:jn(e.model),centerTabIds:dg(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:rw(t,n,s),pageRows:Math.max(5,We(e.activeTerminal.width,e.activeTerminal.height).height-ee.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:uu(n,s).map(a=>a.repoId)}}async function Ew(e,t){await gw(t,de(e))}async function Se(e){e.model=await Pr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:v(e,e.state.shell)}:e.state={...e.state,shell:v(e,e.state.shell)}}function da(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 ua(e,t){let n=++e.inspectionRefreshSequence,r=Od(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 Wh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Pr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Z(e,e.state.shell),e.render())}function Ow(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)&&ua(e,n).catch(r=>{let s=ie(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},a0))}function $w(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=gn(e.state.shell,n,wu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render(),ua(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render()}},16)))}function ku(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Tu(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 Dw(e){Tu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function _w(e,t){let n=v(e,t),r=Ht(e.model.tasks,n),s=Nr(e,n);if(!r||!s||!r.ptyTabs.some(a=>a.id===s))return n;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return Wt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Vt(We(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Wt({...n,inputMode:"control"},o)}function bu(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 Ru(e,t){try{let n=v(e,t),r=Ht(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 Nw(e,r),await Se(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Nw(e,r),await Se(e),s=r.selectedPtyTabId);let i=v(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Wt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Vt(We(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Kt(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Wt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Kt(t.selectedPtyTabId)&&(await c0(e,t.selectedTaskId,r).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,og(v(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function c0(e,t,n){await Tw(t,n,de(e))}async function xw(e,t,n,r){let s=v(e,t),{nextShell:i}=await mw(s,n,r,de(e));return await Se(e),v(e,{...s,...i})}async function Fw(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await hw(n,de(e));return e.ptyRuntime.disposeSession(r.id),await Se(e),v(e,{...n,...s})}async function Lw(e,t){let n=v(e,t),r=jn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await bw(n,de(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Se(e),v(e,{...n,...o,selectedLeftItemId:d0(r,jn(e.model),s)})}async function Mw(e,t){let n=v(e,t),r=e.model.workspaces?.findIndex(a=>a.id===n.selectedWorkspaceId)??-1,{nextShell:s}=await Pw(n,de(e));await Se(e);let i=e.model.workspaces??[],o=i[Math.min(Math.max(0,r),i.length-1)];return v(e,{...n,...s,selectedLeftItemId:o?`workspace:${o.id}`:null})}async function Nw(e,t){return yw(t,de(e))}function pa(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:Yt(e,e.state.shell)},e.render())},16))}function jw(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:Yt(e,e.state.shell)},e.render())}function d0(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 Uw(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=qw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Rw(s,de(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)da(e,o);t.recordSuccess(i,qw(e)),e.state={mode:"main",shell:v(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,$r("background PR polling",i,de(e)))}}function qw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Bw(e,t){let n=v(e,t),r=Ht(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Se(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Se(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${H(a)?.requiredChecks.length??0} reported`)}return v(e,{...Aw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import h0 from"node:path";import{readdir as u0,stat as p0}from"node:fs/promises";import Ww from"node:path";async function f0(e){let t=await u0(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Ww.join(e,r.name);n.push({name:r.name,path:s,kind:await m0(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 Vw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Kw(e){let{spawn:t}=await import("node:child_process"),n=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";await new Promise((r,s)=>{let i=t(n,[e],{stdio:"ignore",detached:!0});i.unref(),i.on("error",s),i.on("spawn",r)})}async function fa(e,t){let n=await f0(t);e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function m0(e){let t=Ww.join(e,".git");return await p0(t).catch(()=>null)!==null}function Gw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Hw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function g0(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"",r=t.taskPromptTarget;if(!r||!r.repoId&&!r.workspaceId){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:v(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${r.name}...`})},e.render();let s=null;try{let i=await kw(r.repoId,r.workspaceId,n,t.selectedRunner,de(e));s=i.task,await Se(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??Vg(s,"agent"),Vt(We(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Kt(o.selectedPtyTabId),e.state={mode:"main",shell:Wt(o,a)},Z(e,e.state.shell)}catch(i){i instanceof Or&&(s=i.task);let o=ie(e,"create task",i,"Failed to create task.");s&&!(i instanceof Or)?(await G(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Se(e).catch(()=>{})):s&&(await G(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function y0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:v(e,{...n,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(et(t)){g0(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:v(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:v(e,{...n,selectedRunner:Lo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Ad(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function w0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell.workspaceBrowser;if(!n)return;if(t==="ESCAPE"){if(n.query!==null){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:"",selectedIndex:0}})},e.render();return}if(n.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=n.query.slice(0,-1);e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}if(n.query!==null&&t.length===1&&t>=" "){let s=n.query+t;e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=Vw(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){fa(e,h0.dirname(n.cwd)).catch(s=>{let i=ie(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||et(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){fa(e,s.path).catch(o=>{let a=ie(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=de(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Se(e);let a=o.repos[0]??null,l=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Z(e,e.state.shell),e.render()}).catch(o=>{let a=ie(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function k0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Ny(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;T0(e,r)}}}async function T0(e,t){let n;try{n=await ue.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 b0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=_y(Gw(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"?Sw(n.runner,n.enabled,de(e)):Iw(n.runner,n.path,de(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=ie(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),i),runnerOptions:{...Gw(e),message:i}},e.render()})}function R0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Dy(Hw(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){yu(e,{seenPreviewIds:[...wt]});let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}vw(n.feature,n.enabled,de(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=ie(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),s),previewOptions:{...Hw(e),message:s}},e.render()})}}function ma(e){let t=v(e,{...e.state.shell,inputMode:"control"});e.state={mode:"main",shell:t},e.pendingClear=!0,e.render(),e.bootHydrationReady.then(()=>{e.state.mode!=="main"||e.state.shell!==t||_w(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Z(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=ie(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ce(e,v(e,e.state.shell),r)},Z(e,e.state.shell),e.render()})})}function P0(e){return[...e instanceof Error?e.message:"npm could not install the update."].map(r=>{let s=r.charCodeAt(0);return s<=31||s>=127&&s<=159?" ":r}).join("").replace(/\s+/g," ").trim().slice(0,160)}function Yw(e){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let t=e.state.update.latest;e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"installing"}},e.render(),e.installUpdate(t).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update||(e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"success"}},e.pendingClear=!0,e.render())}).catch(n=>{if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let r=P0(n);ie(e,"update Craig",n,r),e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"error",error:r}},e.pendingClear=!0,e.render()})}function S0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let n=e.state.update.phase;if(n==="installing")return;if(t==="ESCAPE"){ma(e);return}let r=n==="ready"?2:1;if(t==="UP"||t==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(t==="DOWN"||t==="j"){e.state={...e.state,menuIndex:Math.min(r,e.state.menuIndex+1)},e.render();return}if(et(t)){if(n==="ready"&&e.state.menuIndex===0){Yw(e);return}if(n==="ready"&&e.state.menuIndex===2){yu(e,{ignoredUpdateVersion:e.state.update.latest}),e.updateText=null,ma(e);return}if(n==="error"&&e.state.menuIndex===0){Yw(e);return}if(n==="success"&&e.state.menuIndex===1){e.exit(0);return}ma(e)}}function zw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){y0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){w0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){v0(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=gu(e.state.shell,n,wu(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&et(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Ls(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(I0(e,n))return;e.lastTerminalKey=Kg(n)?{key:n,at:Date.now()}:null;let i=Gg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){pa(e,i);return}Ad(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Kt(e.state.shell.selectedPtyTabId)&&jw(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){fa(e,e.workspaceRoot).catch(s=>{let i=ie(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){xw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Ru(e,s)}).catch(s=>{let i=ie(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Fw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){Bw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Ht(e.model.tasks,r.state),i=s?H(s)?.url??null:null;i?Kw(i).catch(o=>{let a=ie(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ce(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ce(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){Lw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Mw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Ru(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ow(e,e.state.shell);return}ua(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},Ew(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){k0(e,n);return}if(e.state.variant==="runners"){b0(e,n);return}if(e.state.variant==="previews"){R0(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||et(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.variant==="update"){S0(e,n);return}if(e.state.optionsMessage){(n==="ESCAPE"||et(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(et(n)){if(e.state.menuIndex===0){e.state.variant==="boot"?ma(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),Dw(e));return}if(e.state.menuIndex===1){let r=e.state.variant==="boot"||e.state.variant==="pause"?e.state.variant:void 0;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}e.exit(0)}}function Jw(e,t){let n=Xg(t);if(e.state.mode!=="main"||e.state.shell.inputMode!=="terminal"||n.length===0)return;if(e.pendingTerminalKeySequence){let i=`${e.pendingTerminalKeySequence.raw}${n}`,o=Ls(i);if(o){Qw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Wd(i)){e.pendingTerminalKeySequence.raw=i,Xw(e);return}ha(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Z(e,e.state.shell),e.render();return}let r=Hg(n);if(r!==0){pa(e,r);return}let s=Ls(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
290
|
+
`);if(c===-1)return;let d=i.slice(0,c);a(),s.end();try{n(JSON.parse(d))}catch(u){r(u instanceof Error?u:new Error(String(u)))}}),s.once("close",()=>a())})}function Ry(e){return new Promise((t,n)=>{let r=py(e);r.once("connect",()=>t(r)),r.once("error",n)})}function ZA(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function hn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
|
|
291
|
+
`)}catch{}}function eE(e){try{return process.kill(e,0),!0}catch{return!1}}function Py(e){return new Promise(t=>setTimeout(t,e))}function tE(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Iy=["Runners","Feature Previews","Logs","Help"],vy=["piRunner","fileOpen","panelPolish"],Cy={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function Zd(e,t){return Qd(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 Ay(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 Ey(e=[]){let t=vy.some(n=>!e.includes(n));return Iy.map((n,r)=>r===1&&t?`${n} \xB7 NEW`:n)}function Oy(e,t=[]){return kt.map(n=>{let r=k.previews.isEnabled(e,n),s=vy.includes(n)&&!t.includes(n);return`${r?"[x]":"[ ]"} ${Cy[n]}${s?" \xB7 NEW":""}`})}function $y(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Ny(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Iy.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:oa(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Dy(e,t,n){if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(kt.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!oa(n))return{kind:"noop",state:e};let r=kt[e.menuIndex]??kt[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Cy[r]} ${s?"enabled":"disabled"}.`}}}function _y(e,t,n,r){if(e.pathEdit)return nE({...e,pathEdit:e.pathEdit},t,n);let s=Zd(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=Qd(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!oa(n))return{kind:"noop",state:e};let i=Qd(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 Qd(e){return me.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function nE(e,t,n){if(n==="ESCAPE")return{kind:"render",state:Sy({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(oa(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:Sy({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return rE(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function Sy(e){let t={...e};return delete t.pathEdit,t}function oa(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
292
|
+
`}function rE(e){return e.length===1&&e>=" "&&e!==""}var sE=/^\d+\.\d+\.\d+$/;async function xy(e,t={runCommand:K}){if(!sE.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}var eu=150,Fy=6;function Ly(e,t,n,r){if(e.inputMode!=="terminal"&&e.focusedRegion!=="center"||e.terminal.scrolledBack||e.terminal.rows.length===0)return e;let i=t.find(a=>a.id===e.selectedTaskId)?.ptyTabs.find(a=>a.id===e.activeTab||e.activeTab==="agent"&&a.kind==="agent");if(i?.kind!=="agent")return e;let o=n.find(a=>a.tabId===i.id);return!o||Ye(i.id,n,r)!=="ready"||e.readAgentActivityAt[i.id]===o.lastActivityAt?e:{...e,readAgentActivityAt:{...e.readAgentActivityAt,[i.id]:o.lastActivityAt}}}function aa(e,t,n,r){return t.some(s=>e.includes(s.tabId)&&Ye(s.tabId,t,n)==="ready"&&s.lastActivityAt>(r[s.tabId]??-1))}function My(e,t,n,r){let s=e.tasks.filter(o=>o.status!=="closed"&&o.status!=="merged"),i={workspaceCount:e.workspaces?.filter(o=>o.status==="active").length??e.repos.length,taskCount:s.length,workingAgents:0,readyAgents:0,attentionAgents:0,activityKnown:r};if(!r)return i;for(let o of s)for(let a of o.ptyTabs){if(a.kind!=="agent")continue;let l=bt(o,a.id,t,n);l==="working"&&i.workingAgents++,l==="ready"&&i.readyAgents++,l==="error"&&i.attentionAgents++}return i}import js from"node:path";function jy(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"\u{F06E6} ";case"js":case"jsx":case"mjs":case"cjs":return"\u{F031E} ";case"json":case"jsonc":return"\u{F0871} ";case"md":case"mdx":return"\u{F0354} ";case"yaml":case"yml":return"\u{F0B10} ";case"sh":case"bash":case"zsh":return"\u{F018D} ";case"css":case"scss":case"sass":return"\u{F031C} ";case"html":case"htm":return"\u{F031D} ";case"py":return"\u{F0320} ";case"go":return"\u{F07D3} ";case"rs":return"\u{F1617} ";case"lock":return"\u{F033E} ";case"png":case"jpg":case"jpeg":case"gif":case"svg":case"webp":return"\u{F02E9} ";default:return"\u{F0214} "}}var qy="\u{F024B} ",Uy="\u{F0DCF} ",By="\u25CB",tu="\uEA64",Wy="\uEAFE",Vy="\uEBDA",nu="\u25CB",ru="\u25CF",su="\u2713",iu="\u2715";function Ky(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 ca="empty",he={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function zy(e,t,n){let r=aE(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=VE(t.tasks),d=dE(e,a),u=cE(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ds(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":d===V?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:js.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${js.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:iE(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>KE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:lE(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:WE(s,a),rightInspection:PE(e,a,h)}}function iE(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 oE(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=Mo(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 $s(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:rr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame,unread:aa(d.ptyTabs.filter(y=>y.kind==="agent").map(y=>y.id),n.snapshots,n.now,e.readAgentActivityAt)}:{}},m=Xy(d);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function oE(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=jo(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 $s(l)){let h=t.selectedLeftItemId===`task:${u.id}`,f=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,m={id:`task:${u.id}`,taskId:u.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:rr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame,unread:aa(u.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),s.snapshots,s.now,t.readAgentActivityAt)}:{}},y=Xy(u);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function aE(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 lE(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${f}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return gt(["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 gt(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,d=l?"Project Task":"Task";return gt([`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"?gt([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):gt([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===V&&t.openInspectionKind==="file"?fE(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?mE(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?gt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):gt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function cE(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:uE(o),...o.kind==="agent"&&r&&t?{activity:bt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame,unread:aa([o.id],r.snapshots,r.now,e.readAgentActivityAt)}:{}}))??[];if(!t)return[{id:ca,label:"EMPTY",active:n===ca,focused:e.focusedRegion==="center"&&n===ca}];let i=e.openInspectionKind||n===V?[{id:V,label:pE(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function dE(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===V&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??V:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??V:ca}function uE(e){return e.title.toUpperCase()}function pE(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?js.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function fE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return gt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Jy(r.path??r.title);return[{text:r.title},{text:`${r.byteLength===null?"size unknown":`${r.byteLength} bytes`} \xB7 ${r.lines.length} lines \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...hE(r.lines,n,s)]}function mE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return gt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Jy(r.path??r.title);return[{text:r.title},{text:`${t.diffPaths.length} changed files \xB7 ${r.lines.length} rows \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...gE(r.lines,n,s)]}function gt(e){return e.map(t=>({text:t}))}function hE(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:he.lineNumber}},{text:" \u2502 ",style:{fg:he.gutter}},...ou(i,n)],tone:"default"}})}function gE(e,t,n){let r=yE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>wE(i,n))}function yE(e){let t=[],n=0,r=0;for(let s of e){let i=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(s);if(i){n=Number.parseInt(i[1]??"0",10),r=Number.parseInt(i[2]??"0",10);continue}if(!(s.startsWith("diff --git")||s.startsWith("index ")||s.startsWith("+++ ")||s.startsWith("--- "))&&!(s==="staged"||s==="unstaged"||s==="untracked")){if(s.startsWith("-")&&!s.startsWith("---")){t.push({oldNumber:n,newNumber:null,marker:"-",text:s.slice(1),kind:"delete"}),n+=1;continue}if(s.startsWith("+")&&!s.startsWith("+++")){t.push({oldNumber:null,newNumber:r,marker:"+",text:s.slice(1),kind:"add"}),r+=1;continue}if(s.startsWith(" ")){if(n===0&&r===0)continue;t.push({oldNumber:n,newNumber:r,marker:" ",text:s.slice(1),kind:"context"}),n+=1,r+=1;continue}}}return t}function wE(e,t){let n=Gy(e.oldNumber),r=Gy(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:he.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:he.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?TE(ou(e.text,t),i.bg,i.fallbackFg):ou(e.text,t),l=i?{fg:he.lineNumber,bg:i.bg}:{fg:he.lineNumber},c=i?{fg:he.gutter,bg:i.bg}:{fg:he.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Gy(e){return e===null?" ":String(e).padStart(4," ")}function Jy(e){let t=js.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function ou(e,t){return t==="diff"?kE(e):t==="markdown"?bE(e):t==="json"?au(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?au(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 kE(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:he.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:he.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:he.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:he.diffMeta}}]:[{text:e}]}function TE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function bE(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:he.markup,bold:!0}}]:au(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function au(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:RE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function RE(e){return e.startsWith("//")||e.startsWith("/*")?{fg:he.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:he.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:he.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:he.markup}:{fg:he.keyword}}function PE(e,t,n){let r=e.selectedProjectTargetId??t?.repoTargets?.[0]?.repoId??null,s=t?.type==="project"&&r?t.repoTargets?.find(a=>a.repoId===r)??null:null,i=t?.type==="project"?Qy(t.repoTargets??[]):s?.pullRequest??(t?H(t):null),o=[SE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=tw(e,t,n),l=lu(e,n),c=NE([{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,...qE(e,n)]}:{title:"",rows:[...o,...lu(e,n)]}}function SE(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=cu(t),o=du(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Hy(e){return[{text:" "},cu(e),{text:" "},du(e)]}function Xy(e){if(e.type==="project"&&e.repoTargets?.length){let n=Qy(e.repoTargets);return n?Hy(n):null}let t=H(e);return t?.number?Hy(t):null}function Qy(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=vE(n);return{number:-1,status:IE(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 IE(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 vE(e){let t=e.map(n=>Zy(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 cu(e){return!e||!e.number?{text:By,style:{fg:"565f89"}}:e.status==="merged"?{text:Wy,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Vy,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:tu,style:{fg:"565f89"}}:{text:tu,style:{fg:"9ece6a"}}}function du(e){return e?.aggregateReadiness?Yy(e.aggregateReadiness):Yy(Zy(e))}function Yy(e){return e==="failed"?{text:iu,style:{fg:"f7768e"}}:e==="pending"?{text:ru,style:{fg:"e0af68"}}:e==="success"?{text:su,style:{fg:"9ece6a"}}:{text:nu,style:{fg:"565f89"}}}function Zy(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")?ew(e)?"failed":CE(e)?"success":"pending":"pending"}function CE(e){return!!(e.mergeable&&!e.draft&&!ew(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function ew(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function tw(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return AE(e,t,n);let r=H(t),s=sw("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),i=t.prs.filter(o=>o!==r&&(o.status==="merged"||o.status==="closed")).length;return i>0&&s.push({id:"pr-history",text:`+ ${i} previous PR${i!==1?"s":""}`,muted:!0}),s}var la=32;function AE(e,t,n){let r=[],s=uu(t,n),i=e.selectedProjectTargetId??s[0]?.repoId??null,o=s.some(c=>c.repoId===i)?i:s[0]?.repoId??null;if(s.length===0)return[{id:"project-review-empty",text:"No repos with changes or pull requests.",muted:!0}];for(let c of s){let d=o===c.repoId,u=e.focusedRegion==="inspector"&&d,p=c.repoId.startsWith("repo_")?c.repoId.slice(5):c.repoId;if(c.status!=="ready"){let f=c.failureReason?c.failureReason.slice(0,14):c.status,m=la-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=la-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:d,focused:u,muted:!0})}else{let h=cu(c.pullRequest),f=du(c.pullRequest),m=`${h.text} ${f.text}`,y=la-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=la-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:d,focused:u,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?EE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...sw("target",a.branch,a.pullRequest)),l.length>0&&r.push({id:"target-pr-history",text:`+ ${l.length} previous PR${l.length!==1?"s":""}`,muted:!0})),r}function uu(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||nw(e,r).length>0)}function EE(e,t){return nw(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function nw(e,t){let n=OE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function OE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=$E(e.pullRequest.url);if(n)return n;let r=t.filter(i=>e.pullRequest.number!==null&&i.number===e.pullRequest.number),s=r.length===1?r[0]:null;return s?.owner&&s.repo?{owner:s.owner.toLowerCase(),repo:s.repo.toLowerCase()}:null}function $E(e){let t=e?.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+(?:[/?#].*)?$/i);return t?.[1]&&t[2]?{owner:t[1].toLowerCase(),repo:t[2].toLowerCase()}:null}function rw(e,t,n=null){return 3+tw(e,t,n).length+lu(e,n).length}function sw(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=DE(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:_E(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${iw(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(xE)):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)=>FE(u,r(`comment:${p}`))))),s}function NE(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 DE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function _E(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function iw(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 xE(e){let{icon:t,color:n}=ME(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," ")} ${jE(e.status)}`,color:n,muted:!1}}function FE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${iw(e.createdAt)}`:"",s=LE(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 LE(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 ME(e){switch(e){case"success":return{icon:su,color:"9ece6a"};case"pending":return{icon:ru,color:"e0af68"};case"failed":return{icon:iu,color:"f7768e"};case"skipped":return{icon:nu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function jE(e){return e==="success"?"passing":e==="failed"?"failing":e}function qE(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=pu(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)?qy:Uy:jy(l.label),p=l.kind==="directory"?"7aa2f7":Ky(l.label),h=" ".repeat(l.depth),f=p?{text:u,style:{fg:p}}:{text:u},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function pu(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(UE(t))return BE(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=>ow(i,e,t))))}return n}function UE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function BE(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=>ow(c,e,t,s.length+1))))}}return n}function ow(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 WE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:js.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function VE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function KE(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function aw(e,t,n,r,s=null,i=!1){if(s)return GE(e,t,n,r,s,i);let o=Md(e,t,{centerOnly:r,panelPolish:i});return HE(n,o)?{output:Qo(o.rows,n.rows,o.row,o.column),region:o}:null}function GE(e,t,n,r,s,i){let o=vg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!YE(n,o))return null;let a=n.rows.slice();return{output:o.rows.map(({index:c,row:d})=>a[c]===d?"":(a[c]=d,`\x1B[${o.row+c};${o.column}H${d}`)).join(""),region:{row:o.row,column:o.column,width:o.width,rows:a}}}function HE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function YE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function lw(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!zE(o,a))return null;!o||!a||(s+=Qo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function zE(e,t){return!e||!t?e===t:e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}var JE=["tasks","center","inspector"];function XE(e,t,n){if(t==="ESCAPE")return E({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return E({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return mu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return gu({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return E({state:{...e,fileSearchQuery:r},changed:!0})}return E({state:e})}function gu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return ag(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return XE(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return E({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return E({state:e,exit:!0});if(t==="ESCAPE")return E({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return E({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(qo(e.selectedLeftItemId)||Uo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:Lo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return cw(e,1);if(t==="SHIFT_TAB"||t==="[")return cw(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===V?gn(e,-1,n):mu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?gn(e,1,n):mu(e,1,n);if(t==="PAGE_UP")return gn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return gn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return gn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return gn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??wt,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=i0(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Ds(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&pg(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&pw(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return fu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return dw(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return fu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return dw(e,1)}if(et(t)){if(e.focusedRegion==="tasks"&&(qo(e.selectedLeftItemId)||Uo(e.selectedLeftItemId))){let r=Bo(e.selectedLeftItemId),s=Wo(e.selectedLeftItemId);return E({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Ds(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Pr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&pw(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Pr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===V)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:e0({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:V,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function gn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?fw(e,t,n):e.inspectionMode==="review"?uw(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return uw(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return t0(e,t,n)}return E({state:e})}function cw(e,t){return da(e,"focusedRegion",JE,t)}function fu(e,t,n){let r=da(e,"activeTab",n&&n.length>0?n:o0(e),t);return!r.changed||lg(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Pr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function mu(e,t,n){if(e.focusedRegion==="tasks")return QE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return fu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return fw(e,t,n);if(n.projectTargetIds?.length){let s=hu(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=hu(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:da(e,"selectedActionId",rg,t)}return da(e,"selectedActionId",Cd,t)}function QE(e,t,n){let r=hu(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Od(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=Bo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Wo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function ZE(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?V:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function dw(e,t){return ZE(e,s0(e.inspectionMode,Ad,t))}function fw(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Ht(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?V:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function e0(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 uw(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Ht(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function t0(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return n0(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=Ht(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let d=Ht(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Ht(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function n0(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Ht(e.diffScrollOffset+t,0,i),a=r0(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?E({state:e}):E({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function r0(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function da(e,t,n,r){let s=n.indexOf(e[t]),i=Ht(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function hu(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Ht(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function s0(e,t,n){let r=t.indexOf(e);return t[Ht(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function pw(e,t){return t.includes(e)}function i0(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Pr(e.activeTab)??e.preferredPtyTabKind}function o0(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Ht(e,t,n){return Math.min(n,Math.max(t,e))}var mw=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>G(r.paths,e.selectedTaskId,i=>{let o=t??a0(i,e.activeTab,e.preferredPtyTabKind),a=ww(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"}`}}},hw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await G(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},gw=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await G(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},yw=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await G(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=ww(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await G(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function a0(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function ww(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var $r=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},kw=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await st(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=bo();Ro(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 $r(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}},Tw=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},bw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await Lr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},Rw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Lr(t.paths,n.id)))),Nr=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await pe.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var Pw=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");let n=await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0}),r=n.tasks.filter(i=>i.status!=="closed");if(r.length>0)throw new Error(`Close tasks before removing workspace: ${r.map(i=>`${i.id} (${i.status})`).join(", ")}.`);await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId);let s=n.tasks.length>0;return s||await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks}),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:s?`Archived workspace ${e.selectedWorkspaceId}; closed task history preserved.`:`Removed workspace ${e.selectedWorkspaceId}`}}};var Sw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Iw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},vw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var l0=250;function Yt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function zt(e,t){return Vt(t,e.ptyRuntime.getViewState(Dr(e,t)))}function Dr(e,t){let n=Yt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function v(e,t){return zt(e,fg(t,e.model))}function Cw(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:v(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function Aw(e,t,n){return Cw(e,t,n?{tone:"success",message:n}:null)}function ce(e,t,n){return Cw(e,t,{tone:"error",message:n})}function oe(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return pe.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=xo(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function yu(e,t){if(!e.uiStateFile){e.runtimeState={...xo(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...xo(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function c0(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function de(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:be,queueTaskMutation:t=>c0(e,t)}}function wu(e,t){let n=Yt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?pu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:jn(e.model),centerTabIds:dg(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:rw(t,n,s),pageRows:Math.max(5,We(e.activeTerminal.width,e.activeTerminal.height).height-ee.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:uu(n,s).map(a=>a.repoId)}}async function Ew(e,t){await gw(t,de(e))}async function Se(e){e.model=await Sr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:v(e,e.state.shell)}:e.state={...e.state,shell:v(e,e.state.shell)}}function ua(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),...t.status==="closed"?[]:[t]].sort((n,r)=>n.id.localeCompare(r.id))}}async function pa(e,t){let n=++e.inspectionRefreshSequence,r=$d(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 Wh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Sr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Z(e,e.state.shell),e.render())}function Ow(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)&&pa(e,n).catch(r=>{let s=oe(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},l0))}function $w(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=gn(e.state.shell,n,wu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render(),pa(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render()}},16)))}function ku(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Tu(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 Dw(e){Tu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function _w(e,t){let n=v(e,t),r=Yt(e.model.tasks,n),s=Dr(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 Vt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Kt(We(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Vt({...n,inputMode:"control"},o)}function bu(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 Ru(e,t){try{let n=v(e,t),r=Yt(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 Nw(e,r),await Se(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Nw(e,r),await Se(e),s=r.selectedPtyTabId);let i=v(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Vt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Kt(We(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Gt(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Vt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=oe(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Gt(t.selectedPtyTabId)&&(await d0(e,t.selectedTaskId,r).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,og(v(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function d0(e,t,n){await Tw(t,n,de(e))}async function xw(e,t,n,r){let s=v(e,t),{nextShell:i}=await mw(s,n,r,de(e));return await Se(e),v(e,{...s,...i})}async function Fw(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await hw(n,de(e));return e.ptyRuntime.disposeSession(r.id),await Se(e),v(e,{...n,...s})}async function Lw(e,t){let n=v(e,t),r=jn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await bw(n,de(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Se(e),v(e,{...n,...o,selectedLeftItemId:u0(r,jn(e.model),s)})}async function Mw(e,t){let n=v(e,t),r=e.model.workspaces?.findIndex(a=>a.id===n.selectedWorkspaceId)??-1,{nextShell:s}=await Pw(n,de(e));await Se(e);let i=e.model.workspaces??[],o=i[Math.min(Math.max(0,r),i.length-1)];return v(e,{...n,...s,selectedLeftItemId:o?`workspace:${o.id}`:null})}async function Nw(e,t){return yw(t,de(e))}function fa(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:zt(e,e.state.shell)},e.render())},16))}function jw(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:zt(e,e.state.shell)},e.render())}function u0(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 Uw(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=qw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Rw(s,de(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)ua(e,o);t.recordSuccess(i,qw(e)),e.state={mode:"main",shell:v(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,Nr("background PR polling",i,de(e)))}}function qw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Bw(e,t){let n=v(e,t),r=Yt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Se(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Se(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${H(a)?.requiredChecks.length??0} reported`)}return v(e,{...Aw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import g0 from"node:path";import{readdir as p0,stat as f0}from"node:fs/promises";import Ww from"node:path";async function m0(e){let t=await p0(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Ww.join(e,r.name);n.push({name:r.name,path:s,kind:await h0(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 Vw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Kw(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 ma(e,t){let n=await m0(t);e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function h0(e){let t=Ww.join(e,".git");return await f0(t).catch(()=>null)!==null}function Gw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Hw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function y0(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"",r=t.taskPromptTarget;if(!r||!r.repoId&&!r.workspaceId){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:v(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${r.name}...`})},e.render();let s=null;try{let i=await kw(r.repoId,r.workspaceId,n,t.selectedRunner,de(e));s=i.task,await Se(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??Vg(s,"agent"),Kt(We(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Gt(o.selectedPtyTabId),e.state={mode:"main",shell:Vt(o,a)},Z(e,e.state.shell)}catch(i){i instanceof $r&&(s=i.task);let o=oe(e,"create task",i,"Failed to create task.");s&&!(i instanceof $r)?(await G(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Se(e).catch(()=>{})):s&&(await G(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function w0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:v(e,{...n,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(et(t)){y0(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:v(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:v(e,{...n,selectedRunner:Lo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Ed(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function k0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell.workspaceBrowser;if(!n)return;if(t==="ESCAPE"){if(n.query!==null){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:"",selectedIndex:0}})},e.render();return}if(n.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=n.query.slice(0,-1);e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}if(n.query!==null&&t.length===1&&t>=" "){let s=n.query+t;e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=Vw(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){ma(e,g0.dirname(n.cwd)).catch(s=>{let i=oe(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||et(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ma(e,s.path).catch(o=>{let a=oe(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=de(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Se(e);let a=o.repos[0]??null,l=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Z(e,e.state.shell),e.render()}).catch(o=>{let a=oe(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function T0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Ny(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;b0(e,r)}}}async function b0(e,t){let n;try{n=await pe.readLog(e.paths)}catch(r){let s=oe(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function R0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=_y(Gw(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"?Sw(n.runner,n.enabled,de(e)):Iw(n.runner,n.path,de(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=oe(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),i),runnerOptions:{...Gw(e),message:i}},e.render()})}function P0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Dy(Hw(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){yu(e,{seenPreviewIds:[...kt]});let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}vw(n.feature,n.enabled,de(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=oe(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),s),previewOptions:{...Hw(e),message:s}},e.render()})}}function ha(e){let t=v(e,{...e.state.shell,inputMode:"control"});e.state={mode:"main",shell:t},e.pendingClear=!0,e.render(),e.bootHydrationReady.then(()=>{e.state.mode!=="main"||e.state.shell!==t||_w(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Z(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=oe(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ce(e,v(e,e.state.shell),r)},Z(e,e.state.shell),e.render()})})}function S0(e){return[...e instanceof Error?e.message:"npm could not install the update."].map(r=>{let s=r.charCodeAt(0);return s<=31||s>=127&&s<=159?" ":r}).join("").replace(/\s+/g," ").trim().slice(0,160)}function Yw(e){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let t=e.state.update.latest;e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"installing"}},e.render(),e.installUpdate(t).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update||(e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"success"}},e.pendingClear=!0,e.render())}).catch(n=>{if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let r=S0(n);oe(e,"update Craig",n,r),e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"error",error:r}},e.pendingClear=!0,e.render()})}function I0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let n=e.state.update.phase;if(n==="installing")return;if(t==="ESCAPE"){ha(e);return}let r=n==="ready"?2:1;if(t==="UP"||t==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(t==="DOWN"||t==="j"){e.state={...e.state,menuIndex:Math.min(r,e.state.menuIndex+1)},e.render();return}if(et(t)){if(n==="ready"&&e.state.menuIndex===0){Yw(e);return}if(n==="ready"&&e.state.menuIndex===2){yu(e,{ignoredUpdateVersion:e.state.update.latest}),e.updateText=null,ha(e);return}if(n==="error"&&e.state.menuIndex===0){Yw(e);return}if(n==="success"&&e.state.menuIndex===1){e.exit(0);return}ha(e)}}function zw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){w0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){k0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){C0(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=gu(e.state.shell,n,wu(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&et(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Ls(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(v0(e,n))return;e.lastTerminalKey=Kg(n)?{key:n,at:Date.now()}:null;let i=Gg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){fa(e,i);return}Ed(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Gt(e.state.shell.selectedPtyTabId)&&jw(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ma(e,e.workspaceRoot).catch(s=>{let i=oe(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){xw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Ru(e,s)}).catch(s=>{let i=oe(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Fw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){Bw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Yt(e.model.tasks,r.state),i=s?H(s)?.url??null:null;i?Kw(i).catch(o=>{let a=oe(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ce(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ce(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){Lw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Mw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Ru(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ow(e,e.state.shell);return}pa(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},Ew(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){T0(e,n);return}if(e.state.variant==="runners"){R0(e,n);return}if(e.state.variant==="previews"){P0(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||et(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.variant==="update"){I0(e,n);return}if(e.state.optionsMessage){(n==="ESCAPE"||et(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(et(n)){if(e.state.menuIndex===0){e.state.variant==="boot"?ha(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),Dw(e));return}if(e.state.menuIndex===1){let r=e.state.variant==="boot"||e.state.variant==="pause"?e.state.variant:void 0;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}e.exit(0)}}function Jw(e,t){let n=Xg(t);if(e.state.mode!=="main"||e.state.shell.inputMode!=="terminal"||n.length===0)return;if(e.pendingTerminalKeySequence){let i=`${e.pendingTerminalKeySequence.raw}${n}`,o=Ls(i);if(o){Qw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Wd(i)){e.pendingTerminalKeySequence.raw=i,Xw(e);return}ga(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Z(e,e.state.shell),e.render();return}let r=Hg(n);if(r!==0){fa(e,r);return}let s=Ls(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
293
293
|
`&&n!==`\r
|
|
294
|
-
`&&(e.suppressTerminalEnterOnAttach=!1),Jg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function I0(e,t){if(e.pendingTerminalKeySequence){let n=Yg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Ls(r);if(s)return Qw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Wd(r))return e.pendingTerminalKeySequence.raw=r,Xw(e),!0}return ha(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>ha(e),30)},!0)}function Xw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>ha(e),30))}function ha(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Qw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Zw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){$w(e,Bd(t));return}let n=Bd(t);n!==0&&pa(e,n)}function v0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var A0=C0(import.meta.url),E0=A0("terminal-kit"),O0=E0.terminal;function Pu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function ek(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function tk(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function $0(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 nk(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Oe(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Un({uiStateFile:e.uiStateFile}):null,o=await Pr(t,void 0,s),a=Ns(ig(i,r),o);o=await Pr(t,a,s);let l={current:o},c=()=>{},u=()=>{},d=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>u(f),onActivityRemoved:f=>d(f),resolveSessionSpec:(f,m)=>Wg(l.current,m,t)},h=e.ptyRuntime??await my({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??O0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=!1,A=!1,Y=new Map,_e=h.managesPullRequestSync?null:new Er({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,z=new mn({resolutionMs:eu,onError:(P,L)=>$r(`heartbeat job "${P}"`,L,de(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Ns(a,o)},get model(){return l.current},set model(P){l.current=P},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:P=>f(P),installUpdate:e.installUpdate??xy},w.ptyRuntime.setActivityEnabled?.(!0),c=P=>{w.state.mode==="main"&&($=$0($,P),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let L=$;if($=null,w.state.mode==="main"){let ne=Yt(w,w.state.shell);if(w.state={mode:"main",shell:ne},!b||!T){w.render();return}let ge=We(m.width,m.height),ye={...b,terminal:ne.terminal},Ve=aw(ge,ye,T,ne.centerZoomed,L?.kind==="rows"?L.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!Ve){w.render();return}Ve.output.length>0&&m.noFormat(Ve.output),b=ye,T=Ve.region,R&&(R={...R,center:Ve.region}),y=null,m.hideCursor(!0)}},0)))},u=P=>{if(w.state.mode==="overlay"&&w.state.variant==="boot"&&k.previews.isEnabled(w.config,"panelPolish")){w.render();return}let L=Ye(P.tabId,[P],Date.now());w.state.mode==="main"&&Kt(P.tabId)&&(Y.get(P.tabId)!==L||L==="ready")&&w.render()},d=P=>{if(w.state.mode==="overlay"&&w.state.variant==="boot"&&k.previews.isEnabled(w.config,"panelPolish")){w.render();return}w.state.mode==="main"&&Kt(P)&&Y.get(P)!=="idle"&&w.render()};let yn=Promise.resolve(),ga=P=>{yn=yn.then(async()=>{let L=await Promise.all([...new Set(P)].map(ne=>S.getTask(w.paths,ne)));for(let ne of L)da(w,ne);w.state.mode==="main"?w.state={mode:"main",shell:v(w,w.state.shell)}:w.state={...w.state,shell:v(w,w.state.shell)},w.render()}).catch(L=>$r("daemon task-state refresh",L,de(w)))};w.ptyRuntime.setTasksChangedHandler?.(ga);let qs=Promise.resolve(),sk=P=>{qs=qs.then(async()=>{let L=w.state.shell,ne=w.model.tasks.find(Us=>Us.id===L.selectedTaskId)??null,ge=ne&&w.model.inspection?.taskId===ne.id?w.model.inspection:null;if(!ne||!ge)throw new Error("Craig needs an active task before it can open a file from an agent session.");let ye=await Xh(P);w.model={...w.model,inspection:{...ge,filePaths:[...new Set([...ge.filePaths,P])],selectedFilePath:P,selectedFile:ye,error:null}},w.ptyRuntime.detach();let Ve=v(w,{...L,inputMode:"control",focusedRegion:"center",activeTab:V,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:P,selectedFilePath:P,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:Ve},Z(w,Ve),w.render()}).catch(L=>$r("open file from agent",L,de(w)))};w.ptyRuntime.setOpenFileHandler?.(sk);let ya=null,Su=P=>{let L=We(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Bs=`${L.width}:${L.height}:${P.shell.centerZoomed}`;ya!==Bs&&(ya=Bs,w.ptyRuntime.resize(Vt(L,!0,P.shell.centerZoomed)),P.shell=Yt(w,P.shell))}else ya=null;let ne=w.ptyRuntime.getActivitySnapshots?.()??[],ge=Date.now(),ye=v(w,P.shell),Ve=Ly(ye,w.model.tasks,ne,ge);Ve!==ye&&(P.shell.readAgentActivityAt=Ve.readAgentActivityAt,Z(w,P.shell));let Us=zy(Ve,w.model,{snapshots:ne,now:ge,animationFrame:N});Y.clear();for(let Bs of w.model.tasks)for(let wa of Bs.ptyTabs)wa.kind==="agent"&&Y.set(wa.id,Ye(wa.id,ne,ge));let ok=Ig(L,Us,{versionText:w.versionText,updateText:w.updateText,centerOnly:P.shell.centerZoomed,panelPolish:k.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Us,presentation:ok}},Iu=(P,L,ne,ge)=>{if(!R)return!1;let ye=lw(R,L.regions,ne);return ye?(ye.output.length>0&&m.noFormat(ye.output),b=P,R=ye.regions,T=ye.regions.center,y=ge?L.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;bu(w),w.ptyRuntime.setPullRequestPollView?.(tk(w.state)),w.ptyRuntime.setViewedTab?.(Nr(w,w.state.shell));let{data:P,presentation:L}=Su(w.state);return Iu(P,L,["rail","left","center","footer"],!1)},w.render=()=>{bu(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(tk(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?Nr(w,P.shell):null);let L=We(m.width,m.height),ne,ge=null;if(P.mode==="main"){let ye=Su(P);if(ge=ye.presentation,ne=ge.frame,!w.pendingClear&&Iu(ye.data,ge,["rail","left","center","right","footer"],!0))return;b=ye.data,T=ge.center}else ne=P.variant==="boot"?Tg(L,{...k.previews.isEnabled(w.config,"panelPolish")?{splashSummary:My(w.model,w.ptyRuntime.getActivitySnapshots?.()??[],Date.now(),_&&w.ptyRuntime.getActivitySnapshots!==void 0)}:{},panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="pause"?bg(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?Ho(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:Ey(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?Ho(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Pu(P).menuIndex,optionsMenuItems:Zd(w.config,Pu(P)),optionsMessage:Ay(Pu(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?Ho(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:ek(P).menuIndex,optionsMenuItems:Oy(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:$y(ek(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?Rg(L,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?Sg(L,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):Pg(L),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Qg(ne,y)),y=ne,R=ge?.regions??null,m.hideCursor(!0)};let vu=P=>zw(w,P),Cu=P=>Jw(w,P),Au=P=>Zw(w,P),ik=()=>{A=!0,process.stdout.off("resize",Eu),process.off("SIGCONT",Ou),m.removeListener("key",vu),m.removeListener("unknown",Cu),m.removeListener("mouse",Au),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),z.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{ik(),f(P)};let Eu=()=>{ku(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Vt(We(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Yt(w,w.state.shell)}),w.render()},Ou=()=>{ku(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Vt(We(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Yt(w,w.state.shell)}),w.render()};process.stdout.on("resize",Eu),process.on("SIGCONT",Ou),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",vu),m.on("unknown",Cu),m.on("mouse",Au),_e&&z.register({id:"github.pull-requests",intervalMs:1e3,run:P=>Uw(w,_e,P)}),z.register({id:"agent.activity-indicators",intervalMs:eu,run:()=>{let P=Date.now(),L=Ri(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(L||D)&&(N=(N+1)%Fy,(w.state.mode==="main"||w.state.mode==="overlay"&&w.state.variant==="boot"&&k.previews.isEnabled(w.config,"panelPolish"))&&w.render()),D=L}}),z.start(),(e.checkForUpdate??k.version.checkForUpdate)().then(P=>{if(P.updateAvailable&&P.latest){if(w.runtimeState?.ignoredUpdateVersion===P.latest)return;w.updateText=`\u2192 v${P.latest} available`,w.state.mode==="overlay"&&w.state.variant==="boot"&&(w.state={mode:"overlay",variant:"update",menuIndex:0,optionsMessage:null,shell:w.state.shell,update:{current:P.current,latest:P.latest,phase:"ready"}},w.pendingClear=!0),w.render()}}),w.bootHydrationReady=Tu(w).then(()=>{_=!0}).catch(()=>{}).finally(()=>{!A&&w.state.mode==="overlay"&&w.state.variant==="boot"&&k.previews.isEnabled(w.config,"panelPolish")&&w.render()}),w.render()})}async function D0(){try{if(process.argv[2]==="__craig-daemon"){let e=await rk(process.argv[3]??process.cwd()),t=Oe(e);return await hy(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await rk(process.argv[3]??process.cwd()),t=Oe(e);return await gy(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
295
|
-
`),1}return qh({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=>nk({uiStateFile:Oe(e).uiStateFile,workspaceRoot:e})})}async function rk(e){return
|
|
294
|
+
`&&(e.suppressTerminalEnterOnAttach=!1),Jg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function v0(e,t){if(e.pendingTerminalKeySequence){let n=Yg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Ls(r);if(s)return Qw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Wd(r))return e.pendingTerminalKeySequence.raw=r,Xw(e),!0}return ga(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>ga(e),30)},!0)}function Xw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>ga(e),30))}function ga(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Qw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Zw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){$w(e,Bd(t));return}let n=Bd(t);n!==0&&fa(e,n)}function C0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var E0=A0(import.meta.url),O0=E0("terminal-kit"),$0=O0.terminal;function Pu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function ek(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function tk(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function N0(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 nk(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Oe(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Un({uiStateFile:e.uiStateFile}):null,o=await Sr(t,void 0,s),a=Ns(ig(i,r),o);o=await Sr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>d(f),onActivityRemoved:f=>u(f),resolveSessionSpec:(f,m)=>Wg(l.current,m,t)},h=e.ptyRuntime??await my({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??$0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=!1,A=!1,Y=new Map,_e=h.managesPullRequestSync?null:new Or({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,z=new mn({resolutionMs:eu,onError:(P,L)=>Nr(`heartbeat job "${P}"`,L,de(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Ns(a,o)},get model(){return l.current},set model(P){l.current=P},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:P=>f(P),installUpdate:e.installUpdate??xy},w.ptyRuntime.setActivityEnabled?.(!0),c=P=>{w.state.mode==="main"&&($=N0($,P),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let L=$;if($=null,w.state.mode==="main"){let re=zt(w,w.state.shell);if(w.state={mode:"main",shell:re},!b||!T){w.render();return}let ge=We(m.width,m.height),ye={...b,terminal:re.terminal},Ve=aw(ge,ye,T,re.centerZoomed,L?.kind==="rows"?L.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!Ve){w.render();return}Ve.output.length>0&&m.noFormat(Ve.output),b=ye,T=Ve.region,R&&(R={...R,center:Ve.region}),y=null,m.hideCursor(!0)}},0)))},d=P=>{if(w.state.mode==="overlay"&&w.state.variant==="boot"&&k.previews.isEnabled(w.config,"panelPolish")){w.render();return}let L=Ye(P.tabId,[P],Date.now());w.state.mode==="main"&&Gt(P.tabId)&&(Y.get(P.tabId)!==L||L==="ready")&&w.render()},u=P=>{if(w.state.mode==="overlay"&&w.state.variant==="boot"&&k.previews.isEnabled(w.config,"panelPolish")){w.render();return}w.state.mode==="main"&&Gt(P)&&Y.get(P)!=="idle"&&w.render()};let yn=Promise.resolve(),ya=P=>{yn=yn.then(async()=>{let L=await Promise.all([...new Set(P)].map(re=>S.getTask(w.paths,re)));for(let re of L)ua(w,re);w.state.mode==="main"?w.state={mode:"main",shell:v(w,w.state.shell)}:w.state={...w.state,shell:v(w,w.state.shell)},w.render()}).catch(L=>Nr("daemon task-state refresh",L,de(w)))};w.ptyRuntime.setTasksChangedHandler?.(ya);let qs=Promise.resolve(),sk=P=>{qs=qs.then(async()=>{let L=w.state.shell,re=w.model.tasks.find(Us=>Us.id===L.selectedTaskId)??null,ge=re&&w.model.inspection?.taskId===re.id?w.model.inspection:null;if(!re||!ge)throw new Error("Craig needs an active task before it can open a file from an agent session.");let ye=await Xh(P);w.model={...w.model,inspection:{...ge,filePaths:[...new Set([...ge.filePaths,P])],selectedFilePath:P,selectedFile:ye,error:null}},w.ptyRuntime.detach();let Ve=v(w,{...L,inputMode:"control",focusedRegion:"center",activeTab:V,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:P,selectedFilePath:P,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:Ve},Z(w,Ve),w.render()}).catch(L=>Nr("open file from agent",L,de(w)))};w.ptyRuntime.setOpenFileHandler?.(sk);let wa=null,Su=P=>{let L=We(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Bs=`${L.width}:${L.height}:${P.shell.centerZoomed}`;wa!==Bs&&(wa=Bs,w.ptyRuntime.resize(Kt(L,!0,P.shell.centerZoomed)),P.shell=zt(w,P.shell))}else wa=null;let re=w.ptyRuntime.getActivitySnapshots?.()??[],ge=Date.now(),ye=v(w,P.shell),Ve=Ly(ye,w.model.tasks,re,ge);Ve!==ye&&(P.shell.readAgentActivityAt=Ve.readAgentActivityAt,Z(w,P.shell));let Us=zy(Ve,w.model,{snapshots:re,now:ge,animationFrame:N});Y.clear();for(let Bs of w.model.tasks)for(let ka of Bs.ptyTabs)ka.kind==="agent"&&Y.set(ka.id,Ye(ka.id,re,ge));let ok=Ig(L,Us,{versionText:w.versionText,updateText:w.updateText,centerOnly:P.shell.centerZoomed,panelPolish:k.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Us,presentation:ok}},Iu=(P,L,re,ge)=>{if(!R)return!1;let ye=lw(R,L.regions,re);return ye?(ye.output.length>0&&m.noFormat(ye.output),b=P,R=ye.regions,T=ye.regions.center,y=ge?L.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;bu(w),w.ptyRuntime.setPullRequestPollView?.(tk(w.state)),w.ptyRuntime.setViewedTab?.(Dr(w,w.state.shell));let{data:P,presentation:L}=Su(w.state);return Iu(P,L,["rail","left","center","footer"],!1)},w.render=()=>{bu(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(tk(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?Dr(w,P.shell):null);let L=We(m.width,m.height),re,ge=null;if(P.mode==="main"){let ye=Su(P);if(ge=ye.presentation,re=ge.frame,!w.pendingClear&&Iu(ye.data,ge,["rail","left","center","right","footer"],!0))return;b=ye.data,T=ge.center}else re=P.variant==="boot"?Tg(L,{...k.previews.isEnabled(w.config,"panelPolish")?{splashSummary:My(w.model,w.ptyRuntime.getActivitySnapshots?.()??[],Date.now(),_&&w.ptyRuntime.getActivitySnapshots!==void 0)}:{},panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="pause"?bg(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:Ey(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Pu(P).menuIndex,optionsMenuItems:Zd(w.config,Pu(P)),optionsMessage:Ay(Pu(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:ek(P).menuIndex,optionsMenuItems:Oy(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:$y(ek(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?Rg(L,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?Sg(L,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):Pg(L),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Qg(re,y)),y=re,R=ge?.regions??null,m.hideCursor(!0)};let vu=P=>zw(w,P),Cu=P=>Jw(w,P),Au=P=>Zw(w,P),ik=()=>{A=!0,process.stdout.off("resize",Eu),process.off("SIGCONT",Ou),m.removeListener("key",vu),m.removeListener("unknown",Cu),m.removeListener("mouse",Au),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),z.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{ik(),f(P)};let Eu=()=>{ku(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Kt(We(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:zt(w,w.state.shell)}),w.render()},Ou=()=>{ku(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Kt(We(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:zt(w,w.state.shell)}),w.render()};process.stdout.on("resize",Eu),process.on("SIGCONT",Ou),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",vu),m.on("unknown",Cu),m.on("mouse",Au),_e&&z.register({id:"github.pull-requests",intervalMs:1e3,run:P=>Uw(w,_e,P)}),z.register({id:"agent.activity-indicators",intervalMs:eu,run:()=>{let P=Date.now(),L=Ri(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(L||D)&&(N=(N+1)%Fy,(w.state.mode==="main"||w.state.mode==="overlay"&&w.state.variant==="boot"&&k.previews.isEnabled(w.config,"panelPolish"))&&w.render()),D=L}}),z.start(),(e.checkForUpdate??k.version.checkForUpdate)().then(P=>{if(P.updateAvailable&&P.latest){if(w.runtimeState?.ignoredUpdateVersion===P.latest)return;w.updateText=`\u2192 v${P.latest} available`,w.state.mode==="overlay"&&w.state.variant==="boot"&&(w.state={mode:"overlay",variant:"update",menuIndex:0,optionsMessage:null,shell:w.state.shell,update:{current:P.current,latest:P.latest,phase:"ready"}},w.pendingClear=!0),w.render()}}),w.bootHydrationReady=Tu(w).then(()=>{_=!0}).catch(()=>{}).finally(()=>{!A&&w.state.mode==="overlay"&&w.state.variant==="boot"&&k.previews.isEnabled(w.config,"panelPolish")&&w.render()}),w.render()})}async function _0(){try{if(process.argv[2]==="__craig-daemon"){let e=await rk(process.argv[3]??process.cwd()),t=Oe(e);return await hy(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await rk(process.argv[3]??process.cwd()),t=Oe(e);return await gy(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
295
|
+
`),1}return qh({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=>nk({uiStateFile:Oe(e).uiStateFile,workspaceRoot:e})})}async function rk(e){return D0(e)}var x0=await _0();await Promise.all([process.stdout,process.stderr].filter(e=>e.writableLength>0).map(e=>new Promise(t=>e.write("",()=>t()))));process.exit(x0);
|