epiq 1.13.0 → 1.13.2

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/index.js CHANGED
@@ -1,129 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import Yt from"chalk";import{render as xD}from"ink";import SD from"meow";import RD from"react";import $I from"node:crypto";var gr={Success:"success",Fail:"fail"},l=e=>({status:gr.Fail,message:e,value:null}),u=(e,t)=>({status:gr.Success,message:e,value:t}),a=e=>e.status==="fail",Re=e=>e.status==="success";var qn="EPIQ_USER_NAME",La="EPIQ_USER_ID",Lf="0123456789ABCDEFGHJKMNPQRSTVWXYZ",jI=26,yd=80,vd=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),ka=e=>e.trim().length>0&&e.length<=yd,Mo=e=>e.trim().toLowerCase(),UI=e=>{let t=$I.createHash("sha256").update(`epiq:actor:${Mo(e)}`).digest(),n="";for(let r=0;r<jI;r++)n+=Lf[(t[r]??0)%Lf.length];return n},Lo=(e,t=process.env)=>{let n=(t[qn]??"").trim(),r=(t[La]??"").trim();return n?ka(n)?!r&&e.userId&&e.userName&&Mo(e.userName)===Mo(n)?u("Actor override names the configured user",{userId:e.userId,userName:e.userName}):r&&!vd(r)?l(`${La} must be 26 characters of Crockford base32`):r&&e.userId&&r===e.userId?l(`${La} is the configured user's own id; using it under a different name would rename them on the board`):u("Resolved actor from environment",{userId:r||UI(n),userName:r?n:Mo(n)}):l(`${qn} must be 1-${yd} characters of text`):r?l(`${La} is set without ${qn}`):u("No actor override",null)},bd=(e,t,n=process.env)=>{let r=e.trim();if(!ka(r))return l(`${t} must be 1-${yd} characters of text`);let o=(n[qn]??"").trim();return o&&Mo(o)!==Mo(r)?l(`${t} names ${r}, but ${qn} names ${o}`):(o||(n[qn]=r),u("Applied actor name argument",o||r))};import TC from"node:path";import{z as Xt}from"zod";var ko=e=>{let t=typeof e=="number"?e:Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<3e3||t>864e5?null:t},Po=e=>e==null||!Number.isFinite(e)?1e4:Math.min(864e5,Math.max(1,e));import Hs from"node:fs";import In from"node:path";import hr from"node:fs";import Lt from"node:path";import Ds from"node:fs";import{ulid as HI}from"ulid";import{z as Pa}from"zod";var xd="__epiq_state__",WI=Pa.object({projectId:Pa.string().min(1),stateBranch:Pa.string().min(1),createdAt:Pa.iso.datetime()}),Oa=()=>({projectId:HI(),stateBranch:xd,createdAt:new Date().toISOString()}),St=e=>{let t=Oo(e);if(!Ds.existsSync(t))return l("Missing .epiq/project.json");try{let n=Ds.readFileSync(t,"utf8"),r=JSON.parse(n),o=WI.safeParse(r);return o.success?u("Read project.json",o.data):l(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return l(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},En=e=>{let t=St(e);return a(t)?l(t.message):u("Read projectId",t.value.projectId)},Sd=({repoRoot:e,fileContents:t})=>{let n=Yr(e),r=Oo(e);try{if(Ds.mkdirSync(n,{recursive:!0}),Ds.existsSync(r)){let o=St(e);return a(o)?l(o.message):u("Project already initialized",null)}return Ds.writeFileSync(r,JSON.stringify(t,null,2)+`
3
- `,"utf8"),u("Created project.json",null)}catch(o){return l(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};import GI from"node:os";import VI from"node:path";var ln=".epiq-global",Tt=()=>process.env.EPIQ_GLOBAL_DIR??VI.join(GI.homedir(),ln);var Rd=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let i=r(...s);if(!n.has(i)){let c=e(...s).then(d=>(a(d)&&n.delete(i),d));n.set(i,c)}return n.get(i)});return o.clear=()=>n.clear(),o};import cn from"fs";import Nd from"path";import zI from"util";var kf=500,Ad=4*1024*1024,Ed=16*1024,KI=50,Id=0,Pf=()=>process.env.EPIQ_MCP==="true",qI=()=>{let e=process.cwd(),t=Da(e);return a(t)?Pf()?Nd.join(Tt(),"epiq-mcp.log"):void 0:Nd.join(t.value,Rt,"log","epiq.log")},YI=(e,t)=>{let n=cn.statSync(e).size;if(n<=t)return cn.readFileSync(e,"utf8");let r=cn.openSync(e,"r");try{let o=Buffer.alloc(t);cn.readSync(r,o,0,t,n-t);let s=o.toString("utf8"),i=s.indexOf(`
4
- `);return i===-1?"":s.slice(i+1)}finally{cn.closeSync(r)}};function XI(e){if(!cn.existsSync(e))return;let t=cn.statSync(e).size,n=YI(e,Ad).split(`
5
- `);if(n[n.length-1]===""&&n.pop(),t<=Ad&&n.length<=kf)return;let r=n.slice(-kf).join(`
6
- `)+`
7
- `;cn.writeFileSync(e,r,"utf8")}var JI=e=>{if(e.length<=Ed)return e;let t=e.length-Ed;return`${e.slice(0,Ed)} \u2026 [${t} more chars]`};function Cd(e,t,n=!1){let r=qI();if(!r)return;let o=JI(zI.format(...t)),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
8
- `;try{cn.mkdirSync(Nd.dirname(r),{recursive:!0}),cn.appendFileSync(r,c,"utf8"),Id++,(Id>=KI||cn.statSync(r).size>Ad)&&(Id=0,XI(r))}catch{}}var wd=()=>Pf()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",G={info(...e){let t=wd();(t==="info"||t==="debug")&&Cd("[Info]",e,!1)},debug(...e){wd()==="debug"&&Cd("[Debug]",e,!0)},error(...e){let t=wd();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;Cd("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=G;import{spawn as Ff}from"node:child_process";import Mt from"node:fs";import Ve from"node:path";var Ne={stage:({cwd:e,pathspec:t,ignoreRemoval:n=!1})=>U({args:["add",...n?["--ignore-removal"]:[],...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:r})=>U({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...r?.length?["--",...r]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>U({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>U({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>U({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push","--no-verify",...r?["-u"]:[],t,n]:["push","--no-verify"];return U({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>U({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>U({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>U({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>U({args:["worktree","prune"],cwd:e})};var $e=e=>{let t=ce(e);if(a(t))return l("Unable to resolve epiq project root");let n=St(t.value);return a(n)?l("Unable to read project.json"):u("Resolved state branch",n.value.stateBranch)},jt="origin";var _f="Output past",Fa=e=>e.includes(_f),$f="Git command timed out",jf=e=>e.includes($f),Md=1e4,ZI=12e4,Ld=256*1024*1024,Uf=64*1024,QI=8*1024*1024,eC=new Set(["fetch","push","pull","clone","ls-remote","rebase","checkout","worktree"]),tC=e=>{let t=Wf(e);return t&&eC.has(t)?ZI:Md},nC=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(Ve.delimiter))if(t)for(let n of e){let r=Ve.join(t,n);try{if(!Mt.statSync(r).isFile())continue;return Mt.accessSync(r,Mt.constants.X_OK),r}catch{continue}}return"git"},Hf=nC(),rC=["GIT_DIR","GIT_WORK_TREE","GIT_INDEX_FILE","GIT_OBJECT_DIRECTORY","GIT_ALTERNATE_OBJECT_DIRECTORIES","GIT_COMMON_DIR","GIT_NAMESPACE"],oC=e=>Object.fromEntries(Object.entries(e).filter(([t])=>!rC.includes(t))),kd={...oC(process.env),GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},sC=["-c","diff.noprefix=false","-c","diff.mnemonicPrefix=false","-c","diff.srcPrefix=a/","-c","diff.dstPrefix=b/","-c","log.showSignature=false"],iC=new Set(["log","show","diff"]),Wf=e=>e.find((t,n)=>!t.startsWith("-")&&e[n-1]!=="-c"),aC=e=>iC.has(Wf(e)??"")?sC:[],Gf=()=>["attr.tree=refs/epiq/no-attributes",`core.hooksPath=${Ve.join(Tt(),"repos",".no-hooks")}`,"protocol.ext.allow=never","protocol.fd.allow=never","protocol.file.allow=always","submodule.recurse=false","fetch.recurseSubmodules=false","credential.interactive=never","core.longpaths=true","gc.auto=0","maintenance.auto=false","fetch.unpackLimit=1","fetch.writeCommitGraph=false","core.logAllRefUpdates=false"].flatMap(e=>["-c",e]),lC=/^[\w-]+[\\/][a-z0-9._-]+-[0-9a-f]{12}\.git(\.\d+(-\d+)?(\.[0-9a-f-]{36})?\.pending)?$/,Of=e=>{try{return Mt.realpathSync(e)}catch{return Ve.resolve(e)}},Pd=e=>{let t=Ve.join(Tt(),"repos");return[[Ve.resolve(t),Ve.resolve(e)],[Of(t),Of(e)]].some(([n,r])=>lC.test(Ve.relative(n,r)))},cC=e=>Pd(e)?["--git-dir=.",...Gf()]:[],Vf={...Object.fromEntries(Object.entries(kd).filter(([e])=>e!=="GIT_ALLOW_PROTOCOL")),LC_ALL:"C",LANGUAGE:"",GIT_PROTOCOL_FROM_USER:"0"},Ba=new Set,Df=!1,zf=process.platform!=="win32",Kf=(e,t)=>{try{if(zf&&e.pid){process.kill(-e.pid,t);return}}catch{}e.kill(t)},Td=(e="SIGTERM")=>{for(let t of Ba)Kf(t,e)},dC=["SIGTERM","SIGINT","SIGHUP"],qf=!1,Yf=()=>qf,uC=2e3,Xf=()=>{if(Df)return;Df=!0,process.once("exit",()=>Td());let e=new Map;for(let t of dC)e.set(t,()=>{qf=!0;let n=()=>{for(let[s,i]of e)process.off(s,i);process.kill(process.pid,t)};Td();let r=Date.now()+uC,o=()=>{if(Ba.size===0)return n();if(Date.now()>=r)return Td("SIGKILL"),n();setTimeout(o,20)};o()});for(let[t,n]of e)process.once(t,n)},Jf=e=>{Ba.add(e),e.once("close",()=>Ba.delete(e))},Zf=({args:e,cwd:t,allowFail:n,timeoutMs:r,maxOutput:o=Ld,forClone:s=!1,keepPartial:i=!1,abort:c})=>new Promise(d=>{let p=Pd(t),m=p||s,f=[...aC(e),...p?["--git-dir=."]:[],...m?Gf():[],...e];if(!Mt.existsSync(t)){let D=`Git cwd does not exist: ${t}`;if(n){d({stdout:"",stderr:D,exitCode:1});return}d(l(D));return}m&&Xf();let g=Ff(Hf,f,{cwd:t,stdio:["ignore","pipe","pipe"],env:m?Vf:kd,detached:m&&zf});m&&Jf(g);let h=D=>m?Kf(g,D):g.kill(D),y=!1,v="",R="",S=D=>{y||(y=!0,clearTimeout(O),d(D))},N=r??tC(f),k=!1,L=()=>[`git ${f.join(" ")}`,`cwd=${t}`,`${$f} after ${N}ms`].join(`
9
- `),A=()=>S(n?{stdout:v,stderr:L(),exitCode:124}:l(L())),O=setTimeout(()=>{k=!0,h("SIGTERM"),setTimeout(()=>h("SIGKILL"),3e3).unref(),setTimeout(A,6e3).unref()},N),j=null,W=()=>{let D=[`git ${f.join(" ")}`,j].join(`
10
- `);S(n?{stdout:v,stderr:D,exitCode:1}:l(D))},ge=()=>{j=String(c?.reason??"stopped"),h("SIGTERM"),setTimeout(()=>h("SIGKILL"),3e3).unref(),setTimeout(W,6e3).unref()};c?.aborted?ge():c?.addEventListener("abort",ge,{once:!0}),g.stdout.setEncoding("utf8"),g.stderr.setEncoding("utf8"),g.stdout.on("data",D=>{if(v+=D,v.length>o){if(h("SIGTERM"),i&&!n){let Fe=v.slice(0,o);S(u("Git output cut",{stdout:Fe.slice(0,Fe.lastIndexOf(`
11
- `)+1),stderr:R,exitCode:0,truncated:!0}));return}let X=`git ${f.join(" ")}
12
- ${_f} ${o} characters; stopped`;S(n?{stdout:"",stderr:X,exitCode:1}:l(X))}}),g.stderr.on("data",D=>{R.length<Uf&&(R+=D)}),g.on("error",D=>{if(n){S({stdout:v,stderr:D.message,exitCode:1});return}S(l([`git ${f.join(" ")}`,`cwd=${t}`,D.message].join(`
13
- `)))}),g.on("close",D=>{if(c?.removeEventListener("abort",ge),k)return A();if(j!==null)return W();let X=D??1;if(n){S({stdout:v,stderr:R,exitCode:X});return}if(X!==0){S(l([`git ${f.join(" ")}`,R.trim()||v.trim()||"Git command failed"].filter(Boolean).join(`
14
- `)));return}S(u("Git command succeeded",{stdout:v,stderr:R,exitCode:X}))})}),U=({args:e,cwd:t,timeoutMs:n,maxOutput:r,forClone:o,keepPartial:s,abort:i})=>Zf({args:e,cwd:t,allowFail:!1,timeoutMs:n,maxOutput:r,forClone:o,keepPartial:s,abort:i}),ke=({args:e,cwd:t})=>Zf({args:e,cwd:t,allowFail:!0}),_a=(e,t)=>new Promise(n=>{if(e.length===0){n(u("No blobs to read",new Map));return}let r=Pd(t);r&&Xf();let o=Ff(Hf,[...cC(t),"cat-file","--batch"],{cwd:t,stdio:["pipe","pipe","pipe"],env:r?Vf:kd});r&&Jf(o);let s=[],i="",c=!1,d=f=>{c||(c=!0,clearTimeout(p),n(f))},p=setTimeout(()=>{o.kill("SIGTERM"),d(l(`git cat-file --batch timed out after ${Md}ms`))},Md),m=0;o.stdout.on("data",f=>{if(m+=f.length,m>Ld){o.kill("SIGTERM"),d(l(`git cat-file --batch: past ${Ld} bytes; stopped`));return}s.push(f)}),o.stderr.setEncoding("utf8"),o.stderr.on("data",f=>{i.length<Uf&&(i+=f)}),o.on("error",f=>d(l(f.message))),o.on("close",f=>{if(f!==0){d(l(`git cat-file --batch exited ${f}${i?`
15
- ${i}`:""}`));return}let g=Buffer.concat(s),h=new Map,y=0;for(let v of e){let R=g.indexOf(10,y);if(R===-1){d(l(`git cat-file --batch output ended before a header for ${v}`));return}let S=g.toString("utf8",y,R);y=R+1;let N=/^[0-9a-f]{4,64} \S+ (\d+)$/.exec(S);if(!N||!N[1]){d(l(`Unexpected git cat-file --batch header: "${S}"`));return}let k=Number(N[1]);k<=QI&&h.set(v,g.toString("utf8",y,y+k)),y+=k+1}d(u("Read blobs",h))}),o.stdin.write(e.join(`
16
- `)+`
17
- `),o.stdin.end()}),Bo=async({cwd:e,message:t,pathspec:n})=>{let r=await Ne.commit({cwd:e,message:t,pathspec:n});if(a(r))return l(`Failed to create commit
18
- ${r.message}`);let o=await U({args:["rev-parse","HEAD"],cwd:e});return a(o)?l(`Commit created, but failed to read HEAD SHA
19
- ${o.message}`):u("Created commit and resolved SHA",o.value.stdout.trim())},Bs=async e=>{let t=await U({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return l(t.message);let n=t.value.stdout.trim();return u("Resolved git dir",Ve.isAbsolute(n)?n:Ve.resolve(e,n))},Od=async e=>{let t=await Bs(e);if(a(t))return l(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(r))if(Mt.existsSync(Ve.join(n,s)))return u("Checked for in-progress Git operation",i);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(o))if(Mt.existsSync(Ve.join(n,s)))return u("Checked for in-progress Git operation",i);return u("Checked for in-progress Git operation",null)},Qf=async e=>{let t=await Od(e);return a(t)?l(t.message):u("Checked for in-progress Git operation",t.value!==null)},Yn=async({repoRoot:e})=>{let n=(await ke({args:["remote","get-url",jt],cwd:e})).exitCode===0;return u(`Checked remote ${n}`,n)},Fs=async({repoRoot:e,branch:t})=>{let n=await ke({args:["ls-remote","--heads",jt,t],cwd:e});return n.exitCode!==0?l(n.stderr.trim()||`Unable to inspect remote branch ${jt}/${t}`):u("Checked remote branch",n.stdout.trim().length>0)},$a=async({repoRoot:e,branch:t})=>{let n=await ke({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?u("Local branch exists",!0):n.exitCode===1?u("Local branch missing",!1):l(n.stderr.trim()||`Unable to inspect branch ${t}`)},Do=e=>{try{return Mt.realpathSync.native(e)}catch{return Ve.resolve(e)}},eg=async({repoRoot:e,worktreeRoot:t})=>{let n=await U({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return l(n.message);let r=Do(t),o=n.value.stdout.split(`
20
- `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Do).includes(r);return u("Checked worktree registration",o)},Dd=async e=>{let t=await ke({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return u("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},ja=async e=>{let t=await U({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?l(t.message):u("Resolved current branch",t.value.stdout.trim())},tg=async e=>{let t=await U({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?l(t.message):u("Resolved short HEAD sha",t.value.stdout.trim())},ng=e=>e.includes("fetch first")||e.includes("non-fast-forward"),rg=async e=>{let t=await ke({cwd:e,args:["rev-parse","--absolute-git-dir"]});if(t.exitCode!==0)return!1;let n=t.stdout.trim();return n?Mt.existsSync(Ve.join(n,"rebase-merge"))||Mt.existsSync(Ve.join(n,"rebase-apply")):!1},mC=3,pC=120,fC=e=>new Promise(t=>setTimeout(t,e)),gC=async(e,t)=>{let n=await Ne.rebaseOnto({cwd:e,ref:t});for(let r=1;r<mC;r+=1){if(!a(n)||await rg(e))return n;await fC(pC),n=await Ne.rebaseOnto({cwd:e,ref:t})}return n},og=async(e,{preserve:t=[]}={})=>{let n=await Bs(e);if(a(n))return l(n.message);let r=n.value,o=[];for(let s of Mt.readdirSync(r))if(s.endsWith(".lock")&&!t.includes(s))try{Mt.rmSync(Ve.join(r,s),{force:!0}),o.push(s)}catch{}return u("Cleared stale git lock files",o)},sg=async(e,t)=>{let n=await ke({cwd:e,args:["rev-parse","--git-common-dir"]});if(n.exitCode!==0)return l(`Unable to resolve the common git directory at ${e}`);let r=Ve.resolve(e,n.stdout.trim()),o=Ve.join(r,"refs","heads"),s=Ve.resolve(o,`${t}.lock`);if(!s.startsWith(`${o}${Ve.sep}`))return l(`Refusing to clear a ref lock outside ${o}`);if(!Mt.existsSync(s))return u("No ref lock to clear",!1);try{Mt.rmSync(s,{force:!0})}catch{return u("Ref lock could not be cleared",!1)}return u("Cleared a stale ref lock",!0)},Bd=async e=>{if(!await rg(e))return u("No rebase to abort",!1);let t=await ke({cwd:e,args:["rebase","--abort"]});return t.exitCode!==0?l(`Failed to abort the rebase in progress at ${e}
21
- ${t.stderr.trim()}`):u("Aborted stale rebase",!0)},Bf=async e=>{let t=await ke({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},_s=e=>/could not resolve host/i.test(e)||/connection refused|connection timed out|operation timed out/i.test(e)||/network is unreachable|no route to host/i.test(e)||/failed to connect to/i.test(e),hC=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),$s=async({cwd:e,branch:t})=>{let n=await Bd(e);if(a(n))return l(n.message);let r=await Bf(e),o=await Ne.fetch({cwd:e,remote:jt,branch:t});if(a(o))return hC(o.message)?u("Remote branch missing, skipped pull",!1):l(`Failed to fetch ${t}
22
- ${o.message}`);let s=await gC(e,`${jt}/${t}`);if(a(s))return l(`Failed during rebase
23
- ${s.message}`);let i=await Bf(e),c=r!==null&&i!==null&&r!==i;return u(c?"Pulled with rebase":"Already up to date",c)},ig=async e=>{let t=await ke({args:["rev-list","--count","@{u}..HEAD"],cwd:e});return t.exitCode!==0?u("No upstream to compare against",!1):u("Compared against upstream",Number(t.stdout.trim())>0)},ag=async e=>{let t=await ke({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?l(t.stderr.trim()||"Unable to inspect the worktree for changes"):u("Inspected worktree for changes",t.stdout.trim().length>0)},lg=async(e,t)=>{let n=await ke({args:["diff","--cached","--quiet",...t?.length?["--",...t]:[]],cwd:e});return n.exitCode===0?u("No staged changes",!1):n.exitCode===1?u("Has staged changes",!0):l(n.stderr.trim()||"Unable to inspect staged changes")};var cg=async e=>{let t=await ja(e);return a(t)?l(t.message):u("Checked detached HEAD state",t.value==="HEAD")};var mg="4b825dc642cb6eb9a060e54bf8d69288fbee4904",pg=e=>Lt.join(Rt,Xn,e),fg=()=>Lt.join(Rt,$d),gg=Tt,Xr=()=>Lt.join(gg(),"worktrees"),me=({repoRoot:e})=>{let t=En(e);return a(t)?l(t.message):u("Resolved state branch root",Lt.join(Xr(),t.value))},yC=e=>Lt.join(e,Rt),dg=e=>Lt.join(yC(e),Xn);var js=e=>{try{return hr.mkdirSync(e,{recursive:!0}),u("Ensured directory",void 0)}catch(t){return l(t instanceof Error?t.message:String(t))}},Us=()=>{let e=gg(),t=Xr(),n=!hr.existsSync(e)||!hr.existsSync(t),r=js(e);if(a(r))return l(`Ensure epiq home failed.
24
- `+r.message);let o=js(t);return a(o)?l(`Ensure worktrees dir failed.
25
- `+o.message):u("Ensured epiq storage",n)},hg=e=>{hr.existsSync(e)&&(G.debug("[sync] remove path",e),hr.rmSync(e,{recursive:!0,force:!0}))};var vC=`*.jsonl merge=union
26
- `,bC=`*~pending*.jsonl
27
- `,Fd=()=>Lt.join(Rt,Xn,".gitattributes"),_d=()=>Lt.join(Rt,Xn,".gitignore"),ug=(e,t)=>{try{hr.readFileSync(e,"utf8")!==t&&hr.writeFileSync(e,t)}catch{hr.writeFileSync(e,t)}},yg=(e,t)=>{for(let n of[dg(e),dg(t)]){let r=js(n);if(a(r))return l(r.message)}return ug(Lt.join(t,Fd()),vC),ug(Lt.join(t,_d()),bC),u("Ensured state branch",void 0)},vg=async e=>{let t=await U({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return l(`ensure state branch is storage only failed
28
- `+t.message);let r=t.value.stdout.trim().split(`
29
- `).filter(Boolean).filter(i=>i!==Rt);if(r.length===0)return u("State branch is storage-only",!1);let o=await U({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return l(`Failed to clean storage branch
30
- ${o.message}`);let s=await Bo({cwd:e,message:"[epiq:repair-storage-branch]",pathspec:r});return a(s)?l(s.message):u("Cleaned storage branch",!0)},dn=Rd(async(e=process.cwd())=>{let t=await U({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?l("Not inside a Git repository"):u("Resolved repo root",t.value.stdout.trim())},e=>Lt.resolve(e)),RB=Rd(async e=>{let t=await U({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return l(t.message);let n=t.value.stdout.trim(),r=Lt.isAbsolute(n)?n:Lt.join(e,n);return u("Resolved git dir",r)},e=>Lt.resolve(e));var TB=process.env.IS_LOCAL==="true",Rt=".epiq",Xn="events",$d="media",xC="project.json",Yr=e=>In.join(e,Rt),Oo=e=>In.join(Yr(e),xC),kt=e=>In.join(Yr(e),Xn),Ws=e=>In.join(Yr(e),$d),bg=e=>In.join(e,Rt),SC=e=>{let t=In.join(e,Rt);return Hs.existsSync(t)&&Hs.statSync(t).isDirectory()},Gs=e=>{let t=Oo(e);return Hs.existsSync(t)&&Hs.statSync(t).isFile()},Da=e=>{let t=In.resolve(e);for(;;){if(SC(t))return u("Resolved closest .epiq root",t);let n=In.dirname(t);if(n===t)return l("No .epiq directory found in any parent");t=n}},jd="No .epiq/project.json found in any parent",ce=e=>{let t=In.resolve(e);for(;;){if(Gs(t))return u("Resolved closest epiq project root",t);let n=In.dirname(t);if(n===t)return l(jd);t=n}},xg=e=>{let t=kt(e);try{return Hs.mkdirSync(t,{recursive:!0}),u("Resolved events dir",t)}catch(n){return l(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},Ce=async()=>{let e=await dn(process.cwd());if(a(e))return e;let t=me({repoRoot:e.value});return a(t)?t:u("Resolved persist root",t.value)};import{accessSync as RC,copyFileSync as EC,existsSync as Ua,mkdirSync as Sg,readdirSync as Rg,readFileSync as IC,renameSync as CC,rmSync as wC,statSync as Eg,unlinkSync as NC,writeFileSync as AC}from"node:fs";import Fo from"node:path";var Ud=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",ct={writeToFile:(e,t)=>{try{let n=Fo.dirname(e);Ua(n)||Sg(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);AC(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return IC(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ct.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Ua(e)&&Eg(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await RC(e),!0}catch{return!1}},mkDir:e=>Sg(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Fo.parse(t);for(;;){let r=Fo.join(t,e);try{if(Ua(r)&&Eg(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Fo.dirname(t)}return null},readFirstJSON(e){try{if(!ct.dirExists(e))return null;let t=Rg(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Fo.join(e,t);return ct.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ct.dirExists(e)?Rg(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{NC(e)}catch(t){(!Ud(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{wC(e,{recursive:!0,force:!0})}catch(t){(!Ud(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Fo.dirname(t)),!n?.overwrite&&Ua(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{CC(e,t)}catch(r){if(Ud(r)&&r.code==="EXDEV"){EC(e,t),this.rmFile(e);return}throw r}}};var MC={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Cg=Xt.object({logLevel:Xt.enum(["info","error","debug"]),preferredEditor:Xt.string().optional(),userName:Xt.string().optional(),userId:Xt.string().optional(),autoSync:Xt.boolean().nullable().optional(),autoSyncDebounceMs:Xt.number().optional(),attachmentMaxKb:Xt.number().optional(),repoCloneMaxMb:Xt.number().optional(),viewMode:Xt.enum(["dense","wide"]).optional(),declinedEmailBoards:Xt.array(Xt.string()).optional()}).partial(),LC="config.json",wg=Tt,Hd=()=>TC.join(wg(),LC),Wd=()=>{try{return ct.mkDir(wg()),u(`Ensured ~/${ln} exists`,null)}catch{return l(`Unable to create ~/${ln}`)}},kC=e=>{let t;try{t=JSON.parse(e)}catch{return l(`Invalid ~/${ln}/config.json JSON`)}let n=Cg.safeParse(t??{});return n.success?u("Parsed config",n.data):l(`Invalid ~/${ln}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Jt=()=>{let e=Wd();if(a(e))return l(e.message);let t=Hd(),n=ct.readFile(t);return n==null||n.trim()===""?u("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):kC(n)},Ng=e=>{let t=Wd();if(a(t))return l(t.message);let n=Cg.safeParse(e);if(!n.success)return l(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Hd();try{return ct.writeToFile(r,JSON.stringify(n.data,null,2)+`
31
- `),u("Config written",null)}catch{return l(`Unable to write ~/${ln}/config.json`)}},Pt=e=>{let t=Jt();if(a(t))return l("Failed to read existing config");let n={...t.value,...e};return Ng(n)},Et=()=>{let e=Hd(),t=Wd();if(a(t))return l(`Unable to create ~/${ln}`);if(!(ct.readFile(e)!==null)){let v=Ng(MC);if(a(v))throw new Error(`Unable to create ~/${ln}/config.json`)}let r=Jt();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:i,declinedEmailBoards:c,autoSync:d,autoSyncDebounceMs:p,attachmentMaxKb:m,logLevel:f,viewMode:g}=r.value,h=Lo({userId:i,userName:s});if(a(h))return l(h.message);let y=h.value??{userId:i,userName:s};return!y.userName||!y.userId?l(`User name or ID not configured in ~/${ln}/config.json`):(process.env.EPIQ_LOG_LEVEL=f,u("successfully loaded settings",{gitEmail:null,gitName:null,declinedEmailBoards:c??[],logLevel:f??"debug",preferredEditor:o??"",userName:y.userName,userId:y.userId,autoSync:d??!1,autoSyncIntervalMs:p??1e4,attachmentMaxKb:m??null,viewMode:g??"dense"}))};import{useSyncExternalStore as PC}from"react";var Vs={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,gitEmail:null,gitName:null,declinedEmailBoards:[],viewMode:null},Gd=new Set,OC=()=>{for(let e of Gd)e()},q=()=>Vs,Ag=()=>PC(e=>(Gd.add(e),()=>{Gd.delete(e)}),()=>Vs),ze=e=>(Vs={...Vs,...e},OC(),Vs);var Ut="1.13.0";import $C from"node:os";import jC from"node:path";import zs from"chalk";var Ha=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ","\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557","\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551","\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D","\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2580\u2580\u255D "];var ut={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},b={accent:ut.cyan,accent2:ut.magenta,primary:ut.white,secondary:ut.grayDark,secondary2:ut.grayLight,gray:ut.gray,green:ut.green,yellow:ut.yellow,red:ut.red};import _o from"chalk";var P={red:ut.red,yellow:ut.yellow,green:ut.green,blue:ut.blue,magenta:ut.magenta,cyan:ut.cyan},Wa={urgent:P.red,critical:P.red,important:P.red,blocker:P.red,asap:P.red,immediate:P.red,fail:P.red,failure:P.red,broken:P.red,bug:P.red,error:P.red,incident:P.red,outage:P.red,production:P.red,crash:P.red,security:P.red,warning:P.yellow,warn:P.yellow,risky:P.yellow,risk:P.yellow,attention:P.yellow,pending:P.yellow,review:P.yellow,"needs-review":P.yellow,qa:P.yellow,testing:P.yellow,test:P.yellow,validate:P.yellow,verification:P.yellow,staging:P.yellow,check:P.yellow,"follow-up":P.yellow,followup:P.yellow,waiting:P.yellow,blocked:P.yellow,hold:P.yellow,done:P.green,complete:P.green,completed:P.green,success:P.green,ok:P.green,stable:P.green,resolved:P.green,fixed:P.green,closed:P.green,merged:P.green,released:P.green,deployed:P.green,approved:P.green,verified:P.green,working:P.green,healthy:P.green,pass:P.green,passing:P.green,info:P.blue,information:P.blue,note:P.blue,docs:P.blue,documentation:P.blue,doc:P.blue,guide:P.blue,help:P.blue,explanation:P.blue,detail:P.blue,details:P.blue,context:P.blue,design:P.blue,discussion:P.blue,proposal:P.blue,idea:P.blue,feature:P.magenta,enhancement:P.magenta,improvement:P.magenta,refactor:P.magenta,refactoring:P.magenta,cleanup:P.magenta,optimize:P.magenta,optimization:P.magenta,perf:P.magenta,performance:P.magenta,upgrade:P.magenta,migration:P.magenta,modernize:P.magenta,debt:P.magenta,todo:P.cyan,next:P.cyan,planned:P.cyan,plan:P.cyan,future:P.cyan,backlog:P.cyan,investigate:P.cyan,explore:P.cyan,prototype:P.cyan};var zd={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Kd=(e,t,n)=>Math.max(t,Math.min(n,e)),Vd=(e,t,n)=>e+(t-e)*n,Mg=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},DC=e=>e.toLowerCase().trim(),BC=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,i=e/60,c=s*(1-Math.abs(i%2-1)),d=0,p=0,m=0;i>=0&&i<1?(d=s,p=c):i>=1&&i<2?(d=c,p=s):i>=2&&i<3?(p=s,m=c):i>=3&&i<4?(p=c,m=s):i>=4&&i<5?(d=c,m=s):(d=s,m=c);let f=o-s/2;return[Math.round((d+f)*255),Math.round((p+f)*255),Math.round((m+f)*255)]},qd=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Tg=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},Lg=(e,t,n)=>{let r=Kd(n,0,1);return[Math.round(Vd(e[0],t[0],r)),Math.round(Vd(e[1],t[1],r)),Math.round(Vd(e[2],t[2],r))]};var FC=(e,t,n)=>Lg(e,t,n),Yd=e=>{let t=Mg(e)%360,n=BC(t,zd.stringColor.saturation,zd.stringColor.lightness);return qd(n)},Ze=(e,t=Wa)=>{let n=DC(e??"");return n&&t[n]?t[n]:Yd(n)};var Ga=e=>{let t=zd.gradient.stops,n=Kd(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,s=Math.min(Math.floor(o),r-1),i=o-s;return FC(t[s],t[s+1],i)},kg=(e,t)=>{if(e.length===0)return"#000000";if(e.length===1)return e[0];let n=e.length-1,r=Kd(t,0,1)*n,o=Math.min(Math.floor(r),n-1);return qd(Lg(Tg(e[o]),Tg(e[o+1]),r-o))},Va=e=>qd(Ga(e)),za=e=>Mg(e.toLowerCase().trim())/4294967295,Pg=e=>{let t=za(e);return Ga(t)},_C=e=>{let[t,n,r]=Pg(e);return{normal:o=>_o.bgRgb(t,n,r).black(o),cursor:o=>_o.bgRgb(t,n,r).white.bold(o)}},Xd=e=>{let[t,n,r]=Pg(e);return{fg:o=>_o.rgb(t,n,r)(o),fgCursor:o=>_o.rgb(t,n,r).inverse(o),bg:o=>_o.bgRgb(t,n,r).black(o),bgCursor:o=>_o.bgRgb(t,n,r).white.bold(o)}},Ka=e=>_C(e).normal(` ${e} `);var qa=" ",Bg=zs.hex(b.secondary2),Og=zs.hex(b.gray),UC=()=>{let t=Ha[0].length+Ha.length*2;return Ha.map((n,r)=>Array.from(n).map((o,s)=>{let[i,c,d]=Ga((s+r*2)/t);return zs.rgb(i,c,d)(o)}).join(""))},HC=e=>{let t=$C.homedir();return e===t||e.startsWith(t+jC.sep)?"~"+e.slice(t.length):e},Dg=(e,t)=>`${qa}${zs.hex(b.accent)("\u279C")} ${Bg(e.padEnd(9))}${t}`,Jd=({url:e,repoRoot:t,version:n,reused:r})=>["",...UC().map(o=>qa+o),"",`${qa}${Bg("gui")} ${Og(`\xB7 v${n}`)}`,"",Dg("Local",zs.hex(b.accent).bold(e)),Dg("Project",HC(t)),"",qa+Og(r?"already running for this project \xB7 opened in your browser":"press ctrl+c to stop"),""].join(`
32
- `);import{spawn as WC}from"node:child_process";import Ks from"node:process";var Fg=(e=Ks.platform,t=Ks.env)=>e==="darwin"||e==="win32"||!!(t.DISPLAY||t.WAYLAND_DISPLAY||t.BROWSER),_g=e=>{let t=Ks.platform==="darwin"?"open":Ks.platform==="win32"?"cmd":"xdg-open",n=Ks.platform==="win32"?["/c","start","",e]:[e];try{let r=WC(t,n,{detached:!0,stdio:"ignore"});r.on("error",o=>{logger.info(`[gui] could not open a browser: ${o.message}`)}),r.unref()}catch(r){logger.info(`[gui] could not open a browser: ${String(r)}`)}};import{readFile as BE,stat as z0}from"node:fs/promises";import{createHash as K0}from"node:crypto";import{createHash as qC}from"node:crypto";var GC=new Set(["https:","http:","ssh:","git:","file:"]),VC=/^[A-Za-z0-9][\w.-]*@[A-Za-z0-9][\w.-]*:[^:]+$/,zC=/^[\x21-\x7e]+$/,qs=2048,$g="Use https://, ssh://, git:// or user@host:path.",Ya=()=>globalThis.process?.env?.EPIQ_ALLOW_LOCAL_REPOS==="1",Ys=(e,t=Ya())=>{if(e.length>qs)return"is too long";if(!zC.test(e))return"holds spaces or characters git would not";if(e.startsWith("-"))return"would be read as an option";if(/[\\#?]/.test(e))return"holds a character a clone URL has no use for";if(e.replace(/\[[^\]]*\]/g,"").includes("::"))return"names a remote helper";if(VC.test(e))return null;let n;try{n=new URL(e)}catch{return"is not a remote URL"}return/%/.test(KC(e))?"percent-encodes its host":GC.has(n.protocol)?n.password?"carries a password \u2014 use a credential helper":n.username&&n.protocol!=="ssh:"?"names a user before the host \u2014 leave it to a credential helper":n.protocol==="file:"?t?n.hostname?"names a host in a file:// URL":e.startsWith("file:///")?null:"is not a file:/// URL":"is a path on this machine, which nobody else can fetch":n.hostname?n.hostname.startsWith("-")||n.username.startsWith("-")?"would be read as an option":null:"names no host":"uses a transport epiq does not clone over"},KC=e=>{let t=e.indexOf("//");if(t===-1)return"";let n=e.slice(t+2),r=n.indexOf("/");return r===-1?n:n.slice(0,r)},yr=(e,t=Ya())=>Ys(e,t)===null;var Qd=()=>({entries:{},seq:0}),eu="default",tu="board",Jn=20,YC=/^\d{4}-\d{2}-\d{2}$/,XC=/^[a-z0-9][a-z0-9._-]{0,23}$/,jg=/-[0-9a-f]{12}$/,Jr=e=>e==="board"||e==="all"||JC(e),JC=e=>{if(!YC.test(e)||e<"1970-01-01")return!1;let t=new Date(`${e}T00:00:00Z`);return!Number.isNaN(t.getTime())&&t.toISOString().slice(0,10)===e},Zr=e=>XC.test(e)&&!jg.test(e),ZC=/^([^@/]+@)([^:/]+)(:.*)$/,QC=/^([a-z][a-z0-9+.-]*:\/\/)([^/]*)(.*)$/i,ew=e=>{let t=ZC.exec(e);if(t)return`${t[1]}${t[2].toLowerCase()}${t[3]}`;let n=QC.exec(e);if(!n)return e;let r=n[2],o=r.lastIndexOf("@")+1;return`${n[1].toLowerCase()}${r.slice(0,o)}${r.slice(o).toLowerCase()}${n[3]}`},Ug=e=>ew(e.trim().replace(/\/+$/,"").replace(/\.git$/i,"")),Cn=e=>(Ug(e).toLowerCase().split(/[/:]/).filter(Boolean).pop()??"").replace(/[^a-z0-9._-]/g,"-").slice(0,24).replace(/^[.-]+/,"")||"repo",wn=e=>`${Cn(e)}-${qC("sha1").update(Ug(e)).digest("hex").slice(0,12)}`,Xs=e=>e.replace(jg,""),Hg=e=>{let t={},{branches:n,since:r,label:o}=e;return(n==="default"||n==="all")&&(t.branches=n),typeof r=="string"&&Jr(r)&&(t.since=r),typeof o=="string"&&(o===""||Zr(o))&&(t.label=o),t},Zd=(e,t)=>{let n={...e,...t.branches?{branches:t.branches}:{},...t.since?{since:t.since}:{}};return t.label===""?delete n.label:t.label&&(n.label=t.label),n},nu=(e,t)=>{let n=t.payload&&typeof t.payload=="object"?t.payload:{},r=Hg(n);if(t.action==="connect.repo"){let c=typeof n.url=="string"?n.url.trim():"";if(c==="")return l("no URL");let d=wn(c),p=Object.hasOwn(e.entries,d)?e.entries[d]:void 0,m=p?.live===!0?Zd(p,r):Zd({id:d,url:c,branches:eu,since:tu,live:!0,seq:e.seq+1},r);return p?.live||e.seq++,e.entries[d]=m,u("Connected repo",m)}let o=typeof n.repo=="string"?n.repo:"",s=Object.hasOwn(e.entries,o)?e.entries[o]:void 0;if(!s?.live)return l("no such connected repo");if(t.action==="disconnect.repo"){let c={...s,live:!1};return e.entries[o]=c,u("Disconnected repo",c)}if(Object.keys(r).length===0)return l("nothing this build reads to change");let i=Zd(s,r);return e.entries[o]=i,u("Edited repo",i)},ru=e=>e==="connect.repo"||e==="edit.repo"||e==="disconnect.repo",Wg=e=>{let t=Qd();for(let n of e)ru(n.action)&&nu(t,{action:n.action,payload:n.payload});return t},Gg=e=>{let t=Object.values(e.entries),n=t.filter(s=>s.live&&yr(s.url)).sort((s,i)=>s.seq-i.seq),r=new Set,o=n.map(s=>{let i=[s.label,Cn(s.url)].find(c=>c!==void 0&&!r.has(c))??s.id;return r.add(i),{id:s.id,url:s.url,branches:s.branches,since:s.since,label:i}});return{live:o.slice(0,Jn),overLimit:o.slice(Jn),disconnected:t.filter(s=>!s.live).map(s=>s.id)}},Js=e=>{let t=e.payload&&typeof e.payload=="object"?e.payload:{},n=typeof t.label=="string"&&t.label!==""?t.label:null;if(e.action==="connect.repo")return typeof t.url=="string"?n??Cn(t.url):"";let r=typeof t.repo=="string"?Xs(t.repo):"";if(e.action!=="edit.repo")return r;let o=Hg(t),s=[o.label!==void 0?o.label===""?"label cleared":`label ${o.label}`:null,o.branches?`${o.branches} branches`:null,o.since?`since ${o.since}`:null].filter(Boolean);return s.length>0?`${r} (${s.join(", ")})`:r};import Ur from"chalk";import pR from"string-width";import{decodeTime as Vg}from"ulid";var Xa=1440*60*1e3,Zs=(e,t=Date.now())=>e>t+Xa?t:e,je=e=>Zs(Vg(e)),$o=e=>{let t=Date.now()+Xa,n=e.find(o=>o!==null&&o<=t)??null;if(n===null)return[...e];let r=null;return e.map(o=>{if(o===null)return null;let s=o<=t?o:r??n;return r=s,s})},jo=e=>{try{return u("Decoded date",new Date(je(e)))}catch(t){return l("Decoding failed + "+t.message)}},vr=e=>{if(!e?.id)return null;try{return Vg(e.id)}catch{return null}};var tw="Unknown",Ja=(e,t)=>t?.length?t:e?.length?e:tw,Qe=(e,t)=>{let n=Ja(e,t);return{id:e?.length?e:n,name:n,color:Ze(n)}};var Uo="removed",It=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?u("Found node",n):l("Unable to find node in breadcrumb")},zg=["png","jpg","gif","webp"];var ot=e=>e.trim().toLowerCase(),br=e=>{let t=ot(e);return t.length>0&&t.length<=254&&/^[^\s@]+@[^\s@]+$/.test(t)},Qs=(e,t)=>`${ot(e)} ${t}`,ou=e=>!e.tombstoned,ei=(e,t)=>{let n=ot(t),r=new Set;for(let o of Object.values(e))ou(o)&&o.email===n&&r.add(o.contributor);return[...r]},Nn=(e,t)=>{let n=new Set;for(let r of Object.values(e))ou(r)&&r.contributor===t&&n.add(r.email);return[...n]},Kg=e=>{let t=new Map;for(let r of Object.values(e)){if(!ou(r))continue;let o=t.get(r.email)??new Set;o.add(r.contributor),t.set(r.email,o)}let n=new Map;for(let[r,o]of t){let[s]=[...o];o.size===1&&s&&n.set(r,s)}return n};var Za=(e,t)=>e===t.authorId||e===t.contributor;var de={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function su(e){return e.context===de.WORKSPACE}function $(e){return e.context===de.TICKET}function xr(e){return e.context===de.TEXT}function mt(e){return e.context===de.FIELD}function ti(e){return e.context===de.FIELD_LIST}var An=e=>e.context===de.SWIMLANE,Sr=e=>e.context===de.BOARD,ni=e=>e.context===de.COMMENT;import{useSyncExternalStore as $k}from"react";var E={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette",IDENTITY:"identity"};var qg=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Yg=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Xg=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Jg=(e,t)=>{if(Yg(e,e.sequence))return I.MoveCursorLeftOfWord;if(Xg(e,e.sequence))return I.MoveCursorRightOfWord;if(qg(e,e.sequence))return I.EraseInputWord;switch(e.name){case"tab":return I.AutoCompleteCommand;case"up":return I.GetLastCommandFromHistory;case"down":return I.GetNextCommandFromHistory;case"left":return I.MoveCursorLeft;case"right":return I.MoveCursorRight;case"return":return I.Confirm;case"backspace":return t?I.EraseInput:I.ExitCommandLine;case"escape":return I.ExitCommandLine;default:return I.CaptureInput}},Zg=(e,t)=>{if(Yg(e,e.sequence))return I.MoveCursorLeftOfWord;if(Xg(e,e.sequence))return I.MoveCursorRightOfWord;if(qg(e,e.sequence))return I.EraseInputWord;switch(e.name){case"tab":return I.AutoCompleteCommand;case"up":return I.NavPreviousItem;case"down":return I.NavNextItem;case"left":return I.MoveCursorLeft;case"right":return I.MoveCursorRight;case"return":return I.Confirm;case"backspace":return t?I.EraseInput:I.ExitCommandLine;case"escape":return I.ExitCommandLine;default:return I.CaptureInput}};import Qg from"string-width";function Qa(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Zn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",nw=/\u001B\[[0-9;]*m/,iu="\x1B[0m",rw=e=>[...new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)].map(({segment:t})=>t),Qn=(e,t)=>{if(t<=0)return"";if(Qg(e)<=t)return e;if(t<=3)return"...".slice(0,t);let r=t-3,o="",s=0,i=!1;for(let c of e.split(/(\u001B\[[0-9;]*m)/))if(c!==""){if(nw.test(c)){o+=c,i=c!==iu&&c!=="\x1B[m";continue}for(let d of rw(c)){let p=Qg(d);if(s+p>r)return`${o}...${i?iu:""}`;o+=d,s+=p}}return`${o}...${i?iu:""}`},ye=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),eh=e=>e.charAt(0).toUpperCase()+e.slice(1);var th=e=>{let t=new Map;for(let n of e){let r=n.toLowerCase();for(let o=1;o<=n.length;o++){let s=r.slice(0,o),i=t.get(s);i?i.push(n):t.set(s,[n])}}return t},nh=(e,t)=>t?e.get(t)??[]:[];var rh=new WeakMap,ow=e=>{let t=rh.get(e);return t||(t=th(e),rh.set(e,t)),t};var oh=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return nh(ow(e),r).filter(s=>Qa(r,s.toLowerCase())>=n)};var sw={hint:"",hints:[],overlap:0,remainder:""},ih=({inputToMatch:e,lastWord:t,isLastWordCompleted:n,inputString:r},o,s=[])=>{if(n||e===""){let[c]=s;return s.length===1&&c&&!r.trim()?sh("",[c]):sw}let i=oh({wordList:o,inputToMatch:e,overlapThreshold:1});return sh(t,i)},sh=(e,t)=>{let n=t[0]??"",r=Qa(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),i=r<(o??"").length,c=!!s,m=(c&&i?o:n)+(c&&i?":":" "),f=m.slice(r);return{hint:m,hints:t,overlap:r,remainder:f}};import ri from"node:fs";import oi from"node:path";import{z as Ho}from"zod";var el="recent-projects.json",iw=20,aw=Ho.object({projectId:Ho.string().min(1),root:Ho.string().min(1),lastOpenedAt:Ho.number().finite()}),lw=Ho.object({projects:Ho.array(aw)}),lh=()=>oi.join(Tt(),el),Wo=e=>oi.basename(e)||e,ah=e=>{let t=oi.resolve(e);try{return ri.realpathSync(t)}catch{return t}},ch=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,dh=e=>{if(!Gs(e.root))return!1;let t=En(e.root);return!a(t)&&t.value===e.projectId},uh=()=>{let e=lh();if(!ri.existsSync(e))return u("No recent projects recorded",[]);let t;try{t=JSON.parse(ri.readFileSync(e,"utf8"))}catch(r){return l(`Invalid ${el}: ${r instanceof Error?r.message:String(r)}`)}let n=lw.safeParse(t);return n.success?u("Read recent projects",n.data.projects):l(`Invalid ${el} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},cw=e=>{let t=lh();try{ri.mkdirSync(oi.dirname(t),{recursive:!0}),ri.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
33
- `,"utf8")}catch(n){return l(`Unable to write ${el}: ${n instanceof Error?n.message:String(n)}`)}return u("Recorded recent project",e)},er=({exclude:e}={})=>{let t=uh();if(a(t))return t;let n=e===void 0?null:ah(e);return u("Listed recent projects",t.value.filter(r=>n===null||ah(r.root)!==n).filter(dh).sort(ch))},tl=({root:e,now:t=Date.now()})=>{let n=oi.resolve(e),r=En(n);if(a(r))return l(r.message);let o=r.value,s=uh(),i=a(s)?[]:s.value,c=[{projectId:o,root:n,lastOpenedAt:t},...i.filter(d=>d.projectId!==o&&d.root!==n)].filter(dh).sort(ch).slice(0,iw);return cw(c)};var au=null,mh=e=>{au=e},ph=e=>au?au(e):[];var fh=[],Go=e=>{fh=e},Vo=()=>fh;var tr=()=>{let e=q(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1,o=gh(),s=o.length>0?null:lu(),i=s!==null&&(e.declinedEmailBoards??[]).includes(s),c=o.length>0||i||s===null;return{isSetupDone:n&&t&&r&&c,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r,isSetEmails:c,claimedEmails:o,emailSetupDeclined:i}},lu=()=>{let e=ce(process.cwd());if(a(e))return null;let t=En(e.value);return a(t)?null:t.value||null},gh=()=>{let{userId:e}=q();return e?ph(e):[]},hh=()=>gh().length>0;var cu=()=>{let e=ce(process.cwd());if(a(e))return!1;let t=St(e.value);return Re(t)},yh=e=>e===!0?"on":e===!1?"off":null,vh=e=>e==="on"?!0:e==="off"?!1:null,bh=()=>{let e=tr();if(!e.isSetUserName)return"config username ";if(!e.isSetPreferredEditor)return"config editor ";if(!e.isSetAutoSync)return"config autoSync ";if(!cu())return"init";if(!e.isSetEmails){let{gitEmail:t}=q(),n=Vo()[0]??t;return n&&br(n)?`config emails ${n}`:"config emails "}return null};var dw=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Se,nl]=dw;var uw=e=>e.props.tags??[],mw=e=>e.props.assignees??[],Tn=e=>uw(e).map(t=>w.getTag(t)).filter(t=>!!t),Mn=e=>mw(e).map(t=>w.getContributor(t)).filter(t=>!!t),rl=()=>{let{breadCrumb:e,selectedNode:t}=x(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!$(n)?l("Invalid untag target"):u("Retrieved tags from ticket in breadcrumb",Tn(n))},ol=()=>{let{breadCrumb:e,selectedNode:t}=x(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!$(n)?l("Invalid unassign target"):u("Retrieved assignees from ticket in breadcrumb",Mn(n))};var C={PALETTE:"?",EXIT:"exit",INIT:"init",OPEN:"open",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",REPLAY:"replay",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",YANK:"yank",SYNC:"sync",EXPORT:"export",NONE:""};var pw=/^(\d+)(h|d|w|mo|y)$/,fw=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,gw=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let s=new Date(e,t-1,n,r,o);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===r&&s.getMinutes()===o},hw=(e,t=new Date)=>{let n=e.match(pw);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let i=new Date(t);switch(o){case"h":return i.setHours(i.getHours()-s),i;case"d":return i.setDate(i.getDate()-s),i;case"w":return i.setDate(i.getDate()-s*7),i;case"mo":return i.setMonth(i.getMonth()-s),i;case"y":return i.setFullYear(i.getFullYear()-s),i;default:return null}},yw=e=>{let t=e.match(fw);if(!t)return null;let[,n,r,o,s,i]=t,c=Number(n),d=Number(r),p=Number(o),m=s?Number(s):0,f=i?Number(i):0;return gw({year:c,month:d,day:p,hour:m,minute:f})?new Date(c,d-1,p,m,f):null},Qr=e=>{let t=e.trim().toLowerCase();return hw(t)??yw(t)};var xh=/^(\d+)(s|m)?$/,sl=e=>{let t=e.trim().toLowerCase().match(xh);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},il=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&xh.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},Sh=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,vw=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],du=(e=vw)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let s=r;s<=o;s++)t.push(`${s}${n}`);return t};var bw=["BOARD","TICKET","SWIMLANE","COMMENT"],se={EDITOR:"editor",VIEW:"view",USERNAME:"username",EMAILS:"emails",EMAILS_UNCLAIM:"emails-unclaim",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",REPO_CLONE_MAX_MB:"repoCloneMaxMb",LOG_LEVEL:"logLevel",REPO_CONNECT:"repoConnect",REPO_DISCONNECT:"repoDisconnect"},Ht={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},et={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},xw=[se.EDITOR,se.VIEW,se.USERNAME,se.EMAILS,se.EMAILS_UNCLAIM,se.AUTOSYNC,se.SYNC_DEBOUNCE_MS,se.ATTACHMENT_MAX_KB,se.LOG_LEVEL,se.REPO_CONNECT,se.REPO_DISCONNECT,se.REPO_CLONE_MAX_MB],Sw=(e=x().selectedNode?.context)=>{switch(e){case"TICKET":return[Ht.TITLE,Ht.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Ht.TITLE];case"COMMENT":return[Ht.COMMENT];default:return[]}},mu=[String(3e3),"5000","15000","30000","60000"],pu=["250","500","1000"],fu=["512","2048","8192"],Ih=["10s","20s","30s","45s"],eo=[C.EXIT,C.SYNC,C.HELP,C.EXPORT,C.CONFIG,C.YANK],al=[C.NEW,C.EDIT,C.DELETE,C.MOVE],uu=[C.TAG,C.UNTAG,C.ASSIGN,C.UNASSIGN,C.CLOSE_ISSUE,C.RE_OPEN_ISSUE,C.EDIT,C.COMMENT],Rh=[C.FILTER,C.PEEK,C.REPLAY],Rw={WORKSPACE:[...eo,...al],BOARD:[...Rh,...eo,...al],SWIMLANE:[...Rh,...eo,...al],TICKET:[...eo,...al,...uu],FIELD:[...eo,...uu],FIELD_LIST:[...eo,...uu],TEXT:[...eo],COMMENT:[C.EDIT,C.DELETE,C.YANK]},Ew=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],si=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&$(n)),Eh=e=>e.parentNodeId===Se,Iw=({selectedNode:e,breadCrumb:t})=>{let n=Sw(e?.context);return si({breadCrumb:t,selectedNode:e})?n.includes(Ht.DESCRIPTION)?n:[...n,Ht.DESCRIPTION]:n},Cw=({selectedNode:e,breadCrumb:t})=>{let n=si({breadCrumb:t,selectedNode:e});return n?[et.REF,et.TITLE,...n.props?.description?.trim()?[et.DESCRIPTION]:[],...Tn(n).length>0?[et.TAGS]:[],...Mn(n).length>0?[et.ASSIGNEES]:[]]:e?[et.REF,et.TITLE]:[]},gu=()=>{let e=er({exclude:process.cwd()});return a(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},ww=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=tr();if(!r)return[C.HELP,C.CONFIG];if(!cu())return[C.HELP,C.INIT,C.OPEN];if(t)return[C.HELP,C.PEEK,C.REPLAY,C.EXPORT,C.CONFIG,C.YANK];let o=e?.context,s=o&&bw.includes(o),i=[...new Set([...n,e].map(d=>d?.context).flatMap(d=>d?Rw[d]:[]))],c=si({breadCrumb:n,selectedNode:e});return i.filter(d=>d===C.MOVE?!1:d===C.YANK?!!(c??e):d===C.EDIT?s||!!c:d===C.DELETE?s:d===C.UNTAG?!!(c&&Tn(c).length>0):d===C.UNASSIGN?!!(c&&Mn(c).length>0):d===C.RE_OPEN_ISSUE?!!(c&&Eh(c)):d===C.CLOSE_ISSUE?!!(c&&!Eh(c)):!0)},Ue=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=x())=>{let s=t.context??"WORKSPACE";return{[C.NONE]:ww({breadCrumb:o,readOnly:r,selectedNode:n}),[C.EXIT]:["confirm"],[C.EXPORT]:[],[C.SYNC]:[],[C.INIT]:[],[C.OPEN]:e===C.OPEN?gu():[],[C.HELP]:[],[C.PEEK]:[...du(),"now","prev","next"],[C.REPLAY]:[...du()],[C.EDIT]:Iw({selectedNode:n,breadCrumb:o}),[C.YANK]:Cw({selectedNode:n,breadCrumb:o}),[C.COMMENT]:[],[C.DELETE]:["confirm"],[C.RE_OPEN_ISSUE]:["confirm"],[C.CLOSE_ISSUE]:["confirm"],[C.MOVE]:["start","confirm","next","previous","jump-next","jump-previous","to-next","to-previous","cancel"],[C.FILTER]:["tag","assignee","actor","description","title","ref","clear"],[C.TAG]:[...new Set([...Object.keys(Wa),...w.getExistingTags()])],[C.UNTAG]:[...rl()?.value?.map(({name:c})=>c)??[]],[C.UNASSIGN]:[...ol()?.value?.map(({name:c})=>c)??[]],[C.ASSIGN]:w.getExistingAssignees(),[C.NEW]:Ew(s),[C.CONFIG]:[...xw]}[e]??[]};import tb from"chalk";var Ch=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import Lw from"zod";import Nw from"node:crypto";import ii from"node:fs";import Ah from"node:path";var wh="/media/",Nh=e=>`${wh}${e}`,hu=(e,t)=>`![${e}](${Nh(t)})`;var Ln=500,Aw=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,no=(e,t)=>`${e}.${t}`,Tw=e=>Aw.test(e),Th=e=>e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?u("Sniffed image type","png"):e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?u("Sniffed image type","jpg"):e.length>=6&&(e.subarray(0,6).equals(Buffer.from("GIF87a","ascii"))||e.subarray(0,6).equals(Buffer.from("GIF89a","ascii")))?u("Sniffed image type","gif"):e.length>=12&&e.subarray(0,4).equals(Buffer.from("RIFF","ascii"))&&e.subarray(8,12).equals(Buffer.from("WEBP","ascii"))?u("Sniffed image type","webp"):l(`Unsupported image format. Allowed: ${zg.join(", ")}`),Mh=e=>Nw.createHash("sha256").update(e).digest("hex"),Mw=(e,t=Ln)=>{if(e.length===0)return l("Attachment is empty");if(e.length>t*1024)return l(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=Th(e);return a(n)?n:u("Validated attachment data",{hash:Mh(e),ext:n.value,bytes:e.length})},Lh=(e,t,n=Ln)=>{let r=Mw(t,n);if(a(r))return r;let o=Ws(e),s=Ah.join(o,no(r.value.hash,r.value.ext));try{ii.existsSync(s)||(ii.mkdirSync(o,{recursive:!0}),ii.writeFileSync(s,t))}catch(i){return l(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return u("Wrote attachment blob",r.value)},kh=(e,t,n=Ln)=>{if(!Tw(t))return l("Invalid attachment file name");let r=Ah.join(Ws(e),t);if(!ii.existsSync(r))return l("Attachment blob not found");let o;try{o=ii.readFileSync(r)}catch(d){return l(`Unable to read attachment blob: ${d instanceof Error?d.message:String(d)}`)}if(o.length>n*1024)return l(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(Mh(o)!==s)return l("Attachment blob does not match its content hash");let c=Th(o);return a(c)?c:c.value!==i?l("Attachment blob content does not match its extension"):u("Resolved attachment blob",{filePath:r,ext:i,bytes:o.length})};var ai=50,li=5e3,Ph=()=>{let e=ne().commandMeta.inputString,t=Lw.coerce.number().int().min(ai).max(li).safeParse(e);if(!t.success)return l(`Attachment size cap must be ${ai}-${li} KB (default ${Ln})`);let n=Pt({attachmentMaxKb:t.data});return a(n)?n:(ze({attachmentMaxKb:t.data}),u(`Attachment size cap set to ${t.data} KB`,null))};import Oh from"node:fs";import kw from"node:path";var yu=2048,zo=1,Ko=1048576,vu=e=>Number.isInteger(e)&&e>=zo&&e<=Ko,qo=()=>{let e=Jt(),t=a(e)?void 0:e.value.repoCloneMaxMb;return t!==void 0&&vu(t)?t:yu},Rr=e=>{let t=0,n=r=>{let o;try{o=Oh.readdirSync(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=kw.join(r,s.name);if(s.isDirectory()){n(i);continue}try{t+=Oh.lstatSync(i).size}catch{}}};return n(e),t},ci=e=>`Its clone would pass this machine's ${e} MB cap for a connected repo: narrow its history, or raise repoCloneMaxMb`;var pt=e=>{let t=ce(e??process.cwd());return a(t)?l(t.message):u("Resolved Epiq repo root",t.value)},Yo=e=>/^[0-9a-f]{7,40}$/i.test(e);import{createHash as vN}from"node:crypto";import Sy from"node:path";import bN from"node:fs";import{ulid as xN}from"ulid";import bu from"node:fs";import Pw from"node:path";var di=e=>e?.code==="ENOENT",xu=3,Su=e=>bu.readdirSync(e).filter(t=>t.endsWith(".jsonl")).sort(),Ke=e=>{let t=kt(e);for(let n=1;;n++){if(!bu.existsSync(t))return"none";let r=[],o=!1;for(let s of Su(t))try{let{size:i,mtimeMs:c}=bu.statSync(Pw.join(t,s));r.push(`${s}:${i}:${c}`)}catch(i){if(!di(i))throw i;if(n<xu){o=!0;break}}if(!o)return r.join("|")}},Dh=e=>new Map(e.split("|").filter(Boolean).map(t=>{let n=t.indexOf(":");return[t.slice(0,n),t.slice(n+1)]})),Ru=(e,t,n,r)=>{let o=Dh(t),s=Ke(e),i=Dh(s),c=d=>d===void 0?0:Number(d.slice(0,d.indexOf(":")));if(c(i.get(n))!==c(o.get(n))+r)return null;for(let[d,p]of i)if(d!==n&&o.get(d)!==p)return null;for(let d of o.keys())if(d!==n&&!i.has(d))return null;return s},nr=null,Xo=e=>nr&&nr.root===e?nr.signature:null,Jo=(e,t)=>{nr={root:e,signature:t}},Bh=(e,t,n)=>{if(!nr||nr.root!==e)return;let r=Ru(e,nr.signature,t,n);nr=r===null?null:{root:e,signature:r}},Fh=()=>{nr=null};import{z as ro}from"zod";var _h=1,$h=ro.tuple([ro.string().min(1),ro.string().min(1).nullable()]),Ow=ro.looseObject({v:ro.literal(_h),id:$h}),p$=ro.looseObject({v:ro.number().int().positive(),id:$h}),Dw=e=>Object.prototype.hasOwnProperty.call(e,"__proto__"),Bw=e=>{let t={};for(let n of Object.keys(e))n!=="__proto__"&&(t[n]=e[n]);return t},jh=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return l("Invalid persisted event envelope: expected an object");let{v:t,id:n}=e;if(typeof t!="number"||!Number.isSafeInteger(t)||t<=0)return l("Invalid persisted event envelope: v");if(!Array.isArray(n)||n.length!==2)return l("Invalid persisted event envelope: id");let[r,o]=n;return typeof r!="string"||r.length===0?l("Invalid persisted event envelope: id.0"):o!==null&&(typeof o!="string"||o.length===0)?l("Invalid persisted event envelope: id.1"):u("Parsed persisted event envelope",Dw(e)?Bw(e):e)};var Fw=[1];var _w=new Set(Fw),Eu=e=>_w.has(e),Uh=e=>{let t=Ow.safeParse(e);return t.success?u("Parsed persisted event",t.data):l(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Iu=(e,t)=>{let n={[e.action]:e.payload,v:_h,id:t};return Uh(n)};import pi from"node:fs";import pl from"node:path";import{decodeTime as zw}from"ulid";import{z as Nu}from"zod";import qe from"node:fs";import oo from"node:path";import{ulid as $w}from"ulid";var cl="~pending",Cu=/~pending(-[0-9a-z]+)*$/i,Wh=/-f(\d+)$/,Gh=e=>{let t=e.indexOf(".");return t===-1?`${e}${cl}`:e.slice(0,t)+cl+e.slice(t)},dl=e=>{let t=e.indexOf(".");return t===-1?[e,""]:[e.slice(0,t),e.slice(t)]},jw=e=>{let[t,n]=dl(e);return Cu.test(t)?t.replace(Cu,"")+n:null},wu=e=>e.replace(Cu,""),so=e=>e.endsWith(".jsonl")&&jw(e)!==null,ui=e=>wu(dl(e)[0]),Vh=e=>{let[t]=dl(e),n=Wh.exec(t);return n&&so(e)?Number(n[1]):null},Uw=e=>Gh(e).replace(cl,`${cl}-${$w().toLowerCase()}`),Hw=(e,t)=>{let[n,r]=dl(e);return`${n.replace(Wh,"")}-f${t}${r}`},zh=(e,t)=>oo.join(kt(e),Gh(t)),Ww=(e,t)=>Math.max(0,qe.statSync(e).size-(Vh(t)??0)),Kh=e=>{let t=kt(e);try{return qe.existsSync(t)?qe.readdirSync(t).filter(so).some(n=>Ww(oo.join(t,n),n)>0):!1}catch{return!0}},Gw=3,qh=(e,t)=>{for(let n=1;;n++){let r=qe.openSync(e,"a"),o;try{qe.writeSync(r,t),o=qe.fstatSync(r).ino}finally{qe.closeSync(r)}let s;try{s=qe.statSync(e).ino}catch{s=null}if(s===o||n>=Gw)return}},Vw=e=>{let t;try{t=qe.openSync(e,"r")}catch{return!0}try{let{size:n}=qe.fstatSync(t);if(n===0)return!0;let r=Buffer.alloc(1);return qe.readSync(t,r,0,1,n-1),r[0]===10}finally{qe.closeSync(t)}},ll=10,Hh=(e,t,n=!1)=>{let r=n?t.length:t.lastIndexOf(ll)+1;if(r===0)return{bytes:0,lines:0};let o=t.subarray(0,r);if(o.toString("utf8").trim().length===0)return{bytes:r,lines:0};qe.appendFileSync(e,Buffer.concat([Buffer.from(Vw(e)?"":`
34
- `),o,Buffer.from(o[o.length-1]===ll?"":`
35
- `)]));let s=0;for(let i of o)i===ll&&s++;return o[o.length-1]!==ll&&s++,{bytes:r,lines:s}},ul=(e,t)=>{let n=kt(e);if(!qe.existsSync(n))return u("No events directory",0);try{let r=ui(t),o=qe.readdirSync(n).filter(c=>so(c)&&ui(c)===r),s=oo.join(n,t),i=0;for(let c of o){let d=Vh(c);if(d!==null){let g=oo.join(n,c),h=qe.readFileSync(g).subarray(d);i+=Hh(s,h,!0).lines,qe.rmSync(g,{force:!0});continue}let p=/~pending-/i.test(c)?c:Uw(t),m=oo.join(n,p);p!==c&&qe.renameSync(oo.join(n,c),m);let f=Hh(s,qe.readFileSync(m));i+=f.lines,qe.renameSync(m,oo.join(n,Hw(p,f.bytes)))}return u("Folded pending logs",i)}catch(r){return l(`Unable to fold pending event logs in ${n}: ${r instanceof Error?r.message:String(r)}`)}};var fl="unknown",Kw=Nu.object({userId:Nu.string().min(1).default(fl),userName:Nu.string().min(1).default(fl)}),Zh=new Set(["id","v","userId","userName"]),ml=e=>{let t=Object.entries(e).filter(([o])=>!Zh.has(o));if(t.length!==1)return null;let n=t[0]?.[1];if(typeof n!="object"||n===null)return null;let r=n.id;return typeof r=="string"&&r.length>0?r:null},qw=/^[0-9a-hjkmnp-tv-z]{26}$/i,Yw=e=>qw.test(e)?e.toUpperCase():e,Qh=e=>{let t=pl.basename(e,".jsonl"),n=t.indexOf("."),r=wu(n===-1?t:t.slice(0,n)),o=n===-1?void 0:t.slice(n+1),s=Kw.safeParse({userId:Yw(r),userName:o});return s.success?u("Parsed event file actor",s.data):l(`Invalid event file name ${pl.basename(e)}: ${s.error.issues.map(i=>i.path.join(".")||i.message).join(", ")}`)},Xw=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?l(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?l("Invalid persisted event: action key is missing or invalid"):u("Resolved persisted action",t[0])},Jw=(e,t)=>t in e,Er=new Map,Zw=3e5,Qw=512,mi=0,Au=e=>e.entries.length+e.quarantined.length,eN=(e,t,n,r)=>{let o=Er.get(e);o&&(mi-=Au(o));let s={stamp:t,entries:n,quarantined:r};Er.delete(e),Er.set(e,s),mi+=Au(s);for(let[i,c]of Er){if(mi<=Zw&&Er.size<=Qw)break;i!==e&&(Er.delete(i),mi-=Au(c))}},tN=()=>{Er.clear(),mi=0},nN=2n,Yh=1000000n,rN=e=>{try{let{size:t,mtimeNs:n}=pi.statSync(e,{bigint:!0});return{value:`${t}:${n}`,settled:BigInt(Date.now())*Yh-n>nN*Yh}}catch{return null}},ey=(e,t)=>{let n=Qh(e);if(a(n))return l(n.message);let r=rN(e),o=r?Er.get(e):void 0;if(r&&o&&o.stamp===r.value){if(t)for(let m of o.quarantined)t.push(m);return u("Parsed persisted events file",[...o.entries])}let s;try{s=pi.readFileSync(e,"utf8")}catch(m){if(di(m))return u("Event file missing",null);throw m}let i=[],c=pl.basename(e),d=[],p=(m,f)=>{d.push({eventId:null,reason:"corrupt-line",detail:`${c}:${m} (${f})`,targetNodeId:null})};for(let[m,f]of s.split(`
36
- `).entries()){let g=f.trim();if(!g)continue;let h;try{h=JSON.parse(g)}catch{p(m+1,"invalid JSON");continue}let y=jh(h);if(a(y)){p(m+1,y.message);continue}i.push({...y.value,userId:n.value.userId,userName:n.value.userName})}if(t)for(let m of d)t.push(m);return r?.settled&&eN(e,r.value,i,d),u("Parsed persisted events file",[...i])},Xh=(e,t)=>e<t?-1:e>t?1:0,Tu=(e,t)=>{let n=Xh(e.id[0],t.id[0]);return n!==0?n:Xh(JSON.stringify(e),JSON.stringify(t))},Jh=(e,t)=>{let n=new Map,r=new Map;for(let m of e){let f=m.id[0],g=m.id[1]??null;n.set(f,m);let h=r.get(g)??[];h.push(m),r.set(g,h)}for(let m of r.values())m.sort(Tu);let o=[],s=new Set,i=m=>{let f=[m];for(;f.length>0;){let g=f.pop(),h=g.id[0];if(s.has(h))continue;o.push(g),s.add(h);let y=r.get(h)??[];for(let v=y.length-1;v>=0;v--)f.push(y[v])}},c=(r.get(null)??[]).filter(m=>{let f=Object.keys(m).filter(g=>!Zh.has(g));return f.length===1&&f[0]===t});for(let m of c)i(m);let d=e.filter(m=>{let f=m.id[0],g=m.id[1]??null;return s.has(f)?!1:g===null||!n.has(g)}).sort(Tu);for(let m of d)i(m);let p=e.filter(m=>!s.has(m.id[0])).sort(Tu);for(let m of p)i(m);return o},Mu=e=>$o(e.map(t=>{try{return zw(t.id[0])}catch{return null}})),ty=(e,t)=>{let n=new Set,r=[],o=[],s=Mu(e);for(let i=0;i<e.length;i++){let c=e[i],d=c.id[0],p=c.id[1],m=s[i]??null;!(m!==null&&m<t)||p&&n.has(p)?(n.add(d),o.push(c)):r.push(c)}return{appliedEvents:r,unappliedEvents:o}},ny=e=>{let t=new Set(e.actions),n=S=>t.has(S),r=S=>{let{userId:N,userName:k,...L}=S,A=Xw(L);if(a(A))return l(A.message);let O=A.value,j=S.id?.[0];return j?Jw(L,O)?u("Decoded persisted event",{id:j,action:O,payload:L[O],userId:N}):l(`Persisted event is missing payload for action: ${O}`):l("Persisted event is missing id")},o=(S,N)=>{let k=[],L=new Map,A=new Map;for(let O of S){if(!Eu(O.v)){A.set(O.v,(A.get(O.v)??0)+1),N?.push({eventId:O.id[0],reason:"unsupported-schema-version",detail:`v${O.v}`,targetNodeId:ml(O)});continue}let j=r(O);if(a(j)){N?.push({eventId:O.id[0],reason:"invalid-payload",detail:j.message,targetNodeId:ml(O)});continue}let W=j.value.action;if(!n(W)){L.set(W,(L.get(W)??0)+1),N?.push({eventId:O.id[0],reason:"unknown-action",detail:W,targetNodeId:ml(O)});continue}let ge=e.readPayload(W,j.value.payload);if(a(ge)){N?.push({eventId:O.id[0],reason:"invalid-payload",detail:ge.message,targetNodeId:ml(O)});continue}k.push(j.value)}if(L.size>0){let O=[...L.entries()].map(([j,W])=>`${j} (x${W})`).join(", ");G.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${O}. Upgrade to apply them.`)}if(A.size>0){let O=[...A.entries()].map(([j,W])=>`v${j} (x${W})`).join(", ");G.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${O}. Upgrade to apply them.`)}return u("Decoded reconstructed events",k)},s=null;function i(S,N){let k=kt(S),L=Ke(S);if(!pi.existsSync(k))return u("No events found",[]);let A=[],O=[];for(let W=1;;W++){A=[],O=[];let ge=!1;for(let D of Su(k)){let X=ey(pl.join(k,D),O);if(a(X))return l(X.message);if(X.value===null){if(W<xu){ge=!0;break}continue}for(let Fe of X.value)A.push(Fe)}if(!ge)break}if(N)for(let W of O)N.push(W);let j=Jh(A,e.genesis);return s={root:S,signature:L,edge:j.at(-1)?.id?.[0]??null},u("All events loaded",j)}function c(S){let N=[],k=i(S,N);if(a(k))return l(k.message);let L=o(k.value,N);return a(L)?l(L.message):u("Loaded merged events",{events:L.value,unreadable:N})}function d(S){let N=i(S);return a(N)?l(N.message):u("Loaded event actors",N.value.map(({userId:k,userName:L})=>({userId:k,userName:L})))}function p(S){let N=new Map,k=kt(S),L;try{if(!pi.existsSync(k))return N;L=pi.readdirSync(k)}catch{return N}let A=new Set;for(let j of L){if(!j.endsWith(".jsonl"))continue;let W=Qh(j);if(a(W))continue;let{userId:ge,userName:D}=W.value;if(!ge||!D||D===fl)continue;let X=N.get(ge);X!==void 0&&X!==D&&A.add(ge),N.set(ge,D)}if(A.size===0)return N;let O=d(S);if(a(O))return N;for(let{userId:j,userName:W}of O.value)A.has(j)&&(!W||W===fl||N.set(j,W));return N}function m(S){let N=c(S);return a(N)?l(N.message):u("Loaded merged events",N.value.events)}function f(S,N){let k=i(S);if(a(k))return l(k.message);let{appliedEvents:L,unappliedEvents:A}=ty(k.value,N),O=o(L);if(a(O))return l(O.message);let j=o(A);return a(j)?l(j.message):u("Loaded merged events before time",{appliedEvents:O.value,unappliedEvents:j.value})}function g(S=process.cwd()){let N=Ke(S);if(s&&s.root===S&&s.signature===N)return u("Loaded edge reference, unchanged",s.edge);let k=i(S);return a(k)?l(k.message):u("Loaded edge reference",k.value.at(-1)?.id?.[0]??null)}function h(S,N,k,L){if(!s||s.root!==S)return;let A=Ru(S,s.signature,N,L);s=A===null?null:{root:S,signature:A,edge:k}}function y(){s=null,tN()}let v=S=>Jh(S,e.genesis);function R(S){let N=i(S);if(a(N))return l(N.message);let k=Mu(N.value);return u("Loaded effective event times",new Map(N.value.map((L,A)=>[L.id[0],k[A]??null])))}return{fromPersistedEvent:r,decodeReconstructedEvents:o,loadMergedEventsWithUnreadable:c,loadEventActors:d,loadActorNames:p,loadMergedEvents:m,loadMergedEventsBefore:f,getEdgeRef:g,advanceEdgeRef:h,clearEdgeCache:y,getSortedEvents:v,loadEffectiveEventTimes:R}};var gl=(e,t)=>l(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),H=(e,t)=>({...gl(e,t),convergence:!0}),Zo=e=>a(e)&&e.convergence===!0,kn=e=>{let t=e.filter(a);return{fatal:t.filter(n=>!Zo(n)),skipped:t.filter(Zo)}},Pn=e=>{e.length!==0&&G.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},oN=e=>e.userId?.length?null:gl("Invalid user ID format",e),ry=e=>{let t=null;function n(o,s=!1){let i=e.apply[o.action];if(!i)return l(`Unknown event action "${o.action}", likely created by a newer epiq version. Evt id: ${o.id}`);if(!e.replay.isInitialized()&&o.action!==e.genesis)return H(`${o.action} arrived before the state was initialized`,o);if(o.action===e.genesis&&t){if(t.genesisApplied)return H("the state is already initialized",o);t.genesisApplied=!0}let c;try{c=i(o)}catch(m){return H(`threw while materializing (${m instanceof Error?m.message:String(m)})`,o)}if(a(c))return c;let d=oN(o);if(d)return d;let p=e.replay.afterApply(o,{batched:t!==null,bypassLogging:s});return p||c}return{materialize:n,materializeAll:o=>{let s=e.replay.batch(()=>{let i=t===null;i&&(t={genesisApplied:!1});let c=!1;try{let d=o.map(p=>n(p));if(i){c=!0;let p=e.replay.flush();if(p)return o.map(()=>p)}return d}finally{i&&(t=null,c||e.replay.flush())}});return a(s)?o.map(()=>l(s.message)):s.value}}};import iy from"node:fs";import Lu from"node:path";import{decodeTime as sN,monotonicFactory as iN}from"ulid";var oy=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";var B=({userId:e})=>({userId:e}),sy=e=>({action:e.action,payload:e.payload});var aN=0xffffffffffff,lN=Xa,cN=e=>{let t=Date.now(),n;try{n=sN(e)}catch{return t}return n>=aN?t:n>t+lN?(G.error("[persist] edge id is too far in the future; seeding from the wall clock instead",{edgeRef:e,edgeTime:n,now:t}),t):Math.max(t,n+1)},Ir=({userId:e})=>`${oy(e)}.jsonl`,ay=(e,t)=>{let n;try{if(!iy.existsSync(e))return[t];n=iy.readdirSync(e)}catch{return[t]}let r=ui(t);return[...n.filter(s=>!s.endsWith(".jsonl")||s===t||so(s)?!1:ui(s)===r).sort(),t]},ly=(e,{userId:t})=>{let n=Ir({userId:t});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n))return l(`Invalid event log file name: ${n}`);let o=Lu.join(kt(e),n);return u("Successfully resolved event log path",o)},cy=e=>{let t=iN();function n(o,s){let i;if(s&&s.current!==void 0)i=s.current;else{let d=e.getEdgeRef(o);if(a(d))return l(d.message);i=d.value}let c=i?t(cN(i)):t();return u("Minted event id",[c,i])}function r({event:o,rootDir:s,edge:i,id:c}){try{let d=xg(s);if(a(d))return d;let p=ly(s,{userId:o.userId});if(a(p))return p;let m=zh(s,Lu.basename(p.value)),f=c?u("Minted event id",c):n(s,i);if(a(f))return l(f.message);let[g,h]=f.value,y=Iu(sy(o),[g,h]);if(a(y))return l(y.message);let v=`${JSON.stringify(y.value)}
37
- `;qh(m,v),i&&(i.current=g);let R=Lu.basename(m);return e.advanceEdgeRef(s,R,g,Buffer.byteLength(v)),Bh(s,R,Buffer.byteLength(v)),u("Event persisted",{path:m,entry:y.value})}catch(d){let p=d instanceof Error?d.message:"Unknown persist error";return l(`Failed to persist event: ${p}`)}}return{mintEventId:n,persist:r}};var dy=(e,t,n)=>{function r(s,i,c){let d=n.mintEventId(i,c);if(a(d))return l(d.message);let p={...s,id:d.value[0]},m=t.materialize(p);if(m.status!==gr.Success)return m;let f=n.persist({event:p,rootDir:i,edge:c,id:d.value});return a(f)?(Fh(),f):m}function o(s,i){if(s.length===0||!s[0])return l("No events provided");let c=e.write.readOnlyReason();if(c)return l(c);let d=e.replay.batch(()=>{let p={},m=e.write.beforeWrite(s[0],h=>r(h,i,p));if(a(m))return l(m.message);let f=s.map(h=>r(h,i,p)),g=f.filter(a);return g.length>0?l("Materialize and persist failed: "+g.map(h=>h.message).join(", ")):u("Materialization succeeded",f.map(h=>h.value))});return a(d)?l(d.message):d.value??l("Materialize and persist produced nothing")}return{materializeAndPersist:r,materializeAndPersistAll:o}};var uy=e=>{let t=ry(e),n=ny(e),r=cy(n),o=dy(e,t,r);return{...t,...n,...r,...o}};import{z as Q}from"zod";var J=Q.string().min(1),un=Q.string(),Cr=Q.string(),hl=Q.looseObject({id:J}),ku=Q.looseObject({id:J,name:un,parent:J,rank:Cr}),dN={"init.workspace":Q.looseObject({id:J,name:un,rank:Cr}),"add.workspace":Q.looseObject({id:J,name:un,rank:Cr}),"add.board":ku,"add.swimlane":ku,"add.issue":ku,"add.field":Q.looseObject({id:J,name:un,parent:J,rank:Cr}),"edit.title":Q.looseObject({id:J,name:un}),"delete.node":hl,"lock.node":hl,"move.node":Q.looseObject({id:J,parent:J,rank:Cr}),"edit.description":Q.looseObject({id:J,md:Q.string()}),"close.issue":Q.looseObject({id:J,parent:J,rank:Cr}),"reopen.issue":Q.looseObject({id:J,parent:J,rank:Cr}),"create.tag":Q.looseObject({id:J,name:un}),"tombstone.tag":hl,"restore.tag":Q.looseObject({id:J,name:un}),"create.contributor":Q.looseObject({id:J,name:un}),"rename.contributor":Q.looseObject({id:J,name:un}),"tombstone.contributor":hl,"restore.contributor":Q.looseObject({id:J,name:un}),"link.contributor.user":Q.looseObject({contributor:J}),"link.contributor.email":Q.looseObject({contributor:J,email:J}),"unlink.contributor.email":Q.looseObject({contributor:J,email:J}),"connect.repo":Q.looseObject({url:Q.string()}),"edit.repo":Q.looseObject({repo:J}),"disconnect.repo":Q.looseObject({repo:J}),"add.issue.assignee":Q.looseObject({id:J,assignee:J}),"remove.issue.assignee":Q.looseObject({id:J,assignee:J}),"add.issue.tag":Q.looseObject({id:J,tag:J}),"remove.issue.tag":Q.looseObject({id:J,tag:J}),"add.issue.comment":Q.looseObject({id:J,issue:J,md:Q.string()}),"edit.issue.comment":Q.looseObject({id:J,issue:J,md:Q.string()}),"delete.issue.comment":Q.looseObject({id:J,issue:J}),"add.issue.attachment":Q.looseObject({id:J,issue:J,hash:Q.string().min(1),ext:Q.string().min(1),name:un,bytes:Q.number()}),"delete.issue.attachment":Q.looseObject({id:J,issue:J}),"rebalance.children":Q.looseObject({parent:J,ranks:Q.record(Q.string(),Cr)})},my=(e,t)=>{let r=dN[e].safeParse(t);return r.success?u("Payload is readable",void 0):l(`${e}: ${r.error.issues.map(o=>`${o.path.join(".")||"payload"} ${o.message}`).join(", ")}`)};import{ulid as uN}from"ulid";var py=(e,t)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return u("Contributor write already in flight",void 0);let{userId:n,userName:r}=q();if(!r||n!==e.userId)return u("Not this actor own write",void 0);let o=w.getContributor(e.userId),s={id:uN(),action:o?"rename.contributor":"create.contributor",payload:{id:e.userId,name:r},userId:e.userId};if(o&&(o.tombstoned||o.name===r))return u("Contributor name is current",void 0);let i=t(s);return a(i)?l(i.message):u("Contributor name recorded",void 0)};var Pu=["init.workspace","add.workspace","add.board","add.swimlane","add.issue","add.field","edit.title","delete.node","create.tag","tombstone.tag","restore.tag","create.contributor","rename.contributor","tombstone.contributor","restore.contributor","add.issue.assignee","remove.issue.assignee","add.issue.tag","remove.issue.tag","move.node","edit.description","add.issue.comment","edit.issue.comment","delete.issue.comment","add.issue.attachment","delete.issue.attachment","close.issue","reopen.issue","lock.node","rebalance.children","link.contributor.user","link.contributor.email","unlink.contributor.email","connect.repo","edit.repo","disconnect.repo"];var kj=new Set(Pu);var Ae={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",DIFF:"Diff",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var z=e=>e.slice(-7).toUpperCase(),yl=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?z(e).includes(n):!0};var we={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:de.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{ref:z(e)},context:de.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:de.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:s="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:de.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:de.FIELD_LIST,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{ref:z(e)},context:de.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!0,isVirtual:s=!0,disabled:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:i?{disabled:!0}:{},context:de.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:s=!0,isVirtual:i=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:de.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};var fi=(e,t,n)=>w.getNode(e)?H(`a node with id ${e} already exists`,n):t===e?H("a node cannot be its own parent",n):null,Ou=e=>{let t=x().repos,n=nu(t,e);if(a(n))return{skip:H(n.message,e)};let r=Be(o=>({...o,repos:t}));return a(r)?{skip:H("Unable to update repos",e)}:{message:n.message,entry:n.value}},fy={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=we.workspace(t,n,r),s=gi(o);if(a(s))return gl(s.message,e);let i=w.createNode(o);return a(i)?H(i.message??"Failed to initialize workspace",e):su(i.value)?u("Workspace initialized",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=fi(t,void 0,e);if(o)return o;let s=w.createNode(we.workspace(t,n,r));return a(s)?H(s.message??"Failed to add workspace",e):su(s.value)?u("Added workspace",{action:e.action,result:s.value}):l("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=fi(t,r,e);if(s)return s;let i=w.createNode(we.board(t,n,r,o));return a(i)?H(i.message??"Unable to create board",e):Sr(i.value)?u("Added board",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=fi(t,r,e);if(s)return s;let i=w.createNode(we.swimlane(t,n,r,o));return a(i)?H(i.message??"Unable to create swimlane",e):An(i.value)?u("Added swimlane",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=fi(t,r,e);if(s)return s;let i=w.createNode(we.ticket(t,n,r,o));return a(i)?H(i.message??"Unable to create issue",e):$(i.value)?u("Added issue",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,i=fi(t,r,e);if(i)return i;let c=w.createNode(we.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(Ae.DESCRIPTION)?"vertical":"horizontal"}));return a(c)?H(c.message??`Unable to create field: ${n}`,e):mt(c.value)?u("Added field",{action:e.action,result:c.value}):l("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!w.getNode(t))return H(`Unable to locate node with id ${t}`,e);let o=w.renameNode(t,n);return a(o)?H(o.message??"Unable to edit title",e):u("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=w.tombstoneNode(t);return a(n)?H(n.message??"Unable to delete node",e):u("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=w.createTag({id:t,name:n});return a(r)?H(r.message??"Unable to create tag",e):u("Tag added",{action:e.action,result:r.value})},"tombstone.tag":e=>{let{id:t}=e.payload,n=w.tombstoneTag(t);return a(n)?H(n.message??"Unable to delete tag",e):u("Tag tombstoned",{action:e.action,result:n.value})},"restore.tag":e=>{let{id:t,name:n}=e.payload,r=w.restoreTag(t,n);return a(r)?H(r.message??"Unable to restore tag",e):u("Tag restored",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=w.createContributor({id:t,name:n});return a(r)?H(r.message??"Unable to create contributor",e):u("Contributor created",{action:e.action,result:r.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,r=w.renameContributor(t,n);return a(r)?H(r.message??"Unable to rename contributor",e):u("Contributor renamed",{action:e.action,result:r.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=w.tombstoneContributor(t);return a(n)?H(n.message??"Unable to remove contributor",e):u("Contributor tombstoned",{action:e.action,result:n.value})},"restore.contributor":e=>{let{id:t,name:n}=e.payload,r=w.restoreContributor(t,n);return a(r)?H(r.message??"Unable to restore contributor",e):u("Contributor restored",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=w.tag(t,n);return a(r)?H(r.message??"Unable to tag issue",e):u("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=w.untag(t,n);return a(r)?H(r.message??"Unable to untag issue",e):u("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=w.assign(t,n);return a(r)?H(r.message??"Unable to assign issue",e):u("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=w.unassign(t,n);return a(r)?H(r.message??"Unable to unassign issue",e):u("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=w.moveNodeToRank({id:t,parentId:n,rank:r});return a(o)?H(o.message??"Failed to move node",e):u("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=w.editValue(t,n);return a(r)?H(r.message??"Unable to edit description",e):u("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=w.getNode(t);if(!o)return H("Unable to locate issue",e);if(!$(o))return H("Can only close issues",e);let s=w.getNode(Se);if(!s)return H("Unable to locate target swimlane",e);if(n!==s.id)return H("Close target must be closed swimlane",e);let i=w.moveNodeToRank({id:t,parentId:n,rank:r});return a(i)?H(i.message??"Unable to close issue",e):u("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=w.getNode(t);if(!o)return H("Unable to locate issue",e);if(!$(o))return H("Can only reopen issues",e);let s=w.getNode(Se);if(!s)return H("Unable to locate closed swimlane",e);if(n===s.id)return H("Cannot reopen issue into closed swimlane",e);if(!w.getNode(n))return H("Reopen parent no longer exists",e);let c=w.moveNodeToRank({id:t,parentId:n,rank:r});return a(c)?H(c.message??"Unable to reopen issue",e):u("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=w.lockNode(t);return a(n)?H(n.message??"Unable to lock node",e):u("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let s=w.getNode(r);if(!s)return H(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return H(`Node ${r} is not child of ${t}`,e);let i=w.updateNode({...s,rank:o});if(a(i))return H(i.message??"Unable to rebalance child",e)}return u("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:r,md:o}=e.payload,s=w.createComment({id:t,issue:n,authorId:r,md:o,deleted:!1});return a(s)?H(s.message??"Unable to add comment",e):u("Comment added",{action:e.action,result:{id:t,issue:n,author:r,md:o}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:r}=e.payload,o=w.getComment(t);if(!o)return H("Unable to locate comment",e);if(o.issue!==n)return H("Comment does not belong to issue",e);let s=w.editComment(t,r);return a(s)?H(s.message??"Unable to edit comment",e):u("Comment edited",{action:e.action,result:{id:t,issue:n,md:r}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,r=w.getComment(t);if(!r)return H("Unable to locate comment",e);if(r.issue!==n)return H("Comment does not belong to issue",e);let o=w.deleteComment(t);return a(o)?H(o.message??"Unable to delete comment",e):u("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"add.issue.attachment":e=>{let{id:t,issue:n,hash:r,ext:o,name:s,bytes:i}=e.payload,c=w.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:i,deleted:!1});return a(c)?H(c.message??"Unable to add attachment",e):u("Attachment added",{action:e.action,result:{id:t,issue:n,hash:r}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,r=w.getAttachment(t);if(!r)return H("Unable to locate attachment",e);if(r.issue!==n)return H("Attachment does not belong to issue",e);let o=w.deleteAttachment(t);return a(o)?H(o.message??"Unable to delete attachment",e):u("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.email":e=>{let{contributor:t,email:n}=e.payload;if(!br(n))return H(`not an email address: ${n}`,e);let r=w.linkContributorEmail({email:n,contributor:t,authorId:e.userId});return a(r)?H(r.message??"Unable to link email",e):u("Email linked to contributor",{action:e.action,result:r.value})},"unlink.contributor.email":e=>{let{contributor:t,email:n}=e.payload,r=w.unlinkContributorEmail(n,t,e.userId);return a(r)?H(r.message??"Unable to unlink email",e):u("Email unlinked from contributor",{action:e.action,result:r.value})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=w.linkUserId({contributorId:t,userId:e.userId});return a(n)?H(n.message??"Unable to link contributor",e):u("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})},"connect.repo":e=>{let t=Ou(e);return"skip"in t?t.skip:u(t.message,{action:e.action,result:t.entry})},"edit.repo":e=>{let t=Ou(e);return"skip"in t?t.skip:u(t.message,{action:e.action,result:t.entry})},"disconnect.repo":e=>{let t=Ou(e);return"skip"in t?t.skip:u(t.message,{action:e.action,result:t.entry})}};var gy=e=>{let t=w.getNode(e);if(!t||!$(t)||t.isDeleted)return null;let n=vy(t);return a(n)?n:null},hy=e=>{if(!Bu())return null;for(let t of e){let n=gy(t);if(n)return n;let r=x().nodes[t]?.parentNodeId;if(!r)continue;let o=gy(r);if(o)return o}return null},mN=(e,t)=>{let n=w.getNode(e);n&&w.updateNode({...n,log:[...n.log??[],t]})},pN=e=>{let t=[e],n=x().nodes[e]?.parentNodeId;return n&&t.push(n),t},Du=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":case"add.issue.attachment":case"delete.issue.attachment":return[e.payload.issue];case"delete.node":case"edit.description":return pN(e.payload.id);case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"move.node":case"close.issue":case"reopen.issue":case"add.issue.tag":case"remove.issue.tag":case"add.issue.assignee":case"remove.issue.assignee":return[e.payload.id];case"rebalance.children":return Object.keys(e.payload.ranks);case"create.tag":case"tombstone.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"link.contributor.user":case"link.contributor.email":case"unlink.contributor.email":case"connect.repo":case"edit.repo":case"disconnect.repo":default:return[]}},fN=e=>{Be(t=>({...t,eventLog:[...t.eventLog,e]}))},rr=null,gN=e=>{for(let[t,n]of e.nodeLog){let r=w.getNode(t);r&&w.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&Be(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),hy([...e.virtualNodeIds])},yy={isInitialized:()=>st(),batch:e=>vl(e),afterApply(e,{batched:t,bypassLogging:n}){let r=[...new Set(Du(e))];if(t){rr??={appLog:[],nodeLog:new Map,virtualNodeIds:new Set};for(let o of r){if(!n){let s=rr.nodeLog.get(o);s?s.push(e):rr.nodeLog.set(o,[e])}if(Bu()){rr.virtualNodeIds.add(o);let s=x().nodes[o]?.parentNodeId;s&&rr.virtualNodeIds.add(s)}}return n||rr.appLog.push(e),null}return n||(r.forEach(o=>mN(o,e)),fN(e)),hy(r)},flush(){if(!rr)return null;let e=rr;return rr=null,gN(e)}};var be=()=>{let{userName:e,userId:t}=q();return e?t?vd(t)?ka(e)?u("Successfully resolved actor ID",{userId:t,userName:e}):l("Invalid user name in config"):l("Invalid user ID in config"):l("User ID not configured"):l("User name not configured")};var hN={genesis:"init.workspace",actions:Pu,readPayload:my,apply:fy,replay:yy,write:{readOnlyReason:()=>{let e=x();return e.readOnly?e.readOnlyReason??"Cannot change the board while time travelling":null},beforeWrite:py}},yN=uy(hN),{materialize:hi,materializeAll:mn,fromPersistedEvent:wU,decodeReconstructedEvents:NU,loadMergedEventsWithUnreadable:pn,loadEventActors:by,loadActorNames:wr,loadMergedEvents:On,loadMergedEventsBefore:bl,getEdgeRef:AU,advanceEdgeRef:TU,clearEdgeCache:MU,getSortedEvents:LU,loadEffectiveEventTimes:xl,mintEventId:kU,persist:xy,materializeAndPersist:PU,materializeAndPersistAll:F}=yN;var vi="Unchanged",Qo="Renamed ",SN={live:[],overLimit:[],disconnected:[]},yi=null,RN=(e,t)=>{if(!st())return null;let n=x();return n.timeMode==="live"&&n.replay===null&&Xo(e)===t?n.repos:null},Ct=e=>{try{let t=me({repoRoot:e});if(a(t))return l(t.message);let n=t.value,r=Ke(n);if(r==="none")return u("No log yet",SN);if(yi&&yi.root===n&&yi.signature===r)return u("Read connected repos",yi.repos);let o=RN(n,r);if(!o){let i=On(n);if(a(i))return l(i.message);o=Wg(i.value)}let s=Gg(o);return yi={root:n,signature:r,repos:s},u("Read connected repos",s)}catch(t){return l(`Could not read the connected repos: ${t instanceof Error?t.message:String(t)}`)}},Sl=e=>{let t=Ct(e);return a(t)?l(t.message):u("Read other repos",t.value.live)},Ry=(e,t)=>{let n=Sl(e);return!a(n)&&n.value.some(r=>r.id===t)},Fu=e=>{let t=e.url.trim(),n=Ys(t);if(n)return l(`That URL ${n}. ${$g}`);if(e.since!==void 0&&!Jr(e.since))return l(`"${e.since}" is not a history window: use board, all or YYYY-MM-DD.`);let r=e.label?.trim();if(r&&!Zr(r))return l(`"${r}" is not a label: up to 24 of a-z, 0-9, dot, dash or underscore, opening on a letter or digit.`);let o=Ct(e.repoRoot);if(a(o))return l(o.message);let s=[...o.value.live,...o.value.overLimit],i=wn(t),c=s.find(g=>g.id===i),d=r===void 0?void 0:r===Cn(c?.url??t)?"":r;if(d&&s.some(g=>g.id!==i&&g.label===d))return l(`Another repo is already called ${d}`);let p={...e.branches?{branches:e.branches}:{},...e.since?{since:e.since}:{},...d!==void 0?{label:d}:{}};if(!c){let g={id:i,url:t,branches:e.branches??eu,since:e.since??tu,label:d||Cn(t)};return u("Plan",{kind:"connect",repo:g,event:{url:t,...e.branches?{branches:e.branches}:{},...e.since?{since:e.since}:{},...d?{label:d}:{}}})}let m={...c,branches:e.branches??c.branches,since:e.since??c.since,label:d===void 0?c.label:d||Cn(c.url)};if(m.branches===c.branches&&m.since===c.since&&m.label===c.label)return u("Plan",{kind:"unchanged",repo:c});let f=m.branches===c.branches&&m.since===c.since;return u("Plan",{kind:"edit",repo:m,event:{repo:i,...p},message:`${f?Qo:"Updated "}${m.label}`})},bi=e=>{let t=me({repoRoot:e.repoRoot});if(a(t))return l(t.message);let n=F([{id:xN(),userId:e.actorId,...e.event}],t.value);return a(n)?l(n.message):u("Wrote repo event",null)},_u=e=>{let t=Ct(e);return new Map(a(t)?[]:[...t.value.live,...t.value.overLimit].map(n=>[n.id,n.label]))},$u=e=>e.map(t=>e.filter(n=>n.label===t.label).length===1?t.label:t.id),Rl=(e,t)=>{let n=t.trim(),r=e.filter(s=>s.label===n);if(r.length>1)return l(`Several repos are called ${n} \u2014 name one by its id or URL`);let o=r[0]??e.find(s=>s.id===n||yr(n)&&s.id===wn(n));return o?u("Found",o):l(`No repo "${n}" is connected`)},ju=(e,t)=>{let n=Ct(e);return a(n)?l(n.message):Rl([...n.value.live,...n.value.overLimit],t)},Uu=e=>Sy.join(Tt(),"repos",/^[\w-]+$/.test(e)?e:vN("sha1").update(e).digest("hex")),Ey=/^[a-z0-9._-]+-[0-9a-f]{12}\.git$/,Dn=(e,t)=>Sy.join(Uu(e),`${t}.git`),es=e=>`${e}.json`,El=/^(?!-)[A-Za-z0-9._/-]{1,100}$/,Iy=e=>{try{let t=JSON.parse(bN.readFileSync(es(e),"utf8"));return typeof t.stateBranch=="string"&&El.test(t.stateBranch)?t.stateBranch:null}catch{return null}},Nr=(e,t)=>e==="all"?null:e==="board"?t.slice(0,10):e,or=e=>{let t=St(e);return a(t)?l(t.message):u("Read project",{projectId:t.value.projectId,createdAt:t.value.createdAt})};var Cy=(e,t)=>{let n=(e.trim().split(/\s+/)[0]??"").toUpperCase();return n&&t.has(n)?n:null};import{randomUUID as Ti}from"node:crypto";import _ from"node:fs";import re from"node:path";import{execFileSync as EN}from"node:child_process";import{randomUUID as Ay}from"node:crypto";import Ot from"node:fs";import xi from"node:os";import Ty from"node:path";var wl="epiq-sync.lock",IN=600*1e3,My=Date.now()-process.uptime()*1e3,Ly=()=>Math.round(My),ky=5e3,CN=5e3,Py=e=>{try{if(process.platform==="linux"){let s=Ot.readFileSync(`/proc/${e}/stat`,"utf8"),i=s.slice(s.lastIndexOf(")")+2).split(" "),c=Number(i[19]),d=/^btime (\d+)$/m.exec(Ot.readFileSync("/proc/stat","utf8"))?.[1];return d&&Number.isFinite(c)?Number(d)*1e3+c*10:null}if(process.platform==="win32")return null;let t=wy.get(e);if(t&&Date.now()-t.at<wN)return t.value;let n=EN("ps",["-o","lstart=","-p",String(e)],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"],env:{...process.env,LC_ALL:"C"}}).trim(),r=Date.parse(n),o=Number.isNaN(r)?null:r;return wy.set(e,{at:Date.now(),value:o}),o}catch{return null}},Oy=(e,t)=>{let n=Py(e);return n!==null&&n>t+ky},wN=5e3,wy=new Map,NN=e=>{let t=Date.now()-xi.uptime()*1e3;if(e.startedAt<t)return!1;if(Date.now()-e.startedAt<CN||e.processStartedAt===void 0)return!0;let n=Py(e.pid);return n===null||Math.abs(n-e.processStartedAt)<=ky},Il=new Map,AN=e=>{try{let t=JSON.parse(e);return typeof t.pid!="number"||typeof t.hostname!="string"||typeof t.startedAt!="number"||typeof t.operation!="string"?null:t}catch{return null}},TN=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Dy=(e,t=IN,n=!1)=>e?e.hostname!==xi.hostname()?Date.now()-e.startedAt>t?"stale":null:!TN(e.pid)||n&&!NN(e)?"dead":Date.now()-e.startedAt>t?"stale":null:"stale",MN=e=>{let t=Ty.join(e,wl);return Ot.existsSync(t)?Dy(ts(t))===null:!1},Cl=new Map,LN=e=>{let t=Cl.get(e);if(t)return t;let n=Bs(e).then(r=>a(r)?null:r.value,()=>null);return Cl.set(e,n),n.then(r=>{r===null&&Cl.get(e)===n&&Cl.delete(e)}),n},Nl=async e=>{let t=await LN(e);return t!==null&&MN(t)},By=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,ts=e=>{try{return AN(Ot.readFileSync(e,"utf8"))}catch{return null}},kN=(e,t)=>{let n={pid:process.pid,hostname:xi.hostname(),startedAt:Date.now(),operation:t,token:Ay(),processStartedAt:My},r=`${e}.${process.pid}.pending.lock`;try{return Ot.writeFileSync(r,JSON.stringify(n)),Ot.linkSync(r,e),n}catch{return null}finally{try{Ot.rmSync(r,{force:!0})}catch{}}},PN=async({worktreeRoot:e,operation:t})=>{let n=await Bs(e);return a(n)?l(n.message):u("Tried the sync lock",Si({lockPath:Ty.join(n.value,wl),operation:t}))},Si=({lockPath:e,operation:t,staleAfterMs:n,checkProcess:r=!1})=>{let o=null,s=()=>{try{let d=ts(e);d&&Ny(d,o)&&Ot.rmSync(e)}catch{}finally{Il.get(e)===o?.token&&Il.delete(e)}},i=d=>(o=kN(e,t),o?(Il.set(e,o.token),{acquired:!0,claim:d,release:s}):null);for(let d=0;d<5;d++){let p=i("clean");if(p)return p;let m=ts(e);if(m===null&&(!Ot.existsSync(e)||(m=ts(e),m!==null)||!Ot.existsSync(e)))continue;let g=m!==null&&m.pid===process.pid&&m.hostname===xi.hostname()&&Il.get(e)!==m.token?"dead":Dy(m,n,r);if(g===null)return{acquired:!1,heldBy:m};G.info(`Breaking an abandoned sync lock: ${m?By(m):"unreadable lock file"}`);let h=`${e}.${process.pid}.${Ay()}.broken.lock`;try{Ot.renameSync(e,h)}catch{continue}if(!Ny(ts(h),m)){try{Ot.linkSync(h,e)}catch{}Ot.rmSync(h,{force:!0});continue}Ot.rmSync(h,{force:!0});let y=i(g);if(y)return y}return{acquired:!1,heldBy:ts(e)??{pid:-1,hostname:xi.hostname(),startedAt:Date.now(),operation:"unknown"}}},Ny=(e,t)=>e===null||t===null?e===t:e.pid===t.pid&&e.hostname===t.hostname&&e.startedAt===t.startedAt&&e.token===t.token,Ri=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await PN({worktreeRoot:e,operation:t});if(a(r))return l(r.message);if(!r.value.acquired)return G.info(`Skipping ${t}: the state worktree is held by ${By(r.value.heldBy)}`),u("State worktree is held by another process",null);let{claim:o,release:s}=r.value;try{return u("Ran under the sync lock",await n(o))}finally{s()}};import{randomBytes as _N}from"node:crypto";import $N from"node:fs";var ON="EPIQ_CACHE_MS",Al=e=>{let t=process.env[ON];if(t===void 0||t.trim()==="")return e;let n=Number(t);return Number.isFinite(n)&&n>=0?n:e};import Fy from"node:fs";import DN from"node:path";var _y=new Set,Hu=new Map,Wu=(e,t)=>{t?Hu.set(e,t):Hu.delete(e)},$y=e=>Hu.get(e)??null,BN=e=>{try{return new Set(Fy.readFileSync(DN.join(e,"shallow"),"utf8").split(`
38
- `).map(t=>t.trim()).filter(Boolean))}catch{return _y}},Ar=async e=>{let t=pt(e);if(a(t))return l(t.message);let n=t.value,r=St(n);if(a(r))return l(r.message);let o={cwd:n,revisions:["--branches","--not",r.value.stateBranch],exclude:_y},s=Sl(n);if(a(s))return u("Listed sources",[o]);let i=s.value.flatMap(c=>{let d=Dn(r.value.projectId,c.id);if(!Fy.existsSync(d))return[];let p=Nr(c.since,r.value.createdAt),m=new Set([r.value.stateBranch,xd,Iy(d)].filter(f=>f!==null));return[{repo:c.id,cwd:d,revisions:[...[...m].map(f=>`--exclude=${f}`),"--branches"],exclude:BN(d),...p?{notBefore:Date.parse(`${p}T00:00:00Z`)}:{}}]});return u("Listed sources",[o,...i])},Ei=e=>t=>e.find(n=>(n.repo??"")===(t??""))?.cwd,FN=async(e,t)=>!a(await U({cwd:e,args:["cat-file","-e",`${t}^{commit}`]})),Ii=async e=>{let t=await Ar(e.repoRoot);if(a(t))return l(t.message);let n=t.value;if(e.repo){let r=n.find(o=>o.repo===e.repo);return r?u("Resolved repo",r.cwd):l(`No clone of repo "${e.repo}" here yet \u2014 sync to fetch it`)}if(n.length===1)return u("Resolved repo",n[0].cwd);for(let r of n)if(await FN(r.cwd,e.sha))return u("Resolved repo",r.cwd);return u("Resolved repo",n[0].cwd)};var jN="",UN="",jy=5e3,HN=12e4,WN=32*1024*1024,Tl=new Map,GN=e=>{try{return $N.statSync(`${e}.json`).mtimeMs}catch{return null}},VN=e=>{let t=e.repo?_N(8).toString("hex"):"";return{field:`${jN}${t}`,record:`${UN}${t}`}},zN=/^[0-9a-f]{40}([0-9a-f]{24})?$/;var Tr=()=>{Tl.clear()},KN=(e,t,n)=>(t===void 0||e>=Math.floor(t/1e3)*1e3)&&(n===void 0||e<=n),Gu=e=>ye(e).replace(/[\u0080-\u009f\u202a-\u202e\u2066-\u2069]/g,""),qN=async(e,t)=>{let n=t.start===void 0&&t.end===void 0,r=[e.cwd,e.revisions.join(" "),e.notBefore??"",e.exclude.size].join("\0"),o=n?Tl.get(r):void 0,s=e.repo?GN(e.cwd):null;if(o&&(e.repo?o.version===s:Date.now()-o.fetchedAt<Al(jy)))return o.result;let i=VN(e),c=await U({cwd:e.cwd,...e.repo?{timeoutMs:HN,maxOutput:WN}:{},args:["log",...e.revisions,...t.start!==void 0?[`--since=@${Math.floor(t.start/1e3)}`]:[],...t.end!==void 0?[`--until=@${Math.floor(t.end/1e3)}`]:[],"--shortstat",`--format=${i.record}%H${i.field}%at${e.notBefore?`${i.field}%ct`:""}${i.field}%an${i.field}%ae${i.field}%s`]});if(a(c))return e.repo&&n&&!jf(c.message)&&Tl.set(r,{fetchedAt:Date.now(),version:s,result:l(c.message)}),l(c.message);let d=c.value.stdout.split(i.record).filter(p=>p.trim().length>0).map(p=>{let[m,...f]=p.split(`
39
- `),g=(m??"").split(i.field),[h,y]=g;if(e.repo&&!zN.test(h??""))return null;let v=e.notBefore?g[2]:void 0,[R,S,...N]=g.slice(e.notBefore?3:2);if(!h||!y||e.exclude.has(h)||e.notBefore&&Number(v)*1e3<e.notBefore)return null;let k=f.join(" "),L=Number(/(\d+) insertion/.exec(k)?.[1]??0),A=Number(/(\d+) deletion/.exec(k)?.[1]??0);return{sha:h,...e.repo?{repo:e.repo}:{},time:Number(y)*1e3,author:Gu(R)||"unknown",authorEmail:Gu(S),subject:Gu(N.join(i.field)),linesChanged:L+A,insertions:L,deletions:A}}).filter(p=>p!==null).filter(p=>KN(p.time,t.start,t.end));return n&&Tl.set(r,{fetchedAt:Date.now(),version:s,result:u("Computed commit timeline",d)}),u("Computed commit timeline",d)},Uy=async(e,t)=>{let n=await Ar(e);if(a(n))return l(n.message);let r=n.value,o=[];for(let i of r)o.push(await qN(i,t));let s=[];for(let[i,c]of o.entries()){let d=r[i].repo;if(a(c)){if(!d)return l(c.message);G.info(`[repos] could not read a clone: ${c.message}`),Wu(d,Fa(c.message)?"its history is too long to read; narrow its window":"its history could not be read");continue}d&&Wu(d,null),s.push(c.value)}return u("Read every source",s)},Ml=e=>{if(e.length<=1)return e;let t=new Set;return e.map(n=>{let r=n.filter(o=>!t.has(o.sha));for(let o of r)t.add(o.sha);return r})},Hy=e=>{let t=e.filter(n=>n.length>0);return t.length<=1?t[0]??[]:t.flat().sort((n,r)=>r.time-n.time)},Ci=async(e={})=>{let t=await Uy(e.repoRoot,{start:e.start,end:e.end});return a(t)?l(t.message):u("Computed commit timeline",Hy(Ml(t.value)))},Vu=async e=>{let t=e.ref.trim();if(!t)return l("ref must not be empty");if(t.length!==7)return l(`"${t}" is ${t.length} characters; a ref is ${7}. Read it off the issue rather than slicing the id by hand.`);let n=await Uy(e.repoRoot,{});if(a(n))return l(n.message);let r=`${t.toUpperCase()} `,o=s=>s.subject.toUpperCase().startsWith(r);return u("Matched commits by ref",n.value.map(s=>{let i=[];for(let[c,d]of s.entries()){if(!o(d))continue;let p=s[c+1];i.push({...d,precedingSha:p&&o(p)?p.sha:null})}return i}))},io=async e=>{let t=await Vu(e);return a(t)?l(t.message):u("Matched commits by ref",Hy(Ml(t.value)))};var Ll=1800*1e3,Fn=e=>`${e}.removed`,Wy=e=>{try{_.writeFileSync(Fn(e),"",{flag:"wx"})}catch(t){if(t.code!=="EEXIST")throw t;if(kl(Fn(e)))throw new Error("The removal mark is a link, which epiq will not use")}},Yu=()=>`${process.pid}-${Ly()}`,qu=e=>{try{let t=JSON.parse(_.readFileSync(es(e),"utf8"));return{fetchedAt:typeof t.fetchedAt=="number"?t.fetchedAt:null,attemptedAt:typeof t.attemptedAt=="number"?t.attemptedAt:null,error:typeof t.error=="string"?t.error:null,branches:t.branches==="all"||t.branches==="default"?t.branches:null,since:typeof t.since=="string"?t.since:null,restartedAt:typeof t.restartedAt=="number"?t.restartedAt:null,restartTriedAt:typeof t.restartTriedAt=="number"?t.restartTriedAt:null,restarts:typeof t.restarts=="number"&&t.restarts>=0?t.restarts:0,bytes:typeof t.bytes=="number"&&t.bytes>=0?t.bytes:null,stateBranch:typeof t.stateBranch=="string"&&El.test(t.stateBranch)?t.stateBranch:null}}catch{return null}},Xy=(e,t)=>{try{let n=`${es(e)}.${Yu()}.${Ti()}.tmp`;_.writeFileSync(n,JSON.stringify(t)+`
40
- `,{flag:"wx"}),_.renameSync(n,es(e))}catch(n){G.info(`[repos] could not record fetch status: ${String(n)}`)}},Mi=e=>{let t=or(e);if(a(t))return l(t.message);let n=Ct(e);if(a(n))return l(n.message);let r=(o,s)=>{let i=Dn(t.value.projectId,o.id),c=qu(i),d=_.existsSync(i);return{...o,cloned:d,overLimit:s,bytes:d?c?.bytes??null:null,fetchedAt:c?.fetchedAt??null,error:c?.error??$y(o.id)}};return u("Listed repos",[...n.value.live.map(o=>r(o,!1)),...n.value.overLimit.map(o=>r(o,!0))])},Ye=e=>U({...e,forClone:!0}),YN=(e,t)=>Ye({cwd:e,args:t,timeoutMs:Ll}),XN=1e3,Ai=async(e,t,n,{undo:r}={})=>{let o=qo(),s=o*1024*1024,i=new AbortController,c=setInterval(()=>{Rr(n)>s&&i.abort(ci(o))},XN),d;try{d=await Ye({cwd:e,args:t,timeoutMs:Ll,abort:i.signal})}finally{clearInterval(c)}return i.signal.aborted||!a(d)&&Rr(n)>s?(Zy(n),r&&(QN(n,r),av(n)),l(ci(o))):d},wi=e=>{try{return _.readFileSync(e)}catch{return null}},Xu=e=>{try{return _.readdirSync(e)}catch{return[]}},JN=e=>{let t=new Map,n=r=>{let o=re.join(e,r);for(let s of _.readdirSync(o,{withFileTypes:!0})){let i=re.join(r,s.name);s.isDirectory()?n(i):t.set(i,_.readFileSync(re.join(e,i)))}};return _.existsSync(re.join(e,"refs"))&&n("refs"),{refs:t,packedRefs:wi(re.join(e,"packed-refs")),head:wi(re.join(e,"HEAD")),config:wi(re.join(e,"config")),shallow:wi(re.join(e,"shallow")),packs:new Set(Xu(re.join(e,"objects","pack")))}},Jy="epiq-restore-",Gy=(e,t,n)=>{let r=re.join(e,`${Jy}${Ti()}.tmp`);_.writeFileSync(r,n,{flag:"wx"}),_.mkdirSync(re.dirname(re.join(e,t)),{recursive:!0}),_.renameSync(r,re.join(e,t))},ZN=e=>{let t=[],n=r=>{for(let o of _.readdirSync(re.join(e,r),{withFileTypes:!0})){let s=re.join(r,o.name);o.isDirectory()?n(s):t.push(s)}};return _.existsSync(re.join(e,"refs"))&&n("refs"),t},QN=(e,t)=>{for(let[r,o]of t.refs)Gy(e,r,o);for(let r of ZN(e))t.refs.has(r)||_.rmSync(re.join(e,r),{force:!0});for(let[r,o]of[["packed-refs",t.packedRefs],["HEAD",t.head],["config",t.config],["shallow",t.shallow]])o?Gy(e,r,o):_.rmSync(re.join(e,r),{force:!0});let n=re.join(e,"objects","pack");for(let r of Xu(n))t.packs.has(r)||_.rmSync(re.join(n,r));ao.delete(e)},Zy=e=>{let t=re.join(e,"objects");for(let[n,r]of[[re.join(t,"pack"),"tmp_"],[re.join(t,"pack"),".tmp-"],[t,"incoming-"],[e,Jy]])try{for(let o of _.readdirSync(n))o.startsWith(r)&&_.rmSync(re.join(n,o),{recursive:!0,force:!0})}catch{}},eA=/could not read from remote repository|the remote end hung up unexpectedly|early EOF|fetch-pack: invalid index-pack output/i,Qy=e=>{let t=e.split(`
41
- `).map(s=>s.replace(/[\x00-\x09\x0b-\x1f\x7f-\x9f]/g,"").trim()).filter(s=>s&&!s.startsWith("git ")),n=t.filter(s=>/^(fatal|error):/i.test(s));return(n.filter(s=>!eA.test(s))[0]??n[n.length-1]??t[t.length-1]??e).replace(/^(fatal|error):\s*/i,"").slice(0,300)},tA=64*1024,ev=async e=>{let t="HEAD:.epiq/project.json",n=await Ye({cwd:e,args:["cat-file","-s",t]});if(a(n)||!(Number(n.value.stdout.trim())<=tA))return null;let r=await Ye({cwd:e,args:["cat-file","blob",t]});if(a(r))return null;try{let{stateBranch:o}=JSON.parse(r.value.stdout);return typeof o=="string"&&El.test(o)?o:null}catch{return null}},Ju=async e=>{let t=await Ye({cwd:e,args:["symbolic-ref","--short","HEAD"]});return a(t)?null:t.value.stdout.trim()||null},nA=async(e,t)=>{if(t==="all")return u("All branches","+refs/heads/*:refs/heads/*");let n=await Ju(e);return n?u("Default branch",`+refs/heads/${n}:refs/heads/${n}`):l("Could not tell which branch is the default")},rA=async e=>{let t=await Ju(e);if(!t)return;let n=await Ye({cwd:e,args:["for-each-ref","--format=%(refname)","refs/heads/"]});if(!a(n))for(let r of n.value.stdout.split(`
42
- `).filter(Boolean))r!==`refs/heads/${t}`&&await Ye({cwd:e,args:["update-ref","-d",r]})},tv=async e=>{let t=await Ye({cwd:e,args:["for-each-ref","--count=1","--format=x","refs/heads/"]});return!a(t)&&t.value.stdout.trim()!==""},nv=e=>`--shallow-since=@${Math.floor(Date.parse(`${e}T00:00:00Z`)/1e3)}`,rv=async(e,t)=>{if(!await tv(e))return u("Empty",null);let n=await Ai(e,["fetch","--no-tags","--deepen=1","origin"],e,{undo:t});return a(n)?l(n.message):u("Deepened",null)},oA=/no commits selected for shallow requests|error processing shallow info/i,ov=async(e,t,n)=>{let r=re.dirname(e);_.mkdirSync(r,{recursive:!0}),_.rmSync(e,{recursive:!0,force:!0});let o=d=>["clone","--bare","--no-tags",t.branches==="default"?"--single-branch":"--no-single-branch",...d,"--",t.url,e],s=await Ai(r,o(n?[nv(n)]:[]),e),i=n!==null;if(a(s)&&n&&oA.test(s.message)&&(_.rmSync(e,{recursive:!0,force:!0}),s=await Ai(r,o(["--depth=1"]),e),i=!1),a(s))return _.rmSync(e,{recursive:!0,force:!0}),l(s.message);let c=await nA(e,t.branches);if(a(c))return _.rmSync(e,{recursive:!0,force:!0}),l(c.message);if(await Ye({cwd:e,args:["config","remote.origin.fetch",c.value]}),i){let d=await rv(e);if(a(d))return _.rmSync(e,{recursive:!0,force:!0}),l(d.message)}return u("Built clone",null)},Vy=async(e,t,n,{replace:r=!1}={})=>{let o=`${e}.${Yu()}.pending`,s=await ov(o,t,n);if(a(s))return s;if(r&&_.existsSync(e)){let i=`${e}.${Ti()}.deleting`;_.renameSync(e,i),_.renameSync(o,e);try{_.rmSync(i,{recursive:!0,force:!0})}catch(c){G.info(`[repos] could not clear an old clone: ${Wt(c)}`)}return u("Cloned anew",null)}return _.existsSync(e)?(_.rmSync(o,{recursive:!0,force:!0}),u("Cloned elsewhere",null)):kl(e)?(_.rmSync(o,{recursive:!0,force:!0}),l("The clone path is a link, which epiq will not use")):(_.renameSync(o,e),u("Cloned",null))},sA=async(e,t)=>!/[*:]/.test(t)&&!a(await Ye({cwd:e,args:["check-ref-format",`refs/heads/${t}`]})),sv=async e=>{let t=await YN(e,["ls-remote","--symref","origin","HEAD"]);if(a(t))return null;let n=/^ref: refs\/heads\/(\S+)\tHEAD$/m.exec(t.value.stdout)?.[1],r=/^[0-9a-f]{40,64}\tHEAD$/m.test(t.value.stdout);return n&&r&&await sA(e,n)?n:null},iv=async(e,t)=>{let n=t??await sv(e);if(!n)return l("Could not tell which branch the remote now defaults to");let r=await Ye({cwd:e,args:["symbolic-ref","HEAD",`refs/heads/${n}`]});if(a(r))return l(r.message);let o=await Ye({cwd:e,args:["config","remote.origin.fetch",`+refs/heads/${n}:refs/heads/${n}`]});return a(o)?l(o.message):u("Followed",null)},av=e=>{let t=(n,r)=>{for(let o of _.readdirSync(n,{withFileTypes:!0})){let s=re.join(n,o.name);o.isFile()&&o.name.endsWith(".lock")?_.rmSync(s,{force:!0}):o.isDirectory()&&r>0&&t(s,r-1)}};try{for(let r of _.readdirSync(e))r.endsWith(".lock")&&_.rmSync(re.join(e,r),{force:!0});let n=re.join(e,"refs");_.existsSync(n)&&t(n,16)}catch(n){G.info(`[repos] could not clear stale locks: ${String(n)}`)}},lv=e=>_.existsSync(re.join(e,"shallow")),iA=20,aA=async e=>{if(Xu(re.join(e,"objects","pack")).filter(r=>r.endsWith(".pack")).length<=iA)return;let n=await Ye({cwd:e,args:["repack","--geometric=2","-d","-q"],timeoutMs:Ll});a(n)&&G.info(`[repos] repack: ${n.message}`)},lA=async e=>{let t=await Ye({cwd:e,args:["config","--get","remote.origin.fetch"]});return a(t)?null:t.value.stdout.trim()||null},cA=e=>`+refs/heads/${e}:refs/heads/${e}`,dA=async(e,t)=>{let n=await lA(e);if(t==="all"){let s="+refs/heads/*:refs/heads/*";if(n===s)return u("Tracking",null);let i=await Ye({cwd:e,args:["config","remote.origin.fetch",s]});return a(i)?l(i.message):u("Tracking",null)}let r=await Ju(e),o=await sv(e)??r;return o?r===o&&n===cA(o)?u("Tracking",null):iv(e,o):l("Could not tell which branch is the default")},zy=async(e,t,n,r)=>{let o=qo();if(Rr(e)>o*1024*1024)return l(ci(o));let s=JN(e),i=await dA(e,t.branches);if(a(i))return l(i.message);let c=n===null?lv(e)?["--unshallow"]:[]:r?.since&&n<r.since?[nv(n)]:[],d=["fetch","--prune","--no-tags",...c,"origin"],p=await Ai(e,d,e,{undo:s});if(a(p)&&t.branches==="default"&&/couldn't find remote ref/i.test(p.message)){let m=await iv(e);if(a(m))return l(m.message);p=await Ai(e,d,e,{undo:s})}if(a(p))return l(p.message);if(c[0]?.startsWith("--shallow-since")){let m=await rv(e,s);if(a(m))return l(m.message)}return t.branches==="default"&&await rA(e),await aA(e),u("Fetched",null)},zu=async e=>{if(!_.existsSync(e))return"";let t=await Ye({cwd:e,args:["for-each-ref","--format=%(objectname) %(refname)"]}),n=lv(e)?_.readFileSync(re.join(e,"shallow"),"utf8"):"";return`${a(t)?"":t.value.stdout}
43
- ${n}`},ao=new Map,Ky=(e,t)=>{let n=ao.get(e);return ao.set(e,t),n!==void 0&&n!==t},uA=async(e,t)=>{let n=await Ye({cwd:e,args:["config","--get","remote.origin.url"]});return a(n)?"unknown":wn(n.value.stdout.trim())===t.id?"this":"other"},cv=e=>{let t=re.join(e,".gitignore");try{if(_.lstatSync(t,{throwIfNoEntry:!1}))return;_.writeFileSync(t,`*
44
- `,{flag:"wx"})}catch(n){G.info(`[repos] could not write ${t}: ${Wt(n)}`)}},kl=e=>{try{return _.lstatSync(e).isSymbolicLink()}catch{return!1}},Wt=e=>e instanceof Error?e.message:String(e),Zu=".lock",Qu=Ll*4,dv=async(e,t,n)=>{let r=Date.now()+n;for(;;){let o=Si({lockPath:`${e}${Zu}`,operation:t,staleAfterMs:Qu,checkProcess:!0});if(o.acquired||Date.now()>=r)return o;await new Promise(s=>setTimeout(s,250))}},Ni=e=>{let t=`${e}.${Ti()}.deleting`;try{_.renameSync(e,t)}catch(n){if(n.code!=="ENOENT")throw n}_.rmSync(t,{recursive:!0,force:!0}),_.rmSync(es(e),{force:!0}),_.rmSync(Fn(e),{force:!0}),ao.delete(e)},uv=5e3,mA=async e=>{let t=await Ye({cwd:e,args:["config","--get","remote.origin.url"]});if(a(t)||!t.value.stdout.trim())return!1;let n=wi(re.join(e,"shallow"));return n&&!/^(?:[0-9a-f]{40}(?:[0-9a-f]{24})?\n)*$/.test(n.toString("utf8"))?!1:await tv(e)?!a(await Ye({cwd:e,args:["rev-list","--max-count=1","--branches"]})):!0},qy=[0,6e4,10*6e4,60*6e4],mv=e=>{if(!e?.restartTriedAt||Date.now()<e.restartTriedAt)return!0;let t=qy[Math.min(e.restarts,qy.length-1)];return Date.now()-e.restartTriedAt>=t},pA=360*60*1e3,fA=e=>{let t=e?.restartTriedAt??e?.restartedAt;return mv(e)&&(!t||Date.now()<t||Date.now()-t>=pA)},gA=6e4,hA=async(e,t,n)=>{let r=qo();return Rr(e)>r*1024*1024?"past the cap":n.endsWith(ci(r))?null:await pv(e,t)?"remote answers":null},pv=async(e,t)=>!a(await Ye({cwd:re.dirname(e),args:["ls-remote","--",t.url,"HEAD"],timeoutMs:gA})),yA=async(e,t,n,r,o)=>{let s=(m,f,g=!1)=>({id:r.id,label:r.label,ok:m,changed:g,message:f}),i=Dn(t,r.id),c=Nr(r.since,n);try{_.mkdirSync(re.dirname(i),{recursive:!0}),cv(re.dirname(i))}catch(m){return s(!1,Wt(m))}let d=qu(i);if(d?.attemptedAt&&(d.error!==null||d.branches===r.branches&&d.since===c)&&Date.now()>=d.attemptedAt&&Date.now()-d.attemptedAt<o&&!_.existsSync(Fn(i))){let m=_.existsSync(i)&&Ky(i,await zu(i));return d.error?s(!1,d.error,m):s(!0,"Fetched recently",m)}if(kl(i))return s(!1,"The clone path is a link, which epiq will not use");let p=await dv(i,`fetch ${r.label}`,o===0?uv:0);if(!p.acquired)return{...s(!0,"Being fetched by another process"),skipped:!0};try{let m=_.existsSync(Fn(i));m&&Ni(i);let f=_.existsSync(i);f&&await uA(i,r)==="other"&&(Ni(i),f=!1);let g=f?qu(i):null;if(f&&!ao.has(i)&&ao.set(i,await zu(i)),f&&(av(i),Zy(i)),!f&&m&&!Ry(e,r.id))return s(!0,"Removed before it was cloned");let y=f&&!await mA(i)&&mv(g),v=y&&await pv(i,r),R=f?y?l(v?"Its clone will not open":"Its clone will not open, and its remote does not answer"):await zy(i,r,c,g):await Vy(i,r,c);if(f&&!v&&a(R)&&fA(g)){let L=await hA(i,r,R.message);L==="remote answers"&&(R=await zy(i,r,c,g)),v=L!==null&&a(R)}v&&(G.info(`[repos] ${r.label}: starting its clone over`),R=await Vy(i,r,c,{replace:!0}),ao.delete(i));let S=v&&!(a(R)&&Yf()),N=a(R)?Qy(R.message):"Fetched",k=a(R)?g?.stateBranch??null:await ev(i);return Xy(i,{fetchedAt:a(R)?g?.fetchedAt??null:Date.now(),attemptedAt:Date.now(),error:a(R)?N:null,branches:a(R)?g?.branches??r.branches:r.branches,since:a(R)?g?.since??c:c,stateBranch:k,restartedAt:v&&!a(R)?Date.now():g?.restartedAt??null,restartTriedAt:S?Date.now():g?.restartTriedAt??null,restarts:S?(g?.restarts??0)+1:a(R)?g?.restarts??0:0,bytes:a(R)?g?.bytes??null:Rr(i)}),a(R)?(G.info(`[repos] ${r.label}: ${R.message}`),s(!1,N)):s(!0,N,Ky(i,await zu(i))||!f||v)}catch(m){return G.info(`[repos] ${r.label}: ${Wt(m)}`),s(!1,Wt(m))}finally{try{_.existsSync(Fn(i))&&Ni(i)}catch(m){G.info(`[repos] ${r.label}: could not delete the clone: ${Wt(m)}`)}p.release(),fv(i)}},fv=e=>{if(!_.existsSync(Fn(e)))return;let t=Si({lockPath:`${e}${Zu}`,operation:"remove",staleAfterMs:Qu,checkProcess:!0});if(t.acquired)try{_.existsSync(Fn(e))&&Ni(e)}catch(n){G.info(`[repos] could not delete a clone: ${Wt(n)}`)}finally{t.release()}},vA=e=>{let t=Uu(e);if(_.existsSync(t))for(let n of _.readdirSync(t)){let r=/^.+\.git(?:\.json)?\.(\d+)(?:-(\d+))?(?:\.[0-9a-f-]{36})?\.(?:pending|tmp)$/.exec(n);if(r&&!xA(Number(r[1]),r[2]===void 0?null:Number(r[2]))||/\.git\.[0-9a-f-]{36}\.deleting$/.test(n))try{_.rmSync(re.join(t,n),{recursive:!0,force:!0})}catch(o){G.info(`[repos] could not sweep ${n}: ${Wt(o)}`)}}},gv=async(e,t)=>{let n=or(e);if(a(n))return l(n.message);let r=Dn(n.value.projectId,t.id),o=`${r}.${Yu()}.${Ti()}.pending`;try{_.mkdirSync(re.dirname(r),{recursive:!0}),cv(re.dirname(r));let s=await ov(o,t,Nr(t.since,n.value.createdAt));return a(s)?l(Qy(s.message)):u("Staged",{stagePath:o,bytes:Rr(o)})}catch(s){return Bn(o),l(Wt(s))}},Bn=e=>{try{_.rmSync(e,{recursive:!0,force:!0})}catch(t){G.info(`[repos] could not clear a stage: ${Wt(t)}`)}},hv=async(e,t,n)=>{let r=or(e);if(a(r))return Bn(n);let{projectId:o,createdAt:s}=r.value,i=Dn(o,t.id),c=await dv(i,`connect ${t.label}`,uv);if(!c.acquired)return Bn(n);try{if(_.rmSync(Fn(i),{force:!0}),_.existsSync(i)||kl(i))return Bn(n);_.renameSync(n,i),Xy(i,{fetchedAt:Date.now(),attemptedAt:Date.now(),error:null,branches:t.branches,since:Nr(t.since,s),stateBranch:await ev(i),restartedAt:null,restartTriedAt:null,restarts:0,bytes:Rr(i)}),Tr()}catch(d){G.info(`[repos] could not place ${t.label}: ${Wt(d)}`),Bn(n)}finally{c.release()}},Li=e=>{let t=ju(e.repoRoot,e.repo);if(a(t))return t;let n=bi({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"disconnect.repo",payload:{repo:t.value.id}}});if(a(n))return l(n.message);let r=em({repoRoot:e.repoRoot,repoId:t.value.id});Tr();let o=or(e.repoRoot);!a(r)&&!a(o)&&yv(o.value.projectId,t.value.id);let s=`Disconnected ${t.value.label}`;return a(r)?u(`${s}, but its clone stays: ${r.message}`,t.value):u(s,t.value)},em=e=>{let t=or(e.repoRoot);if(a(t))return l(t.message);if(!Ey.test(`${e.repoId}.git`))return l("Not a clone epiq made");let n=Dn(t.value.projectId,e.repoId);try{_.mkdirSync(re.dirname(n),{recursive:!0})}catch(o){return l(`Could not remove the clone: ${Wt(o)}`)}let r=Si({lockPath:`${n}${Zu}`,operation:"remove",staleAfterMs:Qu,checkProcess:!0});try{return r.acquired?(Ni(n),Wy(n),u("Removed clone",null)):(Wy(n),fv(n),u("Removed once its fetch ends",null))}catch(o){return l(`Could not remove the clone: ${String(o)}`)}finally{r.acquired&&r.release()}},yv=(e,t)=>{let n=Dn(e,t);_.existsSync(n)||_.rmSync(Fn(n),{force:!0})},bA=(e,t,n)=>{for(let r of n){if(!_.existsSync(Dn(t,r)))continue;let o=em({repoRoot:e,repoId:r});if(a(o)){G.info(`[repos] could not clear ${r}: ${o.message}`);continue}Tr(),yv(t,r)}},xA=(e,t)=>SA(e)&&(t===null||!Oy(e,t)),SA=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Yy=4,ns=e=>{let t=e.minIntervalMs??0,n=Ku.get(e.repoRoot);if(n)return n.minIntervalMs<=t?n.result:n.result.then(()=>ns(e));let r=RA(e.repoRoot,t).catch(o=>l(Wt(o))).finally(()=>{Ku.delete(e.repoRoot)});return Ku.set(e.repoRoot,{result:r,minIntervalMs:t}),r},Ku=new Map,RA=async(e,t)=>{let n=or(e);if(a(n))return l(n.message);let r=Ct(e);if(a(r))return l(r.message);let{projectId:o,createdAt:s}=n.value,i=r.value.live;try{vA(o)}catch(d){G.info(`[repos] sweep failed: ${String(d)}`)}if(bA(e,o,r.value.disconnected),i.length===0)return u("No other repos",[]);let c=[];for(let d=0;d<i.length;d+=Yy)c.push(...await Promise.all(i.slice(d,d+Yy).map(p=>yA(e,o,s,p,t))));return c.some(d=>d.changed)&&Tr(),u("Fetched other repos",c)},Pl=e=>{let t=e.filter(o=>!o.ok),n=e.filter(o=>o.skipped),r=[t.length>0&&`could not fetch ${t.map(o=>`${o.label} (${o.message.slice(0,80)})`).join(", ")}`,n.length>0&&`another process is fetching ${n.map(o=>o.label).join(", ")}`].filter(Boolean);return r.length>0?r.join("; "):null};var nm=900*1e3,rs=new Map,vv=0,rm=new Map,bv=e=>{let t=(rm.get(e)??0)+1;return rm.set(e,t),t},EA=(e,t)=>JSON.stringify([e,t.id,t.branches,t.since]),om=e=>{let t=rs.get(e);t&&(clearTimeout(t.timer),rs.delete(e),Bn(t.stagePath))},sm=e=>{bv(e),om(e)},xv=e=>{if(e.startsWith("file:"))return"this machine";let t=/^[^@/]+@([^:/]+):/.exec(e);if(t?.[1])return t[1];try{return new URL(e).host||e}catch{return e}},tm=async(e,t)=>{let n=await U({cwd:e,args:t,forClone:!0,keepPartial:!0});return a(n)?null:n.value.stdout},IA=async(e,t,n)=>{let r=(await tm(e,["symbolic-ref","--short","HEAD"]))?.trim().replace(/^refs\/heads\//,""),o=await tm(e,["log","-1","--format=%s%x00%an%x00%cI","HEAD"]),[s,i,c]=(o??"").trim().split("\0"),p=(await tm(e,["log","--branches","--max-count=100000",...t?[`--since=@${Math.floor(Date.parse(`${t}T00:00:00Z`)/1e3)}`]:[],"--format=%s"])??"").split(`
45
- `).filter(Boolean);return{defaultBranch:r||null,latest:s!==void 0&&s!==""&&i&&c?{subject:s,author:i,date:c}:null,commits:p.length,ticketCommits:p.filter(m=>Cy(m,n)).length}},CA=()=>{if(!st())return{knownRefs:new Set,contributors:0};let e=x();return{knownRefs:new Set(Object.values(e.nodes).filter(t=>$(t)).map(t=>z(t.id))),contributors:Object.values(e.contributors).filter(t=>!t.tombstoned).length}},Ol=e=>{let t=Mi(e);return a(t)?0:t.value.reduce((n,r)=>n+(r.bytes??0),0)},ki=async e=>{let t=Fu(e);if(a(t))return l(t.message);let n=t.value;if(n.kind!=="connect"&&e.mode==="preview")return l(`${n.repo.label} is already connected`);if(n.kind==="unchanged")return u(vi,{kind:"unchanged",repo:n.repo});if(n.kind==="edit"){let v=bi({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"edit.repo",payload:n.event}});return a(v)?l(v.message):(n.message.startsWith(Qo)||Tr(),u(n.message,{kind:"updated",repo:n.repo}))}let r=EA(e.repoRoot,n.repo),o=rs.get(n.repo.id);if(e.mode==="confirm"&&o?.key!==r)return l("Nothing is staged for this connect here, or it was staged with other options: preview it again");if(e.mode==="confirm"&&o){clearTimeout(o.timer),rs.delete(n.repo.id);let v=bi({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"connect.repo",payload:n.event}});if(a(v))return Bn(o.stagePath),l(v.message);await hv(e.repoRoot,n.repo,o.stagePath);let R=Ct(e.repoRoot),S=!a(R)&&R.value.overLimit.some(N=>N.id===n.repo.id);return u(S?`Connected ${n.repo.label}, but the board already reads ${Jn} repos: it is not fetched until one ahead of it is disconnected`:`Connected ${n.repo.label}`,{kind:"connected",repo:n.repo})}for(let v of[...rs.keys()])om(v);let s=bv(n.repo.id),i=++vv,c=()=>rm.get(n.repo.id)!==s||vv!==i,d=or(e.repoRoot);if(a(d))return l(d.message);let p=await gv(e.repoRoot,n.repo);if(a(p))return l(`Could not clone it: ${p.message}`);if(c())return Bn(p.value.stagePath),l("Cancelled");let m=CA(),f=await IA(p.value.stagePath,Nr(n.repo.since,d.value.createdAt),m.knownRefs),g=Ct(e.repoRoot),h={repo:n.repo,host:xv(n.repo.url),...f,bytes:p.value.bytes,contributors:m.contributors,claimedBytes:Ol(e.repoRoot),overLimit:!a(g)&&g.value.live.length>=Jn,expiresAt:Date.now()+nm};if(c())return Bn(p.value.stagePath),l("Cancelled");let y=setTimeout(()=>om(n.repo.id),nm);return y.unref(),rs.set(n.repo.id,{stagePath:p.value.stagePath,key:r,preview:h,timer:y}),u("Preview: nothing is connected until you confirm",{kind:"preview",preview:h})};import wA from"node:path";var im=async e=>{let t=await ke({cwd:e,args:["config","--get","remote.origin.url"]}),n=t.exitCode===0&&t.stdout.trim()||null;return{label:n?Cn(n):wA.basename(e),url:n,path:e}};import NA from"node:fs";import AA from"node:path";var TA=8*1024*1024,cm=async e=>{if(!Yo(e.sha))return l("Invalid commit sha");let t=await Ii(e);if(a(t))return l(t.message);let n=await U({cwd:t.value,maxOutput:TA,args:["show","--no-ext-diff","--no-color","--patch","--find-renames","--format=",e.sha]});return a(n)?l(Fa(n.message)?"This commit is too large to show here; open it in your editor":n.message):u("Read commit patch",n.value.stdout)},MA=200,Sv=e=>/^0+$/.test(e),Dl=/^:\d{6} \d{6} ([0-9a-f]{40}) ([0-9a-f]{40}) [A-Z]\d*\t(.+)$/,Rv=/^(\d+|-)\t(\d+|-)\t(.+)$/,am=async(e,t,n,r)=>{let o=await U({cwd:e,args:["diff","--raw","--numstat","--no-renames","--abbrev=40",t,n,...r&&r.length>0?["--",...r]:[]]});if(a(o))return G.info(`[commits] diff ${t} ${n}: ${o.message}`),l(Cv);let s=o.value.stdout.split(`
46
- `).filter(p=>p!==""),i=s.filter(p=>!Dl.test(p)&&!Rv.test(p));if(i.length>0)return l(`Could not parse ${i.length} line(s) of "git diff --raw --numstat" output, e.g. "${i[0]}"`);let c=new Map;for(let p of s){let m=Rv.exec(p);m&&c.set(m[3]??"",{insertions:m[1]==="-"?0:Number(m[1]),deletions:m[2]==="-"?0:Number(m[2]),isBinary:m[1]==="-"&&m[2]==="-"})}let d=s.filter(p=>Dl.test(p)).map(p=>{let m=Dl.exec(p),f=m?.[1]??"",g=m?.[2]??"",h=m?.[3]??"";return{path:h,beforeBlob:Sv(f)?null:f,afterBlob:Sv(g)?null:g,...c.get(h)??{insertions:0,deletions:0,isBinary:!1}}});return u("Listed changed files with blob hashes",d)},Iv=async(e,t)=>{if(t.length>MA)return l(`${t.length} files changed \u2014 too many to show as a diff`);let n=t.flatMap(i=>i.isBinary?[]:[i.beforeBlob,i.afterBlob].filter(c=>c!==null)),r=await _a(n,e);if(a(r))return l(r.message);let o=r.value,s=i=>i!==null&&!o.has(i);return u("Read changed file contents",t.map(i=>{let c=i.isBinary||s(i.beforeBlob)||s(i.afterBlob);return{path:i.path,before:c||!i.beforeBlob?"":o.get(i.beforeBlob)??"",after:c||!i.afterBlob?"":o.get(i.afterBlob)??"",insertions:i.insertions,deletions:i.deletions,isBinary:c}}))},dm=async e=>{if(!Yo(e.sha))return l("Invalid commit sha");let t=await Ii(e);if(a(t))return l(t.message);let n=t.value,r=await am(n,`${e.sha}~1`,e.sha);if(a(r)&&r.message===Cv){let i=await wv(n,e.sha);if(a(i))return l(i.message);i.value===lm&&(r=await am(n,lm,e.sha))}if(a(r))return l(r.message);if(r.value.length===0)return l("No changed files found for this commit");let o=await Iv(n,r.value);if(a(o))return l(o.message);let s=o.value;return u("Loaded commit diff",{sha:e.sha,...e.repo?{repo:e.repo}:{},files:s})},LA=/^[0-9a-f]{40}$/,kA=async(e,t,n)=>{let r=await U({cwd:e,args:["log","--raw","--no-renames","--abbrev=40","--format=%H",`${t}..${n}`]});if(a(r))return l(r.message);let o=new Map,s=null;for(let i of r.value.stdout.split(`
47
- `)){if(LA.test(i)){s=new Set,o.set(i,s);continue}let c=Dl.exec(i);c&&s&&s.add(c[3]??"")}return u("Listed changed paths per commit",o)},Ev=e=>{let t=new Set;for(let n of e)for(let r of n)t.add(r);return t},PA=async(e,t,n)=>{if(t===n)return!0;let r=await U({cwd:e,args:["merge-base","--is-ancestor",t,n]});return!a(r)},lm="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Cv="Could not read this commit's diff",OA="Its parent is outside the fetched history. Widen since to see this diff.",DA=async(e,t)=>{let n=await U({cwd:e,args:["rev-parse","--git-path","shallow"]});if(a(n))return!1;try{return NA.readFileSync(AA.resolve(e,n.value.stdout.trim()),"utf8").split(`
48
- `).some(r=>r!==""&&r.startsWith(t))}catch{return!1}},wv=async(e,t)=>{let n=await U({cwd:e,args:["rev-parse","--verify","--quiet",`${t}^1`]});return a(n)?await DA(e,t)?l(OA):u("A root commit",lm):u("Parent",`${t}~1`)},um=async e=>{let t=pt(e.repoRoot);if(a(t))return l(t.message);let n=t.value,r=await Vu({repoRoot:n,ref:e.ref});if(a(r))return l(r.message);let o=new Set(r.value.flat().map(g=>g.sha)),s=await Ar(n);if(a(s))return l(s.message);let i=Ei(s.value),c=new Map;for(let g of Ml(r.value))g.length>0&&c.set(g[0].repo??"",g);let d=[],p=0;for(let[g,h]of c){let y=i(g);if(!y){p+=1;continue}let v=await BA(y,e.ref,h,o);if(a(v)){if(!g)return l(v.message);G.info(`[repos] could not squash ${g}: ${v.message}`),p+=1;continue}let R=g||void 0;d.push({repo:R,diff:{...v.value,files:v.value.files.map(S=>R?{...S,repo:R}:S),overlappingPaths:v.value.overlappingPaths.map(S=>R?`${R}:${S}`:S)}})}let[m,...f]=d;return m?f.length===0?u("Loaded squashed diff",m.diff):u("Loaded squashed diff",{...m.diff,commits:d.reduce((g,h)=>g+h.diff.commits,0),files:d.flatMap(g=>g.diff.files),contiguous:d.every(g=>g.diff.contiguous),overlappingPaths:d.flatMap(g=>g.diff.overlappingPaths),parts:d.map(({repo:g,diff:h})=>({...g?{repo:g}:{},from:h.from,to:h.to,commits:h.commits,contiguous:h.contiguous}))}):l(p>0?"The clone holding this ticket\u2019s commits could not be read":"No commits reference this ticket")},BA=async(e,t,n,r=new Set)=>{let o=n[0].sha,s=o;for(let O=n.length-1;O>0;O--){let j=n[O].sha;if(await PA(e,j,o)){s=j;break}}let i=await wv(e,s);if(a(i))return l(i.message);let c=i.value,d=await kA(e,c,o);if(a(d))return l(d.message);let p=d.value,m=new Set(n.map(O=>O.sha)),f=new Set([...m,...r]),g=[...p.keys()].filter(O=>m.has(O)),h=[...p.keys()].filter(O=>f.has(O)),y=h.length===p.size,v=h.length>g.length,R=new Map;for(let O of g)for(let j of p.get(O)??[])R.has(j)||R.set(j,O);let S=(O,j)=>u("Loaded squashed diff",{ref:t.trim().toUpperCase(),from:c,to:o,commits:g.length,files:O.map(W=>({...W,sha:R.get(W.path)??o})),contiguous:y,overlappingPaths:j}),N,k=[];if(!y||v){let O=Ev(g.map(W=>p.get(W)??new Set)),j=Ev([...p.entries()].filter(([W])=>!f.has(W)).map(([,W])=>W));if(O.size===0)return S([],[]);N=[...O],k=[...O].filter(W=>j.has(W)).sort()}let L=await am(e,c,o,N);if(a(L))return l(L.message);let A=await Iv(e,L.value);return a(A)?l(A.message):S(A.value,k)};var Av=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,mm=e=>e.replace(Av,""),FA=e=>`<!-- epiq-diff-comment:${JSON.stringify(e).replaceAll(">","\\u003e")} -->`,Nv=e=>e==="additions"||e==="deletions",Pi=e=>{let t=Av.exec(e);if(!t?.[1])return null;let n;try{n=JSON.parse(t[1])}catch{return null}let r=n;return typeof r?.filePath!="string"||typeof r.start!="number"||typeof r.end!="number"||typeof r.note!="string"||!Nv(r.side)||!Nv(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var Tv=/```\n([\s\S]*?)\n?```\s*$/,Mv=e=>Tv.exec(e)?.[1]??null,_A=/`[^`\n]+`[^\n]*\n?$/,Lv=e=>mm(e).replace(Tv,"").replace(_A,"").trim(),kv=e=>{let n=(e.endSide??e.side)==="deletions"?"removed":"added";return e.start===e.end?`line ${e.start} (${n})`:`lines ${e.start}-${e.end} (${n})`},pm=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${kv(e)}`;var $A=e=>{let t=e.split(`
49
- `),n=t.filter(r=>r.trim()!=="").reduce((r,o)=>{let s=/^[ \t]*/.exec(o)?.[0].length??0;return r===null?s:Math.min(r,s)},null);return n?t.map(r=>r.slice(n)).join(`
50
- `):e},Pv=({snippet:e,...t})=>{let n=t.note.trim();return[...n?[n,""]:[],FA({...t,note:n}),`\`${t.filePath}\` ${kv(t)}`,"```",$A(e),"```"].join(`
51
- `)};var jA=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/,Bl=e=>{if(!e.startsWith('"')||!e.endsWith('"'))return e;let t=e.slice(1,-1),n="";for(let r=0;r<t.length;r++){if(t[r]!=="\\"){n+=t[r];continue}let o=t[++r];if(o==="n")n+=`
52
- `;else if(o==="t")n+=" ";else if(o==='"'||o==="\\")n+=o;else if(o&&/[0-7]/.test(o)){let s=t.slice(r,r+3);n+=String.fromCharCode(parseInt(s,8)),r+=2}else o!==void 0&&(n+=o)}try{return decodeURIComponent(escape(n))}catch{return n}},Ov=e=>{let t=Bl(e.trim());return t==="/dev/null"?null:t.replace(/^[ab]\//,"")},gm=e=>{let t=[],n=null,r=0,o=0,s=()=>{let i={path:"",oldPath:null,binary:!1,added:0,removed:0,lines:[]};return t.push(i),i};for(let i of e.split(`
53
- `)){if(i.startsWith("diff --git ")){n=s();let m=i.slice(11),f=m.lastIndexOf(" b/");f!==-1&&(n.path=Bl(m.slice(f+1)).replace(/^b\//,""));continue}if(!n){if(!i.trim())continue;n=s()}let c=n,d=c.lines.length===0;if(d&&i.startsWith("--- ")){let m=Ov(i.slice(4));m&&(c.oldPath=m);continue}if(d&&i.startsWith("+++ ")){let m=Ov(i.slice(4));m&&(c.path=m);continue}if(d&&i.startsWith("rename from ")){c.oldPath=Bl(i.slice(12));continue}if(d&&i.startsWith("rename to ")){c.path=Bl(i.slice(10));continue}if(d&&(i.startsWith("Binary files ")||i.startsWith("GIT binary patch"))){c.binary=!0,c.lines.push({kind:"note",text:"Binary file"});continue}let p=jA.exec(i);if(p){r=Number(p[1]),o=Number(p[3]),c.lines.push({kind:"hunk",text:i});continue}if(!d){if(i.startsWith("\\")){c.lines.push({kind:"note",text:i.slice(1).trim()});continue}if(i.startsWith("+")){c.added++,c.lines.push({kind:"added",text:i.slice(1),newLine:o++});continue}if(i.startsWith("-")){c.removed++,c.lines.push({kind:"removed",text:i.slice(1),oldLine:r++});continue}if(i.startsWith(" ")){c.lines.push({kind:"context",text:i.slice(1),oldLine:r++,newLine:o++});continue}i===""&&c.lines.push({kind:"context",text:"",oldLine:r++,newLine:o++})}}for(let i of t)!i.path&&i.oldPath&&(i.path=i.oldPath);return t.filter(i=>i.path!=="")},fm=e=>e.oldPath&&e.oldPath!==e.path?e.oldPath:null;var hm=e=>e.flatMap(t=>[{kind:"file",text:`${fm(t)?`${fm(t)} \u2192 `:""}${t.path}`,file:t},...t.lines]),Fl=e=>{let t="",n=-1;return e.map(r=>(r.kind==="file"&&(t=r.file.path),r.kind==="hunk"&&n++,{file:t,hunk:n}))},ym=(e,t,n)=>{let r=t.map(i=>Pi(i.md)).filter(i=>i!==null&&i.sha===n&&i.side==="additions");if(r.length===0)return new Set;let o=Fl(e),s=new Set;return e.forEach((i,c)=>{let d=i.newLine;if(d===void 0)return;let p=o[c]?.file;r.some(m=>m.filePath===p&&m.start<=d&&d<=m.end)&&s.add(c)}),s},Dv=(e,t)=>e===t?`line:${e}`:`lines:${e}-${t}`,UA=/^lines?:(\d+)(?:-(\d+))?(?:\s+|$)/,Bv=e=>{let t=UA.exec(e);if(!t)return null;let n=Number(t[1]),r=t[2]===void 0?n:Number(t[2]);return{start:Math.min(n,r),end:Math.max(n,r),note:e.slice(t[0].length)}},Fv=(e,t)=>Fl(e)[t]?.file??null,_v=(e,t,n,r)=>{let o=Fl(e),s=d=>e.findIndex((p,m)=>o[m]?.file===t&&(p.kind==="added"||p.kind==="context")&&p.newLine===d),i=s(n),c=s(r);return i===-1||c===-1?{ok:!1,reason:`${t} has no line ${i===-1?n:r} on the new side`}:vm(e,i,c)},vm=(e,t,n)=>{let[r,o]=t<=n?[t,n]:[n,t],s=e[r],i=e[o];if(!s||!i)return{ok:!1,reason:"That line is not in the diff"};let c=g=>(g.kind==="added"||g.kind==="context")&&g.newLine!==void 0;if(!c(s)||!c(i))return{ok:!1,reason:"Comments anchor to the new side: pick an added or unchanged line"};let d=Fl(e),p=d[r],m=d[o];if(p.file!==m.file)return{ok:!1,reason:"A comment covers one file at a time"};if(p.hunk!==m.hunk)return{ok:!1,reason:"A comment covers one hunk at a time"};let f=e.slice(r,o+1).filter(c);return{ok:!0,value:{filePath:p.file,start:f[0].newLine,end:f[f.length-1].newLine,snippet:f.map(g=>g.text).join(`
54
- `)}}};import{existsSync as Rm}from"node:fs";import{chmod as Em}from"node:fs/promises";import $l from"node:path";import{spawn as HA,spawnSync as WA}from"node:child_process";import GA from"node:os";import $v from"node:path";import{ulid as VA}from"ulid";function bm(e){let t=[],n="",r=!1,o=null;for(let s of e.trim()){if(o){s===o?o=null:n+=s;continue}if(s==='"'||s==="'"){o=s,r=!0;continue}if(/\s/.test(s)){r&&t.push(n),n="",r=!1;continue}n+=s,r=!0}return r&&t.push(n),t}function zA(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function _l(){let{preferredEditor:e}=q(),t=[e?zA(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function xm(e){let[t=""]=bm(e);return/(^|\/)code(-insiders)?$/.test(t)}function jv(e,t){let[n="",...r]=bm(e);return{command:n,args:[...r,...t]}}function Uv(e,t){return jv(e,xm(e)?["--wait",t]:[t])}function KA(e,t,n,r="new"){return jv(e,[r==="new"?"--new-window":"--reuse-window","--diff",t,n])}function Hv(e){let t=$v.join(GA.tmpdir(),"epiq");ct.mkDir(t);let n=$v.join(t,VA());ct.writeToFile(n,e??"");let r=_l();for(let o of r){let{command:s,args:i}=Uv(o,n);if(!s)continue;let c=WA(s,i,{stdio:"inherit"});if(!c.error&&c.status===0){let d=ct.readFile(n);if(d==null)return l("Unable to read edited file");let p=d.replace(/\r?\n$/,"");return u("Successfully edited",p)}}return l("Unable to open editor")}var qA=new Set(["vim","vi","nvim","nano","pico","ed"]);function YA(e){let[t=""]=bm(e),n=t.split("/").pop()??t;return qA.has(n)}var XA=600;function Wv({command:e,args:t},n){return new Promise(r=>{if(!e){r(l(`"${n}" is not a usable editor command`));return}let o=HA(e,t,{stdio:"ignore",detached:!0}),s=!1,i=d=>{s||(s=!0,clearTimeout(c),r(d))};o.on("error",d=>i(l(d.message))),o.on("exit",d=>{i(d===0?u("Opened editor",!0):l(`"${n}" exited with code ${d}`))});let c=setTimeout(()=>{o.unref(),i(u("Opened editor",!0))},XA)})}function JA(e,t){return YA(e)?Promise.resolve(l(`"${e}" is a terminal editor and can't open from the GUI (no terminal attached). Set preferredEditor to a GUI editor (e.g. "code"), or open the file yourself: ${t}`)):Wv(Uv(e,t),e)}function Sm(e,t,n,r="new"){return Wv(KA(e,t,n,r),e)}async function Gv(e){let t=_l();if(t.length===0)return l("No editor configured (preferredEditor, VISUAL, or EDITOR)");let n=l("Unable to open editor");for(let r of t){let o=await JA(r,e);if(!a(o))return o;n=o,logger.error(`Failed to open editor "${r}" for ${e}: ${o.message}`)}return n}import{chmodSync as ZA,existsSync as QA,lstatSync as eT,mkdirSync as tT}from"node:fs";import nT from"node:os";import rT from"node:path";var Oi=(...e)=>{let t=rT.join(nT.tmpdir(),"epiq",...e);try{return QA(t)&&eT(t).isSymbolicLink()?l(`Refusing to write through a symlink at ${t}`):(tT(t,{recursive:!0,mode:448}),ZA(t,448),u("Prepared private temp dir",t))}catch(n){return l(`Unable to prepare ${t}: ${n instanceof Error?n.message:String(n)}`)}};var oT=async(e,t)=>{let n=await U({cwd:e,args:["show","--no-ext-diff",t]});if(a(n))return l(n.message);let r=Oi("commit-diffs");if(a(r))return l(r.message);let o=$l.join(r.value,`${t}.diff`);return Rm(o)||(ct.writeToFile(o,n.value.stdout),await Em(o,292)),Gv(o)},sT=12,iT=800,Vv=async(e,t,n)=>{let r=await U({cwd:e,args:["show",`${t}:${n}`]});return a(r)?"":r.value.stdout},aT=async(e,t)=>{let n=await U({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(a(n))return l(n.message);let r=n.value.stdout.split(`
55
- `).map(o=>o.trim()).filter(Boolean);return r.length===0?l("No changed files found for this commit"):u("Listed changed files",r)},lT=async(e,t,n)=>{let r=await aT(e,t);if(a(r))return l(r.message);let o=r.value;if(o.length>sT)return l(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=Oi("commit-diffs",t);if(a(s))return l(s.message);let i=s.value,c=await Promise.all(o.map(async(g,h)=>{let[y,v]=await Promise.all([Vv(e,`${t}~1`,g),Vv(e,t,g)]),R=$l.basename(g),S=$l.join(i,String(h),"before",R),N=$l.join(i,String(h),"after",R);return Rm(S)||(ct.writeToFile(S,y),await Em(S,292)),Rm(N)||(ct.writeToFile(N,v),await Em(N,292)),{beforePath:S,afterPath:N}})),[d,...p]=c;if(!d)return l("No changed files found for this commit");let m=await Sm(n,d.beforePath,d.afterPath,"new");if(a(m)||p.length===0)return m;await new Promise(g=>setTimeout(g,iT));let f=await Promise.all(p.map(({beforePath:g,afterPath:h})=>Sm(n,g,h,"reuse")));for(let g of f)a(g)&&logger.error(`Failed to open an additional diff tab for ${t}: ${g.message}`);return m},Di=async e=>{if(!Yo(e.sha))return l("Invalid commit sha");let t=await Ii(e);if(a(t))return l(t.message);let n=t.value,r=_l()[0];if(r&&xm(r)){let o=await lT(n,e.sha,r);if(!a(o))return o;logger.error(`Side-by-side diff failed for ${e.sha}, falling back to unified diff: ${o.message}`)}return oT(n,e.sha)};var zv=e=>{if(e<1024)return`${e} B`;let t=["KB","MB","GB","TB"],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${n>=10?Math.round(n):n.toFixed(1)} ${t[r]}`};var Im=["branches=default","branches=all","since=board","since=all","since=YYYY-MM-DD","label=<name>","confirm"],Cm=e=>{let[t="",...n]=e.trim().split(/\s+/).filter(Boolean);if(!t)return l("a remote URL to read commits from");if(!yr(t))return l("https://, ssh://, git://, file:/// or user@host:path");let r={url:t},o=new Set;for(let s of n){let i=s.indexOf("="),c=i===-1?s:s.slice(0,i),d=i===-1?"":s.slice(i+1);if(o.has(c))return l(`one ${c}=, not two`);if(o.add(c),s==="confirm")r.confirm=!0;else if(c==="branches"&&(d==="default"||d==="all"))r.branches=d;else if(c==="since"&&Jr(d))r.since=d;else if(c==="label"&&(d===""||Zr(d)))r.label=d;else return l(`${Im.join(", ")}; not "${s}"`)}return u("Parsed",r)},Kv=()=>{let e=pt();if(a(e))return[];let t=Ct(e.value);return a(t)?[]:[...t.value.live,...t.value.overLimit]},cT=e=>{let t=e.latest?`latest "${ye(e.latest.subject).slice(0,60)}" by ${ye(e.latest.author).slice(0,40)}`:"no commits",n=e.ticketCommits===0?"none linked, wrong repo?":`${e.ticketCommits} linked`;return[`${e.repo.label} from ${e.host}`,e.defaultBranch?ye(e.defaultBranch).slice(0,60):"no default branch",t,`${e.commits} commits, ${n}`,zv(e.bytes),e.overLimit?"over the limit: not downloaded until another repo is disconnected":e.contributors>1?`all ${e.contributors} contributors download it on next sync`:"everyone downloads it on next sync"].join(" \xB7 ")},os=null,dT=e=>`${e.trim()} confirm`,qv=e=>os&&os.line===e.trim()?os.summary:null,Yv=async()=>{let e=ne().commandMeta.inputString,t=Cm(e);if(a(t))return l(`Expected ${t.message}`);let{userId:n}=q();if(!n)return l("Set a username first with :config username");let r=pt();if(a(r))return r;let o=await ki({repoRoot:r.value,actorId:n,url:t.value.url,branches:t.value.branches,since:t.value.since,label:t.value.label,mode:t.value.confirm?"confirm":"auto"});if(a(o))return l(o.message);if(o.value.kind==="preview"){let s=dT(e);return os={line:s,summary:cT(o.value.preview)},u(os.summary,{followUp:`config repoConnect ${s}`})}return t.value.confirm&&(os=null),u(o.value.kind==="connected"?`${o.message} \u2014 it syncs with the board; :sync fetches it`:o.message,null)},Xv=()=>{let{userId:e}=q();if(!e)return l("Set a username first with :config username");let t=pt();if(a(t))return t;let n=Li({repoRoot:t.value,actorId:e,repo:ne().commandMeta.inputString});return a(n)?l(n.message):u(`${n.message} \u2014 it syncs with the board`,null)};var ft=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as uT}from"node:crypto";var mT="0123456789ABCDEFGHJKMNPQRSTVWXYZ",pT=e=>{let t=uT("sha256").update(e).digest(),n=0n;for(let o=0;o<16;o++)n=n<<8n|BigInt(t[o]);let r="";for(let o=0;o<26;o++){let s=BigInt((25-o)*5);r+=mT[Number(n>>s&31n)]}return r},Jv=new Map,Pe=(e,t)=>{let n=`${e}:virtual:${t}`,r=Jv.get(n);if(r!==void 0)return r;let o=pT(n);return Jv.set(n,o),o};import Zv from"chalk";var Ee=e=>Zv.dim(e),Oe=e=>Zv.hex(b.primary)(e),_e=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let i=o.trim();if(i.length<s)return"";let m=[...t.filter(Boolean).filter(f=>f.startsWith(i))].sort((f,g)=>za(f)-za(g)).slice(0,r).map(f=>Ka(f)).join(" ");return m?`${Ee(e)}${m}${Ee(n)}`:""};var _n={None:"none",Invalid:"invalid",Valid:"valid"};var fT=["BOARD","TICKET","SWIMLANE"],Qv=()=>{let e=x().selectedNode;if(!e?.context)return K({message:Ee("Missing target context")});if(fT.includes(e.context))return ie();if(e.parentNodeId){let t=x().nodes[e.parentNodeId];if(t?.id===Pe(t?.parentNodeId??"","comments"))return ie()}return K({message:Ee("Command not available in this context")})},he="<ENTER> to confirm",gT=()=>{let{userId:e}=q(),t=ve();return!e||a(t)?[]:Nn(t.value.emailLinks,e)},ie=(e="",t=[],n=!0)=>({message:n?Ee(e):e,validity:_n.Valid,completionWordList:t}),K=({message:e,completionWordList:t=[]})=>({validity:_n.Invalid,message:e,completionWordList:t}),is=e=>e.length===0,eb=(e,t)=>{let n=It(x().breadCrumb,"BOARD");if(a(n))return K({message:Oe("Command is not applicable in this context")});let r=jo(n.value.id);return a(r)?K({message:Oe(`Unable to ${t}: board id is not a valid ULID`)}):Sh({date:e,horizonDate:r.value})?null:K({message:Oe(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},jl=e=>` ${tb.hex("#000").bgHex(Ze(e))(` ${e} `)} `,wm=({modifier:e})=>{let t="confirm";return e===t?ie(he):K({message:is(e)?Ee("if you are certain, enter ")+Ka(t):"",completionWordList:[t]})},hT=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?K({message:Ee(n)}):ie():K({message:is(r)?t:"",completionWordList:[...e]}),ss=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>is(n)&&is(r)?K({message:e,completionWordList:[]}):ie(t??he),yT=({modifier:e,inputString:t})=>{let n=gu();return!is(e)||!is(t)?ie(he):K({message:n.length?Ee("number from the list, or a path"):Ee("path to an epiq project"),completionWordList:n})},vT=({modifier:e,inputString:t})=>{let n=Ue(C.CONFIG);if(!n.includes(e))return K({message:_e({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case se.EDITOR:{let r=[...Ch];return t.trim()?r.includes(t.trim())?ie(he):K({message:_e({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):K({message:_e({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case se.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?ie(he):K({message:_e({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case se.USERNAME:{let r=q().gitName,o=r?[r]:[],s=t.trim(),i=o.filter(p=>p.startsWith(s)),d=i.length===1&&i[0]===s?"":_e({prefix:"name: ",wordList:o,inputString:s,minLengthForHints:0});return s?d?ie(`${d} ${Ee(he)}`,o,!1):ie(he,o):K({message:d||Oe("Enter a user name. Saved in ")+tb.bgBlack("~/.epiq-global/config.json"),completionWordList:o})}case se.EMAILS:{let r=q().gitEmail,o=Vo(),s=o.length>0||!r?o:[r],i=[...s,"none"],c=t.trim(),d=(y,v)=>K({message:_e({prefix:y,wordList:i,noOfHints:3,inputString:v,minLengthForHints:0}),completionWordList:i});if(!c)return ie(`${he} to see your addresses, or name one`,i);let p=c.split(/[,\s]+/).filter(Boolean),m=p[p.length-1]??"",f=y=>y==="none"||s.includes(y.toLowerCase()),g=y=>i.some(v=>v.startsWith(y.toLowerCase())),h=p.filter(y=>!f(y)&&!g(y));return h.length>0?K({message:Oe(`no address here matches ${h.join(", ")} \u2014 pick one from the list, or its number`),completionWordList:i}):f(m)?ie(he):d("",m)}case se.EMAILS_UNCLAIM:{let r=gT(),o=t.trim();return r.length===0?K({message:Oe("you have not claimed any addresses"),completionWordList:[]}):o&&r.includes(o.toLowerCase())?ie(he):K({message:_e({prefix:"give an address back ",wordList:r,noOfHints:3,inputString:o,minLengthForHints:0}),completionWordList:r})}case se.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?ie(he):K({message:_e({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case se.AUTOSYNC:{let r=["on","off"],o=q().autoSync;if(!r.includes(t.trim())){let s=yh(o);return K({message:_e({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return ie(he)}case se.ATTACHMENT_MAX_KB:{let r=q().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<ai||o>li){let s=_e({prefix:" examples: ",wordList:pu,minLengthForHints:0,inputString:t});return K({message:Oe(`provide a size cap in KB (${ai}-${li}). current: ${r??Ln} KB.`)+s,completionWordList:pu})}return ie(he)}case se.REPO_CLONE_MAX_MB:{let r=t.trim();if(!/^\d+$/.test(r)||!vu(Number(r))){let o=_e({prefix:" examples: ",wordList:fu,minLengthForHints:0,inputString:t});return K({message:Oe(`provide a connected repo's clone cap in MB (${zo}-${Ko}). current: ${qo()} MB.`)+o,completionWordList:fu})}return ie(he)}case se.REPO_CONNECT:{let r=Cm(t);if(a(r))return K({message:Oe(r.message),completionWordList:[]});let o=r.value.confirm?qv(t):null;return r.value.confirm&&!o?K({message:Oe("preview it first: run the line without confirm"),completionWordList:[]}):ie(`${o??Ee(Im.join(" "))} ${he}`,[],!1)}case se.REPO_DISCONNECT:{let r=Kv(),o=$u(r),s=t.trim();return o.length===0?K({message:Oe("no other repos are connected"),completionWordList:[]}):s&&!a(Rl(r,s))?ie(he):K({message:_e({prefix:"stop reading ",wordList:o,noOfHints:3,inputString:s,minLengthForHints:0}),completionWordList:o})}case se.SYNC_DEBOUNCE_MS:{let r=q().autoSyncIntervalMs,o=ko(t);if(!t.trim()||o===null){let s=_e({prefix:" examples: ",wordList:mu,minLengthForHints:0,inputString:t});return K({message:Oe(`provide a duration between ${3e3}ms and ${864e5}ms. current duration: ${r}ms.`)+s,completionWordList:mu})}return ie(he)}default:return K({message:Oe("Unknown config option"),completionWordList:n})}},bT=({modifier:e,inputString:t})=>{let n=Ue(C.EDIT);if(!n.length)return K({message:Oe("Command not available in this context")});if(!n.includes(e)){let r=_e({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return K({message:r||Oe("Unknown edit option"),completionWordList:n})}switch(e){case Ht.COMMENT:return t.trim()?ie(he):K({message:Ee("write a comment...")});case Ht.TITLE:return ie(he);case Ht.DESCRIPTION:{let{preferredEditor:r}=q();return r?ie(Ee("<ENTER> to edit in ")+r):K({message:"No editor selected"})}default:return K({message:Oe("Unknown edit option"),completionWordList:n})}},xT=({modifier:e})=>{let t=Ue(C.YANK);return t.length?t.includes(e)?ie(he+Ee(" and copy to clipboard")):K({message:_e({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):K({message:Oe("Nothing selected to copy from")})},ST={[C.EXPORT]:()=>ie(he+Ee(", and create export markdown file")),[C.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return ie(he);let n={message:Ee("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=Qr(r);if(!r||!o)return K(n);let s=eb(o,"peek");return s||ie(he)},[C.REPLAY]:e=>{let{dateInput:t,durationInput:n}=il(e.modifier,e.inputString),r={message:Ee("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=Qr(t);if(!t||!o)return K(r);let s=eb(o,"replay");return s||(n&&sl(n)===null?K({message:Oe("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):ie("<ENTER> to replay board history",n?Ih:[]))},[C.EXIT]:()=>ie(he+Ee(" and exit the application")),[C.INIT]:()=>ie(he),[C.OPEN]:yT,[C.PALETTE]:()=>ie(he),[C.FILTER]:e=>{if(e.modifier==="clear")return ie(he);let t=s=>Ue(C.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return K({message:_e({wordList:Ue(C.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Ue(C.FILTER)});let n=Object.values(x().tags).map(s=>s.name),r=Object.values(x().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?K({message:_e({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):ie():K({message:_e({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[C.NONE]:e=>{let t=Ue(C.NONE);return K({message:_e({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[C.NEW]:e=>hT({list:Ue(C.NEW),hint:_e({wordList:Ue(C.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[C.HELP]:()=>ie(he),[C.EDIT]:bT,[C.COMMENT]:e=>{let t=ss({hint:Ee(`write a comment (max ${4e3} char)...`),onOk:Ee(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===_n.Invalid?t:e.inputString.length>4e3?ie(Oe("max input exceeded")):t},[C.CONFIG]:vT,[C.YANK]:xT,[C.DELETE]:e=>{let t=Qv();return t.validity==="invalid"?t:wm(e)},[C.CLOSE_ISSUE]:e=>wm(e),[C.RE_OPEN_ISSUE]:e=>wm(e),[C.MOVE]:e=>{let t=Qv();return t.validity==="invalid"?t:ss({hint:_e({prefix:"hey hacker! These commands are blocked for you... ",wordList:Ue(C.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[C.TAG]:e=>{let n=w.getExistingTags().slice(0,10).map(jl).join("");return ss({hint:n.length?Ee("create tag or reuse:")+n+Ee(""):Ee("create tag ...")})(e)},[C.UNTAG]:e=>{let t=rl();if(a(t))return K({message:Oe("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(jl).slice(0,10);return n.length?ss({hint:Ee(" ... ")+n.join("")})(e):K({message:Oe("Issue has no tags"),completionWordList:[]})},[C.ASSIGN]:e=>{let t=w.getExistingAssignees().map(jl).slice(0,10);return ss({hint:Ee("assignees... ")+t.join("")})(e)},[C.UNASSIGN]:e=>{let t=ol();if(a(t))return K({message:Oe("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(jl).slice(0,10);return n.length?ss({hint:Ee("remove assignee... ")+n.join("")})(e):K({message:Oe("Issue has no assignees"),completionWordList:[]})},[C.SYNC]:()=>ie(he)},nb=Object.fromEntries(Object.entries(ST).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Ul=["add","fix","bug","log","run","api","cli","ui","ux","test","mock","stub","sync","hash","sign","fork","push","pull","lock","warn","leak","hang","node","seed","lint","edit","save","load","read","send","drop","swap","wrap","port","host","role","user","auth","flag","diff","perf","docs","todo","task","team","epic","spec","remove","update","change","improve","enhance","refactor","rewrite","redesign","implement","build","create","delete","rename","migrate","upgrade","downgrade","revert","rollback","restore","replace","deprecate","cleanup","simplify","optimize","stabilize","harden","document","clarify","investigate","debug","reproduce","triage","mitigate","remediate","resolve","escalate","verify","validate","benchmark","profile","audit","monitor","instrument","configure","provision","deploy","release","publish","integrate","automate","support","enable","disable","prevent","handle","ensure","prioritize","estimate","schedule","track","install","uninstall","enforce","expose","extract","inject","override","extend","customize","localize","translate","redirect","forward","dispatch","broadcast","subscribe","unsubscribe","register","allocate","reserve","persist","retrieve","archive","expire","refresh","reload","reset","recover","replay","retry","scaffold","bootstrap","finalize","terminate","suspend","resume","cancel","abort","notify","alert","trigger","debounce","frontend","backend","fullstack","infrastructure","architecture","integration","application","environment","framework","platform","service","component","module","gateway","pipeline","container","orchestrator","middleware","endpoint","interface","database","datastore","cache","queue","scheduler","worker","daemon","runtime","library","package","plugin","extension","webhook","microservice","monolith","repository","namespace","cluster","sandbox","tenant","dashboard","console","portal","client","server","browser","mobile","desktop","kernel","driver","protocol","schema","migration","fixture","template","snippet","config","manifest","bundle","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","workaround","failure","outage","crash","freeze","corruption","inconsistency","severity","criticality","diagnostics","analysis","blocker","flaky","timeout","mismatch","misconfiguration","boundary","overflow","underflow","panic","stacktrace","breakage","breaking","oversight","ambiguity","discrepancy","anomaly","authorize","authenticate","confidentiality","availability","accessibility","reliability","compliance","governance","encrypt","decrypt","integrity","traceability","accountability","protection","privileges","permissions","sanitize","escape","vulnerability","exposure","secrets","credentials","certificate","session","cookie","identity","tokenization","rotation","scanning","hardening","threat","exploit","payload","injection","phishing","breach","dependency","orchestrate","synchronize","compatibility","incompatibility","interoperability","observability","telemetry","discovery","registration","coordination","distribution","isolation","virtualization","networking","routing","proxy","firewall","balancer","failover","topology","replica","shard","region","capacity","quota","metrics","logging","tracing","alerting","monitoring","heartbeat","liveness","rollover","serialize","deserialize","initialize","instantiate","propagate","aggregate","consolidate","normalize","standardize","transform","reconcile","correlate","index","partition","enrich","filter","stream","batch","parse","encode","decode","compress","decompress","deduplicate","paginate","query","ingest","export","import","backup","snapshot","mapping","record","dataset","metadata","checksum","rollup","lookup","cursor","truncate","concurrency","parallelism","contention","deadlock","throttle","backpressure","fragmentation","saturation","exhaustion","replicate","redundancy","obsolescence","starvation","overload","latency","throughput","scalability","bottleneck","memoize","prefetch","warmup","autoscale","horizontal","vertical","elasticity","recursion","allocation","leakage","garbage","collection","pooling","buffering","caching","eviction","staleness","modularize","encapsulate","abstraction","extensibility","configurability","maintainability","recoverability","readability","testability","debuggability","reusability","simplicity","consistency","linting","formatting","typecheck","coverage","tooling","scaffolding","boilerplate","technical","cleanliness","naming","comments","docstring","testing","unittest","mocking","stubbing","assertion","smoke","sanity","fuzzing","flakiness","harness","scenario","baseline","performance","functionality","requirement","recommendation","improvement","enhancement","description","acceptance","criteria","deliverable","milestone","iteration","backlog","roadmap","followup","hotfix","patch","changelog","rollout","feature","spike","proposal","specification","priority","sprint","story","subtask","assignee","reviewer","reproduction","context","expected","actual","impact","workflow","version","tracking","discussion","decision","tradeoff","feedback","approval","planning","breakdown","scoping"];var RT=3,ET=new Set(["the","and","for","are","but","not","you","all","any","can","was","one","our","out","use","this","that","with","have","from","will","your","they","them","then","than","when","what","were","been","into","should","would","could","about"]),IT=e=>{let t=[];for(let n of Object.values(e.nodes)){n.title&&t.push(n.title);let r=n.props;typeof r.description=="string"&&t.push(r.description),typeof r.value=="string"&&t.push(r.value)}for(let n of Object.values(e.tags))t.push(n.name);for(let n of Object.values(e.contributors))t.push(n.name);for(let n of Object.values(e.comments))t.push(n.md);return t},CT=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=RT&&!ET.has(t)&&!/^\d+$/.test(t)),wT=e=>{let t=new Map;for(let s of IT(e))for(let i of CT(s))t.set(i,(t.get(i)??0)+1);let n=[...t.entries()].sort((s,i)=>i[1]-s[1]||s[0].localeCompare(i[0])).map(([s])=>s),r=new Set(n),o=Ul.filter(s=>!r.has(s));return[...n,...o]},rb=Ul,ob=-1,sb=()=>{let e=ve();if(a(e))return Ul;let t=e.value,n=t.eventLog.length;return n!==ob&&(rb=wT(t),ob=n),rb};var ib=e=>Object.values(C).includes(e),ab=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:c,completionWordList:d}=nb[n].validate(n,r,s),p=n!==C.PEEK&&n!==C.REPLAY,m=o==="command"||o==="modifier"?Ue(n):p?sb():[],{mode:f}=x(),g=f===E.COMMAND_LINE?i??"":"",h=[...d,...m];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?ih(e,h,d):{hint:"",hints:[],remainder:"",overlap:0}}};var lb=e=>{let t=e.trimStart(),n=AT(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=TT(e),c=ib(r)?r:null,d=c!==null,p=r!=="",m=c?Ue(c)??[]:[],f=c&&m.includes(o)?o:"",g="word";n.length===0||n.length===1&&!s?g="command":(n.length===1&&s||n.length===2&&!s)&&(g="modifier");let h=s?"":i,y=NT(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:p,command:c,isCommandKeyword:d,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:h,inputString:y}},NT=(e,t,n)=>{let r=e;return t&&r.startsWith(t)&&(r=r.slice(t.length)),r=r.replace(/^\s+/,""),n&&r.startsWith(n)&&(r=r.slice(n.length),r=r.replace(/^\s+/,"")),r},AT=e=>e.trim()?e.trim().split(/\s+/):[],TT=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as MT}from"react";var as=e=>e===Nm||e===":",Nm=" ",Fi=40,gt={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:_n.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Am=new Set,cb=()=>{for(let e of Am)e()},Tm=e=>(Am.add(e),()=>Am.delete(e)),Qt=e=>{let n=e(gt),r=lb(n.value),o=n.cursorPosition===n.value.length;gt={...n,commandMeta:ab(r,o)},cb()},_i=({message:e,status:t})=>{let n=structuredClone(gt);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,gt=n,cb(),u(e,null)},Mm=e=>{Qt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Lm=e=>{Qt(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&as(n[o-1]);)o--;for(;o>0&&!as(n[o-1]);)o--}else{for(;o<n.length&&!as(n[o]);)o++;for(;o<n.length&&as(n[o]);)o++}return{...t,cursorPosition:o}})},db=()=>{Qt(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},ub=()=>{Qt(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&as(t[r-1]);)r--;for(;r>0&&!as(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},Hl=e=>{Qt(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),s=e(r,t.commandMeta.autoCompletion),i=s+o,c=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:c,commandIsPending:!1}})},mb=()=>{Qt(e=>({...e,commandIsPending:!0}))},te=e=>{Qt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},pb=({addToHistory:e=!0,line:t})=>{Qt(n=>{let r=t??n.value;return{...n,commandHistory:e&&r.trim()?[r,...n.commandHistory].slice(0,Fi):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}})},fb=e=>{Qt(t=>({...t,commandHistory:e.slice(0,Fi),commandHistoryIndex:-1}))},gb=()=>{Qt(e=>e.commandHistoryIndex===-1?e:{...e,commandHistoryIndex:-1})},hb=()=>{Qt(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},yb=()=>{Qt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ne=()=>gt,vb=()=>MT(Tm,ne,ne),Wl=()=>{let[e,...t]=gt.value.split(Nm);return t.join(Nm).trim()};var I={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavPreviousItemJump:"navPreviousItemJump",NavNextItemJump:"navNextItemJump",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MovePreviousItemJump:"movePreviousItemJump",MoveNextItemJump:"moveNextItemJump",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",EditTitle:"editTitle",EditDescription:"editDescription",Yank:"yank",OpenInEditor:"openInEditor",MarkDiffLine:"markDiffLine",CommentOnDiffLine:"commentOnDiffLine",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"},LT=e=>e.shift===!0,kT={[I.NavPreviousItem]:I.NavPreviousItemJump,[I.NavNextItem]:I.NavNextItemJump,[I.MovePreviousItem]:I.MovePreviousItemJump,[I.MoveNextItem]:I.MoveNextItemJump};function PT(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function OT(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function DT(e,t,n){let r=x().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function bb(e,t){let n=ne();if(e.sequence==="?"&&t!==E.PALETTE)return I.InitCommandPalette;if(e.sequence===":"&&t!==E.COMMAND_LINE)return I.InitCommandLine;if(t===E.MOVE)switch(e.name){case"m":case"return":return I.ConfirmMove}if(t===E.COMMAND_LINE)return Jg(e,n.value);if(t===E.PALETTE)return Zg(e,n.value);let r=PT(e)||OT(e);if(r)return BT(r,t,LT(e));if(e.ctrl&&e.name==="c")return I.Exit;switch(e.name){case"r":return I.EditTitle;case"e":return I.EditDescription;case"n":return I.AddItem;case"m":return I.InitMove;case"d":return I.Delete;case"y":return I.Yank;case"o":return I.OpenInEditor;case"s":return I.MarkDiffLine;case"c":return I.CommentOnDiffLine;case"return":return I.Confirm;case"space":return I.Confirm;case"v":return q().viewMode==="wide"?I.SetViewDense:I.SetViewWide;case"q":case"escape":return I.Exit;default:return null}}function BT(e,t,n=!1){let r=t===E.MOVE?{prevItem:I.MovePreviousItem,nextItem:I.MoveNextItem,prevContainer:I.MoveToPreviousContainer,nextContainer:I.MoveToNextContainer}:{prevItem:I.NavPreviousItem,nextItem:I.NavNextItem,prevContainer:I.NavToPreviousContainer,nextContainer:I.NavToNextContainer},o=DT(x().contextNode.childRenderAxis,e,r);return!o||!n?o:kT[o]??o}import{ulid as $T}from"ulid";var $i=24n,FT=$i*4n,fn=(1n<<FT)-1n,_T=/^[0-9a-f]+$/;function xb(e){return!e||!_T.test(e)?l(`Invalid hex rank: ${e}`):u("Converted rank to bigint",BigInt("0x"+e))}function Gt(e,t=$i){if(e<0n)return l("Negative rank not allowed");let n=e.toString(16);return u("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function wt(e,t){if(!e&&!t)return Gt(fn/2n,$i);let n=e?xb(e):u("Resolved lower bound",0n);if(a(n))return n;let r=t?xb(t):u("Resolved upper bound",fn);if(a(r))return r;let o=n.value,s=r.value;if(s<=o)return l("Neighbouring ranks leave no space between them");let i=(o+s)/2n;return i===o||i===s?l("No rank space available between neighbors"):Gt(i,$i)}function Sb(e){if(e<=0)return u("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=fn*BigInt(r+1)/(t+1n),s=Gt(o,$i);if(a(s))return s;n.push(s.value)}return u("Resolved evenly spaced ranks",n)}var km=(e,t)=>{let n=Ie(e),r=Sb(n.length);if(a(r))return r;let o={};for(let s=0;s<n.length;s++){let i=n[s],c=r.value[s];if(!i||!c)return l("Unable to assign rebalance rank");o[i.id]=c}return u("Created rebalance event",{id:$T(),action:"rebalance.children",payload:{parent:e,ranks:o},...B(t)})};var lo=e=>e.trim().toLocaleLowerCase(),Pm=(e,t)=>lo(e).includes(lo(t));var jT=e=>{let{tags:t}=x();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},UT=e=>{let{contributors:t}=x();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},Rb=null,Eb=new Map,HT=()=>{let e=x().eventLog??[];if(e===Rb)return Eb;let t=new Map;for(let n of e){if(!n.userId)continue;let r=n.payload;for(let o of[r.id,r.issue]){if(typeof o!="string")continue;let s=t.get(o)??new Set;s.add(n.userId),t.set(o,s)}}return Rb=e,Eb=t,t},WT=e=>{let{contributors:t}=x(),n=HT().get(e.id);return n?[...n].map(r=>t[r]?.name).filter(r=>!!r):[]},Ib=(e,t)=>{let n=lo(t.value);if(!n)return!0;switch(t.target){case"title":return Pm(e.title??"",n);case"description":return Pm(e.props.description??"",n);case"tag":return jT(e).map(lo).some(o=>o.includes(n));case"assignee":return UT(e).map(lo).some(o=>o.includes(n));case"actor":return WT(e).map(lo).some(o=>o.includes(n));case"ref":return yl(e.id,t.value);default:return!0}};var Om=(e,t)=>e.rank<t.rank?-1:e.rank>t.rank?1:0,GT=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,Cb=(e,t)=>Object.values(e).filter(n=>GT(n,t)).sort(Om),wb=(e,t)=>{let n={};for(let r of Object.values(e)){if($(r)&&t.length>0&&!t.every(s=>Ib(r,s))||!r.parentNodeId||r.isDeleted)continue;let o=n[r.parentNodeId];o?o.push(r):n[r.parentNodeId]=[r]}for(let r of Object.keys(n))n[r].sort(Om);return n},Nb=(e,t)=>{let n={};for(let r of Object.values(e)){if(!r.parentNodeId||r.isDeleted||!t.has(r.parentNodeId))continue;let o=n[r.parentNodeId];o?o.push(r):n[r.parentNodeId]=[r]}for(let r of Object.keys(n))n[r].sort(Om);return n};var Ab=e=>Gl(Ie(e),{at:"end"}),Gl=(e,t={at:"end"})=>{let n=o=>a(o)?u("Rank space exhausted",{rank:"",needsRebalance:!0}):u("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(wt(void 0,void 0));let r=()=>n(wt(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(wt(void 0,o.rank)):l("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(wt(o.rank,void 0)):l("Unable to resolve last sibling")}case"before":{let o=Tb(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let i=o>0?e[o-1]:void 0;return n(wt(i?.rank,s.rank))}case"after":{let o=Tb(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let i=o<e.length-1?e[o+1]:void 0;return n(wt(s.rank,i?.rank))}}},Ie=e=>{let t=x();if(!Lb()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return Cb(t.nodes,e)},Tb=(e,t)=>e.findIndex(n=>n.id===t),Mb=(e,t,n={at:"end"})=>Gl(Ie(t).filter(r=>r.id!==e),n),$n=(e,t,n,r,o)=>{let s=Mb(t,e,n);if(a(s))return s;if(!s.value.needsRebalance)return u("Resolved rank",s.value.rank);let i=km(e,r);if(a(i))return i;let c=F([i.value],o);if(a(c))return c;let d=Mb(t,e,n);return a(d)?d:d.value.needsRebalance?l("Rank rebalance failed to create space"):u("Resolved rank after rebalance",d.value.rank)},ir=(e,t,n)=>{let r=Ab(e);if(a(r))return r;if(!r.value.needsRebalance)return u("Resolved rank",r.value.rank);let o=km(e,t);if(a(o))return o;let s=F([o.value],n);if(a(s))return s;let i=Ab(e);return a(i)?i:i.value.needsRebalance?l("Rank rebalance failed to create space"):u("Resolved rank after rebalance",i.value.rank)};var ji=5,V={exit(){process.exit(0)},enterChildNode(){let e=x(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=pe(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||V.navigate({contextNode:o,selectedIndex:pe(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=x();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=pe(n.id),o=r.findIndex(({id:i})=>i===e.id),s=r.length===0?-1:o>=0?o:0;V.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>kb(1),navigateToPreviousItem:()=>kb(-1),jumpToNextItem:()=>Pb(ji),jumpToPreviousItem:()=>Pb(-ji),navigateToNextContainer:()=>Ob(1),navigateToPreviousContainer:()=>Ob(-1),navigate:({contextNode:e,selectedIndex:t})=>{T({contextNodeId:e.id,selectedIndex:t})}},kb=e=>{let{selectedIndex:t,contextNode:n}=x(),r=pe(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;V.navigate({selectedIndex:s,contextNode:n})},Pb=e=>{let{selectedIndex:t,contextNode:n}=x(),r=pe(n.id).length;if(r===0)return;let o=Math.max(0,t),s=Math.min(Math.max(o+e,0),r-1);V.navigate({selectedIndex:s,contextNode:n})},Ob=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=x();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=pe(o.id),i=s.findIndex(g=>g.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let d=pe(c.id),p=Math.max(0,d.length-1),m=Math.min(Math.max(0,r),p),f=d.length?m:-1;V.navigate({contextNode:c,selectedIndex:f})};var Bb=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Fb=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=x();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},VT=e=>{let t=x().nodes[e];return!!t&&!t.isDeleted&&mt(t)&&t.childRenderAxis==="vertical"},Vl=(e,t)=>{let{nodes:n}=x(),r=n[e];if(!r||r.isDeleted)return!1;let o=Ie(r.id);return V.navigate({contextNode:r,selectedIndex:Bb(t,o.length)}),!0},_b=e=>{let{nodes:t}=x(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Vl(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let i=Ie(o.id).findIndex(c=>c.id===n.id);return i>=0?(V.navigate({contextNode:o,selectedIndex:i}),!0):_b(o.id)},Db=e=>{let{nodes:t}=x(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),_b(n))return!0;n=t[n]?.parentNodeId}return!1},zT=e=>{if(!e)return!1;let t=x().nodes[e];return!!t&&!t.isDeleted},$b=e=>{let{nodes:t,rootNodeId:n}=x();if(VT(e.contextNodeId)&&Vl(e.contextNodeId,e.selectedIndex))return u("Restored navigation inside text container",null);if(zT(e.selectedNodeId)&&e.selectedNodeId&&Db(e.selectedNodeId))return u("Restored navigation to selected node or ancestor",null);if(Vl(e.contextNodeId,e.selectedIndex))return u("Restored navigation to previous container",null);if(e.parentNodeId&&Vl(e.parentNodeId,e.selectedIndex))return u("Restored navigation to previous parent",null);if(Db(e.contextNodeId))return u("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return l("Unable to restore navigation");let o=Ie(r.id);return V.navigate({contextNode:r,selectedIndex:Bb(e.selectedIndex,o.length)}),u("Restored navigation to root",null)};import{monotonicFactory as KT,ulid as jn}from"ulid";var Ui=KT();function qT(){let e=ve();if(a(e))return l("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return l("No workspace found in event log");let[r]=pe(n.id),[o]=r?pe(r.id):[];if(o){let s=t.renderedChildrenIndex?.[o.id]??[];return u("Resolved boot nav target",{contextNode:o,selectedIndex:s.length>0?0:-1})}else return r?u("Resolved boot nav target",{contextNode:r,selectedIndex:0}):u("Resolved boot nav target",{contextNode:n,selectedIndex:0})}function YT(){let e=qT();return a(e)?e:V.navigate(e.value)}function jb({userId:e,userName:t}){let n=Ui(),r=Ui(),o=Ui(),s=Ui(),i=Ui(),c=wt(void 0,void 0);if(a(c))return c;let d=wt(void 0,void 0);if(a(d))return d;let p=wt(d.value,void 0);if(a(p))return p;let m=wt(void 0,void 0);if(a(m))return m;let f=wt(m.value,void 0);if(a(f))return f;let g=wt(f.value,void 0);if(a(g))return g;let h=wt(void 0,void 0);return a(h)?h:u("Created default events",[{id:jn(),userId:e,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:jn(),userId:e,action:"create.contributor",payload:{id:e,name:t}},{id:jn(),userId:e,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:d.value}},{id:jn(),userId:e,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:m.value}},{id:jn(),userId:e,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:jn(),userId:e,action:"add.swimlane",payload:{id:i,name:"Done",parent:r,rank:g.value}},{id:jn(),userId:e,action:"add.board",payload:{id:nl,name:"Closed",parent:n,rank:p.value}},{id:jn(),userId:e,action:"add.swimlane",payload:{id:Se,name:"Closed",parent:nl,rank:h.value}},{id:jn(),userId:e,action:"lock.node",payload:{id:nl}},{id:jn(),userId:e,action:"lock.node",payload:{id:Se}}])}var XT=()=>{let e=ve();if(a(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},JT=e=>{if(e.length===0)return;let t=e.filter(r=>r.reason==="corrupt-line"||r.reason==="invalid-payload"),n=e.filter(r=>r.reason==="unsupported-schema-version"||r.reason==="unknown-action");if(n.length>0){let r=[...new Set(n.map(o=>o.detail))].join(", ");G.info(`This build cannot read ${n.length} event(s) in the log (${r}). They are skipped, so anything they changed may be out of date until you upgrade.`)}if(t.length>0){let r=[...new Set(t.map(o=>o.detail))].join(", ");G.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}};function gn(e,t=[]){if(XT())return u("Skipped boot while checked out at a historical point",null);if(!e.length){let s=we.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=gi(s);return a(i)?i:(T({hasProjectDefinition:!1,mode:E.DEFAULT}),u("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return l("Initialized Epiq project has no workspace init event");let n=mn(e),{fatal:r,skipped:o}=kn(n);return r.length>0?l(`Materializing failed:
56
- ${r.map(s=>s.message).join(`
57
- `)}`):(Pn(o),YT(),T({hasProjectDefinition:!0}),JT(t),u("State booted successfully",null))}import{WebSocket as ZT}from"ws";var zl=new Set,Ub=e=>{zl.add(e),e.on("close",()=>{zl.delete(e)}),e.on("error",()=>{zl.delete(e)})},Un=e=>{let t=JSON.stringify(e);for(let n of zl)n.readyState===ZT.OPEN&&n.send(t)};var Kl=e=>{st()&&(T({syncStatus:e}),Un({type:"sync-status",payload:e}))},ls=(e="Syncing...")=>{Kl({status:"syncing",msg:e})},co=(e="Synced")=>{Kl({status:"synced",msg:e})},Dm=e=>{Kl({status:"failed",msg:e})},ql=e=>{Kl({status:"offline",msg:e})},Xe=e=>(Dm(e),l(e));var hn=(e,t)=>(logger.error(`[boot:${e}] ${t}`),l(`[boot:${e}] ${t}`)),cs=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}},xe=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t);import rx from"node:fs";import ar from"node:fs";import lr from"node:path";import Yl from"node:fs";import Hb from"node:path";var ht=".epiq/project.json",Wb=e=>Hb.join(e,ht),QT=e=>{if(!Yl.existsSync(Wb(e)))return u("State branch carries no identity yet",null);let t=St(e);return a(t)?l(`On the state branch: ${t.message}`):u("Read the state branch identity",t.value)},Bm=(e,t)=>{try{let n=Wb(e);return Yl.mkdirSync(Hb.dirname(n),{recursive:!0}),Yl.writeFileSync(n,JSON.stringify(t,null,2)+`
58
- `,"utf8"),u("Wrote the state branch identity",void 0)}catch(n){return l(n instanceof Error?`Failed to write the state branch identity: ${n.message}`:"Failed to write the state branch identity")}},eM=({checkout:e,branch:t,stateBranch:n})=>[`This checkout's ${ht} names project ${e.projectId}`,`(created ${e.createdAt}), but the state branch ${n}`,`belongs to project ${t.projectId} (created ${t.createdAt}).`,"","The branch holds the board, so its id is the one that counts. Point the","checkout at it and commit the change:","",` git show ${n}:${ht} > ${ht}`,"","A second id is minted when init runs in a checkout that has no","project file while the state branch already exists; nothing on the","board is lost by it, but every checkout has to agree on one."].join(`
59
- `);var Gb=({repoRoot:e,stateBranchRoot:t,stateBranch:n})=>{if(!Yl.existsSync(Oo(e)))return u("No project file to compare","no-checkout-file");let r=St(e);if(a(r))return l(r.message);let o=QT(t);if(a(o))return l(o.message);if(o.value===null){let s=Bm(t,r.value);return a(s)?l(s.message):u("Stamped the state branch with this project","stamped")}return o.value.projectId!==r.value.projectId?l(eM({checkout:r.value,branch:o.value,stateBranch:n})):u("The checkout and the state branch agree","matched")};import Hn from"node:fs";import Hi from"node:path";var ds=e=>e.split(`
60
- `).filter(t=>t.trim().length>0),Vb=e=>{let t=Hi.join(e,Rt,Xn);try{if(!Hn.existsSync(t))return u("No events directory",[]);let n=Hn.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>ds(Hn.readFileSync(Hi.join(t,r),"utf8")).length>0);return u("Looked for stranded event logs",n)}catch(n){return l(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},zb=e=>Hi.join(e,Rt,Xn),Kb=e=>{let t=zb(e),n=new Map;try{if(!Hn.existsSync(t))return n;for(let r of Hn.readdirSync(t))if(r.endsWith(".jsonl")&&!so(r))try{n.set(r,ds(Hn.readFileSync(Hi.join(t,r),"utf8")))}catch(o){if(!di(o))throw o}}catch{return n}return n},tM=e=>{try{let t=JSON.parse(e);return typeof t=="object"&&t!==null}catch{return!1}},qb=(e,t)=>{if(t.size===0)return[];let n=zb(e),r=[];for(let[o,s]of t){if(s.length===0)continue;let i=Hi.join(n,o);try{let c=Hn.existsSync(i)?Hn.readFileSync(i,"utf8"):null,d=new Set(c===null?[]:ds(c)),p=s.filter(f=>!d.has(f)).filter(tM);if(p.length===0)continue;Hn.mkdirSync(n,{recursive:!0});let m=c!==null&&c.length>0&&!c.endsWith(`
61
- `);Hn.appendFileSync(i,`${m?`
62
- `:""}${p.join(`
63
- `)}
64
- `,"utf8"),r.push(`${o} (${p.length})`)}catch{continue}}return r},nM=(e,t)=>{let n=new Set(ds(t));return ds(e).filter(r=>!n.has(r))},rM=(e,t,n)=>[`Refusing to commit ${e}: it is missing ${t.length} of the ${n} event(s) already committed.`,"","The event log is append-only, so a line can never legitimately go","missing. The working copy on disk is damaged; committing it would","publish that damage to everyone who pulls, and the log carries no way","to undo it.","","Nothing has been committed. The committed history is intact \u2014 recover","the file from it before syncing again:",` git show HEAD:${e}`,"","First dropped event:",` ${t[0]?.slice(0,200)??"<none>"}`].join(`
65
- `),Yb=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let r=await ke({args:["show",`HEAD:${t}`],cwd:e});if(r.exitCode!==0)return u("No committed log to compare against",void 0);let o=nM(r.stdout,n);return o.length>0?l(rM(t,o,ds(r.stdout).length)):u("Event log only grew",void 0)};var oM="[epiq:init-repo]",Jb=async e=>{let t=await ke({args:["rev-parse","--verify","--quiet","HEAD"],cwd:e});if(t.exitCode===0)return u("Initial commit already exists",!1);if(!(t.exitCode===1&&t.stdout.trim()===""&&t.stderr.trim()===""))return l(["Could not determine whether the repository has any commits, so nothing was written.",`git rev-parse exited ${t.exitCode}`,t.stderr.trim()].filter(Boolean).join(`
66
- `));G.info("Creating initial commit");let r=await U({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(a(r))return l(r.message);let o=await U({args:["commit-tree",r.value.stdout.trim(),"-m",oM],cwd:e});if(a(o))return l(o.message);let s=await U({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return a(s)?l(s.message):u("Created initial commit",!0)},Xb=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",sM=async e=>{let t=await ja(e);if(a(t))return l(t.message);let n=await tg(e);return a(n)?l(n.message):u("Built sync commit message",`[sync|branch:${Xb(t.value)}:sha:${Xb(n.value)}]`)},Fm=async({repoRoot:e,stateBranchName:t})=>{G.info(`Creating ${t}`);let n=await U({args:["commit-tree",mg,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return l(`Failed to create state branch commit
67
- ${n.message}`);let r=n.value.stdout.trim(),o=await U({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return a(o)?l(`Failed to create ${t}
68
- ${o.message}`):u("Created state branch",!0)},Wi=async({repoRoot:e,stateBranchName:t})=>{let n=await $a({repoRoot:e,branch:t});if(a(n))return l(`Ensure local state branch failed
69
- `+n.message);if(n.value)return u("Local state branch already exists",!1);let r=await Yn({repoRoot:e});if(a(r))return l(`Ensure local state branch failed
70
- `+r.message);let o=r.value,s=o?await Fs({repoRoot:e,branch:t}):u("No remote, no remote state branch",!1);if(a(s))return l(`Ensure local state branch failed
71
- `+s.message);let i=s.value;if(o&&i){let c=await Ne.fetch({cwd:e,remote:jt,branch:t});if(a(c))return l(`Failed to fetch ${t} from remote
72
- ${c.message}`)}if(i){let c=await U({args:["branch","--track",t,`${jt}/${t}`],cwd:e});return a(c)?l(`Failed to create local ${t} from remote
73
- ${c.message}`):u("Created local state branch from remote",!0)}return Fm({repoRoot:e,stateBranchName:t})},iM=async({repoRoot:e,branch:t})=>{let n=await U({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return l(n.message);let r=n.value.stdout.split(`
74
- `),o=null;for(let s of r){if(s.startsWith("worktree ")){o=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&o)return u("Found worktree for branch",o)}return u("No worktree found for branch",null)},aM=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=js(lr.dirname(t));if(a(r))return l(`Failed to create state branch worktree
75
- `+r.message);if(ar.existsSync(t)&&!ar.existsSync(lr.join(t,".git"))){let s=Vb(t);if(a(s))return l(s.message);if(s.value.length>0)return l([`Refusing to delete ${t}.`,"","It is not a usable worktree \u2014 it has no .git \u2014 but it still holds",`${s.value.length} event log(s) with content:`,...s.value.map(i=>` ${i}`),"","Deleting it would destroy them, and with no .git here there is no","committed copy to recover from. Move the directory aside and","salvage the logs before letting epiq recreate the worktree."].join(`
76
- `));G.info("Removing broken state branch worktree path"),hg(t)}G.info("Creating state branch worktree");let o=await Ne.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?l(`Failed to create state branch worktree
77
- ${o.message}`):u("Created state branch worktree",!0)},Mr=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await cM({repoRoot:e,stateBranchRoot:t,stateBranchName:n});if(a(r))return r;let o=Gb({repoRoot:e,stateBranchRoot:t,stateBranch:n});return a(o)?l(o.message):(o.value==="stamped"&&G.info("Stamped the state branch with this project\u2019s identity"),r)},lM=(e,t)=>{let n=Do(Xr());return lr.dirname(e)===n&&lr.dirname(t)===n},cM=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await iM({repoRoot:e,branch:n});if(a(r))return l(r.message);let o=Do(t),s=r.value?Do(r.value):null;if(s&&s===o&&ar.existsSync(s))return u("State branch already checked out in expected worktree",!1);if(s&&s!==o&&lM(s,o))return l([`The state branch ${n} is checked out under project ${lr.basename(s)}, but this checkout names project ${lr.basename(o)}.`,"","Two ids for one branch means a checkout minted a second identity for","a board that already existed. Nothing on the board is lost by it, but",`every checkout has to agree on one: compare ${ht} here`,`with \`git show ${n}:${ht}\`, and keep the branch's.`].join(`
78
- `));if(s&&s!==o){let d=await ag(s);if(a(d))return l(d.message);if(d.value||Kh(s))return l([`Refusing to move the state branch worktree away from ${s}.`,"","It holds changes that are not committed yet, which for this","branch means events no sync has published. Removing it would","destroy them outright \u2014 there is no stash or reflog to recover","a deleted worktree from.","",`This worktree is expected at ${o}, so something else is`,"using a different EPIQ_GLOBAL_DIR against the same repository.","Sync from that location first, or point both at the same one."].join(`
79
- `));G.info("Moving state branch worktree to expected location");let p=await Ne.worktreeRemove({cwd:e,worktreeRoot:s});if(a(p))return l(`Failed to remove existing state branch worktree
80
- ${p.message}`)}if(s&&!ar.existsSync(s)){G.info("Pruning stale state branch worktree");let d=await Ne.worktreePrune({cwd:e});if(a(d))return l(`Failed to prune stale worktrees
81
- ${d.message}`)}let i=await eg({repoRoot:e,worktreeRoot:t});if(a(i))return l(i.message);let c=ar.existsSync(t);if(i.value&&c)return u("State branch worktree already exists",!1);if(i.value&&!c){G.info("Pruning missing registered state branch worktree");let d=await Ne.worktreePrune({cwd:e});if(a(d))return l(`Failed to prune stale worktrees
82
- ${d.message}`)}return aM({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},dM=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await ja(e);if(a(n))return l(n.message);if(n.value===t)return u("State branch already checked out",!1);(await ke({cwd:e,args:["rebase","--abort"]})).exitCode===0&&G.info("Aborted stale state branch rebase");let o=await Ne.checkout({cwd:e,branch:t});return a(o)?l(`Failed to checkout ${t}
83
- ${o.message}`):u("Checked out state branch",!0)},uM=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Dd(t);if(a(n))return l(n.message);if(n.value)return u("State branch upstream already configured",!1);let r=await Yn({repoRoot:t});if(a(r))return l(r.message);if(!r.value)return u("No remote available for state branch upstream",!1);let o=$e(e);if(a(o))return o;let s=o.value,i=await Fs({repoRoot:t,branch:s});if(a(i))return l(i.message);if(!i.value)return u("Remote state branch missing; upstream will be configured on first push",!1);G.info(`Configuring ${s} upstream`);let c=await Ne.fetch({cwd:t,remote:jt,branch:s});if(a(c))return l(`Failed to fetch ${s}
84
- ${c.message}`);let d=await Ne.setUpstream({cwd:t,branch:s,upstream:`${jt}/${s}`});return a(d)?l(`Failed to set state branch upstream
85
- ${d.message}`):u("Configured state branch upstream",!0)},Xl=async({stateBranchRoot:e,eventFileName:t})=>{let n=pg(t),r=lr.join(e,n);if(!ar.existsSync(r))return u("No event file to stage",null);let o=await Yb({stateBranchRoot:e,relativePath:n,workingContent:ar.readFileSync(r,"utf8")});if(a(o))return l(o.message);let s=await Ne.stage({cwd:e,pathspec:[n]});return a(s)?l(`Failed to stage state branch event file
86
- ${s.message}`):u("Staged state branch event file",n)},Zb=async({stateBranchRoot:e})=>{let t=fg(),n=lr.join(e,t);if(!ar.existsSync(n))return u("No media directory to stage",null);let r=await Ne.stage({cwd:e,pathspec:[t],ignoreRemoval:!0});return a(r)?l(`Failed to stage state branch media files
87
- ${r.message}`):u("Staged state branch media files",t)},Qb=async({stateBranchRoot:e})=>{let t=[Fd(),_d(),ht].filter(r=>ar.existsSync(lr.join(e,r)));if(t.length===0)return u("No event log config to stage",[]);let n=await Ne.stage({cwd:e,pathspec:t});return a(n)?l(`Failed to stage event log config
88
- ${n.message}`):u("Staged event log config",t)},ex=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await sM(e);return a(r)?l(`Create state branch sync commit failed
89
- `+r.message):Bo({cwd:t,message:r.value,pathspec:n})},Gi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Dd(t);if(a(n))return l(n.message);let r=$e(e);if(a(r))return r;let o=r.value,s=n.value?await Ne.push({cwd:t}):await Ne.push({cwd:t,remote:jt,branch:o,setUpstream:!0});if(a(s))return l(`Failed during state branch push
90
- ${s.message}`);let i=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return u(i?"Pushed state branch":"Remote already up to date",i)},tx=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=$e(e);if(a(o))return o;let s=o.value,i=[Us(),await Wi({repoRoot:e,stateBranchName:s}),await Mr({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await dM({stateBranchRoot:t,stateBranchName:s}),await vg(t),n?await uM({stateBranchRoot:t,repoRoot:e}):u("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(a(c))return l(c.message);r=r||!!c.value}return u(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};var mM=async({claim:e,cwd:t,ensureUpstream:n})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:t,ensureUpstream:n});let r=xe("getRepoRootDir",await dn(t));if(a(r))return l(r.message);let o=r.value;logger.debug("[sync] repo root",o);let s=xe("getStateBranchRoot",me({repoRoot:o}));if(a(s))return l(s.message);let i=s.value;if(logger.debug("[sync] state branch root",i),e!=="stale"&&rx.existsSync(i)){let m=await og(i,{preserve:[wl]});if(a(m))return l(m.message);m.value.length>0&&logger.info("[sync] cleared git lock files left by a dead process",{removed:m.value,stateBranchRoot:i});let f=$e(o);if(a(f))return l(f.message);let g=await sg(i,f.value);if(a(g))return l(g.message);g.value&&logger.info("[sync] cleared a ref lock left by a dead process",{branch:f.value,stateBranchRoot:i});let h=xe("abortRebaseIfPresent(stateBranchRoot)",await Bd(i));if(a(h))return l(h.message)}logger.debug("[sync] bootstrapping state branch storage",{repoRoot:o,stateBranchRoot:i,ensureUpstream:n});let c=xe("bootstrapStateBranchStorage",await tx({repoRoot:o,stateBranchRoot:i,ensureUpstream:n}));if(a(c))return l(c.message);logger.debug("[sync] bootstrap result",{bootstrapped:c.value,stateBranchRoot:i}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:i});let d=xe("getInProgressGitOperation(stateBranchRoot)",await Od(i));if(a(d))return l(d.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:d.value}),d.value!==null)return logger.info("[sync] state branch git operation in progress",{claim:e}),l(`Cannot sync while there is a ${d.value} in the state branch at ${i}`);logger.debug("[sync] ensuring state branch layout",{repoRoot:o,stateBranchRoot:i});let p=xe("ensureStateBranchLayout",yg(o,i));return a(p)?l(p.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:o,stateBranchRoot:i,bootstrapped:c.value}),u("Sync preconditions satisfied",{repoRoot:o,stateBranchRoot:i,bootstrapped:c.value}))},pM=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.debug("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.debug("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let r=[];for(let p of ay(kt(t),n)){let m=xe("stageStateBranchOwnEventFile",await Xl({stateBranchRoot:t,eventFileName:p}));if(a(m))return l(m.message);r.push(m.value)}let o=xe("stageStateBranchMediaFiles",await Zb({stateBranchRoot:t}));if(a(o))return l(o.message);let s=xe("stageStateBranchEventConfig",await Qb({stateBranchRoot:t}));if(a(s))return l(s.message);let i=[...r,o.value,...s.value].filter(p=>p!==null);if(i.length===0)return u("Nothing to stage",{createdCommit:!1});let c=xe("hasStagedChanges(after stage)",await lg(t,i));if(a(c))return l(c.message);if(logger.debug("[sync] state branch change check after stage result",{changed:c.value}),!c.value)return logger.info("[sync] no own event file changes to commit"),u("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let d=xe("createStateBranchSyncCommit",await ex({repoRoot:e,stateBranchRoot:t,pathspec:i}));return a(d)?l(d.message):(logger.debug("[sync] created sync commit",d.value),u("Committed own event file",{createdCommit:!0,commitSha:d.value}))},_m=(e,t="offline")=>{let n=e.createdCommit?`Committed locally, ${t}`:t==="offline"?"Offline":"No remote";return ql(n),u(n,{...e,pulled:!1,pushed:!1,offline:!0})},nx=async({cwd:e=process.cwd(),ownEventFileName:t},n)=>{if(logger.debug("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.error("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),l("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),l("Own event file must end with .jsonl");ls();let r=xe("ensureSyncReady",await mM({claim:n,cwd:e,ensureUpstream:!0}));if(a(r))return Xe(r.message);let{repoRoot:o,stateBranchRoot:s,bootstrapped:i}=r.value,c=xe("isDetachedHead(stateBranchRoot)",await cg(s));if(a(c))return Xe(c.message);if(logger.debug("[sync] detached state branch check result",{detached:c.value}),c.value)return Xe("Cannot run :sync while the state branch is in detached HEAD state");let d=!1,p,m=!1,f=!1,g=xe("getStateBranch",$e(o));if(a(g))return Xe(g.message);let h=g.value;logger.debug("[sync] resolved state branch",{stateBranch:h,stateBranchRoot:s});let y=xe("flushPendingLogs",ul(s,t));a(y)&&logger.error(`[sync] ${y.message}`);let v=xe("commitOwnEventFileToStateBranch",await pM({repoRoot:o,stateBranchRoot:s,ownEventFileName:t}));if(a(v))return Xe(v.message);d=v.value.createdCommit,p=v.value.commitSha;let R=xe("hasRemote",await Yn({repoRoot:s}));if(a(R))return Xe(R.message);if(!R.value)return _m({repoRoot:o,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i},"no remote");let S=xe("pullBranchRebaseIfPresent",await $s({cwd:s,branch:h}));if(a(S))return _s(S.message)?_m({repoRoot:o,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i}):Xe(S.message);m=S.value;let N=xe("isAheadOfUpstream",await ig(s));if(a(N))return Xe(N.message);if(d||i||N.value){logger.info("[sync] pushing state branch",{createdCommit:d,bootstrapped:i,stateBranchRoot:s});let k=xe("pushStateBranch",await Gi({stateBranchRoot:s,repoRoot:o}));if(a(k)&&ng(k.message)){let L=xe("pullBranchRebaseIfPresent(retry)",await $s({cwd:s,branch:h}));if(a(L))return Xe(L.message);m=m||L.value,k=xe("pushStateBranch(retry)",await Gi({stateBranchRoot:s,repoRoot:o}))}if(a(k))return _s(k.message)?_m({repoRoot:o,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i}):Xe(k.message);f=k.value}if(d){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:s});let k=xe("git rev-parse HEAD",await U({args:["rev-parse","HEAD"],cwd:s}));if(a(k))return Xe(k.message);p=k.value.stdout.trim(),logger.debug("[sync] final sync commit sha",p)}return co(f?"Synced and pushed":m||d?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),u("Synced event logs with state branch",{repoRoot:o,stateBranchRoot:s,createdCommit:d,commitSha:p,pulled:m,pushed:f,bootstrapped:i,offline:!1})},Jl=async(e,t)=>{let n=Kb(e);try{return await t()}finally{let r=qb(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},Zl=async e=>{let t=e.cwd??process.cwd(),n=await dn(t);if(a(n))return Xe(n.message);let r=me({repoRoot:n.value});if(a(r))return Xe(r.message);let o=r.value;if(!rx.existsSync(o))return nx(e,"clean");let s=await Ri({worktreeRoot:o,operation:"sync",fn:i=>Jl(o,()=>nx(e,i))});return a(s)?Xe(s.message):s.value===null?u("Another process is syncing this board",{repoRoot:n.value,stateBranchRoot:o,createdCommit:!1,pulled:!1,pushed:!1,bootstrapped:!1,offline:!1,skipped:!0}):s.value};var us=null,Ql=async({reposMinIntervalMs:e=0}={})=>(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!us,currentStatus:x().syncStatus?.status,currentMessage:x().syncStatus?.msg}),us?(logger.debug("[sync] syncAndReloadState joining existing promise"),us):(logger.debug("[sync] syncAndReloadState creating promise"),us=fM(e).finally(()=>{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:x().syncStatus?.status,statusMessageBeforeClear:x().syncStatus?.msg}),us=null}),us)),fM=async e=>{let t;try{t=await gM(e),logger.debug("[sync] syncAndReloadState promise resolved",{success:!a(t),message:t.message,statusAfterResolve:x().syncStatus?.status,statusMessageAfterResolve:x().syncStatus?.msg})}catch(r){let o=r instanceof Error?r.message:String(r);logger.error("[sync] syncAndReloadState promise threw",{message:o,error:r}),t=l(o)}let n=ve();return a(t)&&!a(n)&&n.value.syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),T({syncStatus:{msg:t.message,status:"failed"}})),t},gM=async e=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:x().mode,syncStatus:x().syncStatus});let t=ox();if(t)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:x().mode,message:t.message,syncStatus:x().syncStatus}),t;logger.debug("[sync] syncAndReloadState:start");let n=xe("resolveActorId",be());if(a(n)||!n.value)return logger.info("[sync] unable to resolve actor id",{message:a(n)?n.message:"Missing actor id"}),l("Unable to resolve event log path");T({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:x().syncStatus});let r=Ir(n.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:r}),logger.debug("[sync] syncEpiqWithRemote:start");let o=xe("syncEpiqWithRemote",await Zl({ownEventFileName:r}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!a(o),message:(a(o),o.message)}),a(o))return logger.error("[sync] syncAndReloadState:sync failed",o.message),T({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:x().syncStatus}),Xe(`Unable to sync state. ${o.message}`);let{stateBranchRoot:s,offline:i,repoRoot:c}=o.value,d=Vi(s);return a(d)?d:(T({hasProjectDefinition:!0,syncStatus:i?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:x().syncStatus}),hM(c,e),u("Synced",!0))},hM=async(e,t)=>{let n=await ns({repoRoot:e,minIntervalMs:t}),r=a(n)?null:Pl(n.value),o=x().syncStatus;r&&o?.status==="synced"&&T({syncStatus:{msg:`Synced \xB7 ${r}`,status:"synced"}})},Vi=e=>{logger.debug("[sync] loading merged events after sync",{stateBranchRoot:e});let t=Ke(e),n=xe("loadMergedEvents",pn(e));if(logger.debug("[sync] loadMergedEvents:result",{success:!a(n),message:(a(n),n.message),count:a(n)?void 0:n.value.events.length}),a(n))return T({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:x().syncStatus}),l(`Unable to load events. ${n.message}`);logger.debug("[sync] loaded merged events after sync",{count:n.value.events.length});let r=ox();if(r)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:x().mode,message:r.message,syncStatus:x().syncStatus}),r;let o=Fb(),s=x().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:o,selectedNodeId:x().selectedNode?.id,contextNodeId:x().contextNode?.id,selectedNodeIsVirtual:x().selectedNode?.isVirtual,contextNodeIsVirtual:x().contextNode?.isVirtual}),!x().selectedNode?.isVirtual&&!x().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:n.value.events.length});let c=ve(),d=!a(c)&&c.value.timeMode==="live",p=xe("bootStateFromEventLog",gn(n.value.events,n.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!a(p),message:(a(p),p.message)}),a(p))return T({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:x().syncStatus}),l(`Unable to boot synced state. ${p.message}`);d&&Jo(e,t)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:x().selectedNode?.isVirtual,contextNodeIsVirtual:x().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),T({filters:s}),logger.debug("[sync] restoreNavigationAnchor:start");let i=xe("restoreNavigationAnchor",$b(o));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!a(i),message:a(i)?i.message:"Navigation restored",selectedNodeId:x().selectedNode?.id,contextNodeId:x().contextNode?.id}),a(i)?(T({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:x().syncStatus}),i):u("Reloaded state from event log",null)},ox=()=>x().mode===E.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:x().mode,syncStatus:x().syncStatus}),T({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),l("Will not re-materialize if not in default mode, to not lose edit data"));var sx=0,$m,jm=!1,zi=!1,Um=()=>{if(jm)return!0;let e=ve();return a(e)?!1:e.value.syncStatus.status==="syncing"},yM=()=>{let e=Po(q().autoSyncIntervalMs),t=Date.now()-sx;return Math.max(0,e-t)},ix=()=>{$m||($m=setTimeout(async()=>{if($m=void 0,!!st()){if(Um()){zi=!0;return}zi=!1,await vM()}},yM()))},vM=async()=>{if(x().readOnly||x().timeMode==="peek"||x().timeMode==="replay")return l("Cannot auto-sync while peeking");if(!st())return l("Cannot auto-sync before state is initialized");if(Um())return zi=!0,l("Sync already in progress");jm=!0,sx=Date.now(),T({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Ql({reposMinIntervalMs:6e4})}finally{jm=!1,zi&&ix()}},ec=()=>{st()&&(zi=!0,!Um()&&ix())};var tc=e=>{let{context:t}=x().contextNode;if(!t)return Y.None;switch(e){case C.EXIT:return Y.Exit;case C.EXPORT:return Y.Export;case C.INIT:return Y.Init;case C.OPEN:return Y.OpenProject;case C.DELETE:return Y.Delete;case C.EDIT:return Y.Edit;case C.COMMENT:return Y.Comment;case C.HELP:return Y.ViewHelp;case C.RE_OPEN_ISSUE:return Y.ReopenIssue;case C.CLOSE_ISSUE:return Y.CloseIssue;case C.TAG:return Y.TagTicket;case C.UNTAG:return Y.UntagTicket;case C.ASSIGN:return Y.AssignUserToTicket;case C.UNASSIGN:return Y.UnassignUserFromTicket;case C.NEW:return Y.NewItem;case C.FILTER:return Y.Filter;case C.MOVE:return Y.Move;case C.PEEK:return Y.Peek;case C.REPLAY:return Y.Replay;case C.CONFIG:return Y.Config;case C.YANK:return Y.Yank;case C.SYNC:return Y.Sync;default:return Y.None}},Y={Exit:"exit",Init:"init",OpenProject:"open-project",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Replay:"replay",Yank:"yank",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export"};import qx from"node:fs";import TL from"node:path";import ML from"react";import{Box as NL}from"ink";import pc from"react";import BM from"chalk";import{Box as Gm,Text as FM}from"ink";import Wn from"react";import{Text as ax}from"ink";import lx,{useEffect as cx,useState as bM}from"react";var dx={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "],identity:["\u276F "]},Dt=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=le(),r=dx[n]??dx.default,[o,s]=bM(0);if(cx(()=>{s(0)},[r]),cx(()=>{if(!e)return;let c=setInterval(()=>{s(d=>(d+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return lx.createElement(ax,null,t);let i=r[o]??r[0]??t;return lx.createElement(ax,{color:b.accent,dimColor:o===1},i)};import{Box as Hm,Text as xM}from"ink";import nc from"react";var SM=(e,t,n,r)=>{let o=d=>Math.max(1,e[d]??1),s=n,i=n+1,c=o(n);for(;i<t&&c+o(i)<=r;)c+=o(i),i++;for(;s>0&&c+o(s-1)<=r;)s--,c+=o(s);return{start:s,end:i}},yt=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,itemHeights:o,scrollByOne:s=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),c=Math.max(1,Math.ceil(r)),d=Math.max(0,Math.min(n,e.length-1)),p=Math.max(1,Math.floor(i/c)),m=Math.max(0,e.length-p),{start:f,end:g}=o?SM(o,e.length,d,i):s?{start:Math.min(m,Math.max(0,d-p+1)),end:Math.min(m,Math.max(0,d-p+1))+p}:{start:Math.min(m,Math.floor(d/p)*p),end:Math.min(m,Math.floor(d/p)*p)+p},h=Math.max(1,g-f),y=e.slice(f,g),v=e.length>h,R=i,S=v?Math.max(1,Math.floor(h/e.length*R)):R,N=Math.max(0,R-S),k=Math.max(1,e.length-h),L=v?Math.floor(f/k*N):0;return nc.createElement(Hm,{flexDirection:"row",height:i,width:"100%"},nc.createElement(Hm,{flexDirection:"column",flexGrow:1,height:i},y),nc.createElement(Hm,{flexDirection:"column",width:1,height:R},Array.from({length:R}).map((A,O)=>nc.createElement(xM,{key:O,color:v&&O>=L&&O<L+S?b.accent:b.secondary},v?"\u2502":" "))))};import{Box as fs,Text as gs}from"ink";import Bt from"react";var ux,Wm,RM=()=>{let{eventLog:e=[]}=x();if(Wm&&ux===e)return Wm;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return ux=e,Wm=t,t},rc=e=>RM().has(e);import{Text as EM}from"ink";import IM from"react";var Lr=({id:e,isSelected:t,maxWidth:n})=>{let r=w.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:Zn(o,n);return IM.createElement(EM,{underline:t,color:Ze(o)},"@"+s,rc(e)?"":"\u2197")};import{Text as CM}from"ink";import wM from"react";var ms=({id:e,isSelected:t,maxWidth:n})=>{let r=w.getTag(e);if(!r)return;let o=n===void 0?r.name:Zn(r.name,n);return wM.createElement(CM,{underline:t,backgroundColor:Ze(r.name),color:b.secondary}," "+o+" ")};import{useEffect as NM,useState as AM}from"react";var TM=80,mx=1400,oc=new Set,Ki=null,MM=e=>(oc.add(e),Ki||(Ki=setInterval(()=>{for(let t of oc)t()},TM)),()=>{oc.delete(e),oc.size===0&&Ki&&(clearInterval(Ki),Ki=null)}),LM=()=>{let e=Date.now()%mx/mx;return e<.5?e*2:(1-e)*2},ps=e=>{let[,t]=AM(0);return NM(()=>{if(e)return MM(()=>t(n=>n+1))},[e]),Va(LM())};var kM=(e,t,n)=>{if(e.length<=t)return[e,null];let r=e.lastIndexOf(" ",t),o=r>0?r:t;return[e.slice(0,o),Zn(e.slice(o).trim(),n)]},px=3,PM=2,OM=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let i=e.length-o-1,c=i>0?String(i).length+1:0;if(r+s.width+c>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},fx=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=ps(r),s=e-4,i=s-7-1,[c,d]=kM(ye(t.title),i,s),p=d?null:Zn(ye(t.props.description),s)||null,m=Tn(t),f=Mn(t).map(S=>({...S,name:S.name})),g=Math.max(1,s-px),h=w.getCommentsByIssue(t.id),y=h.length?String(h.length).length+2+1:0,{shown:v,hidden:R}=OM([...m.map(S=>({id:S.id,isTag:!0,width:Math.min(S.name.length,g)+px})),...f.map(S=>({id:S.id,isTag:!1,width:Math.min(S.name.length,g)+PM+(rc(S.id)?0:1)}))],s-y);return Bt.createElement(fs,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?b.accent:b.secondary,justifyContent:"space-between"},Bt.createElement(fs,{paddingLeft:1,paddingRight:1,flexDirection:"column"},Bt.createElement(fs,{justifyContent:"space-between"},Bt.createElement(gs,{color:b.primary},c),Bt.createElement(gs,{color:b.secondary2,dimColor:!0},z(t.id))),d&&Bt.createElement(gs,{color:b.primary},d),p&&Bt.createElement(gs,{color:b.secondary2,dimColor:!0},p)),Bt.createElement(fs,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},Bt.createElement(fs,{flexDirection:"row"},v.map(S=>Bt.createElement(fs,{paddingRight:1,key:S.id},S.isTag?Bt.createElement(ms,{id:S.id,maxWidth:g}):Bt.createElement(Lr,{id:S.id,maxWidth:g}))),R>0&&Bt.createElement(gs,{color:b.secondary2,dimColor:!0},"+",R)),h.length>0&&Bt.createElement(gs,{color:b.accent},"[",h.length,"]")))};import{Box as uo,Text as qi}from"ink";import Vt from"react";var DM=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,gx=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:i})=>{let c=ps(s),d=(r.props.tags??[]).map(A=>w.getTag(A)).filter(A=>!!A),p=(r.props.assignees??[]).map(A=>w.getContributor(A)).map(A=>A&&{...A,name:A.name}).filter(A=>!!A),m=1,f=d.length*(1+m),g=p.length*(2+m),h=d.map(A=>Vt.createElement(uo,{key:A.id,paddingRight:m},Vt.createElement(qi,{color:Ze(A.name)},"\u25A0"))),y=p.map(A=>Vt.createElement(uo,{key:A.id,paddingRight:m},Vt.createElement(qi,{color:Yd(A.name)},"@"+A.name.at(0)))),v=s?c:o?b.accent:i===E.MOVE?b.secondary:b.primary,R=w.getCommentsByIssue(r.id),S=R.length?String(R.length).length+2+m:0,N=R.length?Vt.createElement(uo,{paddingRight:m},Vt.createElement(qi,{color:b.accent},"[",R.length,"]")):null,k=f+g+S,L=Math.max(1,n-t-k-(k>0?1:0));return Vt.createElement(uo,{justifyContent:"space-between"},Vt.createElement(uo,null,Vt.createElement(uo,{width:t},o?Vt.createElement(Dt,{isSelected:!0}):Vt.createElement(qi,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),Vt.createElement(qi,{wrap:"truncate",color:v},DM(r.title,L))),Vt.createElement(uo,null,h,y,N))};var _M=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:d,replay:p}=le(),m=d[e.id]??[],f=p?new Set(p.flashNodeIds):null,g=f?.has(e.id)??!1,h=ps(g),y=`${e.title} ${BM.hex(b.secondary2).dim("("+m.length+")")}`,v=3,R=o?1:5,S=s&&i===-1,N=n-3-(o?1:0)-(S?2:0),k=Math.max(2,String(m.length).length+1),L=r-v-1,A=Wn.createElement(Gm,{borderStyle:"round",borderColor:b.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},Wn.createElement(Dt,{isSelected:t}),Wn.createElement(FM,{bold:!0,color:g?h:t?b.accent:b.primary},y," ",e.readonly?"\u{1F512}":"")),O=(j,W)=>{let ge=s&&i===W;if(!$(j))return null;let D=f?.has(j.id)??!1;return o?Wn.createElement(gx,{key:j.id,index:W,labelWidth:k,width:N,ticket:j,isSelected:ge,isFlashing:D,mode:c}):Wn.createElement(fx,{key:j.id,width:N,ticket:j,isSelected:ge,isFlashing:D})};return Wn.createElement(Gm,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?b.accent:b.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},A,Wn.createElement(Gm,null,m.length>0&&Wn.createElement(yt,{selectedIndex:i,height:L,itemHeight:R},m.map(O)),S&&Wn.createElement(Dt,{isSelected:!0})))},hx=Wn.memo(_M);import{Box as bs,Text as SL}from"ink";import Ft,{useMemo as xs}from"react";var yx=e=>{let t=new Set((e.log??[]).filter(n=>n.action==="delete.issue.comment").map(n=>n.payload.id));return(e.log??[]).filter(n=>n.action==="add.issue.comment"&&n.payload.issue===e.id&&!t.has(n.payload.id)).length},vx=(e,t,n)=>we.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});var bx=e=>e.action==="add.issue.comment";import{Box as hs,Text as cr}from"ink";import vt,{useEffect as $M,useMemo as jM,useRef as UM}from"react";import{decodeTime as xx}from"ulid";var kr=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let s=Math.floor(t/o);if(s>=1)return`${s}${r} ago`}return"just now"},sc=e=>String(e).padStart(2,"0"),ic=e=>`${e.getFullYear()}-${sc(e.getMonth()+1)}-${sc(e.getDate())} ${sc(e.getHours())}:${sc(e.getMinutes())}`;var HM=e=>Pe(e,"attachments"),WM=e=>w.getAttachmentsByIssue(e.id).sort((t,n)=>xx(t.id)-xx(n.id)),Sx=e=>{for(let t of e)w.deleteNode(t.id)},GM=(e,t,n)=>we.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),VM=(e,t)=>{let n=w.getNode(HM(e.id));if(!n||!mt(n))return[];let r=t.map((o,s)=>GM(o,s,n.id)).map(o=>w.createNode(o)).filter(Re).map(({value:o})=>o).filter(mt);return t.length>0&&x().selectedIndex<0&&V.navigate({contextNode:n,selectedIndex:0}),r},zM=e=>`${Math.max(1,Math.round(e/1024))} KB`;function Rx({ticket:e,width:t,height:n}){let r=jM(()=>WM(e),[e]),o=UM([]);$M(()=>(Sx(o.current),o.current=VM(e,r),()=>{Sx(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=le(),c=Math.max(1,n-4),d=Math.max(12,t-32);return r.length===0?vt.createElement(hs,{flexDirection:"column",width:t,height:n,padding:1},vt.createElement(cr,{color:b.primary},"No attachments yet."),vt.createElement(hs,{paddingTop:1},vt.createElement(cr,{color:b.primary},"Attach images from the browser GUI"),vt.createElement(cr,{color:b.accent}," epiq gui "),vt.createElement(cr,{color:b.primary},"by dropping or pasting them."))):vt.createElement(hs,{flexDirection:"column",width:t,height:n},vt.createElement(hs,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:b.secondary,borderStyle:"single",paddingBottom:1},vt.createElement(cr,{color:b.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),vt.createElement(yt,{height:c,itemHeight:2,selectedIndex:s},r.map((p,m)=>{let f=m===s,g=p.name.length>d?p.name.slice(0,d-1)+"\u2026":p.name;return vt.createElement(hs,{key:p.id,flexDirection:"row",paddingX:1,paddingBottom:1},vt.createElement(cr,{color:b.accent},f?"\u276F ":" "),vt.createElement(hs,{paddingLeft:1},vt.createElement(cr,{color:b.secondary2},`#${m+1} `),vt.createElement(cr,{color:f?b.accent:b.primary},g),vt.createElement(cr,{color:b.secondary2}," "+zM(p.bytes)+" "+kr(je(p.id)))))})))}import{Box as Pr,Text as Or}from"ink";import tt,{useEffect as ZM,useMemo as Tx,useRef as QM}from"react";import{decodeTime as Mx}from"ulid";var KM=(e,t)=>{let n=Math.max(1,Math.floor(t)),r=e.split(/\s+/).filter(Boolean);if(r.length===0)return[""];let o=[],s="";for(let i of r){let c=i;for(;c.length>n;)s&&(o.push(s),s=""),o.push(c.slice(0,n)),c=c.slice(n);s?s.length+1+c.length<=n?s=`${s} ${c}`:(o.push(s),s=c):s=c}return s&&o.push(s),o},Yi=e=>{let t=e.split("`");return t.length%2===0?[{text:e}]:t.map((n,r)=>r%2===1?{text:n,code:!0}:{text:n}).filter(n=>n.text.length>0)},qM=/!\[([^\]]*)\]\([^)]*\)/g,YM=e=>e.replace(qM,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),XM=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),JM=4,ac=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(JM)),Vm=e=>{let t=!1;return e.map(ac).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=Pi(n);if(r)return{kind:"caption",text:pm(r)};let o=YM(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:Yi(s[1]??"")}:{kind:"text",spans:Yi(o)}})},Ix=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],Ex=(e,t)=>{let n=[];for(let r of Vm(e))if(r.kind!=="fence"){if(r.kind==="blank"){n.length>0&&n[n.length-1]?.kind!=="blank"&&n.push(r);continue}if(r.kind==="code"){for(let o of Ix(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of KM(XM(r.spans),t))n.push({kind:r.kind,spans:Yi(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},Cx=(e,t)=>{let n=Pi(e),r=n?Mv(e):null;if(!n||r===null)return Ex(mm(e).split(`
91
- `),t);let o=Lv(e),s=r.split(`
92
- `).map(ac),i=n.side===n.endSide?n.start:void 0,c=i===void 0?0:String(i+s.length-1).length+3;return[...o?[...Ex(o.split(`
93
- `),t),{kind:"blank"}]:[],{kind:"caption",text:pm(n)},...s.flatMap((d,p)=>Ix(d,Math.max(1,t-c)).map((m,f)=>({kind:"code",text:m,number:i===void 0||f>0?void 0:i+p})))]};import{Box as wx,Text as mo}from"ink";import en from"react";var Nx=({spans:e,bold:t,wrap:n})=>en.createElement(mo,{color:b.primary,bold:t,wrap:n},e.map((r,o)=>r.code?en.createElement(mo,{key:o,color:b.yellow},r.text):en.createElement(mo,{key:o},r.text))),zm=({line:e,width:t,gutter:n=0,wrap:r})=>{switch(e.kind){case"blank":return en.createElement(mo,null," ");case"fence":return en.createElement(mo,{color:b.secondary2},"```");case"caption":return en.createElement(mo,{color:b.accent,wrap:r},e.text);case"heading":return en.createElement(Nx,{spans:e.spans,bold:!0,wrap:r});case"text":return en.createElement(Nx,{spans:e.spans,wrap:r});case"code":{let o=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return en.createElement(mo,{backgroundColor:b.secondary,color:b.primary,wrap:r},o,e.text.padEnd(Math.max(0,t-o.length)))}}},Ax=({lines:e,width:t})=>{let n=e.flatMap(o=>o.kind==="code"&&o.number!==void 0?[o.number]:[]),r=n.length>0?String(Math.max(...n)).length+3:0;return en.createElement(wx,{flexDirection:"column"},e.map((o,s)=>en.createElement(wx,{key:s},en.createElement(zm,{line:o,width:t,gutter:r}))))};var eL=4,tL=e=>Pe(e,"comments"),nL=e=>w.getCommentsByIssue(e.id).sort((t,n)=>Mx(t.id)-Mx(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,md:t.md})),Lx=e=>{for(let t of e)w.deleteNode(t.id)},rL=(e,t)=>{let n=w.getNode(tL(e.id));if(!n||!mt(n))return[];let r=t.map((o,s)=>vx(o,s,n.id)).map(w.createNode).filter(Re).map(({value:o})=>o).filter(ni);return t.length>0&&x().selectedIndex<0&&V.navigate({contextNode:n,selectedIndex:0}),r};function kx({ticket:e,width:t,height:n}){let r=Tx(()=>nL(e),[e]),o=QM([]);ZM(()=>(Lx(o.current),o.current=rL(e,r),()=>{Lx(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=le(),c=Math.max(1,n-4),d=Math.max(20,t-8),p=Tx(()=>r.map(f=>{let g=Cx(f.md,d);return g.length>0?g:[{kind:"blank"}]}),[r,d]),m=p.map(f=>f.length+eL);return r.length===0?tt.createElement(Pr,{flexDirection:"column",width:t,height:n,padding:1},tt.createElement(Or,{color:b.primary},"No comments yet."),tt.createElement(Pr,{paddingTop:1},tt.createElement(Or,{color:b.primary},"Use"),tt.createElement(Or,{color:b.accent}," :comment "),tt.createElement(Or,{color:b.primary},"to add the first one."))):tt.createElement(Pr,{flexDirection:"column",width:t,height:n},tt.createElement(Pr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:b.secondary,borderStyle:"single",paddingBottom:1},tt.createElement(Or,{color:b.secondary2},"Comments (",r.length,") ")),tt.createElement(yt,{height:c,itemHeights:m,selectedIndex:s},r.map((f,g)=>{let h=g===s;return tt.createElement(Pr,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:b.secondary,borderStyle:"single"},tt.createElement(Pr,{flexDirection:"row",paddingBottom:1},tt.createElement(Or,{color:b.accent},h?"\u276F ":" "),tt.createElement(Pr,{paddingLeft:1},tt.createElement(Or,{color:b.secondary2},`#${g+1} `),tt.createElement(Lr,{id:f.authorId}),tt.createElement(Or,{color:b.secondary2}," "+kr(je(f.id))))),tt.createElement(Pr,{paddingLeft:3,paddingBottom:1},tt.createElement(Ax,{lines:p[g]??[],width:d})))})))}import{Box as fo,Text as vn}from"ink";import Je,{useEffect as Ux,useRef as uL,useState as mL}from"react";import{Box as yn,Text as dr}from"ink";import He,{useEffect as Xm,useMemo as Bx,useRef as iL,useState as aL}from"react";var lc=(e,t,n)=>{let r=[],o=vl(()=>{for(let s=0;s<t;s++){let i=Gt(BigInt(s+1));if(!Re(i))continue;let c=w.createNode(we.text({id:n(s),name:`Line ${s+1}`,parentNodeId:e,rank:i.value,readonly:!0,isVirtual:!0}));Re(c)&&r.push(c.value)}});return a(o)&&logger.error(`Line nodes: ${o.message}`),r},ys=e=>{w.deleteNodes(e.map(t=>t.id))};import{useSyncExternalStore as oL}from"react";var dc=null,cc=null,Km=new Set,Px=()=>{for(let e of Km)e()},qm=e=>{dc=e,Px()},uc=()=>dc,Ox={mark:null},po=e=>{cc=e,Ox={mark:e},Px()};var Ym=e=>cc&&cc.sha===e?cc.row:null,Dx=()=>oL(e=>(Km.add(e),()=>{Km.delete(e)}),()=>Ox),Dr=()=>{let{contextNode:e}=x();return dc&&dc.sha===e.id?e.id:null};import lL from"string-width";var Jm=(e,t)=>`${e}::patch::${t}`,Fx=e=>ac(e).replace(/[\x00-\x1f\x7f-\x9f]/g,"\uFFFD"),cL=e=>{switch(e){case"added":return b.green;case"removed":return b.red;case"hunk":return b.accent;case"file":return b.primary;default:return b.secondary2}},_x=(e,t)=>{let n=lL(e);return n>=t?e:e+"\xA0".repeat(t-n)},dL=e=>e==="added"?"+":e==="removed"?"-":" ",$x=e=>e.kind==="file"||e.kind==="hunk"||e.kind==="note"||e.newLine===void 0?"":String(e.newLine);function jx({ticket:e,sha:t,repo:n,subject:r,width:o,height:s}){let[i,c]=aL({state:"loading"});Xm(()=>{let L=!0;return c({state:"loading"}),cm({sha:t,repo:n}).then(A=>{L&&c(a(A)?{state:"failed",message:A.message}:{state:"loaded",rows:hm(gm(A.value))})}),()=>{L=!1}},[t,n]);let d=i.state==="loaded"?i.rows:null,p=d!==null&&d.length>4e3,m=iL([]);Xm(()=>(ys(m.current),m.current=d&&!p?lc(t,d.length,L=>Jm(t,L)):[],()=>{ys(m.current),m.current=[]}),[t,d,p]),Xm(()=>(qm(d?{sha:t,rows:d}:null),po(null),()=>{qm(null),po(null)}),[t,d]);let{selectedIndex:f}=le(),{mark:g}=Dx(),h=Bx(()=>d?ym(d,w.getCommentsByIssue(e.id),t):new Set,[d,t,e]),y=g&&g.sha===t?g.row:null,v=L=>y!==null&&L>=Math.min(y,f)&&L<=Math.max(y,f),R=Bx(()=>d?Math.max(5,d.reduce((L,A)=>Math.max(L,$x(A).length),0)+2):5,[d]),S=Math.max(1,s-4),N=Math.max(8,o-R-6);if(i.state!=="loaded")return He.createElement(yn,{flexDirection:"column",width:o,height:s,padding:1},He.createElement(dr,{color:b.primary},i.state==="loading"?"Reading the diff\u2026":`Could not read the diff: ${i.message}`));let k=L=>He.createElement(yn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:b.secondary,borderStyle:"single",paddingBottom:1},He.createElement(dr,{color:b.secondary2,wrap:"truncate-end"},Qn(`${t.slice(0,7)} ${r} \u2014 ${L}`,Math.max(8,o-6))));return i.rows.length===0?He.createElement(yn,{flexDirection:"column",width:o,height:s},k("no changes"),He.createElement(yn,{paddingX:1},He.createElement(dr,{color:b.primary},"This commit changed no files."))):p?He.createElement(yn,{flexDirection:"column",width:o,height:s},k("too large to draw here"),He.createElement(yn,{paddingX:1,flexDirection:"column"},He.createElement(dr,{color:b.primary},`${i.rows.length.toLocaleString()} lines of diff.`),He.createElement(dr,{color:b.secondary2},"Press o to open it in your editor."))):He.createElement(yn,{flexDirection:"column",width:o,height:s},k(y===null?"enter to comment on a line, s to start a range, o editor, q back":"move to the other end, then enter to comment \u2014 s clears the mark"),He.createElement(yt,{scrollByOne:!0,height:S,selectedIndex:f,itemHeight:1},i.rows.map((L,A)=>{let O=A===f,j=cL(L.kind);if(L.kind==="file")return He.createElement(yn,{key:Jm(t,A),paddingX:1},He.createElement(dr,{backgroundColor:b.secondary,color:O?b.accent:j,bold:!0,wrap:"truncate-end"},_x(` ${Qn(Fx(L.text),N)}`,N+R+1)));let W=v(A),ge=`${dL(L.kind)}${Qn(Fx(L.text),N)}`;return He.createElement(yn,{key:Jm(t,A),paddingX:1},He.createElement(yn,{flexShrink:0},He.createElement(dr,{color:O||W?b.accent:b.secondary2,dimColor:!O&&!W,wrap:"truncate-end"},`${O?"\u276F":"\xA0"}${W?"\u258C":"\xA0"}${$x(L).padStart(R-2,"\xA0")}`)),He.createElement(yn,{flexShrink:0},He.createElement(dr,{color:b.yellow,wrap:"truncate-end"},h.has(A)?"\u2502":"\xA0")),He.createElement(dr,{color:O?b.accent:j,backgroundColor:O||W?b.secondary:void 0,wrap:"truncate-end"},O||W?_x(ge,N+1):ge))})))}var pL=e=>Pe(e,"diff"),Hx=e=>{for(let t of e)w.deleteNode(t.id)},fL=(e,t,n)=>we.field({id:e.sha,name:e.subject,parentNodeId:n,rank:String(t).padStart(6,"0"),childRenderAxis:"vertical",isVirtual:!0}),gL=(e,t)=>{let n=w.getNode(pL(e.id));if(!n||!mt(n))return[];let r=t.map((o,s)=>fL(o,s,n.id)).map(o=>w.createNode(o)).filter(Re).map(({value:o})=>o).filter(mt);return t.length>0&&x().selectedIndex<0&&x().contextNode.id===n.id&&V.navigate({contextNode:n,selectedIndex:0}),r},hL=e=>`+${e.insertions} -${e.deletions}`;function Wx({ticket:e,width:t,height:n}){let[r,o]=mL({state:"loading"}),s=z(e.id);Ux(()=>{let v=!0;return o({state:"loading"}),io({ref:s}).then(R=>{if(!v)return;let S=pt();o(a(R)?{state:"failed",message:R.message}:{state:"loaded",commits:R.value,labels:a(S)?new Map:_u(S.value)})}),()=>{v=!1}},[s]);let i=uL([]),c=r.state==="loaded"?r.commits:null,d=r.state==="loaded"?r.labels:null;Ux(()=>(Hx(i.current),i.current=c?gL(e,c):[],()=>{Hx(i.current),i.current=[]}),[e,c]);let{selectedIndex:p,contextNode:m}=le(),f=c?.find(v=>v.sha===m.id)??null,h=Math.max(1,n-4),y=Math.max(12,t-34);return r.state!=="loaded"?Je.createElement(fo,{flexDirection:"column",width:t,height:n,padding:1},Je.createElement(vn,{color:b.primary},r.state==="loading"?"Reading commits\u2026":`Could not read commits: ${r.message}`)):f?Je.createElement(jx,{ticket:e,sha:f.sha,repo:f.repo,subject:f.subject,width:t,height:n}):r.commits.length===0?Je.createElement(fo,{flexDirection:"column",width:t,height:n,padding:1},Je.createElement(vn,{color:b.primary},"No commits reference this ticket."),Je.createElement(fo,{paddingTop:1},Je.createElement(vn,{color:b.primary},"Commits are matched by the"),Je.createElement(vn,{color:b.accent},` ${s} `),Je.createElement(vn,{color:b.primary},"prefix on their subject line."))):Je.createElement(fo,{flexDirection:"column",width:t,height:n},Je.createElement(fo,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:b.secondary,borderStyle:"single",paddingBottom:1},Je.createElement(vn,{color:b.secondary2},`Diff (${r.commits.length}) \u2014 enter to read, o to open in your editor `)),Je.createElement(yt,{height:h,itemHeight:2,selectedIndex:p},r.commits.map((v,R)=>{let S=R===p,N=v.subject.length>y?v.subject.slice(0,y-1)+"\u2026":v.subject;return Je.createElement(fo,{key:v.sha,flexDirection:"row",paddingX:1,paddingBottom:1},Je.createElement(vn,{color:b.accent},S?"\u276F ":" "),Je.createElement(fo,{paddingLeft:1},Je.createElement(vn,{color:b.secondary2},`${v.sha.slice(0,7)} `),v.repo&&Je.createElement(vn,{color:b.secondary2},`[${d?.get(v.repo)??Xs(v.repo)}] `),Je.createElement(vn,{color:S?b.accent:b.primary},N),Je.createElement(vn,{color:b.secondary2},` ${hL(v)} ${kr(v.time)}`)))})))}import{Box as mc,Text as yL}from"ink";import ur from"react";var Gx=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=le(),{title:o}=t,s=t.parentNodeId?w.getNode(t.parentNodeId):void 0,i=s&&$(s)?o===Ae.ASSIGNEES?s.props.assignees??[]:o===Ae.TAGS?(s.props.tags??[]).filter(c=>w.getTag(c)):[]:[];return ur.createElement(mc,{alignItems:"center",paddingTop:1},ur.createElement(mc,{minWidth:12},ur.createElement(Dt,{isSelected:n}),ur.createElement(yL,{color:n?b.accent:b.secondary2},o,":")),ur.createElement(mc,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,d)=>{let p=r.id===t.id&&d===e;return ur.createElement(mc,{key:`${o}-${c}`,paddingRight:2,minHeight:1},ur.createElement(Dt,{isSelected:p}),o===Ae.ASSIGNEES?ur.createElement(Lr,{isSelected:p,id:c}):o===Ae.TAGS?ur.createElement(ms,{isSelected:p,id:c}):null)})))};import{Box as vs,Text as ep}from"ink";import tn,{useEffect as vL,useMemo as tp,useRef as bL}from"react";var Zm=e=>Math.max(5,String(Math.max(e,1)).length+3),Vx=(e,t)=>Math.max(0,e-6-Zm(t));var Qm=(e,t=0,n=0)=>Math.max(1,e-5-2*t-(n>0?1+n:0));var xL="\u2029",zx=(e,t)=>`${e}::inline-line::${t}`,np=({id:e,label:t,text:n,rows:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=le(),d=tp(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),p=tp(()=>d.join("\0"),[d]),m=bL([]);vL(()=>(ys(m.current),m.current=lc(e,d.length,v=>zx(e,v)),()=>{ys(m.current),m.current=[]}),[e,p]);let f=Zm(d.length),g=Vx(s,d.length),y=tp(()=>Vm(d).map(v=>{if(v.kind==="code"||v.kind==="caption")return{...v,text:Qn(v.text,g)};if(v.kind==="text"||v.kind==="heading"){let R=v.spans.map(S=>S.code?`\`${S.text}\``:S.text).join("");return{...v,spans:Yi(Qn(R,g))}}return v}),[d,g]).map((v,R)=>{let S=c.id===e&&i===R;return tn.createElement(vs,{key:zx(e,R)},tn.createElement(vs,{flexShrink:0},tn.createElement(ep,{color:S?b.primary:b.secondary2,dimColor:!S},`${R+1} `.padStart(f,"\xA0"))),v.kind==="blank"?tn.createElement(ep,{backgroundColor:S?"gray":void 0},xL):tn.createElement(vs,null,tn.createElement(zm,{line:v,width:v.kind==="code"?g:0,wrap:"truncate-end"})))});return tn.createElement(vs,{flexDirection:"column",paddingTop:1},tn.createElement(vs,null,tn.createElement(Dt,{isSelected:o}),tn.createElement(ep,{color:o?b.accent:b.secondary2},t)),tn.createElement(vs,{flexDirection:"row",borderStyle:"round",borderColor:b.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},tn.createElement(yt,{scrollByOne:!0,height:r,selectedIndex:i,itemHeight:1},y)))};var RL=e=>Pe(e,"description"),EL=e=>Pe(e,"comments"),IL=e=>Pe(e,"history"),CL=e=>Pe(e,"diff"),wL=e=>Pe(e,"attachments"),Kx=({ticket:e,height:t})=>{let n=xs(()=>yx(e),[e]),{selectedIndex:r,contextNode:o}=le(),s=process.stdout.columns||120,i=xs(()=>RL(e.id),[e.id]),c=xs(()=>EL(e.id),[e.id]),d=xs(()=>IL(e.id),[e.id]),p=xs(()=>CL(e.id),[e.id]),m=xs(()=>wL(e.id),[e.id]),f=w.getAttachmentsByIssue(e.id).length,g=o.id===e.id,h=o.id===c||o.parentNodeId===c,y=o.id===d||o.parentNodeId===d,v=o.id===m||o.parentNodeId===m,R=o.id===p||o.parentNodeId===p,S=pe(e.id);if(h){let X=t-3;return Ft.createElement(bs,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ft.createElement(kx,{ticket:e,width:s,height:X}))}if(v){let X=t-3;return Ft.createElement(bs,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ft.createElement(Rx,{ticket:e,width:s,height:X}))}if(R){let X=t-3;return Ft.createElement(bs,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ft.createElement(Wx,{ticket:e,width:s,height:X}))}if(y){let D=w.getNode(d),X=D&&mt(D)?D.props.value??"":"",Fe=Qm(t);return Ft.createElement(bs,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},D?Ft.createElement(np,{id:D.id,label:"Event log",text:X,selected:!1,maxWidth:s,rows:Fe}):null)}let N=[d,p,c,m],k=D=>N.includes(D),L=S.reduce((D,X)=>ti(X)?D+1:D,0),A=S.reduce((D,X)=>k(X.id)?D+1:D,0),O=S.findIndex(D=>k(D.id)),j=Qm(t,L,A),W=(D,X,Fe,fr)=>Ft.createElement(bs,{key:D.id,paddingTop:X===O?1:0},Ft.createElement(Dt,{isSelected:Fe}),Ft.createElement(SL,{backgroundColor:b.secondary,color:Fe?b.accent:b.primary},fr)),ge=(D,X,Fe)=>D.id===i?Ft.createElement(np,{key:D.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:X,maxWidth:s,rows:j}):ti(D)?Ft.createElement(Gx,{key:D.id,parent:D,selected:X,selectedIndex:r}):D.id===c?W(D,Fe,X,` Comments (${n}) \u203A\u203A `):D.id===m?W(D,Fe,X,` Attachments (${f}) \u203A\u203A `):D.id===d?W(D,Fe,X," History \u203A\u203A "):D.id===p?W(D,Fe,X," Diff \u203A\u203A "):null;return Ft.createElement(bs,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S.map((D,X)=>ge(D,g&&r===X,X)))};var AL=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:i,width:c})=>{let d=t.context,p=d===de.TICKET||d===de.FIELD_LIST||d===de.FIELD,m=d===de.BOARD||d===de.SWIMLANE,f=d===de.TICKET?t:r.find(R=>R.context===de.TICKET),g=Math.floor(c/3),h=Math.floor(c/Math.max(e.length,1)),y=Math.min(h,g),v=s==="dense";return pc.createElement(NL,{flexDirection:"row",height:i},m&&e.map((R,S)=>{let N=t.id===R.id,k=N?n:-1,L=t.context===de.BOARD&&n===S;return pc.createElement(hx,{key:R.id,height:i,width:y,swimlane:R,isSelected:L,isDense:v,isFocused:N,listSelectedIndex:k,mode:o})}),p&&f&&pc.createElement(Kx,{height:i,ticket:f}))},fc=pc.memo(AL);import{render as LL}from"ink";import{Writable as kL}from"node:stream";var Xi=e=>String(e).padStart(2,"0"),PL=e=>{let t=e.getUTCFullYear(),n=Xi(e.getUTCMonth()+1),r=Xi(e.getUTCDate()),o=Xi(e.getUTCHours()),s=Xi(e.getUTCMinutes()),i=Xi(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},OL=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",DL=async(e,{width:t,height:n})=>{let r="",o=new kL({write(i,c,d){let p=BL(i.toString()).trimEnd();p.trim().length>0&&p.includes("\u256D")&&(r=p),d()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=LL(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},BL=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Yx=async()=>{let{viewMode:e}=q(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=x(),i=r.find(S=>S.context==="BOARD");if(!i)return l("No board found to export");let c=120,d=40,p=await DL(ML.createElement(fc,{height:d,width:c,swimlanes:(s[i.id]??[]).filter(S=>S!==void 0&&An(S)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:d});if(!p)return l("Failed to render board export");let m=Da(process.cwd());if(a(m))return l("Unable to export, epiq root not found");let f=new Date,g=PL(f),h=`board_${OL(i.title)}_${g}.md`,y=bg(m.value);qx.mkdirSync(y,{recursive:!0});let v=TL.join(y,h),R=`# Board - ${i.title}
94
- Date: ${f.toISOString()}
95
-
96
- \`\`\`text
97
- ${p}
98
- \`\`\`
99
- `;return qx.writeFileSync(v,R,"utf8"),u("Exported board layout",v)};import{useSyncExternalStore as v4}from"react";var gc,FL=new Set,Xx=()=>{for(let e of FL)e()};var Br=()=>{if(!gc)throw new Error("Ui state not initialized. Call initUiState() first.");return gc};var Jx=(e={})=>(gc=e,Xx(),u("UX state initialized",null)),_L=e=>{let t=Br();return gc=e(t),Xx(),u("UX state updated",null)},Fr=e=>_L(t=>({...t,...e}));import{ulid as rp}from"ulid";var Zx=async e=>{let{contextNode:t,selectedIndex:n}=x(),r=pe(t.id)[n];if(e.modifier===Ht.DESCRIPTION)return jL();if(r&&ni(r))return $L(e);if(e.modifier===Ht.TITLE){let o=be();if(a(o))return l("Unable to resolve user ID");let s=r;if(!s)return l("Missing node");if(s.readonly)return l("Cannot rename readonly node");let i=e.inputString.trim();if(!i)return l("Provide a title");let c=await Ce();return a(c)?c:F([{id:rp(),action:"edit.title",payload:{id:s.id,name:i},...B(o.value)}],c.value)}return l("Unknown edit command")},$L=async e=>{let t=be();if(a(t))return l("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=x(),o=pe(n.id)[r];if(!o||!ni(o))return l("Select a comment first");if(o.readonly)return l("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return l("Unable to resolve comment issue");let i=x().nodes[s];if(!i||!$(i))return l("Unable to resolve comment issue");if(i.readonly)return l("Cannot edit readonly issue");let c=o.id.split(":").at(0)??"",d=w.getComment(c);if(!d||d.deleted)return l("Unable to resolve comment");if(d.issue!==i.id)return l("Comment does not belong to selected issue");if(d.authorId!==t.value.userId)return l("You can only edit your own comments"+d.authorId+"<->"+t.value.userId);let p=e.inputString.trim();if(!p)return l("Provide a comment");let m=await Ce();if(a(m))return m;let f=m.value;return F([{id:rp(),action:"edit.issue.comment",payload:{id:d.id,issue:i.id,md:p},...B(t.value)}],f)},jL=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let t=await Ce();if(a(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=x(),s=It([...r,o],"TICKET");if(a(s))return l("Edit target must be an issue");let i=s.value;if(!$(i))return l("Edit target must be an issue");if(i.readonly)return l("Cannot edit readonly issue");let c=pe(i.id).find(f=>f.title===Ae.DESCRIPTION);if(!c)return l("No target found");if(c.readonly)return l("Cannot edit readonly field");let d=i.props.description??"";if(typeof d!="string")return l("Selected field is not editable text");let p=Hv(d);if(a(p))return l("Failed to edit field");let m=p.value;return m===d?u("No changes made",null):F([{id:rp(),action:"edit.description",payload:{id:i.id,md:m},...B(e.value)}],n)};import HL from"node:fs";import sp from"node:path";import op from"node:fs";import UL from"node:path";var Qx=async e=>{let t=UL.join(e,".gitignore"),n=op.existsSync(t)?op.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
100
- `).map(d=>d.trim()),s=r.filter(d=>!o.some(p=>p===d||p===d.replace(/\/$/,"")||p==="/"+d||p==="/"+d.replace(/\/$/,"")));if(s.length===0)return u("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...s].join(`
101
- `);return n=n.trimEnd()+`
102
-
103
- ${c}
104
- `,op.writeFileSync(t,n,"utf8"),G.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),u("Local epiq paths ignored",!0)};var WL=async e=>{let t=await U({cwd:e,args:["status","--porcelain"]});return a(t)?t:u("Checked git diff",t.value.stdout.split(`
105
- `).filter(n=>n.trim().length>0).map(n=>n.slice(3)))},fe=(e,t)=>l(`[${e}] ${t}`),eS=async({cwd:e,user:t})=>{let n=Oa(),r=await dn(e);if(a(r))return fe(1,r.message);let o=r.value,s=await Qf(o);if(a(s))return fe(2,s.message);if(s.value)return fe(2,`Cannot initialize Epiq while a git operation is in progress: ${s.value}`);let i=await WL(o);if(a(i))return fe(2.5,i.message);if(i.value.length>0)return fe(3,`Cannot initialize Epiq with uncommitted changes (${i.value.join(", ")}). Commit or stash your changes first.`);if(Gs(o))return fe(4,"Epiq project already initialized");let{userId:c,userName:d}=t;if(!c||!d)return fe(5,"Missing Epiq user id");let p=await Jb(o);if(a(p))return fe(6,p.message);let m=n.stateBranch,f=await $a({repoRoot:o,branch:m});if(a(f))return fe(6,f.message);if(f.value)return fe(6,`State branch already exists: ${m}`);let g=await GL({repoRoot:o,stateBranch:m});if(a(g))return fe(6,g.message);if(g.value)return VL({repoRoot:o,stateBranch:m});let h=await Fm({repoRoot:o,stateBranchName:m});if(a(h))return fe(6,h.message);let y=Us();if(a(y))return fe(7,y.message);let v=sp.join(Xr(),n.projectId),R=await Mr({repoRoot:o,stateBranchRoot:v,stateBranchName:m});if(a(R))return fe(8,R.message);let S=sp.join(v,".epiq");HL.mkdirSync(S,{recursive:!0});let N=jb({userId:c,userName:d});if(a(N))return fe(9,N.message);for(let xt of N.value){let To=xy({event:xt,rootDir:v});if(a(To))return fe(9,To.message)}let k=Ir({userId:c}),L=ul(v,k);if(a(L))return fe(9,L.message);let A=Bm(v,n);if(a(A))return fe(9,A.message);let O=await Xl({stateBranchRoot:v,eventFileName:k});if(a(O))return fe(10,O.message);let j=await Ne.stage({cwd:v,pathspec:[ht]});if(a(j))return fe(10,j.message);let W=await Bo({cwd:v,message:"[epiq:init]"});if(a(W))return fe(10,W.message);let ge=await Qx(o);if(a(ge))return fe(11,ge.message);let D=Sd({repoRoot:o,fileContents:n});if(a(D))return fe(12,D.message);let X=await Ne.stage({cwd:o,pathspec:[".epiq/project.json",".gitignore"]});if(a(X))return fe(13,X.message);let Fe=await Ne.commit({cwd:o,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(a(Fe))return fe(13,Fe.message);let fr=[],Os=await U({cwd:o,args:["push","-u","origin","HEAD"]});a(Os)&&fr.push(`[init:14] ${Os.message}`);let dt=await Gi({repoRoot:o,stateBranchRoot:v});return a(dt)&&fr.push(`[init:15] ${dt.message}`),u("Project initialized",{repoRoot:o,projectId:n.projectId,stateBranch:m,stateBranchRoot:v,defaultEvents:N.value,warnings:fr})},GL=async({repoRoot:e,stateBranch:t})=>{let n=await Yn({repoRoot:e});if(a(n))return l(n.message);if(!n.value)return u("No remote",!1);let r=await Fs({repoRoot:e,branch:t});return a(r)?l(`Could not ask origin whether ${t} exists: ${r.message}`):r},VL=async({repoRoot:e,stateBranch:t})=>{let n=await U({cwd:e,args:["fetch","origin",t]});if(a(n))return fe(6,n.message);let r=await U({cwd:e,args:["show",`origin/${t}:${ht}`]});if(a(r))return fe(6,[`This repository is already an epiq project: origin has the state branch ${t}.`,"Initialising again would mint a second id for the same board.","","The branch was written before branches carried their identity, so restore",`${ht} from a checkout that has it, for example:`,"",` git show origin/main:${ht} > ${ht}`,"","and commit it; every later boot then stamps the branch, and the next clone adopts it."].join(`
106
- `));let o;try{o=JSON.parse(r.value.stdout)}catch(y){return fe(6,`The identity on origin/${t} is not readable: ${y instanceof Error?y.message:String(y)}`)}let s=Sd({repoRoot:e,fileContents:o});if(a(s))return fe(12,s.message);let i=await Ne.stage({cwd:e,pathspec:[ht]});if(a(i))return fe(13,i.message);let c=await Ne.commit({cwd:e,message:"[epiq:adopt-project]",pathspec:[ht]});if(a(c))return fe(13,c.message);let d=Us();if(a(d))return fe(7,d.message);let p=sp.join(Xr(),o.projectId),m=await Wi({repoRoot:e,stateBranchName:t});if(a(m))return fe(8,m.message);let f=await Mr({repoRoot:e,stateBranchRoot:p,stateBranchName:t});if(a(f))return fe(8,f.message);let g=[],h=await U({cwd:e,args:["push","-u","origin","HEAD"]});return a(h)&&g.push(`[init:14] ${h.message}`),u("Adopted the project origin already holds",{repoRoot:e,projectId:o.projectId,stateBranch:o.stateBranch,stateBranchRoot:p,defaultEvents:[],warnings:g})};var Ji=(e,t)=>l(`[${e}] ${t}`),tS=async()=>{te("");let e=tr();if(!e.isSetupDone||!e.userName)return Ji(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let t=q(),n=t.userName,r=t.userId;if(!r||!n)return Ji(5,"Missing Epiq user id");let o=await eS({cwd:process.cwd(),user:{userId:r,userName:n}});if(a(o))return o;let s="Project initialized!";for(let g of o.value.warnings)s+=` Warn: ${g}`;let c=mn(o.value.defaultEvents).filter(a);if(c.length>0)return Ji(16,c.map(g=>g.message).join(`
107
- `));let d=ve();if(a(d))return Ji(16,d.message);let{rootNodeId:p,nodes:m}=d.value,f=m[p];return f?(V.navigate({contextNode:f,selectedIndex:0}),T({hasProjectDefinition:!0}),u(s,null)):Ji(16,"Unable to resolve initialized root node")};import{ulid as KL}from"ulid";import{ulid as zL}from"ulid";var nS=null,bn=()=>structuredClone(nS),Zi=e=>{nS=e},rS=()=>{let{contextNode:e,selectedIndex:t}=x(),r=Ie(e.id)[t];return r?u("Resolved selected child",r):l("Target node not found")},ip=({id:e,parentId:t,position:n={at:"end"}})=>{let r=Ie(t).filter(o=>o.id!==e);return Gl(r,n)},oS=({id:e,parentId:t,position:n={at:"end"}})=>{let r=be();if(a(r))return l("Unable to resolve user ID");let o=ip({parentId:t,id:e,position:n});return a(o)?o:u("Created pending move state",{id:zL(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},sS=e=>{Zi(e);let t=hi(e,!0);return a(t)?t:u("Node moved successfully",t.value)};function ap(e){let t=rS();if(a(t))return t;let{contextNode:n,nodes:r}=x();if(!n.parentNodeId)return l("Missing parent node id");let o=r[n.parentNodeId];if(!o)return l("Missing parent node");let s=Ie(o.id),i=s.findIndex(({id:p})=>p===n.id);if(i<0)return l("Current node not found among siblings");let c=s[i+e];if(!c)return l("Missing sibling node");let d=oS({id:t.value.id,parentId:c.id,position:{at:"end"}});return a(d)?d:sS(d.value)}function Qi(e,t=1){let n=rS();if(a(n))return n;let{contextNode:r,selectedIndex:o}=x(),s=Ie(r.id),i=Math.min(Math.max(o+e*t,0),s.length-1),c=i===o?void 0:s[i];if(!c)return l("Missing sibling node");let d=oS({id:n.value.id,parentId:r.id,position:{at:e===1?"after":"before",sibling:c.id}});return a(d)?d:sS(d.value)}var iS=()=>{let e=bn();if(!e)return l("No pending move state");let t=e.payload.id,n=e.payload.parent,r=x().nodes[n];if(!r)return l("Move parent not found");let o=Ie(n).findIndex(s=>s.id===t);return o===-1?l("Moved node not found among rendered children"):(V.navigate({contextNode:r,selectedIndex:o}),u("Synchronized navigation to moved node",null))},Ss=(e,t="Moved preview")=>{if(a(e))return bn()&&T({mode:E.MOVE}),e;let n=iS();return a(n)?n:(T({mode:E.MOVE}),u(t,null))},aS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{modifier:t}=ne().commandMeta,{contextNode:n,selectedIndex:r}=x(),o=Ie(n.id)[r];if(!o)return T({mode:E.DEFAULT}),l("No move target");if(t==="start"){if(o.readonly)return l("Target node is read-only");if(r===-1)return l("No item selected");if(!o.parentNodeId)return l("Target has no parent");let s=Ie(o.parentNodeId),i=s.findIndex(({id:f})=>f===o.id);if(i===-1)return l("Target not found among siblings");let c=s[i-1],d=s[i+1],p=d!=null?{at:"before",sibling:d.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},m=ip({parentId:o.parentNodeId,id:o.id,position:p});return a(m)?m:(Zi({id:KL(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:m.value.rank},...B(e.value)}),T({mode:E.MOVE}),u("Move initialized",null))}if(t==="next")return Ss(Qi(1));if(t==="previous")return Ss(Qi(-1));if(t==="jump-next")return Ss(Qi(1,ji));if(t==="jump-previous")return Ss(Qi(-1,ji));if(t==="to-next")return Ss(ap(1));if(t==="to-previous")return Ss(ap(-1));if(t==="confirm"){let s=bn();if(!s)return l("No pending move to confirm");let i=await Ce();if(a(i))return i;let c=F([s],i.value);if(a(c))return c;let d=iS();return a(d)?d:(Zi(null),T({mode:E.DEFAULT}),u("Moved item",null))}return t==="cancel"?(Zi(null),T({mode:E.DEFAULT}),u("Cancelling move",null)):l("Invalid move modifier")};import{ulid as yc}from"ulid";import{monotonicFactory as qL,ulid as YL}from"ulid";var XL=qL(),hc=({name:e,parent:t,rank:n,user:{userId:r}})=>{let o=XL();return u("Created issue events",[{id:YL(),userId:r,action:"add.issue",payload:{id:o,parent:t,name:e,rank:n}}])};var lS=async(e,t)=>{let n=be();if(a(n))return l("Unable to resolve user ID");let r=await Ce();if(a(r))return r;let o=r.value;if(!t.inputString)return l(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:c}=x(),d=p=>{let m=F([p],o);if(a(m))return m;let f=w.getNode(m.value[0].result.id);if(!f)return l("Created node not found");if(!f.parentNodeId)return m;let g=w.getNode(f.parentNodeId);return g?(V.navigate({contextNode:g,selectedIndex:w.getSiblings(f.parentNodeId).findIndex(({id:h})=>h===f.id)}),m):l("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:p}=x(),m=w.getNode(p);if(!m)return l("Workspace not found");let f=ir(m.id,n.value,o);return a(f)?f:d({id:yc(),action:"add.board",payload:{id:yc(),name:t.inputString,parent:m.id,rank:f.value},...B(n.value)})}if(t.modifier==="swimlane"){let p=It(s,"BOARD");if(a(p))return l("Unable to add swimlane in this context");let m=ir(p.value.id,n.value,o);return a(m)?m:d({id:yc(),action:"add.swimlane",payload:{id:yc(),name:t.inputString,parent:p.value.id,rank:m.value},...B(n.value)})}if(t.modifier==="issue"){let p=pe(i.id)[c],m=i.context==="SWIMLANE"?i:i.context==="BOARD"&&p?.context==="SWIMLANE"?p:(()=>{let N=It(s,"SWIMLANE");return a(N)?null:N.value})();if(!m)return l("Unable to add issue in this context");let f=ir(m.id,n.value,o);if(a(f))return f;let g=hc({name:t.inputString,parent:m.id,rank:f.value,user:n.value});if(a(g))return g;let h=g.value,y=F([...h],o);if(a(y))return y;if(!y.value[0])return l("Issue creation failed");let S=h.find(N=>N.action==="add.issue")?.payload.id;return S?(V.navigate({contextNode:m,selectedIndex:w.getSiblings(m.id).findIndex(({id:N})=>N===S)}),u("Issue created",null)):l("Unable to determine ticket id")}return u("Success",null)};import ik from"node:os";import hS from"node:path";import ea from"node:fs";import JL from"node:path";import{z as go}from"zod";var ta="command-history.json",ZL=20,QL=go.object({projectId:go.string().min(1),commands:go.array(go.string()),lastUsedAt:go.number().finite()}),ek=go.object({projects:go.array(QL)}),cS=()=>{let e=Oi();return a(e)?e:u("Resolved command history path",JL.join(e.value,ta))},tk=()=>{try{let e=ce(process.cwd());return a(e)?null:e.value}catch{return null}},dS=e=>{if(!ea.existsSync(e))return u("No command history recorded",{state:"read",projects:[]});let t;try{t=ea.readFileSync(e,"utf8")}catch(o){return l(`Unable to read ${ta}: ${o instanceof Error?o.message:String(o)}`)}let n;try{n=JSON.parse(t)}catch(o){return u("Unparsable command history",{state:"corrupt",reason:`Invalid ${ta}: ${o instanceof Error?o.message:String(o)}`})}let r=ek.safeParse(n);return r.success?u("Read command history",{state:"read",projects:r.data.projects}):u("Command history in an unknown shape",{state:"corrupt",reason:`Invalid ${ta} shape: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`})},uS=({root:e})=>{let t=En(e);if(a(t))return l(t.message);let n=cS();if(a(n))return n;let r=dS(n.value);if(a(r))return r;let o=r.value;if(o.state==="corrupt")return l(o.reason);let s=o.projects.find(i=>i.projectId===t.value);return u("Read command history",s?.commands.slice(0,Fi)??[])},mS=({commands:e,root:t=tk(),now:n=Date.now()})=>{if(t===null)return u("No project; command history not stored",null);let r=En(t);if(a(r))return l(r.message);let o=cS();if(a(o))return o;let s=o.value,i=dS(s);if(a(i))return i;let c=i.value,d=c.state==="read"?c.projects:[],p=[{projectId:r.value,commands:e.slice(0,Fi),lastUsedAt:n},...d.filter(f=>f.projectId!==r.value)].sort((f,g)=>g.lastUsedAt-f.lastUsedAt).slice(0,ZL),m=`${s}.${process.pid}.tmp`;try{ea.writeFileSync(m,JSON.stringify({projects:p},null,2)+`
108
- `,"utf8"),ea.renameSync(m,s)}catch(f){try{ea.rmSync(m,{force:!0})}catch{}return l(`Unable to write ${ta}: ${f instanceof Error?f.message:String(f)}`)}return u("Stored command history",null)};var nk=e=>e.some(t=>t.action==="init.workspace"),pS=async(e,t)=>{let n=$e(e);return a(n)?l(n.message):$s({cwd:t,branch:n.value})},rk=e=>{let t=ce(process.cwd());if(a(t))return!1;let n=me({repoRoot:t.value});return!a(n)&&n.value===e},lp=!1,fS=()=>lp,vc=async e=>{lp=!0;try{return await ok(e)}finally{lp=!1}},ok=async e=>{let t=me({repoRoot:e});if(a(t))return hn(3,t.message);let n=t.value,r=await Mr({repoRoot:e,stateBranchRoot:n,stateBranchName:Oa().stateBranch});if(a(r))return hn(3,r.message);let o=Ke(n),s=pn(n);if(a(s))return hn(3,s.message);if(!nk(s.value.events)){let f=await Ri({worktreeRoot:n,operation:"boot pull",fn:()=>Jl(n,()=>pS(e,n))});if(a(f)?logger.info(3,f.message):f.value===null?logger.info(3,"Another process holds the state worktree, skipped pull"):a(f.value)&&logger.info(3,f.value.message),o=Ke(n),s=pn(n),a(s))return hn(3,s.message)}let{events:i,unreadable:c}=s.value,d=gn(i,c);if(a(d))return hn(4,d.message);Jo(n,o),T({hasProjectDefinition:!0,hasInitializingEvents:!!i.length});let p=tl({root:e});a(p)&&logger.info(p.message);let m=uS({root:e});return a(m)&&logger.info(m.message),fb(a(m)?[]:m.value),u("Loaded project",void 0)},sk=async e=>{let t=me({repoRoot:e});if(a(t))return l(t.message);let n=t.value,r=await Yn({repoRoot:n});if(a(r))return l(r.message);if(!r.value)return u("No remote to pull",void 0);let o=await Ri({worktreeRoot:n,operation:"boot pull",fn:()=>Jl(n,()=>(ls("Pulling"),pS(e,n)))});if(a(o))return Xe(o.message);if(o.value===null)return u("Another process holds the state worktree",void 0);let s=o.value;if(a(s))return _s(s.message)?(ql("Offline"),u("Offline",void 0)):Xe(s.message);if(!s.value)return co("Already synced"),u("Already synced",void 0);if(!rk(n))return u("Project changed during the pull",void 0);let i=Vi(n);return a(i)?i:(co("Pulled"),u("Pulled and reloaded",void 0))},bc=e=>{sk(e).then(t=>{a(t)&&logger.info(3,t.message)}).catch(t=>{logger.error(`[boot] pull failed: ${cs(t)}`)})},gS=()=>{let e=gn([]);return a(e)?hn(4,e.message):(T({hasProjectDefinition:!1,hasInitializingEvents:!1}),u("Booted without a project",void 0))};var ak=e=>e==="~"||e.startsWith("~/")?hS.join(ik.homedir(),e.slice(1)):e,lk=(e,t)=>{let n=e.trim();if(!n)return l("Provide a number from the list or a path to a project");if(/^\d+$/.test(n)){let o=t[Number(n)-1];return o?u("Resolved recent project",o.root):l(`No recent project #${n}`)}let r=ce(hS.resolve(ak(n)));return a(r)?l(`No epiq project at ${n}`):u("Resolved project path",r.value)},yS=async()=>{let e=Wl();if(te(""),x().hasProjectDefinition)return l("Already in a project; run epiq from another directory");let t=er({exclude:process.cwd()}),n=a(t)?[]:t.value,r=lk(e,n);if(a(r))return l(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(c){return l(`Unable to enter ${o}: ${c instanceof Error?c.message:String(c)}`)}let i=await vc(o);return a(i)?(process.chdir(s),l(i.message)):(bc(o),u(`Opened ${Wo(o)}`,null))};var xc=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=x(),s=bl(n,t);if(a(s))return l(s.message);let{appliedEvents:i,unappliedEvents:c}=s.value,d=xn();if(a(d))return d;let p=mn(i),{fatal:m,skipped:f}=kn(p);if(m.length>0)return xn(),T(o),l(m.map(h=>h.message).join(", "));Pn(f);let g=x().nodes[e];return g?(V.navigate({contextNode:g,selectedIndex:r}),u("",{unappliedEvents:c})):(xn(),T(o),l("Board did not exist at that date"))};var vS=e=>{let t=[],n=0;for(let o=0;o<e.length;o++){let s=o===0?0:Math.max(0,e[o]-e[o-1]);n+=Math.sqrt(s),t[o]=n}let r=n;return t.map((o,s)=>r>0?o/r:(s+1)/e.length)};var ck=20,dk=16,uk=150,Sc=null,Rc=null;var ho=()=>{Sc!==null&&(clearInterval(Sc),Sc=null),Rc!==null&&(clearTimeout(Rc),Rc=null)},bS=()=>{ho(),T({mode:E.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},xS=({events:e,startTime:t,durationMs:n})=>{ho();let r=e.length,o=$o(e.map(f=>vr(f))).map(f=>f??t),s=o[r-1]??Date.now(),i=vS(o),c=Math.max(1,Math.round(n*ck/1e3)),d=Math.max(Math.round(n/c),dk),p=0,m=0;T({mode:E.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Sc=setInterval(()=>{p++;let f=p/c,g=[],h,y;for(;m<r&&i[m]<=f;){let R=e[m],S=hi(R);if(a(S)){if(Zo(S)){m++;continue}bS();return}g.push(...Du(R)),h=R,y=o[m],m++}if(m>=r||p>=c){for(;m<r;m++){let S=hi(e[m]);if(a(S)&&!Zo(S))break}let R=x().replay;T({unappliedEvents:[],replay:R&&{...R,progress:1,appliedCount:r}}),ho(),Rc=setTimeout(bS,uk);return}let v=x().replay;T({unappliedEvents:e.slice(m),replay:{progress:Math.min(1,f),appliedCount:m,totalCount:r,startTime:t,endTime:s,currentTime:h?y??v?.currentTime??t:v?.currentTime??t,currentLabel:h?Ec(h):v?.currentLabel??"",flashNodeIds:h?[...new Set(g)]:v?.flashNodeIds??[]}})},d)};var SS=async()=>{let e=It(x().breadCrumb,"BOARD");if(a(e))return e;let t=await dn(process.cwd());if(a(t))return l("Unable to locate repo root");let n=me({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=ne().commandMeta;if(ho(),r==="now"){let c=On(n.value);if(a(c))return l(c.message);let d=xn();if(a(d))return d;let p=mn(c.value),{fatal:m,skipped:f}=kn(p);return m.length>0?l(m.map(g=>g.message).join(", ")):(Pn(f),T({mode:E.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let c=xl(n.value);if(a(c))return c;let d=r==="prev"?x().eventLog.at(-1):x().unappliedEvents.at(0),p=d===void 0?null:vr(d),m=(d===void 0?null:c.value.get(d.id)??null)??(p===null?null:Zs(p));if(m===null)return l(r==="prev"?"No previous event to peek":"No next event to peek");s=r==="prev"?m:m+1}else{let c=Qr(r||o.trim());if(!c)return l("Invalid peek date");s=c.getTime()}let i=xc({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return a(i)?i:(T({mode:E.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),u("Peeking",!0))};var RS=async()=>{let e=It(x().breadCrumb,"BOARD");if(a(e))return e;let t=await dn(process.cwd());if(a(t))return l("Unable to locate repo root");let n=me({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=ne().commandMeta,{dateInput:s,durationInput:i}=il(r,o);if(ho(),x().syncStatus.status==="syncing")return l("Cannot replay while syncing, try again in a moment");let c=Qr(s);if(!c)return l("Invalid replay date");let d=i?sl(i):15e3;if(d===null)return l("Invalid replay duration (try e.g. 30s or 2m)");let p=c.getTime(),m=x(),f=xc({boardId:e.value.id,targetTime:p,stateBranchRoot:n.value,selectedIndex:-1});if(a(f))return f;let{unappliedEvents:g}=f.value;return g.length===0?(xn(),T(m),u("Nothing to replay from that point",!0)):(xS({events:g,startTime:p,durationMs:d}),u("Replaying board history",!0))};import{spawn as pk}from"node:child_process";var fk=()=>{switch(process.platform){case"darwin":return{command:"pbcopy",args:[]};case"win32":return{command:"clip",args:[]};default:return process.env.WAYLAND_DISPLAY?{command:"wl-copy",args:[]}:{command:"xclip",args:["-selection","clipboard"]}}},ES=async e=>new Promise(t=>{let{command:n,args:r}=fk();try{let o=pk(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(l(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?u("Copied to clipboard",null):l(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(l(`Clipboard tool not available (${n})`))}});var na=async(e,t)=>{if(!e.trim())return l(`Nothing to copy: ${t} is empty`);let n=await ES(e);return a(n)?n:u(`Copied ${t} to clipboard`,null)},IS=async e=>{let{breadCrumb:t,selectedNode:n}=x(),r=si({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return l("Nothing selected to copy from");switch(e.modifier){case et.REF:return na(z(o.id),"ref");case et.TITLE:return na(o.title,"title");case et.DESCRIPTION:return r?na(r.props?.description??"","description"):l("No issue in scope");case et.TAGS:{if(!r)return l("No issue in scope");let s=Tn(r).map(({name:i})=>i);return na(s.join(", "),"tags")}case et.ASSIGNEES:{if(!r)return l("No issue in scope");let s=Mn(r).map(({name:i})=>i);return na(s.join(", "),"assignees")}default:return l("Yank one of: ref, title, description, tags, assignees")}};var CS=async()=>{te(""),T({mode:E.DEFAULT});let e=ve();if(a(e))return l(e.message);if(e.value.syncStatus.status==="syncing")return l("Sync already in progress");T({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Ql();return a(t)?(T({syncStatus:{msg:t.message,status:"failed"}}),t):(T({mode:E.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{ulid as wS}from"ulid";var NS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=x(),r=pe(t.id)[n];if(!r)return l("Unable to resolve child to delete");let o=await Ce();if(a(o))return o;if(r.context==="COMMENT"){let s=r.id,i=$(t)?t.id:t.parentNodeId;if(!i)return l("Unable to resolve comment issue");let c=x().nodes[i];if(!c||!$(c))return l("Unable to resolve comment issue");let d=c.log?.filter(bx).find(p=>p.payload.id===s);return d?d.payload.author!==e.value.userId?l("You can only delete your own comments"):F([{id:wS(),action:"delete.issue.comment",payload:{id:s,issue:i},...B(e.value)}],o.value):l("Unable to resolve comment")}return F([{id:wS(),action:"delete.node",payload:{id:r.id},...B(e.value)}],o.value)};import{ulid as gk}from"ulid";var AS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=x(),r=pe(t.id)[n];if(!r)return l("Unable to close issue, no target found");if(!$(r))return l("Cannot close in this context");let o=x().nodes[Se];if(!o)return l("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return l("Issue is already closed");let s=await Ce();if(a(s))return s;let i=s.value,c=$n(o.id,r.id,{at:"end"},e.value,i);if(a(c))return c;let d=F([{id:gk(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...B(e.value)}],i);return a(d)?d:u("Issue closed",null)};import{ulid as hk}from"ulid";var Ic=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id){for(let o=n-1;o>=0;o--){let s=t[o];if(s&&"id"in s.payload&&s.payload.id===e.id&&"parent"in s.payload&&s.payload.parent)return s.payload.parent}return null}}return null};var TS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=x(),r=pe(t.id)[n];if(!r)return l("Unable to reopen issue, no target found");let o=r.context==="TICKET"?u("Resolved ticket",r):_t(r.id,"TICKET");if(a(o))return l("Cannot reopen in this context");let s=o.value,i=x().nodes[Se];if(!i)return l("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return l("Issue is not closed");if(!$(s))return l("Target node is not issue");let c=Ic(s);if(!c)return l("Unable to resolve previous parent from issue history");if(c===i.id)return l("Previous parent resolves to closed swimlane");let d=x().nodes[c];if(!d)return l("Previous parent no longer exists");let p=await Ce();if(a(p))return p;let m=p.value,f=$n(d.id,s.id,{at:"end"},e.value,m);if(a(f))return f;let g=F([{id:hk(),action:"reopen.issue",payload:{id:s.id,parent:d.id,rank:f.value},...B(e.value)}],m);return a(g)?g:u("Issue reopened",null)};import{ulid as yk}from"ulid";var MS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=x(),r=pe(t.id)[n];if(!r)return l("Missing node");if(r.readonly)return l("Cannot rename readonly node");let o=Wl();if(!o)return l("Provide a title");let s=await Ce();return a(s)?s:F([{id:yk(),action:"edit.title",payload:{id:r.id,name:o},...B(e.value)}],s.value)};import{ulid as vk}from"ulid";var LS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return l("Provide a tag");let o=w.findTagByName(r);if(!o)return l(`Tag "${r}" does not exist`);let{selectedNode:s}=x();if(!s)return l("Invalid untag target");let i=_t(s.id,"TICKET");if(a(i))return l("Unable to untag issue in this context");let c=i.value;if(!$(c))return l("Target node is not issue");if(!(c.props.tags??[]).includes(o.id))return l("Issue is not tagged with that tag");let p=await Ce();return a(p)?p:F([{id:vk(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...B(e.value)}],p.value)};import{ulid as cp}from"ulid";var kS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return l("Provide a tag");let{selectedNode:o}=x();if(!o)return l("Invalid tag target");let s=_t(o.id,"TICKET");if(a(s))return l("Unable to tag issue in this context");let i=s.value;if(!$(i))return l("Target node is not issue");let c=await Ce();if(a(c))return c;let d=w.findTagByName(r),p=d?.id??cp();return(i.props.tags??[]).includes(p)?l("Already tagged with that tag"):F([...d?[]:[{id:cp(),action:"create.tag",payload:{id:p,name:r},...B(e.value)}],{id:cp(),action:"add.issue.tag",payload:{id:i.id,tag:p},...B(e.value)}],c.value)};import{ulid as dp}from"ulid";var ra=({events:e,registry:t,logFileNames:n})=>{let r=new Map(n),o=new Set;for(let s of e)s.userId&&(r.has(s.userId)||r.set(s.userId,""),o.add(s.userId));for(let s of Object.values(t))r.set(s.id,s.name);return[...r.entries()].map(([s,i])=>({id:s,name:i,isExternal:!o.has(s)}))},PS=({authorName:e,authorEmail:t,owners:n,registry:r})=>{let o=ot(t),s=n.get(o),i=s?r[s]:void 0;return s?{...Qe(s,i?.name),resolved:!0}:{...Qe(o||e,e),resolved:!1}};var Cc=e=>{let{eventLog:t=[],contributors:n}=x();return ra({events:t,registry:n,logFileNames:wr(e)})};var OS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return l("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return l("Provide an assignee");let{selectedIndex:i,contextNode:c}=x(),d=pe(c.id)[i];if(!d)return l("Invalid assign target");let p=_t(d.id,"TICKET");if(a(p))return l("Unable to assign issue in this context");let m=p.value;if(!$(m))return l("Target node is not issue");let f=await Ce();if(a(f))return f;let g=Cc(f.value),h=!o&&s.toLowerCase()==="me",y,v;if(h)y=e.value.userId,v=g.find(N=>N.id===y)?.name??e.value.userName;else{let N=g.filter(L=>L.name===s);if(N.length>1)return l(`"${s}" matches ${N.length} contributors (${N.map(L=>L.id).join(", ")}). Assign from the GUI to choose by id.`);let k=N[0];if(!k&&!o)return l(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);y=k?.id??dp(),v=k?.name??s}if((m.props.assignees??[]).includes(y))return l("Assignee already assigned");let S=!!x().contributors[y];return F([...S?[]:[{id:dp(),action:"create.contributor",payload:{id:y,name:v},...B(e.value)}],{id:dp(),action:"add.issue.assignee",payload:{id:m.id,assignee:y},...B(e.value)}],f.value)};import{ulid as bk}from"ulid";var DS=async()=>{let e=be();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return l("Provide an assignee to remove");let{selectedNode:o}=x();if(!o)return l("Invalid unassign target");let s=_t(o.id,"TICKET");if(a(s))return l("Unable to unassign in this context");let i=s.value;if(!$(i))return l("Target node is not issue");let c=i.props.assignees??[],d=r.toLowerCase()==="me",p=await Ce();if(a(p))return p;let m=d?c.filter(g=>g===e.value.userId):Cc(p.value).filter(g=>g.name===r&&c.includes(g.id)).map(g=>g.id);if(m.length>1)return l(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let f=m[0];return f?F([{id:bk(),action:"remove.issue.assignee",payload:{id:i.id,assignee:f},...B(e.value)}],p.value):l(d?"Issue is not assigned to you":`Issue is not assigned to "${r}"`)};import{ulid as BS}from"ulid";var xk=e=>{let t=e.trim(),n=Dr(),r=n?Bv(t):null;if(!n||!r)return{ok:!0,md:t,anchored:!1};let o=uc();if(!o||o.sha!==n)return{ok:!1,reason:"No diff is open"};let s=Fv(o.rows,Math.max(0,x().selectedIndex));if(!s)return{ok:!1,reason:"That line is not in a file"};let i=_v(o.rows,s,r.start,r.end);return i.ok?{ok:!0,anchored:!0,md:Pv({filePath:i.value.filePath,start:i.value.start,end:i.value.end,side:"additions",endSide:"additions",note:r.note,sha:n,snippet:i.value.snippet})}:{ok:!1,reason:i.reason}},FS=async e=>{let t=xk(e.inputString);if(!t.ok)return l(t.reason);let{md:n,anchored:r}=t;if(!n)return l("Provide a comment");if(n.length>4e3)return l(r?`The note and the ${n.length} characters of quoted lines exceed ${4e3}; comment on fewer lines`:`Cannot exceed ${4e3} characters`);let o=be();if(a(o))return l("Unable to resolve user ID");let{breadCrumb:s,selectedNode:i}=x(),c=It([...s,i],"TICKET");if(a(c))return l("Edit target must be an issue");let d=c.value;if(!d)return l("Invalid comment target");let p=d.context==="TICKET"?u("Resolved ticket",d):_t(d.id,"TICKET");if(a(p))return l("Unable to comment on issue in this context");let m=p.value;if(!$(m))return l("Target node is not issue");let f=await Ce();if(a(f))return f;let g=await F([{id:BS(),action:"add.issue.comment",payload:{id:BS(),issue:m.id,author:o.value.userId,md:n},...B(o.value)}],f.value);return r&&!a(g)&&po(null),g};import{ulid as Nk}from"ulid";var wc=e=>e.userName?.trim()?e.preferredEditor?.trim()?null:"no editor configured":"no username configured",Sk=e=>{let t=Et();return a(t)?wc({userName:e.userName,preferredEditor:e.preferredEditor})??t.message:wc(t.value)},oa=()=>{let e=Jt();return a(e)?l(e.message):u("Read auto sync settings",{enabled:e.value.autoSync===!0,intervalMs:Po(e.value.autoSyncDebounceMs),blockedReason:Sk(e.value)})},Rs=e=>{let t=e.intervalMs===void 0?void 0:ko(e.intervalMs);if(e.intervalMs!==void 0&&t===null)return l(`Auto sync interval must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=oa();if(a(n))return n;let r=Pt({...e.enabled===void 0?{}:{autoSync:e.enabled},...t==null?{}:{autoSyncDebounceMs:t}});if(a(r))return l(r.message);ze({...e.enabled===void 0?{}:{autoSync:e.enabled},...t==null?{}:{autoSyncIntervalMs:t}});let o=oa();return a(o)?u("Changed auto sync settings",{...n.value,...e.enabled===void 0?{}:{enabled:e.enabled},...t==null?{}:{intervalMs:t}}):o};var _S=()=>{let e=ne().commandMeta.inputString,t=ko(e);if(t===null)return l(`Auto sync duration must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=Rs({intervalMs:t});return a(n)?n:u(`Auto sync interval set to ${t}ms`,null)};import Rk from"zod";var $S=()=>{let e=Rk.coerce.number().int().min(zo).max(Ko).safeParse(ne().commandMeta.inputString);if(!e.success)return l(`A connected repo's clone cap must be ${zo}-${Ko} MB (default ${yu})`);let t=Pt({repoCloneMaxMb:e.data});return a(t)?t:u(`Connected repo clone cap set to ${e.data} MB`,null)};var jS=()=>{let e=ne().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return l("Invalid response");let t=vh(e),n=Rs({enabled:t===!0});return a(n)?n:u(`Auto sync set to "${e}"`,null)};import{ulid as Ck}from"ulid";var up=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=2),US="",HS=new Map,Ek=15e3;var Ik=async(e,t)=>{let n=`${e} ${t??""}`,r=HS.get(n);if(r&&Date.now()-r.at<Al(Ek))return u("Cached author scan",r.authors);let o=await ke({cwd:e,args:["log","--branches",...t?["--not",t]:[],`--format=%an${US}%ae`]});if(o.exitCode!==0)return l(`Could not read this repository's history: ${(o.stderr??"").trim()||`git exited ${o.exitCode}`}`);let s=new Map;for(let i of(o.stdout??"").split(`
109
- `)){let c=i.lastIndexOf(US);if(c===-1)continue;let d=i.slice(0,c),p=ot(i.slice(c+1));if(!br(p))continue;let m=s.get(p)??{names:new Set,commits:0};d&&m.names.add(d),m.commits+=1,s.set(p,m)}return HS.set(n,{at:Date.now(),authors:s}),u("Scanned repository authors",s)},Gn=async({repoRoot:e,stateBranch:t,names:n,links:r})=>{let o=await Ik(e,t);if(a(o))return l(o.message);let s=o.value,i=new Map;for(let d of Object.values(r)){if(d.tombstoned)continue;let p=i.get(d.email)??new Set;p.add(d.contributor),i.set(d.email,p)}let c=new Set(n.flatMap(d=>up(d??"")));return u("Found candidates",[...s.entries()].map(([d,p])=>({email:d,names:[...p.names],commits:p.commits,looksLikeYours:[...p.names].some(m=>up(m).some(f=>c.has(f)))||up(d.split("@")[0]??"").some(m=>c.has(m)),claimedBy:[...i.get(d)??[]]})).sort((d,p)=>d.looksLikeYours===p.looksLikeYours?p.commits-d.commits:Number(p.looksLikeYours)-Number(d.looksLikeYours)))},_r=e=>e.filter(t=>t.claimedBy.length===0);var WS=()=>{let e=lu();if(!e)return u("Nothing here to decline",null);let t=Jt(),n=a(t)?[]:t.value.declinedEmailBoards??[],r=[...new Set([...n,e])],o=Pt({declinedEmailBoards:r});return a(o)?l(o.message):(ze({declinedEmailBoards:[...new Set([...q().declinedEmailBoards??[],e])]}),u("Declined",null))},GS=async()=>{let e=ne().commandMeta.inputString.trim();if(e==="none"){let R=WS();return a(R)?R:u("Left unlinked. Your commits will show the name git signed them with. Run :config emails again to change that.",null)}let{userId:t,userName:n,gitName:r}=q();if(!t)return l("Set a username first with :config username");let o=ve();if(a(o))return l("Board is not loaded");let s=ce(process.cwd());if(a(s))return l(s.message);let i=$e(s.value),c=await Gn({repoRoot:s.value,stateBranch:a(i)?void 0:i.value,names:[n,r],links:o.value.emailLinks});if(a(c))return c;let p=_r(c.value);if(Go(p.map(R=>R.email)),p.length===0){if(!hh()){let R=WS();if(a(R))return R}return u("No unclaimed addresses in this history.",null)}if(!e)return T({mode:E.IDENTITY}),u("Opened identity",null);let m=e.split(/[,\s]+/).filter(Boolean),f=[],g=[];for(let R of m){let S=p.find(N=>N.email===ot(R));if(!S){g.push(R);continue}f.includes(S)||f.push(S)}if(g.length>0)return l(`Not on the list: ${g.join(", ")}. Pick one of ${p.map(R=>R.email).join(", ")}.`);let h=me({repoRoot:s.value});if(a(h))return h;let y=f.map(R=>({id:Ck(),action:"link.contributor.email",payload:{contributor:t,email:R.email},userId:t})),v=F(y,h.value);return a(v)?l(v.message):u(`Claimed ${f.map(R=>R.email).join(", ")}. Every commit by ${f.length===1?"that address":"those addresses"} is now yours.`,null)};import{ulid as wk}from"ulid";var VS=()=>{let e=ne().commandMeta.inputString.trim(),{userId:t}=q();if(!t)return l("Set a username first with :config username");let n=ve();if(a(n))return l("Board is not loaded");let r=Nn(n.value.emailLinks,t);if(r.length===0)return l("You have not claimed any addresses.");if(!e)return l(`Which one? ${r.join(", ")}.`);let o=r.find(d=>d===ot(e));if(!o)return l(`You have not claimed ${e}. Yours: ${r.join(", ")}.`);let s=ce(process.cwd());if(a(s))return s;let i=me({repoRoot:s.value});if(a(i))return i;let c=F([{id:wk(),action:"unlink.contributor.email",payload:{contributor:t,email:o},userId:t}],i.value);return a(c)?l(c.message):u(`Unclaimed ${o}`,null)};var zS=()=>{let e=ne().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return l("Invalid response");let n=Pt({logLevel:e});return a(n)?n:(ze({logLevel:e}),u(`Auto sync set to "${e}"`,null))};var KS=e=>{let t=e.inputString.trim();switch(e.modifier){case se.USERNAME:{if(process.env[qn])return l(`Cannot change the configured user while ${qn} names this process`);let n=Jt();if(a(n))return n;let{userId:r,preferredEditor:o,userName:s}=n.value,i=t||s,c=r||Nk();if(!i||!c)return l("Unable to resolve user name or id");let d=Pt({userName:i,userId:c,preferredEditor:o??""});return a(d)?d:(ze({userName:i,userId:c}),u(`Username set to "${i}"`,null))}case se.EDITOR:{if(!t)return l("No editor provided");let n=Pt({preferredEditor:t});return a(n)?n:(ze({preferredEditor:t}),u(`Editor configuration set to "${t}"`,null))}case se.VIEW:{if(t!=="wide"&&t!=="dense")return l("Invalid view mode");let n=Pt({viewMode:t});return a(n)?n:(ze({viewMode:t}),u(`View set to "${t}"`,null))}case se.EMAILS:return GS();case se.EMAILS_UNCLAIM:return VS();case se.AUTOSYNC:return jS();case se.LOG_LEVEL:return zS();case se.SYNC_DEBOUNCE_MS:return _S();case se.ATTACHMENT_MAX_KB:return Ph();case se.REPO_CLONE_MAX_MB:return $S();case se.REPO_CONNECT:return Yv();case se.REPO_DISCONNECT:return Xv();default:return l("Unknown config command")}};var mp=()=>{let e=bh(),t=x().mode;if(!(t!==E.COMMAND_LINE&&t!==E.DEFAULT)){if(!e){T({mode:E.DEFAULT});return}T({mode:E.COMMAND_LINE}),te(e)}};var Nc=[{systemOnly:!0,intent:Y.Move,description:"Internal move-state command",mode:E.COMMAND_LINE,action:aS},{intent:Y.Delete,description:"Delete the currently selected node",mode:E.COMMAND_LINE,action:NS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:E.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ne().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(i=>Ue(C.FILTER).map(c=>c.split(n)[0]).includes(i))(r))return l("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return Be(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:E.DEFAULT})),u("Filter updated",null)}},{intent:Y.ViewHelp,description:"Open the help screen",mode:E.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=x();return Fr({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),T({mode:E.HELP}),u("Viewing help",null)}},{intent:Y.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:E.COMMAND_LINE,action:AS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:E.COMMAND_LINE,action:TS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.Init,description:"Initialize Epiq in the current git repository",mode:E.COMMAND_LINE,action:tS,onSuccess:mp},{intent:Y.OpenProject,description:"Open a recently used epiq project, by number or path",mode:E.COMMAND_LINE,action:yS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.NewItem,description:"Create a new board, swimlane, or issue",mode:E.COMMAND_LINE,action:lS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.Rename,description:"Rename the currently selected node",mode:E.COMMAND_LINE,action:MS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.UntagTicket,description:"Remove a tag from the selected issue",mode:E.COMMAND_LINE,action:LS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.TagTicket,description:"Add or create a tag on the selected issue",mode:E.COMMAND_LINE,action:kS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.AssignUserToTicket,description:"Assign a user to the selected issue",mode:E.COMMAND_LINE,action:OS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:E.COMMAND_LINE,action:DS,onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.Comment,description:"Add a comment to the selected issue",mode:E.COMMAND_LINE,action:async(e,t)=>FS(t),onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.Sync,description:"Pull, commit, and push Epiq state",mode:E.COMMAND_LINE,action:CS},{intent:Y.Peek,description:"View board state at another point in time",mode:E.COMMAND_LINE,action:SS},{intent:Y.Replay,description:"Replay board history forward from a point in time",mode:E.COMMAND_LINE,action:RS},{intent:Y.Export,description:"Export the current board layout to markdown",mode:E.COMMAND_LINE,action:async()=>{let e=await Yx();return a(e)?e:(T({mode:E.DEFAULT}),u("Export successful",!0))}},{intent:Y.Exit,description:"Exit the application",mode:E.COMMAND_LINE,action:async()=>(V.exit(),u("Exit successful",!0))},{intent:Y.Edit,description:"Edit title or description",mode:E.COMMAND_LINE,action:async(e,t)=>Zx(t),onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:E.COMMAND_LINE,action:async(e,t)=>IS(t),onSuccess:()=>T({mode:E.DEFAULT})},{intent:Y.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:E.COMMAND_LINE,action:(e,t)=>KS(t),onSuccess:mp}];var Ak=e=>{let t=e.value;return t&&typeof t=="object"&&typeof t.followUp=="string"?t.followUp:null},Tk=new Set(["peek","replay","filter","view-help","yank"]),nn=async({isForceExecutedBySystem:e=!1}={})=>{let{value:t,commandMeta:{command:n,validity:r,modifier:o,inputString:s}}=ne();if(!n)return l("No command to confirm");if(!e&&r===_n.Invalid)return l("Invalid command");let i=tc(n);mb();let{readOnly:c}=x();if(c&&!Tk.has(i))return _i({status:gr.Fail,message:"Command not available in readonly state",value:null});let d=Nc.filter(g=>e||g.systemOnly!==!0).find(g=>g.intent===i);if(!d)return _i({status:gr.Fail,message:"Command not found",value:null});let p;try{p=await d.action(d,{command:n,inputString:s,modifier:o})}catch(g){return _i({status:gr.Fail,message:g instanceof Error?g.message:"Command failed",value:null})}if(a(p))return _i(p);let m=!e;if(pb({addToHistory:m,line:t}),m){let g=mS({commands:ne().commandHistory});a(g)&&logger.info(g.message)}let f=Ak(p);return f!==null?(te(f),p):(d.onSuccess?.(),q().autoSync&&ec(),p)};var Ac=[{intent:I.Exit,mode:E.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(T({mode:E.COMMAND_LINE}),te("move cancel"),nn({isForceExecutedBySystem:!0}))},{intent:I.InitMove,mode:E.DEFAULT,description:"[m] move",action:()=>(T({mode:E.COMMAND_LINE}),te("move start"),nn({isForceExecutedBySystem:!0}))},{intent:I.ConfirmMove,mode:E.MOVE,description:"[m] confirm move",action:()=>(T({mode:E.COMMAND_LINE}),te("move confirm"),nn({isForceExecutedBySystem:!0}))}],Tc=[{intent:I.MovePreviousItem,mode:E.MOVE,action:()=>bn()?(T({mode:E.COMMAND_LINE}),te("move previous"),nn({isForceExecutedBySystem:!0})):l("No pending move")},{intent:I.MoveNextItem,mode:E.MOVE,description:"[arrows/hjkl] move (shift x5)",action:()=>bn()?(T({mode:E.COMMAND_LINE}),te("move next"),nn({isForceExecutedBySystem:!0})):l("No pending move")},{intent:I.MovePreviousItemJump,mode:E.MOVE,action:()=>bn()?(T({mode:E.COMMAND_LINE}),te("move jump-previous"),nn({isForceExecutedBySystem:!0})):l("No pending move")},{intent:I.MoveNextItemJump,mode:E.MOVE,action:()=>bn()?(T({mode:E.COMMAND_LINE}),te("move jump-next"),nn({isForceExecutedBySystem:!0})):l("No pending move")}],qS=[{intent:I.MoveToNextContainer,mode:E.MOVE,action:()=>bn()?(T({mode:E.COMMAND_LINE}),te("move to-next"),nn({isForceExecutedBySystem:!0})):l("No pending move")},{intent:I.MoveToPreviousContainer,mode:E.MOVE,action:()=>bn()?(T({mode:E.COMMAND_LINE}),te("move to-previous"),nn({isForceExecutedBySystem:!0})):l("No pending move")}];var YS={[de.WORKSPACE]:[...Ac,...Tc],[de.BOARD]:[...Ac,...Tc],[de.SWIMLANE]:[...Ac,...Tc,...qS],[de.TICKET]:[],[de.FIELD]:[],[de.FIELD_LIST]:[],[de.TEXT]:[],[de.COMMENT]:[]};import Lk from"node:fs";import kk from"node:path";import{spawn as Mk}from"node:child_process";function XS(e){let t=process.platform,o=Mk(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return o.unref(),o.on("error",()=>{}),!0}var JS=e=>{let t=ce(process.cwd());if(a(t))return l("Unable to resolve project root");let n=me({repoRoot:t.value});if(a(n))return l(n.message);let r=no(e.hash,e.ext),o=kk.join(Ws(n.value),r);return Lk.existsSync(o)?(XS(o),u(`Opened ${e.name}`,null)):l("Attachment file not found \u2014 run :sync to fetch it")};var ZS=()=>{te("");let{pendingNavTarget:e}=Br();T({mode:E.DEFAULT}),e&&V.navigate(e),Fr({pendingNavTarget:void 0})},QS=[{intent:I.ExitCommandLine,mode:E.HELP,action:()=>(ZS(),u("Exiting help",null))},{intent:I.Exit,mode:E.HELP,action:()=>(ZS(),u("Closed help",null))},{intent:I.NavPreviousItem,mode:E.HELP,description:"[arrows/hjkl] navigate (shift x5)",action:()=>(V.navigateToPreviousItem(),u("Navigating to previous help item",null))},{intent:I.NavNextItem,mode:E.HELP,action:()=>(V.navigateToNextItem(),u("Navigating to next help item",null))},{intent:I.NavPreviousItemJump,mode:E.HELP,action:()=>(V.jumpToPreviousItem(),u("Jumping to previous help item",null))},{intent:I.NavNextItemJump,mode:E.HELP,action:()=>(V.jumpToNextItem(),u("Jumping to next help item",null))},{intent:I.NavToPreviousContainer,mode:E.HELP,action:()=>(V.navigateToPreviousContainer(),u("Navigating to previous help container",null))},{intent:I.NavToNextContainer,mode:E.HELP,action:()=>(V.navigateToNextContainer(),u("Navigating to next help container",null))}];var eR=()=>{te(""),T({mode:E.DEFAULT})},tR=[{intent:I.Confirm,mode:E.IDENTITY,description:"[enter] claim the first",action:()=>{let[e]=Vo();return e?(T({mode:E.COMMAND_LINE}),te(`config emails ${e}`),u("Proposed claim",null)):u("Nothing left to claim",null)}},{intent:I.ExitCommandLine,mode:E.IDENTITY,action:()=>(eR(),u("Closed identity",null))},{intent:I.Exit,mode:E.IDENTITY,description:"[esc] close",action:()=>(eR(),u("Closed identity",null))}];var Pk=e=>{T({mode:E.COMMAND_LINE});let{pendingNavTarget:t}=Br();t&&V.navigate(t),Fr({pendingNavTarget:void 0}),te(`${e} `)},nR=()=>{te("");let{pendingNavTarget:e}=Br();e&&V.navigate(e),Fr({pendingNavTarget:void 0}),T({mode:E.DEFAULT})},rR=[{intent:I.InitCommandPalette,mode:E.DEFAULT,description:"[?] command palette",action:()=>{te("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=x();return Fr({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),T({mode:E.PALETTE}),u("Opening command palette",null)}},{intent:I.Confirm,mode:E.PALETTE,action:()=>{let{selectedNode:e}=x();if(!e||!xr(e))return l("Command only applicable on text nodes");if(e.props.disabled)return l("Command is not available in this context");let t=e.title;return t?(Pk(t),u("Selected command",t)):u("No command selected",null)}},{intent:I.ExitCommandLine,mode:E.PALETTE,action:()=>(nR(),u("Exiting palette",null))},{intent:I.Exit,mode:E.PALETTE,action:()=>(nR(),u("Closed command palette",null))},{intent:I.NavPreviousItem,mode:E.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(V.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:I.NavNextItem,mode:E.PALETTE,action:()=>(V.navigateToNextItem(),u("Navigating to next item",null))},{intent:I.NavToPreviousContainer,mode:E.PALETTE,action:()=>(V.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:I.NavToNextContainer,mode:E.PALETTE,action:()=>(V.navigateToNextContainer(),u("Navigating to next container",null))}];var oR=()=>{let e=Dr();if(!e)return u("Nothing to comment on here",null);let t=uc();if(!t||t.sha!==e)return l("The diff is still loading");let{selectedIndex:n}=x(),r=Math.max(0,n),o=vm(t.rows,Ym(e)??r,r);return o.ok?(T({mode:E.COMMAND_LINE}),te(`${C.COMMENT} ${Dv(o.value.start,o.value.end)} `),u("Commenting on a diff line",null)):l(o.reason)},sR=[{intent:I.InitCommandLine,mode:E.DEFAULT,description:"[:] write command",action:()=>(T({mode:E.COMMAND_LINE}),te(""),u("Entering command line mode",null))},...QS,...tR,...rR,{intent:I.AddItem,mode:E.DEFAULT,description:"[n] new...",action:()=>(T({mode:E.COMMAND_LINE}),te(`${C.NEW} `),u("Adding new item",null))},{intent:I.Delete,mode:E.DEFAULT,description:"[d] delete",action:()=>(T({mode:E.COMMAND_LINE}),te(`${C.DELETE} `),u("Deleting item",null))},{intent:I.Confirm,mode:E.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=x();if(!Ie(e?.id??"")?.length){let r=e?w.getAttachment(e.id):void 0;if(r)return JS(r);if(Dr())return oR();if(e?.title===Ae.DESCRIPTION)return T({mode:E.COMMAND_LINE}),te(`${C.EDIT} description `),u("Propose command",!0);if(e?.title===Ae.ASSIGNEES)return T({mode:E.COMMAND_LINE}),te(`${C.ASSIGN} `),u("Propose command",!0);if(e?.title===Ae.TAGS)return T({mode:E.COMMAND_LINE}),te(`${C.TAG} `),u("Propose command",!0);if(t.title===Ae.DESCRIPTION&&e?.context==="TEXT")return T({mode:E.COMMAND_LINE}),te(`${C.EDIT} description `),u("Propose command",!0)}return V.enterChildNode(),u("Entering context",null)}},{intent:I.OpenInEditor,mode:E.DEFAULT,action:()=>{let{selectedNode:e,contextNode:t}=x(),n=t.parentNodeId,o=!!n&&t.id===Pe(n,"diff")?e?.id:Dr()??void 0;return o?Di({sha:o}):u("Nothing here opens in an editor",null)}},{intent:I.MarkDiffLine,mode:E.DEFAULT,action:()=>{let e=Dr();if(!e)return u("Nothing to mark here",null);let{selectedIndex:t}=x(),n=Ym(e);return po(n===t?null:{sha:e,row:Math.max(0,t)}),u("Marked diff line",null)}},{intent:I.CommentOnDiffLine,mode:E.DEFAULT,action:()=>Dr()?oR():u("Nothing to comment on here",null)},{intent:I.Yank,mode:E.DEFAULT,description:"[y] yank",action:()=>{let{selectedNode:e}=x(),t=e?.title===Ae.DESCRIPTION?et.DESCRIPTION:e?.title===Ae.TAGS?et.TAGS:e?.title===Ae.ASSIGNEES?et.ASSIGNEES:et.REF,r=Ue(C.YANK).includes(t)?t:et.REF;return T({mode:E.COMMAND_LINE}),te(`${C.YANK} ${r}`),u("Propose command",!0)}},{intent:I.EditTitle,mode:E.DEFAULT,description:"[r] rename title",action:()=>(T({mode:E.COMMAND_LINE}),te(`${C.EDIT} title ${x().selectedNode?.title}`),u("Exiting context",null))},{intent:I.EditDescription,mode:E.DEFAULT,description:"[e] edit desc",action:()=>(T({mode:E.COMMAND_LINE}),te(`${C.EDIT} description `),u("Exiting context",null))},{intent:I.Exit,mode:E.DEFAULT,description:"[q] exit context",action:()=>(V.enterParentNode(),u("Exiting context",null))},{intent:I.NavPreviousItem,mode:E.DEFAULT,description:"[arrows/hjkl] navigate (shift x5)",action:()=>(V.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:I.NavNextItem,mode:E.DEFAULT,action:()=>(V.navigateToNextItem(),u("Navigating to next item",null))},{intent:I.NavPreviousItemJump,mode:E.DEFAULT,action:()=>(V.jumpToPreviousItem(),u("Jumping to previous item",null))},{intent:I.NavNextItemJump,mode:E.DEFAULT,action:()=>(V.jumpToNextItem(),u("Jumping to next item",null))},{intent:I.NavToPreviousContainer,mode:E.DEFAULT,action:()=>(V.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:I.NavToNextContainer,mode:E.DEFAULT,action:()=>(V.navigateToNextContainer(),u("Navigating to next container",null))}];var Ok=500,Dk=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),iR=e=>{let t=Dk(e);t&&Hl(n=>(n+t).slice(0,Ok))};var Bk=[E.COMMAND_LINE,E.PALETTE],Fk=e=>e==="edit title "?x().selectedNode?.title??"":"",_k=e=>[{intent:I.MoveCursorLeft,mode:e,action:()=>(Mm(-1),u("Moving cursor left",null))},{intent:I.MoveCursorRight,mode:e,action:()=>(Mm(1),u("Moving cursor right",null))},{intent:I.MoveCursorLeftOfWord,mode:e,action:()=>(Lm("left"),u("Moving cursor left of word",null))},{intent:I.MoveCursorRightOfWord,mode:e,action:()=>(Lm("right"),u("Moving cursor right of word",null))},{intent:I.AutoCompleteCommand,mode:e,action:()=>(Hl((t,{remainder:n})=>{let r=n?t+n:t;return r+Fk(r)}),u("Auto-completing command",null))},{intent:I.CaptureInput,mode:e,action:(t,{sequence:n})=>(iR(n??""),u("Capturing input",null))},{intent:I.EraseInput,mode:e,action:()=>(db(),u("Erasing input",null))},{intent:I.EraseInputWord,mode:e,action:()=>(ub(),u("Erasing input word",null))}],aR=[{intent:I.Confirm,mode:E.COMMAND_LINE,action:()=>(nn(),u("Executing command",null))},{intent:I.ViewHelp,mode:E.DEFAULT,action:()=>(T({mode:E.HELP}),u("Viewing help",null))},...Bk.flatMap(_k),{intent:I.ExitCommandLine,mode:E.COMMAND_LINE,action:()=>(gb(),T({mode:E.DEFAULT}),u("Exiting command line",null))},{intent:I.GetLastCommandFromHistory,mode:E.COMMAND_LINE,action:()=>(hb(),u("Getting last command from history",null))},{intent:I.GetNextCommandFromHistory,mode:E.COMMAND_LINE,action:()=>(yb(),u("Getting next command from history",null))}];var pp=e=>{let t=/^\[(.+?)\]\s*(.+)$/.exec(e);return t?{keys:t[1]??"",label:t[2]??""}:null},lR=({keys:e})=>e.length===1?0:1,cR=(e,t)=>{let n=new Set;for(let r of e)r.mode!==t||!r.description||n.add(r.description);return[...n].map(pp).filter(r=>r!==null).sort((r,o)=>lR(r)-lR(o))};function dR(e,t,n){let r=t[e];if(!r)return l("buildBreadCrumb(): current node not found");let o=[],s=new Set,i=r;for(;i&&!s.has(i.id)&&(o.push(i),s.add(i.id),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let c=o[o.length-1];return!c||c.id!==n?l("buildBreadCrumb(): node is not connected to root"):(o.reverse(),u("Breadcrumb built",o))}var uR=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t};var $t,fp,gp=new Set,hp=()=>{for(let e of gp)e()},jk=e=>(gp.add(e),()=>gp.delete(e));function yp(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return l("derive(): contextNodeId is missing");if(!r)return l("derive(): rootNode is missing");if(!o[r])return l("derive(): unable to find root node");let c=o[t];if(!c)return l("Unable to derive state, contextNode not found");let d=dR(t,o,r);if(a(d))return logger.error(d.message),d;let p=d.value,{context:m}=c,f=[...sR,...YS[m]??[],...aR],g=cR(f,n),h=uR(f),y=Uk(o,s),v=y[t]?.[e.selectedIndex]??null;return u("Derived successfully",{...e,contextNode:c,breadCrumb:p,availableHints:g,availableActions:f,actionIndex:h,selectedNode:v,renderedChildrenIndex:y})}var x=()=>{if(!$t)throw new Error("State not initialized. Call initWorkspaceState() first.");return $t},ve=()=>$t?u("Retrieved state",$t):l("State not initialized. Call initWorkspaceState() first.");mh(e=>$t?Nn($t.emailLinks,e):[]);function gi(e){fp=e;let t=ce(process.cwd()),n=!1;if(!a(t)){let s=St(t.value);if(a(s))return l(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},emailLinks:{},repos:Qd(),mode:E.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],replay:null,timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{},attachments:{}},o=yp(r);return a(o)?o:($t=o.value,hp(),u("State initialized",null))}var yo=!1,sa=null;function Be(e){let t=x(),n=e(t);if(yo)return n.nodes!==t.nodes&&($r=null),sa=n,$t={...t,...n},u("State updated",null);let r=yp(n);return a(r)?l(r.message??"Unable to update state"):($t=r.value,hp(),u("State updated",null))}function vl(e){if(yo)return u("Joined batch",e());yo=!0,sa=null,$r=new Set;let t=()=>{let n=sa;if(yo=!1,sa=null,n===null)return null;let r=yp(n);return a(r)?l(r.message??"Unable to update state"):($t=r.value,hp(),u("State updated",null))};try{let n=e(),r=t();return r&&a(r)?l(r.message):u("State updated",n)}finally{yo&&t()}}var Lb=()=>yo,T=e=>Be(t=>({...t,...e}));function vo(e,t,n){if(!yo)return Be(i=>({...i,[e]:{...i[e]??{},[t]:n}}));let r=x(),o=r[e]??{};if(e==="nodes"){let i=o[t],c=n;i?.parentNodeId&&$r?.add(i.parentNodeId),c.parentNodeId&&$r?.add(c.parentNodeId)}o[t]=n;let s={...r,[e]:o};return sa=s,$t={...r,...s},u("State updated",null)}var le=()=>$k(jk,x,x),$r=null,mR=null,Uk=(e,t)=>{let n=$t?.renderedChildrenIndex,r=n!==void 0&&$r!==null&&e===mR&&t.length===0&&$t?.filters.length===0,o;if(r){o={...n};let s=Nb(e,$r);for(let i of $r){let c=s[i];c?o[i]=c:delete o[i]}}else o=wb(e,t);return mR=e,$r=new Set,o},pe=e=>x()?.renderedChildrenIndex[e]??[],xn=()=>fp?gi(fp):l("Cannot reset state: no initial workspace found"),st=()=>$t!==void 0;var _t=(e,t)=>{let{nodes:n}=x(),r=n[e];if(!r)return l("Node not found");if(r.context===t)return u("Resolved ancestor node",r);let o=new Set([r.id]),s=r.parentNodeId?n[r.parentNodeId]:void 0;for(;s&&!o.has(s.id);){if(s.context===t)return u("Resolved ancestor node",s);o.add(s.id),s=s.parentNodeId?n[s.parentNodeId]:void 0}return l(`No ancestor found for context: ${t}`)},vp=(e,t)=>{let{nodes:n}=x(),r=new Set,o=n[e];for(;o?.parentNodeId&&!r.has(o.id);){if(o.parentNodeId===t)return!0;r.add(o.id),o=n[o.parentNodeId]}return!1},jr=(e,t)=>e?e.readonly?l({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:l("Node not found"),w={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return l("Contributor not found");if(n.userId&&n.userId!==t)return l("Contributor is already linked to another user");let r={...n,userId:t},o=Be(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?l("Unable to link contributor to user"):u("Linked contributor to user",r)},deleteNode(e){w.deleteNodes([e])},deleteNodes(e){e.length!==0&&Be(t=>{let n={...t.nodes};for(let r of e)delete n[r];return{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return l("Unable to create comment, missing issue");if(!$(t))return l("Can only comment on issues");let n=vo("comments",e.id,{...e,deleted:!1});return a(n)?l("Unable to create comment"):u("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return l("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return l("Unable to edit comment, missing issue");if(!$(r))return l("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=vo("comments",e,o);return a(s)?l("Unable to edit comment"):u("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return l("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=vo("comments",e,n);return a(r)?l("Unable to delete comment"):u("Deleted comment",n)},getComment(e){return x().comments?.[e]},getCommentsByIssue(e){return Object.values(x().comments??{}).filter(t=>t.issue===e&&!t.deleted)},getCommentsGroupedByIssue(){let e=new Map;for(let t of Object.values(x().comments??{})){if(t.deleted)continue;let n=e.get(t.issue);n?n.push(t):e.set(t.issue,[t])}return e},createAttachment(e){let t=this.getNode(e.issue);if(!t)return l("Unable to create attachment, missing issue");if(!$(t))return l("Can only attach to issues");let n=Be(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?l("Unable to create attachment"):u("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return l("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=Be(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return a(r)?l("Unable to delete attachment"):u("Deleted attachment",n)},getAttachment(e){return x().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(x().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},getAttachmentsGroupedByIssue(){let e=new Map;for(let t of Object.values(x().attachments??{})){if(t.deleted)continue;let n=e.get(t.issue);n?n.push(t):e.set(t.issue,[t])}return e},editValue(e,t){let{nodes:n}=x(),r=n[e];if(!r)return l("Edit target node not found");let o=jr(r,"edit");if(o)return o;let s={...r,props:{...r.props,description:t}};return this.updateNode(s),u("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return l("Rename target node not found");let r=jr(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),u("Renamed node",o)},getExistingTags(){let{tags:e}=x();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=x();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return Ie(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=x(),o=this.getNode(e),s=this.getNode(t);if(!o)return l("Node not found");if(!s)return l("Target parent not found");if(r===e)return l("Cannot move root node");if(e===t)return l("Cannot move node into itself");let i=jr(o,"move");if(i)return i;if(vp(t,e))return l("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),u("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=x(),o=this.getNode(e);if(!o)return l("Node not found");if(r===e)return l("Cannot delete root node");let s=jr(o,"delete");if(s)return s;let i=new Set,c=p=>{let m=t[p];if(!(!m||i.has(p))){i.add(p);for(let f of Ie(m.id))c(f.id)}};c(e);let d={...structuredClone(t)};for(let p of i){if(!d[p])return l("Unable to locate node to delete");d[p]={...d[p],isDeleted:!0}}return n?(T({nodes:d}),u("Successfully tomb stoned",o)):l("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return l("Contributor not found");let n={...t,name:Uo,tombstoned:!0},r=Be(o=>({...o,contributors:{...o.contributors,[e]:n}}));return a(r)?l("Unable to remove contributor"):u("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return l("Contributor not found");if(n.tombstoned)return l("Cannot rename a removed contributor");let r={...n,name:t},o=Be(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?l("Unable to rename contributor"):u("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return l("Contributor not found");let r={...n,name:t,tombstoned:!1},o=Be(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?l("Unable to restore contributor"):u("Restored contributor",r)},linkContributorEmail({email:e,contributor:t,authorId:n}){if(!this.getContributor(t))return l("Unable to link email, missing contributor");let r={email:ot(e),contributor:t,authorId:n},o=Qs(r.email,t),s=x().emailLinks[o];if(s&&!s.tombstoned)return u("Email already linked",s);let i=Be(c=>({...c,emailLinks:{...c.emailLinks,[o]:r}}));return a(i)?l("Unable to link email"):u("Linked email to contributor",r)},unlinkContributorEmail(e,t,n){let r=Qs(e,t),o=x().emailLinks[r];if(!o)return l("Unable to unlink, no such link");if(o.tombstoned)return u("Email already unlinked",o);if(!Za(n,o))return l("Only the author of a link or the contributor it names may remove it");let s={...o,tombstoned:!0},i=Be(c=>({...c,emailLinks:{...c.emailLinks,[r]:s}}));return a(i)?l("Unable to unlink email"):u("Unlinked email from contributor",s)},getEmailLinks(){return x().emailLinks},createContributor(e){let t=Be(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?l("Unable to create contributor"):u("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return l("Unable to assign contributor, missing contributor");if(!r)return l("Unable to assign contributor, missing target");let o=jr(r,"edit");if(o)return o;if(!$(r))return l("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return l("Contributor already assigned");let i={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(i),u("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return l("Unable to unassign, missing contributor");if(!r)return l("Unable to unassign, missing target");let o=jr(r,"edit");if(o)return o;if(!$(r))return l("Target is not an issue");let s=r.props.assignees??[];if(!s.includes(t))return u("Issue is not assigned to that contributor",{assignee:t});let i={...r,props:{...r.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(i),u("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return l("Unable to add tag, missing tag");if(!r)return l("Unable to add tag, missing target");let o=jr(r,"edit");if(o)return o;if(!$(r))return l("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return l("Tag already assigned");let i={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(i),u("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),r=this.getNode(e);if(!n)return l("Unable to remove tag, missing tag");if(!r)return l("Unable to remove tag, missing target");let o=jr(r,"edit");if(o)return o;if(!$(r))return l("Target is not an issue");let s=r.props.tags??[];if(!s.includes(t))return u("Issue is not tagged with that tag",{tag:t});let i={...r,props:{...r.props,tags:s.filter(c=>c!==t)}};return this.updateNode(i),u("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return l("Tag not found");let n={...t,tombstoned:!0},r=Be(o=>({...o,tags:{...o.tags,[e]:n}}));return a(r)?l("Unable to delete tag"):u("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return l("Tag not found");let r={...n,name:t,tombstoned:!1},o=Be(s=>({...s,tags:{...s.tags,[e]:r}}));return a(o)?l("Unable to restore tag"):u("Restored tag",r)},createTag(e){let t=Be(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?l("Could not create tag"):u("Tag created",e)},createNode(e){let t=vo("nodes",e.id,e);return a(t)?l("Unable to create node"):u("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return l("Failed to locate node");let n={...t,readonly:!0},r=vo("nodes",e,n);return a(r)?l(r.message):u("Locked node",n)},updateNode(e){let t=vo("nodes",e.id,e);return a(t)?t:u("Updated node",e)},getContributor(e){return x().contributors[e]},getTag(e){let t=x().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return x().tags[e]},getTags(){return Object.values(x().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return x().nodes[e]},getSiblings(e){return Ie(e)}};var Hk=(e,t)=>e+" ".repeat(Math.max(0,t-pR(e))),Wk=(e,t)=>" ".repeat(Math.max(0,t-pR(e)))+e,Mc=e=>({"add.issue":"Created with title","add.issue.assignee":"Assigned to","remove.issue.assignee":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","add.issue.tag":"Tagged with","remove.issue.tag":"Removed tag","lock.node":"Locked node","move.node":"Moved issue","add.issue.comment":"Commented","delete.issue.comment":"Deleted comment","add.issue.attachment":"Attached","delete.issue.attachment":"Removed attachment","edit.issue.comment":"Edited comment","init.workspace":"Created workspace","add.workspace":"Created workspace","add.board":"Created board","add.swimlane":"Created swimlane","add.field":"Added field","create.tag":"Created tag","tombstone.tag":"Deleted tag","restore.tag":"Restored tag","create.contributor":"Added contributor","rename.contributor":"Renamed contributor","link.contributor.user":"Linked contributor","link.contributor.email":"Claimed","unlink.contributor.email":"Unclaimed","connect.repo":"Connected repo","edit.repo":"Edited repo","disconnect.repo":"Disconnected repo","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),Gk=(e,t)=>t?e<t?"up":e>t?"down":null:null,Vk=(e,t)=>{let n=w.getNode(e.payload.parent),r=n?Ur.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=Gk(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},fR=e=>`${Math.max(1,Math.round(e/1024))} KB`,gR=e=>w.getAttachment(e)?.name??"",zk=e=>{switch(e.action){case"add.issue.tag":{let t=x().tags[e.payload.tag];return t?Ur.bgHex(Ze(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=x().tags[e.payload.tag];return t?Ur.bgHex(Ze(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=x().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=x().contributors[e.payload.assignee];return t?Ur.hex(Ze(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=x().contributors[e.payload.assignee];return t?Ur.hex(Ze(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;case"link.contributor.email":case"unlink.contributor.email":return e.payload.email;case"connect.repo":case"edit.repo":case"disconnect.repo":return Js(e);case"add.issue.attachment":return`"${e.payload.name}" ${Ur.dim(`(${fR(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=gR(e.payload.id);return t?`"${t}"`:""}default:return""}},Kk=e=>{let t=kr(je(e));return Ur.gray(Wk(t,8))},qk=12,Yk=e=>Hk(`${e}`,qk),Xk=e=>{let t=ve();return a(t)?e:Ja(e,t.value.contributors[e]?.name)},Jk=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=x().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=x().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=x().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"edit.title":return"name"in e.payload?`"${e.payload.name}"`:"";case"link.contributor.email":case"unlink.contributor.email":return e.payload.email;case"connect.repo":case"edit.repo":case"disconnect.repo":return Js(e);case"move.node":{let t=w.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${fR(e.payload.bytes)})`;case"delete.issue.attachment":{let t=gR(e.payload.id);return t?`"${t}"`:""}default:return""}},Ec=e=>[Mc(e.action),Jk(e)].filter(Boolean).join(" "),hR=(e,t)=>{let n=Kk(e.id),r=Yk(Xk(e.userId)),o=Ur.dim("\u203A"),s=e.action==="move.node"?Vk(e,t):[Mc(e.action),zk(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var Zk=e=>Pe(e,"comments"),Qk=e=>Pe(e,"description"),eP=e=>Pe(e,"assignees"),tP=e=>Pe(e,"tags"),nP=e=>Pe(e,"history"),rP=e=>Pe(e,"diff"),oP=e=>Pe(e,"attachments"),ia=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=w.getNode(e);if(!c){let m=w.createNode({...we.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:i});return a(m)?m:u("Virtual field created",void 0)}if(!mt(c))return l(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==r||c.props.value!==o||c.readonly!==s||c.childRenderAxis!==i))return u("Virtual field unchanged",void 0);let p=w.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:i});return a(p)?p:u("Virtual field updated",void 0)},yR=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let i=w.getNode(e);if(!i){let p=w.createNode({...we.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return a(p)?p:u("Virtual field list created",void 0)}if(!ti(i))return l(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==r||i.readonly!==o||i.childRenderAxis!==s))return u("Virtual field list unchanged",void 0);let d=w.updateNode({...i,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return a(d)?d:u("Virtual field list updated",void 0)},Lc=null,sP=()=>{if(Lc)return u("Virtual field ranks",Lc);let e=Gt(fn/4n),t=Gt(fn/2n),n=Gt(fn*3n/4n),r=Gt(fn*7n/8n),o=Gt(fn*15n/16n),s=Gt(fn*13n/16n),i=Gt(fn*27n/32n);return a(e)?e:a(t)?t:a(n)?n:a(r)?r:a(o)?o:a(s)?s:a(i)?i:(Lc={description:e.value,assignees:t.value,tags:n.value,comments:r.value,attachments:o.value,log:s.value,diff:i.value},u("Virtual field ranks",Lc))},vy=e=>{let t=sP();if(a(t))return t;let n=t.value,r=ia({id:Qk(e.id),name:Ae.DESCRIPTION,parentNodeId:e.id,rank:n.description,value:e.props.description??"",childRenderAxis:"vertical"});if(a(r))return r;let o=yR({id:eP(e.id),name:Ae.ASSIGNEES,parentNodeId:e.id,rank:n.assignees,readonly:!0});if(a(o))return o;let s=yR({id:tP(e.id),name:Ae.TAGS,parentNodeId:e.id,rank:n.tags,readonly:!0});if(a(s))return s;let i=ia({id:Zk(e.id),name:Ae.COMMENTS,parentNodeId:e.id,rank:n.comments,value:"",readonly:!1,childRenderAxis:"vertical"});if(a(i))return i;let c=ia({id:oP(e.id),name:Ae.ATTACHMENTS,parentNodeId:e.id,rank:n.attachments,value:"",readonly:!0,childRenderAxis:"vertical"});if(a(c))return c;let d=ia({id:nP(e.id),name:Ae.HISTORY,parentNodeId:e.id,rank:n.log,value:iP(e),readonly:!0,childRenderAxis:"vertical"});if(a(d))return d;let p=ia({id:rP(e.id),name:Ae.DIFF,parentNodeId:e.id,rank:n.diff,value:"",readonly:!0,childRenderAxis:"vertical"});return a(p)?p:u("Ticket virtual nodes materialized",void 0)},iP=e=>{let t=[...e.log].reverse(),n=new Map;for(let r of t){let o=n.get(r.action)??[];o.push(r.payload),n.set(r.action,o)}return t.map(r=>hR(r,n.get(r.action)??[])).join(`
110
- `)},vR=!0,bR=e=>{vR=e},Bu=()=>vR;import q0 from"node:http";import wo from"node:path";import{fileURLToPath as Y0}from"node:url";var aP=e=>{switch(e.action){case"add.issue":case"move.node":case"close.issue":case"reopen.issue":return e.payload.parent;default:return null}},bp=(e,t)=>{let n=[];for(let r of e){let o=aP(r);if(o===null||o===n.at(-1)?.laneId)continue;let s=vr(r);n.push({laneId:o,enteredAt:s===null?t:Zs(s)})}return n},kc=(e,t)=>bp(e,t).at(-1)?.enteredAt??t;var lP=e=>e.payload??{},xp=e=>{let t=new Map,n={},r=new Set,o=new Set,s=new Set;for(let i of e){let{id:c,name:d}=lP(i);if(c)switch(i.action){case"create.contributor":case"create.tag":t.set(c,d??""),r.add(c),o.delete(c);break;case"rename.contributor":d!==void 0&&r.has(c)&&!o.has(c)&&t.set(c,d);break;case"tombstone.contributor":r.has(c)&&(t.set(c,Uo),o.add(c));break;case"restore.contributor":case"restore.tag":d!==void 0&&r.has(c)&&(t.set(c,d),o.delete(c));break;case"add.board":d!==void 0&&(t.set(c,d),s.add(c));break;case"add.swimlane":d!==void 0&&(t.set(c,d),s.add(c),n[c]=d);break;case"edit.title":d!==void 0&&s.has(c)&&(t.set(c,d),c in n&&(n[c]=d));break;default:break}}return{byId:t,lanes:n}};var cP=e=>{let t=new Map,n=new Map;for(let r of e){let o=r.payload;!o?.id||!o.parent||(r.action==="move.node"&&t.set(r.id,n.get(o.id)),n.set(o.id,o.parent))}return t},SR=e=>{let t=e.payload;return e.action==="tombstone.tag"||e.action==="restore.tag"?t?.id:t?.tag},dP=e=>{let t=new Set,n=new Map;for(let r of e){let o=r.payload,s=o?.id;s&&(r.action==="add.issue"&&t.add(s),o.parent&&n.set(s,o.parent))}return{issueIds:t,parentById:n}},uP=(e,{issueIds:t,parentById:n})=>{let r=e.payload;if(r?.issue)return r.issue;let o=new Set,s=r?.id;for(;s!==void 0&&!o.has(s);){if(t.has(s))return s;o.add(s),s=n.get(s)}return null},mP=new Set(["add.issue.comment","edit.issue.comment","delete.issue.comment"]),pP=e=>mP.has(e.action)?e.payload?.id??null:null,fP=new Set(["add.issue","move.node","close.issue","reopen.issue"]),gP=(e,t)=>{let n=new Map;return e.map((r,o)=>{let s=t[o]??null;if(s===null)return{lane:null,laneBefore:null};let i=r.payload,c=null;if(fP.has(r.action)&&i?.id===s&&i.parent){let d=n.get(s);d!==void 0&&d!==i.parent&&(c=d),n.set(s,i.parent)}return{lane:n.get(s)??null,laneBefore:c}})},xR=90,hP=e=>{let t=e.trim().split(`
111
- `)[0]?.trim()??"";return t.length>xR?`${t.slice(0,xR).trimEnd()}\u2026`:t},yP=(e,t,n)=>{let r=e.payload,o=SR(e),s=e.action?Mc(e.action):"";if(r?.md!==void 0){let c=hP(r.md);return c?`${s}: ${c}`:s}if(e.action==="move.node"&&r?.parent){let c=t.get(r.parent);return c?n.get(e.id)===r.parent?`Moved within ${c}`:`Moved to ${c}`:s}if(ru(e.action))return[s,Js(e)].filter(Boolean).join(" ");let i=o!==void 0?t.get(o)??"":r?.assignee!==void 0?t.get(r.assignee)??"":r?.email!==void 0?r.email:r?.name!==void 0?`"${r.name}"`:"";return[s,i].filter(Boolean).join(" ")},Sp=(e,t)=>e?Qe(e,t.get(e)):null,vP=(e,t)=>{let n=e.payload;return{actor:Sp(e.userId,t),tag:Sp(SR(e),t),assignee:Sp(n?.assignee,t)}},RR=e=>{let t=new Map,n=new Set,r=o=>{let s=new Set,i=o;for(;i&&!s.has(i);){if(n.has(i))return i;s.add(i),i=t.get(i)}return null};return e.map(o=>{let s=o.payload,i=s?.id;if(!i)return null;o.action==="add.board"&&n.add(i);let c=o.action==="close.issue"?r(i):null,d=s.parent??s.issue;return d&&t.set(i,d),c!==null?c:n.has(i)?i:r(i)})},ER=e=>bP.has(e),bP=new Set(["create.contributor","rename.contributor","tombstone.contributor","restore.contributor","link.contributor.user","link.contributor.email","unlink.contributor.email","connect.repo","edit.repo","disconnect.repo"]),IR=(e,t)=>{let n=RR(e);return e.filter((r,o)=>n[o]===t)},xP=(e,t=new Map)=>{let n=new Map([...t,...xp(e).byId]),r=cP(e),o=dP(e),s=e.map(m=>uP(m,o)),i=gP(e,s),c=RR(e),d=$o(e.map(m=>vr(m)));return e.flatMap((m,f)=>{let g=d[f]??null;return g===null?[]:[{id:m.id,t:g,action:m.action,label:yP(m,n,r),issue:s[f]??null,target:pP(m),...i[f],board:c[f]??null,...vP(m,n)}]}).sort((m,f)=>m.t-f.t)},SP=e=>{let t=new Map;for(let r of e){if(r.issue===null||r.lane===null)continue;let o=t.get(r.issue)??[],s=o[o.length-1];(s===void 0||s.lane!==r.lane)&&(o.push({t:r.t,lane:r.lane,board:r.board}),t.set(r.issue,o))}let n=new Map;for(let[r,o]of t){let s=o[o.length-1];n.set(r,{changes:o,from:o[0].t,closedFrom:s.lane===Se?s.t:null})}return n},RP=(e,t)=>{let n=0,r=e.length;for(;n<r;){let o=n+r>>1;e[o].t<t?n=o+1:r=o}return e[n-1]},CR=(e,t,n)=>{let r={};for(let[o,s]of e){if(s.from>=t||s.closedFrom!==null&&s.closedFrom<t)continue;let i=RP(s.changes,t);i===void 0||i.lane===Se||n&&i.board!==n||(r[o]=i.lane)}return r},EP=e=>xp(e).lanes,aa=null,wR=e=>{let t=Ke(e);if(aa&&aa.root===e&&aa.signature===t)return u("Timeline entries, cached",aa.index);let n=On(e);if(a(n))return l(n.message);let r=xP(n.value,wr(e)),o={entries:r,lanes:SP(r),laneNames:EP(n.value)};return aa={root:e,signature:t,index:o},u("Timeline entries, built",o)};var NR=1e5,IP=2e4,Pc=null,AR=Promise.resolve(),Vn=e=>{let t=AR.then(e,e);return AR=t.then(()=>{},()=>{}),t},Oc=e=>{let t=pt(e);return a(t)?t:me({repoRoot:t.value})},nt=()=>{if(!st())return{mode:"live",asOfTime:null};let{timeMode:e}=x();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:Pc}},TR=(e,t)=>{let n=0,r=e.length;for(;n<r;){let o=n+r>>1;e[o].t<t?n=o+1:r=o}return n},MR=async(e={})=>{let t=Oc(e.repoRoot);if(a(t))return l(t.message);let n=wR(t.value);if(a(n))return l(n.message);let r=n.value.entries,o=Date.now(),s=e.end??o,i=e.start??r[0]?.t??s;if(s<=i)return u("Empty time window",{bucketMs:0,buckets:[],capped:!1,events:[],lanesAtStart:{},laneNames:n.value.laneNames,closedLane:Se,earliest:i,latest:s});let c=TR(r,i),d=TR(r,s),p=r.slice(c,d).filter(v=>!e.boardId||v.board===e.boardId||ER(v.action)),m=p.map(v=>v.t),f=Math.max(1,Math.ceil((s-i)/NR)),g=new Map;for(let v of m){let R=Math.min(NR-1,Math.floor((v-i)/f)),S=i+R*f;g.set(S,(g.get(S)??0)+1)}let h=[...g.entries()].sort(([v],[R])=>v-R).map(([v,R])=>({t:v,count:R})),y=p.length>IP;return u("Computed event timeline",{bucketMs:f,buckets:h,capped:y,events:y?[]:p,lanesAtStart:CR(n.value.lanes,i,e.boardId),laneNames:n.value.laneNames,closedLane:Se,earliest:i,latest:s})},LR=e=>{let t=On(e);if(a(t))return l(t.message);let n=xn();if(a(n))return l(n.message);Pc=null;let r=mn(t.value),{fatal:o,skipped:s}=kn(r);return o.length>0?l(o.map(i=>i.message).join(", ")):(Pn(s),T({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Restored live state",!0))},CP=(e,t)=>{Pc=null;let n=LR(e);return a(n)?l(`${t} (recovery to live also failed: ${n.message})`):l(t)},Rp=e=>Vn(async()=>{let t=Oc(e.repoRoot);if(a(t))return l(t.message);let n=bl(t.value,e.targetTime);if(a(n))return l(n.message);let{appliedEvents:r,unappliedEvents:o}=n.value,s=xn();if(a(s))return s;let i=mn(r),{fatal:c,skipped:d}=kn(i);return c.length>0?CP(t.value,c.map(p=>p.message).join(", ")):(Pn(d),T({readOnly:!0,timeMode:"peek",unappliedEvents:o,replay:null}),Pc=e.targetTime,u("Checked out historical state",{asOfTime:e.targetTime}))}),kR=async e=>{let t=Oc(e.repoRoot);if(a(t))return l(t.message);let n=xl(t.value);if(a(n))return l(n.message);let r=n.value.get(e.eventId)??null;return r===null?l("Event not found in the log"):Rp({repoRoot:e.repoRoot,targetTime:r+1})},PR=(e={})=>Vn(async()=>{let t=Oc(e.repoRoot);if(a(t))return l(t.message);let n=LR(t.value);return a(n)?l(n.message):u("Returned to live state",!0)});import NP from"node:fs";var OR=new Map,wP=3e4,DR=async e=>{let t=OR.get(e);if(t&&Date.now()-t.readAt<wP)return{name:t.name,email:t.email};let n=await ke({args:["config","--get-regexp","^user\\.(name|email)$"],cwd:e}),r=null,o=null;if(n.exitCode===0)for(let s of(n.stdout??"").split(`
112
- `)){let i=s.indexOf(" ");if(i===-1)continue;let c=s.slice(0,i),d=s.slice(i+1);c==="user.name"&&(r=d.trim()||null),c==="user.email"&&(o=ot(d)||null)}return OR.set(e,{name:r,email:o,readAt:Date.now()}),{name:r,email:o}},Dc=async e=>(await DR(e)).email,Hr=async e=>(await DR(e)).name;var bo=e=>{let t=ce(e??process.cwd());return a(t)?l(t.message):u("Resolved Epiq repo root",t.value)},Bc=null,AP=async(e,t)=>{let n=bo(e);if(a(n))return n;let r=me({repoRoot:n.value});if(a(r))return l(r.message);let o=$e(n.value);if(a(o))return l(o.message);if(!(Bc!==null&&Bc.repoRoot===n.value&&Bc.stateBranchRoot===r.value&&NP.existsSync(Yr(r.value)))){let f=await Wi({repoRoot:n.value,stateBranchName:o.value});if(a(f))return l(f.message);let g=await Mr({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(a(g))return l(g.message);Bc={repoRoot:n.value,stateBranchRoot:r.value}}if(t?.pull??!1){let f=await U({cwd:r.value,args:["pull","--ff-only"]});a(f)&&G.info(3,f.message)}let i={repoRoot:n.value,stateBranchRoot:r.value},c=Et();a(c)||ze(c.value),ze({gitEmail:await Dc(n.value),gitName:await Hr(n.value)});let d=Ke(r.value);if(Xo(r.value)===d&&st()&&nt().mode==="live")return u("Booted Epiq state, unchanged",i);let p=pn(r.value);if(a(p))return l(p.message);let m=gn(p.value.events,p.value.unreadable);return a(m)?l(m.message):(Jo(r.value,d),u("Booted Epiq state",i))},rn=()=>{let e=Et();return a(e)?l(e.message):e.value.userId?e.value.userName?u("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):l("Unable to retrieve user name"):l("Unable to retrieve user id")},bt=()=>{let e=ve();return a(e)?l(e.message):e},zt=e=>AP(e,{pull:!1}),ue=async e=>{let t=await zt(e);if(a(t))return t;let n=rn();if(a(n))return n;let r=bt();return a(r)?r:u("Booted",{boot:t.value,actor:n.value,state:r.value})};var TP=e=>{let t=w.getNode(e);if(!t)return[];let n=new Set;t.parentNodeId&&n.add(t.parentNodeId);for(let r of t.log??[]){let o=r.payload;o.id===e&&o.parent&&n.add(o.parent)}return[...n]},Fc=e=>{let t=new Set;e.parentNodeId&&t.add(e.parentNodeId);for(let r of e.log??[]){let o=r.payload;o.id===e.id&&o.parent&&t.add(o.parent)}let n=new Set;for(let r of t)for(let o of TP(r))n.add(o);return[...n]},Es=e=>Tn(e).map(t=>Qe(t.id,t.name));var Is=e=>Mn(e).map(({id:t,name:n})=>Qe(t,n));import MP from"node:fs";import LP from"node:path";import{ulid as Ip}from"ulid";var it=e=>{let t=bt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Issue not found"):$(n)?n.readonly?l("Issue is readonly"):u("Found issue",n):l("Target must be an issue")},Wr=e=>{let t=bt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Swimlane not found"):An(n)?n.readonly?l("Swimlane is readonly"):u("Found swimlane",n):l("Target must be a swimlane")},Ep=e=>{let t=bt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Board not found"):Sr(n)?n.readonly?l("Board is readonly"):u("Found board",n):l("Target must be a board")};var kP=e=>{if(e.filePath)try{return u("Read attachment file",{data:MP.readFileSync(e.filePath),name:e.name??LP.basename(e.filePath)})}catch(t){return l(`Unable to read ${e.filePath}: ${t instanceof Error?t.message:String(t)}`)}return e.dataBase64?u("Decoded attachment data",{data:Buffer.from(e.dataBase64,"base64"),name:e.name??"image"}):l("Provide either filePath or dataBase64")},_c=()=>{let e=Et();return a(e)?Ln:e.value.attachmentMaxKb??Ln},Cp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=it(e.issueId);if(a(n))return n;let r=kP(e);if(a(r))return r;let o=Lh(t.value.boot.stateBranchRoot,r.value.data,_c());if(a(o))return o;let s=ye(r.value.name).trim()||"image",i=Ip(),c={id:Ip(),...B(t.value.actor),action:"add.issue.attachment",payload:{id:i,issue:e.issueId,author:t.value.actor.userId,hash:o.value.hash,ext:o.value.ext,name:s,bytes:o.value.bytes}},d=F([c],t.value.boot.stateBranchRoot);if(a(d))return l(d.message);let p=no(o.value.hash,o.value.ext);return u("Added issue attachment",{id:i,issueId:e.issueId,fileName:p,bytes:o.value.bytes,markdown:hu(s,p)})},wp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(c=>c.action==="add.issue.attachment"&&c.payload.id===e.attachmentId);if(!n)return l("Unable to resolve attachment");if(n.payload.author!==t.value.actor.userId)return l("You can only delete your own attachments");let r=it(n.payload.issue);if(a(r))return r;if(t.value.state.eventLog.some(c=>c.action==="delete.issue.attachment"&&c.payload.id===e.attachmentId))return u("Attachment already deleted",{id:e.attachmentId,issueId:n.payload.issue});let s={id:Ip(),...B(t.value.actor),action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:n.payload.issue}},i=F([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Deleted issue attachment",{id:e.attachmentId,issueId:n.payload.issue})},Np=async e=>{let t=await zt(e.repoRoot);return a(t)?t:kh(t.value.stateBranchRoot,e.fileName,_c())};var PP=365*24*60*60*1e3,Ap=e=>{let t=bt();if(a(t))return t;let n=t.value.nodes[e];return u("Issue description",n&&$(n)&&!n.isDeleted?n.props.description??"":"")},xo=()=>{let e=bt();if(a(e))return e;let t=nt(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(v=>Sr(v)&&!v.isDeleted),s=Date.now()-PP,i=new Map,c=new Map;for(let v of r)if(!v.isDeleted){if(An(v)&&v.parentNodeId){let R=i.get(v.parentNodeId)??[];R.push(v),i.set(v.parentNodeId,R)}if($(v)&&v.parentNodeId){if(v.parentNodeId===Se&&je(v.id)<s)continue;let R=c.get(v.parentNodeId)??[];R.push(v),c.set(v.parentNodeId,R)}}let d=new Set;for(let v of c.values())for(let R of v)d.add(R.id);let p=Et();if(a(p))return p;let m={},f=w.getCommentsGroupedByIssue();for(let v of r.filter($))v.isDeleted||!d.has(v.id)||(m[v.id]=(f.get(v.id)??[]).map(R=>{let S=w.getContributor(R.authorId);return{id:R.id,issueId:R.issue,body:R.md,author:Qe(R.authorId,S?.name),createdAt:je(R.id)}}));let g=new Map;for(let v of e.value.eventLog)v.action==="add.issue.attachment"&&g.set(v.payload.id,v.payload.author);let h={},y=w.getAttachmentsGroupedByIssue();for(let v of r.filter($))v.isDeleted||!d.has(v.id)||(h[v.id]=(y.get(v.id)??[]).map(R=>({id:R.id,issueId:R.issue,name:R.name,fileName:no(R.hash,R.ext),bytes:R.bytes,createdAt:je(R.id),canDelete:g.get(R.id)===p.value.userId})));return u("Retrieved Epiq GUI state",{boards:o.sort((v,R)=>v.rank.localeCompare(R.rank)).map(v=>({id:v.id,ref:z(v.id),title:v.title,readonly:!!v.readonly||n,swimlanes:(i.get(v.id)??[]).sort((R,S)=>R.rank.localeCompare(S.rank)).map(R=>({id:R.id,title:R.title,readonly:!!R.readonly||n,issues:(c.get(R.id)??[]).sort((S,N)=>S.rank.localeCompare(N.rank)).map(S=>({id:S.id,ref:z(S.id),title:ye(S.title),description:S.props.description??"",createdAt:je(S.id),enteredLaneAt:kc(S.log??[],je(S.id)),readonly:!!S.readonly||n,tags:Es(S),assignees:Is(S),parentNodeId:S.parentNodeId,isClosed:S.parentNodeId===Se,boardIds:Fc(S)})),parentNodeId:R.parentNodeId}))})),tags:w.getTags().map(v=>({...v,...Qe(v.id,v.name)})),contributors:Object.values(e.value.contributors).map(v=>({...v,...Qe(v.id,v.name)})),user:{id:p.value.userId??"",name:p.value.userName??"",color:Ze(p.value.userName??"")},commentsByIssueId:m,attachmentsByIssueId:h,attachmentMaxKb:_c(),timeTravel:t})},BR=null,OP=e=>{if(e===BR)return;let t=tl({root:e});if(a(t)){G.info(t.message);return}BR=e},on=async(e={})=>{if(nt().mode!=="live")return xo();let t=await zt(e.repoRoot);return a(t)?t:(OP(t.value.repoRoot),xo())},la=async(e={})=>{ls();let t=bo(e.repoRoot);if(a(t))return l("Sync failed");let n=rn();if(a(n))return n;let r=await Zl({cwd:t.value,ownEventFileName:Ir(n.value)});return a(r)?(Dm(r.message),r):(co(),u("Synced",r.value))};import{ulid as sn}from"ulid";var ca=e=>{let t=[...new Set([...e.issueIds??[],...e.issueId?[e.issueId]:[]])];return t.length?u("Resolved targets",t):l("Provide issueId or issueIds")},Cs=(e,t)=>{let n=t.done.length,r=`${e} ${n} issue${n===1?"":"s"}`+(t.failed.length?`, ${t.failed.length} failed`:"");return n?u(r,t):l(`${r}: ${t.failed.map(o=>`${o.ref} ${o.reason}`).join("; ")}`)},da=(e,t)=>{let n={done:[],failed:[]};for(let r of e){let o=t(r);a(o)?n.failed.push({id:r,ref:z(r),reason:o.message}):n.done.push({id:r,ref:z(r)})}return n};var $R=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase();async function Lp(e){let t=await zt(e.repoRoot);if(a(t))return t;let n=bt();if(a(n))return n;let r=n.value.nodes,o=e.query?.trim().toLowerCase(),s=Object.values(r).filter($).filter(c=>!c.isDeleted).filter(c=>e.includeClosed||c.parentNodeId!==Se).filter(c=>e.boardId?(c.parentNodeId?r[c.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).filter(c=>!e.swimlaneId||c.parentNodeId===e.swimlaneId).filter(c=>!e.tag||Es(c).some(d=>$R(d.name,e.tag))).filter(c=>!e.assignee||Is(c).some(d=>$R(d.name,e.assignee))).filter(c=>!o||c.title.toLowerCase().includes(o)||(c.props.description??"").toLowerCase().includes(o)),i=c=>ye((c.parentNodeId?r[c.parentNodeId]?.title:void 0)??"");return e.brief?u("Listed issues",s.map(c=>({id:c.id,ref:z(c.id),title:ye(c.title),swimlane:i(c),tags:Es(c).map(d=>d.name),assignees:Is(c).map(d=>d.name)}))):u("Listed issues",s.map(c=>({id:c.id,ref:z(c.id),title:ye(c.title),description:c.props.description??"",createdAt:je(c.id),enteredLaneAt:kc(c.log??[],je(c.id)),parentNodeId:c.parentNodeId,isClosed:c.parentNodeId===Se,boardIds:Fc(c),readonly:!!c.readonly,tags:Es(c),assignees:Is(c)})))}var kp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=ye(e.title);if(!n)return l("Issue title cannot be empty");let r=e.description??"",o=ft("Issue title",n,300)??ft("Issue description",r,2e4);if(o)return l(o);if((e.tagNames?.length??0)>20)return l(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return l(`Cannot set more than ${20} assignees at once`);let s=Wr(e.parentId);if(a(s))return s;let i=ir(e.parentId,t.value.actor,t.value.boot.stateBranchRoot);if(a(i))return i;let c=hc({name:n,parent:e.parentId,user:t.value.actor,rank:i.value});if(a(c))return c;let d=[...c.value],p=d.find(h=>h.action==="add.issue")?.payload.id;if(!p)return l("Unable to determine created issue id");r&&d.push({id:sn(),...B(t.value.actor),action:"edit.description",payload:{id:p,md:r}});let m=[];for(let h of e.tagNames??[]){let y=ye(h).trim();if(!y||m.some(N=>N.name===y))continue;let v=ft("Tag name",y,60);if(v)return l(v);let R=w.findTagByName(y),S=R?.id??sn();R||d.push({id:sn(),...B(t.value.actor),action:"create.tag",payload:{id:S,name:y}}),d.push({id:sn(),...B(t.value.actor),action:"add.issue.tag",payload:{id:p,tag:S}}),m.push({id:S,name:y})}let f=[];for(let h of e.assigneeNames??[]){let y=ye(h).trim();if(!y||f.some(N=>N.name===y))continue;let v=ft("Assignee name",y,80);if(v)return l(v);let R=Object.values(t.value.state.contributors).find(N=>N.name===y),S=R?.id??sn();R||d.push({id:sn(),...B(t.value.actor),action:"create.contributor",payload:{id:S,name:y}}),d.push({id:sn(),...B(t.value.actor),action:"add.issue.assignee",payload:{id:p,assignee:S}}),f.push({id:S,name:y})}let g=F(d,t.value.boot.stateBranchRoot);return a(g)?l(g.message):u("Created issue",{id:p,ref:z(p),title:n,parentId:e.parentId,description:r,tags:m,assignees:f})},DP=(e,t,n)=>{let r=it(e);if(a(r))return r;let o=$n(Se,e,{at:"end"},t,n);if(a(o))return o;let s={id:sn(),...B(t),action:"close.issue",payload:{id:e,parent:Se,rank:o.value}},i=F([s],n);return a(i)?l(i.message):u("Closed issue",{id:e,ref:z(e)})};async function Pp(e){let t=await zt(e.repoRoot);if(a(t))return t;let n=rn();if(a(n))return n;let r=ca(e);if(a(r))return r;let o=s=>DP(s,n.value,t.value.stateBranchRoot);return e.issueIds?Cs("Closed",da(r.value,o)):o(r.value[0])}var Op=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[e.issueId];if(!n||n.isDeleted)return l("Issue not found");if(!$(n))return l("Target must be an issue");if(n.parentNodeId!==Se)return l("Issue is not closed");let r=Ic(n);if(!r)return l("Unable to resolve previous parent from issue history");if(r===Se)return l("Previous parent resolves to closed swimlane");let o=Wr(r);if(a(o))return o;let s=o.value,i=$n(s.id,n.id,{at:"end"},t.value.actor,t.value.boot.stateBranchRoot);if(a(i))return i;let c={id:sn(),...B(t.value.actor),action:"reopen.issue",payload:{id:n.id,parent:s.id,rank:i.value}},d=F([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Reopened issue",{id:n.id,ref:z(n.id),parentId:s.id})},BP=(e,t,n,r)=>{let o=it(e);if(a(o))return o;let s=Wr(t.parentId);if(a(s))return s;let i=$n(t.parentId,e,t.position??{at:"end"},n,r);if(a(i))return i;let c={id:sn(),...B(n),action:"move.node",payload:{id:e,parent:t.parentId,rank:i.value}},d=F([c],r);return a(d)?l(d.message):u("Moved issue",{id:e,ref:z(e),parentId:t.parentId})};async function Dp(e){let t=bo(e.repoRoot);if(a(t))return t;let n=rn();if(a(n))return n;let r=me({repoRoot:t.value});if(a(r))return r;let o=pn(r.value);if(a(o))return o;let s=gn(o.value.events,o.value.unreadable);if(a(s))return s;let i=ca(e);if(a(i))return i;let c=d=>BP(d,e,n.value,r.value);return e.issueIds?Cs("Moved",da(i.value,c)):c(i.value[0])}var Bp=e=>{let t=bt();if(a(t))return t;let n=t.value.nodes[e];return n?u("Read issue history",(n.log??[]).map(r=>({id:r.id,t:je(r.id),action:r.action,label:Ec(r),...r.action==="move.node"?{parentId:r.payload.parent}:{},actor:Qe(r.userId,t.value.contributors[r.userId]?.name)}))):l("Issue not found")},Fp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=it(e.issueId);if(a(n))return n;let r=n.value,o=ft("Issue description",e.description,2e4);if(o)return l(o);let s=r.props.description??"";if(s===e.description)return u("No changes made",{id:e.issueId,ref:z(e.issueId),description:s});let i={id:sn(),...B(t.value.actor),action:"edit.description",payload:{id:e.issueId,md:e.description}},c=F([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue description",{id:e.issueId,ref:z(e.issueId),description:e.description})},_p=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=it(e.issueId);if(a(n))return n;let r=n.value,o=ye(e.title);if(!o.trim())return l("Issue title cannot be empty");let s=ft("Issue title",o,300);if(s)return l(s);if(r.title===o)return u("No changes made",{id:e.issueId,ref:z(e.issueId),title:o});let i={id:sn(),...B(t.value.actor),action:"edit.title",payload:{id:e.issueId,name:o}},c=F([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue title",{id:e.issueId,ref:z(e.issueId),title:o})};import{ulid as Gr}from"ulid";var $p=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[t.value.state.rootNodeId];if(!n)return l("Workspace not found");if(nt().mode!=="live")return l("Cannot add a board while time travelling");let r=ye(e.title);if(!r.trim())return l("Board title cannot be empty");let o=ft("Board title",r,300);if(o)return l(o);let s=ir(n.id,t.value.actor,t.value.boot.stateBranchRoot);if(a(s))return s;let i=Gr(),c={id:Gr(),...B(t.value.actor),action:"add.board",payload:{id:i,name:r,parent:n.id,rank:s.value}},d=F([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Created board",{id:i,ref:z(i),title:r})},jp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[e.boardId];if(!n||n.isDeleted)return l("Board not found");if(!Sr(n))return l("Edit target must be a board");if(n.readonly)return l("Cannot edit readonly board");if(nt().mode!=="live")return l("Cannot rename a board while time travelling");let r=ye(e.title);if(!r.trim())return l("Board title cannot be empty");let o=ft("Board title",r,300);if(o)return l(o);if(n.title===r)return u("No changes made",{id:e.boardId,ref:z(e.boardId),title:r});let s={id:Gr(),...B(t.value.actor),action:"edit.title",payload:{id:e.boardId,name:r}},i=F([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Edited board title",{id:e.boardId,ref:z(e.boardId),title:r})};var Up=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Ep(e.boardId);if(a(n))return n;if(nt().mode!=="live")return l("Cannot add a swimlane while time travelling");let r=ye(e.title);if(!r.trim())return l("Swimlane title cannot be empty");let o=ft("Swimlane title",r,300);if(o)return l(o);let s=ir(e.boardId,t.value.actor,t.value.boot.stateBranchRoot);if(a(s))return s;let i=Gr(),c={id:Gr(),...B(t.value.actor),action:"add.swimlane",payload:{id:i,name:r,parent:e.boardId,rank:s.value}},d=F([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Created swimlane",{id:i,ref:z(i),title:r,boardId:e.boardId})},Hp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Wr(e.swimlaneId);if(a(n))return n;let r=n.value,o=ye(e.title);if(!o.trim())return l("Swimlane title cannot be empty");let s=ft("Swimlane title",o,300);if(s)return l(s);if(r.title===o)return u("No changes made",{id:e.swimlaneId,ref:z(e.swimlaneId),title:o});let i={id:Gr(),...B(t.value.actor),action:"edit.title",payload:{id:e.swimlaneId,name:o}},c=F([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited swimlane title",{id:e.swimlaneId,ref:z(e.swimlaneId),title:o})},Wp=async e=>{let t=bo(e.repoRoot);if(a(t))return t;let n=rn();if(a(n))return n;let r=me({repoRoot:t.value});if(a(r))return r;let o=pn(r.value);if(a(o))return o;let s=gn(o.value.events,o.value.unreadable);if(a(s))return s;let i=Wr(e.swimlaneId);if(a(i))return i;let c=Ep(e.boardId);if(a(c))return c;let d=$n(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(a(d))return d;let p={id:Gr(),...B(n.value),action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:d.value}},m=F([p],r.value);return a(m)?l(m.message):u("Moved swimlane",{id:e.swimlaneId,ref:z(e.swimlaneId),boardId:e.boardId})},Gp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Wr(e.swimlaneId);if(a(n))return n;let r={id:Gr(),...B(t.value.actor),action:"delete.node",payload:{id:e.swimlaneId}},o=F([r],t.value.boot.stateBranchRoot);return a(o)?l(o.message):u("Deleted swimlane",{id:e.swimlaneId,ref:z(e.swimlaneId)})};import{ulid as ua}from"ulid";async function Vp(e){let t=await zt(e.repoRoot);if(a(t))return t;let n=rn();if(a(n))return n;let r=ca(e);if(a(r))return r;let o=ye(e.tagName).trim();if(!o)return l("Tag name cannot be empty");let s=ft("Tag name",o,60);if(s)return l(s);let i=da(r.value,it);if(!e.issueIds&&i.failed[0])return l(i.failed[0].reason);if(i.done.length===0)return l(Cs("Tagged",i).message);let c=w.findTagByName(o),d=c?.id??ua(),p=[...c?[]:[{id:ua(),...B(n.value),action:"create.tag",payload:{id:d,name:o}}],...i.done.map(({id:h})=>({id:ua(),...B(n.value),action:"add.issue.tag",payload:{id:h,tag:d}}))],m=F(p,t.value.stateBranchRoot);if(a(m))return l(m.message);let f={id:d,name:o};if(!e.issueIds)return u("Added issue tag",{...i.done[0],tag:f});let g=Cs("Tagged",i);return a(g)?g:u(g.message,{...g.value,tag:f})}var zp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.tags[e.tagId];if(!n)return l("Tag not found");if(n.tombstoned)return l("Tag is already deleted");let r=[{id:ua(),...B(t.value.actor),action:"tombstone.tag",payload:{id:e.tagId}}],o=F(r,t.value.boot.stateBranchRoot);return a(o)?l(o.message):u("Deleted tag",{id:n.id,name:n.name})};var Kp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=it(e.issueId);if(a(n))return n;if(!t.value.state.tags[e.tagId])return l("Tag not found");let r={id:ua(),...B(t.value.actor),action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},o=F([r],t.value.boot.stateBranchRoot);return a(o)?l(o.message):u("Removed issue tag",{id:e.issueId,ref:z(e.issueId),tagId:e.tagId})};import{ulid as Ro}from"ulid";var UR=async(e,t)=>{let n=wr(e).get(t);return n===void 0?void 0:{id:t,name:n}},qp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=it(e.issueId);if(a(n))return n;let r=e.self?t.value.actor.userId:e.assigneeId;if(r){let h=t.value.state.contributors[r],y=h?void 0:await UR(t.value.boot.stateBranchRoot,r);if(!h&&!y)return l("Unknown assignee id");let v=h??y,R=[...h?[]:[{id:Ro(),...B(t.value.actor),action:"create.contributor",payload:{id:v.id,name:v.name}}],{id:Ro(),...B(t.value.actor),action:"add.issue.assignee",payload:{id:e.issueId,assignee:v.id}}],S=F(R,t.value.boot.stateBranchRoot);return a(S)?l(S.message):u("Added issue assignee",{id:e.issueId,ref:z(e.issueId),assignee:{id:v.id,name:v.name}})}let o=ye(e.assigneeName??"").trim();if(!o)return l("Provide assigneeId, self or assigneeName");let s=ft("Assignee name",o,80);if(s)return l(s);let i=ra({events:t.value.state.eventLog??[],registry:t.value.state.contributors,logFileNames:wr(t.value.boot.stateBranchRoot)}).filter(h=>h.name===o);if(i.length>1)return l(`"${o}" matches ${i.length} contributors (${i.map(({id:h})=>h).join(", ")}). Assign by assigneeId to choose.`);let c=i[0];if(!c&&!e.createUnlinked)return l(`No contributor named "${o}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let d=c?.id??Ro(),p=c?.name??o,f=[...!!t.value.state.contributors[d]?[]:[{id:Ro(),...B(t.value.actor),action:"create.contributor",payload:{id:d,name:p}}],{id:Ro(),...B(t.value.actor),action:"add.issue.assignee",payload:{id:e.issueId,assignee:d}}],g=F(f,t.value.boot.stateBranchRoot);return a(g)?l(g.message):u("Added issue assignee",{id:e.issueId,ref:z(e.issueId),assignee:{id:d,name:p}})},Yp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;if(!t.value.state.contributors[e.contributorId])return l("Contributor not found");if(await UR(t.value.boot.stateBranchRoot,e.contributorId))return l("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let o=[{id:Ro(),...B(t.value.actor),action:"tombstone.contributor",payload:{id:e.contributorId}}],s=F(o,t.value.boot.stateBranchRoot);return a(s)?l(s.message):u("Tombstoned contributor",{id:e.contributorId,name:Uo})};var Xp=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=On(t.value.boot.stateBranchRoot);if(a(n))return l(n.message);let r=e.boardId?IR(n.value,e.boardId):n.value,o=new Set,s=by(t.value.boot.stateBranchRoot);if(a(s))return l(s.message);for(let d of s.value)d.userId&&o.add(d.userId);let i=t.value.state.contributors,c=ra({events:r,registry:i,logFileNames:wr(t.value.boot.stateBranchRoot)}).map(({id:d,name:p,isExternal:m})=>({...Qe(d,p),isSelf:d===t.value.actor.userId,isExternal:m,isRemoved:i[d]?.tombstoned===!0,hasAuthoredAnywhere:o.has(d)}));return u("Listed board contributors",c)},Jp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=it(e.issueId);if(a(n))return n;if(!t.value.state.contributors[e.assigneeId])return l("Assignee not found");let r={id:Ro(),...B(t.value.actor),action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},o=F([r],t.value.boot.stateBranchRoot);return a(o)?l(o.message):u("Removed issue assignee",{id:e.issueId,ref:z(e.issueId),assigneeId:e.assigneeId})};import{ulid as $c}from"ulid";var ma=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=it(e.issueId);if(a(n))return n;let r=e.body.trim();if(!r)return l("Comment cannot be empty");if(r.length>4e3)return l(`Comment cannot exceed ${4e3} characters (got ${r.length})`);let o=$c(),s={id:$c(),...B(t.value.actor),action:"add.issue.comment",payload:{id:o,issue:e.issueId,md:r,author:t.value.actor.userId}},i=F([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Added issue comment",{id:o,issueId:e.issueId,body:r})},pa=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(c=>c.action==="add.issue.comment"&&c.payload.id===e.commentId);if(!n)return l("Unable to resolve comment");if(n.payload.author!==t.value.actor.userId)return l("You can only delete your own comments");let r=it(n.payload.issue);if(a(r))return r;if(t.value.state.eventLog.some(c=>c.action==="delete.issue.comment"&&c.payload.id===e.commentId))return u("Comment already deleted",{id:e.commentId,issueId:n.payload.issue});let s={id:$c(),...B(t.value.actor),action:"delete.issue.comment",payload:{id:e.commentId,issue:n.payload.issue}},i=F([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Deleted issue comment",{id:e.commentId,issueId:n.payload.issue})},Zp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(d=>d.action==="add.issue.comment"&&d.payload.id===e.commentId);if(!n)return l("Unable to resolve comment");if(n.payload.author!==t.value.actor.userId)return l("You can only edit your own comments");let r=it(n.payload.issue);if(a(r))return r;if(t.value.state.eventLog.some(d=>d.action==="delete.issue.comment"&&d.payload.id===e.commentId))return l("Comment was deleted");let s=e.body.trim();if(!s)return l("Comment cannot be empty");if(s.length>4e3)return l(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let i={id:$c(),...B(t.value.actor),action:"edit.issue.comment",payload:{id:e.commentId,issue:n.payload.issue,md:s}},c=F([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue comment",{id:e.commentId,issueId:n.payload.issue,body:s})};import{ulid as HR}from"ulid";var Qp=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;if(!br(e.email))return l(`Not an email address: ${e.email}`);let n=ot(e.email),r=e.contributorId??t.value.actor.userId;if(!t.value.state.contributors[r])return l(`Unknown contributor: ${r}`);let o=ei(t.value.state.emailLinks,n);if(o.includes(r))return u(`${n} is already yours`,{contributor:r,email:n,contested:o.filter(i=>i!==r)});let s=F([{id:HR(),action:"link.contributor.email",payload:{contributor:r,email:n},userId:t.value.actor.userId}],t.value.boot.stateBranchRoot);return a(s)?l(s.message):u(o.length>0?`Claimed ${n}, but somebody else claims it too, so it now resolves to neither of you`:`Claimed ${n}`,{contributor:r,email:n,contested:o})},ef=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=ot(e.email),r=e.contributorId??t.value.actor.userId,o=t.value.state.emailLinks[Qs(n,r)];if(!o||o.tombstoned)return l(`No such link: ${n} to ${r}`);if(!Za(t.value.actor.userId,o))return l("Only whoever made a claim, or the contributor it names, may undo it");let s=F([{id:HR(),action:"unlink.contributor.email",payload:{contributor:r,email:n},userId:t.value.actor.userId}],t.value.boot.stateBranchRoot);return a(s)?l(s.message):u(`Unclaimed ${n}`,{contributor:r,email:n})},jc=async(e={})=>{let t=await zt(e.repoRoot);if(a(t))return t;let n=bt();if(a(n))return n;let{emailLinks:r,contributors:o}=n.value,s=new Map;for(let f of Object.values(r)){if(f.tombstoned)continue;let g=s.get(f.email)??new Set;g.add(f.contributor),s.set(f.email,g)}let i=[...s.entries()].map(([f,g])=>({email:f,contested:g.size>1,claimants:[...g].map(h=>Qe(h,o[h]?.name))})).sort((f,g)=>f.email.localeCompare(g.email)),c=rn(),d=a(c)?[]:Nn(r,c.value.userId),p=q().gitEmail,m=p?ei(r,p).filter(f=>a(c)||f!==c.value.userId):[];return u("Listed contributor emails",{emails:i,mine:d,git:p?{email:p,linkedToMe:d.includes(p),heldByOthers:m.map(f=>Qe(f,o[f]?.name))}:null})},Uc=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let{userId:n,userName:r}=t.value.actor,o=$e(t.value.boot.repoRoot),s=await Gn({repoRoot:t.value.boot.repoRoot,stateBranch:a(o)?void 0:o.value,names:[r,await Hr(t.value.boot.repoRoot)],links:t.value.state.emailLinks});if(a(s))return s;let i=_r(s.value),c=i.filter(d=>d.looksLikeYours);return u(i.length===0?"No unclaimed addresses in this history":`${i.length} unclaimed address(es) in this history, ${c.length>0?`${c.length} of which look like yours`:"none obviously yours"}. Show them to the user and link only the ones they confirm; each is a permanent event that replicates to every clone.`,{contributor:n,candidates:i,likely:c.length})};var WR=(e,t)=>{let n=0,r=0,o=null;for(let s of e){if(s.userId!==t)continue;s.action==="add.issue"&&n++,s.action==="add.issue.comment"&&r++;let i=jo(s.id);if(a(i))continue;let c=i.value.getTime();(o===null||c<o)&&(o=c)}return{tickets:n,comments:r,joinedAt:o}};var tf=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let{userId:n,userName:r}=t.value.actor,o=WR(t.value.state.eventLog,n),s=$e(t.value.boot.repoRoot),i=await Gn({repoRoot:t.value.boot.repoRoot,stateBranch:a(s)?void 0:s.value,names:[r,await Hr(t.value.boot.repoRoot)],links:t.value.state.emailLinks}),c=a(i)?[]:i.value.filter(d=>d.claimedBy.length===1&&d.claimedBy[0]===n);return u("Derived personal stats",{...o,scanned:!a(i),commits:c.reduce((d,p)=>d+p.commits,0),claimedEmails:c.length})};var nf=e=>{let t=Mi(e);return a(t)?l(t.message):u("Listed repos",{repos:t.value,claimedBytes:Ol(e),limit:Jn,allowLocal:Ya()})},Eo=async(e={})=>{let t=pt(e.repoRoot);return a(t)?l(t.message):nf(t.value)},Hc=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let{repoRoot:n}=t.value.boot,r=await ki({repoRoot:n,actorId:t.value.actor.userId,url:e.url,branches:e.branches,since:e.since,label:e.label,mode:e.previewOnly?"preview":e.confirm?"confirm":"auto"});if(a(r))return l(r.message);let o=nf(n);return a(o)?l(o.message):u(r.message,{...o.value,...r.value.kind==="preview"?{preview:r.value.preview}:{}})},rf=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let{repoRoot:n}=t.value.boot,r=Li({repoRoot:n,actorId:t.value.actor.userId,repo:e.repo});if(a(r))return l(r.message);let o=nf(n);return a(o)?l(o.message):u(r.message,o.value)},of=e=>(sm("repo"in e?e.repo:wn(e.url.trim())),u("Cancelled",null));var sf=async(e={})=>{let t=pt(e.repoRoot);return a(t)?l(t.message):ns({repoRoot:t.value,minIntervalMs:e.minIntervalMs})};import FP from"node:fs";import GR from"node:path";var fa=Number(process.env.EPIQ_GUI_PORT)||3710,af="/api/instance",lf="epiq",Wc=e=>{try{return FP.realpathSync(GR.resolve(e))}catch{return GR.resolve(e)}},_P=e=>{let t=e;return typeof t=="object"&&t!==null&&t.app===lf&&typeof t.repoRoot=="string"&&typeof t.version=="string"&&typeof t.pid=="number"},VR=async(e,t=500)=>{let n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let o=await fetch(`http://127.0.0.1:${e}${af}`,{signal:n.signal});if(!o.ok)return null;let s=await o.json();return _P(s)?s:null}catch{return null}finally{clearTimeout(r)}};var $P=6e4,zR=e=>{let t,n=!1,r=!1,o=0,s=()=>{let m=Jt();return a(m)?(G.error(m.message),null):m.value},i=()=>{let m=s();if(!m)return!1;let f=Et();return a(f)?!1:!!m.autoSync&&wc(f.value)===null},c=()=>{let m=Po(s()?.autoSyncDebounceMs);return Math.max(0,m-(Date.now()-o))},d=async()=>{if(!(n||r)&&i()){r=!0,o=Date.now();try{await Vn(async()=>{if(nt().mode!=="live")return!1;let f=await la({repoRoot:e.project.repoRoot});return await e.publisher.publishIfLogMoved(),!a(f)})&&e.onReposFetch?.($P)}finally{r=!1,p()}}};function p(){n||!i()||r||t||(t=setTimeout(()=>{t=void 0,d()},c()))}return p(),{queueSync:p,reschedule:()=>{t&&(clearTimeout(t),t=void 0),p()},dispose:()=>{n=!0,t&&clearTimeout(t)}}};var Gc=(e,t)=>{let n,r=!1,o=async()=>{let s=Date.now();try{await e()}catch(i){logger.error("[watch] check threw",i)}r||(n=setTimeout(o,Math.max(t,Date.now()-s)))};return n=setTimeout(o,t),()=>{r=!0,n&&clearTimeout(n)}};var jP=/^(```|~~~)[^\n]*\n[\s\S]*?\n\1[ \t]*$/gm,UP=/^(?:```|~~~)[\s\S]*$/m,HP=/^[ \t]*\|?[ \t]*:?-{2,}:?[ \t]*(?:\|[ \t]*:?-{2,}:?[ \t]*)*\|?[ \t]*$/gm,WP=/^[ \t]*\|.*$/gm,GP=/!\[[^\]]*\]\([^)]*\)/g,VP=/\[([^\]]*)\]\([^)]*\)/g,zP=/^[ \t]*(?:[#>]+[ \t]*|[-*+][ \t]+|\d+[.)][ \t]+)/gm,KP=/^[ \t]*(?:-{3,}|\*{3,}|_{3,})[ \t]*$/gm,qP=/[*`~]/g,YP=/(?<![0-9A-Za-z])_|_(?![0-9A-Za-z])/g,XP=e=>ye(e.replace(jP," ").replace(UP," ").replace(GP," ").replace(VP,"$1").replace(KP," ").replace(HP," ").replace(WP,t=>t.replaceAll("|"," ")).replace(zP,"").replace(qP,"").replace(YP,"")),JP=.5,KR=(e,t)=>{if(t<=0)return"";let n=XP(e);if(n.length<=t)return n;let r="\u2026",o=t-r.length;if(o<=0)return r.slice(0,t);let s=n.slice(0,o),i=s.lastIndexOf(" ");return`${(i>=o*JP?s.slice(0,i):s).trimEnd()}${r}`};var ZP=e=>({...e,boards:(e.boards??[]).map(t=>({...t,swimlanes:(t.swimlanes??[]).map(n=>({...n,issues:(n.issues??[]).map(r=>({...r,description:""}))}))})),commentsByIssueId:Object.fromEntries(Object.entries(e.commentsByIssueId??{}).filter(([,t])=>t.length>0).map(([t,n])=>[t,n.map(r=>({...r,body:""}))])),attachmentsByIssueId:Object.fromEntries(Object.entries(e.attachmentsByIssueId??{}).filter(([,t])=>t.length>0))}),Io=e=>a(e)?e:u(e.message,ZP(e.value)),QP=(e,t)=>(e.boards??[]).flatMap(n=>n.swimlanes??[]).flatMap(n=>n.issues??[]).find(n=>n.id===t),qR=(e,t)=>{let n=QP(e,t);return{issueId:t,description:n?.description??"",comments:e.commentsByIssueId?.[t]??[]}},e0=280,YR=(e,t)=>({issueId:e,excerpt:KR(t,e0)});var t0=1e3,XR=e=>{let t=ce(e.repoRoot);if(a(t))return null;let n=me({repoRoot:t.value});return a(n)?null:n.value},JR=e=>{let t=()=>{let i=XR(e.project);return i===null?null:Ke(i)},n=()=>{let i=Ct(e.project.repoRoot);return a(i)?null:JSON.stringify([i.value.live,i.value.overLimit])},r=n(),o=t();return{publishIfLogMoved:async()=>{let i=XR(e.project);if(i===null||await Nl(i))return;let c=Ke(i);if(c===o)return;o=c;let d=Io(await on({repoRoot:e.project.repoRoot}));if(a(d))return;Un({type:"state",payload:d});let p=n();p!==null&&p!==r&&(r=p,Un({type:"repos:changed"}))}}},ZR=(e,t=t0)=>Gc(()=>Vn(async()=>{nt().mode==="live"&&await e.publishIfLogMoved()}),t);var n0=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),cf=(e,t)=>{if(!e)return!1;if(e==="null")return!0;let n;try{n=new URL(e)}catch{return!0}return n.protocol!=="http:"||n.port!==String(t)?!0:!n0.has(n.hostname)},QR=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:cf(e.origin,t)?{status:403,message:"Cross-origin request"}:e.method==="POST"&&!(e.contentType??"").toLowerCase().startsWith("application/json")?{status:415,message:"Expected content-type: application/json"}:null;import{WebSocketServer as H0}from"ws";var zn=e=>({path:e.path,sha:e.shas[e.shas.length-1]??""});var r0=e=>{let t=e.lastIndexOf("/");return t===-1?".":e.slice(0,t)},eE=({commits:e,patch:t})=>{let n=e.map(i=>i.time),o=t.files.map(i=>({...zn(i),changed:i.addedCount+i.removed})).reduce((i,c)=>i===null||c.changed>i.changed?c:i,null),s=t.insertions+t.deletions;return{commits:e.length,authors:[...new Set(e.map(i=>i.author))].sort(),firstCommitAt:n.length?Math.min(...n):null,lastCommitAt:n.length?Math.max(...n):null,files:t.files.length,filesAdded:t.files.filter(i=>i.status==="added").length,filesModified:t.files.filter(i=>i.status==="modified").length,filesDeleted:t.files.filter(i=>i.status==="deleted").length,binaryFiles:t.files.filter(i=>i.binary).length,directories:new Set(t.files.map(i=>r0(i.path))).size,insertions:t.insertions,deletions:t.deletions,net:t.insertions-t.deletions,largestFile:o,concentration:o&&s>0?o.changed/s:0,selfChurn:t.selfChurn,truncated:t.truncated}};var at={line:["//"],block:[["/*","*/"]]},an={line:["#"],block:[]},df={line:["--"],block:[]},ws={line:[],block:[["<!--","-->"]]},o0={line:[],block:[]},ee=(e,t)=>({name:e,comment:t}),Vc=ee("TypeScript",at),zc=ee("JavaScript",at),tE={ts:Vc,tsx:Vc,mts:Vc,cts:Vc,js:zc,jsx:zc,mjs:zc,cjs:zc,py:ee("Python",{line:["#"],block:[['"""','"""']]}),rb:ee("Ruby",{line:["#"],block:[["=begin","=end"]]}),go:ee("Go",at),rs:ee("Rust",at),java:ee("Java",at),kt:ee("Kotlin",at),swift:ee("Swift",at),c:ee("C",at),h:ee("C",at),cc:ee("C++",at),cpp:ee("C++",at),hpp:ee("C++",at),cs:ee("C#",at),php:ee("PHP",at),scala:ee("Scala",at),dart:ee("Dart",at),lua:ee("Lua",df),hs:ee("Haskell",df),sql:ee("SQL",df),ex:ee("Elixir",an),exs:ee("Elixir",an),pl:ee("Perl",an),r:ee("R",an),jl:ee("Julia",an),sh:ee("Shell",an),bash:ee("Shell",an),zsh:ee("Shell",an),vue:ee("Vue",ws),svelte:ee("Svelte",ws),html:ee("HTML",ws),xml:ee("XML",ws),md:ee("Markdown",ws),mdx:ee("Markdown",ws),css:ee("CSS",{line:[],block:[["/*","*/"]]}),scss:ee("CSS",at),less:ee("CSS",at),yml:ee("YAML",an),yaml:ee("YAML",an),toml:ee("TOML",an),ini:ee("INI",an),json:ee("JSON",o0)},s0="Other",nE=e=>{let t=e.slice(e.lastIndexOf("/")+1),n=t.lastIndexOf(".");return n<=0?"":t.slice(n+1).toLowerCase()},Co=e=>tE[nE(e)]?.name??s0,ga=e=>tE[nE(e)]?.comment??null,i0=[/\.(test|spec)\.[a-z0-9]+$/i,/(^|\/)test_[^/]+\.py$/,/_test\.[a-z0-9]+$/i,/(^|\/)conftest\.py$/,/Tests?\.(java|kt|cs|scala)$/],a0=/(^|\/)(tests?|__tests__|spec|specs|e2e|src\/test|features)\//i,Ns=e=>a0.test(e)||i0.some(t=>t.test(e)),l0=/(^|\/)(package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|Cargo\.lock|go\.sum|poetry\.lock|Gemfile\.lock|composer\.lock)$/,c0=/(^|\/)(node_modules|dist|build|out|target|vendor|coverage|\.next|__snapshots__)\//,d0=/(\.min\.(js|css)|\.map|\.snap|\.pb\.go|_pb2\.py)$/,Sn=e=>l0.test(e)||c0.test(e)||d0.test(e),rE=e=>/(^|\/)(package\.json|go\.mod|Cargo\.toml|requirements[^/]*\.txt|pyproject\.toml|Gemfile|composer\.json|pom\.xml|build\.gradle(\.kts)?)$/.test(e),oE=e=>/(^|\/)\.github\/workflows\//.test(e)||/(^|\/)(Dockerfile|docker-compose[^/]*\.ya?ml|Makefile|Jenkinsfile|\.gitlab-ci\.yml)$/.test(e)||/\.tf$/.test(e),sE=e=>/\.(md|mdx|rst|txt)$/i.test(e)||/(^|\/)docs?\//i.test(e),u0=/\b(it|test|describe|context|suite)\.skip\b|\bx(it|describe|test)\s*\(|@pytest\.mark\.skip|@unittest\.skip|\bt\.Skip\s*\(|@(Ignore|Disabled)\b/,m0=/\b(it|test|describe|context|suite)\.only\b|\bf(it|describe|test)\s*\(/,iE=e=>u0.test(e),aE=e=>m0.test(e);var lE=/\b(TODO|FIXME|HACK|XXX)\b/,p0=/[;{}]\s*$|^\s*(const|let|var|function|def|class|if|for|while|return|import|export|await|print)\b.*[=(]/,uf=(e,t)=>{let n=e.trim();return n===""?"blank":t&&(t.line.some(r=>n.startsWith(r))||t.block.some(([r])=>n.startsWith(r))||t.block.some(([r])=>r==="/*")&&(n.startsWith("*")||n.startsWith("*/")))?"comment":"code"},f0=(e,t)=>{let n=e.trim();for(let r of[...t.line,...t.block.flat(),"*"])if(n.startsWith(r)){n=n.slice(r.length).trim();break}return n},cE=({patch:e,repoShareByLanguage:t})=>{let n=new Map,r=0,o=0,s=0,i=0,c=0,d=0;for(let m of e.files){if(m.binary||Sn(m.path))continue;let f=ga(m.path);if(!f||f.line.length===0&&f.block.length===0)continue;let g=Co(m.path),h=n.get(g)??{comment:0,code:0};for(let{text:y}of m.added){let v=uf(y,f);if(lE.test(y)&&i++,v==="blank"){s++;continue}if(v==="comment"){r++,h.comment++,f&&p0.test(f0(y,f))&&d++;continue}o++,h.code++}for(let{text:y}of m.removedLines)lE.test(y)&&c++;n.set(g,h)}let p=r+o;return{byLanguage:[...n.entries()].map(([m,f])=>({name:m,commentLines:f.comment,codeLines:f.code,share:f.comment+f.code===0?0:f.comment/(f.comment+f.code),repoShare:t?.get(m)??null})).sort((m,f)=>f.commentLines+f.codeLines-(m.commentLines+m.codeLines)),commentLines:r,codeLines:o,blankLines:s,share:p===0?0:r/p,todoLinesAdded:i,todoLinesRemoved:c,commentedOutCodeLines:d}};var g0=/\bconsole\.(log|debug|dir)\s*\(|\bdebugger\b|^\s*print\s*\(|\bfmt\.Print(ln|f)?\s*\(|\bSystem\.out\.print|\bdbg!\s*\(/,Kc=6,mf=10,h0=e=>{let t=0;for(let n of e){if(n.trim()===""||n.startsWith(" "))continue;let r=n.length-n.trimStart().length;r>0&&(t===0||r<t)&&(t=r)}return Math.min(Math.max(t,2),8)},y0=(e,t)=>{let n=e.length-e.trimStart().length;if(n===0)return 0;let r=e.slice(0,n).split(" ").length-1;return r>0?r:Math.floor(n/t)},v0=e=>{if(e.length<Kc*2)return 0;let t=new Map,n=new Array(e.length).fill(!1);for(let r=0;r+Kc<=e.length;r++){let o=e.slice(r,r+Kc);if(o.some(c=>c.text.length<3))continue;let s=o.map(c=>c.text).join(`
113
- `),i=t.get(s);if(i===void 0){t.set(s,{...o[0],at:r});continue}if(i.file!==o[0]?.file)for(let c=0;c<Kc;c++)n[i.at+c]=!0,n[r+c]=!0}return n.filter(Boolean).length},dE=({patch:e})=>{let t=[],n=[],r=[],o=!1,s=0,i=0,c=null,d=[];for(let[p,m]of e.files.entries()){if(Sn(m.path)&&t.push(zn(m)),rE(m.path)&&n.push(zn(m)),oE(m.path)&&r.push(zn(m)),sE(m.path)&&(o=!0),m.binary||Sn(m.path))continue;let f=m.added.map(y=>y.text),g=h0(f),h=m.status!=="deleted";for(let y of f){g0.test(y)&&s++;let v=y0(y,g);v>i&&(i=v,c=zn(m)),h&&d.push({text:y.trim(),file:p})}d.push({text:" ",file:p})}return{generatedPaths:t.slice(0,mf),dependencyManifests:n.slice(0,mf),buildOrCiPaths:r.slice(0,mf),docsTouched:o,debugPrintLinesAdded:s,maxIndentLevels:i,deepestFile:c,duplicatedLines:v0(d)}};var uE=({patch:e,languagesBefore:t})=>{let n=new Map,r=0;for(let i of e.files){if(i.binary)continue;let c=i.addedCount+i.removed;if(Sn(i.path)){r+=c;continue}let d=Co(i.path),p=n.get(d)??{name:d,added:0,removed:0,addedInTests:0,share:0};p.added+=i.addedCount,p.removed+=i.removed,Ns(i.path)&&(p.addedInTests+=i.addedCount),n.set(d,p)}let o=[...n.values()].reduce((i,c)=>i+c.added+c.removed,0),s=[...n.values()].map(i=>({...i,share:o===0?0:(i.added+i.removed)/o})).sort((i,c)=>c.added+c.removed-(i.added+i.removed));return{languages:s,introduced:t===null?[]:s.filter(i=>!t.has(i.name)).map(i=>i.name),generatedLines:r}};var b0=200,pf=2e5,x0=5e4,S0=25,mE=64*1024*1024,ff="",R0=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/,E0=/^diff --git a\/(.+) b\/\1$/,pE=(e,t)=>e==="/dev/null"?null:e.startsWith(t)?e.slice(2):e,fE=(e,t)=>e===null?"added":t===null?"deleted":"modified",I0=()=>({byPath:new Map,insertions:0,deletions:0,selfChurn:0,retainedLines:0}),C0=(e,t)=>{let n=e.byPath,r="",o=null,s=null,i=null,c=!1,d=0,p=(f,g)=>g==="modified"&&f==="added"?"added":g,m=(f,g)=>{let h=n.get(f);if(h)return h.entry.status=p(h.entry.status,g),h.entry.shas.includes(r)||h.entry.shas.push(r),h;let v={entry:{path:f,status:g,binary:!1,added:[],addedCount:0,removed:0,removedLines:[],shas:[r]},pendingByText:new Map};return n.set(f,v),v};for(let f of t.split(`
114
- `)){if(f.startsWith(ff)){r=f.slice(ff.length).trim(),o=null,s=null,i=null,c=!1;continue}if(f.startsWith("diff --git ")){o=null,i=null,c=!0,s=E0.exec(f)?.[1]??null;continue}if(c&&f.startsWith("Binary files ")&&s){let[,h=""]=/^Binary files (.*) differ$/.exec(f)??[],[y="",v=""]=h.split(" and ");o=m(s,fE(y==="/dev/null"?null:y,v==="/dev/null"?null:v)),o.entry.binary=!0;continue}if(c&&f.startsWith("--- ")){i=pE(f.slice(4),"a/");continue}if(c&&f.startsWith("+++ ")){let h=pE(f.slice(4),"b/"),y=h??i??s;y&&(o=m(y,fE(i,h)));continue}let g=R0.exec(f);if(g){d=Number(g[1]),c=!1;continue}if(o){if(f.startsWith("+")){let h=f.slice(1);e.insertions++,o.entry.addedCount++,e.retainedLines<pf&&(o.entry.added.push({sha:r,line:d,text:h}),e.retainedLines++),o.pendingByText.size<x0&&o.pendingByText.set(h,(o.pendingByText.get(h)??0)+1),d++;continue}if(f.startsWith("-")){let h=f.slice(1);e.deletions++,o.entry.removed++,e.retainedLines<pf&&(o.entry.removedLines.push({sha:r,line:0,text:h}),e.retainedLines++);let y=o.pendingByText.get(h)??0;y>0&&h.trim().length>2&&(e.selfChurn++,o.pendingByText.set(h,y-1))}}}},w0=e=>({files:[...e.byPath.values()].map(t=>t.entry),insertions:e.insertions,deletions:e.deletions,selfChurn:e.selfChurn,retainedLines:e.retainedLines});var gE=async({repoRoot:e,shas:t,cwdOf:n=()=>e})=>{if(t.length===0)return u("No commits to scan",{files:[],insertions:0,deletions:0,selfChurn:0,scannedCommits:0,truncated:!1});let r=t.slice(0,b0).reverse(),o=I0(),s=0,i=0,c=!1,d=[];for(let m of r){let f=n(m),g=d[d.length-1];g&&g.cwd===f&&g.shas.length<S0?g.shas.push(m):d.push({cwd:f,shas:[m]})}for(let{cwd:m,shas:f}of d){let g=await U({cwd:m,maxOutput:Math.max(1,mE-s),keepPartial:!0,args:["-c","core.quotePath=false","show","--unified=0","--no-renames","--no-color",`--format=${ff}%H`,...f]});if(a(g)){if(m!==e)continue;return l(g.message)}if(C0(o,g.value.stdout),s+=g.value.stdout.length,i+=f.length,g.value.truncated||s>mE){c=!0;break}}let p=w0(o);return u("Scanned ticket patch",{files:p.files,insertions:p.insertions,deletions:p.deletions,selfChurn:p.selfChurn,scannedCommits:i,truncated:c||i<t.length||p.retainedLines>=pf})};var N0=40,A0=/^\d{6} blob ([0-9a-f]{40})\t(.+)$/,hE=async({repoRoot:e,sha:t})=>{let n=await ke({cwd:e,args:["-c","core.quotePath=false","ls-tree","-r",`${t}~1`]});if(n.exitCode!==0)return null;let r=new Set,o=new Map;for(let m of n.stdout.split(`
115
- `)){let f=A0.exec(m);if(!f)continue;let[,g="",h=""]=f;if(Sn(h))continue;let y=Co(h);if(r.add(y),Ns(h)||!ga(h))continue;let v=o.get(y)??[];v.length<N0&&(v.push({blob:g,path:h}),o.set(y,v))}let s=[...o.values()].flat(),i=await _a(s.map(m=>m.blob),e);if(a(i))return{languages:r,commentShareByLanguage:new Map};let c=i.value,d=new Map;for(let{blob:m,path:f}of s){let g=c.get(m);if(g===void 0)continue;let h=ga(f),y=Co(f),v=d.get(y)??{comment:0,code:0};for(let R of g.split(`
116
- `)){let S=uf(R,h);S==="comment"&&v.comment++,S==="code"&&v.code++}d.set(y,v)}let p=new Map;for(let[m,f]of d){let g=f.comment+f.code;g>0&&p.set(m,f.comment/g)}return{languages:r,commentShareByLanguage:p}};var yE=({patch:e})=>{let t=0,n=0,r=[],o=[],s=0,i=0;for(let c of e.files)if(!(c.binary||Sn(c.path))&&Ns(c.path)){t+=c.addedCount,n+=c.removed,c.status==="added"&&r.push(zn(c)),c.status==="deleted"&&o.push(zn(c));for(let{text:d}of c.added)iE(d)&&s++,aE(d)&&i++}return{testLinesAdded:t,testLinesRemoved:n,addedTestFiles:r,deletedTestFiles:o,skippedTestLinesAdded:s,focusedTestLinesAdded:i}};var T0=e=>e.reduce((t,n)=>t===null||n.time<t.time?n:t,null),vE=async({repoRoot:e,ref:t,commits:n})=>{let r=await Ar(e);if(a(r))return l(r.message);let o=Ei(r.value),s=new Map(n.map(f=>[f.sha,f.repo])),i=f=>o(s.get(f))??e,c=await gE({repoRoot:e,shas:n.map(f=>f.sha),cwdOf:i});if(a(c))return l(c.message);let d=c.value,p=T0(n),m=p?await hE({repoRoot:i(p.sha),sha:p.sha}):null;return u("Derived issue stats",{ref:t,shape:eE({commits:n,patch:d}),languages:uE({patch:d,languagesBefore:m?.languages??null}),tests:yE({patch:d}),comments:cE({patch:d,repoShareByLanguage:m?.commentShareByLanguage??null}),flags:dE({patch:d})})};var ha=e=>{if(a(e))return e;let t=ve(),n=a(t)?{}:t.value.emailLinks,r=a(t)?{}:t.value.contributors,o=Kg(n),s=e.value.map(i=>({...i,authorIdentity:PS({authorName:i.author,authorEmail:i.authorEmail,owners:o,registry:r})}));return u(e.message,s)};var M0=32,ya=new Map;var L0=(e,t)=>{if(ya.set(e,t),ya.size>M0){let n=ya.keys().next();n.done||ya.delete(n.value)}return t},qc=async(e={idOrRef:""})=>{let t=e.idOrRef.trim();if(!t)return l("idOrRef must not be empty");let n=t.length>7?z(t):t.toUpperCase(),r=ce(e.repoRoot??process.cwd());if(a(r))return l(r.message);let o=r.value,s=ha(await io({repoRoot:o,ref:n}));if(a(s))return l(s.message);let i=s.value.map(m=>({sha:m.sha,...m.repo?{repo:m.repo}:{},time:m.time,author:m.authorIdentity?.resolved?m.authorIdentity.name:m.author,subject:m.subject})),c=[o,n,i.map(m=>`${m.sha}:${m.author}`).join(",")].join(" "),d=ya.get(c);if(d)return u("Derived issue stats",d);let p=await vE({repoRoot:o,ref:n,commits:i});return a(p)?l(p.message):u("Derived issue stats",L0(c,p.value))};var k0=new RegExp(`^[0-9A-Z]{${7}}$`),P0=e=>{let t=e.indexOf(" ");if(t===-1)return null;let n=e.slice(0,t).toUpperCase();return k0.test(n)?n:null},O0=e=>{let t={};for(let n of e){let r=P0(n.subject);if(!r)continue;let o=t[r]??={commits:0,insertions:0,deletions:0};o.commits++,o.insertions+=n.insertions,o.deletions+=n.deletions}return t},bE=async(e={})=>{let t=await Ci({repoRoot:e.repoRoot});return a(t)?t:u("Collected diff stats by ref",O0(t.value))};var D0="Filed here",xE=(e,t)=>e.set(t,(e.get(t)??0)+1),SE=(e,t,n)=>[...e.entries()].map(([r,o])=>({laneId:r,title:r===null?D0:n(r),count:o,share:t===0?0:o/t})).sort((r,o)=>o.count-r.count||r.title.localeCompare(o.title)),RE=(e,t,n)=>{let r=new Map,o=new Map,s=0,i=0;for(let c of t)for(let[d,p]of c.entries()){if(p!==e)continue;s++,xE(r,c[d-1]??null);let m=c[d+1];m!==void 0&&(i++,xE(o,m))}return{arrived:s,departed:i,arrivesFrom:SE(r,s,n),movesOnTo:SE(o,i,n)}};var EE=e=>{if(e.length===0)return null;let t=Math.floor(e.length/2);return e.length%2===0?(e[t-1]+e[t])/2:e[t]};var va=1440*60*1e3,B0=({laneIds:e,journeys:t,now:n,days:r})=>{let o=n-(r-1)*va,s=new Map(e.map(i=>[i,Array.from({length:r},()=>[])]));for(let i of t)for(let[c,d]of i.entries()){let p=s.get(d.laneId);if(!p)continue;let m=i[c+1]?.enteredAt,f=Math.max(0,Math.ceil((d.enteredAt-o)/va)),g=m===void 0?r-1:Math.min(r-1,Math.ceil((m-o)/va)-1);for(let h=f;h<=g;h++)p[h].push(o+h*va-d.enteredAt)}return Object.fromEntries([...s].map(([i,c])=>[i,c.map((d,p)=>({t:o+p*va,median:EE(d.sort((m,f)=>m-f)),count:d.length}))]))},IE=({laneId:e,journeys:t,now:n,days:r})=>B0({laneIds:[e],journeys:t,now:n,days:r})[e];var F0=40,_0=30,$0=()=>({tickets:0,commits:0,insertions:0,deletions:0}),j0=async(e,t)=>{let n=$0();for(let r of t.slice(0,F0)){let o=await qc({repoRoot:e,idOrRef:z(r)});a(o)||o.value.shape.commits===0||(n.tickets++,n.commits+=o.value.shape.commits,n.insertions+=o.value.shape.insertions,n.deletions+=o.value.shape.deletions)}return n},CE=async e=>{let t=bt();if(a(t))return t;let{nodes:n}=t.value;if(!n[e.swimlaneId])return l("Swimlane not found");let o=Object.values(n).filter($),s=o.map(d=>bp(d.log??[],je(d.id))),i=RE(e.swimlaneId,s.map(d=>d.map(p=>p.laneId)),d=>n[d]?.title??"Elsewhere"),c=o.filter(d=>d.parentNodeId===e.swimlaneId).map(d=>d.id);return u("Derived swimlane stats",{swimlaneId:e.swimlaneId,createdAt:je(e.swimlaneId),...i,stayTrend:IE({laneId:e.swimlaneId,journeys:s,now:Date.now(),days:_0}),code:await j0(e.repoRoot,c)})};var wE=new Set(["sync","email:link","email:unlink","repo:connect","repo:disconnect","issues:create","board:create","board:edit:title","swimlane:create","swimlane:edit:title","swimlane:delete","swimlane:move","issues:move","issue:close","issue:reopen","issue:edit:title","issue:edit:description","issue:tag:add","issue:tag:remove","contributor:remove","tag:remove","issue:assignee:add","issue:assignee:remove","issue:comment:add","issue:comment:delete"]);var NE=e=>{let t=er({exclude:e});return a(t)?[]:t.value.map(n=>({projectId:n.projectId,name:Wo(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},AE=e=>{let t=er();if(a(t))return l(t.message);let n=t.value.find(r=>r.root===e);return n?u("Resolved recent project",n.root):l(`Not a recent project: ${e}`)};import{z as M}from"zod";var ae=M.string().min(1),TE=M.discriminatedUnion("at",[M.object({at:M.literal("start")}),M.object({at:M.literal("end")}),M.object({at:M.literal("before"),sibling:ae}),M.object({at:M.literal("after"),sibling:ae})]),ba=M.number().finite(),oe=(e,t)=>M.object({type:M.literal(e),payload:t}),Vr=e=>M.object({type:M.literal(e)}),U0=M.discriminatedUnion("type",[Vr("state:get"),Vr("issues:list"),Vr("sync"),Vr("time-travel:live"),Vr("diff-stats:get"),oe("project:open",M.object({root:M.string().min(1)})),oe("issues:create",M.object({title:M.string(),parentId:ae,description:M.string().optional(),tagNames:M.array(M.string()).optional()})),oe("board:create",M.object({title:M.string()})),oe("board:edit:title",M.object({boardId:ae,title:M.string()})),oe("swimlane:create",M.object({title:M.string(),boardId:ae})),oe("swimlane:edit:title",M.object({swimlaneId:ae,title:M.string()})),oe("swimlane:delete",M.object({swimlaneId:ae})),oe("swimlane:move",M.object({swimlaneId:ae,boardId:ae,position:TE.optional()})),oe("issues:move",M.object({issueId:ae,parentId:ae,position:TE.optional()})),oe("issue:edit:title",M.object({issueId:ae,title:M.string()})),oe("issue:edit:description",M.object({issueId:ae,description:M.string()})),oe("issue:tag:add",M.object({issueId:ae,tagName:M.string()})),oe("issue:tag:remove",M.object({issueId:ae,tagId:ae})),oe("contributor:remove",M.object({contributorId:ae})),oe("tag:remove",M.object({tagId:ae})),M.object({type:M.literal("contributors:get"),payload:M.object({boardId:ae.optional()}).optional()}),oe("issue:assignee:add",M.object({issueId:ae,assigneeId:ae.optional(),assigneeName:M.string().optional(),createUnlinked:M.boolean().optional()})),oe("issue:assignee:remove",M.object({issueId:ae,assigneeId:ae})),oe("issue:close",M.object({issueId:ae})),oe("issue:reopen",M.object({issueId:ae})),oe("issue:comment:add",M.object({issueId:ae,body:M.string()})),oe("issue:comment:delete",M.object({issueId:ae,commentId:ae})),oe("issue:comment:edit",M.object({issueId:ae,commentId:ae,body:M.string()})),oe("issue:get",M.object({issueId:ae})),oe("issue:preview:get",M.object({issueId:ae})),M.object({type:M.literal("timeline:get"),payload:M.object({start:ba.optional(),end:ba.optional(),boardId:ae.optional(),requestId:M.number().finite().optional()}).optional()}),M.object({type:M.literal("commits:get"),payload:M.object({start:ba.optional(),end:ba.optional(),requestId:M.number().finite().optional()}).optional()}),oe("time-travel:scrub",M.object({targetTime:ba})),oe("time-travel:checkout-event",M.object({eventId:M.string().min(1)})),oe("commit:inspect",M.object({sha:M.string(),repo:M.string().max(80).optional()})),Vr("repos:get"),oe("repo:preview",M.object({url:M.string().min(1).max(qs),branches:M.enum(["default","all"]).optional(),since:M.string().max(20).optional(),label:M.string().max(24).optional()})),oe("repo:preview:cancel",M.union([M.object({repo:M.string().min(1).max(80)}),M.object({url:M.string().min(1).max(qs)})])),oe("repo:connect",M.object({url:M.string().min(1).max(qs),branches:M.enum(["default","all"]).optional(),since:M.string().max(20).optional(),label:M.string().max(24).optional()})),oe("repo:disconnect",M.object({repo:M.string().min(1).max(2e3)})),M.object({type:M.literal("emails:get")}),oe("email:link",M.object({email:M.string().min(1).max(254),contributorId:M.string().min(1).optional()})),oe("email:unlink",M.object({email:M.string().min(1).max(254),contributorId:M.string().min(1).optional()})),oe("commit:diff:get",M.object({sha:M.string(),repo:M.string().max(80).optional()})),oe("issue:commits:get",M.object({issueId:ae})),oe("issue:squashed-diff:get",M.object({issueId:ae})),oe("issue:stats:get",M.object({issueId:ae})),oe("swimlane:stats:get",M.object({swimlaneId:ae})),Vr("me:stats:get"),Vr("settings:get"),oe("settings:set",M.object({autoSync:M.boolean().optional(),autoSyncIntervalMs:M.number().finite().optional()}))]);var ME=e=>{let t=U0.safeParse(e);return t.success?{ok:!0,message:t.data}:{ok:!1,error:`Invalid message: ${t.error.issues.map(r=>`${r.path.join(".")||"<root>"}: ${r.message}`).join(", ")}`}};var W0=1024*1024,gf=()=>{Un({type:"state",payload:Io(xo())})},LE=()=>{Un({type:"repos:changed"})},hf=async(e,t)=>{G0(await sf({repoRoot:e,minIntervalMs:t}))},G0=e=>{a(e)||(e.value.some(t=>t.changed)&&LE(),e.value.some(t=>t.changed||!t.ok)&&Un({type:"repos:fetched"}))},Z=(e,t)=>{e.send(JSON.stringify(t))},xa=async(e,t)=>{let n=Io(await on({repoRoot:t}));return a(n)&&n.message===jd?Z(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:NE(t)}}):Z(e,{type:"state",payload:n})},V0=async(e,t)=>{let n=()=>Z(e,{type:"state",payload:Io(xo())});if(nt().mode!=="live")return n();let r=await on({repoRoot:t});return nt().mode!=="live"?n():Z(e,{type:"state",payload:Io(r)})},We=async(e,t,n,r,o)=>{if(Z(e,{type:r,payload:o}),a(o))return Z(e,{type:"failed",payload:o.message});n(),V0(e,t)},kE=(e,t,{onStateChanged:n,onSyncSettingsChanged:r,getPort:o})=>{new H0({server:e,path:"/ws",maxPayload:W0,verifyClient:i=>!cf(i.origin,o())}).on("connection",i=>{Ub(i),i.on("message",async c=>{let d=async f=>{let{type:g}=f,h=t.repoRoot;if(g==="project:open"){let y=AE(f.payload.root);return Z(i,{type:"project:open:result",payload:y}),a(y)?void 0:(t.repoRoot=y.value,xa(i,y.value))}if(g==="timeline:get"){let{requestId:y,...v}=f.payload??{};return Z(i,{type:"timeline",requestId:y,payload:await MR({repoRoot:h,...v})})}if(g==="issue:get"){let y=f.payload?.issueId,v=xo(),R=Bp(y);return Z(i,{type:"issue",payload:a(v)?v:u("Issue detail",{...qR(v.value,y),history:a(R)?[]:R.value})})}if(g==="issue:preview:get"){let{issueId:y}=f.payload,v=Ap(y);return Z(i,{type:"issue:preview:result",payload:{issueId:y,result:a(v)?v:u("Issue preview",YR(y,v.value))}})}if(g==="commits:get"){let{requestId:y,...v}=f.payload??{};return Z(i,{type:"commits",requestId:y,payload:ha(await Ci({repoRoot:h,...v}))})}if(g==="emails:get")return Z(i,{type:"emails",payload:await jc({repoRoot:h}),suggestions:await Uc({repoRoot:h})});if(g==="email:link"||g==="email:unlink"){let v=await(g==="email:link"?Qp:ef)({repoRoot:h,...f.payload});return Z(i,{type:"emails",payload:await jc({repoRoot:h}),suggestions:await Uc({repoRoot:h}),lastAction:a(v)?{ok:!1,message:v.message}:{ok:!0,message:v.message}}),We(i,h,n,`${g}:result`,v)}if(g==="me:stats:get")return Z(i,{type:"me:stats",payload:await tf({repoRoot:h})});if(g==="settings:get")return Z(i,{type:"settings",payload:oa()});if(g==="settings:set"){let y=Rs({enabled:f.payload.autoSync,intervalMs:f.payload.autoSyncIntervalMs});return a(y)||r(),Z(i,{type:"settings",payload:a(y)?oa():y,lastAction:a(y)?{ok:!1,message:y.message}:{ok:!0,message:y.message}})}if(g==="commit:inspect")return Z(i,{type:"commit:inspect:result",payload:await Di({repoRoot:h,sha:f.payload.sha,repo:f.payload.repo})});if(g==="commit:diff:get"){let{sha:y,repo:v}=f.payload;return Z(i,{type:"commit:diff:result",payload:{sha:y,repo:v,result:await dm({repoRoot:h,sha:y,repo:v})}})}if(g==="repos:get"){let y=await im(h);return Z(i,{type:"repos",payload:await Eo({repoRoot:h}),own:y})}if(g==="repo:preview"){let y=await Hc({repoRoot:h,...f.payload,previewOnly:!0});return Z(i,{type:"repos",for:g,url:f.payload.url.trim(),payload:a(y)?await Eo({repoRoot:h}):y,preview:a(y)?null:y.value.preview??null,lastAction:{ok:!a(y),message:y.message}})}if(g==="repo:preview:cancel")return of(f.payload),Z(i,{type:"repos",for:g,payload:await Eo({repoRoot:h}),preview:null});if(g==="repo:connect"||g==="repo:disconnect"){let y=g==="repo:connect"?await Hc({repoRoot:h,...f.payload,confirm:!0}):await rf({repoRoot:h,...f.payload});return Z(i,{type:"repos",for:g,payload:a(y)?await Eo({repoRoot:h}):y,preview:null,lastAction:{ok:!a(y),message:y.message}}),a(y)?Z(i,{type:`${g}:result`,payload:y}):(!a(y)&&y.message!==vi&&!y.message.startsWith(Qo)&&LE(),We(i,h,n,`${g}:result`,y))}if(g==="issue:commits:get"){let{issueId:y}=f.payload;return Z(i,{type:"issue:commits:result",payload:{issueId:y,result:ha(await io({repoRoot:h,ref:z(y)}))}})}if(g==="issue:squashed-diff:get"){let{issueId:y}=f.payload;return Z(i,{type:"issue:squashed-diff:result",payload:{issueId:y,result:await um({repoRoot:h,ref:z(y)})}})}if(g==="issue:stats:get"){let{issueId:y}=f.payload;return Z(i,{type:"issue:stats:result",payload:{issueId:y,result:await qc({repoRoot:h,idOrRef:z(y)})}})}if(g==="diff-stats:get")return Z(i,{type:"diff-stats",payload:await bE({repoRoot:h})});if(g==="swimlane:stats:get"){let{swimlaneId:y}=f.payload;return Z(i,{type:"swimlane:stats:result",payload:{swimlaneId:y,result:await CE({repoRoot:h,swimlaneId:y})}})}if(g==="time-travel:scrub"){let y=await Rp({repoRoot:h,targetTime:f.payload.targetTime});return Z(i,{type:"time-travel:result",payload:y}),a(y)?void 0:gf()}if(g==="time-travel:checkout-event"){let y=await kR({repoRoot:h,eventId:f.payload.eventId});return Z(i,{type:"time-travel:result",payload:y}),a(y)?void 0:gf()}if(g==="time-travel:live"){let y=await PR({repoRoot:h});return Z(i,{type:"time-travel:result",payload:y}),a(y)?void 0:gf()}if(g==="state:get")return xa(i,h);if(g==="sync"){let y=await la({repoRoot:h});return Z(i,{type:"sync:result",payload:y}),n(),a(y)||hf(h),xa(i,h)}if(g==="issue:comment:add"){let y=await ma({repoRoot:h,...f.payload});return We(i,h,n,"issue:comment:add:result",y)}if(g==="issue:comment:edit"){let y=await Zp({repoRoot:h,...f.payload});return We(i,h,n,"issue:comment:edit:result",y)}if(g==="issue:comment:delete"){let y=await pa({repoRoot:h,...f.payload});return Z(i,{type:"issue:comment:delete:result",payload:y}),a(y)?Z(i,{type:"failed",payload:y.message}):(n(),xa(i,h))}if(g==="issue:edit:description"){let y=await Fp({repoRoot:h,...f.payload});return We(i,h,n,"issue:edit:description:result",y)}if(g==="issue:edit:title"){let y=await _p({repoRoot:h,...f.payload});return We(i,h,n,"issue:edit:title:result",y)}if(g==="issue:tag:add"){let y=await Vp({repoRoot:h,...f.payload});return We(i,h,n,"issue:tag:add:result",y)}if(g==="issue:tag:remove"){let y=await Kp({repoRoot:h,...f.payload});return We(i,h,n,"issue:tag:remove:result",y)}if(g==="contributor:remove"){let y=await Yp({repoRoot:h,...f.payload});return We(i,h,n,"contributor:remove:result",y)}if(g==="tag:remove"){let y=await zp({repoRoot:h,...f.payload});return We(i,h,n,"tag:remove:result",y)}if(g==="contributors:get")return Z(i,{type:"contributors",boardId:f.payload?.boardId,payload:await Xp({repoRoot:h,...f.payload})});if(g==="issue:assignee:add"){let y=await qp({repoRoot:h,...f.payload});return We(i,h,n,"issue:assignee:add:result",y)}if(g==="issue:assignee:remove"){let y=await Jp({repoRoot:h,...f.payload});return We(i,h,n,"issue:assignee:remove:result",y)}if(g==="issues:list")return Z(i,{type:"issues",payload:await Lp({repoRoot:h})});if(g==="issues:create"){let y=await kp({...f.payload,repoRoot:h});return Z(i,{type:"issues:create:result",payload:y}),a(y)?Un({type:"failed",payload:y.message}):(n(),xa(i,h))}if(g==="board:create"){let y=await $p({...f.payload,repoRoot:h});return We(i,h,n,"board:create:result",y)}if(g==="board:edit:title"){let y=await jp({...f.payload,repoRoot:h});return We(i,h,n,"board:edit:title:result",y)}if(g==="swimlane:create"){let y=await Up({...f.payload,repoRoot:h});return We(i,h,n,"swimlane:create:result",y)}if(g==="swimlane:edit:title"){let y=await Hp({...f.payload,repoRoot:h});return We(i,h,n,"swimlane:edit:title:result",y)}if(g==="swimlane:delete"){let y=await Gp({...f.payload,repoRoot:h});return We(i,h,n,"swimlane:delete:result",y)}if(g==="swimlane:move"){if(!f.payload.position)return Z(i,{type:"error",message:"Missing move position"});let y=await Wp({...f.payload,repoRoot:h});return We(i,h,n,"swimlane:move:result",y)}if(g==="issues:move"){if(!f.payload.position)return Z(i,{type:"error",message:"Missing move position"});let y=await Dp({...f.payload,repoRoot:h});return We(i,h,n,"issues:move:result",y)}if(g==="issue:close"){let y=await Pp({repoRoot:h,issueId:f.payload.issueId});return We(i,h,n,"issue:close:result",y)}if(g==="issue:reopen"){let y=await Op({repoRoot:h,issueId:f.payload.issueId});return We(i,h,n,"issue:reopen:result",y)}return Z(i,{type:"error",message:"Unknown message type"})},p,m=async f=>{if(p!=="repo:connect"&&p!=="repo:disconnect"&&p!=="repo:preview")return Z(i,{type:"error",message:f});Z(i,{type:"repos",for:p,payload:await Eo({repoRoot:t.repoRoot}),preview:null,lastAction:{ok:!1,message:f}}),p!=="repo:preview"&&Z(i,{type:`${p}:result`,payload:l(f)})};try{let f=JSON.parse(c.toString());p=f?.type;let g=ME(f);if(!g.ok)return await m(g.error);let h=g.message;return wE.has(h.type)?await Vn(async()=>nt().mode!=="live"?Z(i,{type:"failed",payload:"Read-only while viewing history"}):d(h)):await d(h)}catch(f){return m(f instanceof Error?f.message:String(f))}})})};var X0=wo.dirname(Y0(import.meta.url)),J0=process.env.IS_LOCAL==="true"?wo.resolve(process.cwd(),"dist/gui"):wo.join(X0,"gui"),Yc,Z0=async()=>(Yc===void 0&&(Yc=await import("node:sea").catch(()=>null)),Yc?.isSea()?Yc:null),De=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},Q0=e=>De(e,409,{isError:!0,message:"Read-only while viewing history"}),Xc=(e,t)=>Vn(async()=>nt().mode!=="live"?Q0(e):t()),PE=async(e,t=1024*1024)=>new Promise((n,r)=>{let o=[],s=0;e.on("data",i=>{if(s+=i.length,s>t){e.destroy(),r(new Error("Request body too large"));return}o.push(i)}),e.on("end",()=>{let i=Buffer.concat(o).toString("utf8");try{n(i?JSON.parse(i):{})}catch{r(new Error("Invalid JSON body"))}}),e.on("error",r)}),eO=2*1024*1024,tO={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},nO=e=>e.endsWith(".html")?"text/html; charset=utf-8":e.endsWith(".js")?"text/javascript; charset=utf-8":e.endsWith(".css")?"text/css; charset=utf-8":e.endsWith(".json")?"application/json; charset=utf-8":e.endsWith(".ico")?"image/x-icon":"application/octet-stream",OE=new Map,rO=e=>`"${K0("sha1").update(e).digest("base64url")}"`,oO=async e=>{try{let{size:t,mtimeMs:n}=await z0(e);return`${t}:${n}`}catch{return null}},sO=e=>{try{return decodeURIComponent(e)}catch{return null}},DE=async(e,t,n)=>{let r=e==="/"?"/index.html":sO(e);if(r===null)return De(n,404,{isError:!0,message:"Not found"});let o=r.replace(/^\/+/,""),s=wo.resolve(J0),i=wo.resolve(s,o),c=wo.relative(s,i);if(c.startsWith("..")||wo.isAbsolute(c))return De(n,403,{isError:!0,message:"Forbidden"});let d=await Z0(),p=d?"sea":await oO(i),m=p===null?void 0:OE.get(c),f=m&&m.stamp===p?m.etag:null;if(f&&t.headers["if-none-match"]===f)return n.writeHead(304,{etag:f,"cache-control":"no-cache"}),n.end();try{let g=d?Buffer.from(d.getAsset(`gui/${c}`)):await BE(i),h=f??rO(g);return p!==null&&OE.set(c,{stamp:p,etag:h}),n.writeHead(200,{"content-type":nO(i),etag:h,"cache-control":"no-cache"}),n.end(g)}catch{return De(n,404,{isError:!0,message:`Not found: ${o}`})}},iO=async(e,t=fa)=>new Promise((n,r)=>{let o=s=>{let i=d=>{if(e.off("listening",c),d.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),o(0);return}r(d)},c=()=>{e.off("error",i);let d=e.address();if(!d||typeof d=="string"){r(new Error("Unable to resolve address"));return}n(d.port)};e.once("error",i),e.once("listening",c),e.listen(s,"127.0.0.1")};o(t)}),FE=async e=>{bR(!1);let t=0,n={repoRoot:e.repoRoot},r=q0.createServer((p,m)=>{o(p,m).catch(f=>(logger.error(`[gui] ${p.method} ${p.url}: ${f instanceof Error?f.message:String(f)}`),m.headersSent?m.end():De(m,500,{isError:!0,message:"Internal error"})))});async function o(p,m){let f=new URL(p.url??"/","http://127.0.0.1"),g=QR({method:p.method,origin:p.headers.origin,contentType:p.headers["content-type"]},t);if(g)return De(m,g.status,{isError:!0,message:g.message});if(p.method==="GET"&&f.pathname===af)return De(m,200,{app:lf,repoRoot:Wc(n.repoRoot),version:Ut,pid:process.pid});if(f.pathname==="/api/state")return De(m,200,await on({repoRoot:n.repoRoot}));if(p.method==="POST"&&f.pathname==="/api/comments")try{let h=await PE(p);if(!h.issueId||!h.body?.trim())return De(m,400,{isError:!0,message:"Missing issueId or body"});let y=h.issueId,v=h.body;return await Xc(m,async()=>{let R=await ma({repoRoot:n.repoRoot,issueId:y,body:v});return a(R)?De(m,400,{isError:!0,message:R.message}):De(m,200,await on({repoRoot:n.repoRoot}))})}catch(h){return De(m,400,{isError:!0,message:h instanceof Error?h.message:"Unable to add comment"})}if(p.method==="POST"&&f.pathname==="/api/attachments")try{let h=await PE(p,eO);if(!h.issueId||!h.dataBase64)return De(m,400,{isError:!0,message:"Missing issueId or dataBase64"});let y=h.issueId,v=h.dataBase64,R=h.name??"";return await Xc(m,async()=>{let S=await Cp({repoRoot:n.repoRoot,issueId:y,name:R,dataBase64:v});return a(S)?De(m,400,{isError:!0,message:S.message}):De(m,200,{...await on({repoRoot:n.repoRoot}),attachment:S.value})})}catch(h){return De(m,400,{isError:!0,message:h instanceof Error?h.message:"Unable to add attachment"})}if(p.method==="DELETE"&&f.pathname.startsWith("/api/attachments/")){let h=decodeURIComponent(f.pathname.replace("/api/attachments/",""));return h?Xc(m,async()=>{let y=await wp({repoRoot:n.repoRoot,attachmentId:h});return a(y)?De(m,400,{isError:!0,message:y.message}):De(m,200,await on({repoRoot:n.repoRoot}))}):De(m,400,{isError:!0,message:"Missing attachment id"})}if(p.method==="GET"&&f.pathname.startsWith("/media/")){let h=decodeURIComponent(f.pathname.replace("/media/","")),y=await Np({repoRoot:n.repoRoot,fileName:h});if(a(y))return De(m,404,{isError:!0,message:y.message});try{let v=await BE(y.value.filePath);return m.writeHead(200,{"content-type":tO[y.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),m.end(v)}catch{return De(m,404,{isError:!0,message:"Attachment blob not found"})}}if(p.method==="DELETE"&&f.pathname.startsWith("/api/comments/")){let h=decodeURIComponent(f.pathname.replace("/api/comments/",""));return h?Xc(m,async()=>{let y=await pa({repoRoot:n.repoRoot,commentId:h});return a(y)?De(m,400,{isError:!0,message:y.message}):De(m,200,await on({repoRoot:n.repoRoot}))}):De(m,400,{isError:!0,message:"Missing comment id"})}return f.pathname.startsWith("/board/")||f.pathname==="/log"?DE("/",p,m):DE(f.pathname,p,m)}try{t=await iO(r)}catch(p){return l(p instanceof Error?`Unable to start GUI server: ${p.message}`:`Unable to start GUI server: ${String(p)}`)}let s=JR({project:n}),i=zR({project:n,publisher:s,onReposFetch:p=>hf(n.repoRoot,p)}),c=ZR(s);kE(r,n,{onStateChanged:()=>i.queueSync(),onSyncSettingsChanged:()=>i.reschedule(),getPort:()=>t}),r.on("close",()=>{i.dispose(),c()});let d=r.address();return!d||typeof d=="string"?(r.close(),l("Unable to resolve GUI server address")):u("Started GUI server",{url:`http://epiq.localhost:${d.port}${e.boardId?`/board/${e.boardId}`:""}`,server:r})};var _E=async e=>{let t=c=>{e.open!==!1&&Fg()&&_g(c)},n=Lo({});if(a(n))return l(n.message);let r=Et();Re(r)&&ze(r.value);let o=await VR(fa);if(o&&o.repoRoot===Wc(e.repoRoot)){let c=`http://127.0.0.1:${fa}`;return console.log(Jd({url:c,repoRoot:e.repoRoot,version:Ut,reused:!0})),t(c),u("Reused running GUI",{url:c})}let s=await FE({repoRoot:e.repoRoot,boardId:""});if(a(s))return s;let{url:i}=s.value;return console.log(Jd({url:i,repoRoot:e.repoRoot,version:Ut,reused:!1})),t(i),u("Started GUI",{url:i})};import{Box as pr}from"ink";import Le from"react";import{Box as yf,Text as Sa}from"ink";import Rn,{useEffect as aO,useMemo as lO}from"react";import{ulid as cO}from"ulid";var $E=({text:e,match:t,color:n,highlightColor:r=b.secondary,dimColor:o=!1})=>{if(!t)return Rn.createElement(Sa,{color:n,dimColor:o},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?Rn.createElement(Sa,{color:n,dimColor:o},e):Rn.createElement(Sa,{color:n,dimColor:o},e.slice(0,c),Rn.createElement(Sa,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},jE=cO(),dO=e=>`${e}`,uO=e=>{let{pendingNavTarget:t}=Br();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(Ue(C.NONE,{breadCrumb:n,contextNode:r,readOnly:x().readOnly,selectedNode:o}));return[...new Set(Object.values(C))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==C.PALETTE).map(i=>{let c=tc(i),d=Nc.find(p=>p.intent===c);return{command:i,description:d?.description??`[${i}] Run command`,isAvailable:s.has(i)}}).filter(i=>i.command.toLowerCase().startsWith(e)||e.length>=2&&i.description.toLowerCase().includes(e)).sort((i,c)=>i.isAvailable!==c.isAvailable?i.isAvailable?-1:1:i.command.localeCompare(c.command))},mO=e=>we.text({id:jE,parentNodeId:e,rank:"000000",name:"Command Palette",readonly:!0,isVirtual:!0}),pO=(e,t,n)=>we.text({id:dO(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,disabled:!e.isAvailable,readonly:!0,isVirtual:!0}),vf=[],fO=e=>{UE();let t=w.createNode(mO(x().rootNodeId));a(t)||!xr(t.value)||(vf=[t.value,...e.map((n,r)=>pO(n,r,jE)).map(w.createNode).filter(Re).map(({value:n})=>n).filter(xr)],V.navigate({contextNode:t.value,selectedIndex:0}))},UE=()=>{let e=vf.map(t=>t.id);vf=[];for(let t of e)w.deleteNode(t)};function HE({width:e,height:t}){let r=vb().value.trim().toLowerCase(),o=lO(()=>uO(r),[r]);aO(()=>(fO(o),()=>{UE()}),[o]);let s=x().selectedIndex;return Rn.createElement(yf,{flexDirection:"column",width:e,height:t-2},Rn.createElement(yt,{height:t-4,itemHeight:3,selectedIndex:s},o.map((i,c)=>{let d=c===s,p=i.isAvailable?b.accent:b.secondary2,m=i.isAvailable?"":"[unavailable] ";return Rn.createElement(yf,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:b.secondary,borderStyle:"single"},Rn.createElement(Sa,{color:p,dimColor:!i.isAvailable},d?"\u276F ":" ",Rn.createElement($E,{text:eh(i.command),match:r,color:p,dimColor:!i.isAvailable})),Rn.createElement(yf,{paddingLeft:2},Rn.createElement($E,{text:m+i.description,match:r.length>=2?r:"",color:d&&i.isAvailable?b.primary:b.secondary2,dimColor:!i.isAvailable})))})))}import{Box as TO}from"ink";import Qc from"react";import Ea from"chalk";import{Box as Ra,Text as zE}from"ink";import No,{useEffect as KE,useMemo as gO,useState as qE}from"react";var As=["\u2803","\u2806","\u2830","\u2818"],WE=120,GE=({isPalette:e,isPending:t,frame:n})=>{if(t){let r=(n%As.length+As.length)%As.length;return As[r]}return e?"?":":"},VE=({infoMessage:e,isPending:t})=>t&&e.includes(he)?"":e;var YE=Ea.hex(b.secondary),hO=Ea.inverse,yO=Ea.inverse.hex(b.secondary2),vO={hint:"",hints:[],overlap:0,remainder:""},JE=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},bO=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=Ze(t);return{bg:r=>Ea.bgHex(n).black(r),bgCursor:r=>Ea.bgHex(n).inverse.black(r)}}return Xd(t)},xO=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=JE({value:e,command:t});if(!r)return null;let s=e.slice(r.end).match(/^\s*/)?.[0].length??0,i=r.end+s;return e.slice(i,i+n.length)!==n?null:{start:i,end:i+n.length}},XE=()=>({value:gt.value,cursorPosition:gt.cursorPosition,commandIsPending:gt.commandIsPending,autoCompletion:gt.commandMeta.autoCompletion??vO,infoMessage:gt.commandMeta.infoMessage,validationStatus:gt.commandMeta.validity,command:gt.commandMeta.command,inputString:gt.commandMeta.inputString,modifier:gt.commandMeta.modifier}),SO=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,ZE=({width:e,mode:t})=>{let[n,r]=qE(XE());KE(()=>{let N=()=>{let L=XE();r(A=>SO(A,L)?A:L)},k=Tm(N);return N(),()=>{k()}},[]);let{value:o,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:d,command:p,modifier:m,validationStatus:f}=n,g=c&&f===_n.Invalid,h=VE({infoMessage:i,isPending:c}),[y,v]=qE(0);KE(()=>{if(!c){v(0);return}let N=setInterval(()=>{v(k=>(k+1)%As.length)},WE);return()=>{clearInterval(N)}},[c]);let R=GE({isPalette:t===E.PALETTE,isPending:c,frame:y}),S=gO(()=>{let N=Math.max(0,Math.min(s,o.length)),k=JE({value:o,command:p}),L=xO({value:o,command:p,modifier:m}),A=p?Xd(p):null,O=bO({command:p,modifier:m}),j=(dt,xt)=>{let To=k&&xt>=k.start&&xt<k.end,hd=L&&xt>=L.start&&xt<L.end;return To&&A?A.fg(dt):hd&&O?O.bg(dt):dt},W=(dt,xt)=>{let To=k&&xt>=k.start&&xt<k.end,hd=L&&xt>=L.start&&xt<L.end;return To&&A?A.fgCursor(dt):hd&&O?O.bgCursor(dt):hO(dt)},ge=o.slice(0,N),D=o[N]??" ",X=N<o.length?o.slice(N+1):"",Fe=Array.from(ge).map((dt,xt)=>j(dt,xt)).join(""),fr=W(D,N),Os=Array.from(X).map((dt,xt)=>j(dt,N+1+xt)).join("");if(d.hint){let dt=d.hint[d.overlap]??D;fr=yO(dt),Os=YE(d.remainder.slice(1)+X)}return Fe+fr+Os},[o,s,d,p,m]);return No.createElement(Ra,{flexDirection:"column",justifyContent:"flex-start"},No.createElement(Ra,{flexDirection:"column",paddingX:1,borderColor:b.secondary,borderStyle:"round",width:e},No.createElement(Ra,{height:1,flexWrap:"nowrap"},No.createElement(Ra,{flexShrink:0},No.createElement(zE,{wrap:"truncate-start"},YE(R),S)),h&&No.createElement(Ra,{flexShrink:1,minWidth:0},No.createElement(zE,{wrap:"truncate",color:g?b.red:b.secondary2},` ${h} `)))))};import{Box as RO,Text as Ia}from"ink";import Ts from"react";var QE=" ",EO=({keys:e,label:t})=>e.length+1+t.length,IO=(e,t)=>{let n=[],r=0;for(let o of e){let i=(n.length>0?QE.length:0)+EO(o);if(r+i>t-4)break;n.push(o),r+=i}return n},eI=({width:e,availableHints:t})=>{let n=IO(t,e);return Ts.createElement(RO,{width:e,borderStyle:"round",borderColor:b.secondary,paddingX:1},n.length?Ts.createElement(Ia,{wrap:"truncate"},n.map(({keys:o,label:s},i)=>Ts.createElement(Ia,{key:`${o}-${s}`},i>0?QE:"",Ts.createElement(Ia,{color:b.accent},o),Ts.createElement(Ia,{color:b.secondary2}," ",s)))):Ts.createElement(Ia,{color:b.secondary2},"\xA0"))};import{Box as CO,Text as Jc}from"ink";import Ca,{useEffect as wO,useRef as Ms,useState as NO}from"react";var AO=40,Zc=.3,bf="\u2500",tI=1,nI=16,rI=({width:e})=>{let{replay:t}=le(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),i=s*tI,[c,d]=NO(0),p=Ms(r);p.current=r;let m=Ms(0),f=Ms(0),g=Ms(0),h=Ms(0),y=Ms(0);if(wO(()=>{if(!n){m.current=0,g.current=0,h.current=0,y.current=0,d(0);return}m.current=p.current,f.current=Date.now(),g.current=p.current;let k=setInterval(()=>{let L=Date.now(),A=p.current;if(A!==g.current){let D=A-g.current,X=L-f.current;if(D<0)h.current=0,y.current=0;else if(D>0&&X>0){let Fe=D/X;h.current=h.current===0?Fe:h.current*(1-Zc)+Fe*Zc,y.current=y.current===0?D:y.current*(1-Zc)+D*Zc}m.current=A,f.current=L,g.current=A}let O=L-f.current,j=Math.min(y.current,h.current*O),W=Math.min(1,m.current+j),ge=Math.round(W*i);d(D=>D===ge?D:ge)},AO);return()=>clearInterval(k)},[n,i]),!t)return null;let v=k=>{let L=s>1?k/(s-1):0,A=Math.round(L*(nI-1))/(nI-1);return Va(A)},R=Math.min(s,Math.floor(c/tI)),S=[];for(let k=0;k<R;k++){let L=v(k),A=S[S.length-1];A&&A.color===L?A.text+=bf:S.push({text:bf,color:L})}let N=bf.repeat(Math.max(0,s-R));return Ca.createElement(CO,{width:e,borderStyle:"round",borderColor:b.secondary,paddingX:1,columnGap:1},Ca.createElement(Jc,{color:b.secondary2},"\u25B6"),Ca.createElement(Jc,null,S.map((k,L)=>Ca.createElement(Jc,{key:L,color:k.color},k.text)),Ca.createElement(Jc,{color:b.secondary,dimColor:!0},N)))};var wa=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=le(),o=t===E.COMMAND_LINE||t===E.PALETTE;return Qc.createElement(TO,null,o?Qc.createElement(ZE,{width:e,mode:t}):r==="replay"?Qc.createElement(rI,{width:e}):Qc.createElement(eI,{width:e,mode:t,availableHints:n}))};import{Box as zr,Text as Ls}from"ink";import Nt,{useEffect as MO,useMemo as LO}from"react";import{ulid as oI}from"ulid";var td=oI(),kO=()=>[...new Set([...x().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(pp).filter(e=>e!==null).sort(({keys:e},{keys:t})=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(({keys:e,label:t})=>({keys:e,action:t})),PO=e=>we.text({id:td,parentNodeId:e,rank:"000000",name:"Help",isVirtual:!0,readonly:!0}),OO=(e,t,n)=>we.text({id:oI(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,readonly:!0,isVirtual:!0}),ed=[],sI=()=>{let e=ed.filter(n=>n.id!==td).map(n=>n.id),t=ed.filter(n=>n.id===td).map(n=>n.id);ed=[];for(let n of[...e,...t])w.deleteNode(n)},DO=e=>{sI();let t=w.createNode(PO(x().rootNodeId));if(a(t)||!xr(t.value))return logger.error("Could not attach help nodes");ed=[t.value,...e.map((n,r)=>OO(n,r,td)).map(w.createNode).filter(Re).map(({value:n})=>n).filter(xr)],V.navigate({contextNode:t.value,selectedIndex:0})},iI=({width:e,height:t})=>{let n=LO(()=>kO(),[]);MO(()=>(DO(n),()=>{sI()}),[n]);let r=x().selectedIndex;return Nt.createElement(zr,{flexDirection:"column",marginTop:3,borderColor:b.secondary,borderStyle:"round",width:e,height:t-2},Nt.createElement(zr,{paddingX:1,justifyContent:"center"},Nt.createElement(Ls,{color:b.accent},"Help"),Nt.createElement(Ls,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Nt.createElement(zr,{paddingX:1,marginTop:1},Nt.createElement(zr,{width:20,justifyContent:"flex-end"},Nt.createElement(Ls,{color:b.secondary},"Key(s)")),Nt.createElement(zr,{flexGrow:1,width:40,paddingLeft:2},Nt.createElement(Ls,{color:b.secondary},"Action"))),Nt.createElement(yt,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},i)=>{let c=i===r;return Nt.createElement(zr,{paddingX:1,key:`${o}-${s}-${i}`,flexDirection:"row"},Nt.createElement(zr,{width:20,justifyContent:"flex-end"},Nt.createElement(Ls,{color:b.accent},o)),Nt.createElement(zr,{flexGrow:1,width:40,paddingLeft:2},Nt.createElement(Ls,{color:c?b.primary:b.secondary2},s)))})))};import{Box as ks,Text as At}from"ink";import Te,{useEffect as BO,useState as xf}from"react";var nd=({index:e,email:t,note:n,noteColor:r})=>Te.createElement(ks,null,Te.createElement(At,{color:b.accent},e===void 0?" ":` ${e}.`),Te.createElement(At,null," ",t),n&&Te.createElement(At,{color:r??b.secondary2},` ${n}`)),aI=({height:e})=>{let[t,n]=xf([]),[r,o]=xf([]),[s,i]=xf(null),{userName:c,gitEmail:d,gitName:p,userId:m}=q();return BO(()=>{let f=!0;return(async()=>{let h=ve(),y=ce(process.cwd());if(a(h)||a(y)||!m)return;let v=h.value.emailLinks,R=Nn(v,m);n(R.map(L=>({email:L,others:ei(v,L).filter(A=>A!==m).map(A=>h.value.contributors[A]?.name??A)})));let S=$e(y.value),N=await Gn({repoRoot:y.value,stateBranch:a(S)?void 0:S.value,names:[c,p],links:v});if(!f)return;if(a(N)){i(N.message);return}let k=_r(N.value);Go(k.map(L=>L.email)),o(k)})(),()=>{f=!1}},[m,c,p,d]),Te.createElement(ks,{height:e-4,flexDirection:"column",paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:b.secondary,rowGap:1},Te.createElement(ks,null,Te.createElement(At,{color:b.accent,bold:!0},c??"Not configured"),Te.createElement(At,{color:b.secondary2}," on this board")),s&&Te.createElement(At,{color:b.red},s),Te.createElement(ks,{flexDirection:"column"},Te.createElement(At,{color:b.secondary2},"CLAIMED"),t.length===0?Te.createElement(nd,{email:"Nothing claimed \u2014 your commits show the name git signed them with.",note:""}):t.map(f=>Te.createElement(nd,{key:f.email,email:f.email,note:f.others.length>0?`CONTESTED: also ${f.others.join(", ")}, resolves to nobody`:f.email===d?"your git identity here":void 0,noteColor:f.others.length>0?b.yellow:void 0}))),Te.createElement(ks,{flexDirection:"column"},Te.createElement(At,{color:b.secondary2},"UNCLAIMED IN THIS HISTORY"),r.length===0?Te.createElement(nd,{email:"Nothing left to claim here."}):r.map(f=>Te.createElement(nd,{key:f.email,email:f.email,note:`${f.commits} commit${f.commits===1?"":"s"} as ${f.names.join(", ")||"unknown"}`}))),Te.createElement(ks,{flexDirection:"column"},Te.createElement(At,{color:b.secondary2},Te.createElement(At,{color:b.accent},"[enter]")," writes a claim for the first into the command line, to confirm or change."),Te.createElement(At,{color:b.secondary2},Te.createElement(At,{color:b.accent},":config emails")," claims by address,",Te.createElement(At,{color:b.accent}," :config emails-unclaim "),"gives one back."),Te.createElement(At,{color:b.secondary2},Te.createElement(At,{color:b.accent},"[esc]")," to close")))};import FO from"chalk";import{Box as Ao,Text as lt}from"ink";import Me from"react";var _O=8,$O=()=>{let e=er({exclude:process.cwd()});return a(e)?[]:e.value.slice(0,_O)},lI=({width:e,height:t})=>{let n=$O();return Me.createElement(Ao,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:b.secondary,rowGap:1},Me.createElement(lt,{color:b.accent,bold:!0},"Initialize project"),Me.createElement(lt,null,`This folder is not an ${FO.hex(b.accent)("epiq")} project yet.`),Me.createElement(lt,{color:b.primary},"To start tracking issues here, we need to initialize a new",Me.createElement(lt,{color:b.primary,backgroundColor:b.secondary}," .epiq/project.json "),"file in this repository."),Me.createElement(Ao,{marginTop:1,flexDirection:"column"},Me.createElement(Ao,null,Me.createElement(lt,{color:b.accent}," "),Me.createElement(lt,{color:b.primary},"Type "),Me.createElement(lt,{backgroundColor:b.secondary}," :init "))),Me.createElement(Ao,{marginTop:1},Me.createElement(lt,{color:b.secondary2},"This will create, commit and push "),Me.createElement(lt,{color:b.primary,backgroundColor:b.secondary}," .epiq/project.json ")),n.length>0&&Me.createElement(Ao,{marginTop:1,flexDirection:"column"},Me.createElement(lt,{color:b.accent,bold:!0},"Or open a recent project"),n.map((r,o)=>Me.createElement(Ao,{key:r.projectId},Me.createElement(lt,{color:b.accent},` ${o+1} `),Me.createElement(lt,{color:b.primary},Wo(r.root)),Me.createElement(lt,{color:b.secondary2},` ${r.root}`))),Me.createElement(Ao,{marginTop:1},Me.createElement(lt,{color:b.accent}," "),Me.createElement(lt,{color:b.primary},"Type "),Me.createElement(lt,{backgroundColor:b.secondary}," :open 1 "),Me.createElement(lt,{color:b.secondary2}," or "),Me.createElement(lt,{backgroundColor:b.secondary}," :open <path> "))))};import{Box as od,Text as qt}from"ink";import Ge from"react";import{Box as rd,Text as mr}from"ink";import Kt,{useEffect as jO,useState as cI}from"react";var dI=()=>{let[e,t]=cI(null),[n,r]=cI(null);return jO(()=>{let o=!0;return(async()=>{let i=ve(),c=ce(process.cwd());if(a(i)||a(c))return;let d=$e(c.value),{userName:p,gitName:m}=q(),f=await Gn({repoRoot:c.value,stateBranch:a(d)?void 0:d.value,names:[p,m],links:i.value.emailLinks});if(!o)return;if(a(f)){r(f.message);return}let g=_r(f.value);Go(g.map(h=>h.email)),t(g)})(),()=>{o=!1}},[]),n?Kt.createElement(rd,{marginTop:1},Kt.createElement(mr,{color:b.red},n)):e===null?null:e.length===0?Kt.createElement(rd,{marginTop:1},Kt.createElement(mr,{color:b.secondary2},"No unclaimed addresses in this history \u2014 type",Kt.createElement(mr,{color:b.accent}," :config emails none "),"to move on.")):Kt.createElement(rd,{flexDirection:"column",marginTop:1},e.map(o=>Kt.createElement(mr,{key:o.email},Kt.createElement(mr,{color:b.accent}," \xB7 "),Kt.createElement(mr,null,o.email),Kt.createElement(mr,{color:b.secondary2},` ${o.commits} commit${o.commits===1?"":"s"} as ${o.names.join(", ")||"unknown"}`))),Kt.createElement(rd,{marginTop:1},Kt.createElement(mr,{color:b.secondary2},"Claim yours by address, or",Kt.createElement(mr,{color:b.accent}," none "),"to skip.")))};var UO=({isDone:e,command:t,value:n,verb:r="Type",hint:o})=>Ge.createElement(od,null,Ge.createElement(qt,{color:b.accent,dimColor:e},e?" \u2714 ":" "),Ge.createElement(qt,{dimColor:e},r," "),Ge.createElement(qt,{backgroundColor:b.secondary,dimColor:e}," "+t+" "),n!==void 0&&Ge.createElement(Ge.Fragment,null,Ge.createElement(qt,{dimColor:e}," "),Ge.createElement(qt,{color:b.secondary,dimColor:e},"<"+n+">")),o),HO=(e,t)=>e.length===0?void 0:Qn(e.join(", "),Math.max(12,t-34)),WO=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function Sf({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:i,isSetAutoSync:c,isSetEmails:d,claimedEmails:p,emailSetupDeclined:m}=tr(),f=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:s,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:i,message:"Almost there. Configure auto sync."},{key:"emails",done:d,command:":config emails",value:m?"declined":HO(p,e),message:"Last one. Claim the git addresses whose commits are yours, so the board calls them by your name."}],g=f.findIndex(y=>!y.done),h=g===-1?void 0:f[g];return Ge.createElement(od,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:b.secondary,rowGap:1},Ge.createElement(qt,{color:b.accent,bold:!0},"Welcome! \u{1F539}"),Ge.createElement(qt,null,"Let's get you started - it's a breeze."),Ge.createElement(qt,{color:b.secondary2},"Remember - you can always search available commands by typing:",Ge.createElement(qt,{color:b.accent}," ? ")),h&&Ge.createElement(qt,{color:b.secondary2},h.message),Ge.createElement(od,{flexDirection:"column"},f.map((y,v)=>{if(!(g===-1||v<=g))return null;let S=v===g,N=S&&g===0;return Ge.createElement(od,{key:y.key,flexDirection:"column",marginBottom:1},Ge.createElement(UO,{isDone:y.done,command:N?":config us":y.command,value:y.done?WO(y.value):void 0,verb:S&&!N?"Waiting:":"Type",hint:N?Ge.createElement(qt,{color:b.secondary2}," then ",Ge.createElement(qt,{color:b.accent},"tab")," to auto-complete ",Ge.createElement(qt,{backgroundColor:b.secondary},` ${y.command.split(" ").pop()} `)):void 0}),y.key==="emails"&&!y.done&&Ge.createElement(dI,null))})))}import cd from"chalk";import{Box as Aa,Text as Ps}from"ink";import rt from"react";import{Box as sd,Text as uI}from"ink";import Kr from"react";import GO from"chalk";var VO=e=>(w.getTag(e)?.name??"").length+3,zO=e=>{let t=w.getContributor(e);return(t?t.name:"").length+3},mI=({width:e})=>{let{viewMode:t}=q(),n=le(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[o.id]?.[s],d=_t(c?.id??o.id,"TICKET"),p=Re(d)?d.value:void 0,m=(p?.props.tags??[]).filter(A=>w.getTag(A)),f=p?.props.assignees??[],g=p?.parentNodeId?!vp(o.id,p.parentNodeId)&&t==="dense":!1,h=r.map((A,O)=>{let j=O===r.length-1,W=Ie(A.id),ge=j?W?.[s]?.title:void 0;return`${O?" / ":""}${A.title??""}${ge?` \u25B8 ${ge}`:""}`}).join(""),y=p?w.getCommentsByIssue(p.id):[],v=y.length?String(y.length).length+11:0,R=g?m.reduce((A,O)=>A+VO(O),0)+f.reduce((A,O)=>A+zO(O),0)+v:0,S=c?.id!=null&&!(t==="wide"&&$(c)),N=Math.max(0,e-R),k=h.substring(0,N)+(S?GO.hex(b.secondary2).dim(` ${z(c.id)}`):""),L=g?[...m.map(A=>Kr.createElement(sd,{key:`tag-${A}`,paddingLeft:1},Kr.createElement(ms,{id:A}))),...f.map(A=>Kr.createElement(sd,{key:`assignee-${A}`,paddingLeft:1},Kr.createElement(Lr,{id:A}))),y.length?Kr.createElement(sd,{key:"comments",paddingLeft:1},Kr.createElement(uI,{color:b.accent},"[",y.length," comment",y.length===1?"":"s","]")):null]:[];return Kr.createElement(sd,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Kr.createElement(uI,{color:b.secondary2},k),L)};import{Box as KO,Text as pI}from"ink";import id from"react";var qO=({filters:e})=>id.createElement(KO,{columnGap:1},id.createElement(pI,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>id.createElement(pI,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),fI=id.memo(qO);import{Box as YO,Text as ad}from"ink";import Na from"react";function gI(){let{eventLog:e,unappliedEvents:t}=le(),n=e.at(-1)?.id,r=jo(n??""),o=Re(r)?ic(r.value):"INVALID DATE";return Na.createElement(YO,{paddingLeft:1},Na.createElement(ad,{backgroundColor:b.accent,color:b.secondary}," Readonly "),Na.createElement(ad,{color:b.accent}," "+t.length+" edits ago at "+o+"."),Na.createElement(ad,{color:b.accent}," Resume with "),Na.createElement(ad,{backgroundColor:b.accent,color:b.secondary}," ",":peek now"," "))}import{Box as XO,Text as Rf}from"ink";import ld from"react";function hI(){let{replay:e}=le();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return ld.createElement(XO,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},ld.createElement(Rf,{backgroundColor:b.accent,color:b.secondary}," \u25B6 REPLAY "),ld.createElement(Rf,{color:b.secondary2},ic(new Date(r))),ld.createElement(Rf,{color:b.accent},`${t}/${n} edits`))}import Ef from"chalk";import{Box as JO,Text as yI}from"ink";import If,{useEffect as ZO,useState as QO}from"react";var eD=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],tD=150,vI=12,nD=.36;function bI({syncStatus:e,autoSync:t}){let[n,r]=QO(0);ZO(()=>{if(e.status!=="syncing"){r(0);return}let c=0,d=setInterval(()=>{c+=1;let p=(Math.sin(c*nD)+1)/2,m=Math.round(p*(vI-1));r(f=>f===m?f:m)},tD);return()=>clearInterval(d)},[e.status]);let o={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},i={synced:b.secondary2,failed:b.yellow,offline:b.secondary2,pending:b.secondary2,syncing:kg(eD,n/(vI-1))??""}[e.status];return If.createElement(JO,null,If.createElement(yI,null,Ef.hex(b.secondary2).dim(t?"Sync (auto): ":"Sync: ")),If.createElement(yI,null,Ef.hex(i)("\u25CF")+Ef.hex(b.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import II from"chalk";import{Text as CI}from"ink";import wI,{useEffect as iD,useState as aD}from"react";import Cf from"chalk";var rD="https://registry.npmjs.org/epiq/latest",wf=null,xI=0,oD=1e3*60*60*24,SI=e=>e.replace(/^v/,""),sD=(e,t)=>{let n=SI(e).split(".").map(Number),r=SI(t).split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let s=n[o]??0,i=r[o]??0;if(s>i)return 1;if(s<i)return-1}return 0},RI=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(wf&&Date.now()-xI<oD)return wf;try{let t=await fetch(rD);if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.status}`);let r=(await t.json()).version??null,o={current:e,latest:r,updateAvailable:r?sD(r,e)>0:!1};return wf=o,xI=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},EI=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,i)=>s!=n[i]);return r.map((s,i)=>i>=o?Cf.hex(b.accent).dim(s):Cf.hex(b.secondary).dim(s)).join(Cf.hex(b.secondary2).dim("."))};function NI(){let[e,t]=aD({current:Ut,latest:null,updateAvailable:!1});return iD(()=>{let n=!0;return RI(Ut).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?wI.createElement(CI,{dimColor:!0,color:b.secondary2},Ut+" "):wI.createElement(CI,null,II.hex(b.secondary2).dim(Ut),II.hex(b.accent).dim(" \u2197 "),EI(Ut,e.latest))}function Ta({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=le(),{userName:i,preferredEditor:c,autoSync:d}=q(),p=64,m=process.stdout.columns-p-8,f=t||n==="replay",g=s?Zn(s.currentLabel,Math.max(0,m)):"";return rt.createElement(Aa,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?rt.createElement(Aa,{paddingLeft:1},rt.createElement(Ps,{color:b.secondary2},g)):f?rt.createElement(Ps,null," "):o===E.PALETTE?rt.createElement(Aa,null,rt.createElement(Ps,{color:b.accent},"Command Palette"),rt.createElement(Ps,{dimColor:!0,color:b.secondary2}," ","- search, select and press enter")):rt.createElement(Aa,{paddingLeft:1},e.length>0?rt.createElement(fI,{filters:e}):rt.createElement(mI,{width:m})),n==="live"?rt.createElement(Aa,{columnGap:1,paddingRight:2,"max-width":p,overflow:"hidden",justifyContent:"flex-end"},rt.createElement(bI,{autoSync:!!d,syncStatus:r}),rt.createElement(Ps,null,cd.hex(b.secondary2).dim("Mode: ")+cd.hex(b.secondary2).dim(o.padEnd(8," "))," "),rt.createElement(AI,{icon:"@",value:i}),rt.createElement(AI,{icon:"\u276F",value:c}),rt.createElement(NI,null)):"",n==="peek"?rt.createElement(gI,null):"",n==="replay"?rt.createElement(hI,null):"")}function AI({icon:e,value:t}){return rt.createElement(Ps,null,cd.dim(e)+cd.hex(b.accent)(` ${t??"-"} `))}import{Box as lD,Text as cD}from"ink";import Ma from"react";import{Box as dd,Text as Nf}from"ink";import qr from"react";function Af(){let e=le(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?pe(t?.id):[];return qr.createElement(dd,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:b.secondary,width:s},qr.createElement(dd,{padding:1,paddingTop:0,paddingBottom:0},qr.createElement(Nf,null,"Select a board:")),qr.createElement(dd,{padding:1,flexDirection:"column"},i.map((c,d)=>{let p=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===d,f=pe(c.id).flatMap(({id:g})=>Ie(g)).length;return qr.createElement(dd,{key:c.id??d},qr.createElement(Nf,{color:p?b.accent:b.secondary2},qr.createElement(Dt,{isSelected:p})),qr.createElement(Nf,{color:p?b.accent:b.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var dD=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:i})=>{let{renderedChildrenIndex:c}=le(),d=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return Ma.createElement(lD,{flexDirection:"row"},e.context==="WORKSPACE"?Ma.createElement(Af,null):d?Ma.createElement(fc,{height:f,width:i,swimlanes:(c[d.id]??[]).filter(g=>g!==void 0&&An(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Ma.createElement(cD,null))},TI=Ma.memo(dD);import{useEffect as uD}from"react";var mD=e=>{uD(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:i}=q();i&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:d}=x();d==="default"&&!c&&ec(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},MI=({autoSync:e})=>(mD(e),null);import{useEffect as pD}from"react";var LI=()=>{let e=ce(process.cwd());return a(e)?u("No project here",null):me({repoRoot:e.value})},kI=async()=>{let e=LI();if(a(e))return l(e.message);if(e.value===null)return u("No project here",null);let t=e.value,n=await Nl(t);if(!st())return u("State not initialized",null);let r=ve();if(a(r))return u("State not initialized",null);let{mode:o,readOnly:s,timeMode:i,syncStatus:c,selectedNode:d,contextNode:p}=r.value;if(fS())return u("Project loading",null);let m=LI();return a(m)||m.value!==t?u("Project changed",null):o!==E.DEFAULT||s||i!=="live"?u("Skipped while not on the live board",null):d?.isVirtual||p?.isVirtual?u("Skipped on a virtual node",null):c?.status==="syncing"?u("Sync in progress",null):n?u("Worktree held by a sync",null):Ke(t)===Xo(t)?u("Log unchanged",null):(G.debug("[watch] event log moved, reloading state"),Vi(t))};var fD=1e3,PI=()=>(pD(()=>Gc(kI,fD),[]),null);function Tf({width:e,height:t}){let n=le(),{autoSync:r,viewMode:o}=Ag(),s=n.filters;if(n.mode===E.HELP)return Le.createElement(pr,{flexDirection:"column"},Le.createElement(iI,{width:e,height:t}));if(n.mode===E.IDENTITY)return Le.createElement(pr,{flexDirection:"column"},Le.createElement(aI,{width:e,height:t}));if(n.mode===E.PALETTE)return Le.createElement(pr,{flexDirection:"column"},Le.createElement(Ta,{filters:s}),Le.createElement(HE,{width:e,height:t-2}),Le.createElement(wa,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=tr(),c=!i,d=i&&!n.hasProjectDefinition;if(c)return Le.createElement(pr,{flexDirection:"column"},Le.createElement(pr,{flexDirection:"column"},Le.createElement(Ta,{hideBreadCrumb:!0,filters:s}),Le.createElement(Sf,{height:t,width:e})),Le.createElement(wa,{width:e,mode:n.mode,availableHints:[]}));if(d)return Le.createElement(pr,{flexDirection:"column"},Le.createElement(pr,{flexDirection:"column"},Le.createElement(Ta,{hideBreadCrumb:!0,filters:s}),Le.createElement(lI,{height:t,width:e})),Le.createElement(wa,{width:e,mode:n.mode,availableHints:[]}));let p=It(n.breadCrumb??[],"BOARD");if(Re(p)){let m=p.value.id,f=pe(m).length,g=3,h=Math.floor(e/g),y=Math.floor(e/Math.max(f,1));e=Math.min(y,h)*Math.max(f,g)}return Le.createElement(pr,{flexDirection:"column"},Le.createElement(MI,{autoSync:r}),Le.createElement(PI,null),Le.createElement(pr,{flexDirection:"column"},Le.createElement(Ta,{filters:s}),Le.createElement(TI,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),Le.createElement(wa,{width:e,mode:n.mode,availableHints:n.availableHints}))}import gD from"readline";var ud,md,Kn,hD=new Set([I.MoveCursorLeft,I.EraseInputWord,I.MoveCursorLeftOfWord,I.MoveCursorRight,I.MoveCursorRightOfWord,I.NavToPreviousContainer,I.NavToNextContainer,I.NavPreviousItem,I.NavNextItem,I.NavPreviousItemJump,I.NavNextItemJump,I.SetViewDense,I.SetViewWide,I.Confirm,I.Exit,I.Yank,I.InitCommandLine,I.InitCommandPalette,I.ExitCommandLine,I.CaptureInput,I.EraseInput,I.EraseInputWord,I.HideHelp,I.ViewHelp,I.SetViewDense,I.SetViewWide,I.GetLastCommandFromHistory,I.GetNextCommandFromHistory,I.AutoCompleteCommand]),yD=new Set([I.NavPreviousItem,I.NavNextItem,I.NavPreviousItemJump,I.NavNextItemJump,I.NavToPreviousContainer,I.NavToNextContainer,I.Confirm,I.Exit,I.InitCommandPalette,I.InitMove,I.MoveNextItem,I.MovePreviousItem,I.MoveNextItemJump,I.MovePreviousItemJump,I.MoveToNextContainer,I.MoveToPreviousContainer,I.Delete,I.AddItem,I.EditTitle,I.EditDescription,I.ConfirmMove,I.Edit,I.ViewHelp,I.Yank]),OI=async e=>{if(e.ctrl&&e.name==="c")return V.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=x(),s=bb(e,n);if(!s||r&&!hD.has(s)||o==="replay"&&n===E.DEFAULT&&yD.has(s))return;let i=t[n]?.[s];if(i?.action)try{await i.action(i,e)}catch(c){logger.error(c)}},vD=()=>async function(t,n){n.name!=="escape"&&(Kn&&(clearTimeout(Kn),Kn=void 0),await OI(n))},bD=()=>async function(t){if(t.length===1&&t[0]===27){Kn&&clearTimeout(Kn),Kn=setTimeout(()=>{OI({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Kn=void 0},25);return}Kn&&(clearTimeout(Kn),Kn=void 0)};function DI(){ud&&process.stdin.removeListener("keypress",ud),md&&process.stdin.removeListener("data",md),ud=vD(),md=bD(),gD.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",md),process.stdin.on("keypress",ud)}async function BI(){try{let e=Lo({});if(a(e))return hn(0,e.message);let t=Et();Re(t)&&ze(t.value);let n=ce(process.cwd());ze({gitEmail:await Dc(process.cwd()),gitName:await Hr(process.cwd())});let r=Re(n)?await vc(n.value):gS();if(a(r))return r;let o=Mf();return a(o)?hn(6,o.message):(DI(),Re(n)&&bc(n.value),u("Booted Epiq",void 0))}catch(e){return hn(0,cs(e))}}Jx();var ED=`${Yt.bold("Epiq CLI")}
117
-
118
- ${Yt.dim("Boot in directory:")}
119
- ${Yt.cyan("$ epiq")}
120
-
121
- ${Yt.dim("Launch GUI:")}
122
- ${Yt.cyan("$ epiq gui")}
123
- ${Yt.cyan("$ epiq gui --no-open")} ${Yt.dim("no browser")}
124
-
125
- ${Yt.dim("Act as somebody other than the configured user:")}
126
- ${Yt.cyan("$ epiq --as claude")}
127
- `,gd=SD(ED,{importMeta:import.meta,version:Ut,flags:{init:{type:"boolean",default:!1},as:{type:"string"},open:{type:"boolean",default:!0}}}),pd=gd.input[0];pd&&pd!=="gui"&&(console.error(Yt.red(`Unknown command: ${pd}`)),process.exit(1));if(gd.flags.as!==void 0){let e=bd(gd.flags.as,"--as");a(e)&&(console.error(Yt.red(e.message)),process.exit(1))}var FI=process.stdout.columns||120,_I=process.stdout.rows||20,fd=null,ID=e=>{try{return fd?(fd.rerender(e),u("Rerendered app",void 0)):(fd=xD(e),u("Rendered app",void 0))}catch(t){return l(`Unable to render app: ${cs(t)}`)}},Mf=()=>ID(RD.createElement(Tf,{width:FI,height:_I}));process.stdout.on("resize",()=>{if(FI=process.stdout.columns||120,_I=process.stdout.rows||20,!fd)return;let e=Mf();a(e)&&logger.info(`[boot:resize] ${e.message}`)});if(pd==="gui"){let e=await _E({repoRoot:process.cwd(),open:gd.flags.open});a(e)&&(console.error(Yt.red(`Failed to start Epiq GUI:
128
- ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await BI();a(e)&&(logger.info(e.message),console.error(Yt.red(`Failed to boot Epiq:
129
- ${e.message}`)),process.exitCode=1)}export{Mf as renderApp};
2
+ process.env.NODE_ENV||="production";await import("./Index-RHWGRER4.js");