epiq 1.8.5 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gui/main.js +6379 -3246
- package/dist/index.js +100 -86
- package/dist/mcp.js +90 -76
- package/package.json +5 -3
- package/readme.md +2 -1
package/dist/index.js
CHANGED
|
@@ -1,102 +1,116 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
`,"utf8"),u("Created project.json",null)}catch(o){return
|
|
4
|
-
`);return i===-1?"":s.slice(i+1)}finally{
|
|
5
|
-
`);if(n[n.length-1]===""&&n.pop(),t<=
|
|
2
|
+
import ln from"chalk";import{render as sM}from"ink";import iM from"meow";import aM from"react";import Sb from"chalk";import Sx from"node:crypto";var Xn={Success:"success",Fail:"fail"},c=e=>({status:Xn.Fail,message:e,value:null}),u=(e,t)=>({status:Xn.Success,message:e,value:t}),a=e=>e.status==="fail",be=e=>e.status==="success";var wn="EPIQ_USER_NAME",Ii="EPIQ_USER_ID",rm="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Rx=26,_l=80,jl=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Ei=e=>e.trim().length>0&&e.length<=_l,ro=e=>e.trim().toLowerCase(),Cx=e=>{let t=Sx.createHash("sha256").update(`epiq:actor:${ro(e)}`).digest(),n="";for(let r=0;r<Rx;r++)n+=rm[(t[r]??0)%rm.length];return n},oo=(e,t=process.env)=>{let n=(t[wn]??"").trim(),r=(t[Ii]??"").trim();return n?Ei(n)?!r&&e.userId&&e.userName&&ro(e.userName)===ro(n)?u("Actor override names the configured user",{userId:e.userId,userName:e.userName}):r&&!jl(r)?c(`${Ii} must be 26 characters of Crockford base32`):r&&e.userId&&r===e.userId?c(`${Ii} 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||Cx(n),userName:r?n:ro(n)}):c(`${wn} must be 1-${_l} characters of text`):r?c(`${Ii} is set without ${wn}`):u("No actor override",null)},$l=(e,t,n=process.env)=>{let r=e.trim();if(!Ei(r))return c(`${t} must be 1-${_l} characters of text`);let o=(n[wn]??"").trim();return o&&ro(o)!==ro(r)?c(`${t} names ${r}, but ${wn} names ${o}`):(o||(n[wn]=r),u("Applied actor name argument",o||r))};import iI from"node:path";import{z as Kt}from"zod";import os from"node:fs";import dn from"node:path";import Jn from"node:fs";import xt from"node:path";import Qo from"node:fs";import{ulid as Nx}from"ulid";import{z as Si}from"zod";var Ax="__epiq_state__",Tx=Si.object({projectId:Si.string().min(1),stateBranch:Si.string().min(1),createdAt:Si.iso.datetime()}),Ri=()=>({projectId:Nx(),stateBranch:Ax,createdAt:new Date().toISOString()}),Tt=e=>{let t=so(e);if(!Qo.existsSync(t))return c("Missing .epiq/project.json");try{let n=Qo.readFileSync(t,"utf8"),r=JSON.parse(n),o=Tx.safeParse(r);return o.success?u("Read project.json",o.data):c(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return c(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},cn=e=>{let t=Tt(e);return a(t)?c(t.message):u("Read projectId",t.value.projectId)},Ul=({repoRoot:e,fileContents:t})=>{let n=Tr(e),r=so(e);try{if(Qo.mkdirSync(n,{recursive:!0}),Qo.existsSync(r)){let o=Tt(e);return a(o)?c(o.message):u("Project already initialized",null)}return Qo.writeFileSync(r,JSON.stringify(t,null,2)+`
|
|
3
|
+
`,"utf8"),u("Created project.json",null)}catch(o){return c(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};import wx from"node:os";import Mx from"node:path";var Gt=".epiq-global",Mn=()=>process.env.EPIQ_GLOBAL_DIR??Mx.join(wx.homedir(),Gt);var Hl=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let i=r(...s);if(!n.has(i)){let l=e(...s).then(d=>(a(d)&&n.delete(i),d));n.set(i,l)}return n.get(i)});return o.clear=()=>n.clear(),o};import Vt from"fs";import Kl from"path";import Px from"util";var om=500,ql=4*1024*1024,Wl=16*1024,Lx=50,Gl=0,sm=()=>process.env.EPIQ_MCP==="true",kx=()=>{let e=process.cwd(),t=Ci(e);return a(t)?sm()?Kl.join(Mn(),"epiq-mcp.log"):void 0:Kl.join(t.value,gt,"log","epiq.log")},Dx=(e,t)=>{let n=Vt.statSync(e).size;if(n<=t)return Vt.readFileSync(e,"utf8");let r=Vt.openSync(e,"r");try{let o=Buffer.alloc(t);Vt.readSync(r,o,0,t,n-t);let s=o.toString("utf8"),i=s.indexOf(`
|
|
4
|
+
`);return i===-1?"":s.slice(i+1)}finally{Vt.closeSync(r)}};function Bx(e){if(!Vt.existsSync(e))return;let t=Vt.statSync(e).size,n=Dx(e,ql).split(`
|
|
5
|
+
`);if(n[n.length-1]===""&&n.pop(),t<=ql&&n.length<=om)return;let r=n.slice(-om).join(`
|
|
6
6
|
`)+`
|
|
7
|
-
`;
|
|
8
|
-
`;try{
|
|
9
|
-
`);
|
|
10
|
-
`)))}),o.on("close",f=>{let g=f??1;if(n){
|
|
11
|
-
`)));return}
|
|
12
|
-
${s}`:""}`));return}let
|
|
7
|
+
`;Vt.writeFileSync(e,r,"utf8")}var Ox=e=>{if(e.length<=Wl)return e;let t=e.length-Wl;return`${e.slice(0,Wl)} \u2026 [${t} more chars]`};function Vl(e,t,n=!1){let r=kx();if(!r)return;let o=Ox(Px.format(...t)),s=new Date,l=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
|
|
8
|
+
`;try{Vt.mkdirSync(Kl.dirname(r),{recursive:!0}),Vt.appendFileSync(r,l,"utf8"),Gl++,(Gl>=Lx||Vt.statSync(r).size>ql)&&(Gl=0,Bx(r))}catch{}}var zl=()=>sm()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",oe={info(...e){let t=zl();(t==="info"||t==="debug")&&Vl("[Info]",e,!1)},debug(...e){zl()==="debug"&&Vl("[Debug]",e,!0)},error(...e){let t=zl();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;Vl("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=oe;import{spawn as am}from"node:child_process";import Pn from"node:fs";import Ln from"node:path";var Ae={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 Qe=e=>{let t=me(e);if(a(t))return c("Unable to resolve epiq project root");let n=Tt(t.value);return a(n)?c("Unable to read project.json"):u("Resolved state branch",n.value.stateBranch)},wt="origin";var Yl=1e4,Fx=12e4,_x=new Set(["fetch","push","pull","clone","ls-remote","rebase","checkout","worktree"]),jx=e=>{let t=e.find((n,r)=>!n.startsWith("-")&&e[r-1]!=="-c");return t&&_x.has(t)?Fx:Yl},$x=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(Ln.delimiter))if(t)for(let n of e){let r=Ln.join(t,n);try{if(!Pn.statSync(r).isFile())continue;return Pn.accessSync(r,Pn.constants.X_OK),r}catch{continue}}return"git"},lm=$x(),cm={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},dm=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Pn.existsSync(t)){let f=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:f,exitCode:1});return}r(c(f));return}let o=am(lm,e,{cwd:t,stdio:["ignore","pipe","pipe"],env:cm}),s=!1,i="",l="",d=f=>{s||(s=!0,clearTimeout(m),r(f))},p=jx(e),m=setTimeout(()=>{o.kill("SIGTERM");let f=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${p}ms`].join(`
|
|
9
|
+
`);d(n?{stdout:i,stderr:f,exitCode:124}:c(f))},p);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",f=>{i+=f}),o.stderr.on("data",f=>{l+=f}),o.on("error",f=>{if(n){d({stdout:i,stderr:f.message,exitCode:1});return}d(c([`git ${e.join(" ")}`,`cwd=${t}`,f.message].join(`
|
|
10
|
+
`)))}),o.on("close",f=>{let g=f??1;if(n){d({stdout:i,stderr:l,exitCode:g});return}if(g!==0){d(c([`git ${e.join(" ")}`,l.trim()||i.trim()||"Git command failed"].filter(Boolean).join(`
|
|
11
|
+
`)));return}d(u("Git command succeeded",{stdout:i,stderr:l,exitCode:g}))})}),U=({args:e,cwd:t})=>dm({args:e,cwd:t,allowFail:!1}),Be=({args:e,cwd:t})=>dm({args:e,cwd:t,allowFail:!0}),Ni=(e,t)=>new Promise(n=>{if(e.length===0){n(u("No blobs to read",new Map));return}let r=am(lm,["cat-file","--batch"],{cwd:t,stdio:["pipe","pipe","pipe"],env:cm}),o=[],s="",i=!1,l=p=>{i||(i=!0,clearTimeout(d),n(p))},d=setTimeout(()=>{r.kill("SIGTERM"),l(c(`git cat-file --batch timed out after ${Yl}ms`))},Yl);r.stdout.on("data",p=>o.push(p)),r.stderr.setEncoding("utf8"),r.stderr.on("data",p=>{s+=p}),r.on("error",p=>l(c(p.message))),r.on("close",p=>{if(p!==0){l(c(`git cat-file --batch exited ${p}${s?`
|
|
12
|
+
${s}`:""}`));return}let m=Buffer.concat(o),f=new Map,g=0;for(let v of e){let x=m.indexOf(10,g);if(x===-1){l(c(`git cat-file --batch output ended before a header for ${v}`));return}let b=m.toString("utf8",g,x);g=x+1;let R=/^[0-9a-f]{4,64} \S+ (\d+)$/.exec(b);if(!R||!R[1]){l(c(`Unexpected git cat-file --batch header: "${b}"`));return}let S=Number(R[1]);f.set(v,m.toString("utf8",g,g+S)),g+=S+1}l(u("Read blobs",f))}),r.stdin.write(e.join(`
|
|
13
13
|
`)+`
|
|
14
|
-
`),r.stdin.end()}),
|
|
15
|
-
${r.message}`);let o=await
|
|
16
|
-
${o.message}`):u("Created commit and resolved SHA",o.value.stdout.trim())},
|
|
17
|
-
`).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(io).includes(r);return u("Checked worktree registration",o)},
|
|
18
|
-
${t.stderr.trim()}`):u("Aborted stale rebase",!0)},
|
|
19
|
-
${o.message}`);let s=await
|
|
20
|
-
${s.message}`);let i=await
|
|
21
|
-
`+r.message);let o=
|
|
22
|
-
`+o.message):u("Ensured epiq storage",n)},
|
|
23
|
-
`,
|
|
24
|
-
|
|
14
|
+
`),r.stdin.end()}),ao=async({cwd:e,message:t,pathspec:n})=>{let r=await Ae.commit({cwd:e,message:t,pathspec:n});if(a(r))return c(`Failed to create commit
|
|
15
|
+
${r.message}`);let o=await U({args:["rev-parse","HEAD"],cwd:e});return a(o)?c(`Commit created, but failed to read HEAD SHA
|
|
16
|
+
${o.message}`):u("Created commit and resolved SHA",o.value.stdout.trim())},Xl=async e=>{let t=await U({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return c(t.message);let n=t.value.stdout.trim();return u("Resolved git dir",Ln.isAbsolute(n)?n:Ln.resolve(e,n))},Ux=async e=>{let t=await Xl(e);if(a(t))return c(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(r))if(Pn.existsSync(Ln.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(Pn.existsSync(Ln.join(n,s)))return u("Checked for in-progress Git operation",i);return u("Checked for in-progress Git operation",null)},Ai=async e=>{let t=await Ux(e);return a(t)?c(t.message):u("Checked for in-progress Git operation",t.value!==null)},kn=async({repoRoot:e})=>{let n=(await Be({args:["remote","get-url",wt],cwd:e})).exitCode===0;return u(`Checked remote ${n}`,n)},Zo=async({repoRoot:e,branch:t})=>{let n=await Be({args:["ls-remote","--heads",wt,t],cwd:e});return n.exitCode!==0?c(n.stderr.trim()||`Unable to inspect remote branch ${wt}/${t}`):u("Checked remote branch",n.stdout.trim().length>0)},Ti=async({repoRoot:e,branch:t})=>{let n=await Be({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):c(n.stderr.trim()||`Unable to inspect branch ${t}`)},io=e=>{try{return Pn.realpathSync.native(e)}catch{return Ln.resolve(e)}},um=async({repoRoot:e,worktreeRoot:t})=>{let n=await U({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return c(n.message);let r=io(t),o=n.value.stdout.split(`
|
|
17
|
+
`).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(io).includes(r);return u("Checked worktree registration",o)},Jl=async e=>{let t=await Be({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return u("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},wi=async e=>{let t=await U({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?c(t.message):u("Resolved current branch",t.value.stdout.trim())},mm=async e=>{let t=await U({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?c(t.message):u("Resolved short HEAD sha",t.value.stdout.trim())},pm=e=>e.includes("fetch first")||e.includes("non-fast-forward"),fm=async e=>{let t=await Be({cwd:e,args:["rev-parse","--absolute-git-dir"]});if(t.exitCode!==0)return!1;let n=t.stdout.trim();return n?Pn.existsSync(Ln.join(n,"rebase-merge"))||Pn.existsSync(Ln.join(n,"rebase-apply")):!1},Hx=3,Wx=120,Gx=e=>new Promise(t=>setTimeout(t,e)),Vx=async(e,t)=>{let n=await Ae.rebaseOnto({cwd:e,ref:t});for(let r=1;r<Hx;r+=1){if(!a(n)||await fm(e))return n;await Gx(Wx),n=await Ae.rebaseOnto({cwd:e,ref:t})}return n},zx=async e=>{if(!await fm(e))return u("No rebase to abort",!1);let t=await Be({cwd:e,args:["rebase","--abort"]});return t.exitCode!==0?c(`Failed to abort the rebase in progress at ${e}
|
|
18
|
+
${t.stderr.trim()}`):u("Aborted stale rebase",!0)},im=async e=>{let t=await Be({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},es=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),Kx=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),ts=async({cwd:e,branch:t})=>{let n=await zx(e);if(a(n))return c(n.message);let r=await im(e),o=await Ae.fetch({cwd:e,remote:wt,branch:t});if(a(o))return Kx(o.message)?u("Remote branch missing, skipped pull",!1):c(`Failed to fetch ${t}
|
|
19
|
+
${o.message}`);let s=await Vx(e,`${wt}/${t}`);if(a(s))return c(`Failed during rebase
|
|
20
|
+
${s.message}`);let i=await im(e),l=r!==null&&i!==null&&r!==i;return u(l?"Pulled with rebase":"Already up to date",l)},gm=async e=>{let t=await Be({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)},hm=async e=>{let t=await Be({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?c(t.stderr.trim()||"Unable to inspect the worktree for changes"):u("Inspected worktree for changes",t.stdout.trim().length>0)},ym=async(e,t)=>{let n=await Be({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):c(n.stderr.trim()||"Unable to inspect staged changes")};var vm=async e=>{let t=await wi(e);return a(t)?c(t.message):u("Checked detached HEAD state",t.value==="HEAD")};var Im="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Em=e=>xt.join(gt,Dn,e),Sm=()=>xt.join(gt,ec),Rm=Mn,wr=()=>xt.join(Rm(),"worktrees"),ge=({repoRoot:e})=>{let t=cn(e);return a(t)?c(t.message):u("Resolved state branch root",xt.join(wr(),t.value))},qx=e=>xt.join(e,gt),bm=e=>xt.join(qx(e),Dn);var ns=e=>{try{return Jn.mkdirSync(e,{recursive:!0}),u("Ensured directory",void 0)}catch(t){return c(t instanceof Error?t.message:String(t))}},rs=()=>{let e=Rm(),t=wr(),n=!Jn.existsSync(e)||!Jn.existsSync(t),r=ns(e);if(a(r))return c(`Ensure epiq home failed.
|
|
21
|
+
`+r.message);let o=ns(t);return a(o)?c(`Ensure worktrees dir failed.
|
|
22
|
+
`+o.message):u("Ensured epiq storage",n)},Cm=e=>{Jn.existsSync(e)&&(oe.debug("[sync] remove path",e),Jn.rmSync(e,{recursive:!0,force:!0}))};var Yx=`*.jsonl merge=union
|
|
23
|
+
`,Xx=`*~pending*.jsonl
|
|
24
|
+
`,Ql=()=>xt.join(gt,Dn,".gitattributes"),Zl=()=>xt.join(gt,Dn,".gitignore"),xm=(e,t)=>{try{Jn.readFileSync(e,"utf8")!==t&&Jn.writeFileSync(e,t)}catch{Jn.writeFileSync(e,t)}},Nm=(e,t)=>{for(let n of[bm(e),bm(t)]){let r=ns(n);if(a(r))return c(r.message)}return xm(xt.join(t,Ql()),Yx),xm(xt.join(t,Zl()),Xx),u("Ensured state branch",void 0)},Am=async e=>{let t=await U({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return c(`ensure state branch is storage only failed
|
|
25
25
|
`+t.message);let r=t.value.stdout.trim().split(`
|
|
26
|
-
`).filter(Boolean).filter(i=>i!==
|
|
27
|
-
${o.message}`);let s=await
|
|
28
|
-
`),u("Config written",null)}catch{return a(`Unable to write ~/${At}/config.json`)}},gt=e=>{let t=Cr();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return iu(n)},ht=()=>{let e=za(),t=Ka();if(d(t))return a(`Unable to create ~/${At}`);if(!($e.readFile(e)!==null)){let x=iu(Cv);if(d(x))throw new Error(`Unable to create ~/${At}/config.json`)}let r=Cr();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:i,autoSync:l,autoSyncDebounceMs:c,attachmentMaxKb:m,logLevel:p,viewMode:f}=r.value,g=Ir({userId:i,userName:s});if(d(g))return a(g.message);let v=g.value??{userId:i,userName:s};return!v.userName||!v.userId?a(`User name or ID not configured in ~/${At}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,u("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:v.userName,userId:v.userId,autoSync:l??!1,autoSyncIntervalMs:c??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))};import{useSyncExternalStore as Av}from"react";var fo={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},qa=new Set,Tv=()=>{for(let e of qa)e()},ie=()=>fo,au=()=>Av(e=>(qa.add(e),()=>{qa.delete(e)}),()=>fo),ze=e=>(fo={...fo,...e},Tv(),fo);import{spawn as wv}from"node:child_process";import Ya from"node:process";var Xa=e=>{let t=Ya.platform==="darwin"?"open":Ya.platform==="win32"?"cmd":"xdg-open",n=Ya.platform==="win32"?["/c","start","",e]:[e];wv(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as $h}from"node:fs/promises";import Hn from"chalk";import Cg from"string-width";import{decodeTime as du}from"ulid";var Ls=1440*60*1e3,go=(e,t=Date.now())=>e>t+Ls?t:e,Re=e=>go(du(e)),Rr=e=>{let t=Date.now()+Ls,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})},ks=e=>{try{return u("Decoded date",new Date(Re(e)))}catch(t){return a("Decoding failed + "+t.message)}},Rn=e=>{if(!e?.id)return null;try{return du(e.id)}catch{return null}};var Ds="removed",Qe=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?u("Found node",n):a("Unable to find node in breadcrumb")},lu=["png","jpg","gif","webp"];var V={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Ja(e){return e.context===V.WORKSPACE}function P(e){return e.context===V.TICKET}function Nn(e){return e.context===V.TEXT}function ut(e){return e.context===V.FIELD}function ho(e){return e.context===V.FIELD_LIST}var Pt=e=>e.context===V.SWIMLANE,Nr=e=>e.context===V.BOARD,yo=e=>e.context===V.COMMENT;import{useSyncExternalStore as uE}from"react";var b={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var cu=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",uu=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",mu=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",pu=(e,t)=>{if(uu(e,e.sequence))return S.MoveCursorLeftOfWord;if(mu(e,e.sequence))return S.MoveCursorRightOfWord;if(cu(e,e.sequence))return S.EraseInputWord;switch(e.name){case"tab":return S.AutoCompleteCommand;case"up":return S.GetLastCommandFromHistory;case"down":return S.GetNextCommandFromHistory;case"left":return S.MoveCursorLeft;case"right":return S.MoveCursorRight;case"return":return S.Confirm;case"backspace":return t?S.EraseInput:S.ExitCommandLine;case"escape":return S.ExitCommandLine;default:return S.CaptureInput}},fu=(e,t)=>{if(uu(e,e.sequence))return S.MoveCursorLeftOfWord;if(mu(e,e.sequence))return S.MoveCursorRightOfWord;if(cu(e,e.sequence))return S.EraseInputWord;switch(e.name){case"tab":return S.AutoCompleteCommand;case"up":return S.NavPreviousItem;case"down":return S.NavNextItem;case"left":return S.MoveCursorLeft;case"right":return S.MoveCursorRight;case"return":return S.Confirm;case"backspace":return t?S.EraseInput:S.ExitCommandLine;case"escape":return S.ExitCommandLine;default:return S.CaptureInput}};import gu from"string-width";function Bs(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var fn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Mv=/\u001B\[[0-9;]*m/,Qa="\x1B[0m",Pv=e=>[...new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)].map(({segment:t})=>t),Za=(e,t)=>{if(t<=0)return"";if(gu(e)<=t)return e;if(t<=3)return"...".slice(0,t);let r=t-3,o="",s=0,i=!1;for(let l of e.split(/(\u001B\[[0-9;]*m)/))if(l!==""){if(Mv.test(l)){o+=l,i=l!==Qa&&l!=="\x1B[m";continue}for(let c of Pv(l)){let m=gu(c);if(s+m>r)return`${o}...${i?Qa:""}`;o+=c,s+=m}}return`${o}...${i?Qa:""}`},Ie=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),hu=e=>e.charAt(0).toUpperCase()+e.slice(1);var yu=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),s=t.get(o);s?s.push(n):t.set(o,[n])}return t},vu=(e,t)=>t?e.get(t)??[]:[];var bu=new WeakMap,Lv=e=>{let t=bu.get(e);return t||(t=yu(e),bu.set(e,t)),t};var xu=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return vu(Lv(e),r).filter(s=>Bs(r,s)>=n)};var kv={hint:"",hints:[],overlap:0,remainder:""},Iu=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return kv;let o=xu({wordList:r,inputToMatch:e,overlapThreshold:1});return Dv(t,o)},Dv=(e,t)=>{let n=t[0]??"",r=Bs(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),i=r<(o??"").length,l=!!s,p=(l&&i?o:n)+(l&&i?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}};import{ulid as Ov}from"ulid";var vo=24n,Bv=vo*4n,Vt=(1n<<Bv)-1n,Fv=/^[0-9a-f]+$/;function Su(e){return!e||!Fv.test(e)?a(`Invalid hex rank: ${e}`):u("Converted rank to bigint",BigInt("0x"+e))}function yt(e,t=vo){if(e<0n)return a("Negative rank not allowed");let n=e.toString(16);return u("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Ze(e,t){if(!e&&!t)return yt(Vt/2n,vo);let n=e?Su(e):u("Resolved lower bound",0n);if(d(n))return n;let r=t?Su(t):u("Resolved upper bound",Vt);if(d(r))return r;let o=n.value,s=r.value;if(s<=o)return a("Neighbouring ranks leave no space between them");let i=(o+s)/2n;return i===o||i===s?a("No rank space available between neighbors"):yt(i,vo)}function Eu(e){if(e<=0)return u("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=Vt*BigInt(r+1)/(t+1n),s=yt(o,vo);if(d(s))return s;n.push(s.value)}return u("Resolved evenly spaced ranks",n)}var ed=(e,t)=>{let n=ae(e),r=Eu(n.length);if(d(r))return r;let o={};for(let s=0;s<n.length;s++){let i=n[s],l=r.value[s];if(!i||!l)return a("Unable to assign rebalance rank");o[i.id]=l}return u("Created rebalance event",{id:Ov(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import{ulid as Nb}from"ulid";var fe={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var _=e=>e.slice(-7).toUpperCase(),Fs=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?_(e).includes(n):!0};var ge={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:V.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:_(e)},context:V.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:V.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:V.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:V.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:_(e)},context:V.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!0,isVirtual:s=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:V.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:V.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};var _v=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[he,Os]=_v;var td=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),F=(e,t)=>({...td(e,t),convergence:!0}),xo=e=>d(e)&&e.convergence===!0,gn=e=>{let t=e.filter(d);return{fatal:t.filter(n=>!xo(n)),skipped:t.filter(xo)}},hn=e=>{e.length!==0&&z.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},Cu=e=>{let t=C.getNode(e);if(!t||!P(t)||t.isDeleted)return null;let n=Au(t);return d(n)?n:null},Ru=e=>{if(!rd())return null;for(let t of e){let n=Cu(t);if(n)return n;let r=h().nodes[t]?.parentNodeId;if(!r)continue;let o=Cu(r);if(o)return o}return null},Uv=(e,t)=>{let n=C.getNode(e);n&&C.updateNode({...n,log:[...n.log??[],t]})},jv=e=>{let t=[e],n=h().nodes[e]?.parentNodeId;return n&&t.push(n),t},nd=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 jv(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":default:return[]}},$v=e=>{we(t=>({...t,eventLog:[...t.eventLog,e]}))},Hv=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?td("Invalid user ID format",e):u("Valid user",null)},ot=null,Wv=e=>{for(let[t,n]of e.nodeLog){let r=C.getNode(t);r&&C.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&we(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),Ru([...e.virtualNodeIds])},Gv=(e,t)=>{let n=Hv(e);if(d(n))return n;let r=[...new Set(nd(e))];if(ot){for(let s of r){if(!t){let i=ot.nodeLog.get(s);i?i.push(e):ot.nodeLog.set(s,[e])}if(rd()){ot.virtualNodeIds.add(s);let i=h().nodes[s]?.parentNodeId;i&&ot.virtualNodeIds.add(i)}}return t||ot.appLog.push(e),null}t||(r.forEach(s=>Uv(s,e)),$v(e));let o=Ru(r);return o||null},bo=(e,t,n)=>C.getNode(e)?F(`a node with id ${e} already exists`,n):t===e?F("a node cannot be its own parent",n):null,Vv={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=ge.workspace(t,n,r),s=Io(o);if(d(s))return td(s.message,e);let i=C.createNode(o);return d(i)?F(i.message??"Failed to initialize workspace",e):Ja(i.value)?u("Workspace initialized",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=bo(t,void 0,e);if(o)return o;let s=C.createNode(ge.workspace(t,n,r));return d(s)?F(s.message??"Failed to add workspace",e):Ja(s.value)?u("Added workspace",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=bo(t,r,e);if(s)return s;let i=C.createNode(ge.board(t,n,r,o));return d(i)?F(i.message??"Unable to create board",e):Nr(i.value)?u("Added board",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=bo(t,r,e);if(s)return s;let i=C.createNode(ge.swimlane(t,n,r,o));return d(i)?F(i.message??"Unable to create swimlane",e):Pt(i.value)?u("Added swimlane",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=bo(t,r,e);if(s)return s;let i=C.createNode(ge.ticket(t,n,r,o));return d(i)?F(i.message??"Unable to create issue",e):P(i.value)?u("Added issue",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,i=bo(t,r,e);if(i)return i;let l=C.createNode(ge.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(fe.DESCRIPTION)?"vertical":"horizontal"}));return d(l)?F(l.message??`Unable to create field: ${n}`,e):ut(l.value)?u("Added field",{action:e.action,result:l.value}):a("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!C.getNode(t))return F(`Unable to locate node with id ${t}`,e);let o=C.renameNode(t,n);return d(o)?F(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=C.tombstoneNode(t);return d(n)?F(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=C.createTag({id:t,name:n});return d(r)?F(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=C.tombstoneTag(t);return d(n)?F(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=C.restoreTag(t,n);return d(r)?F(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=C.createContributor({id:t,name:n});return d(r)?F(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=C.renameContributor(t,n);return d(r)?F(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=C.tombstoneContributor(t);return d(n)?F(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=C.restoreContributor(t,n);return d(r)?F(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=C.tag(t,n);return d(r)?F(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=C.untag(t,n);return d(r)?F(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=C.assign(t,n);return d(r)?F(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=C.unassign(t,n);return d(r)?F(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=C.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?F(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=C.editValue(t,n);return d(r)?F(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=C.getNode(t);if(!o)return F("Unable to locate issue",e);if(!P(o))return F("Can only close issues",e);let s=C.getNode(he);if(!s)return F("Unable to locate target swimlane",e);if(n!==s.id)return F("Close target must be closed swimlane",e);let i=C.moveNodeToRank({id:t,parentId:n,rank:r});return d(i)?F(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=C.getNode(t);if(!o)return F("Unable to locate issue",e);if(!P(o))return F("Can only reopen issues",e);let s=C.getNode(he);if(!s)return F("Unable to locate closed swimlane",e);if(n===s.id)return F("Cannot reopen issue into closed swimlane",e);if(!C.getNode(n))return F("Reopen parent no longer exists",e);let l=C.moveNodeToRank({id:t,parentId:n,rank:r});return d(l)?F(l.message??"Unable to reopen issue",e):u("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=C.lockNode(t);return d(n)?F(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=C.getNode(r);if(!s)return F(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return F(`Node ${r} is not child of ${t}`,e);let i=C.updateNode({...s,rank:o});if(d(i))return F(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=C.createComment({id:t,issue:n,authorId:r,authorName:C.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return d(s)?F(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=C.getComment(t);if(!o)return F("Unable to locate comment",e);if(o.issue!==n)return F("Comment does not belong to issue",e);let s=C.editComment(t,r);return d(s)?F(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=C.getComment(t);if(!r)return F("Unable to locate comment",e);if(r.issue!==n)return F("Comment does not belong to issue",e);let o=C.deleteComment(t);return d(o)?F(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,l=C.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:i,deleted:!1});return d(l)?F(l.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=C.getAttachment(t);if(!r)return F("Unable to locate attachment",e);if(r.issue!==n)return F("Attachment does not belong to issue",e);let o=C.deleteAttachment(t);return d(o)?F(o.message??"Unable to delete attachment",e):u("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=C.linkUserId({contributorId:t,userId:e.userId});return d(n)?F(n.message??"Unable to link contributor",e):u("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function An(e,t=!1){let n=Vv[e.action];if(!n)return a(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);if(!vt()&&e.action!=="init.workspace")return F(`${e.action} arrived before the workspace was initialized`,e);if(e.action==="init.workspace"&&ot){if(ot.genesisApplied)return F("the workspace is already initialized",e);ot.genesisApplied=!0}let r;try{r=n(e)}catch(s){return F(`threw while materializing (${s instanceof Error?s.message:String(s)})`,e)}if(d(r))return r;let o=Gv(e,t);return o||r}var Lt=e=>{let t=Nu(()=>{let n=ot===null;n&&(ot={appLog:[],nodeLog:new Map,virtualNodeIds:new Set,genesisApplied:!1});try{let r=e.map(o=>An(o));if(n&&ot){let o=Wv(ot);if(o)return e.map(()=>o)}return r}finally{n&&(ot=null)}});return d(t)?e.map(()=>a(t.message)):t.value};import hd from"node:path";import{decodeTime as fb,monotonicFactory as gb}from"ulid";import{z as Qn}from"zod";var od=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";import Ae from"node:fs";import Jn from"node:path";import{ulid as zv}from"ulid";var Us="~pending",sd=/~pending(-[0-9a-z]+)*$/i,wu=/-f(\d+)$/,Mu=e=>{let t=e.indexOf(".");return t===-1?`${e}${Us}`:e.slice(0,t)+Us+e.slice(t)},id=e=>{let t=e.indexOf(".");return t===-1?[e,""]:[e.slice(0,t),e.slice(t)]},Pu=e=>{let[t,n]=id(e);return sd.test(t)?t.replace(sd,"")+n:null},Lu=e=>e.replace(sd,""),js=e=>e.endsWith(".jsonl")&&Pu(e)!==null,ku=e=>{let[t]=id(e),n=wu.exec(t);return n&&js(e)?Number(n[1]):null},Kv=e=>Mu(e).replace(Us,`${Us}-${zv().toLowerCase()}`),qv=(e,t)=>{let[n,r]=id(e);return`${n.replace(wu,"")}-f${t}${r}`},Du=(e,t)=>Jn.join(Mt(e),Mu(t)),Yv=(e,t)=>Math.max(0,Ae.statSync(e).size-(ku(t)??0)),Bu=e=>{let t=Mt(e);try{return Ae.existsSync(t)?Ae.readdirSync(t).filter(js).some(n=>Yv(Jn.join(t,n),n)>0):!1}catch{return!0}},Xv=3,Fu=(e,t)=>{for(let n=1;;n++){let r=Ae.openSync(e,"a"),o;try{Ae.writeSync(r,t),o=Ae.fstatSync(r).ino}finally{Ae.closeSync(r)}let s;try{s=Ae.statSync(e).ino}catch{s=null}if(s===o||n>=Xv)return}},Jv=e=>{let t;try{t=Ae.openSync(e,"r")}catch{return!0}try{let{size:n}=Ae.fstatSync(t);if(n===0)return!0;let r=Buffer.alloc(1);return Ae.readSync(t,r,0,1,n-1),r[0]===10}finally{Ae.closeSync(t)}},_s=10,Tu=(e,t,n=!1)=>{let r=n?t.length:t.lastIndexOf(_s)+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};Ae.appendFileSync(e,Buffer.concat([Buffer.from(Jv(e)?"":`
|
|
29
|
-
`),o,Buffer.from(o[o.length-1]
|
|
30
|
-
`)]));let s=0;for(let i of o)i
|
|
31
|
-
`).entries()){let
|
|
32
|
-
`),n&&(n.current=c);let f=hd.basename(i.value);return zu(t,f,c),ju(t,f),u("Event persisted",{path:i.value,entry:p.value})}catch(o){let s=o instanceof Error?o.message:"Unknown persist error";return a(`Failed to persist event: ${s}`)}}function Zu(e,t,n){let r=yd(t,n);if(d(r))return a(r.message);let o={...e,id:r.value[0]},s=An(o);if(s.status!==En.Success)return s;let i=Ks({event:o,rootDir:t,edge:n,id:r.value});return d(i)?i:s}function B(e,t){if(e.length===0||!e[0])return a("No events provided");if(h().readOnly)return a(h().readOnlyReason??"Cannot change the board while time travelling");let n={},r=Ab(e[0],t,n);if(d(r))return r;let o=e.map(i=>Zu(i,t,n)),s=o.filter(d);return s.length>0?a("Materialize and persist failed: "+s.map(i=>i.message).join(", ")):u("Materialization succeeded",o.map(i=>i.value))}var Ab=(e,t,n)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return u("Contributor write already in flight",void 0);let r=C.getContributor(e.userId),o={id:Nb(),action:r?"rename.contributor":"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName};if(r&&(r.tombstoned||r.name===e.userName))return u("Contributor name is current",void 0);let s=Zu(o,t,n);return d(s)?a(s.message):u("Contributor name recorded",void 0)};var er=e=>e.trim().toLocaleLowerCase(),vd=(e,t)=>er(e).includes(er(t));var Tb=e=>{let{tags:t}=h();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},wb=e=>{let{contributors:t}=h();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},em=null,tm=new Map,Mb=()=>{let e=h().eventLog??[];if(e===em)return tm;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 em=e,tm=t,t},Pb=e=>{let{contributors:t}=h(),n=Mb().get(e.id);return n?[...n].map(r=>t[r]?.name).filter(r=>!!r):[]},nm=(e,t)=>{let n=er(t.value);if(!n)return!0;switch(t.target){case"title":return vd(e.title??"",n);case"description":return vd(e.props.description??"",n);case"tag":return Tb(e).map(er).some(o=>o.includes(n));case"assignee":return wb(e).map(er).some(o=>o.includes(n));case"actor":return Pb(e).map(er).some(o=>o.includes(n));case"ref":return Fs(e.id,t.value);default:return!0}};var rm=(e,t)=>e.rank.localeCompare(t.rank),Lb=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,om=(e,t)=>Object.values(e).filter(n=>Lb(n,t)).sort(rm),sm=(e,t)=>{let n={};for(let r of Object.values(e)){if(P(r)&&t.length>0&&!t.every(s=>nm(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(rm);return n};var im=e=>qs(ae(e),{at:"end"}),qs=(e,t={at:"end"})=>{let n=o=>d(o)?u("Rank space exhausted",{rank:"",needsRebalance:!0}):u("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(Ze(void 0,void 0));let r=()=>n(Ze(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Ze(void 0,o.rank)):a("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Ze(o.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let o=am(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(Ze(i?.rank,s.rank))}case"after":{let o=am(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(Ze(s.rank,i?.rank))}}},ae=e=>{let t=h();if(!lm()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return om(t.nodes,e)},am=(e,t)=>e.findIndex(n=>n.id===t),dm=(e,t,n={at:"end"})=>qs(ae(t).filter(r=>r.id!==e),n),Kt=(e,t,n,r,o)=>{let s=dm(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return u("Resolved rank",s.value.rank);let i=ed(e,r);if(d(i))return i;let l=B([i.value],o);if(d(l))return l;let c=dm(t,e,n);return d(c)?c:c.value.needsRebalance?a("Rank rebalance failed to create space"):u("Resolved rank after rebalance",c.value.rank)},Pn=(e,t,n)=>{let r=im(e);if(d(r))return r;if(!r.value.needsRebalance)return u("Resolved rank",r.value.rank);let o=ed(e,t);if(d(o))return o;let s=B([o.value],n);if(d(s))return s;let i=im(e);return d(i)?i:i.value.needsRebalance?a("Rank rebalance failed to create space"):u("Resolved rank after rebalance",i.value.rank)};var O={exit(){process.exit(0)},enterChildNode(){let e=h(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=q(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||O.navigate({contextNode:o,selectedIndex:q(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=h();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=q(n.id),o=r.findIndex(({id:i})=>i===e.id),s=r.length===0?-1:o>=0?o:0;O.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>cm(1),navigateToPreviousItem:()=>cm(-1),navigateToNextContainer:()=>um(1),navigateToPreviousContainer:()=>um(-1),navigate:({contextNode:e,selectedIndex:t})=>{N({contextNodeId:e.id,selectedIndex:t})}},cm=e=>{let{selectedIndex:t,contextNode:n}=h(),r=q(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;O.navigate({selectedIndex:s,contextNode:n})},um=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=h();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=q(o.id),i=s.findIndex(g=>g.id===t.id);if(i<0)return;let l=s.at(i+e)??s.at(0);if(!l)return;let c=q(l.id),m=Math.max(0,c.length-1),p=Math.min(Math.max(0,r),m),f=c.length?p:-1;O.navigate({contextNode:l,selectedIndex:f})};var pm=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),fm=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=h();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},kb=e=>{let t=h().nodes[e];return!!t&&!t.isDeleted&&ut(t)&&t.childRenderAxis==="vertical"},Ys=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r||r.isDeleted)return!1;let o=ae(r.id);return O.navigate({contextNode:r,selectedIndex:pm(t,o.length)}),!0},gm=e=>{let{nodes:t}=h(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Ys(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let i=ae(o.id).findIndex(l=>l.id===n.id);return i>=0?(O.navigate({contextNode:o,selectedIndex:i}),!0):gm(o.id)},mm=e=>{let{nodes:t}=h(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),gm(n))return!0;n=t[n]?.parentNodeId}return!1},Db=e=>{if(!e)return!1;let t=h().nodes[e];return!!t&&!t.isDeleted},hm=e=>{let{nodes:t,rootNodeId:n}=h();if(kb(e.contextNodeId)&&Ys(e.contextNodeId,e.selectedIndex))return u("Restored navigation inside text container",null);if(Db(e.selectedNodeId)&&e.selectedNodeId&&mm(e.selectedNodeId))return u("Restored navigation to selected node or ancestor",null);if(Ys(e.contextNodeId,e.selectedIndex))return u("Restored navigation to previous container",null);if(e.parentNodeId&&Ys(e.parentNodeId,e.selectedIndex))return u("Restored navigation to previous parent",null);if(mm(e.contextNodeId))return u("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return a("Unable to restore navigation");let o=ae(r.id);return O.navigate({contextNode:r,selectedIndex:pm(e.selectedIndex,o.length)}),u("Restored navigation to root",null)};import{monotonicFactory as Bb,ulid as qt}from"ulid";var Co=Bb();function Fb(){let e=et();if(d(e))return a("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return a("No workspace found in event log");let[r]=q(n.id),[o]=r?q(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 Ob(){let e=Fb();return d(e)?e:O.navigate(e.value)}function ym({userId:e,userName:t}){let n=Co(),r=Co(),o=Co(),s=Co(),i=Co(),l=Ze(void 0,void 0);if(d(l))return l;let c=Ze(void 0,void 0);if(d(c))return c;let m=Ze(c.value,void 0);if(d(m))return m;let p=Ze(void 0,void 0);if(d(p))return p;let f=Ze(p.value,void 0);if(d(f))return f;let g=Ze(f.value,void 0);if(d(g))return g;let v=Ze(void 0,void 0);return d(v)?v:u("Created default events",[{id:qt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:qt(),userId:e,userName:t,action:"create.contributor",payload:{id:e,name:t}},{id:qt(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:c.value}},{id:qt(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:qt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:qt(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"Done",parent:r,rank:g.value}},{id:qt(),userId:e,userName:t,action:"add.board",payload:{id:Os,name:"Closed",parent:n,rank:m.value}},{id:qt(),userId:e,userName:t,action:"add.swimlane",payload:{id:he,name:"Closed",parent:Os,rank:v.value}},{id:qt(),userId:e,userName:t,action:"lock.node",payload:{id:Os}},{id:qt(),userId:e,userName:t,action:"lock.node",payload:{id:he}}])}var _b=()=>{let e=et();if(d(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},Ub=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(", ");z.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(", ");z.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}};function Dt(e,t=[]){if(_b())return u("Skipped boot while checked out at a historical point",null);if(!e.length){let s=ge.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=Io(s);return d(i)?i:(N({hasProjectDefinition:!1,mode:b.DEFAULT}),u("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=Lt(e),{fatal:r,skipped:o}=gn(n);return r.length>0?a(`Materializing failed:
|
|
26
|
+
`).filter(Boolean).filter(i=>i!==gt);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 c(`Failed to clean storage branch
|
|
27
|
+
${o.message}`);let s=await ao({cwd:e,message:"[epiq:repair-storage-branch]",pathspec:r});return a(s)?c(s.message):u("Cleaned storage branch",!0)},zt=Hl(async(e=process.cwd())=>{let t=await U({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?c("Not inside a Git repository"):u("Resolved repo root",t.value.stdout.trim())},e=>xt.resolve(e)),sP=Hl(async e=>{let t=await U({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return c(t.message);let n=t.value.stdout.trim(),r=xt.isAbsolute(n)?n:xt.join(e,n);return u("Resolved git dir",r)},e=>xt.resolve(e));var mP=process.env.IS_LOCAL==="true",gt=".epiq",Dn="events",ec="media",Jx="project.json",Tr=e=>dn.join(e,gt),so=e=>dn.join(Tr(e),Jx),It=e=>dn.join(Tr(e),Dn),ss=e=>dn.join(Tr(e),ec),Tm=e=>dn.join(e,gt),Qx=e=>{let t=dn.join(e,gt);return os.existsSync(t)&&os.statSync(t).isDirectory()},is=e=>{let t=so(e);return os.existsSync(t)&&os.statSync(t).isFile()},Ci=e=>{let t=dn.resolve(e);for(;;){if(Qx(t))return u("Resolved closest .epiq root",t);let n=dn.dirname(t);if(n===t)return c("No .epiq directory found in any parent");t=n}},tc="No .epiq/project.json found in any parent",me=e=>{let t=dn.resolve(e);for(;;){if(is(t))return u("Resolved closest epiq project root",t);let n=dn.dirname(t);if(n===t)return c(tc);t=n}},wm=e=>{let t=It(e);try{return os.mkdirSync(t,{recursive:!0}),u("Resolved events dir",t)}catch(n){return c(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},Se=async()=>{let e=await zt(process.cwd());if(a(e))return e;let t=ge({repoRoot:e.value});return a(t)?t:u("Resolved persist root",t.value)};import{accessSync as Zx,copyFileSync as eI,existsSync as Mi,mkdirSync as Mm,readdirSync as Pm,readFileSync as tI,renameSync as nI,rmSync as rI,statSync as Lm,unlinkSync as oI,writeFileSync as sI}from"node:fs";import lo from"node:path";var nc=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",ot={writeToFile:(e,t)=>{try{let n=lo.dirname(e);Mi(n)||Mm(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);sI(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return tI(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ot.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 Mi(e)&&Lm(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Zx(e),!0}catch{return!1}},mkDir:e=>Mm(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=lo.parse(t);for(;;){let r=lo.join(t,e);try{if(Mi(r)&&Lm(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=lo.dirname(t)}return null},readFirstJSON(e){try{if(!ot.dirExists(e))return null;let t=Pm(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=lo.join(e,t);return ot.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ot.dirExists(e)?Pm(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{oI(e)}catch(t){(!nc(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{rI(e,{recursive:!0,force:!0})}catch(t){(!nc(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(lo.dirname(t)),!n?.overwrite&&Mi(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{nI(e,t)}catch(r){if(nc(r)&&r.code==="EXDEV"){eI(e,t),this.rmFile(e);return}throw r}}};var aI={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},km=Kt.object({logLevel:Kt.enum(["info","error","debug"]),preferredEditor:Kt.string().optional(),userName:Kt.string().optional(),userId:Kt.string().optional(),autoSync:Kt.boolean().nullable().optional(),autoSyncDebounceMs:Kt.number().optional(),attachmentMaxKb:Kt.number().optional(),viewMode:Kt.enum(["dense","wide"]).optional(),declinedEmailBoards:Kt.array(Kt.string()).optional()}).partial(),lI="config.json",Dm=Mn,rc=()=>iI.join(Dm(),lI),oc=()=>{try{return ot.mkDir(Dm()),u(`Ensured ~/${Gt} exists`,null)}catch{return c(`Unable to create ~/${Gt}`)}},cI=e=>{let t;try{t=JSON.parse(e)}catch{return c(`Invalid ~/${Gt}/config.json JSON`)}let n=km.safeParse(t??{});return n.success?u("Parsed config",n.data):c(`Invalid ~/${Gt}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Qn=()=>{let e=oc();if(a(e))return c(e.message);let t=rc(),n=ot.readFile(t);return n==null||n.trim()===""?u("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):cI(n)},Bm=e=>{let t=oc();if(a(t))return c(t.message);let n=km.safeParse(e);if(!n.success)return c(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=rc();try{return ot.writeToFile(r,JSON.stringify(n.data,null,2)+`
|
|
28
|
+
`),u("Config written",null)}catch{return c(`Unable to write ~/${Gt}/config.json`)}},Et=e=>{let t=Qn();if(a(t))return c("Failed to read existing config");let n={...t.value,...e};return Bm(n)},Mt=()=>{let e=rc(),t=oc();if(a(t))return c(`Unable to create ~/${Gt}`);if(!(ot.readFile(e)!==null)){let b=Bm(aI);if(a(b))throw new Error(`Unable to create ~/${Gt}/config.json`)}let r=Qn();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:i,declinedEmailBoards:l,autoSync:d,autoSyncDebounceMs:p,attachmentMaxKb:m,logLevel:f,viewMode:g}=r.value,v=oo({userId:i,userName:s});if(a(v))return c(v.message);let x=v.value??{userId:i,userName:s};return!x.userName||!x.userId?c(`User name or ID not configured in ~/${Gt}/config.json`):(process.env.EPIQ_LOG_LEVEL=f,u("successfully loaded settings",{gitEmail:null,gitName:null,declinedEmailBoards:l??[],logLevel:f??"debug",preferredEditor:o??"",userName:x.userName,userId:x.userId,autoSync:d??!1,autoSyncIntervalMs:p??1e4,attachmentMaxKb:m??null,viewMode:g??"dense"}))};import{useSyncExternalStore as dI}from"react";var as={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,gitEmail:null,gitName:null,declinedEmailBoards:[],viewMode:null},sc=new Set,uI=()=>{for(let e of sc)e()},V=()=>as,Om=()=>dI(e=>(sc.add(e),()=>{sc.delete(e)}),()=>as),ke=e=>(as={...as,...e},uI(),as);import{spawn as mI}from"node:child_process";import ic from"node:process";var ac=e=>{let t=ic.platform==="darwin"?"open":ic.platform==="win32"?"cmd":"xdg-open",n=ic.platform==="win32"?["/c","start","",e]:[e];mI(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as Ib}from"node:fs/promises";import Ir from"chalk";import ov from"string-width";import{decodeTime as Fm}from"ulid";var Pi=1440*60*1e3,ls=(e,t=Date.now())=>e>t+Pi?t:e,Oe=e=>ls(Fm(e)),co=e=>{let t=Date.now()+Pi,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})},Li=e=>{try{return u("Decoded date",new Date(Oe(e)))}catch(t){return c("Decoding failed + "+t.message)}},Zn=e=>{if(!e?.id)return null;try{return Fm(e.id)}catch{return null}};import uo from"chalk";var at={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"},h={accent:at.cyan,accent2:at.magenta,primary:at.white,secondary:at.grayDark,secondary2:at.grayLight,gray:at.gray,green:at.green,yellow:at.yellow,red:at.red};var L={red:at.red,yellow:at.yellow,green:at.green,blue:at.blue,magenta:at.magenta,cyan:at.cyan},ki={urgent:L.red,critical:L.red,important:L.red,blocker:L.red,asap:L.red,immediate:L.red,fail:L.red,failure:L.red,broken:L.red,bug:L.red,error:L.red,incident:L.red,outage:L.red,production:L.red,crash:L.red,security:L.red,warning:L.yellow,warn:L.yellow,risky:L.yellow,risk:L.yellow,attention:L.yellow,pending:L.yellow,review:L.yellow,"needs-review":L.yellow,qa:L.yellow,testing:L.yellow,test:L.yellow,validate:L.yellow,verification:L.yellow,staging:L.yellow,check:L.yellow,"follow-up":L.yellow,followup:L.yellow,waiting:L.yellow,blocked:L.yellow,hold:L.yellow,done:L.green,complete:L.green,completed:L.green,success:L.green,ok:L.green,stable:L.green,resolved:L.green,fixed:L.green,closed:L.green,merged:L.green,released:L.green,deployed:L.green,approved:L.green,verified:L.green,working:L.green,healthy:L.green,pass:L.green,passing:L.green,info:L.blue,information:L.blue,note:L.blue,docs:L.blue,documentation:L.blue,doc:L.blue,guide:L.blue,help:L.blue,explanation:L.blue,detail:L.blue,details:L.blue,context:L.blue,design:L.blue,discussion:L.blue,proposal:L.blue,idea:L.blue,feature:L.magenta,enhancement:L.magenta,improvement:L.magenta,refactor:L.magenta,refactoring:L.magenta,cleanup:L.magenta,optimize:L.magenta,optimization:L.magenta,perf:L.magenta,performance:L.magenta,upgrade:L.magenta,migration:L.magenta,modernize:L.magenta,debt:L.magenta,todo:L.cyan,next:L.cyan,planned:L.cyan,plan:L.cyan,future:L.cyan,backlog:L.cyan,investigate:L.cyan,explore:L.cyan,prototype:L.cyan};var cc={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},_m=(e,t,n)=>Math.max(t,Math.min(n,e)),lc=(e,t,n)=>e+(t-e)*n,jm=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},pI=e=>e.toLowerCase().trim(),fI=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,i=e/60,l=s*(1-Math.abs(i%2-1)),d=0,p=0,m=0;i>=0&&i<1?(d=s,p=l):i>=1&&i<2?(d=l,p=s):i>=2&&i<3?(p=s,m=l):i>=3&&i<4?(p=l,m=s):i>=4&&i<5?(d=l,m=s):(d=s,m=l);let f=o-s/2;return[Math.round((d+f)*255),Math.round((p+f)*255),Math.round((m+f)*255)]},$m=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var gI=(e,t,n)=>{let r=_m(n,0,1);return[Math.round(lc(e[0],t[0],r)),Math.round(lc(e[1],t[1],r)),Math.round(lc(e[2],t[2],r))]};var hI=(e,t,n)=>gI(e,t,n),dc=e=>{let t=jm(e)%360,n=fI(t,cc.stringColor.saturation,cc.stringColor.lightness);return $m(n)},ze=(e,t=ki)=>{let n=pI(e??"");return n&&t[n]?t[n]:dc(n)};var Um=e=>{let t=cc.gradient.stops,n=_m(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 hI(t[s],t[s+1],i)},Di=e=>$m(Um(e)),Bi=e=>jm(e.toLowerCase().trim())/4294967295,Hm=e=>{let t=Bi(e);return Um(t)},yI=e=>{let[t,n,r]=Hm(e);return{normal:o=>uo.bgRgb(t,n,r).black(o),cursor:o=>uo.bgRgb(t,n,r).white.bold(o)}},uc=e=>{let[t,n,r]=Hm(e);return{fg:o=>uo.rgb(t,n,r)(o),fgCursor:o=>uo.rgb(t,n,r).inverse(o),bg:o=>uo.bgRgb(t,n,r).black(o),bgCursor:o=>uo.bgRgb(t,n,r).white.bold(o)}},Oi=e=>yI(e).normal(` ${e} `);var vI="Unknown",Fi=(e,t)=>t?.length?t:e?.length?e:vI,Ke=(e,t)=>{let n=Fi(e,t);return{id:e?.length?e:n,name:n,color:ze(n)}};var mo="removed",ht=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?u("Found node",n):c("Unable to find node in breadcrumb")},Wm=["png","jpg","gif","webp"];var Ze=e=>e.trim().toLowerCase(),er=e=>{let t=Ze(e);return t.length>0&&t.length<=254&&/^[^\s@]+@[^\s@]+$/.test(t)},cs=(e,t)=>`${Ze(e)} ${t}`,mc=e=>!e.tombstoned,ds=(e,t)=>{let n=Ze(t),r=new Set;for(let o of Object.values(e))mc(o)&&o.email===n&&r.add(o.contributor);return[...r]},un=(e,t)=>{let n=new Set;for(let r of Object.values(e))mc(r)&&r.contributor===t&&n.add(r.email);return[...n]},Gm=e=>{let t=new Map;for(let r of Object.values(e)){if(!mc(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 _i=(e,t)=>e===t.authorId||e===t.contributor;var se={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function pc(e){return e.context===se.WORKSPACE}function _(e){return e.context===se.TICKET}function tr(e){return e.context===se.TEXT}function lt(e){return e.context===se.FIELD}function us(e){return e.context===se.FIELD_LIST}var mn=e=>e.context===se.SWIMLANE,nr=e=>e.context===se.BOARD,ms=e=>e.context===se.COMMENT;import{useSyncExternalStore as BN}from"react";var I={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette",IDENTITY:"identity"};var Vm=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",zm=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Km=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",qm=(e,t)=>{if(zm(e,e.sequence))return E.MoveCursorLeftOfWord;if(Km(e,e.sequence))return E.MoveCursorRightOfWord;if(Vm(e,e.sequence))return E.EraseInputWord;switch(e.name){case"tab":return E.AutoCompleteCommand;case"up":return E.GetLastCommandFromHistory;case"down":return E.GetNextCommandFromHistory;case"left":return E.MoveCursorLeft;case"right":return E.MoveCursorRight;case"return":return E.Confirm;case"backspace":return t?E.EraseInput:E.ExitCommandLine;case"escape":return E.ExitCommandLine;default:return E.CaptureInput}},Ym=(e,t)=>{if(zm(e,e.sequence))return E.MoveCursorLeftOfWord;if(Km(e,e.sequence))return E.MoveCursorRightOfWord;if(Vm(e,e.sequence))return E.EraseInputWord;switch(e.name){case"tab":return E.AutoCompleteCommand;case"up":return E.NavPreviousItem;case"down":return E.NavNextItem;case"left":return E.MoveCursorLeft;case"right":return E.MoveCursorRight;case"return":return E.Confirm;case"backspace":return t?E.EraseInput:E.ExitCommandLine;case"escape":return E.ExitCommandLine;default:return E.CaptureInput}};import Xm from"string-width";function ji(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Bn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",bI=/\u001B\[[0-9;]*m/,fc="\x1B[0m",xI=e=>[...new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)].map(({segment:t})=>t),On=(e,t)=>{if(t<=0)return"";if(Xm(e)<=t)return e;if(t<=3)return"...".slice(0,t);let r=t-3,o="",s=0,i=!1;for(let l of e.split(/(\u001B\[[0-9;]*m)/))if(l!==""){if(bI.test(l)){o+=l,i=l!==fc&&l!=="\x1B[m";continue}for(let d of xI(l)){let p=Xm(d);if(s+p>r)return`${o}...${i?fc:""}`;o+=d,s+=p}}return`${o}...${i?fc:""}`},Re=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),Jm=e=>e.charAt(0).toUpperCase()+e.slice(1);var Qm=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},Zm=(e,t)=>t?e.get(t)??[]:[];var ep=new WeakMap,II=e=>{let t=ep.get(e);return t||(t=Qm(e),ep.set(e,t)),t};var tp=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Zm(II(e),r).filter(s=>ji(r,s.toLowerCase())>=n)};var EI={hint:"",hints:[],overlap:0,remainder:""},rp=({inputToMatch:e,lastWord:t,isLastWordCompleted:n,inputString:r},o,s=[])=>{if(n||e===""){let[l]=s;return s.length===1&&l&&!r.trim()?np("",[l]):EI}let i=tp({wordList:o,inputToMatch:e,overlapThreshold:1});return np(t,i)},np=(e,t)=>{let n=t[0]??"",r=ji(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),i=r<(o??"").length,l=!!s,m=(l&&i?o:n)+(l&&i?":":" "),f=m.slice(r);return{hint:m,hints:t,overlap:r,remainder:f}};import{ulid as CI}from"ulid";var ps=24n,SI=ps*4n,qt=(1n<<SI)-1n,RI=/^[0-9a-f]+$/;function op(e){return!e||!RI.test(e)?c(`Invalid hex rank: ${e}`):u("Converted rank to bigint",BigInt("0x"+e))}function Pt(e,t=ps){if(e<0n)return c("Negative rank not allowed");let n=e.toString(16);return u("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function yt(e,t){if(!e&&!t)return Pt(qt/2n,ps);let n=e?op(e):u("Resolved lower bound",0n);if(a(n))return n;let r=t?op(t):u("Resolved upper bound",qt);if(a(r))return r;let o=n.value,s=r.value;if(s<=o)return c("Neighbouring ranks leave no space between them");let i=(o+s)/2n;return i===o||i===s?c("No rank space available between neighbors"):Pt(i,ps)}function sp(e){if(e<=0)return u("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=qt*BigInt(r+1)/(t+1n),s=Pt(o,ps);if(a(s))return s;n.push(s.value)}return u("Resolved evenly spaced ranks",n)}var D=({userId:e})=>({userId:e}),ip=e=>({action:e.action,payload:e.payload});var gc=["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"];var hL=new Set(gc);var hc=(e,t)=>{let n=xe(e),r=sp(n.length);if(a(r))return r;let o={};for(let s=0;s<n.length;s++){let i=n[s],l=r.value[s];if(!i||!l)return c("Unable to assign rebalance rank");o[i.id]=l}return u("Created rebalance event",{id:CI(),action:"rebalance.children",payload:{parent:e,ranks:o},...D(t)})};import{z as Mr}from"zod";var ap=1,lp=Mr.tuple([Mr.string().min(1),Mr.string().min(1).nullable()]),NI=Mr.looseObject({v:Mr.literal(ap),id:lp}),AI=Mr.looseObject({v:Mr.number().int().positive(),id:lp}),cp=e=>{let t=AI.safeParse(e);return t.success?u("Parsed persisted event envelope",t.data):c(`Invalid persisted event envelope: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},TI=[1];var wI=new Set(TI),yc=e=>wI.has(e),dp=e=>{let t=NI.safeParse(e);return t.success?u("Parsed persisted event",t.data):c(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},vc=(e,t)=>{let n={[e.action]:e.payload,v:ap,id:t};return dp(n)};import Vi from"node:fs";import zi from"node:path";import{decodeTime as _I}from"ulid";import{z as Cc}from"zod";import bc from"node:fs";import MI from"node:path";var fs=e=>e?.code==="ENOENT",xc=3,Ic=e=>bc.readdirSync(e).filter(t=>t.endsWith(".jsonl")).sort(),pn=e=>{let t=It(e);for(let n=1;;n++){if(!bc.existsSync(t))return"none";let r=[],o=!1;for(let s of Ic(t))try{let{size:i,mtimeMs:l}=bc.statSync(MI.join(t,s));r.push(`${s}:${i}:${l}`)}catch(i){if(!fs(i))throw i;if(n<xc){o=!0;break}}if(!o)return r.join("|")}},up=e=>new Map(e.split("|").filter(Boolean).map(t=>{let n=t.indexOf(":");return[t.slice(0,n),t.slice(n+1)]})),Ec=(e,t,n)=>{let r=up(t),o=pn(e),s=up(o);for(let[i,l]of s)if(i!==n&&r.get(i)!==l)return null;for(let i of r.keys())if(i!==n&&!s.has(i))return null;return o},rr=null,mp=e=>rr&&rr.root===e?rr.signature:null,pp=(e,t)=>{rr={root:e,signature:t}},fp=(e,t)=>{if(!rr||rr.root!==e)return;let n=Ec(e,rr.signature,t);rr=n===null?null:{root:e,signature:n}};import Ue from"node:fs";import Pr from"node:path";import{ulid as PI}from"ulid";var Ui="~pending",Sc=/~pending(-[0-9a-z]+)*$/i,hp=/-f(\d+)$/,yp=e=>{let t=e.indexOf(".");return t===-1?`${e}${Ui}`:e.slice(0,t)+Ui+e.slice(t)},Hi=e=>{let t=e.indexOf(".");return t===-1?[e,""]:[e.slice(0,t),e.slice(t)]},LI=e=>{let[t,n]=Hi(e);return Sc.test(t)?t.replace(Sc,"")+n:null},Rc=e=>e.replace(Sc,""),Lr=e=>e.endsWith(".jsonl")&&LI(e)!==null,gs=e=>Rc(Hi(e)[0]),vp=e=>{let[t]=Hi(e),n=hp.exec(t);return n&&Lr(e)?Number(n[1]):null},kI=e=>yp(e).replace(Ui,`${Ui}-${PI().toLowerCase()}`),DI=(e,t)=>{let[n,r]=Hi(e);return`${n.replace(hp,"")}-f${t}${r}`},bp=(e,t)=>Pr.join(It(e),yp(t)),BI=(e,t)=>Math.max(0,Ue.statSync(e).size-(vp(t)??0)),xp=e=>{let t=It(e);try{return Ue.existsSync(t)?Ue.readdirSync(t).filter(Lr).some(n=>BI(Pr.join(t,n),n)>0):!1}catch{return!0}},OI=3,Ip=(e,t)=>{for(let n=1;;n++){let r=Ue.openSync(e,"a"),o;try{Ue.writeSync(r,t),o=Ue.fstatSync(r).ino}finally{Ue.closeSync(r)}let s;try{s=Ue.statSync(e).ino}catch{s=null}if(s===o||n>=OI)return}},FI=e=>{let t;try{t=Ue.openSync(e,"r")}catch{return!0}try{let{size:n}=Ue.fstatSync(t);if(n===0)return!0;let r=Buffer.alloc(1);return Ue.readSync(t,r,0,1,n-1),r[0]===10}finally{Ue.closeSync(t)}},$i=10,gp=(e,t,n=!1)=>{let r=n?t.length:t.lastIndexOf($i)+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};Ue.appendFileSync(e,Buffer.concat([Buffer.from(FI(e)?"":`
|
|
29
|
+
`),o,Buffer.from(o[o.length-1]===$i?"":`
|
|
30
|
+
`)]));let s=0;for(let i of o)i===$i&&s++;return o[o.length-1]!==$i&&s++,{bytes:r,lines:s}},Wi=(e,t)=>{let n=It(e);if(!Ue.existsSync(n))return u("No events directory",0);try{let r=gs(t),o=Ue.readdirSync(n).filter(l=>Lr(l)&&gs(l)===r),s=Pr.join(n,t),i=0;for(let l of o){let d=vp(l);if(d!==null){let g=Pr.join(n,l),v=Ue.readFileSync(g).subarray(d);i+=gp(s,v,!0).lines,Ue.rmSync(g,{force:!0});continue}let p=/~pending-/i.test(l)?l:kI(t),m=Pr.join(n,p);p!==l&&Ue.renameSync(Pr.join(n,l),m);let f=gp(s,Ue.readFileSync(m));i+=f.lines,Ue.renameSync(m,Pr.join(n,DI(p,f.bytes)))}return u("Folded pending logs",i)}catch(r){return c(`Unable to fold pending event logs in ${n}: ${r instanceof Error?r.message:String(r)}`)}};var Ki="unknown",jI=Cc.object({userId:Cc.string().min(1).default(Ki),userName:Cc.string().min(1).default(Ki)}),Rp=new Set(["id","v","userId","userName"]),Gi=e=>{let t=Object.entries(e).filter(([o])=>!Rp.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},$I=/^[0-9a-hjkmnp-tv-z]{26}$/i,UI=e=>$I.test(e)?e.toUpperCase():e,Cp=e=>{let t=zi.basename(e,".jsonl"),n=t.indexOf("."),r=Rc(n===-1?t:t.slice(0,n)),o=n===-1?void 0:t.slice(n+1),s=jI.safeParse({userId:UI(r),userName:o});return s.success?u("Parsed event file actor",s.data):c(`Invalid event file name ${zi.basename(e)}: ${s.error.issues.map(i=>i.path.join(".")||i.message).join(", ")}`)},HI=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?c(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?c("Invalid persisted event: action key is missing or invalid"):u("Resolved persisted action",t[0])},WI=(e,t)=>t in e,Np=(e,t)=>{let n=Cp(e);if(a(n))return c(n.message);let r;try{r=Vi.readFileSync(e,"utf8")}catch(l){if(fs(l))return u("Event file missing",null);throw l}let o=[],s=zi.basename(e),i=(l,d)=>{t?.push({eventId:null,reason:"corrupt-line",detail:`${s}:${l} (${d})`,targetNodeId:null})};for(let[l,d]of r.split(`
|
|
31
|
+
`).entries()){let p=d.trim();if(!p)continue;let m;try{m=JSON.parse(p)}catch{i(l+1,"invalid JSON");continue}let f=cp(m);if(a(f)){i(l+1,f.message);continue}o.push({...f.value,userId:n.value.userId,userName:n.value.userName})}return u("Parsed persisted events file",o)},Ep=(e,t)=>e<t?-1:e>t?1:0,Nc=(e,t)=>{let n=Ep(e.id[0],t.id[0]);return n!==0?n:Ep(JSON.stringify(e),JSON.stringify(t))},Sp=(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 v=r.get(g)??[];v.push(m),r.set(g,v)}for(let m of r.values())m.sort(Nc);let o=[],s=new Set,i=m=>{let f=[m];for(;f.length>0;){let g=f.pop(),v=g.id[0];if(s.has(v))continue;o.push(g),s.add(v);let x=r.get(v)??[];for(let b=x.length-1;b>=0;b--)f.push(x[b])}},l=(r.get(null)??[]).filter(m=>{let f=Object.keys(m).filter(g=>!Rp.has(g));return f.length===1&&f[0]===t});for(let m of l)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(Nc);for(let m of d)i(m);let p=e.filter(m=>!s.has(m.id[0])).sort(Nc);for(let m of p)i(m);return o},Ac=e=>co(e.map(t=>{try{return _I(t.id[0])}catch{return null}})),Ap=(e,t)=>{let n=new Set,r=[],o=[],s=Ac(e);for(let i=0;i<e.length;i++){let l=e[i],d=l.id[0],p=l.id[1],m=s[i]??null;!(m!==null&&m<t)||p&&n.has(p)?(n.add(d),o.push(l)):r.push(l)}return{appliedEvents:r,unappliedEvents:o}},Tp=e=>{let t=new Set(e.actions),n=S=>t.has(S),r=S=>{let{userId:A,userName:T,...P}=S,M=HI(P);if(a(M))return c(M.message);let O=M.value,W=S.id?.[0];return W?WI(P,O)?u("Decoded persisted event",{id:W,action:O,payload:P[O],userId:A}):c(`Persisted event is missing payload for action: ${O}`):c("Persisted event is missing id")},o=(S,A)=>{let T=[],P=new Map,M=new Map;for(let O of S){if(!yc(O.v)){M.set(O.v,(M.get(O.v)??0)+1),A?.push({eventId:O.id[0],reason:"unsupported-schema-version",detail:`v${O.v}`,targetNodeId:Gi(O)});continue}let W=r(O);if(a(W)){A?.push({eventId:O.id[0],reason:"invalid-payload",detail:W.message,targetNodeId:Gi(O)});continue}let J=W.value.action;if(!n(J)){P.set(J,(P.get(J)??0)+1),A?.push({eventId:O.id[0],reason:"unknown-action",detail:J,targetNodeId:Gi(O)});continue}let Ee=e.readPayload(J,W.value.payload);if(a(Ee)){A?.push({eventId:O.id[0],reason:"invalid-payload",detail:Ee.message,targetNodeId:Gi(O)});continue}T.push(W.value)}if(P.size>0){let O=[...P.entries()].map(([W,J])=>`${W} (x${J})`).join(", ");oe.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${O}. Upgrade to apply them.`)}if(M.size>0){let O=[...M.entries()].map(([W,J])=>`v${W} (x${J})`).join(", ");oe.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${O}. Upgrade to apply them.`)}return u("Decoded reconstructed events",T)},s=null;function i(S,A){let T=It(S),P=pn(S);if(!Vi.existsSync(T))return u("No events found",[]);let M=[],O=[];for(let J=1;;J++){M=[],O=[];let Ee=!1;for(let F of Ic(T)){let X=Np(zi.join(T,F),O);if(a(X))return c(X.message);if(X.value===null){if(J<xc){Ee=!0;break}continue}M.push(...X.value)}if(!Ee)break}A?.push(...O);let W=Sp(M,e.genesis);return s={root:S,signature:P,edge:W.at(-1)?.id?.[0]??null},u("All events loaded",W)}function l(S){let A=[],T=i(S,A);if(a(T))return c(T.message);let P=o(T.value,A);return a(P)?c(P.message):u("Loaded merged events",{events:P.value,unreadable:A})}function d(S){let A=i(S);return a(A)?c(A.message):u("Loaded event actors",A.value.map(({userId:T,userName:P})=>({userId:T,userName:P})))}function p(S){let A=new Map,T=It(S),P;try{if(!Vi.existsSync(T))return A;P=Vi.readdirSync(T)}catch{return A}let M=new Set;for(let W of P){if(!W.endsWith(".jsonl"))continue;let J=Cp(W);if(a(J))continue;let{userId:Ee,userName:F}=J.value;if(!Ee||!F||F===Ki)continue;let X=A.get(Ee);X!==void 0&&X!==F&&M.add(Ee),A.set(Ee,F)}if(M.size===0)return A;let O=d(S);if(a(O))return A;for(let{userId:W,userName:J}of O.value)M.has(W)&&(!J||J===Ki||A.set(W,J));return A}function m(S){let A=l(S);return a(A)?c(A.message):u("Loaded merged events",A.value.events)}function f(S,A){let T=i(S);if(a(T))return c(T.message);let{appliedEvents:P,unappliedEvents:M}=Ap(T.value,A),O=o(P);if(a(O))return c(O.message);let W=o(M);return a(W)?c(W.message):u("Loaded merged events before time",{appliedEvents:O.value,unappliedEvents:W.value})}function g(S=process.cwd()){let A=pn(S);if(s&&s.root===S&&s.signature===A)return u("Loaded edge reference, unchanged",s.edge);let T=i(S);return a(T)?c(T.message):u("Loaded edge reference",T.value.at(-1)?.id?.[0]??null)}function v(S,A,T){if(!s||s.root!==S)return;let P=Ec(S,s.signature,A);s=P===null?null:{root:S,signature:P,edge:T}}function x(){s=null}let b=S=>Sp(S,e.genesis);function R(S){let A=i(S);if(a(A))return c(A.message);let T=Ac(A.value);return u("Loaded effective event times",new Map(A.value.map((P,M)=>[P.id[0],T[M]??null])))}return{fromPersistedEvent:r,decodeReconstructedEvents:o,loadMergedEventsWithUnreadable:l,loadEventActors:d,loadActorNames:p,loadMergedEvents:m,loadMergedEventsBefore:f,getEdgeRef:g,advanceEdgeRef:v,clearEdgeCache:x,getSortedEvents:b,loadEffectiveEventTimes:R}};var qi=(e,t)=>c(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),j=(e,t)=>({...qi(e,t),convergence:!0}),po=e=>a(e)&&e.convergence===!0,fn=e=>{let t=e.filter(a);return{fatal:t.filter(n=>!po(n)),skipped:t.filter(po)}},gn=e=>{e.length!==0&&oe.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},GI=e=>e.userId?.length?null:qi("Invalid user ID format",e),wp=e=>{let t=null;function n(o,s=!1){let i=e.apply[o.action];if(!i)return c(`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 j(`${o.action} arrived before the state was initialized`,o);if(o.action===e.genesis&&t){if(t.genesisApplied)return j("the state is already initialized",o);t.genesisApplied=!0}let l;try{l=i(o)}catch(m){return j(`threw while materializing (${m instanceof Error?m.message:String(m)})`,o)}if(a(l))return l;let d=GI(o);if(d)return d;let p=e.replay.afterApply(o,{batched:t!==null,bypassLogging:s});return p||l}return{materialize:n,materializeAll:o=>{let s=e.replay.batch(()=>{let i=t===null;i&&(t={genesisApplied:!1});let l=!1;try{let d=o.map(p=>n(p));if(i){l=!0;let p=e.replay.flush();if(p)return o.map(()=>p)}return d}finally{i&&(t=null,l||e.replay.flush())}});return a(s)?o.map(()=>c(s.message)):s.value}}};import Pp from"node:fs";import Tc from"node:path";import{decodeTime as VI,monotonicFactory as zI}from"ulid";var Mp=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";var KI=0xffffffffffff,qI=Pi,YI=e=>{let t=Date.now(),n;try{n=VI(e)}catch{return t}return n>=KI?t:n>t+qI?(oe.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)},or=({userId:e})=>`${Mp(e)}.jsonl`,Lp=(e,t)=>{let n;try{if(!Pp.existsSync(e))return[t];n=Pp.readdirSync(e)}catch{return[t]}let r=gs(t);return[...n.filter(s=>!s.endsWith(".jsonl")||s===t||Lr(s)?!1:gs(s)===r).sort(),t]},kp=(e,{userId:t})=>{let n=or({userId:t});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n))return c(`Invalid event log file name: ${n}`);let o=Tc.join(It(e),n);return u("Successfully resolved event log path",o)},Dp=e=>{let t=zI();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 c(d.message);i=d.value}let l=i?t(YI(i)):t();return u("Minted event id",[l,i])}function r({event:o,rootDir:s,edge:i,id:l}){try{let d=wm(s);if(a(d))return d;let p=kp(s,{userId:o.userId});if(a(p))return p;let m=bp(s,Tc.basename(p.value)),f=l?u("Minted event id",l):n(s,i);if(a(f))return c(f.message);let[g,v]=f.value,x=vc(ip(o),[g,v]);if(a(x))return c(x.message);Ip(m,`${JSON.stringify(x.value)}
|
|
32
|
+
`),i&&(i.current=g);let b=Tc.basename(m);return e.advanceEdgeRef(s,b,g),fp(s,b),u("Event persisted",{path:m,entry:x.value})}catch(d){let p=d instanceof Error?d.message:"Unknown persist error";return c(`Failed to persist event: ${p}`)}}return{mintEventId:n,persist:r}};var Bp=(e,t,n)=>{function r(s,i,l){let d=n.mintEventId(i,l);if(a(d))return c(d.message);let p={...s,id:d.value[0]},m=t.materialize(p);if(m.status!==Xn.Success)return m;let f=n.persist({event:p,rootDir:i,edge:l,id:d.value});return a(f)?f:m}function o(s,i){if(s.length===0||!s[0])return c("No events provided");let l=e.write.readOnlyReason();if(l)return c(l);let d=e.replay.batch(()=>{let p={},m=e.write.beforeWrite(s[0],v=>r(v,i,p));if(a(m))return c(m.message);let f=s.map(v=>r(v,i,p)),g=f.filter(a);return g.length>0?c("Materialize and persist failed: "+g.map(v=>v.message).join(", ")):u("Materialization succeeded",f.map(v=>v.value))});return a(d)?c(d.message):d.value??c("Materialize and persist produced nothing")}return{materializeAndPersist:r,materializeAndPersistAll:o}};var Op=e=>{let t=wp(e),n=Tp(e),r=Dp(n),o=Bp(e,t,r);return{...t,...n,...r,...o}};import{z as Q}from"zod";var z=Q.string().min(1),Yt=Q.string(),sr=Q.string(),Yi=Q.looseObject({id:z}),wc=Q.looseObject({id:z,name:Yt,parent:z,rank:sr}),XI={"init.workspace":Q.looseObject({id:z,name:Yt,rank:sr}),"add.workspace":Q.looseObject({id:z,name:Yt,rank:sr}),"add.board":wc,"add.swimlane":wc,"add.issue":wc,"add.field":Q.looseObject({id:z,name:Yt,parent:z,rank:sr}),"edit.title":Q.looseObject({id:z,name:Yt}),"delete.node":Yi,"lock.node":Yi,"move.node":Q.looseObject({id:z,parent:z,rank:sr}),"edit.description":Q.looseObject({id:z,md:Q.string()}),"close.issue":Q.looseObject({id:z,parent:z,rank:sr}),"reopen.issue":Q.looseObject({id:z,parent:z,rank:sr}),"create.tag":Q.looseObject({id:z,name:Yt}),"tombstone.tag":Yi,"restore.tag":Q.looseObject({id:z,name:Yt}),"create.contributor":Q.looseObject({id:z,name:Yt}),"rename.contributor":Q.looseObject({id:z,name:Yt}),"tombstone.contributor":Yi,"restore.contributor":Q.looseObject({id:z,name:Yt}),"link.contributor.user":Q.looseObject({contributor:z}),"link.contributor.email":Q.looseObject({contributor:z,email:z}),"unlink.contributor.email":Q.looseObject({contributor:z,email:z}),"add.issue.assignee":Q.looseObject({id:z,assignee:z}),"remove.issue.assignee":Q.looseObject({id:z,assignee:z}),"add.issue.tag":Q.looseObject({id:z,tag:z}),"remove.issue.tag":Q.looseObject({id:z,tag:z}),"add.issue.comment":Q.looseObject({id:z,issue:z,md:Q.string()}),"edit.issue.comment":Q.looseObject({id:z,issue:z,md:Q.string()}),"delete.issue.comment":Q.looseObject({id:z,issue:z}),"add.issue.attachment":Q.looseObject({id:z,issue:z,hash:Q.string().min(1),ext:Q.string().min(1),name:Yt,bytes:Q.number()}),"delete.issue.attachment":Q.looseObject({id:z,issue:z}),"rebalance.children":Q.looseObject({parent:z,ranks:Q.record(Q.string(),sr)})},Fp=(e,t)=>{let r=XI[e].safeParse(t);return r.success?u("Payload is readable",void 0):c(`${e}: ${r.error.issues.map(o=>`${o.path.join(".")||"payload"} ${o.message}`).join(", ")}`)};import{ulid as JI}from"ulid";var _p=(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}=V();if(!r||n!==e.userId)return u("Not this actor own write",void 0);let o=N.getContributor(e.userId),s={id:JI(),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)?c(i.message):u("Contributor name recorded",void 0)};var Te={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",DIFF:"Diff",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var H=e=>e.slice(-7).toUpperCase(),Xi=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?H(e).includes(n):!0};var Ce={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:se.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:H(e)},context:se.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:se.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:se.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:se.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:H(e)},context:se.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:se.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:se.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};var QI=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[he,Ji]=QI;var hs=(e,t,n)=>N.getNode(e)?j(`a node with id ${e} already exists`,n):t===e?j("a node cannot be its own parent",n):null,jp={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Ce.workspace(t,n,r),s=ys(o);if(a(s))return qi(s.message,e);let i=N.createNode(o);return a(i)?j(i.message??"Failed to initialize workspace",e):pc(i.value)?u("Workspace initialized",{action:e.action,result:i.value}):c("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=hs(t,void 0,e);if(o)return o;let s=N.createNode(Ce.workspace(t,n,r));return a(s)?j(s.message??"Failed to add workspace",e):pc(s.value)?u("Added workspace",{action:e.action,result:s.value}):c("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=hs(t,r,e);if(s)return s;let i=N.createNode(Ce.board(t,n,r,o));return a(i)?j(i.message??"Unable to create board",e):nr(i.value)?u("Added board",{action:e.action,result:i.value}):c("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=hs(t,r,e);if(s)return s;let i=N.createNode(Ce.swimlane(t,n,r,o));return a(i)?j(i.message??"Unable to create swimlane",e):mn(i.value)?u("Added swimlane",{action:e.action,result:i.value}):c("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=hs(t,r,e);if(s)return s;let i=N.createNode(Ce.ticket(t,n,r,o));return a(i)?j(i.message??"Unable to create issue",e):_(i.value)?u("Added issue",{action:e.action,result:i.value}):c("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,i=hs(t,r,e);if(i)return i;let l=N.createNode(Ce.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(Te.DESCRIPTION)?"vertical":"horizontal"}));return a(l)?j(l.message??`Unable to create field: ${n}`,e):lt(l.value)?u("Added field",{action:e.action,result:l.value}):c("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!N.getNode(t))return j(`Unable to locate node with id ${t}`,e);let o=N.renameNode(t,n);return a(o)?j(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=N.tombstoneNode(t);return a(n)?j(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=N.createTag({id:t,name:n});return a(r)?j(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=N.tombstoneTag(t);return a(n)?j(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=N.restoreTag(t,n);return a(r)?j(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=N.createContributor({id:t,name:n});return a(r)?j(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=N.renameContributor(t,n);return a(r)?j(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=N.tombstoneContributor(t);return a(n)?j(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=N.restoreContributor(t,n);return a(r)?j(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=N.tag(t,n);return a(r)?j(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=N.untag(t,n);return a(r)?j(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=N.assign(t,n);return a(r)?j(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=N.unassign(t,n);return a(r)?j(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=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(o)?j(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=N.editValue(t,n);return a(r)?j(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=N.getNode(t);if(!o)return j("Unable to locate issue",e);if(!_(o))return j("Can only close issues",e);let s=N.getNode(he);if(!s)return j("Unable to locate target swimlane",e);if(n!==s.id)return j("Close target must be closed swimlane",e);let i=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(i)?j(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=N.getNode(t);if(!o)return j("Unable to locate issue",e);if(!_(o))return j("Can only reopen issues",e);let s=N.getNode(he);if(!s)return j("Unable to locate closed swimlane",e);if(n===s.id)return j("Cannot reopen issue into closed swimlane",e);if(!N.getNode(n))return j("Reopen parent no longer exists",e);let l=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(l)?j(l.message??"Unable to reopen issue",e):u("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=N.lockNode(t);return a(n)?j(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=N.getNode(r);if(!s)return j(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return j(`Node ${r} is not child of ${t}`,e);let i=N.updateNode({...s,rank:o});if(a(i))return j(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=N.createComment({id:t,issue:n,authorId:r,md:o,deleted:!1});return a(s)?j(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=N.getComment(t);if(!o)return j("Unable to locate comment",e);if(o.issue!==n)return j("Comment does not belong to issue",e);let s=N.editComment(t,r);return a(s)?j(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=N.getComment(t);if(!r)return j("Unable to locate comment",e);if(r.issue!==n)return j("Comment does not belong to issue",e);let o=N.deleteComment(t);return a(o)?j(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,l=N.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:i,deleted:!1});return a(l)?j(l.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=N.getAttachment(t);if(!r)return j("Unable to locate attachment",e);if(r.issue!==n)return j("Attachment does not belong to issue",e);let o=N.deleteAttachment(t);return a(o)?j(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(!er(n))return j(`not an email address: ${n}`,e);let r=N.linkContributorEmail({email:n,contributor:t,authorId:e.userId});return a(r)?j(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=N.unlinkContributorEmail(n,t,e.userId);return a(r)?j(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=N.linkUserId({contributorId:t,userId:e.userId});return a(n)?j(n.message??"Unable to link contributor",e):u("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};var $p=e=>{let t=N.getNode(e);if(!t||!_(t)||t.isDeleted)return null;let n=Wp(t);return a(n)?n:null},Up=e=>{if(!Pc())return null;for(let t of e){let n=$p(t);if(n)return n;let r=y().nodes[t]?.parentNodeId;if(!r)continue;let o=$p(r);if(o)return o}return null},ZI=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},eE=e=>{let t=[e],n=y().nodes[e]?.parentNodeId;return n&&t.push(n),t},Mc=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 eE(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":default:return[]}},tE=e=>{Fe(t=>({...t,eventLog:[...t.eventLog,e]}))},Fn=null,nE=e=>{for(let[t,n]of e.nodeLog){let r=N.getNode(t);r&&N.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&Fe(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),Up([...e.virtualNodeIds])},Hp={isInitialized:()=>Ot(),batch:e=>Qi(e),afterApply(e,{batched:t,bypassLogging:n}){let r=[...new Set(Mc(e))];if(t){Fn??={appLog:[],nodeLog:new Map,virtualNodeIds:new Set};for(let o of r){if(!n){let s=Fn.nodeLog.get(o);s?s.push(e):Fn.nodeLog.set(o,[e])}if(Pc()){Fn.virtualNodeIds.add(o);let s=y().nodes[o]?.parentNodeId;s&&Fn.virtualNodeIds.add(s)}}return n||Fn.appLog.push(e),null}return n||(r.forEach(o=>ZI(o,e)),tE(e)),Up(r)},flush(){if(!Fn)return null;let e=Fn;return Fn=null,nE(e)}};var pe=()=>{let{userName:e,userId:t}=V();return e?t?jl(t)?Ei(e)?u("Successfully resolved actor ID",{userId:t,userName:e}):c("Invalid user name in config"):c("Invalid user ID in config"):c("User ID not configured"):c("User name not configured")};var rE={genesis:"init.workspace",actions:gc,readPayload:Fp,apply:jp,replay:Hp,write:{readOnlyReason:()=>{let e=y();return e.readOnly?e.readOnlyReason??"Cannot change the board while time travelling":null},beforeWrite:_p}},oE=Op(rE),{materialize:vs,materializeAll:Xt,fromPersistedEvent:O0,decodeReconstructedEvents:F0,loadMergedEventsWithUnreadable:Jt,loadEventActors:Gp,loadActorNames:ir,loadMergedEvents:ar,loadMergedEventsBefore:Zi,getEdgeRef:_0,advanceEdgeRef:j0,clearEdgeCache:$0,getSortedEvents:U0,loadEffectiveEventTimes:ea,mintEventId:H0,persist:Vp,materializeAndPersist:W0,materializeAndPersistAll:B}=oE;var kr=e=>e.trim().toLocaleLowerCase(),Lc=(e,t)=>kr(e).includes(kr(t));var sE=e=>{let{tags:t}=y();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},iE=e=>{let{contributors:t}=y();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},zp=null,Kp=new Map,aE=()=>{let e=y().eventLog??[];if(e===zp)return Kp;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 zp=e,Kp=t,t},lE=e=>{let{contributors:t}=y(),n=aE().get(e.id);return n?[...n].map(r=>t[r]?.name).filter(r=>!!r):[]},qp=(e,t)=>{let n=kr(t.value);if(!n)return!0;switch(t.target){case"title":return Lc(e.title??"",n);case"description":return Lc(e.props.description??"",n);case"tag":return sE(e).map(kr).some(o=>o.includes(n));case"assignee":return iE(e).map(kr).some(o=>o.includes(n));case"actor":return lE(e).map(kr).some(o=>o.includes(n));case"ref":return Xi(e.id,t.value);default:return!0}};var kc=(e,t)=>e.rank<t.rank?-1:e.rank>t.rank?1:0,cE=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,Yp=(e,t)=>Object.values(e).filter(n=>cE(n,t)).sort(kc),Xp=(e,t)=>{let n={};for(let r of Object.values(e)){if(_(r)&&t.length>0&&!t.every(s=>qp(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(kc);return n},Jp=(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(kc);return n};var Qp=e=>ta(xe(e),{at:"end"}),ta=(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(yt(void 0,void 0));let r=()=>n(yt(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(yt(void 0,o.rank)):c("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(yt(o.rank,void 0)):c("Unable to resolve last sibling")}case"before":{let o=Zp(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(yt(i?.rank,s.rank))}case"after":{let o=Zp(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(yt(s.rank,i?.rank))}}},xe=e=>{let t=y();if(!tf()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return Yp(t.nodes,e)},Zp=(e,t)=>e.findIndex(n=>n.id===t),ef=(e,t,n={at:"end"})=>ta(xe(t).filter(r=>r.id!==e),n),hn=(e,t,n,r,o)=>{let s=ef(t,e,n);if(a(s))return s;if(!s.value.needsRebalance)return u("Resolved rank",s.value.rank);let i=hc(e,r);if(a(i))return i;let l=B([i.value],o);if(a(l))return l;let d=ef(t,e,n);return a(d)?d:d.value.needsRebalance?c("Rank rebalance failed to create space"):u("Resolved rank after rebalance",d.value.rank)},_n=(e,t,n)=>{let r=Qp(e);if(a(r))return r;if(!r.value.needsRebalance)return u("Resolved rank",r.value.rank);let o=hc(e,t);if(a(o))return o;let s=B([o.value],n);if(a(s))return s;let i=Qp(e);return a(i)?i:i.value.needsRebalance?c("Rank rebalance failed to create space"):u("Resolved rank after rebalance",i.value.rank)};var bs=5,$={exit(){process.exit(0)},enterChildNode(){let e=y(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=ce(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||$.navigate({contextNode:o,selectedIndex:ce(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=y();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=ce(n.id),o=r.findIndex(({id:i})=>i===e.id),s=r.length===0?-1:o>=0?o:0;$.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>nf(1),navigateToPreviousItem:()=>nf(-1),jumpToNextItem:()=>rf(bs),jumpToPreviousItem:()=>rf(-bs),navigateToNextContainer:()=>of(1),navigateToPreviousContainer:()=>of(-1),navigate:({contextNode:e,selectedIndex:t})=>{w({contextNodeId:e.id,selectedIndex:t})}},nf=e=>{let{selectedIndex:t,contextNode:n}=y(),r=ce(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;$.navigate({selectedIndex:s,contextNode:n})},rf=e=>{let{selectedIndex:t,contextNode:n}=y(),r=ce(n.id).length;if(r===0)return;let o=Math.max(0,t),s=Math.min(Math.max(o+e,0),r-1);$.navigate({selectedIndex:s,contextNode:n})},of=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=y();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=ce(o.id),i=s.findIndex(g=>g.id===t.id);if(i<0)return;let l=s.at(i+e)??s.at(0);if(!l)return;let d=ce(l.id),p=Math.max(0,d.length-1),m=Math.min(Math.max(0,r),p),f=d.length?m:-1;$.navigate({contextNode:l,selectedIndex:f})};var af=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),lf=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=y();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},dE=e=>{let t=y().nodes[e];return!!t&&!t.isDeleted&<(t)&&t.childRenderAxis==="vertical"},na=(e,t)=>{let{nodes:n}=y(),r=n[e];if(!r||r.isDeleted)return!1;let o=xe(r.id);return $.navigate({contextNode:r,selectedIndex:af(t,o.length)}),!0},cf=e=>{let{nodes:t}=y(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return na(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let i=xe(o.id).findIndex(l=>l.id===n.id);return i>=0?($.navigate({contextNode:o,selectedIndex:i}),!0):cf(o.id)},sf=e=>{let{nodes:t}=y(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),cf(n))return!0;n=t[n]?.parentNodeId}return!1},uE=e=>{if(!e)return!1;let t=y().nodes[e];return!!t&&!t.isDeleted},df=e=>{let{nodes:t,rootNodeId:n}=y();if(dE(e.contextNodeId)&&na(e.contextNodeId,e.selectedIndex))return u("Restored navigation inside text container",null);if(uE(e.selectedNodeId)&&e.selectedNodeId&&sf(e.selectedNodeId))return u("Restored navigation to selected node or ancestor",null);if(na(e.contextNodeId,e.selectedIndex))return u("Restored navigation to previous container",null);if(e.parentNodeId&&na(e.parentNodeId,e.selectedIndex))return u("Restored navigation to previous parent",null);if(sf(e.contextNodeId))return u("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return c("Unable to restore navigation");let o=xe(r.id);return $.navigate({contextNode:r,selectedIndex:af(e.selectedIndex,o.length)}),u("Restored navigation to root",null)};import{monotonicFactory as mE,ulid as yn}from"ulid";var xs=mE();function pE(){let e=Ie();if(a(e))return c("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return c("No workspace found in event log");let[r]=ce(n.id),[o]=r?ce(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 fE(){let e=pE();return a(e)?e:$.navigate(e.value)}function uf({userId:e,userName:t}){let n=xs(),r=xs(),o=xs(),s=xs(),i=xs(),l=yt(void 0,void 0);if(a(l))return l;let d=yt(void 0,void 0);if(a(d))return d;let p=yt(d.value,void 0);if(a(p))return p;let m=yt(void 0,void 0);if(a(m))return m;let f=yt(m.value,void 0);if(a(f))return f;let g=yt(f.value,void 0);if(a(g))return g;let v=yt(void 0,void 0);return a(v)?v:u("Created default events",[{id:yn(),userId:e,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:yn(),userId:e,action:"create.contributor",payload:{id:e,name:t}},{id:yn(),userId:e,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:d.value}},{id:yn(),userId:e,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:m.value}},{id:yn(),userId:e,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:yn(),userId:e,action:"add.swimlane",payload:{id:i,name:"Done",parent:r,rank:g.value}},{id:yn(),userId:e,action:"add.board",payload:{id:Ji,name:"Closed",parent:n,rank:p.value}},{id:yn(),userId:e,action:"add.swimlane",payload:{id:he,name:"Closed",parent:Ji,rank:v.value}},{id:yn(),userId:e,action:"lock.node",payload:{id:Ji}},{id:yn(),userId:e,action:"lock.node",payload:{id:he}}])}var gE=()=>{let e=Ie();if(a(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},hE=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(", ");oe.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(", ");oe.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}};function Qt(e,t=[]){if(gE())return u("Skipped boot while checked out at a historical point",null);if(!e.length){let s=Ce.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=ys(s);return a(i)?i:(w({hasProjectDefinition:!1,mode:I.DEFAULT}),u("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return c("Initialized Epiq project has no workspace init event");let n=Xt(e),{fatal:r,skipped:o}=fn(n);return r.length>0?c(`Materializing failed:
|
|
33
33
|
${r.map(s=>s.message).join(`
|
|
34
|
-
`)}`):(
|
|
35
|
-
|
|
36
|
-
`);
|
|
37
|
-
|
|
34
|
+
`)}`):(gn(o),fE(),w({hasProjectDefinition:!0}),hE(t),u("State booted successfully",null))}import{WebSocket as yE}from"ws";var ra=new Set,mf=e=>{ra.add(e),e.on("close",()=>{ra.delete(e)}),e.on("error",()=>{ra.delete(e)})},Dr=e=>{let t=JSON.stringify(e);for(let n of ra)n.readyState===yE.OPEN&&n.send(t)};var oa=e=>{Ot()&&(w({syncStatus:e}),Dr({type:"sync-status",payload:e}))},fo=(e="Syncing...")=>{oa({status:"syncing",msg:e})},Br=(e="Synced")=>{oa({status:"synced",msg:e})},Dc=e=>{oa({status:"failed",msg:e})},sa=e=>{oa({status:"offline",msg:e})},He=e=>(Dc(e),c(e));var Zt=(e,t)=>(logger.error(`[boot:${e}] ${t}`),c(`[boot:${e}] ${t}`)),go=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)}},ye=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t);import FE from"node:fs";import jn from"node:fs";import $n from"node:path";import ia from"node:fs";import pf from"node:path";var ct=".epiq/project.json",ff=e=>pf.join(e,ct),vE=e=>{if(!ia.existsSync(ff(e)))return u("State branch carries no identity yet",null);let t=Tt(e);return a(t)?c(`On the state branch: ${t.message}`):u("Read the state branch identity",t.value)},Bc=(e,t)=>{try{let n=ff(e);return ia.mkdirSync(pf.dirname(n),{recursive:!0}),ia.writeFileSync(n,JSON.stringify(t,null,2)+`
|
|
35
|
+
`,"utf8"),u("Wrote the state branch identity",void 0)}catch(n){return c(n instanceof Error?`Failed to write the state branch identity: ${n.message}`:"Failed to write the state branch identity")}},bE=({checkout:e,branch:t,stateBranch:n})=>[`This checkout's ${ct} 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}:${ct} > ${ct}`,"","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(`
|
|
36
|
+
`);var gf=({repoRoot:e,stateBranchRoot:t,stateBranch:n})=>{if(!ia.existsSync(so(e)))return u("No project file to compare","no-checkout-file");let r=Tt(e);if(a(r))return c(r.message);let o=vE(t);if(a(o))return c(o.message);if(o.value===null){let s=Bc(t,r.value);return a(s)?c(s.message):u("Stamped the state branch with this project","stamped")}return o.value.projectId!==r.value.projectId?c(bE({checkout:r.value,branch:o.value,stateBranch:n})):u("The checkout and the state branch agree","matched")};import vn from"node:fs";import Is from"node:path";var ho=e=>e.split(`
|
|
37
|
+
`).filter(t=>t.trim().length>0),hf=e=>{let t=Is.join(e,gt,Dn);try{if(!vn.existsSync(t))return u("No events directory",[]);let n=vn.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>ho(vn.readFileSync(Is.join(t,r),"utf8")).length>0);return u("Looked for stranded event logs",n)}catch(n){return c(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},yf=e=>Is.join(e,gt,Dn),vf=e=>{let t=yf(e),n=new Map;try{if(!vn.existsSync(t))return n;for(let r of vn.readdirSync(t))if(r.endsWith(".jsonl")&&!Lr(r))try{n.set(r,ho(vn.readFileSync(Is.join(t,r),"utf8")))}catch(o){if(!fs(o))throw o}}catch{return n}return n},xE=e=>{try{let t=JSON.parse(e);return typeof t=="object"&&t!==null}catch{return!1}},bf=(e,t)=>{if(t.size===0)return[];let n=yf(e),r=[];for(let[o,s]of t){if(s.length===0)continue;let i=Is.join(n,o);try{let l=vn.existsSync(i)?vn.readFileSync(i,"utf8"):null,d=new Set(l===null?[]:ho(l)),p=s.filter(f=>!d.has(f)).filter(xE);if(p.length===0)continue;vn.mkdirSync(n,{recursive:!0});let m=l!==null&&l.length>0&&!l.endsWith(`
|
|
38
|
+
`);vn.appendFileSync(i,`${m?`
|
|
39
|
+
`:""}${p.join(`
|
|
38
40
|
`)}
|
|
39
|
-
`,"utf8"),r.push(`${o} (${
|
|
40
|
-
`),
|
|
41
|
-
`));
|
|
42
|
-
${n.message}`);let r=n.value.stdout.trim(),o=await
|
|
43
|
-
${o.message}`):u("Created state branch",!0)},
|
|
44
|
-
`+n.message);if(n.value)return u("Local state branch already exists",!1);let r=await
|
|
45
|
-
`+r.message);let o=r.value,s=o?await
|
|
46
|
-
`+s.message);let i=s.value;if(o&&i){let l=await
|
|
47
|
-
${l.message}`)}if(i){let l=await
|
|
48
|
-
${l.message}`):u("Created local state branch from remote",!0)}return
|
|
49
|
-
`),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)},
|
|
50
|
-
`+r.message);if(
|
|
51
|
-
`));
|
|
52
|
-
${o.message}`):u("Created state branch worktree",!0)},
|
|
53
|
-
`));
|
|
54
|
-
|
|
55
|
-
${
|
|
56
|
-
${
|
|
57
|
-
${
|
|
58
|
-
${
|
|
59
|
-
${
|
|
60
|
-
${
|
|
61
|
-
${
|
|
62
|
-
${
|
|
63
|
-
|
|
64
|
-
${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)},wm=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Ht(e);if(d(o))return o;let s=o.value,i=[Ms(),await Id({repoRoot:e,stateBranchName:s}),await rr({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await qb({stateBranchRoot:t,stateBranchName:s}),await Qc(t),n?await Yb({stateBranchRoot:t,repoRoot:e}):u("Skipped state branch upstream bootstrap",!1)];for(let l of i){if(d(l))return a(l.message);r=r||!!l.value}return u(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import ei from"node:fs";import Ed from"node:os";import Xb from"node:path";var Jb="epiq-sync.lock",Mm=600*1e3,Qb=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}},Zb=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},ex=e=>e&&(e.hostname!==Ed.hostname()||Zb(e.pid))?Date.now()-e.startedAt>Mm:!0,Lm=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Sd=e=>{try{return Qb(ei.readFileSync(e,"utf8"))}catch{return null}},Pm=(e,t)=>{let n={pid:process.pid,hostname:Ed.hostname(),startedAt:Date.now(),operation:t};try{return ei.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},tx=async({worktreeRoot:e,operation:t})=>{let n=await _a(e);if(d(n))return a(n.message);let r=Xb.join(n.value,Jb),o=()=>{try{let l=Sd(r);l&&l.pid===process.pid&&ei.rmSync(r)}catch{}};if(Pm(r,t))return u("Acquired sync lock",{acquired:!0,release:o});let s=Sd(r);if(!ex(s))return u("Sync lock is held",{acquired:!1,heldBy:s});z.info(`Breaking an abandoned sync lock: ${s?Lm(s):"unreadable lock file"}`);try{ei.rmSync(r,{force:!0})}catch{}if(Pm(r,t))return u("Acquired sync lock after breaking a stale one",{acquired:!0,release:o});let i=Sd(r);return u("Sync lock taken by another process",{acquired:!1,heldBy:i??{pid:-1,hostname:Ed.hostname(),startedAt:Date.now(),operation:"unknown"}})},ti=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await tx({worktreeRoot:e,operation:t});if(d(r))return a(r.message);if(!r.value.acquired)return z.info(`Skipping ${t}: the state worktree is held by ${Lm(r.value.heldBy)}`),u("State worktree is held by another process",null);let{release:o}=r.value;try{return u("Ran under the sync lock",await n())}finally{o()}};var rx=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=oe("getRepoRootDir",await wt(e));if(d(n))return a(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=oe("getStateBranchRoot",ue({repoRoot:r}));if(d(o))return a(o.message);let s=o.value;logger.debug("[sync] state branch root",s),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:s,ensureUpstream:t});let i=oe("bootstrapStateBranchStorage",await wm({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(d(i))return a(i.message);logger.debug("[sync] bootstrap result",{bootstrapped:i.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let l=oe("hasInProgressGitOperation(stateBranchRoot)",await Ns(s));if(d(l))return a(l.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:l.value}),l.value)return logger.info("[sync] state branch git operation in progress"),a("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:s});let c=oe("ensureStateBranchLayout",Jc(r,s));return d(c)?a(c.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:i.value}),u("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:i.value}))},ox=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=oe("stageStateBranchOwnEventFile",await Zs({stateBranchRoot:t,eventFileName:n}));if(d(r))return a(r.message);let o=oe("stageStateBranchMediaFiles",await Nm({stateBranchRoot:t}));if(d(o))return a(o.message);let s=oe("stageStateBranchEventConfig",await Am({stateBranchRoot:t}));if(d(s))return a(s.message);let i=[r.value,o.value,...s.value].filter(m=>m!==null);if(i.length===0)return u("Nothing to stage",{createdCommit:!1});let l=oe("hasStagedChanges(after stage)",await Hc(t,i));if(d(l))return a(l.message);if(logger.debug("[sync] state branch change check after stage result",{changed:l.value}),!l.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 c=oe("createStateBranchSyncCommit",await Tm({repoRoot:e,stateBranchRoot:t,pathspec:i}));return d(c)?a(c.message):(logger.debug("[sync] created sync commit",c.value),u("Committed own event file",{createdCommit:!0,commitSha:c.value}))},Cd=(e,t="offline")=>{let n=e.createdCommit?`Committed locally, ${t}`:t==="offline"?"Offline":"No remote";return Qs(n),u(n,{...e,pulled:!1,pushed:!1,offline:!0})},km=async({cwd:e=process.cwd(),ownEventFileName:t})=>{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}),a("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}),a("Own event file must end with .jsonl");Ar();let n=oe("ensureSyncReady",await rx({cwd:e,ensureUpstream:!0}));if(d(n))return Te(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,i=oe("isDetachedHead(stateBranchRoot)",await Wc(o));if(d(i))return Te(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return Te("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,c,m=!1,p=!1,f=oe("getStateBranch",Ht(r));if(d(f))return Te(f.message);let g=f.value;logger.debug("[sync] resolved state branch",{stateBranch:g,stateBranchRoot:o});let v=oe("flushPendingLogs",$s(o,t));d(v)&&logger.error(`[sync] ${v.message}`);let x=oe("commitOwnEventFileToStateBranch",await ox({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(x))return Te(x.message);l=x.value.createdCommit,c=x.value.commitSha;let I=oe("hasRemote",await Xn({repoRoot:o}));if(d(I))return Te(I.message);if(!I.value)return Cd({repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:c,bootstrapped:s},"no remote");let R=oe("pullBranchRebaseIfPresent",await lo({cwd:o,branch:g}));if(d(R))return ao(R.message)?Cd({repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:c,bootstrapped:s}):Te(R.message);m=R.value;let A=oe("isAheadOfUpstream",await jc(o));if(d(A))return Te(A.message);if(l||s||A.value){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:s,stateBranchRoot:o});let w=oe("pushStateBranch",await Ao({stateBranchRoot:o,repoRoot:r}));if(d(w)&&_c(w.message)){let M=oe("pullBranchRebaseIfPresent(retry)",await lo({cwd:o,branch:g}));if(d(M))return Te(M.message);m=m||M.value,w=oe("pushStateBranch(retry)",await Ao({stateBranchRoot:o,repoRoot:r}))}if(d(w))return ao(w.message)?Cd({repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:c,bootstrapped:s}):Te(w.message);p=w.value}if(l){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let w=oe("git rev-parse HEAD",await j({args:["rev-parse","HEAD"],cwd:o}));if(d(w))return Te(w.message);c=w.value.stdout.trim(),logger.debug("[sync] final sync commit sha",c)}return nr(p?"Synced and pushed":m||l?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),u("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:c,pulled:m,pushed:p,bootstrapped:s,offline:!1})},Rd=async(e,t)=>{let n=Im(e);try{return await t()}finally{let r=Sm(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},ni=async e=>{let t=e.cwd??process.cwd(),n=await wt(t);if(d(n))return Te(n.message);let r=ue({repoRoot:n.value});if(d(r))return Te(r.message);let o=r.value;if(!nx.existsSync(o))return km(e);let s=await ti({worktreeRoot:o,operation:"sync",fn:()=>Rd(o,()=>km(e))});return d(s)?Te(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 Xt=null,ri=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Xt,currentStatus:h().syncStatus?.status,currentMessage:h().syncStatus?.msg}),Xt)return logger.debug("[sync] syncAndReloadState joining existing promise"),Xt;logger.debug("[sync] syncAndReloadState creating promise"),Xt=sx();try{let e=await Xt;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!d(e),message:(d(e),e.message),statusAfterResolve:h().syncStatus?.status,statusMessageAfterResolve:h().syncStatus?.msg}),d(e)&&h().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),N({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),Xt||a(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:h().syncStatus?.status,statusMessageBeforeClear:h().syncStatus?.msg}),Xt=null}},sx=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:h().mode,syncStatus:h().syncStatus});let e=Dm();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:h().mode,message:e.message,syncStatus:h().syncStatus}),e;if(Xt)return Xt;logger.debug("[sync] syncAndReloadState:start");let t=oe("resolveActorId",Z());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),a("Unable to resolve event log path");N({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:h().syncStatus});let n=Zn(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=oe("syncEpiqWithRemote",await ni({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!d(r),message:(d(r),r.message)}),d(r))return logger.error("[sync] syncAndReloadState:sync failed",r.message),N({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:h().syncStatus}),Te(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value,i=Nd(o);return d(i)?i:(N({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:h().syncStatus}),u("Synced",!0))},Nd=e=>{logger.debug("[sync] loading merged events after sync",{stateBranchRoot:e});let t=oe("loadMergedEvents",bt(e));if(logger.debug("[sync] loadMergedEvents:result",{success:!d(t),message:(d(t),t.message),count:d(t)?void 0:t.value.events.length}),d(t))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:h().syncStatus}),a(`Unable to load events. ${t.message}`);logger.debug("[sync] loaded merged events after sync",{count:t.value.events.length});let n=Dm();if(n)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:h().mode,message:n.message,syncStatus:h().syncStatus}),n;let r=fm(),o=h().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:r,selectedNodeId:h().selectedNode?.id,contextNodeId:h().contextNode?.id,selectedNodeIsVirtual:h().selectedNode?.isVirtual,contextNodeIsVirtual:h().contextNode?.isVirtual}),!h().selectedNode?.isVirtual&&!h().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:t.value.events.length});let i=oe("bootStateFromEventLog",Dt(t.value.events,t.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(i),message:(d(i),i.message)}),d(i))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:h().syncStatus}),a(`Unable to boot synced state. ${i.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:h().selectedNode?.isVirtual,contextNodeIsVirtual:h().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),N({filters:o}),logger.debug("[sync] restoreNavigationAnchor:start");let s=oe("restoreNavigationAnchor",hm(r));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(s),message:d(s)?s.message:"Navigation restored",selectedNodeId:h().selectedNode?.id,contextNodeId:h().contextNode?.id}),d(s)?(N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:h().syncStatus}),s):u("Reloaded state from event log",null)},Dm=()=>h().mode===b.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:h().mode,syncStatus:h().syncStatus}),N({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var Mr=3e3,Bm=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Mr?null:t},Fm=0,Ad,Td=!1,To=!1,wd=()=>{if(Td)return!0;let e=et();return d(e)?!1:e.value.syncStatus.status==="syncing"},ix=()=>{let e=ie().autoSyncIntervalMs??1e4,t=Date.now()-Fm;return Math.max(0,e-t)},Om=()=>{Ad||(Ad=setTimeout(async()=>{if(Ad=void 0,!!vt()){if(wd()){To=!0;return}To=!1,await ax()}},ix()))},ax=async()=>{if(h().readOnly||h().timeMode==="peek"||h().timeMode==="replay")return a("Cannot auto-sync while peeking");if(!vt())return a("Cannot auto-sync before state is initialized");if(wd())return To=!0,a("Sync already in progress");Td=!0,Fm=Date.now(),N({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await ri()}finally{Td=!1,To&&Om()}},oi=()=>{vt()&&(To=!0,!wd()&&Om())};import wo from"node:fs";import Mo from"node:path";import{z as Pr}from"zod";var si="recent-projects.json",dx=20,lx=Pr.object({projectId:Pr.string().min(1),root:Pr.string().min(1),lastOpenedAt:Pr.number().finite()}),cx=Pr.object({projects:Pr.array(lx)}),Um=()=>Mo.join(ln(),si),Lr=e=>Mo.basename(e)||e,_m=e=>{let t=Mo.resolve(e);try{return wo.realpathSync(t)}catch{return t}},jm=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,$m=e=>{if(!po(e.root))return!1;let t=so(e.root);return!d(t)&&t.value===e.projectId},Hm=()=>{let e=Um();if(!wo.existsSync(e))return u("No recent projects recorded",[]);let t;try{t=JSON.parse(wo.readFileSync(e,"utf8"))}catch(r){return a(`Invalid ${si}: ${r instanceof Error?r.message:String(r)}`)}let n=cx.safeParse(t);return n.success?u("Read recent projects",n.data.projects):a(`Invalid ${si} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ux=e=>{let t=Um();try{wo.mkdirSync(Mo.dirname(t),{recursive:!0}),wo.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
|
|
65
|
-
`,"utf8")}catch(n){return a(`Unable to write ${si}: ${n instanceof Error?n.message:String(n)}`)}return u("Recorded recent project",e)},bn=({exclude:e}={})=>{let t=Hm();if(d(t))return t;let n=e===void 0?null:_m(e);return u("Listed recent projects",t.value.filter(r=>n===null||_m(r.root)!==n).filter($m).sort(jm))},ii=({root:e,now:t=Date.now()})=>{let n=Mo.resolve(e),r=so(n);if(d(r))return a(r.message);let o=r.value,s=Hm(),i=d(s)?[]:s.value,l=[{projectId:o,root:n,lastOpenedAt:t},...i.filter(c=>c.projectId!==o&&c.root!==n)].filter($m).sort(jm).slice(0,dx);return ux(l)};var Ln=()=>{let e=ie(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&r,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r}},Wm=()=>{let e=xe(process.cwd());if(d(e))return!1;let t=$t(e.value);return ce(t)},Gm=e=>e===!0?"on":e===!1?"off":null,Vm=e=>e==="on"?!0:e==="off"?!1:null;var Ke={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"},y={accent:Ke.cyan,accent2:Ke.magenta,primary:Ke.white,secondary:Ke.grayDark,secondary2:Ke.grayLight,gray:Ke.gray,green:Ke.green,yellow:Ke.yellow,red:Ke.red};var T={red:Ke.red,yellow:Ke.yellow,green:Ke.green,blue:Ke.blue,magenta:Ke.magenta,cyan:Ke.cyan},kr={urgent:T.red,critical:T.red,important:T.red,blocker:T.red,asap:T.red,immediate:T.red,fail:T.red,failure:T.red,broken:T.red,bug:T.red,error:T.red,incident:T.red,outage:T.red,production:T.red,crash:T.red,security:T.red,warning:T.yellow,warn:T.yellow,risky:T.yellow,risk:T.yellow,attention:T.yellow,pending:T.yellow,review:T.yellow,"needs-review":T.yellow,qa:T.yellow,testing:T.yellow,test:T.yellow,validate:T.yellow,verification:T.yellow,staging:T.yellow,check:T.yellow,"follow-up":T.yellow,followup:T.yellow,waiting:T.yellow,blocked:T.yellow,hold:T.yellow,done:T.green,complete:T.green,completed:T.green,success:T.green,ok:T.green,stable:T.green,resolved:T.green,fixed:T.green,closed:T.green,merged:T.green,released:T.green,deployed:T.green,approved:T.green,verified:T.green,working:T.green,healthy:T.green,pass:T.green,passing:T.green,info:T.blue,information:T.blue,note:T.blue,docs:T.blue,documentation:T.blue,doc:T.blue,guide:T.blue,help:T.blue,explanation:T.blue,detail:T.blue,details:T.blue,context:T.blue,design:T.blue,discussion:T.blue,proposal:T.blue,idea:T.blue,feature:T.magenta,enhancement:T.magenta,improvement:T.magenta,refactor:T.magenta,refactoring:T.magenta,cleanup:T.magenta,optimize:T.magenta,optimization:T.magenta,perf:T.magenta,performance:T.magenta,upgrade:T.magenta,migration:T.magenta,modernize:T.magenta,debt:T.magenta,todo:T.cyan,next:T.cyan,planned:T.cyan,plan:T.cyan,future:T.cyan,backlog:T.cyan,investigate:T.cyan,explore:T.cyan,prototype:T.cyan};var mx=e=>e.props.tags??[],px=e=>e.props.assignees??[],kn=e=>mx(e).map(t=>C.getTag(t)).filter(t=>!!t),Dn=e=>px(e).map(t=>C.getContributor(t)).filter(t=>!!t),ai=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!P(n)?a("Invalid untag target"):u("Retrieved tags from ticket in breadcrumb",kn(n))},di=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!P(n)?a("Invalid unassign target"):u("Retrieved assignees from ticket in breadcrumb",Dn(n))};var E={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 fx=/^(\d+)(h|d|w|mo|y)$/,gx=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,hx=({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},yx=(e,t=new Date)=>{let n=e.match(fx);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}},vx=e=>{let t=e.match(gx);if(!t)return null;let[,n,r,o,s,i]=t,l=Number(n),c=Number(r),m=Number(o),p=s?Number(s):0,f=i?Number(i):0;return hx({year:l,month:c,day:m,hour:p,minute:f})?new Date(l,c-1,m,p,f):null},or=e=>{let t=e.trim().toLowerCase();return yx(t)??vx(t)};var zm=/^(\d+)(s|m)?$/,li=e=>{let t=e.trim().toLowerCase().match(zm);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},ci=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&zm.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},Km=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,bx=[{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}],Md=(e=bx)=>{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 xx=["BOARD","TICKET","SWIMLANE","COMMENT"],ye={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},mt={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Me={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},Ix=[ye.EDITOR,ye.VIEW,ye.USERNAME,ye.AUTOSYNC,ye.SYNC_DEBOUNCE_MS,ye.ATTACHMENT_MAX_KB,ye.LOG_LEVEL],Sx=(e=h().selectedNode?.context)=>{switch(e){case"TICKET":return[mt.TITLE,mt.DESCRIPTION];case"BOARD":case"SWIMLANE":return[mt.TITLE];case"COMMENT":return[mt.COMMENT];default:return[]}},Ld=[String(Mr),"5000","15000","30000","60000"],kd=["250","500","1000"],Xm=["10s","20s","30s","45s"],sr=[E.EXIT,E.SYNC,E.HELP,E.EXPORT,E.CONFIG,E.YANK],ui=[E.NEW,E.EDIT,E.DELETE,E.MOVE],Pd=[E.TAG,E.UNTAG,E.ASSIGN,E.UNASSIGN,E.CLOSE_ISSUE,E.RE_OPEN_ISSUE,E.EDIT,E.COMMENT],qm=[E.FILTER,E.PEEK,E.REPLAY],Ex={WORKSPACE:[...sr,...ui],BOARD:[...qm,...sr,...ui],SWIMLANE:[...qm,...sr,...ui],TICKET:[...sr,...ui,...Pd],FIELD:[...sr,...Pd],FIELD_LIST:[...sr,...Pd],TEXT:[...sr],COMMENT:[E.EDIT,E.DELETE,E.YANK]},Cx=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Po=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&P(n)),Ym=e=>e.parentNodeId===he,Rx=({selectedNode:e,breadCrumb:t})=>{let n=Sx(e?.context);return Po({breadCrumb:t,selectedNode:e})?n.includes(mt.DESCRIPTION)?n:[...n,mt.DESCRIPTION]:n},Nx=({selectedNode:e,breadCrumb:t})=>{let n=Po({breadCrumb:t,selectedNode:e});return n?[Me.REF,Me.TITLE,...n.props?.description?.trim()?[Me.DESCRIPTION]:[],...kn(n).length>0?[Me.TAGS]:[],...Dn(n).length>0?[Me.ASSIGNEES]:[]]:e?[Me.REF,Me.TITLE]:[]},Dd=()=>{let e=bn({exclude:process.cwd()});return d(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},Ax=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=Ln();if(!r)return[E.HELP,E.CONFIG];if(!Wm())return[E.HELP,E.INIT,E.OPEN];if(t)return[E.HELP,E.PEEK,E.REPLAY,E.EXPORT,E.CONFIG,E.YANK];let o=e?.context,s=o&&xx.includes(o),i=[...new Set([...n,e].map(c=>c?.context).flatMap(c=>c?Ex[c]:[]))],l=Po({breadCrumb:n,selectedNode:e});return i.filter(c=>c===E.MOVE?!1:c===E.YANK?!!(l??e):c===E.EDIT?s||!!l:c===E.DELETE?s:c===E.UNTAG?!!(l&&kn(l).length>0):c===E.UNASSIGN?!!(l&&Dn(l).length>0):c===E.RE_OPEN_ISSUE?!!(l&&Ym(l)):c===E.CLOSE_ISSUE?!!(l&&!Ym(l)):!0)},Ne=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=h())=>{let s=t.context??"WORKSPACE";return{[E.NONE]:Ax({breadCrumb:o,readOnly:r,selectedNode:n}),[E.EXIT]:["confirm"],[E.EXPORT]:[],[E.SYNC]:[],[E.INIT]:[],[E.OPEN]:e===E.OPEN?Dd():[],[E.HELP]:[],[E.PEEK]:[...Md(),"now","prev","next"],[E.REPLAY]:[...Md()],[E.EDIT]:Rx({selectedNode:n,breadCrumb:o}),[E.YANK]:Nx({selectedNode:n,breadCrumb:o}),[E.COMMENT]:[],[E.DELETE]:["confirm"],[E.RE_OPEN_ISSUE]:["confirm"],[E.CLOSE_ISSUE]:["confirm"],[E.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[E.FILTER]:["tag","assignee","actor","description","title","ref","clear"],[E.TAG]:[...new Set([...Object.keys(kr),...C.getExistingTags()])],[E.UNTAG]:[...ai()?.value?.map(({name:l})=>l)??[]],[E.UNASSIGN]:[...di()?.value?.map(({name:l})=>l)??[]],[E.ASSIGN]:C.getExistingAssignees(),[E.NEW]:Cx(s),[E.CONFIG]:[...Ix]}[e]??[]};import fp from"chalk";var Jm=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import Lx from"zod";import Tx from"node:crypto";import Lo from"node:fs";import ep from"node:path";var Qm="/media/",Zm=e=>`${Qm}${e}`,Bd=(e,t)=>`})`;var Jt=500,wx=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,ir=(e,t)=>`${e}.${t}`,Mx=e=>wx.test(e),tp=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"):a(`Unsupported image format. Allowed: ${lu.join(", ")}`),np=e=>Tx.createHash("sha256").update(e).digest("hex"),Px=(e,t=Jt)=>{if(e.length===0)return a("Attachment is empty");if(e.length>t*1024)return a(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=tp(e);return d(n)?n:u("Validated attachment data",{hash:np(e),ext:n.value,bytes:e.length})},rp=(e,t,n=Jt)=>{let r=Px(t,n);if(d(r))return r;let o=mo(e),s=ep.join(o,ir(r.value.hash,r.value.ext));try{Lo.existsSync(s)||(Lo.mkdirSync(o,{recursive:!0}),Lo.writeFileSync(s,t))}catch(i){return a(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return u("Wrote attachment blob",r.value)},op=(e,t,n=Jt)=>{if(!Mx(t))return a("Invalid attachment file name");let r=ep.join(mo(e),t);if(!Lo.existsSync(r))return a("Attachment blob not found");let o;try{o=Lo.readFileSync(r)}catch(c){return a(`Unable to read attachment blob: ${c instanceof Error?c.message:String(c)}`)}if(o.length>n*1024)return a(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(np(o)!==s)return a("Attachment blob does not match its content hash");let l=tp(o);return d(l)?l:l.value!==i?a("Attachment blob content does not match its extension"):u("Resolved attachment blob",{filePath:r,ext:i,bytes:o.length})};var ko=50,Do=5e3,sp=()=>{let e=ee().commandMeta.inputString,t=Lx.coerce.number().int().min(ko).max(Do).safeParse(e);if(!t.success)return a(`Attachment size cap must be ${ko}-${Do} KB (default ${Jt})`);let n=gt({attachmentMaxKb:t.data});return d(n)?n:(ze({attachmentMaxKb:t.data}),N({mode:b.DEFAULT}),u(`Attachment size cap set to ${t.data} KB`,null))};import Dr from"chalk";var Od={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},ip=(e,t,n)=>Math.max(t,Math.min(n,e)),Fd=(e,t,n)=>e+(t-e)*n,ap=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},kx=e=>e.toLowerCase().trim(),Dx=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,i=e/60,l=s*(1-Math.abs(i%2-1)),c=0,m=0,p=0;i>=0&&i<1?(c=s,m=l):i>=1&&i<2?(c=l,m=s):i>=2&&i<3?(m=s,p=l):i>=3&&i<4?(m=l,p=s):i>=4&&i<5?(c=l,p=s):(c=s,p=l);let f=o-s/2;return[Math.round((c+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},dp=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var Bx=(e,t,n)=>{let r=ip(n,0,1);return[Math.round(Fd(e[0],t[0],r)),Math.round(Fd(e[1],t[1],r)),Math.round(Fd(e[2],t[2],r))]};var Fx=(e,t,n)=>Bx(e,t,n),Bo=e=>{let t=ap(e)%360,n=Dx(t,Od.stringColor.saturation,Od.stringColor.lightness);return dp(n)},de=(e,t=kr)=>{let n=kx(e??"");return n&&t[n]?t[n]:Bo(n)};var lp=e=>{let t=Od.gradient.stops,n=ip(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 Fx(t[s],t[s+1],i)},mi=e=>dp(lp(e)),pi=e=>ap(e.toLowerCase().trim())/4294967295,cp=e=>{let t=pi(e);return lp(t)},Ox=e=>{let[t,n,r]=cp(e);return{normal:o=>Dr.bgRgb(t,n,r).black(o),cursor:o=>Dr.bgRgb(t,n,r).white.bold(o)}},_d=e=>{let[t,n,r]=cp(e);return{fg:o=>Dr.rgb(t,n,r)(o),fgCursor:o=>Dr.rgb(t,n,r).inverse(o),bg:o=>Dr.bgRgb(t,n,r).black(o),bgCursor:o=>Dr.bgRgb(t,n,r).white.bold(o)}},fi=e=>Ox(e).normal(` ${e} `);var st=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as _x}from"node:crypto";var Ux="0123456789ABCDEFGHJKMNPQRSTVWXYZ",jx=e=>{let t=_x("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+=Ux[Number(n>>s&31n)]}return r},De=(e,t)=>jx(`${e}:virtual:${t}`);import up from"chalk";var me=e=>up.dim(e),Be=e=>up.hex(y.primary)(e),He=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let i=o.trim();if(i.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(i))].sort((f,g)=>pi(f)-pi(g)).slice(0,r).map(f=>fi(f)).join(" ");return p?`${me(e)}${p}${me(n)}`:""};var Qt={None:"none",Invalid:"invalid",Valid:"valid"};var $x=["BOARD","TICKET","SWIMLANE"],mp=()=>{let e=h().selectedNode;if(!e?.context)return W({message:me("Missing target context")});if($x.includes(e.context))return J();if(e.parentNodeId){let t=h().nodes[e.parentNodeId];if(t?.id===De(t?.parentNodeId??"","comments"))return J()}return W({message:me("Command not available in this context")})},le="<ENTER> to confirm",J=(e="",t=[])=>({message:me(e),validity:Qt.Valid,completionWordList:t}),W=({message:e,completionWordList:t=[]})=>({validity:Qt.Invalid,message:e,completionWordList:t}),Fr=e=>e.length===0,pp=(e,t)=>{let n=Qe(h().breadCrumb,"BOARD");if(d(n))return W({message:Be("Command is not applicable in this context")});let r=ks(n.value.id);return d(r)?W({message:Be(`Unable to ${t}: board id is not a valid ULID`)}):Km({date:e,horizonDate:r.value})?null:W({message:Be(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},gi=e=>` ${fp.hex("#000").bgHex(de(e))(` ${e} `)} `,Ud=({modifier:e})=>{let t="confirm";return e===t?J(le):W({message:Fr(e)?me("if you are certain, enter ")+fi(t):"",completionWordList:[t]})},Hx=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?W({message:me(n)}):J():W({message:Fr(r)?t:"",completionWordList:[...e]}),Br=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>Fr(n)&&Fr(r)?W({message:e,completionWordList:[]}):J(t??le),Wx=({modifier:e,inputString:t})=>{let n=Dd();return!Fr(e)||!Fr(t)?J(le):W({message:n.length?me("number from the list, or a path"):me("path to an epiq project"),completionWordList:n})},Gx=({modifier:e,inputString:t})=>{let n=Ne(E.CONFIG);if(!n.includes(e))return W({message:He({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ye.EDITOR:{let r=[...Jm];return t.trim()?r.includes(t.trim())?J(le):W({message:He({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):W({message:He({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ye.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?J(le):W({message:He({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ye.USERNAME:return t.trim()?J(le):W({message:Be("Enter a user name. Saved in ")+fp.bgBlack("~/.epiq-global/config.json")});case ye.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?J(le):W({message:He({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case ye.AUTOSYNC:{let r=["on","off"],o=ie().autoSync;if(!r.includes(t.trim())){let s=Gm(o);return W({message:He({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return J(le)}case ye.ATTACHMENT_MAX_KB:{let r=ie().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<ko||o>Do){let s=He({prefix:" examples: ",wordList:kd,minLengthForHints:0,inputString:t});return W({message:Be(`provide a size cap in KB (${ko}-${Do}). current: ${r??Jt} KB.`)+s,completionWordList:kd})}return J(le)}case ye.SYNC_DEBOUNCE_MS:{let r=ie().autoSyncIntervalMs,o=Bm(t);if(!t.trim()||o===null||o<Mr){let s=He({prefix:" examples: ",wordList:Ld,minLengthForHints:0,inputString:t});return W({message:Be(`provide duration above ${Mr}ms. current duration: ${r}ms.`)+s,completionWordList:Ld})}return J(le)}default:return W({message:Be("Unknown config option"),completionWordList:n})}},Vx=({modifier:e,inputString:t})=>{let n=Ne(E.EDIT);if(!n.length)return W({message:Be("Command not available in this context")});if(!n.includes(e)){let r=He({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return W({message:r||Be("Unknown edit option"),completionWordList:n})}switch(e){case mt.COMMENT:return t.trim()?J(le):W({message:me("write a comment...")});case mt.TITLE:return J(le);case mt.DESCRIPTION:{let{preferredEditor:r}=ie();return r?J(me("<ENTER> to edit in ")+r):W({message:"No editor selected"})}default:return W({message:Be("Unknown edit option"),completionWordList:n})}},zx=({modifier:e})=>{let t=Ne(E.YANK);return t.length?t.includes(e)?J(le+me(" and copy to clipboard")):W({message:He({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):W({message:Be("Nothing selected to copy from")})},Kx={[E.EXPORT]:()=>J(le+me(", and create export markdown file")),[E.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return J(le);let n={message:me("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=or(r);if(!r||!o)return W(n);let s=pp(o,"peek");return s||J(le)},[E.REPLAY]:e=>{let{dateInput:t,durationInput:n}=ci(e.modifier,e.inputString),r={message:me("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=or(t);if(!t||!o)return W(r);let s=pp(o,"replay");return s||(n&&li(n)===null?W({message:Be("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):J("<ENTER> to replay board history",n?Xm:[]))},[E.EXIT]:()=>J(le+me(" and exit the application")),[E.INIT]:()=>J(le),[E.OPEN]:Wx,[E.PALETTE]:()=>J(le),[E.FILTER]:e=>{if(e.modifier==="clear")return J(le);let t=s=>Ne(E.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return W({message:He({wordList:Ne(E.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Ne(E.FILTER)});let n=Object.values(h().tags).map(s=>s.name),r=Object.values(h().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?W({message:He({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):J():W({message:He({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[E.NONE]:e=>{let t=Ne(E.NONE);return W({message:He({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[E.NEW]:e=>Hx({list:Ne(E.NEW),hint:He({wordList:Ne(E.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[E.HELP]:()=>J(le),[E.EDIT]:Vx,[E.COMMENT]:e=>{let t=Br({hint:me(`write a comment (max ${4e3} char)...`),onOk:me(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===Qt.Invalid?t:e.inputString.length>4e3?J(Be("max input exceeded")):t},[E.CONFIG]:Gx,[E.YANK]:zx,[E.DELETE]:e=>{let t=mp();return t.validity==="invalid"?t:Ud(e)},[E.CLOSE_ISSUE]:e=>Ud(e),[E.RE_OPEN_ISSUE]:e=>Ud(e),[E.MOVE]:e=>{let t=mp();return t.validity==="invalid"?t:Br({hint:He({prefix:"hey hacker! These commands are blocked for you... ",wordList:Ne(E.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[E.TAG]:e=>{let n=C.getExistingTags().slice(0,10).map(gi).join("");return Br({hint:n.length?me("create tag or reuse:")+n+me(""):me("create tag ...")})(e)},[E.UNTAG]:e=>{let t=ai();if(d(t))return W({message:Be("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(gi).slice(0,10);return n.length?Br({hint:me(" ... ")+n.join("")})(e):W({message:Be("Issue has no tags"),completionWordList:[]})},[E.ASSIGN]:e=>{let t=C.getExistingAssignees().map(gi).slice(0,10);return Br({hint:me("assignees... ")+t.join("")})(e)},[E.UNASSIGN]:e=>{let t=di();if(d(t))return W({message:Be("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(gi).slice(0,10);return n.length?Br({hint:me("remove assignee... ")+n.join("")})(e):W({message:Be("Issue has no assignees"),completionWordList:[]})},[E.SYNC]:()=>J(le)},gp=Object.fromEntries(Object.entries(Kx).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var hi=["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 qx=3,Yx=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"]),Xx=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},Jx=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=qx&&!Yx.has(t)&&!/^\d+$/.test(t)),Qx=e=>{let t=new Map;for(let s of Xx(e))for(let i of Jx(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=hi.filter(s=>!r.has(s));return[...n,...o]},hp=hi,yp=-1,vp=()=>{let e=et();if(d(e))return hi;let t=e.value,n=t.eventLog.length;return n!==yp&&(hp=Qx(t),yp=n),hp};var bp=e=>Object.values(E).includes(e),xp=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:l,completionWordList:c}=gp[n].validate(n,r,s),m=n!==E.PEEK&&n!==E.REPLAY,p=o==="command"||o==="modifier"?Ne(n):m?vp():[],{mode:f}=h(),g=f===b.COMMAND_LINE?i??"":"",v=[...c,...p];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?Iu(e,v):{hint:"",hints:[],remainder:"",overlap:0}}};var Ip=e=>{let t=e.trimStart(),n=eI(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=tI(e),l=bp(r)?r:null,c=l!==null,m=r!=="",p=l?Ne(l)??[]:[],f=l&&p.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 v=s?"":i,x=Zx(t,l,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:l,isCommandKeyword:c,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:v,inputString:x}},Zx=(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},eI=e=>e.trim()?e.trim().split(/\s+/):[],tI=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as nI}from"react";var Or=e=>e===jd||e===":",jd=" ",qe={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Qt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},$d=new Set,Sp=()=>{for(let e of $d)e()},Hd=e=>($d.add(e),()=>$d.delete(e)),Zt=e=>{let n=e(qe),r=Ip(n.value),o=n.cursorPosition===n.value.length;qe={...n,commandMeta:xp(r,o)},Sp()},Fo=({message:e,status:t})=>{let n=structuredClone(qe);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,qe=n,Sp(),u(e,null)},Wd=e=>{Zt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Gd=e=>{Zt(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Or(n[o-1]);)o--;for(;o>0&&!Or(n[o-1]);)o--}else{for(;o<n.length&&!Or(n[o]);)o++;for(;o<n.length&&Or(n[o]);)o++}return{...t,cursorPosition:o}})},Ep=()=>{Zt(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}})},Cp=()=>{Zt(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Or(t[r-1]);)r--;for(;r>0&&!Or(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},yi=e=>{Zt(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,l=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:l,commandIsPending:!1}})},Rp=()=>{Zt(e=>({...e,commandIsPending:!0}))},Q=e=>{Zt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Np=({addToHistory:e=!0})=>{Zt(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},Ap=()=>{Zt(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}})},Tp=()=>{Zt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ee=()=>qe,wp=()=>nI(Hd,ee,ee),vi=()=>{let[e,...t]=qe.value.split(jd);return t.join(jd).trim()};var S={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",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",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function rI(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function oI(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function sI(e,t,n){let r=h().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 Mp(e,t){let n=ee();if(e.sequence==="?"&&t!==b.PALETTE)return S.InitCommandPalette;if(e.sequence===":"&&t!==b.COMMAND_LINE)return S.InitCommandLine;if(t===b.MOVE)switch(e.name){case"m":case"return":return S.ConfirmMove}if(t===b.COMMAND_LINE)return pu(e,n.value);if(t===b.PALETTE)return fu(e,n.value);let r=rI(e)||oI(e);if(r)return iI(r,t);if(e.ctrl&&e.name==="c")return S.Exit;switch(e.name){case"r":return S.EditTitle;case"e":return S.EditDescription;case"n":return S.AddItem;case"m":return S.InitMove;case"d":return S.Delete;case"y":return S.Yank;case"return":return S.Confirm;case"space":return S.Confirm;case"v":return ie().viewMode==="wide"?S.SetViewDense:S.SetViewWide;case"q":case"escape":return S.Exit;default:return null}}function iI(e,t){let n=t===b.MOVE?{prevItem:S.MovePreviousItem,nextItem:S.MoveNextItem,prevContainer:S.MoveToPreviousContainer,nextContainer:S.MoveToNextContainer}:{prevItem:S.NavPreviousItem,nextItem:S.NavNextItem,prevContainer:S.NavToPreviousContainer,nextContainer:S.NavToNextContainer};return sI(h().contextNode.childRenderAxis,e,n)}var bi=e=>{let{context:t}=h().contextNode;if(!t)return U.None;switch(e){case E.EXIT:return U.Exit;case E.EXPORT:return U.Export;case E.INIT:return U.Init;case E.OPEN:return U.OpenProject;case E.DELETE:return U.Delete;case E.EDIT:return U.Edit;case E.COMMENT:return U.Comment;case E.HELP:return U.ViewHelp;case E.RE_OPEN_ISSUE:return U.ReopenIssue;case E.CLOSE_ISSUE:return U.CloseIssue;case E.TAG:return U.TagTicket;case E.UNTAG:return U.UntagTicket;case E.ASSIGN:return U.AssignUserToTicket;case E.UNASSIGN:return U.UnassignUserFromTicket;case E.NEW:return U.NewItem;case E.FILTER:return U.Filter;case E.MOVE:return U.Move;case E.PEEK:return U.Peek;case E.REPLAY:return U.Replay;case E.CONFIG:return U.Config;case E.YANK:return U.Yank;case E.SYNC:return U.Sync;default:return U.None}},U={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 ff from"node:fs";import iS from"node:path";import aS from"react";import{Box as oS}from"ink";import Ni from"react";import NI from"chalk";import{Box as Kd,Text as AI}from"ink";import en from"react";import{Text as Pp}from"ink";import Lp,{useEffect as kp,useState as aI}from"react";var Dp={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},Ye=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Y(),r=Dp[n]??Dp.default,[o,s]=aI(0);if(kp(()=>{s(0)},[r]),kp(()=>{if(!e)return;let l=setInterval(()=>{s(c=>(c+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return Lp.createElement(Pp,null,t);let i=r[o]??r[0]??t;return Lp.createElement(Pp,{color:y.accent,dimColor:o===1},i)};import{Box as Vd,Text as dI}from"ink";import xi from"react";var lI=(e,t,n,r)=>{let o=c=>Math.max(1,e[c]??1),s=n,i=n+1,l=o(n);for(;i<t&&l+o(i)<=r;)l+=o(i),i++;for(;s>0&&l+o(s-1)<=r;)s--,l+=o(s);return{start:s,end:i}},xt=({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)),l=Math.max(1,Math.ceil(r)),c=Math.max(0,Math.min(n,e.length-1)),m=Math.max(1,Math.floor(i/l)),p=Math.max(0,e.length-m),{start:f,end:g}=o?lI(o,e.length,c,i):s?{start:Math.min(p,Math.max(0,c-m+1)),end:Math.min(p,Math.max(0,c-m+1))+m}:{start:Math.min(p,Math.floor(c/m)*m),end:Math.min(p,Math.floor(c/m)*m)+m},v=Math.max(1,g-f),x=e.slice(f,g),I=e.length>v,R=i,A=I?Math.max(1,Math.floor(v/e.length*R)):R,w=Math.max(0,R-A),M=Math.max(1,e.length-v),k=I?Math.floor(f/M*w):0;return xi.createElement(Vd,{flexDirection:"row",height:i,width:"100%"},xi.createElement(Vd,{flexDirection:"column",flexGrow:1,height:i},x),xi.createElement(Vd,{flexDirection:"column",width:1,height:R},Array.from({length:R}).map((D,ve)=>xi.createElement(dI,{key:ve,color:I&&ve>=k&&ve<k+A?y.accent:y.secondary},I?"\u2502":" "))))};import{Box as jr,Text as $r}from"ink";import it from"react";var Bp,zd,cI=()=>{let{eventLog:e=[]}=h();if(zd&&Bp===e)return zd;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return Bp=e,zd=t,t},Ii=e=>cI().has(e);import{Text as uI}from"ink";import mI from"react";var pI=e=>e.toLowerCase().trim(),fI=(e,t=kr)=>{let n=pI(e);return t[n]?t[n]:Bo(n)},Bn=({id:e,isSelected:t,maxWidth:n})=>{let r=C.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:fn(o,n);return mI.createElement(uI,{underline:t,color:fI(o)},"@"+s,Ii(e)?"":"\u2197")};import{Text as gI}from"ink";import hI from"react";var _r=({id:e,isSelected:t,maxWidth:n})=>{let r=C.getTag(e);if(!r)return;let o=n===void 0?r.name:fn(r.name,n);return hI.createElement(gI,{underline:t,backgroundColor:de(r.name),color:y.secondary}," "+o+" ")};import{useEffect as yI,useState as vI}from"react";var bI=80,Fp=1400,Si=new Set,Oo=null,xI=e=>(Si.add(e),Oo||(Oo=setInterval(()=>{for(let t of Si)t()},bI)),()=>{Si.delete(e),Si.size===0&&Oo&&(clearInterval(Oo),Oo=null)}),II=()=>{let e=Date.now()%Fp/Fp;return e<.5?e*2:(1-e)*2},Ur=e=>{let[,t]=vI(0);return yI(()=>{if(e)return xI(()=>t(n=>n+1))},[e]),mi(II())};var SI=(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),fn(e.slice(o).trim(),n)]},Op=3,EI=2,CI=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let i=e.length-o-1,l=i>0?String(i).length+1:0;if(r+s.width+l>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},_p=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=Ur(r),s=e-4,i=s-7-1,[l,c]=SI(Ie(t.title),i,s),m=c?null:fn(Ie(t.props.description),s)||null,p=kn(t),f=Dn(t).map(A=>({...A,name:A.name})),g=Math.max(1,s-Op),v=C.getCommentsByIssue(t.id),x=v.length?String(v.length).length+2+1:0,{shown:I,hidden:R}=CI([...p.map(A=>({id:A.id,isTag:!0,width:Math.min(A.name.length,g)+Op})),...f.map(A=>({id:A.id,isTag:!1,width:Math.min(A.name.length,g)+EI+(Ii(A.id)?0:1)}))],s-x);return it.createElement(jr,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?y.accent:y.secondary,justifyContent:"space-between"},it.createElement(jr,{paddingLeft:1,paddingRight:1,flexDirection:"column"},it.createElement(jr,{justifyContent:"space-between"},it.createElement($r,{color:y.primary},l),it.createElement($r,{color:y.secondary2,dimColor:!0},_(t.id))),c&&it.createElement($r,{color:y.primary},c),m&&it.createElement($r,{color:y.secondary2,dimColor:!0},m)),it.createElement(jr,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},it.createElement(jr,{flexDirection:"row"},I.map(A=>it.createElement(jr,{paddingRight:1,key:A.id},A.isTag?it.createElement(_r,{id:A.id,maxWidth:g}):it.createElement(Bn,{id:A.id,maxWidth:g}))),R>0&&it.createElement($r,{color:y.secondary2,dimColor:!0},"+",R)),v.length>0&&it.createElement($r,{color:y.accent},"[",v.length,"]")))};import{Box as ar,Text as _o}from"ink";import pt from"react";var RI=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Up=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:i})=>{let l=Ur(s),c=(r.props.tags??[]).map(D=>C.getTag(D)).filter(D=>!!D),m=(r.props.assignees??[]).map(D=>C.getContributor(D)).map(D=>D&&{...D,name:D.name}).filter(D=>!!D),p=1,f=c.length*(1+p),g=m.length*(2+p),v=c.map(D=>pt.createElement(ar,{key:D.id,paddingRight:p},pt.createElement(_o,{color:de(D.name)},"\u25A0"))),x=m.map(D=>pt.createElement(ar,{key:D.id,paddingRight:p},pt.createElement(_o,{color:Bo(D.name)},"@"+D.name.at(0)))),I=s?l:o?y.accent:i===b.MOVE?y.secondary:y.primary,R=C.getCommentsByIssue(r.id),A=R.length?String(R.length).length+2+p:0,w=R.length?pt.createElement(ar,{paddingRight:p},pt.createElement(_o,{color:y.accent},"[",R.length,"]")):null,M=f+g+A,k=Math.max(1,n-t-M-(M>0?1:0));return pt.createElement(ar,{justifyContent:"space-between"},pt.createElement(ar,null,pt.createElement(ar,{width:t},o?pt.createElement(Ye,{isSelected:!0}):pt.createElement(_o,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),pt.createElement(_o,{wrap:"truncate",color:I},RI(r.title,k))),pt.createElement(ar,null,v,x,w))};var TI=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:i,mode:l})=>{let{renderedChildrenIndex:c,replay:m}=Y(),p=c[e.id]??[],f=m?new Set(m.flashNodeIds):null,g=f?.has(e.id)??!1,v=Ur(g),x=`${e.title} ${NI.hex(y.secondary2).dim("("+p.length+")")}`,I=3,R=o?1:5,A=s&&i===-1,w=n-3-(o?1:0)-(A?2:0),M=Math.max(2,String(p.length).length+1),k=r-I-1,D=en.createElement(Kd,{borderStyle:"round",borderColor:y.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},en.createElement(Ye,{isSelected:t}),en.createElement(AI,{bold:!0,color:g?v:t?y.accent:y.primary},x," ",e.readonly?"\u{1F512}":"")),ve=(Ve,Nt)=>{let dt=s&&i===Nt;if(!P(Ve))return null;let ke=f?.has(Ve.id)??!1;return o?en.createElement(Up,{key:Ve.id,index:Nt,labelWidth:M,width:w,ticket:Ve,isSelected:dt,isFlashing:ke,mode:l}):en.createElement(_p,{key:Ve.id,width:w,ticket:Ve,isSelected:dt,isFlashing:ke})};return en.createElement(Kd,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?y.accent:y.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},D,en.createElement(Kd,null,p.length>0&&en.createElement(xt,{selectedIndex:i,height:k,itemHeight:R},p.map(ve)),A&&en.createElement(Ye,{isSelected:!0})))},jp=en.memo(TI);import{Box as lr,Text as sl}from"ink";import Fe,{useMemo as jo}from"react";var $p=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},Hp=(e,t,n)=>ge.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});import{Box as Gr,Text as xn}from"ink";import Xe,{useEffect as wI,useMemo as MI,useRef as PI}from"react";import{decodeTime as Wp}from"ulid";var Wr=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"},Ei=e=>String(e).padStart(2,"0"),Ci=e=>`${e.getFullYear()}-${Ei(e.getMonth()+1)}-${Ei(e.getDate())} ${Ei(e.getHours())}:${Ei(e.getMinutes())}`;var LI=e=>De(e,"attachments"),kI=e=>C.getAttachmentsByIssue(e.id).sort((t,n)=>Wp(t.id)-Wp(n.id)),Gp=e=>{for(let t of e)C.deleteNode(t.id)},DI=(e,t,n)=>ge.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),BI=(e,t)=>{let n=C.getNode(LI(e.id));if(!n||!ut(n))return[];let r=t.map((o,s)=>DI(o,s,n.id)).map(o=>C.createNode(o)).filter(ce).map(({value:o})=>o).filter(ut);return t.length>0&&h().selectedIndex<0&&O.navigate({contextNode:n,selectedIndex:0}),r},FI=e=>`${Math.max(1,Math.round(e/1024))} KB`;function Vp({ticket:e,width:t,height:n}){let r=MI(()=>kI(e),[e]),o=PI([]);wI(()=>(Gp(o.current),o.current=BI(e,r),()=>{Gp(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Y(),l=Math.max(1,n-4),c=Math.max(12,t-32);return r.length===0?Xe.createElement(Gr,{flexDirection:"column",width:t,height:n,padding:1},Xe.createElement(xn,{color:y.primary},"No attachments yet."),Xe.createElement(Gr,{paddingTop:1},Xe.createElement(xn,{color:y.primary},"Attach images from the browser GUI"),Xe.createElement(xn,{color:y.accent}," epiq gui "),Xe.createElement(xn,{color:y.primary},"by dropping or pasting them."))):Xe.createElement(Gr,{flexDirection:"column",width:t,height:n},Xe.createElement(Gr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},Xe.createElement(xn,{color:y.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),Xe.createElement(xt,{height:l,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let f=p===s,g=m.name.length>c?m.name.slice(0,c-1)+"\u2026":m.name;return Xe.createElement(Gr,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Xe.createElement(xn,{color:y.accent},f?"\u276F ":" "),Xe.createElement(Gr,{paddingLeft:1},Xe.createElement(xn,{color:y.secondary2},`#${p+1} `),Xe.createElement(xn,{color:f?y.accent:y.primary},g),Xe.createElement(xn,{color:y.secondary2}," "+FI(m.bytes)+" "+Wr(Re(m.id)))))})))}import{Box as Fn,Text as On}from"ink";import Pe,{useEffect as GI,useMemo as of,useRef as VI}from"react";import{decodeTime as sf}from"ulid";var Kp=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,qd=e=>e.replace(Kp,"");var zp=e=>e==="additions"||e==="deletions",Yd=e=>{let t=Kp.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"||!zp(r.side)||!zp(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var qp=/```\n([\s\S]*?)\n?```\s*$/,Yp=e=>qp.exec(e)?.[1]??null,OI=/`[^`\n]+`[^\n]*\n?$/,Xp=e=>qd(e).replace(qp,"").replace(OI,"").trim(),_I=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})`},Xd=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${_I(e)}`;var UI=(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 l=i;for(;l.length>n;)s&&(o.push(s),s=""),o.push(l.slice(0,n)),l=l.slice(n);s?s.length+1+l.length<=n?s=`${s} ${l}`:(o.push(s),s=l):s=l}return s&&o.push(s),o},Uo=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)},jI=/!\[([^\]]*)\]\([^)]*\)/g,$I=e=>e.replace(jI,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),HI=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),WI=4,Qp=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(WI)),Jd=e=>{let t=!1;return e.map(Qp).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=Yd(n);if(r)return{kind:"caption",text:Xd(r)};let o=$I(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:Uo(s[1]??"")}:{kind:"text",spans:Uo(o)}})},Zp=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],Jp=(e,t)=>{let n=[];for(let r of Jd(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 Zp(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of UI(HI(r.spans),t))n.push({kind:r.kind,spans:Uo(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},ef=(e,t)=>{let n=Yd(e),r=n?Yp(e):null;if(!n||r===null)return Jp(qd(e).split(`
|
|
66
|
-
`),t);let o=Xp(e),s=r.split(`
|
|
67
|
-
`)
|
|
68
|
-
`),t),{kind:"blank"}]:[],{kind:"caption",text:Xd(n)},...s.flatMap((c,m)=>Zp(c,Math.max(1,t-l)).map((p,f)=>({kind:"code",text:p,number:i===void 0||f>0?void 0:i+m})))]};import{Box as tf,Text as dr}from"ink";import It from"react";var nf=({spans:e,bold:t,wrap:n})=>It.createElement(dr,{color:y.primary,bold:t,wrap:n},e.map((r,o)=>r.code?It.createElement(dr,{key:o,color:y.yellow},r.text):It.createElement(dr,{key:o},r.text))),Qd=({line:e,width:t,gutter:n=0,wrap:r})=>{switch(e.kind){case"blank":return It.createElement(dr,null," ");case"fence":return It.createElement(dr,{color:y.secondary2},"```");case"caption":return It.createElement(dr,{color:y.accent,wrap:r},e.text);case"heading":return It.createElement(nf,{spans:e.spans,bold:!0,wrap:r});case"text":return It.createElement(nf,{spans:e.spans,wrap:r});case"code":{let o=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return It.createElement(dr,{backgroundColor:y.secondary,color:y.primary,wrap:r},o,e.text.padEnd(Math.max(0,t-o.length)))}}},rf=({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 It.createElement(tf,{flexDirection:"column"},e.map((o,s)=>It.createElement(tf,{key:s},It.createElement(Qd,{line:o,width:t,gutter:r}))))};var zI=4,KI=e=>De(e,"comments"),qI=e=>C.getCommentsByIssue(e.id).sort((t,n)=>sf(t.id)-sf(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),af=e=>{for(let t of e)C.deleteNode(t.id)},YI=(e,t)=>{let n=C.getNode(KI(e.id));if(!n||!ut(n))return[];let r=t.map((o,s)=>Hp(o,s,n.id)).map(C.createNode).filter(ce).map(({value:o})=>o).filter(yo);return t.length>0&&h().selectedIndex<0&&O.navigate({contextNode:n,selectedIndex:0}),r};function df({ticket:e,width:t,height:n}){let r=of(()=>qI(e),[e]),o=VI([]);GI(()=>(af(o.current),o.current=YI(e,r),()=>{af(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Y(),l=Math.max(1,n-4),c=Math.max(20,t-8),m=of(()=>r.map(f=>{let g=ef(f.md,c);return g.length>0?g:[{kind:"blank"}]}),[r,c]),p=m.map(f=>f.length+zI);return r.length===0?Pe.createElement(Fn,{flexDirection:"column",width:t,height:n,padding:1},Pe.createElement(On,{color:y.primary},"No comments yet."),Pe.createElement(Fn,{paddingTop:1},Pe.createElement(On,{color:y.primary},"Use"),Pe.createElement(On,{color:y.accent}," :comment "),Pe.createElement(On,{color:y.primary},"to add the first one."))):Pe.createElement(Fn,{flexDirection:"column",width:t,height:n},Pe.createElement(Fn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},Pe.createElement(On,{color:y.secondary2},"Comments (",r.length,") ")),Pe.createElement(xt,{height:l,itemHeights:p,selectedIndex:s},r.map((f,g)=>{let v=g===s;return Pe.createElement(Fn,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},Pe.createElement(Fn,{flexDirection:"row",paddingBottom:1},Pe.createElement(On,{color:y.accent},v?"\u276F ":" "),Pe.createElement(Fn,{paddingLeft:1},Pe.createElement(On,{color:y.secondary2},`#${g+1} `),Pe.createElement(Bn,{id:f.authorId}),Pe.createElement(On,{color:y.secondary2}," "+Wr(Re(f.id))))),Pe.createElement(Fn,{paddingLeft:3,paddingBottom:1},Pe.createElement(rf,{lines:m[g]??[],width:c})))})))}import{Box as Ri,Text as XI}from"ink";import In from"react";var lf=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=Y(),{title:o}=t,s=t.parentNodeId?C.getNode(t.parentNodeId):void 0,i=s&&P(s)?o===fe.ASSIGNEES?s.props.assignees??[]:o===fe.TAGS?(s.props.tags??[]).filter(l=>C.getTag(l)):[]:[];return In.createElement(Ri,{alignItems:"center",paddingTop:1},In.createElement(Ri,{minWidth:12},In.createElement(Ye,{isSelected:n}),In.createElement(XI,{color:n?y.accent:y.secondary2},o,":")),In.createElement(Ri,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((l,c)=>{let m=r.id===t.id&&c===e;return In.createElement(Ri,{key:`${o}-${l}`,paddingRight:2,minHeight:1},In.createElement(Ye,{isSelected:m}),o===fe.ASSIGNEES?In.createElement(Bn,{isSelected:m,id:l}):o===fe.TAGS?In.createElement(_r,{isSelected:m,id:l}):null)})))};import{Box as Vr,Text as tl}from"ink";import St,{useEffect as JI,useMemo as nl}from"react";var Zd=e=>Math.max(5,String(Math.max(e,1)).length+3),cf=(e,t)=>Math.max(0,e-6-Zd(t));var el=(e,t=0)=>Math.max(1,e-5-2*t);var QI="\u2029",uf=(e,t)=>`${e}::inline-line::${t}`,rl=new Map,mf=e=>{let t=rl.get(e)??[];rl.delete(e);for(let n of t)C.deleteNode(n)},ZI=(e,t)=>{mf(e);let n=[];t.forEach((r,o)=>{let s=yt(BigInt(o+1));if(!ce(s))return;let i=C.createNode(ge.text({id:uf(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));ce(i)&&n.push(i.value.id)}),rl.set(e,n)},ol=({id:e,label:t,text:n,rows:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:l}=Y(),c=nl(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=nl(()=>c.join("\0"),[c]);JI(()=>(ZI(e,c),()=>{mf(e)}),[e,m]);let p=Zd(c.length),f=cf(s,c.length),v=nl(()=>Jd(c).map(x=>{if(x.kind==="code"||x.kind==="caption")return{...x,text:Za(x.text,f)};if(x.kind==="text"||x.kind==="heading"){let I=x.spans.map(R=>R.code?`\`${R.text}\``:R.text).join("");return{...x,spans:Uo(Za(I,f))}}return x}),[c,f]).map((x,I)=>{let R=l.id===e&&i===I;return St.createElement(Vr,{key:uf(e,I)},St.createElement(Vr,{flexShrink:0},St.createElement(tl,{color:R?y.primary:y.secondary2,dimColor:!R},`${I+1} `.padStart(p,"\xA0"))),x.kind==="blank"?St.createElement(tl,{backgroundColor:R?"gray":void 0},QI):St.createElement(Vr,null,St.createElement(Qd,{line:x,width:x.kind==="code"?f:0,wrap:"truncate-end"})))});return St.createElement(Vr,{flexDirection:"column",paddingTop:1},St.createElement(Vr,null,St.createElement(Ye,{isSelected:o}),St.createElement(tl,{color:o?y.accent:y.secondary2},t)),St.createElement(Vr,{flexDirection:"row",borderStyle:"round",borderColor:y.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},St.createElement(xt,{scrollByOne:!0,height:r,selectedIndex:i,itemHeight:1},v)))};var eS=e=>De(e,"description"),tS=e=>De(e,"comments"),nS=e=>De(e,"history"),rS=e=>De(e,"attachments"),pf=({ticket:e,height:t})=>{let n=jo(()=>$p(e),[e]),{selectedIndex:r,contextNode:o}=Y(),s=process.stdout.columns||120,i=jo(()=>eS(e.id),[e.id]),l=jo(()=>tS(e.id),[e.id]),c=jo(()=>nS(e.id),[e.id]),m=jo(()=>rS(e.id),[e.id]),p=C.getAttachmentsByIssue(e.id).length,f=o.id===e.id,g=o.id===l||o.parentNodeId===l,v=o.id===c||o.parentNodeId===c,x=o.id===m||o.parentNodeId===m,I=q(e.id);if(g){let k=t-3;return Fe.createElement(lr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Fe.createElement(df,{ticket:e,width:s,height:k}))}if(x){let k=t-3;return Fe.createElement(lr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Fe.createElement(Vp,{ticket:e,width:s,height:k}))}if(v){let M=C.getNode(c),k=M&&ut(M)?M.props.value??"":"",D=el(t);return Fe.createElement(lr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},M?Fe.createElement(ol,{id:M.id,label:"Event log",text:k,selected:!1,maxWidth:s,rows:D}):null)}let R=I.reduce((M,k)=>ho(k)||k.id===l||k.id===m||k.id===c?M+1:M,0),A=el(t,R),w=(M,k)=>M.id===i?Fe.createElement(ol,{key:M.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:k,maxWidth:s,rows:A}):ho(M)?Fe.createElement(lf,{key:M.id,parent:M,selected:k,selectedIndex:r}):M.id===l?Fe.createElement(lr,{key:M.id,paddingTop:1},Fe.createElement(Ye,{isSelected:k}),Fe.createElement(sl,{backgroundColor:y.secondary,color:k?y.accent:y.primary},` Comments (${n}) \u203A\u203A `)):M.id===m?Fe.createElement(lr,{key:M.id,paddingTop:1},Fe.createElement(Ye,{isSelected:k}),Fe.createElement(sl,{backgroundColor:y.secondary,color:k?y.accent:y.primary},` Attachments (${p}) \u203A\u203A `)):M.id===c?Fe.createElement(lr,{key:M.id,paddingTop:1},Fe.createElement(Ye,{isSelected:k}),Fe.createElement(sl,{backgroundColor:y.secondary,color:k?y.accent:y.primary}," History \u203A\u203A ")):null;return Fe.createElement(lr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},I.map((M,k)=>w(M,f&&r===k)))};var sS=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:i,width:l})=>{let c=t.context,m=c===V.TICKET||c===V.FIELD_LIST||c===V.FIELD,p=c===V.BOARD||c===V.SWIMLANE,f=c===V.TICKET?t:r.find(R=>R.context===V.TICKET),g=Math.floor(l/3),v=Math.floor(l/Math.max(e.length,1)),x=Math.min(v,g),I=s==="dense";return Ni.createElement(oS,{flexDirection:"row",height:i},p&&e.map((R,A)=>{let w=t.id===R.id,M=w?n:-1,k=t.context===V.BOARD&&n===A;return Ni.createElement(jp,{key:R.id,height:i,width:x,swimlane:R,isSelected:k,isDense:I,isFocused:w,listSelectedIndex:M,mode:o})}),m&&f&&Ni.createElement(pf,{height:i,ticket:f}))},Ai=Ni.memo(sS);import{render as dS}from"ink";import{Writable as lS}from"node:stream";var $o=e=>String(e).padStart(2,"0"),cS=e=>{let t=e.getUTCFullYear(),n=$o(e.getUTCMonth()+1),r=$o(e.getUTCDate()),o=$o(e.getUTCHours()),s=$o(e.getUTCMinutes()),i=$o(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},uS=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",mS=async(e,{width:t,height:n})=>{let r="",o=new lS({write(i,l,c){let m=pS(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),c()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=dS(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},pS=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),gf=async()=>{let{viewMode:e}=ie(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=h(),i=r.find(A=>A.context==="BOARD");if(!i)return a("No board found to export");let l=120,c=40,m=await mS(aS.createElement(Ai,{height:c,width:l,swimlanes:(s[i.id]??[]).filter(A=>A!==void 0&&Pt(A)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:l,height:c});if(!m)return a("Failed to render board export");let p=Cs(process.cwd());if(d(p))return a("Unable to export, epiq root not found");let f=new Date,g=cS(f),v=`board_${uS(i.title)}_${g}.md`,x=Zc(p.value);ff.mkdirSync(x,{recursive:!0});let I=iS.join(x,v),R=`# Board - ${i.title}
|
|
41
|
+
`,"utf8"),r.push(`${o} (${p.length})`)}catch{continue}}return r},IE=(e,t)=>{let n=new Set(ho(t));return ho(e).filter(r=>!n.has(r))},EE=(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(`
|
|
42
|
+
`),xf=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let r=await Be({args:["show",`HEAD:${t}`],cwd:e});if(r.exitCode!==0)return u("No committed log to compare against",void 0);let o=IE(r.stdout,n);return o.length>0?c(EE(t,o,ho(r.stdout).length)):u("Event log only grew",void 0)};var SE="[epiq:init-repo]",Ef=async e=>{let t=await Be({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 c(["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(`
|
|
43
|
+
`));oe.info("Creating initial commit");let r=await U({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(a(r))return c(r.message);let o=await U({args:["commit-tree",r.value.stdout.trim(),"-m",SE],cwd:e});if(a(o))return c(o.message);let s=await U({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return a(s)?c(s.message):u("Created initial commit",!0)},If=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",RE=async e=>{let t=await wi(e);if(a(t))return c(t.message);let n=await mm(e);return a(n)?c(n.message):u("Built sync commit message",`[sync|branch:${If(t.value)}:sha:${If(n.value)}]`)},Oc=async({repoRoot:e,stateBranchName:t})=>{oe.info(`Creating ${t}`);let n=await U({args:["commit-tree",Im,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return c(`Failed to create state branch commit
|
|
44
|
+
${n.message}`);let r=n.value.stdout.trim(),o=await U({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return a(o)?c(`Failed to create ${t}
|
|
45
|
+
${o.message}`):u("Created state branch",!0)},Es=async({repoRoot:e,stateBranchName:t})=>{let n=await Ti({repoRoot:e,branch:t});if(a(n))return c(`Ensure local state branch failed
|
|
46
|
+
`+n.message);if(n.value)return u("Local state branch already exists",!1);let r=await kn({repoRoot:e});if(a(r))return c(`Ensure local state branch failed
|
|
47
|
+
`+r.message);let o=r.value,s=o?await Zo({repoRoot:e,branch:t}):u("No remote, no remote state branch",!1);if(a(s))return c(`Ensure local state branch failed
|
|
48
|
+
`+s.message);let i=s.value;if(o&&i){let l=await Ae.fetch({cwd:e,remote:wt,branch:t});if(a(l))return c(`Failed to fetch ${t} from remote
|
|
49
|
+
${l.message}`)}if(i){let l=await U({args:["branch","--track",t,`${wt}/${t}`],cwd:e});return a(l)?c(`Failed to create local ${t} from remote
|
|
50
|
+
${l.message}`):u("Created local state branch from remote",!0)}return Oc({repoRoot:e,stateBranchName:t})},CE=async({repoRoot:e,branch:t})=>{let n=await U({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return c(n.message);let r=n.value.stdout.split(`
|
|
51
|
+
`),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)},NE=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=ns($n.dirname(t));if(a(r))return c(`Failed to create state branch worktree
|
|
52
|
+
`+r.message);if(jn.existsSync(t)&&!jn.existsSync($n.join(t,".git"))){let s=hf(t);if(a(s))return c(s.message);if(s.value.length>0)return c([`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(`
|
|
53
|
+
`));oe.info("Removing broken state branch worktree path"),Cm(t)}oe.info("Creating state branch worktree");let o=await Ae.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?c(`Failed to create state branch worktree
|
|
54
|
+
${o.message}`):u("Created state branch worktree",!0)},lr=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await TE({repoRoot:e,stateBranchRoot:t,stateBranchName:n});if(a(r))return r;let o=gf({repoRoot:e,stateBranchRoot:t,stateBranch:n});return a(o)?c(o.message):(o.value==="stamped"&&oe.info("Stamped the state branch with this project\u2019s identity"),r)},AE=(e,t)=>{let n=io(wr());return $n.dirname(e)===n&&$n.dirname(t)===n},TE=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await CE({repoRoot:e,branch:n});if(a(r))return c(r.message);let o=io(t),s=r.value?io(r.value):null;if(s&&s===o&&jn.existsSync(s))return u("State branch already checked out in expected worktree",!1);if(s&&s!==o&&AE(s,o))return c([`The state branch ${n} is checked out under project ${$n.basename(s)}, but this checkout names project ${$n.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 ${ct} here`,`with \`git show ${n}:${ct}\`, and keep the branch's.`].join(`
|
|
55
|
+
`));if(s&&s!==o){let d=await hm(s);if(a(d))return c(d.message);if(d.value||xp(s))return c([`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(`
|
|
56
|
+
`));oe.info("Moving state branch worktree to expected location");let p=await Ae.worktreeRemove({cwd:e,worktreeRoot:s});if(a(p))return c(`Failed to remove existing state branch worktree
|
|
57
|
+
${p.message}`)}if(s&&!jn.existsSync(s)){oe.info("Pruning stale state branch worktree");let d=await Ae.worktreePrune({cwd:e});if(a(d))return c(`Failed to prune stale worktrees
|
|
58
|
+
${d.message}`)}let i=await um({repoRoot:e,worktreeRoot:t});if(a(i))return c(i.message);let l=jn.existsSync(t);if(i.value&&l)return u("State branch worktree already exists",!1);if(i.value&&!l){oe.info("Pruning missing registered state branch worktree");let d=await Ae.worktreePrune({cwd:e});if(a(d))return c(`Failed to prune stale worktrees
|
|
59
|
+
${d.message}`)}return NE({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},wE=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await wi(e);if(a(n))return c(n.message);if(n.value===t)return u("State branch already checked out",!1);(await Be({cwd:e,args:["rebase","--abort"]})).exitCode===0&&oe.info("Aborted stale state branch rebase");let o=await Ae.checkout({cwd:e,branch:t});return a(o)?c(`Failed to checkout ${t}
|
|
60
|
+
${o.message}`):u("Checked out state branch",!0)},ME=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Jl(t);if(a(n))return c(n.message);if(n.value)return u("State branch upstream already configured",!1);let r=await kn({repoRoot:t});if(a(r))return c(r.message);if(!r.value)return u("No remote available for state branch upstream",!1);let o=Qe(e);if(a(o))return o;let s=o.value,i=await Zo({repoRoot:t,branch:s});if(a(i))return c(i.message);if(!i.value)return u("Remote state branch missing; upstream will be configured on first push",!1);oe.info(`Configuring ${s} upstream`);let l=await Ae.fetch({cwd:t,remote:wt,branch:s});if(a(l))return c(`Failed to fetch ${s}
|
|
61
|
+
${l.message}`);let d=await Ae.setUpstream({cwd:t,branch:s,upstream:`${wt}/${s}`});return a(d)?c(`Failed to set state branch upstream
|
|
62
|
+
${d.message}`):u("Configured state branch upstream",!0)},aa=async({stateBranchRoot:e,eventFileName:t})=>{let n=Em(t),r=$n.join(e,n);if(!jn.existsSync(r))return u("No event file to stage",null);let o=await xf({stateBranchRoot:e,relativePath:n,workingContent:jn.readFileSync(r,"utf8")});if(a(o))return c(o.message);let s=await Ae.stage({cwd:e,pathspec:[n]});return a(s)?c(`Failed to stage state branch event file
|
|
63
|
+
${s.message}`):u("Staged state branch event file",n)},Sf=async({stateBranchRoot:e})=>{let t=Sm(),n=$n.join(e,t);if(!jn.existsSync(n))return u("No media directory to stage",null);let r=await Ae.stage({cwd:e,pathspec:[t],ignoreRemoval:!0});return a(r)?c(`Failed to stage state branch media files
|
|
64
|
+
${r.message}`):u("Staged state branch media files",t)},Rf=async({stateBranchRoot:e})=>{let t=[Ql(),Zl(),ct].filter(r=>jn.existsSync($n.join(e,r)));if(t.length===0)return u("No event log config to stage",[]);let n=await Ae.stage({cwd:e,pathspec:t});return a(n)?c(`Failed to stage event log config
|
|
65
|
+
${n.message}`):u("Staged event log config",t)},Cf=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await RE(e);return a(r)?c(`Create state branch sync commit failed
|
|
66
|
+
`+r.message):ao({cwd:t,message:r.value,pathspec:n})},Ss=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Jl(t);if(a(n))return c(n.message);let r=Qe(e);if(a(r))return r;let o=r.value,s=n.value?await Ae.push({cwd:t}):await Ae.push({cwd:t,remote:wt,branch:o,setUpstream:!0});if(a(s))return c(`Failed during state branch push
|
|
67
|
+
${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)},Nf=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Qe(e);if(a(o))return o;let s=o.value,i=[rs(),await Es({repoRoot:e,stateBranchName:s}),await lr({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await wE({stateBranchRoot:t,stateBranchName:s}),await Am(t),n?await ME({stateBranchRoot:t,repoRoot:e}):u("Skipped state branch upstream bootstrap",!1)];for(let l of i){if(a(l))return c(l.message);r=r||!!l.value}return u(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import la from"node:fs";import _c from"node:os";import PE from"node:path";var LE="epiq-sync.lock",Af=600*1e3,kE=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}},DE=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},BE=e=>e&&(e.hostname!==_c.hostname()||DE(e.pid))?Date.now()-e.startedAt>Af:!0,wf=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Fc=e=>{try{return kE(la.readFileSync(e,"utf8"))}catch{return null}},Tf=(e,t)=>{let n={pid:process.pid,hostname:_c.hostname(),startedAt:Date.now(),operation:t};try{return la.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},OE=async({worktreeRoot:e,operation:t})=>{let n=await Xl(e);if(a(n))return c(n.message);let r=PE.join(n.value,LE),o=()=>{try{let l=Fc(r);l&&l.pid===process.pid&&la.rmSync(r)}catch{}};if(Tf(r,t))return u("Acquired sync lock",{acquired:!0,release:o});let s=Fc(r);if(!BE(s))return u("Sync lock is held",{acquired:!1,heldBy:s});oe.info(`Breaking an abandoned sync lock: ${s?wf(s):"unreadable lock file"}`);try{la.rmSync(r,{force:!0})}catch{}if(Tf(r,t))return u("Acquired sync lock after breaking a stale one",{acquired:!0,release:o});let i=Fc(r);return u("Sync lock taken by another process",{acquired:!1,heldBy:i??{pid:-1,hostname:_c.hostname(),startedAt:Date.now(),operation:"unknown"}})},ca=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await OE({worktreeRoot:e,operation:t});if(a(r))return c(r.message);if(!r.value.acquired)return oe.info(`Skipping ${t}: the state worktree is held by ${wf(r.value.heldBy)}`),u("State worktree is held by another process",null);let{release:o}=r.value;try{return u("Ran under the sync lock",await n())}finally{o()}};var _E=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=ye("getRepoRootDir",await zt(e));if(a(n))return c(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=ye("getStateBranchRoot",ge({repoRoot:r}));if(a(o))return c(o.message);let s=o.value;logger.debug("[sync] state branch root",s),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:s,ensureUpstream:t});let i=ye("bootstrapStateBranchStorage",await Nf({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(a(i))return c(i.message);logger.debug("[sync] bootstrap result",{bootstrapped:i.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let l=ye("hasInProgressGitOperation(stateBranchRoot)",await Ai(s));if(a(l))return c(l.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:l.value}),l.value)return logger.info("[sync] state branch git operation in progress"),c("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:s});let d=ye("ensureStateBranchLayout",Nm(r,s));return a(d)?c(d.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:i.value}),u("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:i.value}))},jE=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 Lp(It(t),n)){let m=ye("stageStateBranchOwnEventFile",await aa({stateBranchRoot:t,eventFileName:p}));if(a(m))return c(m.message);r.push(m.value)}let o=ye("stageStateBranchMediaFiles",await Sf({stateBranchRoot:t}));if(a(o))return c(o.message);let s=ye("stageStateBranchEventConfig",await Rf({stateBranchRoot:t}));if(a(s))return c(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 l=ye("hasStagedChanges(after stage)",await ym(t,i));if(a(l))return c(l.message);if(logger.debug("[sync] state branch change check after stage result",{changed:l.value}),!l.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=ye("createStateBranchSyncCommit",await Cf({repoRoot:e,stateBranchRoot:t,pathspec:i}));return a(d)?c(d.message):(logger.debug("[sync] created sync commit",d.value),u("Committed own event file",{createdCommit:!0,commitSha:d.value}))},jc=(e,t="offline")=>{let n=e.createdCommit?`Committed locally, ${t}`:t==="offline"?"Offline":"No remote";return sa(n),u(n,{...e,pulled:!1,pushed:!1,offline:!0})},Mf=async({cwd:e=process.cwd(),ownEventFileName:t})=>{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}),c("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}),c("Own event file must end with .jsonl");fo();let n=ye("ensureSyncReady",await _E({cwd:e,ensureUpstream:!0}));if(a(n))return He(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,i=ye("isDetachedHead(stateBranchRoot)",await vm(o));if(a(i))return He(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return He("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,d,p=!1,m=!1,f=ye("getStateBranch",Qe(r));if(a(f))return He(f.message);let g=f.value;logger.debug("[sync] resolved state branch",{stateBranch:g,stateBranchRoot:o});let v=ye("flushPendingLogs",Wi(o,t));a(v)&&logger.error(`[sync] ${v.message}`);let x=ye("commitOwnEventFileToStateBranch",await jE({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(x))return He(x.message);l=x.value.createdCommit,d=x.value.commitSha;let b=ye("hasRemote",await kn({repoRoot:o}));if(a(b))return He(b.message);if(!b.value)return jc({repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:d,bootstrapped:s},"no remote");let R=ye("pullBranchRebaseIfPresent",await ts({cwd:o,branch:g}));if(a(R))return es(R.message)?jc({repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:d,bootstrapped:s}):He(R.message);p=R.value;let S=ye("isAheadOfUpstream",await gm(o));if(a(S))return He(S.message);if(l||s||S.value){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:s,stateBranchRoot:o});let A=ye("pushStateBranch",await Ss({stateBranchRoot:o,repoRoot:r}));if(a(A)&&pm(A.message)){let T=ye("pullBranchRebaseIfPresent(retry)",await ts({cwd:o,branch:g}));if(a(T))return He(T.message);p=p||T.value,A=ye("pushStateBranch(retry)",await Ss({stateBranchRoot:o,repoRoot:r}))}if(a(A))return es(A.message)?jc({repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:d,bootstrapped:s}):He(A.message);m=A.value}if(l){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let A=ye("git rev-parse HEAD",await U({args:["rev-parse","HEAD"],cwd:o}));if(a(A))return He(A.message);d=A.value.stdout.trim(),logger.debug("[sync] final sync commit sha",d)}return Br(m?"Synced and pushed":p||l?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),u("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:d,pulled:p,pushed:m,bootstrapped:s,offline:!1})},$c=async(e,t)=>{let n=vf(e);try{return await t()}finally{let r=bf(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},da=async e=>{let t=e.cwd??process.cwd(),n=await zt(t);if(a(n))return He(n.message);let r=ge({repoRoot:n.value});if(a(r))return He(r.message);let o=r.value;if(!FE.existsSync(o))return Mf(e);let s=await ca({worktreeRoot:o,operation:"sync",fn:()=>$c(o,()=>Mf(e))});return a(s)?He(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 bn=null,ua=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!bn,currentStatus:y().syncStatus?.status,currentMessage:y().syncStatus?.msg}),bn)return logger.debug("[sync] syncAndReloadState joining existing promise"),bn;logger.debug("[sync] syncAndReloadState creating promise"),bn=$E();try{let e=await bn;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!a(e),message:(a(e),e.message),statusAfterResolve:y().syncStatus?.status,statusMessageAfterResolve:y().syncStatus?.msg}),a(e)&&y().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),w({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),bn||c(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:y().syncStatus?.status,statusMessageBeforeClear:y().syncStatus?.msg}),bn=null}},$E=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:y().mode,syncStatus:y().syncStatus});let e=Pf();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:y().mode,message:e.message,syncStatus:y().syncStatus}),e;if(bn)return bn;logger.debug("[sync] syncAndReloadState:start");let t=ye("resolveActorId",pe());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:a(t)?t.message:"Missing actor id"}),c("Unable to resolve event log path");w({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:y().syncStatus});let n=or(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=ye("syncEpiqWithRemote",await da({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!a(r),message:(a(r),r.message)}),a(r))return logger.error("[sync] syncAndReloadState:sync failed",r.message),w({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:y().syncStatus}),He(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value,i=Uc(o);return a(i)?i:(w({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:y().syncStatus}),u("Synced",!0))},Uc=e=>{logger.debug("[sync] loading merged events after sync",{stateBranchRoot:e});let t=ye("loadMergedEvents",Jt(e));if(logger.debug("[sync] loadMergedEvents:result",{success:!a(t),message:(a(t),t.message),count:a(t)?void 0:t.value.events.length}),a(t))return w({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:y().syncStatus}),c(`Unable to load events. ${t.message}`);logger.debug("[sync] loaded merged events after sync",{count:t.value.events.length});let n=Pf();if(n)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:y().mode,message:n.message,syncStatus:y().syncStatus}),n;let r=lf(),o=y().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:r,selectedNodeId:y().selectedNode?.id,contextNodeId:y().contextNode?.id,selectedNodeIsVirtual:y().selectedNode?.isVirtual,contextNodeIsVirtual:y().contextNode?.isVirtual}),!y().selectedNode?.isVirtual&&!y().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:t.value.events.length});let i=ye("bootStateFromEventLog",Qt(t.value.events,t.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!a(i),message:(a(i),i.message)}),a(i))return w({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:y().syncStatus}),c(`Unable to boot synced state. ${i.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:y().selectedNode?.isVirtual,contextNodeIsVirtual:y().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),w({filters:o}),logger.debug("[sync] restoreNavigationAnchor:start");let s=ye("restoreNavigationAnchor",df(r));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!a(s),message:a(s)?s.message:"Navigation restored",selectedNodeId:y().selectedNode?.id,contextNodeId:y().contextNode?.id}),a(s)?(w({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:y().syncStatus}),s):u("Reloaded state from event log",null)},Pf=()=>y().mode===I.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:y().mode,syncStatus:y().syncStatus}),w({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),c("Will not re-materialize if not in default mode, to not lose edit data"));var yo=3e3,Lf=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<yo?null:t},kf=0,Hc,Wc=!1,Rs=!1,Gc=()=>{if(Wc)return!0;let e=Ie();return a(e)?!1:e.value.syncStatus.status==="syncing"},UE=()=>{let e=V().autoSyncIntervalMs??1e4,t=Date.now()-kf;return Math.max(0,e-t)},Df=()=>{Hc||(Hc=setTimeout(async()=>{if(Hc=void 0,!!Ot()){if(Gc()){Rs=!0;return}Rs=!1,await HE()}},UE()))},HE=async()=>{if(y().readOnly||y().timeMode==="peek"||y().timeMode==="replay")return c("Cannot auto-sync while peeking");if(!Ot())return c("Cannot auto-sync before state is initialized");if(Gc())return Rs=!0,c("Sync already in progress");Wc=!0,kf=Date.now(),w({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await ua()}finally{Wc=!1,Rs&&Df()}},ma=()=>{Ot()&&(Rs=!0,!Gc()&&Df())};import Cs from"node:fs";import Ns from"node:path";import{z as vo}from"zod";var pa="recent-projects.json",WE=20,GE=vo.object({projectId:vo.string().min(1),root:vo.string().min(1),lastOpenedAt:vo.number().finite()}),VE=vo.object({projects:vo.array(GE)}),Of=()=>Ns.join(Mn(),pa),bo=e=>Ns.basename(e)||e,Bf=e=>{let t=Ns.resolve(e);try{return Cs.realpathSync(t)}catch{return t}},Ff=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,_f=e=>{if(!is(e.root))return!1;let t=cn(e.root);return!a(t)&&t.value===e.projectId},jf=()=>{let e=Of();if(!Cs.existsSync(e))return u("No recent projects recorded",[]);let t;try{t=JSON.parse(Cs.readFileSync(e,"utf8"))}catch(r){return c(`Invalid ${pa}: ${r instanceof Error?r.message:String(r)}`)}let n=VE.safeParse(t);return n.success?u("Read recent projects",n.data.projects):c(`Invalid ${pa} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},zE=e=>{let t=Of();try{Cs.mkdirSync(Ns.dirname(t),{recursive:!0}),Cs.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
|
|
68
|
+
`,"utf8")}catch(n){return c(`Unable to write ${pa}: ${n instanceof Error?n.message:String(n)}`)}return u("Recorded recent project",e)},Un=({exclude:e}={})=>{let t=jf();if(a(t))return t;let n=e===void 0?null:Bf(e);return u("Listed recent projects",t.value.filter(r=>n===null||Bf(r.root)!==n).filter(_f).sort(Ff))},fa=({root:e,now:t=Date.now()})=>{let n=Ns.resolve(e),r=cn(n);if(a(r))return c(r.message);let o=r.value,s=jf(),i=a(s)?[]:s.value,l=[{projectId:o,root:n,lastOpenedAt:t},...i.filter(d=>d.projectId!==o&&d.root!==n)].filter(_f).sort(Ff).slice(0,WE);return zE(l)};var Vc=null,$f=e=>{Vc=e},Uf=e=>Vc?Vc(e):[];var Hf=[],xo=e=>{Hf=e},Io=()=>Hf;var Hn=()=>{let e=V(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1,o=Wf(),s=o.length>0?null:zc(),i=s!==null&&(e.declinedEmailBoards??[]).includes(s),l=o.length>0||i||s===null;return{isSetupDone:n&&t&&r&&l,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r,isSetEmails:l,claimedEmails:o,emailSetupDeclined:i}},zc=()=>{let e=me(process.cwd());if(a(e))return null;let t=cn(e.value);return a(t)?null:t.value||null},Wf=()=>{let{userId:e}=V();return e?Uf(e):[]},Gf=()=>Wf().length>0;var Kc=()=>{let e=me(process.cwd());if(a(e))return!1;let t=Tt(e.value);return be(t)},Vf=e=>e===!0?"on":e===!1?"off":null,zf=e=>e==="on"?!0:e==="off"?!1:null,Kf=()=>{let e=Hn();if(!e.isSetUserName)return"config username ";if(!e.isSetPreferredEditor)return"config editor ";if(!e.isSetAutoSync)return"config autoSync ";if(!Kc())return"init";if(!e.isSetEmails){let{gitEmail:t}=V(),n=Io()[0]??t;return n&&er(n)?`config emails ${n}`:"config emails "}return null};var KE=e=>e.props.tags??[],qE=e=>e.props.assignees??[],xn=e=>KE(e).map(t=>N.getTag(t)).filter(t=>!!t),In=e=>qE(e).map(t=>N.getContributor(t)).filter(t=>!!t),ga=()=>{let{breadCrumb:e,selectedNode:t}=y(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!_(n)?c("Invalid untag target"):u("Retrieved tags from ticket in breadcrumb",xn(n))},ha=()=>{let{breadCrumb:e,selectedNode:t}=y(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!_(n)?c("Invalid unassign target"):u("Retrieved assignees from ticket in breadcrumb",In(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 YE=/^(\d+)(h|d|w|mo|y)$/,XE=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,JE=({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},QE=(e,t=new Date)=>{let n=e.match(YE);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}},ZE=e=>{let t=e.match(XE);if(!t)return null;let[,n,r,o,s,i]=t,l=Number(n),d=Number(r),p=Number(o),m=s?Number(s):0,f=i?Number(i):0;return JE({year:l,month:d,day:p,hour:m,minute:f})?new Date(l,d-1,p,m,f):null},Or=e=>{let t=e.trim().toLowerCase();return QE(t)??ZE(t)};var qf=/^(\d+)(s|m)?$/,ya=e=>{let t=e.trim().toLowerCase().match(qf);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},va=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&qf.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},Yf=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,eS=[{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}],qc=(e=eS)=>{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 tS=["BOARD","TICKET","SWIMLANE","COMMENT"],ve={EDITOR:"editor",VIEW:"view",USERNAME:"username",EMAILS:"emails",EMAILS_UNCLAIM:"emails-unclaim",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},Lt={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},qe={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},nS=[ve.EDITOR,ve.VIEW,ve.USERNAME,ve.EMAILS,ve.EMAILS_UNCLAIM,ve.AUTOSYNC,ve.SYNC_DEBOUNCE_MS,ve.ATTACHMENT_MAX_KB,ve.LOG_LEVEL],rS=(e=y().selectedNode?.context)=>{switch(e){case"TICKET":return[Lt.TITLE,Lt.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Lt.TITLE];case"COMMENT":return[Lt.COMMENT];default:return[]}},Xc=[String(yo),"5000","15000","30000","60000"],Jc=["250","500","1000"],Qf=["10s","20s","30s","45s"],Fr=[C.EXIT,C.SYNC,C.HELP,C.EXPORT,C.CONFIG,C.YANK],ba=[C.NEW,C.EDIT,C.DELETE,C.MOVE],Yc=[C.TAG,C.UNTAG,C.ASSIGN,C.UNASSIGN,C.CLOSE_ISSUE,C.RE_OPEN_ISSUE,C.EDIT,C.COMMENT],Xf=[C.FILTER,C.PEEK,C.REPLAY],oS={WORKSPACE:[...Fr,...ba],BOARD:[...Xf,...Fr,...ba],SWIMLANE:[...Xf,...Fr,...ba],TICKET:[...Fr,...ba,...Yc],FIELD:[...Fr,...Yc],FIELD_LIST:[...Fr,...Yc],TEXT:[...Fr],COMMENT:[C.EDIT,C.DELETE,C.YANK]},sS=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],As=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&_(n)),Jf=e=>e.parentNodeId===he,iS=({selectedNode:e,breadCrumb:t})=>{let n=rS(e?.context);return As({breadCrumb:t,selectedNode:e})?n.includes(Lt.DESCRIPTION)?n:[...n,Lt.DESCRIPTION]:n},aS=({selectedNode:e,breadCrumb:t})=>{let n=As({breadCrumb:t,selectedNode:e});return n?[qe.REF,qe.TITLE,...n.props?.description?.trim()?[qe.DESCRIPTION]:[],...xn(n).length>0?[qe.TAGS]:[],...In(n).length>0?[qe.ASSIGNEES]:[]]:e?[qe.REF,qe.TITLE]:[]},Qc=()=>{let e=Un({exclude:process.cwd()});return a(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},lS=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=Hn();if(!r)return[C.HELP,C.CONFIG];if(!Kc())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&&tS.includes(o),i=[...new Set([...n,e].map(d=>d?.context).flatMap(d=>d?oS[d]:[]))],l=As({breadCrumb:n,selectedNode:e});return i.filter(d=>d===C.MOVE?!1:d===C.YANK?!!(l??e):d===C.EDIT?s||!!l:d===C.DELETE?s:d===C.UNTAG?!!(l&&xn(l).length>0):d===C.UNASSIGN?!!(l&&In(l).length>0):d===C.RE_OPEN_ISSUE?!!(l&&Jf(l)):d===C.CLOSE_ISSUE?!!(l&&!Jf(l)):!0)},_e=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=y())=>{let s=t.context??"WORKSPACE";return{[C.NONE]:lS({breadCrumb:o,readOnly:r,selectedNode:n}),[C.EXIT]:["confirm"],[C.EXPORT]:[],[C.SYNC]:[],[C.INIT]:[],[C.OPEN]:e===C.OPEN?Qc():[],[C.HELP]:[],[C.PEEK]:[...qc(),"now","prev","next"],[C.REPLAY]:[...qc()],[C.EDIT]:iS({selectedNode:n,breadCrumb:o}),[C.YANK]:aS({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(ki),...N.getExistingTags()])],[C.UNTAG]:[...ga()?.value?.map(({name:l})=>l)??[]],[C.UNASSIGN]:[...ha()?.value?.map(({name:l})=>l)??[]],[C.ASSIGN]:N.getExistingAssignees(),[C.NEW]:sS(s),[C.CONFIG]:[...nS]}[e]??[]};import ug from"chalk";var Zf=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import pS from"zod";import cS from"node:crypto";import Ts from"node:fs";import ng from"node:path";var eg="/media/",tg=e=>`${eg}${e}`,Zc=(e,t)=>`})`;var En=500,dS=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,_r=(e,t)=>`${e}.${t}`,uS=e=>dS.test(e),rg=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"):c(`Unsupported image format. Allowed: ${Wm.join(", ")}`),og=e=>cS.createHash("sha256").update(e).digest("hex"),mS=(e,t=En)=>{if(e.length===0)return c("Attachment is empty");if(e.length>t*1024)return c(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=rg(e);return a(n)?n:u("Validated attachment data",{hash:og(e),ext:n.value,bytes:e.length})},sg=(e,t,n=En)=>{let r=mS(t,n);if(a(r))return r;let o=ss(e),s=ng.join(o,_r(r.value.hash,r.value.ext));try{Ts.existsSync(s)||(Ts.mkdirSync(o,{recursive:!0}),Ts.writeFileSync(s,t))}catch(i){return c(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return u("Wrote attachment blob",r.value)},ig=(e,t,n=En)=>{if(!uS(t))return c("Invalid attachment file name");let r=ng.join(ss(e),t);if(!Ts.existsSync(r))return c("Attachment blob not found");let o;try{o=Ts.readFileSync(r)}catch(d){return c(`Unable to read attachment blob: ${d instanceof Error?d.message:String(d)}`)}if(o.length>n*1024)return c(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(og(o)!==s)return c("Attachment blob does not match its content hash");let l=rg(o);return a(l)?l:l.value!==i?c("Attachment blob content does not match its extension"):u("Resolved attachment blob",{filePath:r,ext:i,bytes:o.length})};var ws=50,Ms=5e3,ag=()=>{let e=ie().commandMeta.inputString,t=pS.coerce.number().int().min(ws).max(Ms).safeParse(e);if(!t.success)return c(`Attachment size cap must be ${ws}-${Ms} KB (default ${En})`);let n=Et({attachmentMaxKb:t.data});return a(n)?n:(ke({attachmentMaxKb:t.data}),u(`Attachment size cap set to ${t.data} KB`,null))};var dt=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as fS}from"node:crypto";var gS="0123456789ABCDEFGHJKMNPQRSTVWXYZ",hS=e=>{let t=fS("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+=gS[Number(n>>s&31n)]}return r},Pe=(e,t)=>hS(`${e}:virtual:${t}`);import lg from"chalk";var Ne=e=>lg.dim(e),We=e=>lg.hex(h.primary)(e),Ge=({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)=>Bi(f)-Bi(g)).slice(0,r).map(f=>Oi(f)).join(" ");return m?`${Ne(e)}${m}${Ne(n)}`:""};var Sn={None:"none",Invalid:"invalid",Valid:"valid"};var yS=["BOARD","TICKET","SWIMLANE"],cg=()=>{let e=y().selectedNode;if(!e?.context)return K({message:Ne("Missing target context")});if(yS.includes(e.context))return ae();if(e.parentNodeId){let t=y().nodes[e.parentNodeId];if(t?.id===Pe(t?.parentNodeId??"","comments"))return ae()}return K({message:Ne("Command not available in this context")})},fe="<ENTER> to confirm",vS=()=>{let{userId:e}=V(),t=Ie();return!e||a(t)?[]:un(t.value.emailLinks,e)},ae=(e="",t=[],n=!0)=>({message:n?Ne(e):e,validity:Sn.Valid,completionWordList:t}),K=({message:e,completionWordList:t=[]})=>({validity:Sn.Invalid,message:e,completionWordList:t}),So=e=>e.length===0,dg=(e,t)=>{let n=ht(y().breadCrumb,"BOARD");if(a(n))return K({message:We("Command is not applicable in this context")});let r=Li(n.value.id);return a(r)?K({message:We(`Unable to ${t}: board id is not a valid ULID`)}):Yf({date:e,horizonDate:r.value})?null:K({message:We(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},xa=e=>` ${ug.hex("#000").bgHex(ze(e))(` ${e} `)} `,ed=({modifier:e})=>{let t="confirm";return e===t?ae(fe):K({message:So(e)?Ne("if you are certain, enter ")+Oi(t):"",completionWordList:[t]})},bS=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?K({message:Ne(n)}):ae():K({message:So(r)?t:"",completionWordList:[...e]}),Eo=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>So(n)&&So(r)?K({message:e,completionWordList:[]}):ae(t??fe),xS=({modifier:e,inputString:t})=>{let n=Qc();return!So(e)||!So(t)?ae(fe):K({message:n.length?Ne("number from the list, or a path"):Ne("path to an epiq project"),completionWordList:n})},IS=({modifier:e,inputString:t})=>{let n=_e(C.CONFIG);if(!n.includes(e))return K({message:Ge({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ve.EDITOR:{let r=[...Zf];return t.trim()?r.includes(t.trim())?ae(fe):K({message:Ge({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):K({message:Ge({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ve.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?ae(fe):K({message:Ge({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ve.USERNAME:{let r=V().gitName,o=r?[r]:[],s=t.trim(),i=o.filter(p=>p.startsWith(s)),d=i.length===1&&i[0]===s?"":Ge({prefix:"name: ",wordList:o,inputString:s,minLengthForHints:0});return s?d?ae(`${d} ${Ne(fe)}`,o,!1):ae(fe,o):K({message:d||We("Enter a user name. Saved in ")+ug.bgBlack("~/.epiq-global/config.json"),completionWordList:o})}case ve.EMAILS:{let r=V().gitEmail,o=Io(),s=o.length>0||!r?o:[r],i=[...s,"none"],l=t.trim(),d=(x,b)=>K({message:Ge({prefix:x,wordList:i,noOfHints:3,inputString:b,minLengthForHints:0}),completionWordList:i});if(!l)return ae(`${fe} to see your addresses, or name one`,i);let p=l.split(/[,\s]+/).filter(Boolean),m=p[p.length-1]??"",f=x=>x==="none"||s.includes(x.toLowerCase()),g=x=>i.some(b=>b.startsWith(x.toLowerCase())),v=p.filter(x=>!f(x)&&!g(x));return v.length>0?K({message:We(`no address here matches ${v.join(", ")} \u2014 pick one from the list, or its number`),completionWordList:i}):f(m)?ae(fe):d("",m)}case ve.EMAILS_UNCLAIM:{let r=vS(),o=t.trim();return r.length===0?K({message:We("you have not claimed any addresses"),completionWordList:[]}):o&&r.includes(o.toLowerCase())?ae(fe):K({message:Ge({prefix:"give an address back ",wordList:r,noOfHints:3,inputString:o,minLengthForHints:0}),completionWordList:r})}case ve.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?ae(fe):K({message:Ge({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case ve.AUTOSYNC:{let r=["on","off"],o=V().autoSync;if(!r.includes(t.trim())){let s=Vf(o);return K({message:Ge({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return ae(fe)}case ve.ATTACHMENT_MAX_KB:{let r=V().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<ws||o>Ms){let s=Ge({prefix:" examples: ",wordList:Jc,minLengthForHints:0,inputString:t});return K({message:We(`provide a size cap in KB (${ws}-${Ms}). current: ${r??En} KB.`)+s,completionWordList:Jc})}return ae(fe)}case ve.SYNC_DEBOUNCE_MS:{let r=V().autoSyncIntervalMs,o=Lf(t);if(!t.trim()||o===null||o<yo){let s=Ge({prefix:" examples: ",wordList:Xc,minLengthForHints:0,inputString:t});return K({message:We(`provide duration above ${yo}ms. current duration: ${r}ms.`)+s,completionWordList:Xc})}return ae(fe)}default:return K({message:We("Unknown config option"),completionWordList:n})}},ES=({modifier:e,inputString:t})=>{let n=_e(C.EDIT);if(!n.length)return K({message:We("Command not available in this context")});if(!n.includes(e)){let r=Ge({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return K({message:r||We("Unknown edit option"),completionWordList:n})}switch(e){case Lt.COMMENT:return t.trim()?ae(fe):K({message:Ne("write a comment...")});case Lt.TITLE:return ae(fe);case Lt.DESCRIPTION:{let{preferredEditor:r}=V();return r?ae(Ne("<ENTER> to edit in ")+r):K({message:"No editor selected"})}default:return K({message:We("Unknown edit option"),completionWordList:n})}},SS=({modifier:e})=>{let t=_e(C.YANK);return t.length?t.includes(e)?ae(fe+Ne(" and copy to clipboard")):K({message:Ge({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):K({message:We("Nothing selected to copy from")})},RS={[C.EXPORT]:()=>ae(fe+Ne(", and create export markdown file")),[C.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return ae(fe);let n={message:Ne("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=Or(r);if(!r||!o)return K(n);let s=dg(o,"peek");return s||ae(fe)},[C.REPLAY]:e=>{let{dateInput:t,durationInput:n}=va(e.modifier,e.inputString),r={message:Ne("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=Or(t);if(!t||!o)return K(r);let s=dg(o,"replay");return s||(n&&ya(n)===null?K({message:We("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):ae("<ENTER> to replay board history",n?Qf:[]))},[C.EXIT]:()=>ae(fe+Ne(" and exit the application")),[C.INIT]:()=>ae(fe),[C.OPEN]:xS,[C.PALETTE]:()=>ae(fe),[C.FILTER]:e=>{if(e.modifier==="clear")return ae(fe);let t=s=>_e(C.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return K({message:Ge({wordList:_e(C.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:_e(C.FILTER)});let n=Object.values(y().tags).map(s=>s.name),r=Object.values(y().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:Ge({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):ae():K({message:Ge({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[C.NONE]:e=>{let t=_e(C.NONE);return K({message:Ge({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[C.NEW]:e=>bS({list:_e(C.NEW),hint:Ge({wordList:_e(C.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[C.HELP]:()=>ae(fe),[C.EDIT]:ES,[C.COMMENT]:e=>{let t=Eo({hint:Ne(`write a comment (max ${4e3} char)...`),onOk:Ne(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===Sn.Invalid?t:e.inputString.length>4e3?ae(We("max input exceeded")):t},[C.CONFIG]:IS,[C.YANK]:SS,[C.DELETE]:e=>{let t=cg();return t.validity==="invalid"?t:ed(e)},[C.CLOSE_ISSUE]:e=>ed(e),[C.RE_OPEN_ISSUE]:e=>ed(e),[C.MOVE]:e=>{let t=cg();return t.validity==="invalid"?t:Eo({hint:Ge({prefix:"hey hacker! These commands are blocked for you... ",wordList:_e(C.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[C.TAG]:e=>{let n=N.getExistingTags().slice(0,10).map(xa).join("");return Eo({hint:n.length?Ne("create tag or reuse:")+n+Ne(""):Ne("create tag ...")})(e)},[C.UNTAG]:e=>{let t=ga();if(a(t))return K({message:We("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(xa).slice(0,10);return n.length?Eo({hint:Ne(" ... ")+n.join("")})(e):K({message:We("Issue has no tags"),completionWordList:[]})},[C.ASSIGN]:e=>{let t=N.getExistingAssignees().map(xa).slice(0,10);return Eo({hint:Ne("assignees... ")+t.join("")})(e)},[C.UNASSIGN]:e=>{let t=ha();if(a(t))return K({message:We("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(xa).slice(0,10);return n.length?Eo({hint:Ne("remove assignee... ")+n.join("")})(e):K({message:We("Issue has no assignees"),completionWordList:[]})},[C.SYNC]:()=>ae(fe)},mg=Object.fromEntries(Object.entries(RS).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Ia=["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 CS=3,NS=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"]),AS=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},TS=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=CS&&!NS.has(t)&&!/^\d+$/.test(t)),wS=e=>{let t=new Map;for(let s of AS(e))for(let i of TS(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=Ia.filter(s=>!r.has(s));return[...n,...o]},pg=Ia,fg=-1,gg=()=>{let e=Ie();if(a(e))return Ia;let t=e.value,n=t.eventLog.length;return n!==fg&&(pg=wS(t),fg=n),pg};var hg=e=>Object.values(C).includes(e),yg=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:l,completionWordList:d}=mg[n].validate(n,r,s),p=n!==C.PEEK&&n!==C.REPLAY,m=o==="command"||o==="modifier"?_e(n):p?gg():[],{mode:f}=y(),g=f===I.COMMAND_LINE?i??"":"",v=[...d,...m];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?rp(e,v,d):{hint:"",hints:[],remainder:"",overlap:0}}};var vg=e=>{let t=e.trimStart(),n=PS(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=LS(e),l=hg(r)?r:null,d=l!==null,p=r!=="",m=l?_e(l)??[]:[],f=l&&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 v=s?"":i,x=MS(t,l,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:p,command:l,isCommandKeyword:d,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:v,inputString:x}},MS=(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},PS=e=>e.trim()?e.trim().split(/\s+/):[],LS=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as kS}from"react";var Ro=e=>e===td||e===":",td=" ",Ps=40,ut={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Sn.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},nd=new Set,bg=()=>{for(let e of nd)e()},rd=e=>(nd.add(e),()=>nd.delete(e)),en=e=>{let n=e(ut),r=vg(n.value),o=n.cursorPosition===n.value.length;ut={...n,commandMeta:yg(r,o)},bg()},Ls=({message:e,status:t})=>{let n=structuredClone(ut);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,ut=n,bg(),u(e,null)},od=e=>{en(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},sd=e=>{en(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Ro(n[o-1]);)o--;for(;o>0&&!Ro(n[o-1]);)o--}else{for(;o<n.length&&!Ro(n[o]);)o++;for(;o<n.length&&Ro(n[o]);)o++}return{...t,cursorPosition:o}})},xg=()=>{en(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}})},Ig=()=>{en(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Ro(t[r-1]);)r--;for(;r>0&&!Ro(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},Ea=e=>{en(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,l=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:l,commandIsPending:!1}})},Eg=()=>{en(e=>({...e,commandIsPending:!0}))},Z=e=>{en(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Sg=({addToHistory:e=!0,line:t})=>{en(n=>{let r=t??n.value;return{...n,commandHistory:e&&r.trim()?[r,...n.commandHistory].slice(0,Ps):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}})},Rg=e=>{en(t=>({...t,commandHistory:e.slice(0,Ps),commandHistoryIndex:-1}))},Cg=()=>{en(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}})},Ng=()=>{en(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ie=()=>ut,Ag=()=>kS(rd,ie,ie),Sa=()=>{let[e,...t]=ut.value.split(td);return t.join(td).trim()};var E={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"},DS=e=>e.shift===!0,BS={[E.NavPreviousItem]:E.NavPreviousItemJump,[E.NavNextItem]:E.NavNextItemJump,[E.MovePreviousItem]:E.MovePreviousItemJump,[E.MoveNextItem]:E.MoveNextItemJump};function OS(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function FS(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function _S(e,t,n){let r=y().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 Tg(e,t){let n=ie();if(e.sequence==="?"&&t!==I.PALETTE)return E.InitCommandPalette;if(e.sequence===":"&&t!==I.COMMAND_LINE)return E.InitCommandLine;if(t===I.MOVE)switch(e.name){case"m":case"return":return E.ConfirmMove}if(t===I.COMMAND_LINE)return qm(e,n.value);if(t===I.PALETTE)return Ym(e,n.value);let r=OS(e)||FS(e);if(r)return jS(r,t,DS(e));if(e.ctrl&&e.name==="c")return E.Exit;switch(e.name){case"r":return E.EditTitle;case"e":return E.EditDescription;case"n":return E.AddItem;case"m":return E.InitMove;case"d":return E.Delete;case"y":return E.Yank;case"o":return E.OpenInEditor;case"s":return E.MarkDiffLine;case"c":return E.CommentOnDiffLine;case"return":return E.Confirm;case"space":return E.Confirm;case"v":return V().viewMode==="wide"?E.SetViewDense:E.SetViewWide;case"q":case"escape":return E.Exit;default:return null}}function jS(e,t,n=!1){let r=t===I.MOVE?{prevItem:E.MovePreviousItem,nextItem:E.MoveNextItem,prevContainer:E.MoveToPreviousContainer,nextContainer:E.MoveToNextContainer}:{prevItem:E.NavPreviousItem,nextItem:E.NavNextItem,prevContainer:E.NavToPreviousContainer,nextContainer:E.NavToNextContainer},o=_S(y().contextNode.childRenderAxis,e,r);return!o||!n?o:BS[o]??o}var Ra=e=>{let{context:t}=y().contextNode;if(!t)return G.None;switch(e){case C.EXIT:return G.Exit;case C.EXPORT:return G.Export;case C.INIT:return G.Init;case C.OPEN:return G.OpenProject;case C.DELETE:return G.Delete;case C.EDIT:return G.Edit;case C.COMMENT:return G.Comment;case C.HELP:return G.ViewHelp;case C.RE_OPEN_ISSUE:return G.ReopenIssue;case C.CLOSE_ISSUE:return G.CloseIssue;case C.TAG:return G.TagTicket;case C.UNTAG:return G.UntagTicket;case C.ASSIGN:return G.AssignUserToTicket;case C.UNASSIGN:return G.UnassignUserFromTicket;case C.NEW:return G.NewItem;case C.FILTER:return G.Filter;case C.MOVE:return G.Move;case C.PEEK:return G.Peek;case C.REPLAY:return G.Replay;case C.CONFIG:return G.Config;case C.YANK:return G.Yank;case C.SYNC:return G.Sync;default:return G.None}},G={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 Uh from"node:fs";import TC from"node:path";import wC from"react";import{Box as NC}from"ink";import $a from"react";import rR from"chalk";import{Box as ld,Text as oR}from"ink";import Rn from"react";import{Text as wg}from"ink";import Mg,{useEffect as Pg,useState as $S}from"react";var Lg={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "],identity:["\u276F "]},St=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=re(),r=Lg[n]??Lg.default,[o,s]=$S(0);if(Pg(()=>{s(0)},[r]),Pg(()=>{if(!e)return;let l=setInterval(()=>{s(d=>(d+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return Mg.createElement(wg,null,t);let i=r[o]??r[0]??t;return Mg.createElement(wg,{color:h.accent,dimColor:o===1},i)};import{Box as id,Text as US}from"ink";import Ca from"react";var HS=(e,t,n,r)=>{let o=d=>Math.max(1,e[d]??1),s=n,i=n+1,l=o(n);for(;i<t&&l+o(i)<=r;)l+=o(i),i++;for(;s>0&&l+o(s-1)<=r;)s--,l+=o(s);return{start:s,end:i}},mt=({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)),l=Math.max(1,Math.ceil(r)),d=Math.max(0,Math.min(n,e.length-1)),p=Math.max(1,Math.floor(i/l)),m=Math.max(0,e.length-p),{start:f,end:g}=o?HS(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},v=Math.max(1,g-f),x=e.slice(f,g),b=e.length>v,R=i,S=b?Math.max(1,Math.floor(v/e.length*R)):R,A=Math.max(0,R-S),T=Math.max(1,e.length-v),P=b?Math.floor(f/T*A):0;return Ca.createElement(id,{flexDirection:"row",height:i,width:"100%"},Ca.createElement(id,{flexDirection:"column",flexGrow:1,height:i},x),Ca.createElement(id,{flexDirection:"column",width:1,height:R},Array.from({length:R}).map((M,O)=>Ca.createElement(US,{key:O,color:b&&O>=P&&O<P+S?h.accent:h.secondary},b?"\u2502":" "))))};import{Box as Ao,Text as To}from"ink";import Rt from"react";var kg,ad,WS=()=>{let{eventLog:e=[]}=y();if(ad&&kg===e)return ad;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return kg=e,ad=t,t},Na=e=>WS().has(e);import{Text as GS}from"ink";import VS from"react";var cr=({id:e,isSelected:t,maxWidth:n})=>{let r=N.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:Bn(o,n);return VS.createElement(GS,{underline:t,color:ze(o)},"@"+s,Na(e)?"":"\u2197")};import{Text as zS}from"ink";import KS from"react";var Co=({id:e,isSelected:t,maxWidth:n})=>{let r=N.getTag(e);if(!r)return;let o=n===void 0?r.name:Bn(r.name,n);return KS.createElement(zS,{underline:t,backgroundColor:ze(r.name),color:h.secondary}," "+o+" ")};import{useEffect as qS,useState as YS}from"react";var XS=80,Dg=1400,Aa=new Set,ks=null,JS=e=>(Aa.add(e),ks||(ks=setInterval(()=>{for(let t of Aa)t()},XS)),()=>{Aa.delete(e),Aa.size===0&&ks&&(clearInterval(ks),ks=null)}),QS=()=>{let e=Date.now()%Dg/Dg;return e<.5?e*2:(1-e)*2},No=e=>{let[,t]=YS(0);return qS(()=>{if(e)return JS(()=>t(n=>n+1))},[e]),Di(QS())};var ZS=(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),Bn(e.slice(o).trim(),n)]},Bg=3,eR=2,tR=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let i=e.length-o-1,l=i>0?String(i).length+1:0;if(r+s.width+l>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},Og=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=No(r),s=e-4,i=s-7-1,[l,d]=ZS(Re(t.title),i,s),p=d?null:Bn(Re(t.props.description),s)||null,m=xn(t),f=In(t).map(S=>({...S,name:S.name})),g=Math.max(1,s-Bg),v=N.getCommentsByIssue(t.id),x=v.length?String(v.length).length+2+1:0,{shown:b,hidden:R}=tR([...m.map(S=>({id:S.id,isTag:!0,width:Math.min(S.name.length,g)+Bg})),...f.map(S=>({id:S.id,isTag:!1,width:Math.min(S.name.length,g)+eR+(Na(S.id)?0:1)}))],s-x);return Rt.createElement(Ao,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?h.accent:h.secondary,justifyContent:"space-between"},Rt.createElement(Ao,{paddingLeft:1,paddingRight:1,flexDirection:"column"},Rt.createElement(Ao,{justifyContent:"space-between"},Rt.createElement(To,{color:h.primary},l),Rt.createElement(To,{color:h.secondary2,dimColor:!0},H(t.id))),d&&Rt.createElement(To,{color:h.primary},d),p&&Rt.createElement(To,{color:h.secondary2,dimColor:!0},p)),Rt.createElement(Ao,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},Rt.createElement(Ao,{flexDirection:"row"},b.map(S=>Rt.createElement(Ao,{paddingRight:1,key:S.id},S.isTag?Rt.createElement(Co,{id:S.id,maxWidth:g}):Rt.createElement(cr,{id:S.id,maxWidth:g}))),R>0&&Rt.createElement(To,{color:h.secondary2,dimColor:!0},"+",R)),v.length>0&&Rt.createElement(To,{color:h.accent},"[",v.length,"]")))};import{Box as jr,Text as Ds}from"ink";import kt from"react";var nR=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Fg=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:i})=>{let l=No(s),d=(r.props.tags??[]).map(M=>N.getTag(M)).filter(M=>!!M),p=(r.props.assignees??[]).map(M=>N.getContributor(M)).map(M=>M&&{...M,name:M.name}).filter(M=>!!M),m=1,f=d.length*(1+m),g=p.length*(2+m),v=d.map(M=>kt.createElement(jr,{key:M.id,paddingRight:m},kt.createElement(Ds,{color:ze(M.name)},"\u25A0"))),x=p.map(M=>kt.createElement(jr,{key:M.id,paddingRight:m},kt.createElement(Ds,{color:dc(M.name)},"@"+M.name.at(0)))),b=s?l:o?h.accent:i===I.MOVE?h.secondary:h.primary,R=N.getCommentsByIssue(r.id),S=R.length?String(R.length).length+2+m:0,A=R.length?kt.createElement(jr,{paddingRight:m},kt.createElement(Ds,{color:h.accent},"[",R.length,"]")):null,T=f+g+S,P=Math.max(1,n-t-T-(T>0?1:0));return kt.createElement(jr,{justifyContent:"space-between"},kt.createElement(jr,null,kt.createElement(jr,{width:t},o?kt.createElement(St,{isSelected:!0}):kt.createElement(Ds,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),kt.createElement(Ds,{wrap:"truncate",color:b},nR(r.title,P))),kt.createElement(jr,null,v,x,A))};var sR=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:i,mode:l})=>{let{renderedChildrenIndex:d,replay:p}=re(),m=d[e.id]??[],f=p?new Set(p.flashNodeIds):null,g=f?.has(e.id)??!1,v=No(g),x=`${e.title} ${rR.hex(h.secondary2).dim("("+m.length+")")}`,b=3,R=o?1:5,S=s&&i===-1,A=n-3-(o?1:0)-(S?2:0),T=Math.max(2,String(m.length).length+1),P=r-b-1,M=Rn.createElement(ld,{borderStyle:"round",borderColor:h.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},Rn.createElement(St,{isSelected:t}),Rn.createElement(oR,{bold:!0,color:g?v:t?h.accent:h.primary},x," ",e.readonly?"\u{1F512}":"")),O=(W,J)=>{let Ee=s&&i===J;if(!_(W))return null;let F=f?.has(W.id)??!1;return o?Rn.createElement(Fg,{key:W.id,index:J,labelWidth:T,width:A,ticket:W,isSelected:Ee,isFlashing:F,mode:l}):Rn.createElement(Og,{key:W.id,width:A,ticket:W,isSelected:Ee,isFlashing:F})};return Rn.createElement(ld,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?h.accent:h.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},M,Rn.createElement(ld,null,m.length>0&&Rn.createElement(mt,{selectedIndex:i,height:P,itemHeight:R},m.map(O)),S&&Rn.createElement(St,{isSelected:!0})))},_g=Rn.memo(sR);import{Box as Oo,Text as xC}from"ink";import Ct,{useMemo as Fo}from"react";var jg=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},$g=(e,t,n)=>Ce.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});var Ug=e=>e.action==="add.issue.comment";import{Box as wo,Text as Wn}from"ink";import pt,{useEffect as iR,useMemo as aR,useRef as lR}from"react";import{decodeTime as Hg}from"ulid";var ur=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"},Ta=e=>String(e).padStart(2,"0"),wa=e=>`${e.getFullYear()}-${Ta(e.getMonth()+1)}-${Ta(e.getDate())} ${Ta(e.getHours())}:${Ta(e.getMinutes())}`;var cR=e=>Pe(e,"attachments"),dR=e=>N.getAttachmentsByIssue(e.id).sort((t,n)=>Hg(t.id)-Hg(n.id)),Wg=e=>{for(let t of e)N.deleteNode(t.id)},uR=(e,t,n)=>Ce.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),mR=(e,t)=>{let n=N.getNode(cR(e.id));if(!n||!lt(n))return[];let r=t.map((o,s)=>uR(o,s,n.id)).map(o=>N.createNode(o)).filter(be).map(({value:o})=>o).filter(lt);return t.length>0&&y().selectedIndex<0&&$.navigate({contextNode:n,selectedIndex:0}),r},pR=e=>`${Math.max(1,Math.round(e/1024))} KB`;function Gg({ticket:e,width:t,height:n}){let r=aR(()=>dR(e),[e]),o=lR([]);iR(()=>(Wg(o.current),o.current=mR(e,r),()=>{Wg(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=re(),l=Math.max(1,n-4),d=Math.max(12,t-32);return r.length===0?pt.createElement(wo,{flexDirection:"column",width:t,height:n,padding:1},pt.createElement(Wn,{color:h.primary},"No attachments yet."),pt.createElement(wo,{paddingTop:1},pt.createElement(Wn,{color:h.primary},"Attach images from the browser GUI"),pt.createElement(Wn,{color:h.accent}," epiq gui "),pt.createElement(Wn,{color:h.primary},"by dropping or pasting them."))):pt.createElement(wo,{flexDirection:"column",width:t,height:n},pt.createElement(wo,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:h.secondary,borderStyle:"single",paddingBottom:1},pt.createElement(Wn,{color:h.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),pt.createElement(mt,{height:l,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 pt.createElement(wo,{key:p.id,flexDirection:"row",paddingX:1,paddingBottom:1},pt.createElement(Wn,{color:h.accent},f?"\u276F ":" "),pt.createElement(wo,{paddingLeft:1},pt.createElement(Wn,{color:h.secondary2},`#${m+1} `),pt.createElement(Wn,{color:f?h.accent:h.primary},g),pt.createElement(Wn,{color:h.secondary2}," "+pR(p.bytes)+" "+ur(Oe(p.id)))))})))}import{Box as mr,Text as pr}from"ink";import Ye,{useEffect as ER,useMemo as oh,useRef as SR}from"react";import{decodeTime as sh}from"ulid";var zg=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,cd=e=>e.replace(zg,""),fR=e=>`<!-- epiq-diff-comment:${JSON.stringify(e).replaceAll(">","\\u003e")} -->`,Vg=e=>e==="additions"||e==="deletions",Bs=e=>{let t=zg.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"||!Vg(r.side)||!Vg(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var Kg=/```\n([\s\S]*?)\n?```\s*$/,qg=e=>Kg.exec(e)?.[1]??null,gR=/`[^`\n]+`[^\n]*\n?$/,Yg=e=>cd(e).replace(Kg,"").replace(gR,"").trim(),Xg=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})`},dd=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${Xg(e)}`;var hR=e=>{let t=e.split(`
|
|
69
|
+
`),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(`
|
|
70
|
+
`):e},Jg=({snippet:e,...t})=>{let n=t.note.trim();return[...n?[n,""]:[],fR({...t,note:n}),`\`${t.filePath}\` ${Xg(t)}`,"```",hR(e),"```"].join(`
|
|
71
|
+
`)};var yR=(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 l=i;for(;l.length>n;)s&&(o.push(s),s=""),o.push(l.slice(0,n)),l=l.slice(n);s?s.length+1+l.length<=n?s=`${s} ${l}`:(o.push(s),s=l):s=l}return s&&o.push(s),o},Os=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)},vR=/!\[([^\]]*)\]\([^)]*\)/g,bR=e=>e.replace(vR,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),xR=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),IR=4,Fs=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(IR)),ud=e=>{let t=!1;return e.map(Fs).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=Bs(n);if(r)return{kind:"caption",text:dd(r)};let o=bR(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:Os(s[1]??"")}:{kind:"text",spans:Os(o)}})},Zg=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],Qg=(e,t)=>{let n=[];for(let r of ud(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 Zg(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of yR(xR(r.spans),t))n.push({kind:r.kind,spans:Os(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},eh=(e,t)=>{let n=Bs(e),r=n?qg(e):null;if(!n||r===null)return Qg(cd(e).split(`
|
|
72
|
+
`),t);let o=Yg(e),s=r.split(`
|
|
73
|
+
`).map(Fs),i=n.side===n.endSide?n.start:void 0,l=i===void 0?0:String(i+s.length-1).length+3;return[...o?[...Qg(o.split(`
|
|
74
|
+
`),t),{kind:"blank"}]:[],{kind:"caption",text:dd(n)},...s.flatMap((d,p)=>Zg(d,Math.max(1,t-l)).map((m,f)=>({kind:"code",text:m,number:i===void 0||f>0?void 0:i+p})))]};import{Box as th,Text as $r}from"ink";import _t from"react";var nh=({spans:e,bold:t,wrap:n})=>_t.createElement($r,{color:h.primary,bold:t,wrap:n},e.map((r,o)=>r.code?_t.createElement($r,{key:o,color:h.yellow},r.text):_t.createElement($r,{key:o},r.text))),md=({line:e,width:t,gutter:n=0,wrap:r})=>{switch(e.kind){case"blank":return _t.createElement($r,null," ");case"fence":return _t.createElement($r,{color:h.secondary2},"```");case"caption":return _t.createElement($r,{color:h.accent,wrap:r},e.text);case"heading":return _t.createElement(nh,{spans:e.spans,bold:!0,wrap:r});case"text":return _t.createElement(nh,{spans:e.spans,wrap:r});case"code":{let o=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return _t.createElement($r,{backgroundColor:h.secondary,color:h.primary,wrap:r},o,e.text.padEnd(Math.max(0,t-o.length)))}}},rh=({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 _t.createElement(th,{flexDirection:"column"},e.map((o,s)=>_t.createElement(th,{key:s},_t.createElement(md,{line:o,width:t,gutter:r}))))};var RR=4,CR=e=>Pe(e,"comments"),NR=e=>N.getCommentsByIssue(e.id).sort((t,n)=>sh(t.id)-sh(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,md:t.md})),ih=e=>{for(let t of e)N.deleteNode(t.id)},AR=(e,t)=>{let n=N.getNode(CR(e.id));if(!n||!lt(n))return[];let r=t.map((o,s)=>$g(o,s,n.id)).map(N.createNode).filter(be).map(({value:o})=>o).filter(ms);return t.length>0&&y().selectedIndex<0&&$.navigate({contextNode:n,selectedIndex:0}),r};function ah({ticket:e,width:t,height:n}){let r=oh(()=>NR(e),[e]),o=SR([]);ER(()=>(ih(o.current),o.current=AR(e,r),()=>{ih(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=re(),l=Math.max(1,n-4),d=Math.max(20,t-8),p=oh(()=>r.map(f=>{let g=eh(f.md,d);return g.length>0?g:[{kind:"blank"}]}),[r,d]),m=p.map(f=>f.length+RR);return r.length===0?Ye.createElement(mr,{flexDirection:"column",width:t,height:n,padding:1},Ye.createElement(pr,{color:h.primary},"No comments yet."),Ye.createElement(mr,{paddingTop:1},Ye.createElement(pr,{color:h.primary},"Use"),Ye.createElement(pr,{color:h.accent}," :comment "),Ye.createElement(pr,{color:h.primary},"to add the first one."))):Ye.createElement(mr,{flexDirection:"column",width:t,height:n},Ye.createElement(mr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:h.secondary,borderStyle:"single",paddingBottom:1},Ye.createElement(pr,{color:h.secondary2},"Comments (",r.length,") ")),Ye.createElement(mt,{height:l,itemHeights:m,selectedIndex:s},r.map((f,g)=>{let v=g===s;return Ye.createElement(mr,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:h.secondary,borderStyle:"single"},Ye.createElement(mr,{flexDirection:"row",paddingBottom:1},Ye.createElement(pr,{color:h.accent},v?"\u276F ":" "),Ye.createElement(mr,{paddingLeft:1},Ye.createElement(pr,{color:h.secondary2},`#${g+1} `),Ye.createElement(cr,{id:f.authorId}),Ye.createElement(pr,{color:h.secondary2}," "+ur(Oe(f.id))))),Ye.createElement(mr,{paddingLeft:3,paddingBottom:1},Ye.createElement(rh,{lines:p[g]??[],width:d})))})))}import{Box as Hr,Text as Cn}from"ink";import Xe,{useEffect as Dh,useRef as dC,useState as uC}from"react";var tn=e=>{let t=me(e??process.cwd());return a(t)?c(t.message):u("Resolved Epiq repo root",t.value)},Mo=e=>/^[0-9a-f]{7,40}$/i.test(e);var Po="",lh="",ch=5e3,Lo=null;var ko=async(e={})=>{let t=tn(e.repoRoot);if(a(t))return c(t.message);let n=Tt(t.value);if(a(n))return c(n.message);let r=e.start===void 0&&e.end===void 0;if(r&&Lo&&Lo.repoRoot===t.value&&Lo.stateBranch===n.value.stateBranch&&Date.now()-Lo.fetchedAt<ch)return u("Computed commit timeline",Lo.result);let o=await U({cwd:t.value,args:["log","--branches","--not",n.value.stateBranch,...e.start!==void 0?[`--since=@${Math.floor(e.start/1e3)}`]:[],...e.end!==void 0?[`--until=@${Math.floor(e.end/1e3)}`]:[],"--shortstat",`--format=${lh}%H${Po}%at${Po}%an${Po}%ae${Po}%s`]});if(a(o))return c(o.message);let s=o.value.stdout.split(lh).filter(i=>i.trim().length>0).map(i=>{let[l,...d]=i.split(`
|
|
75
|
+
`),[p,m,f,g,...v]=(l??"").split(Po);if(!p||!m)return null;let x=d.join(" "),b=Number(/(\d+) insertion/.exec(x)?.[1]??0),R=Number(/(\d+) deletion/.exec(x)?.[1]??0);return{sha:p,time:Number(m)*1e3,author:f??"unknown",authorEmail:g??"",subject:v.join(Po),linesChanged:b+R,insertions:b,deletions:R}}).filter(i=>i!==null).filter(i=>(e.start===void 0||i.time>=e.start)&&(e.end===void 0||i.time<=e.end));return r&&(Lo={repoRoot:t.value,stateBranch:n.value.stateBranch,fetchedAt:Date.now(),result:s}),u("Computed commit timeline",s)},Gn=async e=>{let t=e.ref.trim();if(!t)return c("ref must not be empty");if(t.length!==7)return c(`"${t}" is ${t.length} characters; a ref is ${7}. Read it off the issue rather than slicing the id by hand.`);let n=await ko({repoRoot:e.repoRoot});if(a(n))return c(n.message);let r=`${t.toUpperCase()} `,o=l=>l.subject.toUpperCase().startsWith(r),s=n.value,i=[];for(let[l,d]of s.entries()){if(!o(d))continue;let p=s[l+1];i.push({...d,precedingSha:p&&o(p)?p.sha:null})}return u("Matched commits by ref",i)};var pd=async e=>{if(!Mo(e.sha))return c("Invalid commit sha");let t=tn(e.repoRoot);if(a(t))return c(t.message);let n=await U({cwd:t.value,args:["show","--no-ext-diff","--no-color","--patch","--find-renames","--format=",e.sha]});return a(n)?c(n.message):u("Read commit patch",n.value.stdout)},TR=200,dh=e=>/^0+$/.test(e),Ma=/^:\d{6} \d{6} ([0-9a-f]{40}) ([0-9a-f]{40}) [A-Z]\d*\t(.+)$/,uh=/^(\d+|-)\t(\d+|-)\t(.+)$/,ph=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 c(o.message);let s=o.value.stdout.split(`
|
|
76
|
+
`).filter(p=>p!==""),i=s.filter(p=>!Ma.test(p)&&!uh.test(p));if(i.length>0)return c(`Could not parse ${i.length} line(s) of "git diff --raw --numstat" output, e.g. "${i[0]}"`);let l=new Map;for(let p of s){let m=uh.exec(p);m&&l.set(m[3]??"",{insertions:m[1]==="-"?0:Number(m[1]),deletions:m[2]==="-"?0:Number(m[2])})}let d=s.filter(p=>Ma.test(p)).map(p=>{let m=Ma.exec(p),f=m?.[1]??"",g=m?.[2]??"",v=m?.[3]??"";return{path:v,beforeBlob:dh(f)?null:f,afterBlob:dh(g)?null:g,...l.get(v)??{insertions:0,deletions:0}}});return u("Listed changed files with blob hashes",d)},fh=async(e,t)=>{if(t.length>TR)return c(`${t.length} files changed \u2014 too many to show as a diff`);let n=t.flatMap(s=>[s.beforeBlob,s.afterBlob].filter(i=>i!==null)),r=await Ni(n,e);if(a(r))return c(r.message);let o=r.value;return u("Read changed file contents",t.map(s=>({path:s.path,before:s.beforeBlob?o.get(s.beforeBlob)??"":"",after:s.afterBlob?o.get(s.afterBlob)??"":"",insertions:s.insertions,deletions:s.deletions})))},fd=async e=>{if(!Mo(e.sha))return c("Invalid commit sha");let t=tn(e.repoRoot);if(a(t))return c(t.message);let n=t.value,r=await ph(n,`${e.sha}~1`,e.sha);if(a(r))return c(r.message);if(r.value.length===0)return c("No changed files found for this commit");let o=await fh(n,r.value);if(a(o))return c(o.message);let s=o.value;return u("Loaded commit diff",{sha:e.sha,files:s})},wR=/^[0-9a-f]{40}$/,MR=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 c(r.message);let o=new Map,s=null;for(let i of r.value.stdout.split(`
|
|
77
|
+
`)){if(wR.test(i)){s=new Set,o.set(i,s);continue}let l=Ma.exec(i);l&&s&&s.add(l[3]??"")}return u("Listed changed paths per commit",o)},mh=e=>{let t=new Set;for(let n of e)for(let r of n)t.add(r);return t},PR=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)},LR="4b825dc642cb6eb9a060e54bf8d69288fbee4904",kR=async(e,t)=>{let n=await U({cwd:e,args:["rev-parse","--verify","--quiet",`${t}^1`]});return a(n)?LR:`${t}~1`},gd=async e=>{let t=tn(e.repoRoot);if(a(t))return c(t.message);let n=t.value,r=await Gn({repoRoot:n,ref:e.ref});if(a(r))return c(r.message);let o=r.value;if(o.length===0)return c("No commits reference this ticket");let s=o[0].sha,i=s;for(let T=o.length-1;T>0;T--){let P=o[T].sha;if(await PR(n,P,s)){i=P;break}}let l=await kR(n,i),d=await MR(n,l,s);if(a(d))return c(d.message);let p=d.value,m=new Set(o.map(T=>T.sha)),f=[...p.keys()].filter(T=>m.has(T)),g=f.length===p.size,v=new Map;for(let T of f)for(let P of p.get(T)??[])v.has(P)||v.set(P,T);let x=(T,P)=>u("Loaded squashed diff",{ref:e.ref.trim().toUpperCase(),from:l,to:s,commits:f.length,files:T.map(M=>({...M,sha:v.get(M.path)??s})),contiguous:g,overlappingPaths:P}),b,R=[];if(!g){let T=mh(f.map(M=>p.get(M)??new Set)),P=mh([...p.entries()].filter(([M])=>!m.has(M)).map(([,M])=>M));if(T.size===0)return x([],[]);b=[...T],R=[...T].filter(M=>P.has(M)).sort()}let S=await ph(n,l,s,b);if(a(S))return c(S.message);let A=await fh(n,S.value);return a(A)?c(A.message):x(A.value,R)};var DR=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/,Pa=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+=`
|
|
78
|
+
`;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}},gh=e=>{let t=Pa(e.trim());return t==="/dev/null"?null:t.replace(/^[ab]\//,"")},yd=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(`
|
|
79
|
+
`)){if(i.startsWith("diff --git ")){n=s();let m=i.slice(11),f=m.lastIndexOf(" b/");f!==-1&&(n.path=Pa(m.slice(f+1)).replace(/^b\//,""));continue}if(!n){if(!i.trim())continue;n=s()}let l=n,d=l.lines.length===0;if(d&&i.startsWith("--- ")){let m=gh(i.slice(4));m&&(l.oldPath=m);continue}if(d&&i.startsWith("+++ ")){let m=gh(i.slice(4));m&&(l.path=m);continue}if(d&&i.startsWith("rename from ")){l.oldPath=Pa(i.slice(12));continue}if(d&&i.startsWith("rename to ")){l.path=Pa(i.slice(10));continue}if(d&&(i.startsWith("Binary files ")||i.startsWith("GIT binary patch"))){l.binary=!0,l.lines.push({kind:"note",text:"Binary file"});continue}let p=DR.exec(i);if(p){r=Number(p[1]),o=Number(p[3]),l.lines.push({kind:"hunk",text:i});continue}if(!d){if(i.startsWith("\\")){l.lines.push({kind:"note",text:i.slice(1).trim()});continue}if(i.startsWith("+")){l.added++,l.lines.push({kind:"added",text:i.slice(1),newLine:o++});continue}if(i.startsWith("-")){l.removed++,l.lines.push({kind:"removed",text:i.slice(1),oldLine:r++});continue}if(i.startsWith(" ")){l.lines.push({kind:"context",text:i.slice(1),oldLine:r++,newLine:o++});continue}i===""&&l.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!=="")},hd=e=>e.oldPath&&e.oldPath!==e.path?e.oldPath:null;var vd=e=>e.flatMap(t=>[{kind:"file",text:`${hd(t)?`${hd(t)} \u2192 `:""}${t.path}`,file:t},...t.lines]),La=e=>{let t="",n=-1;return e.map(r=>(r.kind==="file"&&(t=r.file.path),r.kind==="hunk"&&n++,{file:t,hunk:n}))},bd=(e,t,n)=>{let r=t.map(i=>Bs(i.md)).filter(i=>i!==null&&i.sha===n&&i.side==="additions");if(r.length===0)return new Set;let o=La(e),s=new Set;return e.forEach((i,l)=>{let d=i.newLine;if(d===void 0)return;let p=o[l]?.file;r.some(m=>m.filePath===p&&m.start<=d&&d<=m.end)&&s.add(l)}),s},hh=(e,t)=>e===t?`line:${e}`:`lines:${e}-${t}`,BR=/^lines?:(\d+)(?:-(\d+))?(?:\s+|$)/,yh=e=>{let t=BR.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)}},vh=(e,t)=>La(e)[t]?.file??null,bh=(e,t,n,r)=>{let o=La(e),s=d=>e.findIndex((p,m)=>o[m]?.file===t&&(p.kind==="added"||p.kind==="context")&&p.newLine===d),i=s(n),l=s(r);return i===-1||l===-1?{ok:!1,reason:`${t} has no line ${i===-1?n:r} on the new side`}:xd(e,i,l)},xd=(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 l=g=>(g.kind==="added"||g.kind==="context")&&g.newLine!==void 0;if(!l(s)||!l(i))return{ok:!1,reason:"Comments anchor to the new side: pick an added or unchanged line"};let d=La(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(l);return{ok:!0,value:{filePath:p.file,start:f[0].newLine,end:f[f.length-1].newLine,snippet:f.map(g=>g.text).join(`
|
|
80
|
+
`)}}};import{existsSync as Rd}from"node:fs";import{chmod as Cd}from"node:fs/promises";import Da from"node:path";import{spawn as OR,spawnSync as FR}from"node:child_process";import _R from"node:os";import xh from"node:path";import{ulid as jR}from"ulid";function Id(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 $R(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function ka(){let{preferredEditor:e}=V(),t=[e?$R(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Ed(e){let[t=""]=Id(e);return/(^|\/)code(-insiders)?$/.test(t)}function Ih(e,t){let[n="",...r]=Id(e);return{command:n,args:[...r,...t]}}function Eh(e,t){return Ih(e,Ed(e)?["--wait",t]:[t])}function UR(e,t,n,r="new"){return Ih(e,[r==="new"?"--new-window":"--reuse-window","--diff",t,n])}function Sh(e){let t=xh.join(_R.tmpdir(),"epiq");ot.mkDir(t);let n=xh.join(t,jR());ot.writeToFile(n,e??"");let r=ka();for(let o of r){let{command:s,args:i}=Eh(o,n);if(!s)continue;let l=FR(s,i,{stdio:"inherit"});if(!l.error&&l.status===0){let d=ot.readFile(n);if(d==null)return c("Unable to read edited file");let p=d.replace(/\r?\n$/,"");return u("Successfully edited",p)}}return c("Unable to open editor")}var HR=new Set(["vim","vi","nvim","nano","pico","ed"]);function WR(e){let[t=""]=Id(e),n=t.split("/").pop()??t;return HR.has(n)}var GR=600;function Rh({command:e,args:t},n){return new Promise(r=>{if(!e){r(c(`"${n}" is not a usable editor command`));return}let o=OR(e,t,{stdio:"ignore",detached:!0}),s=!1,i=d=>{s||(s=!0,clearTimeout(l),r(d))};o.on("error",d=>i(c(d.message))),o.on("exit",d=>{i(d===0?u("Opened editor",!0):c(`"${n}" exited with code ${d}`))});let l=setTimeout(()=>{o.unref(),i(u("Opened editor",!0))},GR)})}function VR(e,t){return WR(e)?Promise.resolve(c(`"${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}`)):Rh(Eh(e,t),e)}function Sd(e,t,n,r="new"){return Rh(UR(e,t,n,r),e)}async function Ch(e){let t=ka();if(t.length===0)return c("No editor configured (preferredEditor, VISUAL, or EDITOR)");let n=c("Unable to open editor");for(let r of t){let o=await VR(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 zR,existsSync as KR,lstatSync as qR,mkdirSync as YR}from"node:fs";import XR from"node:os";import JR from"node:path";var _s=(...e)=>{let t=JR.join(XR.tmpdir(),"epiq",...e);try{return KR(t)&&qR(t).isSymbolicLink()?c(`Refusing to write through a symlink at ${t}`):(YR(t,{recursive:!0,mode:448}),zR(t,448),u("Prepared private temp dir",t))}catch(n){return c(`Unable to prepare ${t}: ${n instanceof Error?n.message:String(n)}`)}};var QR=async(e,t)=>{let n=await U({cwd:e,args:["show",t]});if(a(n))return c(n.message);let r=_s("commit-diffs");if(a(r))return c(r.message);let o=Da.join(r.value,`${t}.diff`);return Rd(o)||(ot.writeToFile(o,n.value.stdout),await Cd(o,292)),Ch(o)},ZR=12,eC=800,Nh=async(e,t,n)=>{let r=await U({cwd:e,args:["show",`${t}:${n}`]});return a(r)?"":r.value.stdout},tC=async(e,t)=>{let n=await U({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(a(n))return c(n.message);let r=n.value.stdout.split(`
|
|
81
|
+
`).map(o=>o.trim()).filter(Boolean);return r.length===0?c("No changed files found for this commit"):u("Listed changed files",r)},nC=async(e,t,n)=>{let r=await tC(e,t);if(a(r))return c(r.message);let o=r.value;if(o.length>ZR)return c(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=_s("commit-diffs",t);if(a(s))return c(s.message);let i=s.value,l=await Promise.all(o.map(async(g,v)=>{let[x,b]=await Promise.all([Nh(e,`${t}~1`,g),Nh(e,t,g)]),R=Da.basename(g),S=Da.join(i,String(v),"before",R),A=Da.join(i,String(v),"after",R);return Rd(S)||(ot.writeToFile(S,x),await Cd(S,292)),Rd(A)||(ot.writeToFile(A,b),await Cd(A,292)),{beforePath:S,afterPath:A}})),[d,...p]=l;if(!d)return c("No changed files found for this commit");let m=await Sd(n,d.beforePath,d.afterPath,"new");if(a(m)||p.length===0)return m;await new Promise(g=>setTimeout(g,eC));let f=await Promise.all(p.map(({beforePath:g,afterPath:v})=>Sd(n,g,v,"reuse")));for(let g of f)a(g)&&logger.error(`Failed to open an additional diff tab for ${t}: ${g.message}`);return m},js=async e=>{if(!Mo(e.sha))return c("Invalid commit sha");let t=tn(e.repoRoot);if(a(t))return c(t.message);let n=t.value,r=ka()[0];if(r&&Ed(r)){let o=await nC(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 QR(n,e.sha)};import{Box as nn,Text as Vn}from"ink";import je,{useEffect as wd,useMemo as Mh,useRef as sC,useState as iC}from"react";var Ba=(e,t,n)=>{let r=[],o=Qi(()=>{for(let s=0;s<t;s++){let i=Pt(BigInt(s+1));if(!be(i))continue;let l=N.createNode(Ce.text({id:n(s),name:`Line ${s+1}`,parentNodeId:e,rank:i.value,readonly:!0,isVirtual:!0}));be(l)&&r.push(l.value)}});return a(o)&&logger.error(`Line nodes: ${o.message}`),r},Do=e=>{N.deleteNodes(e.map(t=>t.id))};import{useSyncExternalStore as rC}from"react";var Fa=null,Oa=null,Nd=new Set,Ah=()=>{for(let e of Nd)e()},Ad=e=>{Fa=e,Ah()},_a=()=>Fa,Th={mark:null},Ur=e=>{Oa=e,Th={mark:e},Ah()};var Td=e=>Oa&&Oa.sha===e?Oa.row:null,wh=()=>rC(e=>(Nd.add(e),()=>{Nd.delete(e)}),()=>Th),fr=()=>{let{contextNode:e}=y();return Fa&&Fa.sha===e.id?e.id:null};import aC from"string-width";var Md=(e,t)=>`${e}::patch::${t}`,lC=e=>{switch(e){case"added":return h.green;case"removed":return h.red;case"hunk":return h.accent;case"file":return h.primary;default:return h.secondary2}},Ph=(e,t)=>{let n=aC(e);return n>=t?e:e+"\xA0".repeat(t-n)},cC=e=>e==="added"?"+":e==="removed"?"-":" ",Lh=e=>e.kind==="file"||e.kind==="hunk"||e.kind==="note"||e.newLine===void 0?"":String(e.newLine);function kh({ticket:e,sha:t,subject:n,width:r,height:o}){let[s,i]=iC({state:"loading"});wd(()=>{let T=!0;return i({state:"loading"}),pd({sha:t}).then(P=>{T&&i(a(P)?{state:"failed",message:P.message}:{state:"loaded",rows:vd(yd(P.value))})}),()=>{T=!1}},[t]);let l=s.state==="loaded"?s.rows:null,d=l!==null&&l.length>4e3,p=sC([]);wd(()=>(Do(p.current),p.current=l&&!d?Ba(t,l.length,T=>Md(t,T)):[],()=>{Do(p.current),p.current=[]}),[t,l,d]),wd(()=>(Ad(l?{sha:t,rows:l}:null),Ur(null),()=>{Ad(null),Ur(null)}),[t,l]);let{selectedIndex:m}=re(),{mark:f}=wh(),g=Mh(()=>l?bd(l,N.getCommentsByIssue(e.id),t):new Set,[l,t,e]),v=f&&f.sha===t?f.row:null,x=T=>v!==null&&T>=Math.min(v,m)&&T<=Math.max(v,m),b=Mh(()=>l?Math.max(5,l.reduce((T,P)=>Math.max(T,Lh(P).length),0)+2):5,[l]),R=Math.max(1,o-4),S=Math.max(8,r-b-6);if(s.state!=="loaded")return je.createElement(nn,{flexDirection:"column",width:r,height:o,padding:1},je.createElement(Vn,{color:h.primary},s.state==="loading"?"Reading the diff\u2026":`Could not read the diff: ${s.message}`));let A=T=>je.createElement(nn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:h.secondary,borderStyle:"single",paddingBottom:1},je.createElement(Vn,{color:h.secondary2,wrap:"truncate-end"},On(`${t.slice(0,7)} ${n} \u2014 ${T}`,Math.max(8,r-6))));return s.rows.length===0?je.createElement(nn,{flexDirection:"column",width:r,height:o},A("no changes"),je.createElement(nn,{paddingX:1},je.createElement(Vn,{color:h.primary},"This commit changed no files."))):d?je.createElement(nn,{flexDirection:"column",width:r,height:o},A("too large to draw here"),je.createElement(nn,{paddingX:1,flexDirection:"column"},je.createElement(Vn,{color:h.primary},`${s.rows.length.toLocaleString()} lines of diff.`),je.createElement(Vn,{color:h.secondary2},"Press o to open it in your editor."))):je.createElement(nn,{flexDirection:"column",width:r,height:o},A(v===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"),je.createElement(mt,{scrollByOne:!0,height:R,selectedIndex:m,itemHeight:1},s.rows.map((T,P)=>{let M=P===m,O=lC(T.kind);if(T.kind==="file")return je.createElement(nn,{key:Md(t,P),paddingX:1},je.createElement(Vn,{backgroundColor:h.secondary,color:M?h.accent:O,bold:!0,wrap:"truncate-end"},Ph(` ${On(Fs(T.text),S)}`,S+b+1)));let W=x(P),J=`${cC(T.kind)}${On(Fs(T.text),S)}`;return je.createElement(nn,{key:Md(t,P),paddingX:1},je.createElement(nn,{flexShrink:0},je.createElement(Vn,{color:M||W?h.accent:h.secondary2,dimColor:!M&&!W,wrap:"truncate-end"},`${M?"\u276F":"\xA0"}${W?"\u258C":"\xA0"}${Lh(T).padStart(b-2,"\xA0")}`)),je.createElement(nn,{flexShrink:0},je.createElement(Vn,{color:h.yellow,wrap:"truncate-end"},g.has(P)?"\u2502":"\xA0")),je.createElement(Vn,{color:M?h.accent:O,backgroundColor:M||W?h.secondary:void 0,wrap:"truncate-end"},M||W?Ph(J,S+1):J))})))}var mC=e=>Pe(e,"diff"),Bh=e=>{for(let t of e)N.deleteNode(t.id)},pC=(e,t,n)=>Ce.field({id:e.sha,name:e.subject,parentNodeId:n,rank:String(t).padStart(6,"0"),childRenderAxis:"vertical",isVirtual:!0}),fC=(e,t)=>{let n=N.getNode(mC(e.id));if(!n||!lt(n))return[];let r=t.map((o,s)=>pC(o,s,n.id)).map(o=>N.createNode(o)).filter(be).map(({value:o})=>o).filter(lt);return t.length>0&&y().selectedIndex<0&&y().contextNode.id===n.id&&$.navigate({contextNode:n,selectedIndex:0}),r},gC=e=>`+${e.insertions} -${e.deletions}`;function Oh({ticket:e,width:t,height:n}){let[r,o]=uC({state:"loading"}),s=H(e.id);Dh(()=>{let x=!0;return o({state:"loading"}),Gn({ref:s}).then(b=>{x&&o(a(b)?{state:"failed",message:b.message}:{state:"loaded",commits:b.value})}),()=>{x=!1}},[s]);let i=dC([]),l=r.state==="loaded"?r.commits:null;Dh(()=>(Bh(i.current),i.current=l?fC(e,l):[],()=>{Bh(i.current),i.current=[]}),[e,l]);let{selectedIndex:d,contextNode:p}=re(),m=l?.find(x=>x.sha===p.id)??null,g=Math.max(1,n-4),v=Math.max(12,t-34);return r.state!=="loaded"?Xe.createElement(Hr,{flexDirection:"column",width:t,height:n,padding:1},Xe.createElement(Cn,{color:h.primary},r.state==="loading"?"Reading commits\u2026":`Could not read commits: ${r.message}`)):m?Xe.createElement(kh,{ticket:e,sha:m.sha,subject:m.subject,width:t,height:n}):r.commits.length===0?Xe.createElement(Hr,{flexDirection:"column",width:t,height:n,padding:1},Xe.createElement(Cn,{color:h.primary},"No commits reference this ticket."),Xe.createElement(Hr,{paddingTop:1},Xe.createElement(Cn,{color:h.primary},"Commits are matched by the"),Xe.createElement(Cn,{color:h.accent},` ${s} `),Xe.createElement(Cn,{color:h.primary},"prefix on their subject line."))):Xe.createElement(Hr,{flexDirection:"column",width:t,height:n},Xe.createElement(Hr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:h.secondary,borderStyle:"single",paddingBottom:1},Xe.createElement(Cn,{color:h.secondary2},`Diff (${r.commits.length}) \u2014 enter to read, o to open in your editor `)),Xe.createElement(mt,{height:g,itemHeight:2,selectedIndex:d},r.commits.map((x,b)=>{let R=b===d,S=x.subject.length>v?x.subject.slice(0,v-1)+"\u2026":x.subject;return Xe.createElement(Hr,{key:x.sha,flexDirection:"row",paddingX:1,paddingBottom:1},Xe.createElement(Cn,{color:h.accent},R?"\u276F ":" "),Xe.createElement(Hr,{paddingLeft:1},Xe.createElement(Cn,{color:h.secondary2},`${x.sha.slice(0,7)} `),Xe.createElement(Cn,{color:R?h.accent:h.primary},S),Xe.createElement(Cn,{color:h.secondary2},` ${gC(x)} ${ur(x.time)}`)))})))}import{Box as ja,Text as hC}from"ink";import zn from"react";var Fh=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=re(),{title:o}=t,s=t.parentNodeId?N.getNode(t.parentNodeId):void 0,i=s&&_(s)?o===Te.ASSIGNEES?s.props.assignees??[]:o===Te.TAGS?(s.props.tags??[]).filter(l=>N.getTag(l)):[]:[];return zn.createElement(ja,{alignItems:"center",paddingTop:1},zn.createElement(ja,{minWidth:12},zn.createElement(St,{isSelected:n}),zn.createElement(hC,{color:n?h.accent:h.secondary2},o,":")),zn.createElement(ja,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((l,d)=>{let p=r.id===t.id&&d===e;return zn.createElement(ja,{key:`${o}-${l}`,paddingRight:2,minHeight:1},zn.createElement(St,{isSelected:p}),o===Te.ASSIGNEES?zn.createElement(cr,{isSelected:p,id:l}):o===Te.TAGS?zn.createElement(Co,{isSelected:p,id:l}):null)})))};import{Box as Bo,Text as kd}from"ink";import jt,{useEffect as yC,useMemo as Dd,useRef as vC}from"react";var Pd=e=>Math.max(5,String(Math.max(e,1)).length+3),_h=(e,t)=>Math.max(0,e-6-Pd(t));var Ld=(e,t=0,n=0)=>Math.max(1,e-5-2*t-(n>0?1+n:0));var bC="\u2029",jh=(e,t)=>`${e}::inline-line::${t}`,Bd=({id:e,label:t,text:n,rows:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:l}=re(),d=Dd(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),p=Dd(()=>d.join("\0"),[d]),m=vC([]);yC(()=>(Do(m.current),m.current=Ba(e,d.length,b=>jh(e,b)),()=>{Do(m.current),m.current=[]}),[e,p]);let f=Pd(d.length),g=_h(s,d.length),x=Dd(()=>ud(d).map(b=>{if(b.kind==="code"||b.kind==="caption")return{...b,text:On(b.text,g)};if(b.kind==="text"||b.kind==="heading"){let R=b.spans.map(S=>S.code?`\`${S.text}\``:S.text).join("");return{...b,spans:Os(On(R,g))}}return b}),[d,g]).map((b,R)=>{let S=l.id===e&&i===R;return jt.createElement(Bo,{key:jh(e,R)},jt.createElement(Bo,{flexShrink:0},jt.createElement(kd,{color:S?h.primary:h.secondary2,dimColor:!S},`${R+1} `.padStart(f,"\xA0"))),b.kind==="blank"?jt.createElement(kd,{backgroundColor:S?"gray":void 0},bC):jt.createElement(Bo,null,jt.createElement(md,{line:b,width:b.kind==="code"?g:0,wrap:"truncate-end"})))});return jt.createElement(Bo,{flexDirection:"column",paddingTop:1},jt.createElement(Bo,null,jt.createElement(St,{isSelected:o}),jt.createElement(kd,{color:o?h.accent:h.secondary2},t)),jt.createElement(Bo,{flexDirection:"row",borderStyle:"round",borderColor:h.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},jt.createElement(mt,{scrollByOne:!0,height:r,selectedIndex:i,itemHeight:1},x)))};var IC=e=>Pe(e,"description"),EC=e=>Pe(e,"comments"),SC=e=>Pe(e,"history"),RC=e=>Pe(e,"diff"),CC=e=>Pe(e,"attachments"),$h=({ticket:e,height:t})=>{let n=Fo(()=>jg(e),[e]),{selectedIndex:r,contextNode:o}=re(),s=process.stdout.columns||120,i=Fo(()=>IC(e.id),[e.id]),l=Fo(()=>EC(e.id),[e.id]),d=Fo(()=>SC(e.id),[e.id]),p=Fo(()=>RC(e.id),[e.id]),m=Fo(()=>CC(e.id),[e.id]),f=N.getAttachmentsByIssue(e.id).length,g=o.id===e.id,v=o.id===l||o.parentNodeId===l,x=o.id===d||o.parentNodeId===d,b=o.id===m||o.parentNodeId===m,R=o.id===p||o.parentNodeId===p,S=ce(e.id);if(v){let X=t-3;return Ct.createElement(Oo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ct.createElement(ah,{ticket:e,width:s,height:X}))}if(b){let X=t-3;return Ct.createElement(Oo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ct.createElement(Gg,{ticket:e,width:s,height:X}))}if(R){let X=t-3;return Ct.createElement(Oo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ct.createElement(Oh,{ticket:e,width:s,height:X}))}if(x){let F=N.getNode(d),X=F&<(F)?F.props.value??"":"",rt=Ld(t);return Ct.createElement(Oo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},F?Ct.createElement(Bd,{id:F.id,label:"Event log",text:X,selected:!1,maxWidth:s,rows:rt}):null)}let A=[d,p,l,m],T=F=>A.includes(F),P=S.reduce((F,X)=>us(X)?F+1:F,0),M=S.reduce((F,X)=>T(X.id)?F+1:F,0),O=S.findIndex(F=>T(F.id)),W=Ld(t,P,M),J=(F,X,rt,Yn)=>Ct.createElement(Oo,{key:F.id,paddingTop:X===O?1:0},Ct.createElement(St,{isSelected:rt}),Ct.createElement(xC,{backgroundColor:h.secondary,color:rt?h.accent:h.primary},Yn)),Ee=(F,X,rt)=>F.id===i?Ct.createElement(Bd,{key:F.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:X,maxWidth:s,rows:W}):us(F)?Ct.createElement(Fh,{key:F.id,parent:F,selected:X,selectedIndex:r}):F.id===l?J(F,rt,X,` Comments (${n}) \u203A\u203A `):F.id===m?J(F,rt,X,` Attachments (${f}) \u203A\u203A `):F.id===d?J(F,rt,X," History \u203A\u203A "):F.id===p?J(F,rt,X," Diff \u203A\u203A "):null;return Ct.createElement(Oo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S.map((F,X)=>Ee(F,g&&r===X,X)))};var AC=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:i,width:l})=>{let d=t.context,p=d===se.TICKET||d===se.FIELD_LIST||d===se.FIELD,m=d===se.BOARD||d===se.SWIMLANE,f=d===se.TICKET?t:r.find(R=>R.context===se.TICKET),g=Math.floor(l/3),v=Math.floor(l/Math.max(e.length,1)),x=Math.min(v,g),b=s==="dense";return $a.createElement(NC,{flexDirection:"row",height:i},m&&e.map((R,S)=>{let A=t.id===R.id,T=A?n:-1,P=t.context===se.BOARD&&n===S;return $a.createElement(_g,{key:R.id,height:i,width:x,swimlane:R,isSelected:P,isDense:b,isFocused:A,listSelectedIndex:T,mode:o})}),p&&f&&$a.createElement($h,{height:i,ticket:f}))},Ua=$a.memo(AC);import{render as MC}from"ink";import{Writable as PC}from"node:stream";var $s=e=>String(e).padStart(2,"0"),LC=e=>{let t=e.getUTCFullYear(),n=$s(e.getUTCMonth()+1),r=$s(e.getUTCDate()),o=$s(e.getUTCHours()),s=$s(e.getUTCMinutes()),i=$s(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},kC=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",DC=async(e,{width:t,height:n})=>{let r="",o=new PC({write(i,l,d){let p=BC(i.toString()).trimEnd();p.trim().length>0&&p.includes("\u256D")&&(r=p),d()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=MC(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},BC=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Hh=async()=>{let{viewMode:e}=V(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=y(),i=r.find(S=>S.context==="BOARD");if(!i)return c("No board found to export");let l=120,d=40,p=await DC(wC.createElement(Ua,{height:d,width:l,swimlanes:(s[i.id]??[]).filter(S=>S!==void 0&&mn(S)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:l,height:d});if(!p)return c("Failed to render board export");let m=Ci(process.cwd());if(a(m))return c("Unable to export, epiq root not found");let f=new Date,g=LC(f),v=`board_${kC(i.title)}_${g}.md`,x=Tm(m.value);Uh.mkdirSync(x,{recursive:!0});let b=TC.join(x,v),R=`# Board - ${i.title}
|
|
69
82
|
Date: ${f.toISOString()}
|
|
70
83
|
|
|
71
84
|
\`\`\`text
|
|
72
|
-
${
|
|
85
|
+
${p}
|
|
73
86
|
\`\`\`
|
|
74
|
-
`;return
|
|
75
|
-
`).map(
|
|
87
|
+
`;return Uh.writeFileSync(b,R,"utf8"),u("Exported board layout",b)};import{useSyncExternalStore as GH}from"react";var Ha,OC=new Set,Wh=()=>{for(let e of OC)e()};var gr=()=>{if(!Ha)throw new Error("Ui state not initialized. Call initUiState() first.");return Ha};var Gh=(e={})=>(Ha=e,Wh(),u("UX state initialized",null)),FC=e=>{let t=gr();return Ha=e(t),Wh(),u("UX state updated",null)},hr=e=>FC(t=>({...t,...e}));import{ulid as Od}from"ulid";var Vh=async e=>{let{contextNode:t,selectedIndex:n}=y(),r=ce(t.id)[n];if(e.modifier===Lt.DESCRIPTION)return jC();if(r&&ms(r))return _C(e);if(e.modifier===Lt.TITLE){let o=pe();if(a(o))return c("Unable to resolve user ID");let s=r;if(!s)return c("Missing node");if(s.readonly)return c("Cannot rename readonly node");let i=e.inputString.trim();if(!i)return c("Provide a title");let l=await Se();return a(l)?l:B([{id:Od(),action:"edit.title",payload:{id:s.id,name:i},...D(o.value)}],l.value)}return c("Unknown edit command")},_C=async e=>{let t=pe();if(a(t))return c("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=y(),o=ce(n.id)[r];if(!o||!ms(o))return c("Select a comment first");if(o.readonly)return c("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return c("Unable to resolve comment issue");let i=y().nodes[s];if(!i||!_(i))return c("Unable to resolve comment issue");if(i.readonly)return c("Cannot edit readonly issue");let l=o.id.split(":").at(0)??"",d=N.getComment(l);if(!d||d.deleted)return c("Unable to resolve comment");if(d.issue!==i.id)return c("Comment does not belong to selected issue");if(d.authorId!==t.value.userId)return c("You can only edit your own comments"+d.authorId+"<->"+t.value.userId);let p=e.inputString.trim();if(!p)return c("Provide a comment");let m=await Se();if(a(m))return m;let f=m.value;return B([{id:Od(),action:"edit.issue.comment",payload:{id:d.id,issue:i.id,md:p},...D(t.value)}],f)},jC=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let t=await Se();if(a(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=y(),s=ht([...r,o],"TICKET");if(a(s))return c("Edit target must be an issue");let i=s.value;if(!_(i))return c("Edit target must be an issue");if(i.readonly)return c("Cannot edit readonly issue");let l=ce(i.id).find(f=>f.title===Te.DESCRIPTION);if(!l)return c("No target found");if(l.readonly)return c("Cannot edit readonly field");let d=i.props.description??"";if(typeof d!="string")return c("Selected field is not editable text");let p=Sh(d);if(a(p))return c("Failed to edit field");let m=p.value;return m===d?u("No changes made",null):B([{id:Od(),action:"edit.description",payload:{id:i.id,md:m},...D(e.value)}],n)};import UC from"node:fs";import _d from"node:path";import Fd from"node:fs";import $C from"node:path";var zh=async e=>{let t=$C.join(e,".gitignore"),n=Fd.existsSync(t)?Fd.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
|
|
88
|
+
`).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 l=["# [epiq]: local hydrated state is never committed",...s].join(`
|
|
76
89
|
`);return n=n.trimEnd()+`
|
|
77
90
|
|
|
78
91
|
${l}
|
|
79
|
-
`,
|
|
80
|
-
`).filter(n=>n.trim().length>0).map(n=>n.slice(3)))},
|
|
81
|
-
`));let c=et();if(d(c))return Ho(16,c.message);let{rootNodeId:m,nodes:p}=c.value,f=p[m];return f?(O.navigate({contextNode:f,selectedIndex:0}),N({hasProjectDefinition:!0,mode:b.DEFAULT}),u(s,null)):Ho(16,"Unable to resolve initialized root node")};import{ulid as LS}from"ulid";import{ulid as PS}from"ulid";var wf=null,jn=()=>structuredClone(wf),Wo=e=>{wf=e},Mf=()=>{let{contextNode:e,selectedIndex:t}=h(),r=ae(e.id)[t];return r?u("Resolved selected child",r):a("Target node not found")},ul=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ae(t).filter(o=>o.id!==e);return qs(r,n)},Pf=({id:e,parentId:t,position:n={at:"end"}})=>{let r=Z();if(d(r))return a("Unable to resolve user ID");let o=ul({parentId:t,id:e,position:n});return d(o)?o:u("Created pending move state",{id:PS(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Lf=e=>{Wo(e);let t=An(e,!0);return d(t)?t:u("Node moved successfully",t.value)};function ml(e){let t=Mf();if(d(t))return t;let{contextNode:n,nodes:r}=h();if(!n.parentNodeId)return a("Missing parent node id");let o=r[n.parentNodeId];if(!o)return a("Missing parent node");let s=ae(o.id),i=s.findIndex(({id:m})=>m===n.id);if(i<0)return a("Current node not found among siblings");let l=s[i+e];if(!l)return a("Missing sibling node");let c=Pf({id:t.value.id,parentId:l.id,position:{at:"end"}});return d(c)?c:Lf(c.value)}function pl(e){let t=Mf();if(d(t))return t;let{contextNode:n,selectedIndex:r}=h(),s=ae(n.id)[r+e];if(!s)return a("Missing sibling node");let i=Pf({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(i)?i:Lf(i.value)}var kf=()=>{let e=jn();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,r=h().nodes[n];if(!r)return a("Move parent not found");let o=ae(n).findIndex(s=>s.id===t);return o===-1?a("Moved node not found among rendered children"):(O.navigate({contextNode:r,selectedIndex:o}),u("Synchronized navigation to moved node",null))},Mi=(e,t="Moved preview")=>{if(d(e))return e;let n=kf();return d(n)?n:(N({mode:b.MOVE}),u(t,null))},Df=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=ee().commandMeta,{contextNode:n,selectedIndex:r}=h(),o=ae(n.id)[r];if(!o)return N({mode:b.DEFAULT}),a("No move target");if(t==="start"){if(o.readonly)return a("Target node is read-only");if(r===-1)return a("No item selected");if(!o.parentNodeId)return a("Target has no parent");let s=ae(o.parentNodeId),i=s.findIndex(({id:f})=>f===o.id);if(i===-1)return a("Target not found among siblings");let l=s[i-1],c=s[i+1],m=c!=null?{at:"before",sibling:c.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},p=ul({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(Wo({id:LS(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),N({mode:b.MOVE}),u("Move initialized",null))}if(t==="next")return Mi(pl(1));if(t==="previous")return Mi(pl(-1));if(t==="to-next")return Mi(ml(1));if(t==="to-previous")return Mi(ml(-1));if(t==="confirm"){let s=jn();if(!s)return a("No pending move to confirm");let i=await Gt();if(d(i))return i;let l=B([s],i.value);if(d(l))return l;let c=kf();return d(c)?c:(Wo(null),N({mode:b.DEFAULT}),u("Moved item",null))}return t==="cancel"?(Wo(null),N({mode:b.DEFAULT}),u("Cancelling move",null)):a("Invalid move modifier")};import{ulid as Li}from"ulid";import{monotonicFactory as kS,ulid as DS}from"ulid";var BS=kS(),Pi=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=BS();return u("Created issue events",[{id:DS(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var Bf=async(e,t)=>{let n=Z();if(d(n))return a("Unable to resolve user ID");let r=await Gt();if(d(r))return r;let o=r.value;if(!t.inputString)return a(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:l}=h(),c=m=>{let p=B([m],o);if(d(p))return p;let f=C.getNode(p.value[0].result.id);if(!f)return a("Created node not found");if(!f.parentNodeId)return p;let g=C.getNode(f.parentNodeId);return g?(O.navigate({contextNode:g,selectedIndex:C.getSiblings(f.parentNodeId).findIndex(({id:v})=>v===f.id)}),p):a("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=h(),p=C.getNode(m);if(!p)return a("Workspace not found");let f=Pn(p.id,n.value,o);return d(f)?f:c({id:Li(),action:"add.board",payload:{id:Li(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=Qe(s,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=Pn(m.value.id,n.value,o);return d(p)?p:c({id:Li(),action:"add.swimlane",payload:{id:Li(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=q(i.id)[l],p=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let w=Qe(s,"SWIMLANE");return d(w)?null:w.value})();if(!p)return a("Unable to add issue in this context");let f=Pn(p.id,n.value,o);if(d(f))return f;let g=Pi({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(d(g))return g;let v=g.value,x=B([...v],o);if(d(x))return x;if(!x.value[0])return a("Issue creation failed");let A=v.find(w=>w.action==="add.issue")?.payload.id;return A?(O.navigate({contextNode:p,selectedIndex:C.getSiblings(p.id).findIndex(({id:w})=>w===A)}),u("Issue created",null)):a("Unable to determine ticket id")}return u("Success",null)};import US from"node:os";import _f from"node:path";var FS=e=>e.some(t=>t.action==="init.workspace"),Ff=async(e,t)=>{let n=Ht(e);return d(n)?a(n.message):lo({cwd:t,branch:n.value})},OS=e=>{let t=xe(process.cwd());if(d(t))return!1;let n=ue({repoRoot:t.value});return!d(n)&&n.value===e},ki=async e=>{let t=ue({repoRoot:e});if(d(t))return Bt(3,t.message);let n=t.value,r=await rr({repoRoot:e,stateBranchRoot:n,stateBranchName:Ss().stateBranch});if(d(r))return Bt(3,r.message);let o=bt(n);if(d(o))return Bt(3,o.message);if(!FS(o.value.events)){let m=await Ff(e,n);if(d(m)&&logger.info(3,m.message),o=bt(n),d(o))return Bt(3,o.message)}let{events:s,unreadable:i}=o.value,l=Dt(s,i);if(d(l))return Bt(4,l.message);N({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let c=ii({root:e});return d(c)&&logger.info(c.message),u("Loaded project",void 0)},_S=async e=>{let t=ue({repoRoot:e});if(d(t))return a(t.message);let n=t.value,r=await Xn({repoRoot:n});if(d(r))return a(r.message);if(!r.value)return u("No remote to pull",void 0);let o=await ti({worktreeRoot:n,operation:"boot pull",fn:()=>Rd(n,()=>(Ar("Pulling"),Ff(e,n)))});if(d(o))return Te(o.message);if(o.value===null)return u("Another process holds the state worktree",void 0);let s=o.value;if(d(s))return ao(s.message)?(Qs("Offline"),u("Offline",void 0)):Te(s.message);if(!s.value)return nr("Already synced"),u("Already synced",void 0);if(!OS(n))return u("Project changed during the pull",void 0);let i=Nd(n);return d(i)?i:(nr("Pulled"),u("Pulled and reloaded",void 0))},Di=e=>{_S(e).then(t=>{d(t)&&logger.info(3,t.message)}).catch(t=>{logger.error(`[boot] pull failed: ${Tr(t)}`)})},Of=()=>{let e=Dt([]);return d(e)?Bt(4,e.message):(N({hasProjectDefinition:!1,hasInitializingEvents:!1}),u("Booted without a project",void 0))};var jS=e=>e==="~"||e.startsWith("~/")?_f.join(US.homedir(),e.slice(1)):e,$S=(e,t)=>{let n=e.trim();if(!n)return a("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):a(`No recent project #${n}`)}let r=xe(_f.resolve(jS(n)));return d(r)?a(`No epiq project at ${n}`):u("Resolved project path",r.value)},Uf=async()=>{let e=vi();if(Q(""),h().hasProjectDefinition)return a("Already in a project; run epiq from another directory");let t=bn({exclude:process.cwd()}),n=d(t)?[]:t.value,r=$S(e,n);if(d(r))return a(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(l){return a(`Unable to enter ${o}: ${l instanceof Error?l.message:String(l)}`)}let i=await ki(o);return d(i)?(process.chdir(s),a(i.message)):(Di(o),u(`Opened ${Lr(o)}`,null))};var Bi=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=h(),s=Vs(n,t);if(d(s))return a(s.message);let{appliedEvents:i,unappliedEvents:l}=s.value,c=Ot();if(d(c))return c;let m=Lt(i),{fatal:p,skipped:f}=gn(m);if(p.length>0)return Ot(),N(o),a(p.map(v=>v.message).join(", "));hn(f);let g=h().nodes[e];return g?(O.navigate({contextNode:g,selectedIndex:r}),u("",{unappliedEvents:l})):(Ot(),N(o),a("Board did not exist at that date"))};var jf=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 HS=20,WS=16,GS=150,Fi=null,Oi=null;var cr=()=>{Fi!==null&&(clearInterval(Fi),Fi=null),Oi!==null&&(clearTimeout(Oi),Oi=null)},$f=()=>{cr(),N({mode:b.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Hf=({events:e,startTime:t,durationMs:n})=>{cr();let r=e.length,o=Rr(e.map(f=>Rn(f))).map(f=>f??t),s=o[r-1]??Date.now(),i=jf(o),l=Math.max(1,Math.round(n*HS/1e3)),c=Math.max(Math.round(n/l),WS),m=0,p=0;N({mode:b.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Fi=setInterval(()=>{m++;let f=m/l,g=[],v,x;for(;p<r&&i[p]<=f;){let R=e[p],A=An(R);if(d(A)){if(xo(A)){p++;continue}$f();return}g.push(...nd(R)),v=R,x=o[p],p++}if(p>=r||m>=l){for(;p<r;p++){let A=An(e[p]);if(d(A)&&!xo(A))break}let R=h().replay;N({unappliedEvents:[],replay:R&&{...R,progress:1,appliedCount:r}}),cr(),Oi=setTimeout($f,GS);return}let I=h().replay;N({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:v?x??I?.currentTime??t:I?.currentTime??t,currentLabel:v?_i(v):I?.currentLabel??"",flashNodeIds:v?[...new Set(g)]:I?.flashNodeIds??[]}})},c)};var Wf=async()=>{let e=Qe(h().breadCrumb,"BOARD");if(d(e))return e;let t=await wt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=ue({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=ee().commandMeta;if(cr(),r==="now"){let l=Mn(n.value);if(d(l))return a(l.message);let c=Ot();if(d(c))return c;let m=Lt(l.value),{fatal:p,skipped:f}=gn(m);return p.length>0?a(p.map(g=>g.message).join(", ")):(hn(f),N({mode:b.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let l=zs(n.value);if(d(l))return l;let c=r==="prev"?h().eventLog.at(-1):h().unappliedEvents.at(0),m=c===void 0?null:Rn(c),p=(c===void 0?null:l.value.get(c.id)??null)??(m===null?null:go(m));if(p===null)return a(r==="prev"?"No previous event to peek":"No next event to peek");s=r==="prev"?p:p+1}else{let l=or(r||o.trim());if(!l)return a("Invalid peek date");s=l.getTime()}let i=Bi({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return d(i)?i:(N({mode:b.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),u("Peeking",!0))};var Gf=async()=>{let e=Qe(h().breadCrumb,"BOARD");if(d(e))return e;let t=await wt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=ue({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=ee().commandMeta,{dateInput:s,durationInput:i}=ci(r,o);if(cr(),h().syncStatus.status==="syncing")return a("Cannot replay while syncing, try again in a moment");let l=or(s);if(!l)return a("Invalid replay date");let c=i?li(i):15e3;if(c===null)return a("Invalid replay duration (try e.g. 30s or 2m)");let m=l.getTime(),p=h(),f=Bi({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(d(f))return f;let{unappliedEvents:g}=f.value;return g.length===0?(Ot(),N(p),u("Nothing to replay from that point",!0)):(Hf({events:g,startTime:m,durationMs:c}),u("Replaying board history",!0))};import{spawn as zS}from"node:child_process";var KS=()=>{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"]}}},Vf=async e=>new Promise(t=>{let{command:n,args:r}=KS();try{let o=zS(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(a(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?u("Copied to clipboard",null):a(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(a(`Clipboard tool not available (${n})`))}});var Go=async(e,t)=>{if(!e.trim())return a(`Nothing to copy: ${t} is empty`);let n=await Vf(e);return d(n)?n:u(`Copied ${t} to clipboard`,null)},zf=async e=>{let{breadCrumb:t,selectedNode:n}=h(),r=Po({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return a("Nothing selected to copy from");switch(e.modifier){case Me.REF:return Go(_(o.id),"ref");case Me.TITLE:return Go(o.title,"title");case Me.DESCRIPTION:return r?Go(r.props?.description??"","description"):a("No issue in scope");case Me.TAGS:{if(!r)return a("No issue in scope");let s=kn(r).map(({name:i})=>i);return Go(s.join(", "),"tags")}case Me.ASSIGNEES:{if(!r)return a("No issue in scope");let s=Dn(r).map(({name:i})=>i);return Go(s.join(", "),"assignees")}default:return a("Yank one of: ref, title, description, tags, assignees")}};var Kf=async()=>{Q(""),N({mode:b.DEFAULT});let e=et();if(d(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");N({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await ri();return d(t)?(N({syncStatus:{msg:t.message,status:"failed"}}),t):(N({mode:b.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{ulid as qf}from"ulid";var Oe=async()=>{let e=await Gt();return d(e)?e:u("Resolved persist root",e.value)};var qS=e=>e.action==="add.issue.comment",Yf=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=q(t.id)[n];if(!r)return a("Unable to resolve child to delete");let o=await Oe();if(d(o))return o;if(r.context==="COMMENT"){let s=r.id,i=P(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let l=h().nodes[i];if(!l||!P(l))return a("Unable to resolve comment issue");let c=l.log?.filter(qS).find(m=>m.payload.id===s);return c?c.payload.author!==e.value.userId?a("You can only delete your own comments"):B([{id:qf(),action:"delete.issue.comment",payload:{id:s,issue:i},...e.value}],o.value):a("Unable to resolve comment")}return B([{id:qf(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)};import{ulid as YS}from"ulid";var Xf=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=q(t.id)[n];if(!r)return a("Unable to close issue, no target found");if(!P(r))return a("Cannot close in this context");let o=h().nodes[he];if(!o)return a("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return a("Issue is already closed");let s=await Oe();if(d(s))return s;let i=s.value,l=Kt(o.id,r.id,{at:"end"},e.value,i);if(d(l))return l;let c=B([{id:YS(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...e.value}],i);return d(c)?c:u("Issue closed",null)};import{ulid as XS}from"ulid";var Ui=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 Jf=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=q(t.id)[n];if(!r)return a("Unable to reopen issue, no target found");let o=r.context==="TICKET"?u("Resolved ticket",r):at(r.id,"TICKET");if(d(o))return a("Cannot reopen in this context");let s=o.value,i=h().nodes[he];if(!i)return a("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return a("Issue is not closed");if(!P(s))return a("Target node is not issue");let l=Ui(s);if(!l)return a("Unable to resolve previous parent from issue history");if(l===i.id)return a("Previous parent resolves to closed swimlane");let c=h().nodes[l];if(!c)return a("Previous parent no longer exists");let m=await Oe();if(d(m))return m;let p=m.value,f=Kt(c.id,s.id,{at:"end"},e.value,p);if(d(f))return f;let g=B([{id:XS(),action:"reopen.issue",payload:{id:s.id,parent:c.id,rank:f.value},...e.value}],p);return d(g)?g:u("Issue reopened",null)};import{ulid as JS}from"ulid";var Qf=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=q(t.id)[n];if(!r)return a("Missing node");if(r.readonly)return a("Cannot rename readonly node");let o=vi();if(!o)return a("Provide a title");let s=await Oe();return d(s)?s:B([{id:JS(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)};import{ulid as QS}from"ulid";var Zf=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let o=C.findTagByName(r);if(!o)return a(`Tag "${r}" does not exist`);let{selectedNode:s}=h();if(!s)return a("Invalid untag target");let i=at(s.id,"TICKET");if(d(i))return a("Unable to untag issue in this context");let l=i.value;if(!P(l))return a("Target node is not issue");if(!(l.props.tags??[]).includes(o.id))return a("Issue is not tagged with that tag");let m=await Oe();return d(m)?m:B([{id:QS(),action:"remove.issue.tag",payload:{id:l.id,tag:o.id},...e.value}],m.value)};import{ulid as fl}from"ulid";var eg=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let{selectedNode:o}=h();if(!o)return a("Invalid tag target");let s=at(o.id,"TICKET");if(d(s))return a("Unable to tag issue in this context");let i=s.value;if(!P(i))return a("Target node is not issue");let l=await Oe();if(d(l))return l;let c=C.findTagByName(r),m=c?.id??fl();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):B([...c?[]:[{id:fl(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:fl(),action:"add.issue.tag",payload:{id:i.id,tag:m},...e.value}],l.value)};import{ulid as gl}from"ulid";var ji=()=>{let{eventLog:e=[],contributors:t}=h(),n=new Map,r=new Set;for(let o of e)o.userId&&(n.set(o.userId,o.userName??""),r.add(o.userId));for(let o of Object.values(t))n.set(o.id,o.name);return[...n.entries()].map(([o,s])=>({id:o,name:s,isExternal:!r.has(o)}))};var tg=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return a("Provide an assignee");let{selectedIndex:i,contextNode:l}=h(),c=q(l.id)[i];if(!c)return a("Invalid assign target");let m=at(c.id,"TICKET");if(d(m))return a("Unable to assign issue in this context");let p=m.value;if(!P(p))return a("Target node is not issue");let f=await Oe();if(d(f))return f;let g=ji(),v=!o&&s.toLowerCase()==="me",x,I;if(v)x=e.value.userId,I=g.find(w=>w.id===x)?.name??e.value.userName;else{let w=g.filter(k=>k.name===s);if(w.length>1)return a(`"${s}" matches ${w.length} contributors (${w.map(k=>k.id).join(", ")}). Assign from the GUI to choose by id.`);let M=w[0];if(!M&&!o)return a(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);x=M?.id??gl(),I=M?.name??s}if((p.props.assignees??[]).includes(x))return a("Assignee already assigned");let A=!!h().contributors[x];return B([...A?[]:[{id:gl(),action:"create.contributor",payload:{id:x,name:I},...e.value}],{id:gl(),action:"add.issue.assignee",payload:{id:p.id,assignee:x},...e.value}],f.value)};import{ulid as ZS}from"ulid";var ng=async()=>{let e=Z();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee to remove");let{selectedNode:o}=h();if(!o)return a("Invalid unassign target");let s=at(o.id,"TICKET");if(d(s))return a("Unable to unassign in this context");let i=s.value;if(!P(i))return a("Target node is not issue");let l=i.props.assignees??[],c=r.toLowerCase()==="me",m=c?l.filter(g=>g===e.value.userId):ji().filter(g=>g.name===r&&l.includes(g.id)).map(g=>g.id);if(m.length>1)return a(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return a(c?"Issue is not assigned to you":`Issue is not assigned to "${r}"`);let f=await Oe();return d(f)?f:B([{id:ZS(),action:"remove.issue.assignee",payload:{id:i.id,assignee:p},...e.value}],f.value)};import{ulid as rg}from"ulid";var og=async e=>{let t=e.inputString.trim();if(!t)return a("Provide a comment");if(t.length>4e3)return a(`Cannot exceed ${4e3} characters`);let n=Z();if(d(n))return a("Unable to resolve user ID");let{breadCrumb:r,selectedNode:o}=h(),s=Qe([...r,o],"TICKET");if(d(s))return a("Edit target must be an issue");let i=s.value;if(!i)return a("Invalid comment target");let l=i.context==="TICKET"?u("Resolved ticket",i):at(i.id,"TICKET");if(d(l))return a("Unable to comment on issue in this context");let c=l.value;if(!P(c))return a("Target node is not issue");let m=await Oe();return d(m)?m:B([{id:rg(),action:"add.issue.comment",payload:{id:rg(),issue:c.id,author:n.value.userId,md:t},...n.value}],m.value)};import{ulid as tE}from"ulid";import eE from"zod";var sg=()=>{let e=ee().commandMeta.inputString,t=eE.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return a("Auto sync duration must be a number of at least 3000 ms");let n=gt({autoSyncDebounceMs:t.data});return d(n)?n:(ze({autoSyncIntervalMs:t.data}),N({mode:b.DEFAULT}),u(`Auto sync interval set to ${t.data}ms`,null))};var ig=()=>{let e=ee().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=Vm(e),n=gt({autoSync:t});return d(n)?n:(ze({autoSync:t}),N({mode:b.DEFAULT}),u(`Auto sync set to "${e}"`,null))};var ag=()=>{let e=ee().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=gt({logLevel:e});return d(n)?n:(ze({logLevel:e}),N({mode:b.DEFAULT}),u(`Auto sync set to "${e}"`,null))};var dg=e=>{let t=e.inputString.trim();switch(e.modifier){case ye.USERNAME:{if(process.env[dn])return a(`Cannot change the configured user while ${dn} names this process`);let n=Cr();if(d(n))return n;let{userId:r,preferredEditor:o,userName:s}=n.value,i=t||s,l=r||tE();if(!i||!l)return a("Unable to resolve user name or id");let c=gt({userName:i,userId:l,preferredEditor:o??""});return d(c)?c:(ze({userName:i,userId:l}),N({mode:b.DEFAULT}),u(`Username set to "${i}"`,null))}case ye.EDITOR:{if(!t)return a("No editor provided");let n=gt({preferredEditor:t});return d(n)?n:(ze({preferredEditor:t}),N({mode:b.DEFAULT}),u(`Editor configuration set to "${t}"`,null))}case ye.VIEW:{if(t!=="wide"&&t!=="dense")return a("Invalid view mode");let n=gt({viewMode:t});return d(n)?n:(ze({viewMode:t}),N({mode:b.DEFAULT}),u(`View set to "${t}"`,null))}case ye.AUTOSYNC:return ig();case ye.LOG_LEVEL:return ag();case ye.SYNC_DEBOUNCE_MS:return sg();case ye.ATTACHMENT_MAX_KB:return sp();default:return a("Unknown config command")}};var $i=[{systemOnly:!0,intent:U.Move,description:"Internal move-state command",mode:b.COMMAND_LINE,action:Df},{intent:U.Delete,description:"Delete the currently selected node",mode:b.COMMAND_LINE,action:Yf,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:b.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ee().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(i=>Ne(E.FILTER).map(l=>l.split(n)[0]).includes(i))(r))return a("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return we(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:b.DEFAULT})),u("Filter updated",null)}},{intent:U.ViewHelp,description:"Open the help screen",mode:b.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return Un({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),N({mode:b.HELP}),u("Viewing help",null)}},{intent:U.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:b.COMMAND_LINE,action:Xf,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:b.COMMAND_LINE,action:Jf,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.Init,description:"Initialize Epiq in the current git repository",mode:b.COMMAND_LINE,action:Tf},{intent:U.OpenProject,description:"Open a recently used epiq project, by number or path",mode:b.COMMAND_LINE,action:Uf,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.NewItem,description:"Create a new board, swimlane, or issue",mode:b.COMMAND_LINE,action:Bf,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.Rename,description:"Rename the currently selected node",mode:b.COMMAND_LINE,action:Qf,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.UntagTicket,description:"Remove a tag from the selected issue",mode:b.COMMAND_LINE,action:Zf,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.TagTicket,description:"Add or create a tag on the selected issue",mode:b.COMMAND_LINE,action:eg,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.AssignUserToTicket,description:"Assign a user to the selected issue",mode:b.COMMAND_LINE,action:tg,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:b.COMMAND_LINE,action:ng,onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.Comment,description:"Add a comment to the selected issue",mode:b.COMMAND_LINE,action:async(e,t)=>og(t),onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.Sync,description:"Pull, commit, and push Epiq state",mode:b.COMMAND_LINE,action:Kf},{intent:U.Peek,description:"View board state at another point in time",mode:b.COMMAND_LINE,action:Wf},{intent:U.Replay,description:"Replay board history forward from a point in time",mode:b.COMMAND_LINE,action:Gf},{intent:U.Export,description:"Export the current board layout to markdown",mode:b.COMMAND_LINE,action:async()=>{let e=await gf();return d(e)?e:(N({mode:b.DEFAULT}),u("Export successful",!0))}},{intent:U.Exit,description:"Exit the application",mode:b.COMMAND_LINE,action:async()=>(O.exit(),u("Exit successful",!0))},{intent:U.Edit,description:"Edit title or description",mode:b.COMMAND_LINE,action:async(e,t)=>Cf(t),onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:b.COMMAND_LINE,action:async(e,t)=>zf(t),onSuccess:()=>N({mode:b.DEFAULT})},{intent:U.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:b.COMMAND_LINE,action:(e,t)=>dg(t)}];var nE=new Set(["peek","replay","filter","view-help","yank"]),tn=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ee();if(!t)return a("No command to confirm");if(!e&&n===Qt.Invalid)return a("Invalid command");let s=bi(t);Rp();let{readOnly:i}=h();if(i&&!nE.has(s))return Fo({status:En.Fail,message:"Command not available in readonly state",value:null});let l=$i.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!l)return Fo({status:En.Fail,message:"Command not found",value:null});let c;try{c=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return Fo({status:En.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(c)?Fo(c):(Np({addToHistory:!e}),l.onSuccess?.(),ie().autoSync&&oi(),c)};var Hi=[{intent:S.Exit,mode:b.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(N({mode:b.COMMAND_LINE}),Q("move cancel"),tn({isForceExecutedBySystem:!0}))},{intent:S.InitMove,mode:b.DEFAULT,description:"[m] move",action:()=>(N({mode:b.COMMAND_LINE}),Q("move start"),tn({isForceExecutedBySystem:!0}))},{intent:S.ConfirmMove,mode:b.MOVE,description:"[m] confirm move",action:()=>(N({mode:b.COMMAND_LINE}),Q("move confirm"),tn({isForceExecutedBySystem:!0}))}],Wi=[{intent:S.MovePreviousItem,mode:b.MOVE,action:()=>jn()?(N({mode:b.COMMAND_LINE}),Q("move previous"),tn({isForceExecutedBySystem:!0})):a("No pending move")},{intent:S.MoveNextItem,mode:b.MOVE,action:()=>jn()?(N({mode:b.COMMAND_LINE}),Q("move next"),tn({isForceExecutedBySystem:!0})):a("No pending move")}],lg=[{intent:S.MoveToNextContainer,mode:b.MOVE,action:()=>jn()?(N({mode:b.COMMAND_LINE}),Q("move to-next"),tn({isForceExecutedBySystem:!0})):a("No pending move")},{intent:S.MoveToPreviousContainer,mode:b.MOVE,action:()=>jn()?(N({mode:b.COMMAND_LINE}),Q("move to-previous"),tn({isForceExecutedBySystem:!0})):a("No pending move")}];var cg={[V.WORKSPACE]:[...Hi,...Wi],[V.BOARD]:[...Hi,...Wi],[V.SWIMLANE]:[...Hi,...Wi,...lg],[V.TICKET]:[],[V.FIELD]:[],[V.FIELD_LIST]:[],[V.TEXT]:[],[V.COMMENT]:[]};import oE from"node:fs";import sE from"node:path";import{spawn as rE}from"node:child_process";function ug(e){let t=process.platform,o=rE(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 mg=e=>{let t=xe(process.cwd());if(d(t))return a("Unable to resolve project root");let n=ue({repoRoot:t.value});if(d(n))return a(n.message);let r=ir(e.hash,e.ext),o=sE.join(mo(n.value),r);return oE.existsSync(o)?(ug(o),u(`Opened ${e.name}`,null)):a("Attachment file not found \u2014 run :sync to fetch it")};var pg=()=>{Q("");let{pendingNavTarget:e}=_n();N({mode:b.DEFAULT}),e&&O.navigate(e),Un({pendingNavTarget:void 0})},fg=[{intent:S.ExitCommandLine,mode:b.HELP,action:()=>(pg(),u("Exiting help",null))},{intent:S.Exit,mode:b.HELP,action:()=>(pg(),u("Closed help",null))},{intent:S.NavPreviousItem,mode:b.HELP,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),u("Navigating to previous help item",null))},{intent:S.NavNextItem,mode:b.HELP,action:()=>(O.navigateToNextItem(),u("Navigating to next help item",null))},{intent:S.NavToPreviousContainer,mode:b.HELP,action:()=>(O.navigateToPreviousContainer(),u("Navigating to previous help container",null))},{intent:S.NavToNextContainer,mode:b.HELP,action:()=>(O.navigateToNextContainer(),u("Navigating to next help container",null))}];var iE=e=>{N({mode:b.COMMAND_LINE});let{pendingNavTarget:t}=_n();t&&O.navigate(t),Un({pendingNavTarget:void 0}),Q(`${e} `)},gg=()=>{Q("");let{pendingNavTarget:e}=_n();e&&O.navigate(e),Un({pendingNavTarget:void 0}),N({mode:b.DEFAULT})},hg=[{intent:S.InitCommandPalette,mode:b.DEFAULT,description:"[?] command palette",action:()=>{Q("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return Un({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),N({mode:b.PALETTE}),u("Opening command palette",null)}},{intent:S.Confirm,mode:b.PALETTE,action:()=>{let{selectedNode:e}=h();if(!e||!Nn(e))return a("Command only applicable on text nodes");if(e.props.disabled)return a("Command is not available in this context");let t=e.title;return t?(iE(t),u("Selected command",t)):u("No command selected",null)}},{intent:S.ExitCommandLine,mode:b.PALETTE,action:()=>(gg(),u("Exiting palette",null))},{intent:S.Exit,mode:b.PALETTE,action:()=>(gg(),u("Closed command palette",null))},{intent:S.NavPreviousItem,mode:b.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:S.NavNextItem,mode:b.PALETTE,action:()=>(O.navigateToNextItem(),u("Navigating to next item",null))},{intent:S.NavToPreviousContainer,mode:b.PALETTE,action:()=>(O.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:S.NavToNextContainer,mode:b.PALETTE,action:()=>(O.navigateToNextContainer(),u("Navigating to next container",null))}];var yg=[{intent:S.InitCommandLine,mode:b.DEFAULT,description:"[:] write command",action:()=>(N({mode:b.COMMAND_LINE}),Q(""),u("Entering command line mode",null))},...fg,...hg,{intent:S.AddItem,mode:b.DEFAULT,description:"[n] new...",action:()=>(N({mode:b.COMMAND_LINE}),Q(`${E.NEW} `),u("Adding new item",null))},{intent:S.Delete,mode:b.DEFAULT,description:"[d] delete",action:()=>(N({mode:b.COMMAND_LINE}),Q(`${E.DELETE} `),u("Deleting item",null))},{intent:S.Confirm,mode:b.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=h();if(!ae(e?.id??"")?.length){let r=e?C.getAttachment(e.id):void 0;if(r)return mg(r);if(e?.title===fe.DESCRIPTION)return N({mode:b.COMMAND_LINE}),Q(`${E.EDIT} description `),u("Propose command",!0);if(e?.title===fe.ASSIGNEES)return N({mode:b.COMMAND_LINE}),Q(`${E.ASSIGN} `),u("Propose command",!0);if(e?.title===fe.TAGS)return N({mode:b.COMMAND_LINE}),Q(`${E.TAG} `),u("Propose command",!0);if(t.title===fe.DESCRIPTION&&e?.context==="TEXT")return N({mode:b.COMMAND_LINE}),Q(`${E.EDIT} description `),u("Propose command",!0)}return O.enterChildNode(),u("Entering context",null)}},{intent:S.Yank,mode:b.DEFAULT,description:"[y] yank",action:()=>{let{selectedNode:e}=h(),t=e?.title===fe.DESCRIPTION?Me.DESCRIPTION:e?.title===fe.TAGS?Me.TAGS:e?.title===fe.ASSIGNEES?Me.ASSIGNEES:Me.REF,r=Ne(E.YANK).includes(t)?t:Me.REF;return N({mode:b.COMMAND_LINE}),Q(`${E.YANK} ${r}`),u("Propose command",!0)}},{intent:S.EditTitle,mode:b.DEFAULT,description:"[r] rename title",action:()=>(N({mode:b.COMMAND_LINE}),Q(`${E.EDIT} title ${h().selectedNode?.title}`),u("Exiting context",null))},{intent:S.EditDescription,mode:b.DEFAULT,description:"[e] edit desc",action:()=>(N({mode:b.COMMAND_LINE}),Q(`${E.EDIT} description `),u("Exiting context",null))},{intent:S.Exit,mode:b.DEFAULT,description:"[q] exit context",action:()=>(O.enterParentNode(),u("Exiting context",null))},{intent:S.NavPreviousItem,mode:b.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:S.NavNextItem,mode:b.DEFAULT,action:()=>(O.navigateToNextItem(),u("Navigating to next item",null))},{intent:S.NavToPreviousContainer,mode:b.DEFAULT,action:()=>(O.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:S.NavToNextContainer,mode:b.DEFAULT,action:()=>(O.navigateToNextContainer(),u("Navigating to next container",null))}];var aE=500,dE=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),vg=e=>{let t=dE(e);t&&yi(n=>(n+t).slice(0,aE))};var lE=[b.COMMAND_LINE,b.PALETTE],cE=e=>[{intent:S.MoveCursorLeft,mode:e,action:()=>(Wd(-1),u("Moving cursor left",null))},{intent:S.MoveCursorRight,mode:e,action:()=>(Wd(1),u("Moving cursor right",null))},{intent:S.MoveCursorLeftOfWord,mode:e,action:()=>(Gd("left"),u("Moving cursor left of word",null))},{intent:S.MoveCursorRightOfWord,mode:e,action:()=>(Gd("right"),u("Moving cursor right of word",null))},{intent:S.AutoCompleteCommand,mode:e,action:()=>(yi((t,{remainder:n})=>{let r=n?t+n:t,o="";return r==="edit title "&&(o=h().selectedNode?.title??""),r+o}),u("Auto-completing command",null))},{intent:S.CaptureInput,mode:e,action:(t,{sequence:n})=>(vg(n??""),u("Capturing input",null))},{intent:S.EraseInput,mode:e,action:()=>(Ep(),u("Erasing input",null))},{intent:S.EraseInputWord,mode:e,action:()=>(Cp(),u("Erasing input word",null))}],bg=[{intent:S.Confirm,mode:b.COMMAND_LINE,action:()=>(tn(),u("Executing command",null))},{intent:S.ViewHelp,mode:b.DEFAULT,action:()=>(N({mode:b.HELP}),u("Viewing help",null))},...lE.flatMap(cE),{intent:S.ExitCommandLine,mode:b.COMMAND_LINE,action:()=>(N({mode:b.DEFAULT}),u("Exiting command line",null))},{intent:S.GetLastCommandFromHistory,mode:b.COMMAND_LINE,action:()=>(Ap(),u("Getting last command from history",null))},{intent:S.GetNextCommandFromHistory,mode:b.COMMAND_LINE,action:()=>(Tp(),u("Getting next command from history",null))}];var hl=e=>{let t=/^\[(.+?)\]\s*(.+)$/.exec(e);return t?{keys:t[1]??"",label:t[2]??""}:null},xg=({keys:e})=>e.length===1?0:1,Ig=(e,t)=>{let n=new Set;for(let r of e)r.mode!==t||!r.description||n.add(r.description);return[...n].map(hl).filter(r=>r!==null).sort((r,o)=>xg(r)-xg(o))};function Sg(e,t,n){let r=t[e];if(!r)return a("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 l=o[o.length-1];return!l||l.id!==n?a("buildBreadCrumb(): node is not connected to root"):(o.reverse(),u("Breadcrumb built",o))}var Eg=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 nn,yl,vl=new Set,bl=()=>{for(let e of vl)e()},mE=e=>(vl.add(e),()=>vl.delete(e));function xl(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return a("derive(): contextNodeId is missing");if(!r)return a("derive(): rootNode is missing");if(!o[r])return a("derive(): unable to find root node");let l=o[t];if(!l)return a("Unable to derive state, contextNode not found");let c=Sg(t,o,r);if(d(c))return logger.error(c.message),c;let m=c.value,{context:p}=l,f=[...yg,...cg[p]??[],...bg],g=Ig(f,n),v=Eg(f),x=pE(o,s),I=x[t]?.[e.selectedIndex]??null;return u("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:g,availableActions:f,actionIndex:v,selectedNode:I,renderedChildrenIndex:x})}var h=()=>{if(!nn)throw new Error("State not initialized. Call initWorkspaceState() first.");return nn},et=()=>nn?u("Retrieved state",nn):a("State not initialized. Call initWorkspaceState() first.");function Io(e){yl=e;let t=xe(process.cwd()),n=!1;if(!d(t)){let s=$t(t.value);if(d(s))return a(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:b.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=xl(r);return d(o)?o:(nn=o.value,bl(),u("State initialized",null))}var ur=!1,Vo=null;function we(e){let t=h(),n=e(t);if(ur)return Vo=n,nn={...t,...n},u("State updated",null);let r=xl(n);return d(r)?a(r.message??"Unable to update state"):(nn=r.value,bl(),u("State updated",null))}function Nu(e){if(ur)return u("Joined batch",e());ur=!0,Vo=null;let t=()=>{let n=Vo;if(ur=!1,Vo=null,n===null)return null;let r=xl(n);return d(r)?a(r.message??"Unable to update state"):(nn=r.value,bl(),u("State updated",null))};try{let n=e(),r=t();return r&&d(r)?a(r.message):u("State updated",n)}finally{ur&&t()}}var lm=()=>ur,N=e=>we(t=>({...t,...e}));function mr(e,t,n){if(!ur)return we(i=>({...i,[e]:{...i[e]??{},[t]:n}}));let r=h(),o=r[e]??{};o[t]=n;let s={...r,[e]:o};return Vo=s,nn={...r,...s},u("State updated",null)}var Y=()=>uE(mE,h,h),pE=sm,q=e=>h()?.renderedChildrenIndex[e]??[],Ot=()=>yl?Io(yl):a("Cannot reset state: no initial workspace found"),vt=()=>nn!==void 0;var at=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r)return a("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 a(`No ancestor found for context: ${t}`)},Il=(e,t)=>{let{nodes:n}=h(),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},$n=(e,t)=>e?e.readonly?a({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:a("Node not found"),C={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.userId&&n.userId!==t)return a("Contributor is already linked to another user");let r={...n,userId:t},o=we(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to link contributor to user"):u("Linked contributor to user",r)},deleteNode(e){we(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create comment, missing issue");if(!P(t))return a("Can only comment on issues");let n=mr("comments",e.id,{...e,deleted:!1});return d(n)?a("Unable to create comment"):u("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return a("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return a("Unable to edit comment, missing issue");if(!P(r))return a("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=mr("comments",e,o);return d(s)?a("Unable to edit comment"):u("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return a("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=mr("comments",e,n);return d(r)?a("Unable to delete comment"):u("Deleted comment",n)},getComment(e){return h().comments?.[e]},getCommentsByIssue(e){return Object.values(h().comments??{}).filter(t=>t.issue===e&&!t.deleted)},getCommentsGroupedByIssue(){let e=new Map;for(let t of Object.values(h().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 a("Unable to create attachment, missing issue");if(!P(t))return a("Can only attach to issues");let n=we(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?a("Unable to create attachment"):u("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return a("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=we(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return d(r)?a("Unable to delete attachment"):u("Deleted attachment",n)},getAttachment(e){return h().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(h().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},getAttachmentsGroupedByIssue(){let e=new Map;for(let t of Object.values(h().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}=h(),r=n[e];if(!r)return a("Edit target node not found");let o=$n(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 a("Rename target node not found");let r=$n(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),u("Renamed node",o)},getExistingTags(){let{tags:e}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=h();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return ae(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=h(),o=this.getNode(e),s=this.getNode(t);if(!o)return a("Node not found");if(!s)return a("Target parent not found");if(r===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let i=$n(o,"move");if(i)return i;if(Il(t,e))return a("Cannot move node into its own descendant");let l={...o,parentNodeId:t,rank:n};return this.updateNode(l),u("Moved node successfully",l)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=h(),o=this.getNode(e);if(!o)return a("Node not found");if(r===e)return a("Cannot delete root node");let s=$n(o,"delete");if(s)return s;let i=new Set,l=m=>{let p=t[m];if(!(!p||i.has(m))){i.add(m);for(let f of ae(p.id))l(f.id)}};l(e);let c={...structuredClone(t)};for(let m of i){if(!c[m])return a("Unable to locate node to delete");c[m]={...c[m],isDeleted:!0}}return n?(N({nodes:c}),u("Successfully tomb stoned",o)):a("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return a("Contributor not found");let n={...t,name:Ds,tombstoned:!0},r=we(o=>({...o,contributors:{...o.contributors,[e]:n}}));return d(r)?a("Unable to remove contributor"):u("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.tombstoned)return a("Cannot rename a removed contributor");let r={...n,name:t},o=we(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to rename contributor"):u("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return a("Contributor not found");let r={...n,name:t,tombstoned:!1},o=we(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to restore contributor"):u("Restored contributor",r)},createContributor(e){let t=we(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?a("Unable to create contributor"):u("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!r)return a("Unable to assign contributor, missing target");let o=$n(r,"edit");if(o)return o;if(!P(r))return a("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return a("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 a("Unable to unassign, missing contributor");if(!r)return a("Unable to unassign, missing target");let o=$n(r,"edit");if(o)return o;if(!P(r))return a("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(l=>l!==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 a("Unable to add tag, missing tag");if(!r)return a("Unable to add tag, missing target");let o=$n(r,"edit");if(o)return o;if(!P(r))return a("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return a("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 a("Unable to remove tag, missing tag");if(!r)return a("Unable to remove tag, missing target");let o=$n(r,"edit");if(o)return o;if(!P(r))return a("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(l=>l!==t)}};return this.updateNode(i),u("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return a("Tag not found");let n={...t,tombstoned:!0},r=we(o=>({...o,tags:{...o.tags,[e]:n}}));return d(r)?a("Unable to delete tag"):u("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return a("Tag not found");let r={...n,name:t,tombstoned:!1},o=we(s=>({...s,tags:{...s.tags,[e]:r}}));return d(o)?a("Unable to restore tag"):u("Restored tag",r)},createTag(e){let t=we(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):u("Tag created",e)},createNode(e){let t=mr("nodes",e.id,e);return d(t)?a("Unable to create node"):u("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return a("Failed to locate node");let n={...t,readonly:!0},r=mr("nodes",e,n);return d(r)?a(r.message):u("Locked node",n)},updateNode(e){let t=mr("nodes",e.id,e);return d(t)?t:u("Updated node",e)},getContributor(e){return h().contributors[e]},getTag(e){let t=h().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return h().tags[e]},getTags(){return Object.values(h().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return h().nodes[e]},getSiblings(e){return ae(e)}};var fE=(e,t)=>e+" ".repeat(Math.max(0,t-Cg(e))),gE=(e,t)=>" ".repeat(Math.max(0,t-Cg(e)))+e,Gi=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","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),hE=(e,t)=>t?e<t?"up":e>t?"down":null:null,yE=(e,t)=>{let n=C.getNode(e.payload.parent),r=n?Hn.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=hE(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},Rg=e=>`${Math.max(1,Math.round(e/1024))} KB`,Ng=e=>C.getAttachment(e)?.name??"",vE=e=>{switch(e.action){case"add.issue.tag":{let t=h().tags[e.payload.tag];return t?Hn.bgHex(de(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=h().tags[e.payload.tag];return t?Hn.bgHex(de(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=h().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?Hn.hex(de(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?Hn.hex(de(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"add.issue.attachment":return`"${e.payload.name}" ${Hn.dim(`(${Rg(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Ng(e.payload.id);return t?`"${t}"`:""}default:return""}},bE=e=>{let t=Wr(Re(e));return Hn.gray(gE(t,8))},xE=12,IE=e=>fE(`${e}`,xE),SE=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=h().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=h().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"move.node":{let t=C.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${Rg(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Ng(e.payload.id);return t?`"${t}"`:""}default:return""}},_i=e=>[Gi(e.action),SE(e)].filter(Boolean).join(" "),Ag=(e,t)=>{let n=bE(e.id),r=IE(e.userName),o=Hn.dim("\u203A"),s=e.action==="move.node"?yE(e,t):[Gi(e.action),vE(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var EE=e=>De(e,"comments"),CE=e=>De(e,"description"),RE=e=>De(e,"assignees"),NE=e=>De(e,"tags"),AE=e=>De(e,"history"),TE=e=>De(e,"attachments"),Vi=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let l=C.getNode(e);if(!l){let p=C.createNode({...ge.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:i});return d(p)?p:u("Virtual field created",void 0)}if(!ut(l))return a(`Existing virtual node ${e} is not a field`);if(!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==s||l.childRenderAxis!==i))return u("Virtual field unchanged",void 0);let m=C.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:s,childRenderAxis:i});return d(m)?m:u("Virtual field updated",void 0)},Tg=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let i=C.getNode(e);if(!i){let m=C.createNode({...ge.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return d(m)?m:u("Virtual field list created",void 0)}if(!ho(i))return a(`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 c=C.updateNode({...i,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return d(c)?c:u("Virtual field list updated",void 0)},Au=e=>{let t=yt(Vt/4n),n=yt(Vt/2n),r=yt(Vt*3n/4n),o=yt(Vt*7n/8n),s=yt(Vt*15n/16n),i=yt(Vt*13n/16n);if(d(t))return t;if(d(n))return n;if(d(r))return r;if(d(o))return o;if(d(s))return s;if(d(i))return i;let l=Vi({id:CE(e.id),name:fe.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(l))return l;let c=Tg({id:RE(e.id),name:fe.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(c))return c;let m=Tg({id:NE(e.id),name:fe.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(d(m))return m;let p=Vi({id:EE(e.id),name:fe.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(p))return p;let f=Vi({id:TE(e.id),name:fe.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(d(f))return f;let g=Vi({id:AE(e.id),name:fe.HISTORY,parentNodeId:e.id,rank:i.value,value:wE(e),readonly:!0,childRenderAxis:"vertical"});return d(g)?g:u("Ticket virtual nodes materialized",void 0)},wE=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=>Ag(r,n.get(r.action)??[])).join(`
|
|
82
|
-
`)},
|
|
83
|
-
`)[0]?.trim()??"";return t.length>Pg?`${t.slice(0,Pg).trimEnd()}\u2026`:t},WE=(e,t,n)=>{let r=e.payload,o=Lg(e),s=e.action?Gi(e.action):"";if(r?.md!==void 0){let l=HE(r.md);return l?`${s}: ${l}`:s}if(e.action==="move.node"&&r?.parent){let l=t.get(r.parent);return l?n.get(e.id)===r.parent?`Moved within ${l}`:`Moved to ${l}`:s}let i=o!==void 0?t.get(o)??"":r?.assignee!==void 0?t.get(r.assignee)??"":r?.name!==void 0?`"${r.name}"`:"";return[s,i].filter(Boolean).join(" ")},Cl=(e,t,n)=>{if(!e)return null;let r=t.get(e)??n??e;return{id:e,name:r,color:de(r)}},GE=(e,t)=>{let n=e.payload;return{actor:Cl(e.userId,t,e.userName),tag:Cl(Lg(e),t),assignee:Cl(n?.assignee,t)}},kg=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 l=s.parent??s.issue;return l&&t.set(i,l),n.has(i)?i:r(i)})},Dg=(e,t)=>{let n=kg(e);return e.filter((r,o)=>n[o]===t)},VE=e=>{let t=_E(e),n=UE(e),r=jE(e),o=kg(e),s=Rr(e.map(l=>Rn(l)));return e.flatMap((l,c)=>{let m=s[c]??null;return m===null?[]:[{id:l.id,t:m,action:l.action,label:WE(l,t,n),issue:$E(l,r),board:o[c]??null,...GE(l,t)}]}).sort((l,c)=>l.t-c.t)},zo=null,Bg=e=>{let t=zt(e);if(zo&&zo.root===e&&zo.signature===t)return u("Timeline entries, cached",zo.entries);let n=Mn(e);if(d(n))return a(n.message);let r=VE(n.value);return zo={root:e,signature:t,entries:r},u("Timeline entries, built",r)};var Fg=1e5,zE=2e4,qi=null,Og=Promise.resolve(),Wn=e=>{let t=Og.then(e,e);return Og=t.then(()=>{},()=>{}),t},Yi=e=>{let t=xe(e??process.cwd());return d(t)?a(t.message):u("Resolved Epiq repo root",t.value)},Xi=e=>{let t=Yi(e);return d(t)?t:ue({repoRoot:t.value})},tt=()=>{if(!vt())return{mode:"live",asOfTime:null};let{timeMode:e}=h();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:qi}},_g=(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},Wg=async(e={})=>{let t=Xi(e.repoRoot);if(d(t))return a(t.message);let n=Bg(t.value);if(d(n))return a(n.message);let r=n.value,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:[],events:[],earliest:i,latest:s});let l=_g(r,i),c=_g(r,s),m=r.slice(l,c).filter(x=>!e.boardId||x.board===e.boardId).map(({board:x,...I})=>I),p=m.map(x=>x.t),f=Math.max(1,Math.ceil((s-i)/Fg)),g=new Map;for(let x of p){let I=Math.min(Fg-1,Math.floor((x-i)/f)),R=i+I*f;g.set(R,(g.get(R)??0)+1)}let v=[...g.entries()].sort(([x],[I])=>x-I).map(([x,I])=>({t:x,count:I}));return u("Computed event timeline",{bucketMs:f,buckets:v,events:m.length>zE?[]:m,earliest:i,latest:s})},Ko="",Ug="",KE=5e3,zr=null;var Tl=async(e={})=>{let t=Yi(e.repoRoot);if(d(t))return a(t.message);let n=$t(t.value);if(d(n))return a(n.message);let r=e.start===void 0&&e.end===void 0;if(r&&zr&&zr.repoRoot===t.value&&zr.stateBranch===n.value.stateBranch&&Date.now()-zr.fetchedAt<KE)return u("Computed commit timeline",zr.result);let o=await j({cwd:t.value,args:["log","--branches","--not",n.value.stateBranch,...e.start!==void 0?[`--since=@${Math.floor(e.start/1e3)}`]:[],...e.end!==void 0?[`--until=@${Math.floor(e.end/1e3)}`]:[],"--shortstat",`--format=${Ug}%H${Ko}%at${Ko}%an${Ko}%s`]});if(d(o))return a(o.message);let s=o.value.stdout.split(Ug).filter(i=>i.trim().length>0).map(i=>{let[l,...c]=i.split(`
|
|
84
|
-
`),[m,p,f,...g]=(l??"").split(Ko);if(!m||!p)return null;let v=c.join(" "),x=Number(/(\d+) insertion/.exec(v)?.[1]??0),I=Number(/(\d+) deletion/.exec(v)?.[1]??0);return{sha:m,time:Number(p)*1e3,author:f??"unknown",subject:g.join(Ko),linesChanged:x+I,insertions:x,deletions:I}}).filter(i=>i!==null).filter(i=>(e.start===void 0||i.time>=e.start)&&(e.end===void 0||i.time<=e.end));return r&&(zr={repoRoot:t.value,stateBranch:n.value.stateBranch,fetchedAt:Date.now(),result:s}),u("Computed commit timeline",s)},Ji=async e=>{let t=e.ref.trim();if(!t)return a("ref must not be empty");if(t.length!==7)return a(`"${t}" is ${t.length} characters; a ref is ${7}. Read it off the issue rather than slicing the id by hand.`);let n=await Tl({repoRoot:e.repoRoot});if(d(n))return a(n.message);let r=`${t.toUpperCase()} `,o=l=>l.subject.toUpperCase().startsWith(r),s=n.value,i=[];for(let[l,c]of s.entries()){if(!o(c))continue;let m=s[l+1];i.push({...c,precedingSha:m&&o(m)?m.sha:null})}return u("Matched commits by ref",i)},Gg=e=>/^[0-9a-f]{7,40}$/i.test(e),qE=async(e,t)=>{let n=await j({cwd:e,args:["show",t]});if(d(n))return a(n.message);let r=El("commit-diffs");if(d(r))return a(r.message);let o=Ki.join(r.value,`${t}.diff`);return Nl(o)||($e.writeToFile(o,n.value.stdout),await Al(o,292)),Ef(o)},YE=12,XE=800,jg=async(e,t,n)=>{let r=await j({cwd:e,args:["show",`${t}:${n}`]});return d(r)?"":r.value.stdout},JE=async(e,t)=>{let n=await j({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(d(n))return a(n.message);let r=n.value.stdout.split(`
|
|
85
|
-
`)
|
|
86
|
-
`).filter(l=>l!==""),o=r.filter(l=>!Rl.test(l)&&!Hg.test(l));if(o.length>0)return a(`Could not parse ${o.length} line(s) of "git diff --raw --numstat" output, e.g. "${o[0]}"`);let s=new Map;for(let l of r){let c=Hg.exec(l);c&&s.set(c[3]??"",{insertions:c[1]==="-"?0:Number(c[1]),deletions:c[2]==="-"?0:Number(c[2])})}let i=r.filter(l=>Rl.test(l)).map(l=>{let c=Rl.exec(l),m=c?.[1]??"",p=c?.[2]??"",f=c?.[3]??"";return{path:f,beforeBlob:$g(m)?null:m,afterBlob:$g(p)?null:p,...s.get(f)??{insertions:0,deletions:0}}});return i.length===0?a("No changed files found for this commit"):u("Listed changed files with blob hashes",i)},zg=async e=>{if(!Gg(e.sha))return a("Invalid commit sha");let t=Yi(e.repoRoot);if(d(t))return a(t.message);let n=t.value,r=await eC(n,e.sha);if(d(r))return a(r.message);let o=r.value;if(o.length>ZE)return a(`Commit touches ${o.length} files \u2014 too many to show as a diff`);let s=o.flatMap(m=>[m.beforeBlob,m.afterBlob].filter(p=>p!==null)),i=await Rs(s,n);if(d(i))return a(i.message);let l=i.value,c=o.map(m=>({path:m.path,before:m.beforeBlob?l.get(m.beforeBlob)??"":"",after:m.afterBlob?l.get(m.afterBlob)??"":"",insertions:m.insertions,deletions:m.deletions}));return u("Loaded commit diff",{sha:e.sha,files:c})},Kg=e=>{let t=Mn(e);if(d(t))return a(t.message);let n=Ot();if(d(n))return a(n.message);qi=null;let r=Lt(t.value),{fatal:o,skipped:s}=gn(r);return o.length>0?a(o.map(i=>i.message).join(", ")):(hn(s),N({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Restored live state",!0))},tC=(e,t)=>{qi=null;let n=Kg(e);return d(n)?a(`${t} (recovery to live also failed: ${n.message})`):a(t)},wl=e=>Wn(async()=>{let t=Xi(e.repoRoot);if(d(t))return a(t.message);let n=Vs(t.value,e.targetTime);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=n.value,s=Ot();if(d(s))return s;let i=Lt(r),{fatal:l,skipped:c}=gn(i);return l.length>0?tC(t.value,l.map(m=>m.message).join(", ")):(hn(c),N({readOnly:!0,timeMode:"peek",unappliedEvents:o,replay:null}),qi=e.targetTime,u("Checked out historical state",{asOfTime:e.targetTime}))}),qg=async e=>{let t=Xi(e.repoRoot);if(d(t))return a(t.message);let n=zs(t.value);if(d(n))return a(n.message);let r=n.value.get(e.eventId)??null;return r===null?a("Event not found in the log"):wl({repoRoot:e.repoRoot,targetTime:r+1})},Yg=(e={})=>Wn(async()=>{let t=Xi(e.repoRoot);if(d(t))return a(t.message);let n=Kg(t.value);return d(n)?a(n.message):u("Returned to live state",!0)});import nC from"node:fs";var pr=e=>{let t=xe(e??process.cwd());return d(t)?a(t.message):u("Resolved Epiq repo root",t.value)},Qi=null,te=async(e,t)=>{let n=pr(e);if(d(n))return n;let r=ue({repoRoot:n.value});if(d(r))return a(r.message);let o=Ht(n.value);if(d(o))return a(o.message);if(!(Qi!==null&&Qi.repoRoot===n.value&&Qi.stateBranchRoot===r.value&&nC.existsSync(Yn(r.value)))){let p=await Id({repoRoot:n.value,stateBranchName:o.value});if(d(p))return a(p.message);let f=await rr({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(d(f))return a(f.message);Qi={repoRoot:n.value,stateBranchRoot:r.value}}if(t?.pull??!1){let p=await j({cwd:r.value,args:["pull","--ff-only"]});d(p)&&z.info(3,p.message)}let i={repoRoot:n.value,stateBranchRoot:r.value},l=zt(r.value);if(_u(r.value)===l&&vt()&&tt().mode==="live")return u("Booted Epiq state, unchanged",i);let c=bt(r.value);if(d(c))return a(c.message);let m=Dt(c.value.events,c.value.unreadable);return d(m)?a(m.message):(Uu(r.value,l),u("Booted Epiq state",i))},ne=()=>{let e=ht();return d(e)?a(e.message):e.value.userId?e.value.userName?u("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):a("Unable to retrieve user name"):a("Unable to retrieve user id")},X=()=>{let e=et();return d(e)?a(e.message):e};var Kr=e=>(e.props.tags??[]).map(t=>C.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:de(t.name)}));var qr=e=>(e.props.assignees??[]).map(t=>C.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:de(n)}));import rC from"node:fs";import oC from"node:path";import{ulid as Ml}from"ulid";var sC=e=>{if(e.filePath)try{return u("Read attachment file",{data:rC.readFileSync(e.filePath),name:e.name??oC.basename(e.filePath)})}catch(t){return a(`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"}):a("Provide either filePath or dataBase64")},Zi=()=>{let e=ht();return d(e)?Jt:e.value.attachmentMaxKb??Jt},Pl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Attachment target must be an issue");if(o.readonly)return a("Cannot attach to readonly issue");let s=sC(e);if(d(s))return s;let i=rp(t.value.stateBranchRoot,s.value.data,Zi());if(d(i))return i;let l=Ie(s.value.name).trim()||"image",c=Ml(),m={id:Ml(),...n.value,action:"add.issue.attachment",payload:{id:c,issue:e.issueId,author:n.value.userId,hash:i.value.hash,ext:i.value.ext,name:l,bytes:i.value.bytes}},p=B([m],t.value.stateBranchRoot);if(d(p))return a(p.message);let f=ir(i.value.hash,i.value.ext);return u("Added issue attachment",{id:c,issueId:e.issueId,fileName:f,bytes:i.value.bytes,markdown:Bd(l,f)})},Ll=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.attachment"&&m.payload.id===e.attachmentId);if(!o)return a("Unable to resolve attachment");if(o.payload.author!==n.value.userId)return a("You can only delete your own attachments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!P(s))return a("Attachment target must be an issue");if(s.readonly)return a("Cannot delete attachment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.attachment"&&m.payload.id===e.attachmentId))return u("Attachment already deleted",{id:e.attachmentId,issueId:o.payload.issue});let l={id:Ml(),...n.value,action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},c=B([l],t.value.stateBranchRoot);return d(c)?a(c.message):u("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},kl=async e=>{let t=await te(e.repoRoot,{pull:!1});return d(t)?t:op(t.value.stateBranchRoot,e.fileName,Zi())};var iC=365*24*60*60*1e3,fr=()=>{let e=X();if(d(e))return e;let t=tt(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(I=>Nr(I)&&!I.isDeleted),s=Date.now()-iC,i=new Map,l=new Map;for(let I of r)if(!I.isDeleted){if(Pt(I)&&I.parentNodeId){let R=i.get(I.parentNodeId)??[];R.push(I),i.set(I.parentNodeId,R)}if(P(I)&&I.parentNodeId){if(I.parentNodeId===he&&Re(I.id)<s)continue;let R=l.get(I.parentNodeId)??[];R.push(I),l.set(I.parentNodeId,R)}}let c=new Set;for(let I of l.values())for(let R of I)c.add(R.id);let m=ht();if(d(m))return m;let p={},f=C.getCommentsGroupedByIssue();for(let I of r.filter(P))I.isDeleted||!c.has(I.id)||(p[I.id]=(f.get(I.id)??[]).map(R=>{let A=C.getContributor(R.authorId);return{id:R.id,issueId:R.issue,body:R.md,author:{id:R.authorId,name:A?.name??"Unknown",color:de(A?.name??R.authorId??"Unknown")},createdAt:Re(R.id)}}));let g=new Map;for(let I of e.value.eventLog)I.action==="add.issue.attachment"&&g.set(I.payload.id,I.payload.author);let v={},x=C.getAttachmentsGroupedByIssue();for(let I of r.filter(P))I.isDeleted||!c.has(I.id)||(v[I.id]=(x.get(I.id)??[]).map(R=>({id:R.id,issueId:R.issue,name:R.name,fileName:ir(R.hash,R.ext),bytes:R.bytes,createdAt:Re(R.id),canDelete:g.get(R.id)===m.value.userId})));return u("Retrieved Epiq GUI state",{boards:o.sort((I,R)=>I.rank.localeCompare(R.rank)).map(I=>({id:I.id,ref:_(I.id),title:I.title,readonly:!!I.readonly||n,swimlanes:(i.get(I.id)??[]).sort((R,A)=>R.rank.localeCompare(A.rank)).map(R=>({id:R.id,title:R.title,readonly:!!R.readonly||n,issues:(l.get(R.id)??[]).sort((A,w)=>A.rank.localeCompare(w.rank)).map(A=>({id:A.id,ref:_(A.id),title:Ie(A.title),description:A.props.description??"",createdAt:Re(A.id),enteredLaneAt:zi(A.log??[],Re(A.id)),readonly:!!A.readonly||n,tags:Kr(A),assignees:qr(A),parentNodeId:A.parentNodeId,isClosed:A.parentNodeId===he})),parentNodeId:R.parentNodeId}))})),tags:C.getTags().map(I=>({...I,color:de(I.name)})),contributors:Object.values(e.value.contributors).map(I=>({...I,color:de(I.name)})),user:{name:m.value.userName??"",id:m.value.userId??"",color:de(m.value.userName??"")},commentsByIssueId:p,attachmentsByIssueId:v,attachmentMaxKb:Zi(),timeTravel:t})},Xg=null,aC=e=>{if(e===Xg)return;let t=ii({root:e});if(d(t)){z.info(t.message);return}Xg=e},Et=async(e={})=>{if(tt().mode!=="live")return fr();let t=await te(e.repoRoot,{pull:!1});return d(t)?t:(aC(t.value.repoRoot),fr())},qo=async(e={})=>{Ar();let t=pr(e.repoRoot);if(d(t))return a("Sync failed");let n=ne();if(d(n))return n;let r=await ni({cwd:t.value,ownEventFileName:Zn(n.value)});return d(r)?(bd(r.message),r):(nr(),u("Synced",r.value))};import{ulid as Ct}from"ulid";var Yo=e=>{let t=[...new Set([...e.issueIds??[],...e.issueId?[e.issueId]:[]])];return t.length?u("Resolved targets",t):a("Provide issueId or issueIds")},Yr=(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):a(`${r}: ${t.failed.map(o=>`${o.ref} ${o.reason}`).join("; ")}`)},Dl=(e,t)=>{let n={done:[],failed:[]};for(let r of e){let o=t(r);d(o)?n.failed.push({id:r,ref:_(r),reason:o.message}):n.done.push({id:r,ref:_(r)})}return n},Xo=e=>{let t=X();if(d(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?a("Issue not found"):P(n)?n.readonly?a("Issue is readonly"):u("Found issue",n):a("Target must be an issue")};var Zg=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase();async function Ol(e){let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=X();if(d(n))return n;let r=n.value.nodes,o=e.query?.trim().toLowerCase(),s=Object.values(r).filter(P).filter(l=>!l.isDeleted).filter(l=>e.includeClosed||l.parentNodeId!==he).filter(l=>e.boardId?(l.parentNodeId?r[l.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).filter(l=>!e.swimlaneId||l.parentNodeId===e.swimlaneId).filter(l=>!e.tag||Kr(l).some(c=>Zg(c.name,e.tag))).filter(l=>!e.assignee||qr(l).some(c=>Zg(c.name,e.assignee))).filter(l=>!o||l.title.toLowerCase().includes(o)||(l.props.description??"").toLowerCase().includes(o)),i=l=>Ie((l.parentNodeId?r[l.parentNodeId]?.title:void 0)??"");return e.brief?u("Listed issues",s.map(l=>({id:l.id,ref:_(l.id),title:Ie(l.title),swimlane:i(l),tags:Kr(l).map(c=>c.name),assignees:qr(l).map(c=>c.name)}))):u("Listed issues",s.map(l=>({id:l.id,ref:_(l.id),title:Ie(l.title),description:l.props.description??"",createdAt:Re(l.id),enteredLaneAt:zi(l.log??[],Re(l.id)),parentNodeId:l.parentNodeId,isClosed:l.parentNodeId===he,readonly:!!l.readonly,tags:Kr(l),assignees:qr(l)})))}var _l=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=Ie(e.title);if(!o)return a("Issue title cannot be empty");let s=e.description??"",i=st("Issue title",o,300)??st("Issue description",s,2e4);if(i)return a(i);if((e.tagNames?.length??0)>20)return a(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return a(`Cannot set more than ${20} assignees at once`);let l=Pn(e.parentId,n.value,t.value.stateBranchRoot);if(d(l))return l;let c=Pi({name:o,parent:e.parentId,user:n.value,rank:l.value});if(d(c))return c;let m=[...c.value],p=m.find(x=>x.action==="add.issue")?.payload.id;if(!p)return a("Unable to determine created issue id");s&&m.push({id:Ct(),...n.value,action:"edit.description",payload:{id:p,md:s}});let f=[];for(let x of e.tagNames??[]){let I=Ie(x).trim();if(!I||f.some(M=>M.name===I))continue;let R=st("Tag name",I,60);if(R)return a(R);let A=C.findTagByName(I),w=A?.id??Ct();A||m.push({id:Ct(),...n.value,action:"create.tag",payload:{id:w,name:I}}),m.push({id:Ct(),...n.value,action:"add.issue.tag",payload:{id:p,tag:w}}),f.push({id:w,name:I})}let g=[];for(let x of e.assigneeNames??[]){let I=Ie(x).trim();if(!I||g.some(M=>M.name===I))continue;let R=st("Assignee name",I,80);if(R)return a(R);let A=Object.values(r.value.contributors).find(M=>M.name===I),w=A?.id??Ct();A||m.push({id:Ct(),...n.value,action:"create.contributor",payload:{id:w,name:I}}),m.push({id:Ct(),...n.value,action:"add.issue.assignee",payload:{id:p,assignee:w}}),g.push({id:w,name:I})}let v=B(m,t.value.stateBranchRoot);return d(v)?a(v.message):u("Created issue",{id:p,ref:_(p),title:o,parentId:e.parentId,description:s,tags:f,assignees:g})},dC=(e,t,n)=>{let r=Xo(e);if(d(r))return r;let o=Kt(he,e,{at:"end"},t,n);if(d(o))return o;let s={id:Ct(),...t,action:"close.issue",payload:{id:e,parent:he,rank:o.value}},i=B([s],n);return d(i)?a(i.message):u("Closed issue",{id:e,ref:_(e)})};async function Ul(e){let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=Yo(e);if(d(r))return r;let o=s=>dC(s,n.value,t.value.stateBranchRoot);return e.issueIds?Yr("Closed",Dl(r.value,o)):o(r.value[0])}var jl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Target node is not issue");if(o.parentNodeId!==he)return a("Issue is not closed");let s=Ui(o);if(!s)return a("Unable to resolve previous parent from issue history");if(s===he)return a("Previous parent resolves to closed swimlane");let i=r.value.nodes[s];if(!i)return a("Previous parent no longer exists");let l=Kt(i.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(l))return l;let c={id:Ct(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:i.id,rank:l.value}},m=B([c],t.value.stateBranchRoot);return d(m)?a(m.message):u("Reopened issue",{id:o.id,ref:_(o.id),parentId:i.id})},lC=(e,t,n,r)=>{let o=Xo(e);if(d(o))return o;let s=Kt(t.parentId,e,t.position??{at:"end"},n,r);if(d(s))return s;let i={id:Ct(),...n,action:"move.node",payload:{id:e,parent:t.parentId,rank:s.value}},l=B([i],r);return d(l)?a(l.message):u("Moved issue",{id:e,ref:_(e),parentId:t.parentId})};async function $l(e){let t=pr(e.repoRoot);if(d(t))return t;let n=ne();if(d(n))return n;let r=ue({repoRoot:t.value});if(d(r))return r;let o=bt(r.value);if(d(o))return o;let s=Dt(o.value.events,o.value.unreadable);if(d(s))return s;let i=Yo(e);if(d(i))return i;let l=c=>lC(c,e,n.value,r.value);return e.issueIds?Yr("Moved",Dl(i.value,l)):l(i.value[0])}var Hl=e=>{let t=X();if(d(t))return t;let n=t.value.nodes[e];return n?u("Read issue history",(n.log??[]).map(r=>({id:r.id,t:Re(r.id),action:r.action,label:_i(r),...r.action==="move.node"?{parentId:r.payload.parent}:{},actor:{id:r.userId,name:r.userName,color:de(r.userName)}}))):a("Issue not found")},Wl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Edit target must be an issue");if(o.readonly)return a("Cannot edit readonly issue");let s=st("Issue description",e.description,2e4);if(s)return a(s);let i=o.props.description??"";if(i===e.description)return u("No changes made",{id:e.issueId,ref:_(e.issueId),description:i});let l={id:Ct(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},c=B([l],t.value.stateBranchRoot);return d(c)?a(c.message):u("Edited issue description",{id:e.issueId,ref:_(e.issueId),description:e.description})},Gl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Edit target must be an issue");if(o.readonly)return a("Cannot edit readonly issue");let s=Ie(e.title);if(!s.trim())return a("Issue title cannot be empty");let i=st("Issue title",s,300);if(i)return a(i);if(o.title===s)return u("No changes made",{id:e.issueId,ref:_(e.issueId),title:s});let l={id:Ct(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},c=B([l],t.value.stateBranchRoot);return d(c)?a(c.message):u("Edited issue title",{id:e.issueId,ref:_(e.issueId),title:s})};import{ulid as Qo}from"ulid";var Vl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.boardId];if(!o)return a("Board not found");if(!Nr(o))return a("Target parent must be a board");if(o.readonly)return a("Cannot add a swimlane to a readonly board");if(tt().mode!=="live")return a("Cannot add a swimlane while time travelling");let s=Ie(e.title);if(!s.trim())return a("Swimlane title cannot be empty");let i=st("Swimlane title",s,300);if(i)return a(i);let l=Pn(e.boardId,n.value,t.value.stateBranchRoot);if(d(l))return l;let c=Qo(),m={id:Qo(),...n.value,action:"add.swimlane",payload:{id:c,name:s,parent:e.boardId,rank:l.value}},p=B([m],t.value.stateBranchRoot);return d(p)?a(p.message):u("Created swimlane",{id:c,ref:_(c),title:s,boardId:e.boardId})},zl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return a("Swimlane not found");if(!Pt(o))return a("Edit target must be a swimlane");if(o.readonly)return a("Cannot edit readonly swimlane");let s=Ie(e.title);if(!s.trim())return a("Swimlane title cannot be empty");let i=st("Swimlane title",s,300);if(i)return a(i);if(o.title===s)return u("No changes made",{id:e.swimlaneId,ref:_(e.swimlaneId),title:s});let l={id:Qo(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},c=B([l],t.value.stateBranchRoot);return d(c)?a(c.message):u("Edited swimlane title",{id:e.swimlaneId,ref:_(e.swimlaneId),title:s})},Kl=async e=>{let t=pr(e.repoRoot);if(d(t))return t;let n=ne();if(d(n))return n;let r=ue({repoRoot:t.value});if(d(r))return r;let o=bt(r.value);if(d(o))return o;let s=Dt(o.value.events,o.value.unreadable);if(d(s))return s;let i=Kt(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(d(i))return i;let l={id:Qo(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:i.value}},c=B([l],r.value);return d(c)?a(c.message):u("Moved swimlane",{id:e.swimlaneId,ref:_(e.swimlaneId),boardId:e.boardId})},ql=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return a("Swimlane not found");if(!Pt(o))return a("Delete target must be a swimlane");let s={id:Qo(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},i=B([s],t.value.stateBranchRoot);return d(i)?a(i.message):u("Deleted swimlane",{id:e.swimlaneId,ref:_(e.swimlaneId)})};import{ulid as Zo}from"ulid";async function Yl(e){let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=Yo(e);if(d(r))return r;let o=Ie(e.tagName).trim();if(!o)return a("Tag name cannot be empty");let s=st("Tag name",o,60);if(s)return a(s);let i={done:[],failed:[]};for(let v of r.value){let x=Xo(v);d(x)?i.failed.push({id:v,ref:_(v),reason:x.message}):i.done.push({id:v,ref:_(v)})}if(!e.issueIds&&i.failed[0])return a(i.failed[0].reason);if(i.done.length===0)return a(Yr("Tagged",i).message);let l=C.findTagByName(o),c=l?.id??Zo(),m=[...l?[]:[{id:Zo(),...n.value,action:"create.tag",payload:{id:c,name:o}}],...i.done.map(({id:v})=>({id:Zo(),...n.value,action:"add.issue.tag",payload:{id:v,tag:c}}))],p=B(m,t.value.stateBranchRoot);if(d(p))return a(p.message);let f={id:c,name:o};if(!e.issueIds)return u("Added issue tag",{...i.done[0],tag:f});let g=Yr("Tagged",i);return d(g)?g:u(g.message,{...g.value,tag:f})}var Xl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.tags[e.tagId];if(!o)return a("Tag not found");if(o.tombstoned)return a("Tag is already deleted");let s=[{id:Zo(),...n.value,action:"tombstone.tag",payload:{id:e.tagId}}],i=B(s,t.value.stateBranchRoot);return d(i)?a(i.message):u("Deleted tag",{id:o.id,name:o.name})};var Jl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Untag target must be an issue");if(o.readonly)return a("Cannot untag readonly issue");if(!r.value.tags[e.tagId])return a("Tag not found");let s={id:Zo(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},i=B([s],t.value.stateBranchRoot);return d(i)?a(i.message):u("Removed issue tag",{id:e.issueId,ref:_(e.issueId),tagId:e.tagId})};import{ulid as gr}from"ulid";var cC=()=>{let e=et(),t=d(e)?[]:e.value.eventLog??[],n=new Map;for(let r of t)r.userId&&r.userName&&n.set(r.userId,r.userName);return n},th=(e,t)=>{let n=new Map(e);for(let r of Object.values(t))n.set(r.id,r.name);return n};var nh=async(e,t)=>{let n=gd(e);if(d(n))return;let r;for(let o of n.value)o.userId===t&&(r=o.userName??r);return r===void 0?void 0:{id:t,name:r}},Ql=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Assign target must be an issue");if(o.readonly)return a("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let R=r.value.contributors[s],A=R?void 0:await nh(t.value.stateBranchRoot,s);if(!R&&!A)return a("Unknown assignee id");let w=R??A,M=[...R?[]:[{id:gr(),...n.value,action:"create.contributor",payload:{id:w.id,name:w.name}}],{id:gr(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:w.id}}],k=B(M,t.value.stateBranchRoot);return d(k)?a(k.message):u("Added issue assignee",{id:e.issueId,ref:_(e.issueId),assignee:{id:w.id,name:w.name}})}let i=Ie(e.assigneeName??"").trim();if(!i)return a("Provide assigneeId, self or assigneeName");let l=st("Assignee name",i,80);if(l)return a(l);let m=[...th(cC(),r.value.contributors).entries()].filter(([,R])=>R===i);if(m.length>1)return a(`"${i}" matches ${m.length} contributors (${m.map(([R])=>R).join(", ")}). Assign by assigneeId to choose.`);let p=m[0];if(!p&&!e.createUnlinked)return a(`No contributor named "${i}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[f=gr(),g=i]=p??[],x=[...!!r.value.contributors[f]?[]:[{id:gr(),...n.value,action:"create.contributor",payload:{id:f,name:g}}],{id:gr(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:f}}],I=B(x,t.value.stateBranchRoot);return d(I)?a(I.message):u("Added issue assignee",{id:e.issueId,ref:_(e.issueId),assignee:{id:f,name:g}})},Zl=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;if(!r.value.contributors[e.contributorId])return a("Contributor not found");if(await nh(t.value.stateBranchRoot,e.contributorId))return a("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let i=[{id:gr(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],l=B(i,t.value.stateBranchRoot);return d(l)?a(l.message):u("Tombstoned contributor",{id:e.contributorId,name:Ds})};var ec=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=Mn(t.value.stateBranchRoot);if(d(o))return a(o.message);let s=e.boardId?Dg(o.value,e.boardId):o.value,i=new Map,l=new Set,c=new Set,m=gd(t.value.stateBranchRoot);if(d(m))return a(m.message);for(let v of m.value)v.userId&&c.add(v.userId);for(let v of s)v.userId&&(i.set(v.userId,v.userName??""),l.add(v.userId));let p=r.value.contributors,g=[...th(i,p).entries()].map(([v,x])=>({id:v,name:x,color:de(x),isSelf:v===n.value.userId,isExternal:!l.has(v),isRemoved:p[v]?.tombstoned===!0,hasAuthoredAnywhere:c.has(v)}));return u("Listed board contributors",g)},tc=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Unassign target must be an issue");if(o.readonly)return a("Cannot unassign readonly issue");if(!r.value.contributors[e.assigneeId])return a("Assignee not found");let s={id:gr(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},i=B([s],t.value.stateBranchRoot);return d(i)?a(i.message):u("Removed issue assignee",{id:e.issueId,ref:_(e.issueId),assigneeId:e.assigneeId})};import{ulid as ea}from"ulid";var es=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Comment target must be an issue");if(o.readonly)return a("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return a("Comment cannot be empty");if(s.length>4e3)return a(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let i=ea(),l={id:ea(),...n.value,action:"add.issue.comment",payload:{id:i,issue:e.issueId,md:s,author:n.value.userId}},c=B([l],t.value.stateBranchRoot);return d(c)?a(c.message):u("Added issue comment",{id:i,issueId:e.issueId,body:s})},ts=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!o)return a("Unable to resolve comment");if(o.payload.author!==n.value.userId)return a("You can only delete your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!P(s))return a("Comment target must be an issue");if(s.readonly)return a("Cannot delete comment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return u("Comment already deleted",{id:e.commentId,issueId:o.payload.issue});let l={id:ea(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},c=B([l],t.value.stateBranchRoot);return d(c)?a(c.message):u("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},nc=async e=>{let t=await te(e.repoRoot,{pull:!1});if(d(t))return t;let n=ne();if(d(n))return n;let r=X();if(d(r))return r;let o=r.value.eventLog.find(p=>p.action==="add.issue.comment"&&p.payload.id===e.commentId);if(!o)return a("Unable to resolve comment");if(o.payload.author!==n.value.userId)return a("You can only edit your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!P(s))return a("Comment target must be an issue");if(s.readonly)return a("Cannot edit comment on readonly issue");if(r.value.eventLog.some(p=>p.action==="delete.issue.comment"&&p.payload.id===e.commentId))return a("Comment was deleted");let l=e.body.trim();if(!l)return a("Comment cannot be empty");if(l.length>4e3)return a(`Comment cannot exceed ${4e3} characters (got ${l.length})`);let c={id:ea(),...n.value,action:"edit.issue.comment",payload:{id:e.commentId,issue:o.payload.issue,md:l}},m=B([c],t.value.stateBranchRoot);return d(m)?a(m.message):u("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:l})};var rn="1.8.5";import uC from"node:fs";import rh from"node:path";var ns=Number(process.env.EPIQ_GUI_PORT)||3710,rc="/api/instance",oc="epiq",ta=e=>{try{return uC.realpathSync(rh.resolve(e))}catch{return rh.resolve(e)}},mC=e=>{let t=e;return typeof t=="object"&&t!==null&&t.app===oc&&typeof t.repoRoot=="string"&&typeof t.version=="string"&&typeof t.pid=="number"},oh=async(e,t=500)=>{let n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let o=await fetch(`http://127.0.0.1:${e}${rc}`,{signal:n.signal});if(!o.ok)return null;let s=await o.json();return mC(s)?s:null}catch{return null}finally{clearTimeout(r)}};var pC=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))}),hr=e=>d(e)?e:u(e.message,pC(e.value)),sh=(e,t)=>{let n=(e.boards??[]).flatMap(r=>r.swimlanes??[]).flatMap(r=>r.issues??[]).find(r=>r.id===t);return{issueId:t,description:n?.description??"",comments:e.commentsByIssueId?.[t]??[]}};var fC=15e3,ih=e=>{let t,n=!1,r=!1,o=0,s=i();function i(){let g=xe(e.project.repoRoot);if(d(g))return null;let v=ue({repoRoot:g.value});return d(v)?null:zt(v.value)}let l=()=>{let g=Cr();return d(g)?(z.error(g.message),null):g.value},c=()=>{let g=l();if(!g)return!1;let{autoSync:v,preferredEditor:x}=g,I=ht(),R=d(I)?null:I.value.userName;return!!(v&&R&&x)},m=()=>{let g=l()?.autoSyncDebounceMs??fC;return Math.max(0,g-(Date.now()-o))},p=async()=>{if(!(n||r)){r=!0,o=Date.now();try{await Wn(async()=>{if(tt().mode!=="live")return;await qo({repoRoot:e.project.repoRoot});let g=i();if(g===null||g===s)return;s=g;let v=hr(await Et({repoRoot:e.project.repoRoot}));d(v)||tr({type:"state",payload:v})})}finally{r=!1,f()}}};function f(){n||!c()||r||t||(t=setTimeout(()=>{t=void 0,p()},m()))}return f(),{queueSync:f,dispose:()=>{n=!0,t&&clearTimeout(t)}}};var gC=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),sc=(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:!gC.has(n.hostname)},ah=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:sc(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 QC}from"ws";var on=e=>({path:e.path,sha:e.shas[e.shas.length-1]??""});var hC=e=>{let t=e.lastIndexOf("/");return t===-1?".":e.slice(0,t)},dh=({commits:e,patch:t})=>{let n=e.map(i=>i.time),o=t.files.map(i=>({...on(i),changed:i.addedCount+i.removed})).reduce((i,l)=>i===null||l.changed>i.changed?l: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=>hC(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 _e={line:["//"],block:[["/*","*/"]]},Rt={line:["#"],block:[]},ic={line:["--"],block:[]},Xr={line:[],block:[["<!--","-->"]]},yC={line:[],block:[]},$=(e,t)=>({name:e,comment:t}),na=$("TypeScript",_e),ra=$("JavaScript",_e),lh={ts:na,tsx:na,mts:na,cts:na,js:ra,jsx:ra,mjs:ra,cjs:ra,py:$("Python",{line:["#"],block:[['"""','"""']]}),rb:$("Ruby",{line:["#"],block:[["=begin","=end"]]}),go:$("Go",_e),rs:$("Rust",_e),java:$("Java",_e),kt:$("Kotlin",_e),swift:$("Swift",_e),c:$("C",_e),h:$("C",_e),cc:$("C++",_e),cpp:$("C++",_e),hpp:$("C++",_e),cs:$("C#",_e),php:$("PHP",_e),scala:$("Scala",_e),dart:$("Dart",_e),lua:$("Lua",ic),hs:$("Haskell",ic),sql:$("SQL",ic),ex:$("Elixir",Rt),exs:$("Elixir",Rt),pl:$("Perl",Rt),r:$("R",Rt),jl:$("Julia",Rt),sh:$("Shell",Rt),bash:$("Shell",Rt),zsh:$("Shell",Rt),vue:$("Vue",Xr),svelte:$("Svelte",Xr),html:$("HTML",Xr),xml:$("XML",Xr),md:$("Markdown",Xr),mdx:$("Markdown",Xr),css:$("CSS",{line:[],block:[["/*","*/"]]}),scss:$("CSS",_e),less:$("CSS",_e),yml:$("YAML",Rt),yaml:$("YAML",Rt),toml:$("TOML",Rt),ini:$("INI",Rt),json:$("JSON",yC)},vC="Other",ch=e=>{let t=e.slice(e.lastIndexOf("/")+1),n=t.lastIndexOf(".");return n<=0?"":t.slice(n+1).toLowerCase()},yr=e=>lh[ch(e)]?.name??vC,rs=e=>lh[ch(e)]?.comment??null,bC=[/\.(test|spec)\.[a-z0-9]+$/i,/(^|\/)test_[^/]+\.py$/,/_test\.[a-z0-9]+$/i,/(^|\/)conftest\.py$/,/Tests?\.(java|kt|cs|scala)$/],xC=/(^|\/)(tests?|__tests__|spec|specs|e2e|src\/test|features)\//i,Jr=e=>xC.test(e)||bC.some(t=>t.test(e)),IC=/(^|\/)(package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|Cargo\.lock|go\.sum|poetry\.lock|Gemfile\.lock|composer\.lock)$/,SC=/(^|\/)(node_modules|dist|build|out|target|vendor|coverage|\.next|__snapshots__)\//,EC=/(\.min\.(js|css)|\.map|\.snap|\.pb\.go|_pb2\.py)$/,_t=e=>IC.test(e)||SC.test(e)||EC.test(e),uh=e=>/(^|\/)(package\.json|go\.mod|Cargo\.toml|requirements[^/]*\.txt|pyproject\.toml|Gemfile|composer\.json|pom\.xml|build\.gradle(\.kts)?)$/.test(e),mh=e=>/(^|\/)\.github\/workflows\//.test(e)||/(^|\/)(Dockerfile|docker-compose[^/]*\.ya?ml|Makefile|Jenkinsfile|\.gitlab-ci\.yml)$/.test(e)||/\.tf$/.test(e),ph=e=>/\.(md|mdx|rst|txt)$/i.test(e)||/(^|\/)docs?\//i.test(e),CC=/\b(it|test|describe|context|suite)\.skip\b|\bx(it|describe|test)\s*\(|@pytest\.mark\.skip|@unittest\.skip|\bt\.Skip\s*\(|@(Ignore|Disabled)\b/,RC=/\b(it|test|describe|context|suite)\.only\b|\bf(it|describe|test)\s*\(/,fh=e=>CC.test(e),gh=e=>RC.test(e);var hh=/\b(TODO|FIXME|HACK|XXX)\b/,NC=/[;{}]\s*$|^\s*(const|let|var|function|def|class|if|for|while|return|import|export|await|print)\b.*[=(]/,ac=(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"},AC=(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},yh=({patch:e,repoShareByLanguage:t})=>{let n=new Map,r=0,o=0,s=0,i=0,l=0,c=0;for(let p of e.files){if(p.binary||_t(p.path))continue;let f=rs(p.path);if(!f||f.line.length===0&&f.block.length===0)continue;let g=yr(p.path),v=n.get(g)??{comment:0,code:0};for(let{text:x}of p.added){let I=ac(x,f);if(hh.test(x)&&i++,I==="blank"){s++;continue}if(I==="comment"){r++,v.comment++,f&&NC.test(AC(x,f))&&c++;continue}o++,v.code++}for(let{text:x}of p.removedLines)hh.test(x)&&l++;n.set(g,v)}let m=r+o;return{byLanguage:[...n.entries()].map(([p,f])=>({name:p,commentLines:f.comment,codeLines:f.code,share:f.comment+f.code===0?0:f.comment/(f.comment+f.code),repoShare:t?.get(p)??null})).sort((p,f)=>f.commentLines+f.codeLines-(p.commentLines+p.codeLines)),commentLines:r,codeLines:o,blankLines:s,share:m===0?0:r/m,todoLinesAdded:i,todoLinesRemoved:l,commentedOutCodeLines:c}};var TC=/\bconsole\.(log|debug|dir)\s*\(|\bdebugger\b|^\s*print\s*\(|\bfmt\.Print(ln|f)?\s*\(|\bSystem\.out\.print|\bdbg!\s*\(/,oa=6,dc=10,wC=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)},MC=(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)},PC=e=>{if(e.length<oa*2)return 0;let t=new Map,n=new Array(e.length).fill(!1);for(let r=0;r+oa<=e.length;r++){let o=e.slice(r,r+oa);if(o.some(l=>l.text.length<3))continue;let s=o.map(l=>l.text).join(`
|
|
87
|
-
`),i=t.get(s);if(i===void 0){t.set(s,{...o[0],at:r});continue}if(i.file!==o[0]?.file)for(let l=0;l<oa;l++)n[i.at+l]=!0,n[r+l]=!0}return n.filter(Boolean).length},vh=({patch:e})=>{let t=[],n=[],r=[],o=!1,s=0,i=0,l=null,c=[];for(let[m,p]of e.files.entries()){if(_t(p.path)&&t.push(on(p)),uh(p.path)&&n.push(on(p)),mh(p.path)&&r.push(on(p)),ph(p.path)&&(o=!0),p.binary||_t(p.path))continue;let f=p.added.map(x=>x.text),g=wC(f),v=p.status!=="deleted";for(let x of f){TC.test(x)&&s++;let I=MC(x,g);I>i&&(i=I,l=on(p)),v&&c.push({text:x.trim(),file:m})}c.push({text:" ",file:m})}return{generatedPaths:t.slice(0,dc),dependencyManifests:n.slice(0,dc),buildOrCiPaths:r.slice(0,dc),docsTouched:o,debugPrintLinesAdded:s,maxIndentLevels:i,deepestFile:l,duplicatedLines:PC(c)}};var bh=({patch:e,languagesBefore:t})=>{let n=new Map,r=0;for(let i of e.files){if(i.binary)continue;let l=i.addedCount+i.removed;if(_t(i.path)){r+=l;continue}let c=yr(i.path),m=n.get(c)??{name:c,added:0,removed:0,addedInTests:0,share:0};m.added+=i.addedCount,m.removed+=i.removed,Jr(i.path)&&(m.addedInTests+=i.addedCount),n.set(c,m)}let o=[...n.values()].reduce((i,l)=>i+l.added+l.removed,0),s=[...n.values()].map(i=>({...i,share:o===0?0:(i.added+i.removed)/o})).sort((i,l)=>l.added+l.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 LC=200,lc=2e5,kC=5e4,xh=25,DC=64*1024*1024,cc="",BC=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/,FC=/^diff --git a\/(.+) b\/\1$/,Ih=(e,t)=>e==="/dev/null"?null:e.startsWith(t)?e.slice(2):e,Sh=(e,t)=>e===null?"added":t===null?"deleted":"modified",OC=()=>({byPath:new Map,insertions:0,deletions:0,selfChurn:0,retainedLines:0}),_C=(e,t)=>{let n=e.byPath,r="",o=null,s=null,i=null,l=!1,c=0,m=(f,g)=>g==="modified"&&f==="added"?"added":g,p=(f,g)=>{let v=n.get(f);if(v)return v.entry.status=m(v.entry.status,g),v.entry.shas.includes(r)||v.entry.shas.push(r),v;let I={entry:{path:f,status:g,binary:!1,added:[],addedCount:0,removed:0,removedLines:[],shas:[r]},pendingByText:new Map};return n.set(f,I),I};for(let f of t.split(`
|
|
88
|
-
`))
|
|
89
|
-
`)){
|
|
90
|
-
`)){let A=ac(R,v);A==="comment"&&I.comment++,A==="code"&&I.code++}c.set(x,I)}let m=new Map;for(let[p,f]of c){let g=f.comment+f.code;g>0&&m.set(p,f.comment/g)}return{languages:r,commentShareByLanguage:m}};var Rh=({patch:e})=>{let t=0,n=0,r=[],o=[],s=0,i=0;for(let l of e.files)if(!(l.binary||_t(l.path))&&Jr(l.path)){t+=l.addedCount,n+=l.removed,l.status==="added"&&r.push(on(l)),l.status==="deleted"&&o.push(on(l));for(let{text:c}of l.added)fh(c)&&s++,gh(c)&&i++}return{testLinesAdded:t,testLinesRemoved:n,addedTestFiles:r,deletedTestFiles:o,skippedTestLinesAdded:s,focusedTestLinesAdded:i}};var HC=e=>e.reduce((t,n)=>t===null||n.time<t.time?n:t,null)?.sha??null,Nh=async({repoRoot:e,ref:t,commits:n})=>{let r=await Eh({repoRoot:e,shas:n.map(l=>l.sha)});if(d(r))return a(r.message);let o=r.value,s=HC(n),i=s?await Ch({repoRoot:e,sha:s}):null;return u("Derived issue stats",{ref:t,shape:dh({commits:n,patch:o}),languages:bh({patch:o,languagesBefore:i?.languages??null}),tests:Rh({patch:o}),comments:yh({patch:o,repoShareByLanguage:i?.commentShareByLanguage??null}),flags:vh({patch:o})})};var WC=32,os=new Map;var GC=(e,t)=>{if(os.set(e,t),os.size>WC){let n=os.keys().next();n.done||os.delete(n.value)}return t},sa=async(e={idOrRef:""})=>{let t=e.idOrRef.trim();if(!t)return a("idOrRef must not be empty");let n=t.length>7?_(t):t.toUpperCase(),r=xe(e.repoRoot??process.cwd());if(d(r))return a(r.message);let o=r.value,s=await Ji({repoRoot:o,ref:n});if(d(s))return a(s.message);let i=s.value.map(p=>({sha:p.sha,time:p.time,author:p.author,subject:p.subject})),l=[o,n,i.map(p=>p.sha).join(",")].join(" "),c=os.get(l);if(c)return u("Derived issue stats",c);let m=await Nh({repoRoot:o,ref:n,commits:i});return d(m)?a(m.message):u("Derived issue stats",GC(l,m.value))};var VC="Filed here",Ah=(e,t)=>e.set(t,(e.get(t)??0)+1),Th=(e,t,n)=>[...e.entries()].map(([r,o])=>({laneId:r,title:r===null?VC:n(r),count:o,share:t===0?0:o/t})).sort((r,o)=>o.count-r.count||r.title.localeCompare(o.title)),wh=(e,t,n)=>{let r=new Map,o=new Map,s=0,i=0;for(let l of t)for(let[c,m]of l.entries()){if(m!==e)continue;s++,Ah(r,l[c-1]??null);let p=l[c+1];p!==void 0&&(i++,Ah(o,p))}return{arrived:s,departed:i,arrivesFrom:Th(r,s,n),movesOnTo:Th(o,i,n)}};var Mh=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 ss=1440*60*1e3,zC=({laneIds:e,journeys:t,now:n,days:r})=>{let o=n-(r-1)*ss,s=new Map(e.map(i=>[i,Array.from({length:r},()=>[])]));for(let i of t)for(let[l,c]of i.entries()){let m=s.get(c.laneId);if(!m)continue;let p=i[l+1]?.enteredAt,f=Math.max(0,Math.ceil((c.enteredAt-o)/ss)),g=p===void 0?r-1:Math.min(r-1,Math.ceil((p-o)/ss)-1);for(let v=f;v<=g;v++)m[v].push(o+v*ss-c.enteredAt)}return Object.fromEntries([...s].map(([i,l])=>[i,l.map((c,m)=>({t:o+m*ss,median:Mh(c.sort((p,f)=>p-f)),count:c.length}))]))},Ph=({laneId:e,journeys:t,now:n,days:r})=>zC({laneIds:[e],journeys:t,now:n,days:r})[e];var KC=40,qC=30,YC=()=>({tickets:0,commits:0,insertions:0,deletions:0}),XC=async(e,t)=>{let n=YC();for(let r of t.slice(0,KC)){let o=await sa({repoRoot:e,idOrRef:_(r)});d(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},Lh=async e=>{let t=X();if(d(t))return t;let{nodes:n}=t.value;if(!n[e.swimlaneId])return a("Swimlane not found");let o=Object.values(n).filter(P),s=o.map(c=>Sl(c.log??[],Re(c.id))),i=wh(e.swimlaneId,s.map(c=>c.map(m=>m.laneId)),c=>n[c]?.title??"Elsewhere"),l=o.filter(c=>c.parentNodeId===e.swimlaneId).map(c=>c.id);return u("Derived swimlane stats",{swimlaneId:e.swimlaneId,createdAt:Re(e.swimlaneId),...i,stayTrend:Ph({laneId:e.swimlaneId,journeys:s,now:Date.now(),days:qC}),code:await XC(e.repoRoot,l)})};var kh=new Set(["sync","issues:create","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 Dh=e=>{let t=bn({exclude:e});return d(t)?[]:t.value.map(n=>({projectId:n.projectId,name:Lr(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},Bh=e=>{let t=bn();if(d(t))return a(t.message);let n=t.value.find(r=>r.root===e);return n?u("Resolved recent project",n.root):a(`Not a recent project: ${e}`)};import{z as L}from"zod";var K=L.string().min(1),Fh=L.discriminatedUnion("at",[L.object({at:L.literal("start")}),L.object({at:L.literal("end")}),L.object({at:L.literal("before"),sibling:K}),L.object({at:L.literal("after"),sibling:K})]),is=L.number().finite(),se=(e,t)=>L.object({type:L.literal(e),payload:t}),ia=e=>L.object({type:L.literal(e)}),JC=L.discriminatedUnion("type",[ia("state:get"),ia("issues:list"),ia("sync"),ia("time-travel:live"),se("project:open",L.object({root:L.string().min(1)})),se("issues:create",L.object({title:L.string(),parentId:K,description:L.string().optional(),tagNames:L.array(L.string()).optional()})),se("swimlane:create",L.object({title:L.string(),boardId:K})),se("swimlane:edit:title",L.object({swimlaneId:K,title:L.string()})),se("swimlane:delete",L.object({swimlaneId:K})),se("swimlane:move",L.object({swimlaneId:K,boardId:K,position:Fh.optional()})),se("issues:move",L.object({issueId:K,parentId:K,position:Fh.optional()})),se("issue:edit:title",L.object({issueId:K,title:L.string()})),se("issue:edit:description",L.object({issueId:K,description:L.string()})),se("issue:tag:add",L.object({issueId:K,tagName:L.string()})),se("issue:tag:remove",L.object({issueId:K,tagId:K})),se("contributor:remove",L.object({contributorId:K})),se("tag:remove",L.object({tagId:K})),L.object({type:L.literal("contributors:get"),payload:L.object({boardId:K.optional()}).optional()}),se("issue:assignee:add",L.object({issueId:K,assigneeId:K.optional(),assigneeName:L.string().optional(),createUnlinked:L.boolean().optional()})),se("issue:assignee:remove",L.object({issueId:K,assigneeId:K})),se("issue:close",L.object({issueId:K})),se("issue:reopen",L.object({issueId:K})),se("issue:comment:add",L.object({issueId:K,body:L.string()})),se("issue:comment:delete",L.object({issueId:K,commentId:K})),se("issue:comment:edit",L.object({issueId:K,commentId:K,body:L.string()})),se("issue:get",L.object({issueId:K})),L.object({type:L.literal("timeline:get"),payload:L.object({start:is.optional(),end:is.optional(),boardId:K.optional(),requestId:L.number().finite().optional()}).optional()}),L.object({type:L.literal("commits:get"),payload:L.object({start:is.optional(),end:is.optional(),requestId:L.number().finite().optional()}).optional()}),se("time-travel:scrub",L.object({targetTime:is})),se("time-travel:checkout-event",L.object({eventId:L.string().min(1)})),se("commit:inspect",L.object({sha:L.string()})),se("commit:diff:get",L.object({sha:L.string()})),se("issue:commits:get",L.object({issueId:K})),se("issue:stats:get",L.object({issueId:K})),se("swimlane:stats:get",L.object({swimlaneId:K}))]);var Oh=e=>{let t=JC.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 ZC=1024*1024,uc=()=>{tr({type:"state",payload:hr(fr())})},re=(e,t)=>{e.send(JSON.stringify(t))},as=async(e,t)=>{let n=hr(await Et({repoRoot:t}));return d(n)&&n.message===Ga?re(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:Dh(t)}}):re(e,{type:"state",payload:n})},eR=async(e,t)=>{let n=()=>re(e,{type:"state",payload:hr(fr())});if(tt().mode!=="live")return n();let r=await Et({repoRoot:t});return tt().mode!=="live"?n():re(e,{type:"state",payload:hr(r)})},We=async(e,t,n,r,o)=>{if(re(e,{type:r,payload:o}),d(o))return re(e,{type:"failed",payload:o.message});n(),eR(e,t)},_h=(e,t,{onStateChanged:n,getPort:r})=>{new QC({server:e,path:"/ws",maxPayload:ZC,verifyClient:s=>!sc(s.origin,r())}).on("connection",s=>{vm(s),s.on("message",async i=>{let l=async c=>{let{type:m}=c,p=t.repoRoot;if(m==="project:open"){let f=Bh(c.payload.root);return re(s,{type:"project:open:result",payload:f}),d(f)?void 0:(t.repoRoot=f.value,as(s,f.value))}if(m==="timeline:get"){let{requestId:f,...g}=c.payload??{};return re(s,{type:"timeline",requestId:f,payload:await Wg({repoRoot:p,...g})})}if(m==="issue:get"){let f=c.payload?.issueId,g=fr(),v=Hl(f);return re(s,{type:"issue",payload:d(g)?g:u("Issue detail",{...sh(g.value,f),history:d(v)?[]:v.value})})}if(m==="commits:get"){let{requestId:f,...g}=c.payload??{};return re(s,{type:"commits",requestId:f,payload:await Tl({repoRoot:p,...g})})}if(m==="commit:inspect")return re(s,{type:"commit:inspect:result",payload:await Vg({repoRoot:p,sha:c.payload.sha})});if(m==="commit:diff:get"){let{sha:f}=c.payload;return re(s,{type:"commit:diff:result",payload:{sha:f,result:await zg({repoRoot:p,sha:f})}})}if(m==="issue:commits:get"){let{issueId:f}=c.payload;return re(s,{type:"issue:commits:result",payload:{issueId:f,result:await Ji({repoRoot:p,ref:_(f)})}})}if(m==="issue:stats:get"){let{issueId:f}=c.payload;return re(s,{type:"issue:stats:result",payload:{issueId:f,result:await sa({repoRoot:p,idOrRef:_(f)})}})}if(m==="swimlane:stats:get"){let{swimlaneId:f}=c.payload;return re(s,{type:"swimlane:stats:result",payload:{swimlaneId:f,result:await Lh({repoRoot:p,swimlaneId:f})}})}if(m==="time-travel:scrub"){let f=await wl({repoRoot:p,targetTime:c.payload.targetTime});return re(s,{type:"time-travel:result",payload:f}),d(f)?void 0:uc()}if(m==="time-travel:checkout-event"){let f=await qg({repoRoot:p,eventId:c.payload.eventId});return re(s,{type:"time-travel:result",payload:f}),d(f)?void 0:uc()}if(m==="time-travel:live"){let f=await Yg({repoRoot:p});return re(s,{type:"time-travel:result",payload:f}),d(f)?void 0:uc()}if(m==="state:get")return as(s,p);if(m==="sync"){let f=await qo({repoRoot:p});return re(s,{type:"sync:result",payload:f}),n(),as(s,p)}if(m==="issue:comment:add"){let f=await es({repoRoot:p,...c.payload});return We(s,p,n,"issue:comment:add:result",f)}if(m==="issue:comment:edit"){let f=await nc({repoRoot:p,...c.payload});return We(s,p,n,"issue:comment:edit:result",f)}if(m==="issue:comment:delete"){let f=await ts({repoRoot:p,...c.payload});return re(s,{type:"issue:comment:delete:result",payload:f}),d(f)?re(s,{type:"failed",payload:f.message}):(n(),as(s,p))}if(m==="issue:edit:description"){let f=await Wl({repoRoot:p,...c.payload});return We(s,p,n,"issue:edit:description:result",f)}if(m==="issue:edit:title"){let f=await Gl({repoRoot:p,...c.payload});return We(s,p,n,"issue:edit:title:result",f)}if(m==="issue:tag:add"){let f=await Yl({repoRoot:p,...c.payload});return We(s,p,n,"issue:tag:add:result",f)}if(m==="issue:tag:remove"){let f=await Jl({repoRoot:p,...c.payload});return We(s,p,n,"issue:tag:remove:result",f)}if(m==="contributor:remove"){let f=await Zl({repoRoot:p,...c.payload});return We(s,p,n,"contributor:remove:result",f)}if(m==="tag:remove"){let f=await Xl({repoRoot:p,...c.payload});return We(s,p,n,"tag:remove:result",f)}if(m==="contributors:get")return re(s,{type:"contributors",payload:await ec({repoRoot:p,...c.payload})});if(m==="issue:assignee:add"){let f=await Ql({repoRoot:p,...c.payload});return We(s,p,n,"issue:assignee:add:result",f)}if(m==="issue:assignee:remove"){let f=await tc({repoRoot:p,...c.payload});return We(s,p,n,"issue:assignee:remove:result",f)}if(m==="issues:list")return re(s,{type:"issues",payload:await Ol({repoRoot:p})});if(m==="issues:create"){let f=await _l({...c.payload,repoRoot:p});return re(s,{type:"issues:create:result",payload:f}),d(f)?tr({type:"failed",payload:f.message}):(n(),as(s,p))}if(m==="swimlane:create"){let f=await Vl({...c.payload,repoRoot:p});return We(s,p,n,"swimlane:create:result",f)}if(m==="swimlane:edit:title"){let f=await zl({...c.payload,repoRoot:p});return We(s,p,n,"swimlane:edit:title:result",f)}if(m==="swimlane:delete"){let f=await ql({...c.payload,repoRoot:p});return We(s,p,n,"swimlane:delete:result",f)}if(m==="swimlane:move"){if(!c.payload.position)return re(s,{type:"error",message:"Missing move position"});let f=await Kl({...c.payload,repoRoot:p});return We(s,p,n,"swimlane:move:result",f)}if(m==="issues:move"){if(!c.payload.position)return re(s,{type:"error",message:"Missing move position"});let f=await $l({...c.payload,repoRoot:p});return We(s,p,n,"issues:move:result",f)}if(m==="issue:close"){let f=await Ul({repoRoot:p,issueId:c.payload.issueId});return We(s,p,n,"issue:close:result",f)}if(m==="issue:reopen"){let f=await jl({repoRoot:p,issueId:c.payload.issueId});return We(s,p,n,"issue:reopen:result",f)}return re(s,{type:"error",message:"Unknown message type"})};try{let c=Oh(JSON.parse(i.toString()));if(!c.ok)return re(s,{type:"error",message:c.error});let m=c.message;return kh.has(m.type)?await Wn(async()=>tt().mode!=="live"?re(s,{type:"failed",payload:"Read-only while viewing history"}):l(m)):await l(m)}catch(c){return re(s,{type:"error",message:c instanceof Error?c.message:String(c)})}})})};var rR=vr.dirname(nR(import.meta.url)),oR=process.env.IS_LOCAL==="true"?vr.resolve(process.cwd(),"dist/gui"):vr.join(rR,"gui"),aa,sR=async()=>(aa===void 0&&(aa=await import("node:sea").catch(()=>null)),aa?.isSea()?aa:null),Ee=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},iR=e=>Ee(e,409,{isError:!0,message:"Read-only while viewing history"}),da=(e,t)=>Wn(async()=>tt().mode!=="live"?iR(e):t()),Uh=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)}),aR=2*1024*1024,dR={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},lR=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",jh=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),r=vr.resolve(oR),o=vr.resolve(r,n),s=vr.relative(r,o);if(s.startsWith("..")||vr.isAbsolute(s))return Ee(t,403,{isError:!0,message:"Forbidden"});let i=await sR();try{let l=i?Buffer.from(i.getAsset(`gui/${s}`)):await $h(o);return t.writeHead(200,{"content-type":lR(o)}),t.end(l)}catch{return Ee(t,404,{isError:!0,message:`Not found: ${n}`})}},cR=async(e,t=ns)=>new Promise((n,r)=>{let o=s=>{let i=c=>{if(e.off("listening",l),c.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),o(0);return}r(c)},l=()=>{e.off("error",i);let c=e.address();if(!c||typeof c=="string"){r(new Error("Unable to resolve address"));return}n(c.port)};e.once("error",i),e.once("listening",l),e.listen(s,"127.0.0.1")};o(t)}),Hh=async e=>{Mg(!1);let t=0,n={repoRoot:e.repoRoot},r=tR.createServer(async(i,l)=>{let c=new URL(i.url??"/","http://127.0.0.1"),m=ah({method:i.method,origin:i.headers.origin,contentType:i.headers["content-type"]},t);if(m)return Ee(l,m.status,{isError:!0,message:m.message});if(i.method==="GET"&&c.pathname===rc)return Ee(l,200,{app:oc,repoRoot:ta(n.repoRoot),version:rn,pid:process.pid});if(c.pathname==="/api/state")return Ee(l,200,await Et({repoRoot:n.repoRoot}));if(i.method==="POST"&&c.pathname==="/api/comments")try{let p=await Uh(i);if(!p.issueId||!p.body?.trim())return Ee(l,400,{isError:!0,message:"Missing issueId or body"});let f=p.issueId,g=p.body;return await da(l,async()=>{let v=await es({repoRoot:n.repoRoot,issueId:f,body:g});return d(v)?Ee(l,400,{isError:!0,message:v.message}):Ee(l,200,await Et({repoRoot:n.repoRoot}))})}catch(p){return Ee(l,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add comment"})}if(i.method==="POST"&&c.pathname==="/api/attachments")try{let p=await Uh(i,aR);if(!p.issueId||!p.dataBase64)return Ee(l,400,{isError:!0,message:"Missing issueId or dataBase64"});let f=p.issueId,g=p.dataBase64,v=p.name??"";return await da(l,async()=>{let x=await Pl({repoRoot:n.repoRoot,issueId:f,name:v,dataBase64:g});return d(x)?Ee(l,400,{isError:!0,message:x.message}):Ee(l,200,{...await Et({repoRoot:n.repoRoot}),attachment:x.value})})}catch(p){return Ee(l,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add attachment"})}if(i.method==="DELETE"&&c.pathname.startsWith("/api/attachments/")){let p=decodeURIComponent(c.pathname.replace("/api/attachments/",""));return p?da(l,async()=>{let f=await Ll({repoRoot:n.repoRoot,attachmentId:p});return d(f)?Ee(l,400,{isError:!0,message:f.message}):Ee(l,200,await Et({repoRoot:n.repoRoot}))}):Ee(l,400,{isError:!0,message:"Missing attachment id"})}if(i.method==="GET"&&c.pathname.startsWith("/media/")){let p=decodeURIComponent(c.pathname.replace("/media/","")),f=await kl({repoRoot:n.repoRoot,fileName:p});if(d(f))return Ee(l,404,{isError:!0,message:f.message});try{let g=await $h(f.value.filePath);return l.writeHead(200,{"content-type":dR[f.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),l.end(g)}catch{return Ee(l,404,{isError:!0,message:"Attachment blob not found"})}}if(i.method==="DELETE"&&c.pathname.startsWith("/api/comments/")){let p=decodeURIComponent(c.pathname.replace("/api/comments/",""));return p?da(l,async()=>{let f=await ts({repoRoot:n.repoRoot,commentId:p});return d(f)?Ee(l,400,{isError:!0,message:f.message}):Ee(l,200,await Et({repoRoot:n.repoRoot}))}):Ee(l,400,{isError:!0,message:"Missing comment id"})}return c.pathname.startsWith("/board/")?jh("/",l):jh(c.pathname,l)});try{t=await cR(r)}catch(i){return a(i instanceof Error?`Unable to start GUI server: ${i.message}`:`Unable to start GUI server: ${String(i)}`)}let o=ih({project:n});_h(r,n,{onStateChanged:()=>o.queueSync(),getPort:()=>t}),r.on("close",o.dispose);let s=r.address();return!s||typeof s=="string"?(r.close(),a("Unable to resolve GUI server address")):u("Started GUI server",{url:`http://epiq.localhost:${s.port}${e.boardId?`/board/${e.boardId}`:""}`,server:r})};var Gh=async e=>{let t=Ir({});if(d(t))return a(t.message);let n=ht();ce(n)&&ze(n.value);let r=await oh(ns);if(r&&r.repoRoot===ta(e.repoRoot)){let i=`http://127.0.0.1:${ns}`;return console.log(`Epiq GUI already running for this project at ${Wh.cyan(i)}`),Xa(i),u("Reused running GUI",{url:i})}let o=await Hh({...e,boardId:""});if(d(o))return o;let{url:s}=o.value;return console.log(`Epiq GUI running at ${Wh.cyan(s)}`),Xa(s),u("Started GUI",{url:s})};import{Box as Kn}from"ink";import Ce from"react";import{Box as mc,Text as ds}from"ink";import Ut,{useEffect as uR,useMemo as mR}from"react";import{ulid as pR}from"ulid";var Vh=({text:e,match:t,color:n,highlightColor:r=y.secondary,dimColor:o=!1})=>{if(!t)return Ut.createElement(ds,{color:n,dimColor:o},e);let s=e.toLowerCase(),i=t.toLowerCase(),l=s.indexOf(i);return l===-1?Ut.createElement(ds,{color:n,dimColor:o},e):Ut.createElement(ds,{color:n,dimColor:o},e.slice(0,l),Ut.createElement(ds,{backgroundColor:r,bold:!0},e.slice(l,l+t.length)),e.slice(l+t.length))},zh=pR(),fR=e=>`${e}`,gR=e=>{let{pendingNavTarget:t}=_n();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(Ne(E.NONE,{breadCrumb:n,contextNode:r,readOnly:h().readOnly,selectedNode:o}));return[...new Set(Object.values(E))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==E.PALETTE).map(i=>{let l=bi(i),c=$i.find(m=>m.intent===l);return{command:i,description:c?.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,l)=>i.isAvailable!==l.isAvailable?i.isAvailable?-1:1:i.command.localeCompare(l.command))},hR=e=>ge.text({id:zh,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),yR=(e,t,n)=>ge.text({id:fR(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),pc=[],vR=e=>{Kh();let t=C.createNode(hR(h().rootNodeId));d(t)||!Nn(t.value)||(pc=[t.value,...e.map((n,r)=>yR(n,r,zh)).map(C.createNode).filter(ce).map(({value:n})=>n).filter(Nn)],O.navigate({contextNode:t.value,selectedIndex:0}))},Kh=()=>{let e=pc.map(t=>t.id);pc=[];for(let t of e)C.deleteNode(t)};function qh({width:e,height:t}){let r=wp().value.trim().toLowerCase(),o=mR(()=>gR(r),[r]);uR(()=>(vR(o),()=>{Kh()}),[o]);let s=h().selectedIndex;return Ut.createElement(mc,{flexDirection:"column",width:e,height:t-2},Ut.createElement(xt,{height:t-4,itemHeight:3,selectedIndex:s},o.map((i,l)=>{let c=l===s,m=i.isAvailable?y.accent:y.secondary2,p=i.isAvailable?"":"[unavailable] ";return Ut.createElement(mc,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},Ut.createElement(ds,{color:m,dimColor:!i.isAvailable},c?"\u276F ":" ",Ut.createElement(Vh,{text:hu(i.command),match:r,color:m,dimColor:!i.isAvailable})),Ut.createElement(mc,{paddingLeft:2},Ut.createElement(Vh,{text:p+i.description,match:r.length>=2?r:"",color:c&&i.isAvailable?y.primary:y.secondary2,dimColor:!i.isAvailable})))})))}import{Box as kR}from"ink";import ua from"react";import cs from"chalk";import{Box as fc,Text as Qh}from"ink";import ls,{useEffect as Zh,useMemo as bR,useState as ey}from"react";var Qr=["\u2803","\u2806","\u2830","\u2818"],Yh=120,Xh=({isPalette:e,isPending:t,frame:n})=>{if(t){let r=(n%Qr.length+Qr.length)%Qr.length;return Qr[r]}return e?"?":":"},Jh=({infoMessage:e,isPending:t})=>t&&e.includes(le)?"":e;var ty=cs.hex(y.secondary),xR=cs.inverse,IR=cs.inverse.hex(y.secondary2),SR={hint:"",hints:[],overlap:0,remainder:""},ry=({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}},ER=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=de(t);return{bg:r=>cs.bgHex(n).black(r),bgCursor:r=>cs.bgHex(n).inverse.black(r)}}return _d(t)},CR=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=ry({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}},ny=()=>({value:qe.value,cursorPosition:qe.cursorPosition,commandIsPending:qe.commandIsPending,autoCompletion:qe.commandMeta.autoCompletion??SR,infoMessage:qe.commandMeta.infoMessage,validationStatus:qe.commandMeta.validity,command:qe.commandMeta.command,inputString:qe.commandMeta.inputString,modifier:qe.commandMeta.modifier}),RR=(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,oy=({width:e,mode:t})=>{let[n,r]=ey(ny());Zh(()=>{let w=()=>{let k=ny();r(D=>RR(D,k)?D:k)},M=Hd(w);return w(),()=>{M()}},[]);let{value:o,cursorPosition:s,infoMessage:i,commandIsPending:l,autoCompletion:c,command:m,modifier:p,validationStatus:f}=n,g=l&&f===Qt.Invalid,v=Jh({infoMessage:i,isPending:l}),[x,I]=ey(0);Zh(()=>{if(!l){I(0);return}let w=setInterval(()=>{I(M=>(M+1)%Qr.length)},Yh);return()=>{clearInterval(w)}},[l]);let R=Xh({isPalette:t===b.PALETTE,isPending:l,frame:x}),A=bR(()=>{let w=Math.max(0,Math.min(s,o.length)),M=ry({value:o,command:m}),k=CR({value:o,command:m,modifier:p}),D=m?_d(m):null,ve=ER({command:m,modifier:p}),Ve=(lt,ct)=>{let Ra=M&&ct>=M.start&&ct<M.end,Na=k&&ct>=k.start&&ct<k.end;return Ra&&D?D.fg(lt):Na&&ve?ve.bg(lt):lt},Nt=(lt,ct)=>{let Ra=M&&ct>=M.start&&ct<M.end,Na=k&&ct>=k.start&&ct<k.end;return Ra&&D?D.fgCursor(lt):Na&&ve?ve.bgCursor(lt):xR(lt)},dt=o.slice(0,w),ke=o[w]??" ",Sn=w<o.length?o.slice(w+1):"",qn=Array.from(dt).map((lt,ct)=>Ve(lt,ct)).join(""),vs=Nt(ke,w),ro=Array.from(Sn).map((lt,ct)=>Ve(lt,w+1+ct)).join("");if(c.hint){let lt=c.hint[c.overlap]??ke;vs=IR(lt),ro=ty(c.remainder.slice(1)+Sn)}return qn+vs+ro},[o,s,c,m,p]);return ls.createElement(fc,{flexDirection:"column",justifyContent:"flex-start"},ls.createElement(fc,{flexDirection:"column",paddingX:1,borderColor:y.secondary,borderStyle:"round",width:e},ls.createElement(fc,null,ls.createElement(Qh,null,ty(R),A),v&&ls.createElement(Qh,{wrap:"truncate",color:g?y.red:y.secondary2},` ${v} `))))};import{Box as NR,Text as us}from"ink";import Zr from"react";var sy=" ",AR=({keys:e,label:t})=>e.length+1+t.length,TR=(e,t)=>{let n=[],r=0;for(let o of e){let i=(n.length>0?sy.length:0)+AR(o);if(r+i>t-4)break;n.push(o),r+=i}return n},iy=({width:e,availableHints:t})=>{let n=TR(t,e);return Zr.createElement(NR,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},n.length?Zr.createElement(us,{wrap:"truncate"},n.map(({keys:o,label:s},i)=>Zr.createElement(us,{key:`${o}-${s}`},i>0?sy:"",Zr.createElement(us,{color:y.accent},o),Zr.createElement(us,{color:y.secondary2}," ",s)))):Zr.createElement(us,{color:y.secondary2},"\xA0"))};import{Box as wR,Text as la}from"ink";import ms,{useEffect as MR,useRef as eo,useState as PR}from"react";var LR=40,ca=.3,gc="\u2500",ay=1,dy=16,ly=({width:e})=>{let{replay:t}=Y(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),i=s*ay,[l,c]=PR(0),m=eo(r);m.current=r;let p=eo(0),f=eo(0),g=eo(0),v=eo(0),x=eo(0);if(MR(()=>{if(!n){p.current=0,g.current=0,v.current=0,x.current=0,c(0);return}p.current=m.current,f.current=Date.now(),g.current=m.current;let M=setInterval(()=>{let k=Date.now(),D=m.current;if(D!==g.current){let ke=D-g.current,Sn=k-f.current;if(ke<0)v.current=0,x.current=0;else if(ke>0&&Sn>0){let qn=ke/Sn;v.current=v.current===0?qn:v.current*(1-ca)+qn*ca,x.current=x.current===0?ke:x.current*(1-ca)+ke*ca}p.current=D,f.current=k,g.current=D}let ve=k-f.current,Ve=Math.min(x.current,v.current*ve),Nt=Math.min(1,p.current+Ve),dt=Math.round(Nt*i);c(ke=>ke===dt?ke:dt)},LR);return()=>clearInterval(M)},[n,i]),!t)return null;let I=M=>{let k=s>1?M/(s-1):0,D=Math.round(k*(dy-1))/(dy-1);return mi(D)},R=Math.min(s,Math.floor(l/ay)),A=[];for(let M=0;M<R;M++){let k=I(M),D=A[A.length-1];D&&D.color===k?D.text+=gc:A.push({text:gc,color:k})}let w=gc.repeat(Math.max(0,s-R));return ms.createElement(wR,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1,columnGap:1},ms.createElement(la,{color:y.secondary2},"\u25B6"),ms.createElement(la,null,A.map((M,k)=>ms.createElement(la,{key:k,color:M.color},M.text)),ms.createElement(la,{color:y.secondary,dimColor:!0},w)))};var ps=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=Y(),o=t===b.COMMAND_LINE||t===b.PALETTE;return ua.createElement(kR,null,o?ua.createElement(oy,{width:e,mode:t}):r==="replay"?ua.createElement(ly,{width:e}):ua.createElement(iy,{width:e,mode:t,availableHints:n}))};import{Box as Gn,Text as to}from"ink";import nt,{useEffect as DR,useMemo as BR}from"react";import{ulid as cy}from"ulid";var pa=cy(),FR=()=>[...new Set([...h().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(hl).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})),OR=e=>ge.text({id:pa,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),_R=(e,t,n)=>ge.text({id:cy(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),ma=[],uy=()=>{let e=ma.filter(n=>n.id!==pa).map(n=>n.id),t=ma.filter(n=>n.id===pa).map(n=>n.id);ma=[];for(let n of[...e,...t])C.deleteNode(n)},UR=e=>{uy();let t=C.createNode(OR(h().rootNodeId));if(d(t)||!Nn(t.value))return logger.error("Could not attach help nodes");ma=[t.value,...e.map((n,r)=>_R(n,r,pa)).map(C.createNode).filter(ce).map(({value:n})=>n).filter(Nn)],O.navigate({contextNode:t.value,selectedIndex:0})},my=({width:e,height:t})=>{let n=BR(()=>FR(),[]);DR(()=>(UR(n),()=>{uy()}),[n]);let r=h().selectedIndex;return nt.createElement(Gn,{flexDirection:"column",marginTop:3,borderColor:y.secondary,borderStyle:"round",width:e,height:t-2},nt.createElement(Gn,{paddingX:1,justifyContent:"center"},nt.createElement(to,{color:y.accent},"Help"),nt.createElement(to,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),nt.createElement(Gn,{paddingX:1,marginTop:1},nt.createElement(Gn,{width:20,justifyContent:"flex-end"},nt.createElement(to,{color:y.secondary},"Key(s)")),nt.createElement(Gn,{flexGrow:1,width:40,paddingLeft:2},nt.createElement(to,{color:y.secondary},"Action"))),nt.createElement(xt,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},i)=>{let l=i===r;return nt.createElement(Gn,{paddingX:1,key:`${o}-${s}-${i}`,flexDirection:"row"},nt.createElement(Gn,{width:20,justifyContent:"flex-end"},nt.createElement(to,{color:y.accent},o)),nt.createElement(Gn,{flexGrow:1,width:40,paddingLeft:2},nt.createElement(to,{color:l?y.primary:y.secondary2},s)))})))};import jR from"chalk";import{Box as br,Text as Ue}from"ink";import pe from"react";var $R=8,HR=()=>{let e=bn({exclude:process.cwd()});return d(e)?[]:e.value.slice(0,$R)},py=({width:e,height:t})=>{let n=HR();return pe.createElement(br,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},pe.createElement(Ue,{color:y.accent,bold:!0},"Initialize project"),pe.createElement(Ue,null,`This folder is not an ${jR.hex(y.accent)("epiq")} project yet.`),pe.createElement(Ue,{color:y.primary},"To start tracking issues here, we need to initialize a new",pe.createElement(Ue,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),pe.createElement(br,{marginTop:1,flexDirection:"column"},pe.createElement(br,null,pe.createElement(Ue,{color:y.accent}," "),pe.createElement(Ue,{color:y.primary},"Type "),pe.createElement(Ue,{backgroundColor:y.secondary}," :init "))),pe.createElement(br,{marginTop:1},pe.createElement(Ue,{color:y.secondary2},"This will create, commit and push "),pe.createElement(Ue,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json ")),n.length>0&&pe.createElement(br,{marginTop:1,flexDirection:"column"},pe.createElement(Ue,{color:y.accent,bold:!0},"Or open a recent project"),n.map((r,o)=>pe.createElement(br,{key:r.projectId},pe.createElement(Ue,{color:y.accent},` ${o+1} `),pe.createElement(Ue,{color:y.primary},Lr(r.root)),pe.createElement(Ue,{color:y.secondary2},` ${r.root}`))),pe.createElement(br,{marginTop:1},pe.createElement(Ue,{color:y.accent}," "),pe.createElement(Ue,{color:y.primary},"Type "),pe.createElement(Ue,{backgroundColor:y.secondary}," :open 1 "),pe.createElement(Ue,{color:y.secondary2}," or "),pe.createElement(Ue,{backgroundColor:y.secondary}," :open <path> "))))};import{Box as fa,Text as sn}from"ink";import Ge from"react";var WR=({isDone:e,command:t,value:n})=>Ge.createElement(fa,null,Ge.createElement(sn,{color:y.accent,dimColor:e},e?" \u2714 ":" "),Ge.createElement(sn,{dimColor:e},"Type "),Ge.createElement(sn,{backgroundColor:y.secondary,dimColor:e}," "+t+" "),n!==void 0&&Ge.createElement(Ge.Fragment,null,Ge.createElement(sn,{dimColor:e}," "),Ge.createElement(sn,{color:y.secondary,dimColor:e},"<"+n+">"))),GR=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function hc({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:i,isSetAutoSync:l}=Ln(),c=[{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:l,command:":config autosync",value:i,message:"Almost there. Configure auto sync."}],m=c.findIndex(f=>!f.done),p=m===-1?void 0:c[m];return Ge.createElement(fa,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Ge.createElement(sn,{color:y.accent,bold:!0},"Welcome! \u{1F539}"),Ge.createElement(sn,null,"Let's get you started - it's a breeze."),Ge.createElement(sn,{color:y.secondary2},"Remember - you can always search available commands by typing:",Ge.createElement(sn,{color:y.accent}," ? ")),p&&Ge.createElement(sn,{color:y.secondary2},p.message),Ge.createElement(fa,{flexDirection:"column"},c.map((f,g)=>m===-1||g<=m?Ge.createElement(fa,{key:f.key,marginBottom:1},Ge.createElement(WR,{isDone:f.done,command:f.command,value:f.done?GR(f.value):void 0})):null)))}import ba from"chalk";import{Box as gs,Text as no}from"ink";import Le from"react";import{Box as ga,Text as fy}from"ink";import Vn from"react";import VR from"chalk";var zR=e=>(C.getTag(e)?.name??"").length+3,KR=e=>{let t=C.getContributor(e);return(t?t.name:"").length+3},gy=({width:e})=>{let{viewMode:t}=ie(),n=Y(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:i}=n,l=i[o.id]?.[s],c=at(l?.id??o.id,"TICKET"),m=ce(c)?c.value:void 0,p=(m?.props.tags??[]).filter(D=>C.getTag(D)),f=m?.props.assignees??[],g=m?.parentNodeId?!Il(o.id,m.parentNodeId)&&t==="dense":!1,v=r.map((D,ve)=>{let Ve=ve===r.length-1,Nt=ae(D.id),dt=Ve?Nt?.[s]?.title:void 0;return`${ve?" / ":""}${D.title??""}${dt?` \u25B8 ${dt}`:""}`}).join(""),x=m?C.getCommentsByIssue(m.id):[],I=x.length?String(x.length).length+11:0,R=g?p.reduce((D,ve)=>D+zR(ve),0)+f.reduce((D,ve)=>D+KR(ve),0)+I:0,A=l?.id!=null&&!(t==="wide"&&P(l)),w=Math.max(0,e-R),M=v.substring(0,w)+(A?VR.hex(y.secondary2).dim(` ${_(l.id)}`):""),k=g?[...p.map(D=>Vn.createElement(ga,{key:`tag-${D}`,paddingLeft:1},Vn.createElement(_r,{id:D}))),...f.map(D=>Vn.createElement(ga,{key:`assignee-${D}`,paddingLeft:1},Vn.createElement(Bn,{id:D}))),x.length?Vn.createElement(ga,{key:"comments",paddingLeft:1},Vn.createElement(fy,{color:y.accent},"[",x.length," comment",x.length===1?"":"s","]")):null]:[];return Vn.createElement(ga,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Vn.createElement(fy,{color:y.secondary2},M),k)};import{Box as qR,Text as hy}from"ink";import ha from"react";var YR=({filters:e})=>ha.createElement(qR,{columnGap:1},ha.createElement(hy,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>ha.createElement(hy,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),yy=ha.memo(YR);import{Box as XR,Text as ya}from"ink";import fs from"react";function vy(){let{eventLog:e,unappliedEvents:t}=Y(),n=e.at(-1)?.id,r=ks(n??""),o=ce(r)?Ci(r.value):"INVALID DATE";return fs.createElement(XR,{paddingLeft:1},fs.createElement(ya,{backgroundColor:y.accent,color:y.secondary}," Readonly "),fs.createElement(ya,{color:y.accent}," "+t.length+" edits ago at "+o+"."),fs.createElement(ya,{color:y.accent}," Resume with "),fs.createElement(ya,{backgroundColor:y.accent,color:y.secondary}," ",":peek now"," "))}import{Box as JR,Text as yc}from"ink";import va from"react";function by(){let{replay:e}=Y();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return va.createElement(JR,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},va.createElement(yc,{backgroundColor:y.accent,color:y.secondary}," \u25B6 REPLAY "),va.createElement(yc,{color:y.secondary2},Ci(new Date(r))),va.createElement(yc,{color:y.accent},`${t}/${n} edits`))}import vc from"chalk";import{Box as QR,Text as xy}from"ink";import bc,{useEffect as ZR,useState as eN}from"react";var tN=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],nN=150,Iy=12,rN=.36,Sy=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},oN=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},sN=(e,t,n)=>{let r=Sy(e),o=Sy(t);return oN({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},iN=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,s=e[r],i=e[Math.min(r+1,e.length-1)];return sN(s,i,o)};function Ey({syncStatus:e,autoSync:t}){let[n,r]=eN(0);ZR(()=>{if(e.status!=="syncing"){r(0);return}let l=0,c=setInterval(()=>{l+=1;let m=(Math.sin(l*rN)+1)/2,p=Math.round(m*(Iy-1));r(f=>f===p?f:p)},nN);return()=>clearInterval(c)},[e.status]);let o={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,offline:y.secondary2,pending:y.secondary2,syncing:iN(tN,n/(Iy-1))??""}[e.status];return bc.createElement(QR,null,bc.createElement(xy,null,vc.hex(y.secondary2).dim(t?"Sync (auto): ":"Sync: ")),bc.createElement(xy,null,vc.hex(i)("\u25CF")+vc.hex(y.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import Ty from"chalk";import{Text as wy}from"ink";import My,{useEffect as cN,useState as uN}from"react";import xc from"chalk";var aN="https://registry.npmjs.org/epiq/latest",Ic=null,Cy=0,dN=1e3*60*60*24,Ry=e=>e.replace(/^v/,""),lN=(e,t)=>{let n=Ry(e).split(".").map(Number),r=Ry(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},Ny=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Ic&&Date.now()-Cy<dN)return Ic;try{let t=await fetch(aN);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?lN(r,e)>0:!1};return Ic=o,Cy=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},Ay=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,i)=>s!=n[i]);return r.map((s,i)=>i>=o?xc.hex(y.accent).dim(s):xc.hex(y.secondary).dim(s)).join(xc.hex(y.secondary2).dim("."))};function Py(){let[e,t]=uN({current:rn,latest:null,updateAvailable:!1});return cN(()=>{let n=!0;return Ny(rn).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?My.createElement(wy,{dimColor:!0,color:y.secondary2},rn+" "):My.createElement(wy,null,Ty.hex(y.secondary2).dim(rn),Ty.hex(y.accent).dim(" \u2197 "),Ay(rn,e.latest))}function hs({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=Y(),{userName:i,preferredEditor:l,autoSync:c}=ie(),m=64,p=process.stdout.columns-m-8,f=t||n==="replay",g=s?fn(s.currentLabel,Math.max(0,p)):"";return Le.createElement(gs,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?Le.createElement(gs,{paddingLeft:1},Le.createElement(no,{color:y.secondary2},g)):f?Le.createElement(no,null," "):o===b.PALETTE?Le.createElement(gs,null,Le.createElement(no,{color:y.accent},"Command Palette"),Le.createElement(no,{dimColor:!0,color:y.secondary2}," ","- search, select and press enter")):Le.createElement(gs,{paddingLeft:1},e.length>0?Le.createElement(yy,{filters:e}):Le.createElement(gy,{width:p})),n==="live"?Le.createElement(gs,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},Le.createElement(Ey,{autoSync:!!c,syncStatus:r}),Le.createElement(no,null,ba.hex(y.secondary2).dim("Mode: ")+ba.hex(y.secondary2).dim(o.padEnd(8," "))," "),Le.createElement(Ly,{icon:"@",value:i}),Le.createElement(Ly,{icon:"\u276F",value:l}),Le.createElement(Py,null)):"",n==="peek"?Le.createElement(vy,null):"",n==="replay"?Le.createElement(by,null):"")}function Ly({icon:e,value:t}){return Le.createElement(no,null,ba.dim(e)+ba.hex(y.accent)(` ${t??"-"} `))}import{Box as mN,Text as pN}from"ink";import ys from"react";import{Box as xa,Text as Sc}from"ink";import zn from"react";function Ec(){let e=Y(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?q(t?.id):[];return zn.createElement(xa,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},zn.createElement(xa,{padding:1,paddingTop:0,paddingBottom:0},zn.createElement(Sc,null,"Select a board:")),zn.createElement(xa,{padding:1,flexDirection:"column"},i.map((l,c)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===c,f=q(l.id).flatMap(({id:g})=>ae(g)).length;return zn.createElement(xa,{key:l.id??c},zn.createElement(Sc,{color:m?y.accent:y.secondary2},zn.createElement(Ye,{isSelected:m})),zn.createElement(Sc,{color:m?y.accent:y.secondary2},l.title," (",f," issues)",l.readonly?" \u{1F512}":""))})))}var fN=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:i})=>{let{renderedChildrenIndex:l}=Y(),c=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return ys.createElement(mN,{flexDirection:"row"},e.context==="WORKSPACE"?ys.createElement(Ec,null):c?ys.createElement(Ai,{height:f,width:i,swimlanes:(l[c.id]??[]).filter(g=>g!==void 0&&Pt(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):ys.createElement(pN,null))},ky=ys.memo(fN);import{useEffect as gN}from"react";var hN=e=>{gN(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:i}=ie();i&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:l,mode:c}=h();c==="default"&&!l&&oi(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},Dy=({autoSync:e})=>(hN(e),null);function Cc({width:e,height:t}){let n=Y(),{autoSync:r,viewMode:o}=au(),s=n.filters;if(n.mode===b.HELP)return Ce.createElement(Kn,{flexDirection:"column"},Ce.createElement(my,{width:e,height:t}));if(n.mode===b.PALETTE)return Ce.createElement(Kn,{flexDirection:"column"},Ce.createElement(hs,{filters:s}),Ce.createElement(qh,{width:e,height:t-2}),Ce.createElement(ps,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=Ln(),l=!i,c=i&&!n.hasProjectDefinition;if(l)return Ce.createElement(Kn,{flexDirection:"column"},Ce.createElement(Kn,{flexDirection:"column"},Ce.createElement(hs,{hideBreadCrumb:!0,filters:s}),Ce.createElement(hc,{height:t,width:e})),Ce.createElement(ps,{width:e,mode:n.mode,availableHints:[]}));if(c)return Ce.createElement(Kn,{flexDirection:"column"},Ce.createElement(Kn,{flexDirection:"column"},Ce.createElement(hs,{hideBreadCrumb:!0,filters:s}),Ce.createElement(py,{height:t,width:e})),Ce.createElement(ps,{width:e,mode:n.mode,availableHints:[]}));let m=Qe(n.breadCrumb??[],"BOARD");if(ce(m)){let p=m.value.id,f=q(p).length,g=3,v=Math.floor(e/g),x=Math.floor(e/Math.max(f,1));e=Math.min(x,v)*Math.max(f,g)}return Ce.createElement(Kn,{flexDirection:"column"},Ce.createElement(Dy,{autoSync:r}),Ce.createElement(Kn,{flexDirection:"column"},Ce.createElement(hs,{filters:s}),Ce.createElement(ky,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),Ce.createElement(ps,{width:e,mode:n.mode,availableHints:n.availableHints}))}import yN from"readline";var Ia,Sa,an,vN=new Set([S.MoveCursorLeft,S.EraseInputWord,S.MoveCursorLeftOfWord,S.MoveCursorRight,S.MoveCursorRightOfWord,S.NavToPreviousContainer,S.NavToNextContainer,S.NavPreviousItem,S.NavNextItem,S.SetViewDense,S.SetViewWide,S.Confirm,S.Exit,S.Yank,S.InitCommandLine,S.InitCommandPalette,S.ExitCommandLine,S.CaptureInput,S.EraseInput,S.EraseInputWord,S.HideHelp,S.ViewHelp,S.SetViewDense,S.SetViewWide,S.GetLastCommandFromHistory,S.GetNextCommandFromHistory,S.AutoCompleteCommand]),bN=new Set([S.NavPreviousItem,S.NavNextItem,S.NavToPreviousContainer,S.NavToNextContainer,S.Confirm,S.Exit,S.InitCommandPalette,S.InitMove,S.MoveNextItem,S.MovePreviousItem,S.MoveToNextContainer,S.MoveToPreviousContainer,S.Delete,S.AddItem,S.EditTitle,S.EditDescription,S.ConfirmMove,S.Edit,S.ViewHelp,S.Yank]),By=async e=>{if(e.ctrl&&e.name==="c")return O.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=h(),s=Mp(e,n);if(!s||r&&!vN.has(s)||o==="replay"&&n===b.DEFAULT&&bN.has(s))return;let i=t[n]?.[s];if(i?.action)try{await i.action(i,e)}catch(l){logger.error(l)}},xN=()=>async function(t,n){n.name!=="escape"&&(an&&(clearTimeout(an),an=void 0),await By(n))},IN=()=>async function(t){if(t.length===1&&t[0]===27){an&&clearTimeout(an),an=setTimeout(()=>{By({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),an=void 0},25);return}an&&(clearTimeout(an),an=void 0)};function Fy(){Ia&&process.stdin.removeListener("keypress",Ia),Sa&&process.stdin.removeListener("data",Sa),Ia=xN(),Sa=IN(),yN.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Sa),process.stdin.on("keypress",Ia)}async function Oy(){try{let e=Ir({});if(d(e))return Bt(0,e.message);let t=ht();ce(t)&&ze(t.value);let n=xe(process.cwd()),r=ce(n)?await ki(n.value):Of();if(d(r))return r;let o=Rc();return d(o)?Bt(6,o.message):(Fy(),ce(n)&&Di(n.value),u("Booted Epiq",void 0))}catch(e){return Bt(0,Tr(e))}}yf();var RN=`${jt.bold("Epiq CLI")}
|
|
92
|
+
`,Fd.writeFileSync(t,n,"utf8"),oe.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),u("Local epiq paths ignored",!0)};var HC=async e=>{let t=await U({cwd:e,args:["status","--porcelain"]});return a(t)?t:u("Checked git diff",t.value.stdout.split(`
|
|
93
|
+
`).filter(n=>n.trim().length>0).map(n=>n.slice(3)))},de=(e,t)=>c(`[${e}] ${t}`),Kh=async({cwd:e,user:t})=>{let n=Ri(),r=await zt(e);if(a(r))return de(1,r.message);let o=r.value,s=await Ai(o);if(a(s))return de(2,s.message);if(s.value)return de(2,`Cannot initialize Epiq while a git operation is in progress: ${s.value}`);let i=await HC(o);if(a(i))return de(2.5,i.message);if(i.value.length>0)return de(3,`Cannot initialize Epiq with uncommitted changes (${i.value.join(", ")}). Commit or stash your changes first.`);if(is(o))return de(4,"Epiq project already initialized");let{userId:l,userName:d}=t;if(!l||!d)return de(5,"Missing Epiq user id");let p=await Ef(o);if(a(p))return de(6,p.message);let m=n.stateBranch,f=await Ti({repoRoot:o,branch:m});if(a(f))return de(6,f.message);if(f.value)return de(6,`State branch already exists: ${m}`);let g=await WC({repoRoot:o,stateBranch:m});if(a(g))return de(6,g.message);if(g.value)return GC({repoRoot:o,stateBranch:m});let v=await Oc({repoRoot:o,stateBranchName:m});if(a(v))return de(6,v.message);let x=rs();if(a(x))return de(7,x.message);let b=_d.join(wr(),n.projectId),R=await lr({repoRoot:o,stateBranchRoot:b,stateBranchName:m});if(a(R))return de(8,R.message);let S=_d.join(b,".epiq");UC.mkdirSync(S,{recursive:!0});let A=uf({userId:l,userName:d});if(a(A))return de(9,A.message);for(let ft of A.value){let no=Vp({event:ft,rootDir:b});if(a(no))return de(9,no.message)}let T=or({userId:l}),P=Wi(b,T);if(a(P))return de(9,P.message);let M=Bc(b,n);if(a(M))return de(9,M.message);let O=await aa({stateBranchRoot:b,eventFileName:T});if(a(O))return de(10,O.message);let W=await Ae.stage({cwd:b,pathspec:[ct]});if(a(W))return de(10,W.message);let J=await ao({cwd:b,message:"[epiq:init]"});if(a(J))return de(10,J.message);let Ee=await zh(o);if(a(Ee))return de(11,Ee.message);let F=Ul({repoRoot:o,fileContents:n});if(a(F))return de(12,F.message);let X=await Ae.stage({cwd:o,pathspec:[".epiq/project.json",".gitignore"]});if(a(X))return de(13,X.message);let rt=await Ae.commit({cwd:o,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(a(rt))return de(13,rt.message);let Yn=[],Jo=await U({cwd:o,args:["push","-u","origin","HEAD"]});a(Jo)&&Yn.push(`[init:14] ${Jo.message}`);let it=await Ss({repoRoot:o,stateBranchRoot:b});return a(it)&&Yn.push(`[init:15] ${it.message}`),u("Project initialized",{repoRoot:o,projectId:n.projectId,stateBranch:m,stateBranchRoot:b,defaultEvents:A.value,warnings:Yn})},WC=async({repoRoot:e,stateBranch:t})=>{let n=await kn({repoRoot:e});if(a(n))return c(n.message);if(!n.value)return u("No remote",!1);let r=await Zo({repoRoot:e,branch:t});return a(r)?c(`Could not ask origin whether ${t} exists: ${r.message}`):r},GC=async({repoRoot:e,stateBranch:t})=>{let n=await U({cwd:e,args:["fetch","origin",t]});if(a(n))return de(6,n.message);let r=await U({cwd:e,args:["show",`origin/${t}:${ct}`]});if(a(r))return de(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",`${ct} from a checkout that has it, for example:`,"",` git show origin/main:${ct} > ${ct}`,"","and commit it; every later boot then stamps the branch, and the next clone adopts it."].join(`
|
|
94
|
+
`));let o;try{o=JSON.parse(r.value.stdout)}catch(x){return de(6,`The identity on origin/${t} is not readable: ${x instanceof Error?x.message:String(x)}`)}let s=Ul({repoRoot:e,fileContents:o});if(a(s))return de(12,s.message);let i=await Ae.stage({cwd:e,pathspec:[ct]});if(a(i))return de(13,i.message);let l=await Ae.commit({cwd:e,message:"[epiq:adopt-project]",pathspec:[ct]});if(a(l))return de(13,l.message);let d=rs();if(a(d))return de(7,d.message);let p=_d.join(wr(),o.projectId),m=await Es({repoRoot:e,stateBranchName:t});if(a(m))return de(8,m.message);let f=await lr({repoRoot:e,stateBranchRoot:p,stateBranchName:t});if(a(f))return de(8,f.message);let g=[],v=await U({cwd:e,args:["push","-u","origin","HEAD"]});return a(v)&&g.push(`[init:14] ${v.message}`),u("Adopted the project origin already holds",{repoRoot:e,projectId:o.projectId,stateBranch:o.stateBranch,stateBranchRoot:p,defaultEvents:[],warnings:g})};var Us=(e,t)=>c(`[${e}] ${t}`),qh=async()=>{Z("");let e=Hn();if(!e.isSetupDone||!e.userName)return Us(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let t=V(),n=t.userName,r=t.userId;if(!r||!n)return Us(5,"Missing Epiq user id");let o=await Kh({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 l=Xt(o.value.defaultEvents).filter(a);if(l.length>0)return Us(16,l.map(g=>g.message).join(`
|
|
95
|
+
`));let d=Ie();if(a(d))return Us(16,d.message);let{rootNodeId:p,nodes:m}=d.value,f=m[p];return f?($.navigate({contextNode:f,selectedIndex:0}),w({hasProjectDefinition:!0}),u(s,null)):Us(16,"Unable to resolve initialized root node")};import{ulid as zC}from"ulid";import{ulid as VC}from"ulid";var Yh=null,rn=()=>structuredClone(Yh),Hs=e=>{Yh=e},Xh=()=>{let{contextNode:e,selectedIndex:t}=y(),r=xe(e.id)[t];return r?u("Resolved selected child",r):c("Target node not found")},jd=({id:e,parentId:t,position:n={at:"end"}})=>{let r=xe(t).filter(o=>o.id!==e);return ta(r,n)},Jh=({id:e,parentId:t,position:n={at:"end"}})=>{let r=pe();if(a(r))return c("Unable to resolve user ID");let o=jd({parentId:t,id:e,position:n});return a(o)?o:u("Created pending move state",{id:VC(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Qh=e=>{Hs(e);let t=vs(e,!0);return a(t)?t:u("Node moved successfully",t.value)};function $d(e){let t=Xh();if(a(t))return t;let{contextNode:n,nodes:r}=y();if(!n.parentNodeId)return c("Missing parent node id");let o=r[n.parentNodeId];if(!o)return c("Missing parent node");let s=xe(o.id),i=s.findIndex(({id:p})=>p===n.id);if(i<0)return c("Current node not found among siblings");let l=s[i+e];if(!l)return c("Missing sibling node");let d=Jh({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(d)?d:Qh(d.value)}function Ws(e,t=1){let n=Xh();if(a(n))return n;let{contextNode:r,selectedIndex:o}=y(),s=xe(r.id),i=Math.min(Math.max(o+e*t,0),s.length-1),l=i===o?void 0:s[i];if(!l)return c("Missing sibling node");let d=Jh({id:n.value.id,parentId:r.id,position:{at:e===1?"after":"before",sibling:l.id}});return a(d)?d:Qh(d.value)}var Zh=()=>{let e=rn();if(!e)return c("No pending move state");let t=e.payload.id,n=e.payload.parent,r=y().nodes[n];if(!r)return c("Move parent not found");let o=xe(n).findIndex(s=>s.id===t);return o===-1?c("Moved node not found among rendered children"):($.navigate({contextNode:r,selectedIndex:o}),u("Synchronized navigation to moved node",null))},_o=(e,t="Moved preview")=>{if(a(e))return rn()&&w({mode:I.MOVE}),e;let n=Zh();return a(n)?n:(w({mode:I.MOVE}),u(t,null))},ey=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{modifier:t}=ie().commandMeta,{contextNode:n,selectedIndex:r}=y(),o=xe(n.id)[r];if(!o)return w({mode:I.DEFAULT}),c("No move target");if(t==="start"){if(o.readonly)return c("Target node is read-only");if(r===-1)return c("No item selected");if(!o.parentNodeId)return c("Target has no parent");let s=xe(o.parentNodeId),i=s.findIndex(({id:f})=>f===o.id);if(i===-1)return c("Target not found among siblings");let l=s[i-1],d=s[i+1],p=d!=null?{at:"before",sibling:d.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},m=jd({parentId:o.parentNodeId,id:o.id,position:p});return a(m)?m:(Hs({id:zC(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:m.value.rank},...D(e.value)}),w({mode:I.MOVE}),u("Move initialized",null))}if(t==="next")return _o(Ws(1));if(t==="previous")return _o(Ws(-1));if(t==="jump-next")return _o(Ws(1,bs));if(t==="jump-previous")return _o(Ws(-1,bs));if(t==="to-next")return _o($d(1));if(t==="to-previous")return _o($d(-1));if(t==="confirm"){let s=rn();if(!s)return c("No pending move to confirm");let i=await Se();if(a(i))return i;let l=B([s],i.value);if(a(l))return l;let d=Zh();return a(d)?d:(Hs(null),w({mode:I.DEFAULT}),u("Moved item",null))}return t==="cancel"?(Hs(null),w({mode:I.DEFAULT}),u("Cancelling move",null)):c("Invalid move modifier")};import{ulid as Ga}from"ulid";import{monotonicFactory as KC,ulid as qC}from"ulid";var YC=KC(),Wa=({name:e,parent:t,rank:n,user:{userId:r}})=>{let o=YC();return u("Created issue events",[{id:qC(),userId:r,action:"add.issue",payload:{id:o,parent:t,name:e,rank:n}}])};var ty=async(e,t)=>{let n=pe();if(a(n))return c("Unable to resolve user ID");let r=await Se();if(a(r))return r;let o=r.value;if(!t.inputString)return c(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:l}=y(),d=p=>{let m=B([p],o);if(a(m))return m;let f=N.getNode(m.value[0].result.id);if(!f)return c("Created node not found");if(!f.parentNodeId)return m;let g=N.getNode(f.parentNodeId);return g?($.navigate({contextNode:g,selectedIndex:N.getSiblings(f.parentNodeId).findIndex(({id:v})=>v===f.id)}),m):c("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:p}=y(),m=N.getNode(p);if(!m)return c("Workspace not found");let f=_n(m.id,n.value,o);return a(f)?f:d({id:Ga(),action:"add.board",payload:{id:Ga(),name:t.inputString,parent:m.id,rank:f.value},...D(n.value)})}if(t.modifier==="swimlane"){let p=ht(s,"BOARD");if(a(p))return c("Unable to add swimlane in this context");let m=_n(p.value.id,n.value,o);return a(m)?m:d({id:Ga(),action:"add.swimlane",payload:{id:Ga(),name:t.inputString,parent:p.value.id,rank:m.value},...D(n.value)})}if(t.modifier==="issue"){let p=ce(i.id)[l],m=i.context==="SWIMLANE"?i:i.context==="BOARD"&&p?.context==="SWIMLANE"?p:(()=>{let A=ht(s,"SWIMLANE");return a(A)?null:A.value})();if(!m)return c("Unable to add issue in this context");let f=_n(m.id,n.value,o);if(a(f))return f;let g=Wa({name:t.inputString,parent:m.id,rank:f.value,user:n.value});if(a(g))return g;let v=g.value,x=B([...v],o);if(a(x))return x;if(!x.value[0])return c("Issue creation failed");let S=v.find(A=>A.action==="add.issue")?.payload.id;return S?($.navigate({contextNode:m,selectedIndex:N.getSiblings(m.id).findIndex(({id:A})=>A===S)}),u("Issue created",null)):c("Unable to determine ticket id")}return u("Success",null)};import oN from"node:os";import ly from"node:path";import Gs from"node:fs";import XC from"node:path";import{z as Wr}from"zod";var Vs="command-history.json",JC=20,QC=Wr.object({projectId:Wr.string().min(1),commands:Wr.array(Wr.string()),lastUsedAt:Wr.number().finite()}),ZC=Wr.object({projects:Wr.array(QC)}),ny=()=>{let e=_s();return a(e)?e:u("Resolved command history path",XC.join(e.value,Vs))},eN=()=>{try{let e=me(process.cwd());return a(e)?null:e.value}catch{return null}},ry=e=>{if(!Gs.existsSync(e))return u("No command history recorded",{state:"read",projects:[]});let t;try{t=Gs.readFileSync(e,"utf8")}catch(o){return c(`Unable to read ${Vs}: ${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 ${Vs}: ${o instanceof Error?o.message:String(o)}`})}let r=ZC.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 ${Vs} shape: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`})},oy=({root:e})=>{let t=cn(e);if(a(t))return c(t.message);let n=ny();if(a(n))return n;let r=ry(n.value);if(a(r))return r;let o=r.value;if(o.state==="corrupt")return c(o.reason);let s=o.projects.find(i=>i.projectId===t.value);return u("Read command history",s?.commands.slice(0,Ps)??[])},sy=({commands:e,root:t=eN(),now:n=Date.now()})=>{if(t===null)return u("No project; command history not stored",null);let r=cn(t);if(a(r))return c(r.message);let o=ny();if(a(o))return o;let s=o.value,i=ry(s);if(a(i))return i;let l=i.value,d=l.state==="read"?l.projects:[],p=[{projectId:r.value,commands:e.slice(0,Ps),lastUsedAt:n},...d.filter(f=>f.projectId!==r.value)].sort((f,g)=>g.lastUsedAt-f.lastUsedAt).slice(0,JC),m=`${s}.${process.pid}.tmp`;try{Gs.writeFileSync(m,JSON.stringify({projects:p},null,2)+`
|
|
96
|
+
`,"utf8"),Gs.renameSync(m,s)}catch(f){try{Gs.rmSync(m,{force:!0})}catch{}return c(`Unable to write ${Vs}: ${f instanceof Error?f.message:String(f)}`)}return u("Stored command history",null)};var tN=e=>e.some(t=>t.action==="init.workspace"),iy=async(e,t)=>{let n=Qe(e);return a(n)?c(n.message):ts({cwd:t,branch:n.value})},nN=e=>{let t=me(process.cwd());if(a(t))return!1;let n=ge({repoRoot:t.value});return!a(n)&&n.value===e},Va=async e=>{let t=ge({repoRoot:e});if(a(t))return Zt(3,t.message);let n=t.value,r=await lr({repoRoot:e,stateBranchRoot:n,stateBranchName:Ri().stateBranch});if(a(r))return Zt(3,r.message);let o=Jt(n);if(a(o))return Zt(3,o.message);if(!tN(o.value.events)){let m=await iy(e,n);if(a(m)&&logger.info(3,m.message),o=Jt(n),a(o))return Zt(3,o.message)}let{events:s,unreadable:i}=o.value,l=Qt(s,i);if(a(l))return Zt(4,l.message);w({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let d=fa({root:e});a(d)&&logger.info(d.message);let p=oy({root:e});return a(p)&&logger.info(p.message),Rg(a(p)?[]:p.value),u("Loaded project",void 0)},rN=async e=>{let t=ge({repoRoot:e});if(a(t))return c(t.message);let n=t.value,r=await kn({repoRoot:n});if(a(r))return c(r.message);if(!r.value)return u("No remote to pull",void 0);let o=await ca({worktreeRoot:n,operation:"boot pull",fn:()=>$c(n,()=>(fo("Pulling"),iy(e,n)))});if(a(o))return He(o.message);if(o.value===null)return u("Another process holds the state worktree",void 0);let s=o.value;if(a(s))return es(s.message)?(sa("Offline"),u("Offline",void 0)):He(s.message);if(!s.value)return Br("Already synced"),u("Already synced",void 0);if(!nN(n))return u("Project changed during the pull",void 0);let i=Uc(n);return a(i)?i:(Br("Pulled"),u("Pulled and reloaded",void 0))},za=e=>{rN(e).then(t=>{a(t)&&logger.info(3,t.message)}).catch(t=>{logger.error(`[boot] pull failed: ${go(t)}`)})},ay=()=>{let e=Qt([]);return a(e)?Zt(4,e.message):(w({hasProjectDefinition:!1,hasInitializingEvents:!1}),u("Booted without a project",void 0))};var sN=e=>e==="~"||e.startsWith("~/")?ly.join(oN.homedir(),e.slice(1)):e,iN=(e,t)=>{let n=e.trim();if(!n)return c("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):c(`No recent project #${n}`)}let r=me(ly.resolve(sN(n)));return a(r)?c(`No epiq project at ${n}`):u("Resolved project path",r.value)},cy=async()=>{let e=Sa();if(Z(""),y().hasProjectDefinition)return c("Already in a project; run epiq from another directory");let t=Un({exclude:process.cwd()}),n=a(t)?[]:t.value,r=iN(e,n);if(a(r))return c(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(l){return c(`Unable to enter ${o}: ${l instanceof Error?l.message:String(l)}`)}let i=await Va(o);return a(i)?(process.chdir(s),c(i.message)):(za(o),u(`Opened ${bo(o)}`,null))};var Ka=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=y(),s=Zi(n,t);if(a(s))return c(s.message);let{appliedEvents:i,unappliedEvents:l}=s.value,d=on();if(a(d))return d;let p=Xt(i),{fatal:m,skipped:f}=fn(p);if(m.length>0)return on(),w(o),c(m.map(v=>v.message).join(", "));gn(f);let g=y().nodes[e];return g?($.navigate({contextNode:g,selectedIndex:r}),u("",{unappliedEvents:l})):(on(),w(o),c("Board did not exist at that date"))};var dy=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 aN=20,lN=16,cN=150,qa=null,Ya=null;var Gr=()=>{qa!==null&&(clearInterval(qa),qa=null),Ya!==null&&(clearTimeout(Ya),Ya=null)},uy=()=>{Gr(),w({mode:I.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},my=({events:e,startTime:t,durationMs:n})=>{Gr();let r=e.length,o=co(e.map(f=>Zn(f))).map(f=>f??t),s=o[r-1]??Date.now(),i=dy(o),l=Math.max(1,Math.round(n*aN/1e3)),d=Math.max(Math.round(n/l),lN),p=0,m=0;w({mode:I.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),qa=setInterval(()=>{p++;let f=p/l,g=[],v,x;for(;m<r&&i[m]<=f;){let R=e[m],S=vs(R);if(a(S)){if(po(S)){m++;continue}uy();return}g.push(...Mc(R)),v=R,x=o[m],m++}if(m>=r||p>=l){for(;m<r;m++){let S=vs(e[m]);if(a(S)&&!po(S))break}let R=y().replay;w({unappliedEvents:[],replay:R&&{...R,progress:1,appliedCount:r}}),Gr(),Ya=setTimeout(uy,cN);return}let b=y().replay;w({unappliedEvents:e.slice(m),replay:{progress:Math.min(1,f),appliedCount:m,totalCount:r,startTime:t,endTime:s,currentTime:v?x??b?.currentTime??t:b?.currentTime??t,currentLabel:v?Xa(v):b?.currentLabel??"",flashNodeIds:v?[...new Set(g)]:b?.flashNodeIds??[]}})},d)};var py=async()=>{let e=ht(y().breadCrumb,"BOARD");if(a(e))return e;let t=await zt(process.cwd());if(a(t))return c("Unable to locate repo root");let n=ge({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=ie().commandMeta;if(Gr(),r==="now"){let l=ar(n.value);if(a(l))return c(l.message);let d=on();if(a(d))return d;let p=Xt(l.value),{fatal:m,skipped:f}=fn(p);return m.length>0?c(m.map(g=>g.message).join(", ")):(gn(f),w({mode:I.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let l=ea(n.value);if(a(l))return l;let d=r==="prev"?y().eventLog.at(-1):y().unappliedEvents.at(0),p=d===void 0?null:Zn(d),m=(d===void 0?null:l.value.get(d.id)??null)??(p===null?null:ls(p));if(m===null)return c(r==="prev"?"No previous event to peek":"No next event to peek");s=r==="prev"?m:m+1}else{let l=Or(r||o.trim());if(!l)return c("Invalid peek date");s=l.getTime()}let i=Ka({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return a(i)?i:(w({mode:I.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),u("Peeking",!0))};var fy=async()=>{let e=ht(y().breadCrumb,"BOARD");if(a(e))return e;let t=await zt(process.cwd());if(a(t))return c("Unable to locate repo root");let n=ge({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=ie().commandMeta,{dateInput:s,durationInput:i}=va(r,o);if(Gr(),y().syncStatus.status==="syncing")return c("Cannot replay while syncing, try again in a moment");let l=Or(s);if(!l)return c("Invalid replay date");let d=i?ya(i):15e3;if(d===null)return c("Invalid replay duration (try e.g. 30s or 2m)");let p=l.getTime(),m=y(),f=Ka({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?(on(),w(m),u("Nothing to replay from that point",!0)):(my({events:g,startTime:p,durationMs:d}),u("Replaying board history",!0))};import{spawn as uN}from"node:child_process";var mN=()=>{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"]}}},gy=async e=>new Promise(t=>{let{command:n,args:r}=mN();try{let o=uN(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(c(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?u("Copied to clipboard",null):c(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(c(`Clipboard tool not available (${n})`))}});var zs=async(e,t)=>{if(!e.trim())return c(`Nothing to copy: ${t} is empty`);let n=await gy(e);return a(n)?n:u(`Copied ${t} to clipboard`,null)},hy=async e=>{let{breadCrumb:t,selectedNode:n}=y(),r=As({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return c("Nothing selected to copy from");switch(e.modifier){case qe.REF:return zs(H(o.id),"ref");case qe.TITLE:return zs(o.title,"title");case qe.DESCRIPTION:return r?zs(r.props?.description??"","description"):c("No issue in scope");case qe.TAGS:{if(!r)return c("No issue in scope");let s=xn(r).map(({name:i})=>i);return zs(s.join(", "),"tags")}case qe.ASSIGNEES:{if(!r)return c("No issue in scope");let s=In(r).map(({name:i})=>i);return zs(s.join(", "),"assignees")}default:return c("Yank one of: ref, title, description, tags, assignees")}};var yy=async()=>{Z(""),w({mode:I.DEFAULT});let e=Ie();if(a(e))return c(e.message);if(e.value.syncStatus.status==="syncing")return c("Sync already in progress");w({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await ua();return a(t)?(w({syncStatus:{msg:t.message,status:"failed"}}),t):(w({mode:I.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{ulid as vy}from"ulid";var by=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=y(),r=ce(t.id)[n];if(!r)return c("Unable to resolve child to delete");let o=await Se();if(a(o))return o;if(r.context==="COMMENT"){let s=r.id,i=_(t)?t.id:t.parentNodeId;if(!i)return c("Unable to resolve comment issue");let l=y().nodes[i];if(!l||!_(l))return c("Unable to resolve comment issue");let d=l.log?.filter(Ug).find(p=>p.payload.id===s);return d?d.payload.author!==e.value.userId?c("You can only delete your own comments"):B([{id:vy(),action:"delete.issue.comment",payload:{id:s,issue:i},...D(e.value)}],o.value):c("Unable to resolve comment")}return B([{id:vy(),action:"delete.node",payload:{id:r.id},...D(e.value)}],o.value)};import{ulid as pN}from"ulid";var xy=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=y(),r=ce(t.id)[n];if(!r)return c("Unable to close issue, no target found");if(!_(r))return c("Cannot close in this context");let o=y().nodes[he];if(!o)return c("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return c("Issue is already closed");let s=await Se();if(a(s))return s;let i=s.value,l=hn(o.id,r.id,{at:"end"},e.value,i);if(a(l))return l;let d=B([{id:pN(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...D(e.value)}],i);return a(d)?d:u("Issue closed",null)};import{ulid as fN}from"ulid";var Ja=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 Iy=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=y(),r=ce(t.id)[n];if(!r)return c("Unable to reopen issue, no target found");let o=r.context==="TICKET"?u("Resolved ticket",r):Nt(r.id,"TICKET");if(a(o))return c("Cannot reopen in this context");let s=o.value,i=y().nodes[he];if(!i)return c("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return c("Issue is not closed");if(!_(s))return c("Target node is not issue");let l=Ja(s);if(!l)return c("Unable to resolve previous parent from issue history");if(l===i.id)return c("Previous parent resolves to closed swimlane");let d=y().nodes[l];if(!d)return c("Previous parent no longer exists");let p=await Se();if(a(p))return p;let m=p.value,f=hn(d.id,s.id,{at:"end"},e.value,m);if(a(f))return f;let g=B([{id:fN(),action:"reopen.issue",payload:{id:s.id,parent:d.id,rank:f.value},...D(e.value)}],m);return a(g)?g:u("Issue reopened",null)};import{ulid as gN}from"ulid";var Ey=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=y(),r=ce(t.id)[n];if(!r)return c("Missing node");if(r.readonly)return c("Cannot rename readonly node");let o=Sa();if(!o)return c("Provide a title");let s=await Se();return a(s)?s:B([{id:gN(),action:"edit.title",payload:{id:r.id,name:o},...D(e.value)}],s.value)};import{ulid as hN}from"ulid";var Sy=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{modifier:t,inputString:n}=ie().commandMeta,r=(t||n).trim();if(!r)return c("Provide a tag");let o=N.findTagByName(r);if(!o)return c(`Tag "${r}" does not exist`);let{selectedNode:s}=y();if(!s)return c("Invalid untag target");let i=Nt(s.id,"TICKET");if(a(i))return c("Unable to untag issue in this context");let l=i.value;if(!_(l))return c("Target node is not issue");if(!(l.props.tags??[]).includes(o.id))return c("Issue is not tagged with that tag");let p=await Se();return a(p)?p:B([{id:hN(),action:"remove.issue.tag",payload:{id:l.id,tag:o.id},...D(e.value)}],p.value)};import{ulid as Ud}from"ulid";var Ry=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{modifier:t,inputString:n}=ie().commandMeta,r=(t||n).trim();if(!r)return c("Provide a tag");let{selectedNode:o}=y();if(!o)return c("Invalid tag target");let s=Nt(o.id,"TICKET");if(a(s))return c("Unable to tag issue in this context");let i=s.value;if(!_(i))return c("Target node is not issue");let l=await Se();if(a(l))return l;let d=N.findTagByName(r),p=d?.id??Ud();return(i.props.tags??[]).includes(p)?c("Already tagged with that tag"):B([...d?[]:[{id:Ud(),action:"create.tag",payload:{id:p,name:r},...D(e.value)}],{id:Ud(),action:"add.issue.tag",payload:{id:i.id,tag:p},...D(e.value)}],l.value)};import{ulid as Hd}from"ulid";var Ks=({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)}))},Cy=({authorName:e,authorEmail:t,owners:n,registry:r})=>{let o=Ze(t),s=n.get(o),i=s?r[s]:void 0;return s?{...Ke(s,i?.name),resolved:!0}:{...Ke(o||e,e),resolved:!1}};var Qa=e=>{let{eventLog:t=[],contributors:n}=y();return Ks({events:t,registry:n,logFileNames:ir(e)})};var Ny=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{modifier:t,inputString:n}=ie().commandMeta,r=(t||n).trim();if(!r)return c("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return c("Provide an assignee");let{selectedIndex:i,contextNode:l}=y(),d=ce(l.id)[i];if(!d)return c("Invalid assign target");let p=Nt(d.id,"TICKET");if(a(p))return c("Unable to assign issue in this context");let m=p.value;if(!_(m))return c("Target node is not issue");let f=await Se();if(a(f))return f;let g=Qa(f.value),v=!o&&s.toLowerCase()==="me",x,b;if(v)x=e.value.userId,b=g.find(A=>A.id===x)?.name??e.value.userName;else{let A=g.filter(P=>P.name===s);if(A.length>1)return c(`"${s}" matches ${A.length} contributors (${A.map(P=>P.id).join(", ")}). Assign from the GUI to choose by id.`);let T=A[0];if(!T&&!o)return c(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);x=T?.id??Hd(),b=T?.name??s}if((m.props.assignees??[]).includes(x))return c("Assignee already assigned");let S=!!y().contributors[x];return B([...S?[]:[{id:Hd(),action:"create.contributor",payload:{id:x,name:b},...D(e.value)}],{id:Hd(),action:"add.issue.assignee",payload:{id:m.id,assignee:x},...D(e.value)}],f.value)};import{ulid as yN}from"ulid";var Ay=async()=>{let e=pe();if(a(e))return c("Unable to resolve user ID");let{modifier:t,inputString:n}=ie().commandMeta,r=(t||n).trim();if(!r)return c("Provide an assignee to remove");let{selectedNode:o}=y();if(!o)return c("Invalid unassign target");let s=Nt(o.id,"TICKET");if(a(s))return c("Unable to unassign in this context");let i=s.value;if(!_(i))return c("Target node is not issue");let l=i.props.assignees??[],d=r.toLowerCase()==="me",p=await Se();if(a(p))return p;let m=d?l.filter(g=>g===e.value.userId):Qa(p.value).filter(g=>g.name===r&&l.includes(g.id)).map(g=>g.id);if(m.length>1)return c(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let f=m[0];return f?B([{id:yN(),action:"remove.issue.assignee",payload:{id:i.id,assignee:f},...D(e.value)}],p.value):c(d?"Issue is not assigned to you":`Issue is not assigned to "${r}"`)};import{ulid as Ty}from"ulid";var vN=e=>{let t=e.trim(),n=fr(),r=n?yh(t):null;if(!n||!r)return{ok:!0,md:t,anchored:!1};let o=_a();if(!o||o.sha!==n)return{ok:!1,reason:"No diff is open"};let s=vh(o.rows,Math.max(0,y().selectedIndex));if(!s)return{ok:!1,reason:"That line is not in a file"};let i=bh(o.rows,s,r.start,r.end);return i.ok?{ok:!0,anchored:!0,md:Jg({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}},wy=async e=>{let t=vN(e.inputString);if(!t.ok)return c(t.reason);let{md:n,anchored:r}=t;if(!n)return c("Provide a comment");if(n.length>4e3)return c(r?`The note and the ${n.length} characters of quoted lines exceed ${4e3}; comment on fewer lines`:`Cannot exceed ${4e3} characters`);let o=pe();if(a(o))return c("Unable to resolve user ID");let{breadCrumb:s,selectedNode:i}=y(),l=ht([...s,i],"TICKET");if(a(l))return c("Edit target must be an issue");let d=l.value;if(!d)return c("Invalid comment target");let p=d.context==="TICKET"?u("Resolved ticket",d):Nt(d.id,"TICKET");if(a(p))return c("Unable to comment on issue in this context");let m=p.value;if(!_(m))return c("Target node is not issue");let f=await Se();if(a(f))return f;let g=await B([{id:Ty(),action:"add.issue.comment",payload:{id:Ty(),issue:m.id,author:o.value.userId,md:n},...D(o.value)}],f.value);return r&&!a(g)&&Ur(null),g};import{ulid as RN}from"ulid";import bN from"zod";var My=()=>{let e=ie().commandMeta.inputString,t=bN.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return c("Auto sync duration must be a number of at least 3000 ms");let n=Et({autoSyncDebounceMs:t.data});return a(n)?n:(ke({autoSyncIntervalMs:t.data}),u(`Auto sync interval set to ${t.data}ms`,null))};var Py=()=>{let e=ie().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return c("Invalid response");let t=zf(e),n=Et({autoSync:t});return a(n)?n:(ke({autoSync:t}),u(`Auto sync set to "${e}"`,null))};import{ulid as EN}from"ulid";var Wd=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=2),Ly="",ky=new Map,xN=15e3;var IN=async(e,t)=>{let n=`${e} ${t??""}`,r=ky.get(n);if(r&&Date.now()-r.at<xN)return u("Cached author scan",r.authors);let o=await Be({cwd:e,args:["log","--branches",...t?["--not",t]:[],`--format=%an${Ly}%ae`]});if(o.exitCode!==0)return c(`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(`
|
|
97
|
+
`)){let l=i.lastIndexOf(Ly);if(l===-1)continue;let d=i.slice(0,l),p=Ze(i.slice(l+1));if(!er(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 ky.set(n,{at:Date.now(),authors:s}),u("Scanned repository authors",s)},yr=async({repoRoot:e,stateBranch:t,names:n,links:r})=>{let o=await IN(e,t);if(a(o))return c(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 l=new Set(n.flatMap(d=>Wd(d??"")));return u("Found candidates",[...s.entries()].map(([d,p])=>({email:d,names:[...p.names],commits:p.commits,looksLikeYours:[...p.names].some(m=>Wd(m).some(f=>l.has(f)))||Wd(d.split("@")[0]??"").some(m=>l.has(m)),claimedBy:[...i.get(d)??[]]})).sort((d,p)=>d.looksLikeYours===p.looksLikeYours?p.commits-d.commits:Number(p.looksLikeYours)-Number(d.looksLikeYours)))},vr=e=>e.filter(t=>t.claimedBy.length===0);var Dy=()=>{let e=zc();if(!e)return u("Nothing here to decline",null);let t=Qn(),n=a(t)?[]:t.value.declinedEmailBoards??[],r=[...new Set([...n,e])],o=Et({declinedEmailBoards:r});return a(o)?c(o.message):(ke({declinedEmailBoards:[...new Set([...V().declinedEmailBoards??[],e])]}),u("Declined",null))},By=async()=>{let e=ie().commandMeta.inputString.trim();if(e==="none"){let R=Dy();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}=V();if(!t)return c("Set a username first with :config username");let o=Ie();if(a(o))return c("Board is not loaded");let s=me(process.cwd());if(a(s))return c(s.message);let i=Qe(s.value),l=await yr({repoRoot:s.value,stateBranch:a(i)?void 0:i.value,names:[n,r],links:o.value.emailLinks});if(a(l))return l;let p=vr(l.value);if(xo(p.map(R=>R.email)),p.length===0){if(!Gf()){let R=Dy();if(a(R))return R}return u("No unclaimed addresses in this history.",null)}if(!e)return w({mode:I.IDENTITY}),u("Opened identity",null);let m=e.split(/[,\s]+/).filter(Boolean),f=[],g=[];for(let R of m){let S=p.find(A=>A.email===Ze(R));if(!S){g.push(R);continue}f.includes(S)||f.push(S)}if(g.length>0)return c(`Not on the list: ${g.join(", ")}. Pick one of ${p.map(R=>R.email).join(", ")}.`);let v=ge({repoRoot:s.value});if(a(v))return v;let x=f.map(R=>({id:EN(),action:"link.contributor.email",payload:{contributor:t,email:R.email},userId:t})),b=B(x,v.value);return a(b)?c(b.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 SN}from"ulid";var Oy=()=>{let e=ie().commandMeta.inputString.trim(),{userId:t}=V();if(!t)return c("Set a username first with :config username");let n=Ie();if(a(n))return c("Board is not loaded");let r=un(n.value.emailLinks,t);if(r.length===0)return c("You have not claimed any addresses.");if(!e)return c(`Which one? ${r.join(", ")}.`);let o=r.find(d=>d===Ze(e));if(!o)return c(`You have not claimed ${e}. Yours: ${r.join(", ")}.`);let s=me(process.cwd());if(a(s))return s;let i=ge({repoRoot:s.value});if(a(i))return i;let l=B([{id:SN(),action:"unlink.contributor.email",payload:{contributor:t,email:o},userId:t}],i.value);return a(l)?c(l.message):u(`Unclaimed ${o}`,null)};var Fy=()=>{let e=ie().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return c("Invalid response");let n=Et({logLevel:e});return a(n)?n:(ke({logLevel:e}),u(`Auto sync set to "${e}"`,null))};var _y=e=>{let t=e.inputString.trim();switch(e.modifier){case ve.USERNAME:{if(process.env[wn])return c(`Cannot change the configured user while ${wn} names this process`);let n=Qn();if(a(n))return n;let{userId:r,preferredEditor:o,userName:s}=n.value,i=t||s,l=r||RN();if(!i||!l)return c("Unable to resolve user name or id");let d=Et({userName:i,userId:l,preferredEditor:o??""});return a(d)?d:(ke({userName:i,userId:l}),u(`Username set to "${i}"`,null))}case ve.EDITOR:{if(!t)return c("No editor provided");let n=Et({preferredEditor:t});return a(n)?n:(ke({preferredEditor:t}),u(`Editor configuration set to "${t}"`,null))}case ve.VIEW:{if(t!=="wide"&&t!=="dense")return c("Invalid view mode");let n=Et({viewMode:t});return a(n)?n:(ke({viewMode:t}),u(`View set to "${t}"`,null))}case ve.EMAILS:return By();case ve.EMAILS_UNCLAIM:return Oy();case ve.AUTOSYNC:return Py();case ve.LOG_LEVEL:return Fy();case ve.SYNC_DEBOUNCE_MS:return My();case ve.ATTACHMENT_MAX_KB:return ag();default:return c("Unknown config command")}};var Gd=()=>{let e=Kf(),t=y().mode;if(!(t!==I.COMMAND_LINE&&t!==I.DEFAULT)){if(!e){w({mode:I.DEFAULT});return}w({mode:I.COMMAND_LINE}),Z(e)}};var Za=[{systemOnly:!0,intent:G.Move,description:"Internal move-state command",mode:I.COMMAND_LINE,action:ey},{intent:G.Delete,description:"Delete the currently selected node",mode:I.COMMAND_LINE,action:by,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:I.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ie().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(i=>_e(C.FILTER).map(l=>l.split(n)[0]).includes(i))(r))return c("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return Fe(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:I.DEFAULT})),u("Filter updated",null)}},{intent:G.ViewHelp,description:"Open the help screen",mode:I.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=y();return hr({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),w({mode:I.HELP}),u("Viewing help",null)}},{intent:G.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:I.COMMAND_LINE,action:xy,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:I.COMMAND_LINE,action:Iy,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Init,description:"Initialize Epiq in the current git repository",mode:I.COMMAND_LINE,action:qh,onSuccess:Gd},{intent:G.OpenProject,description:"Open a recently used epiq project, by number or path",mode:I.COMMAND_LINE,action:cy,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.NewItem,description:"Create a new board, swimlane, or issue",mode:I.COMMAND_LINE,action:ty,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Rename,description:"Rename the currently selected node",mode:I.COMMAND_LINE,action:Ey,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.UntagTicket,description:"Remove a tag from the selected issue",mode:I.COMMAND_LINE,action:Sy,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.TagTicket,description:"Add or create a tag on the selected issue",mode:I.COMMAND_LINE,action:Ry,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.AssignUserToTicket,description:"Assign a user to the selected issue",mode:I.COMMAND_LINE,action:Ny,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:I.COMMAND_LINE,action:Ay,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Comment,description:"Add a comment to the selected issue",mode:I.COMMAND_LINE,action:async(e,t)=>wy(t),onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Sync,description:"Pull, commit, and push Epiq state",mode:I.COMMAND_LINE,action:yy},{intent:G.Peek,description:"View board state at another point in time",mode:I.COMMAND_LINE,action:py},{intent:G.Replay,description:"Replay board history forward from a point in time",mode:I.COMMAND_LINE,action:fy},{intent:G.Export,description:"Export the current board layout to markdown",mode:I.COMMAND_LINE,action:async()=>{let e=await Hh();return a(e)?e:(w({mode:I.DEFAULT}),u("Export successful",!0))}},{intent:G.Exit,description:"Exit the application",mode:I.COMMAND_LINE,action:async()=>($.exit(),u("Exit successful",!0))},{intent:G.Edit,description:"Edit title or description",mode:I.COMMAND_LINE,action:async(e,t)=>Vh(t),onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:I.COMMAND_LINE,action:async(e,t)=>hy(t),onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:I.COMMAND_LINE,action:(e,t)=>_y(t),onSuccess:Gd}];var CN=new Set(["peek","replay","filter","view-help","yank"]),$t=async({isForceExecutedBySystem:e=!1}={})=>{let{value:t,commandMeta:{command:n,validity:r,modifier:o,inputString:s}}=ie();if(!n)return c("No command to confirm");if(!e&&r===Sn.Invalid)return c("Invalid command");let i=Ra(n);Eg();let{readOnly:l}=y();if(l&&!CN.has(i))return Ls({status:Xn.Fail,message:"Command not available in readonly state",value:null});let d=Za.filter(f=>e||f.systemOnly!==!0).find(f=>f.intent===i);if(!d)return Ls({status:Xn.Fail,message:"Command not found",value:null});let p;try{p=await d.action(d,{command:n,inputString:s,modifier:o})}catch(f){return Ls({status:Xn.Fail,message:f instanceof Error?f.message:"Command failed",value:null})}if(a(p))return Ls(p);let m=!e;if(Sg({addToHistory:m,line:t}),m){let f=sy({commands:ie().commandHistory});a(f)&&logger.info(f.message)}return d.onSuccess?.(),V().autoSync&&ma(),p};var el=[{intent:E.Exit,mode:I.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(w({mode:I.COMMAND_LINE}),Z("move cancel"),$t({isForceExecutedBySystem:!0}))},{intent:E.InitMove,mode:I.DEFAULT,description:"[m] move",action:()=>(w({mode:I.COMMAND_LINE}),Z("move start"),$t({isForceExecutedBySystem:!0}))},{intent:E.ConfirmMove,mode:I.MOVE,description:"[m] confirm move",action:()=>(w({mode:I.COMMAND_LINE}),Z("move confirm"),$t({isForceExecutedBySystem:!0}))}],tl=[{intent:E.MovePreviousItem,mode:I.MOVE,action:()=>rn()?(w({mode:I.COMMAND_LINE}),Z("move previous"),$t({isForceExecutedBySystem:!0})):c("No pending move")},{intent:E.MoveNextItem,mode:I.MOVE,description:"[arrows/hjkl] move (shift x5)",action:()=>rn()?(w({mode:I.COMMAND_LINE}),Z("move next"),$t({isForceExecutedBySystem:!0})):c("No pending move")},{intent:E.MovePreviousItemJump,mode:I.MOVE,action:()=>rn()?(w({mode:I.COMMAND_LINE}),Z("move jump-previous"),$t({isForceExecutedBySystem:!0})):c("No pending move")},{intent:E.MoveNextItemJump,mode:I.MOVE,action:()=>rn()?(w({mode:I.COMMAND_LINE}),Z("move jump-next"),$t({isForceExecutedBySystem:!0})):c("No pending move")}],jy=[{intent:E.MoveToNextContainer,mode:I.MOVE,action:()=>rn()?(w({mode:I.COMMAND_LINE}),Z("move to-next"),$t({isForceExecutedBySystem:!0})):c("No pending move")},{intent:E.MoveToPreviousContainer,mode:I.MOVE,action:()=>rn()?(w({mode:I.COMMAND_LINE}),Z("move to-previous"),$t({isForceExecutedBySystem:!0})):c("No pending move")}];var $y={[se.WORKSPACE]:[...el,...tl],[se.BOARD]:[...el,...tl],[se.SWIMLANE]:[...el,...tl,...jy],[se.TICKET]:[],[se.FIELD]:[],[se.FIELD_LIST]:[],[se.TEXT]:[],[se.COMMENT]:[]};import AN from"node:fs";import TN from"node:path";import{spawn as NN}from"node:child_process";function Uy(e){let t=process.platform,o=NN(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 Hy=e=>{let t=me(process.cwd());if(a(t))return c("Unable to resolve project root");let n=ge({repoRoot:t.value});if(a(n))return c(n.message);let r=_r(e.hash,e.ext),o=TN.join(ss(n.value),r);return AN.existsSync(o)?(Uy(o),u(`Opened ${e.name}`,null)):c("Attachment file not found \u2014 run :sync to fetch it")};var Wy=()=>{Z("");let{pendingNavTarget:e}=gr();w({mode:I.DEFAULT}),e&&$.navigate(e),hr({pendingNavTarget:void 0})},Gy=[{intent:E.ExitCommandLine,mode:I.HELP,action:()=>(Wy(),u("Exiting help",null))},{intent:E.Exit,mode:I.HELP,action:()=>(Wy(),u("Closed help",null))},{intent:E.NavPreviousItem,mode:I.HELP,description:"[arrows/hjkl] navigate (shift x5)",action:()=>($.navigateToPreviousItem(),u("Navigating to previous help item",null))},{intent:E.NavNextItem,mode:I.HELP,action:()=>($.navigateToNextItem(),u("Navigating to next help item",null))},{intent:E.NavPreviousItemJump,mode:I.HELP,action:()=>($.jumpToPreviousItem(),u("Jumping to previous help item",null))},{intent:E.NavNextItemJump,mode:I.HELP,action:()=>($.jumpToNextItem(),u("Jumping to next help item",null))},{intent:E.NavToPreviousContainer,mode:I.HELP,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous help container",null))},{intent:E.NavToNextContainer,mode:I.HELP,action:()=>($.navigateToNextContainer(),u("Navigating to next help container",null))}];var Vy=()=>{Z(""),w({mode:I.DEFAULT})},zy=[{intent:E.Confirm,mode:I.IDENTITY,description:"[enter] claim the first",action:()=>{let[e]=Io();return e?(w({mode:I.COMMAND_LINE}),Z(`config emails ${e}`),u("Proposed claim",null)):u("Nothing left to claim",null)}},{intent:E.ExitCommandLine,mode:I.IDENTITY,action:()=>(Vy(),u("Closed identity",null))},{intent:E.Exit,mode:I.IDENTITY,description:"[esc] close",action:()=>(Vy(),u("Closed identity",null))}];var wN=e=>{w({mode:I.COMMAND_LINE});let{pendingNavTarget:t}=gr();t&&$.navigate(t),hr({pendingNavTarget:void 0}),Z(`${e} `)},Ky=()=>{Z("");let{pendingNavTarget:e}=gr();e&&$.navigate(e),hr({pendingNavTarget:void 0}),w({mode:I.DEFAULT})},qy=[{intent:E.InitCommandPalette,mode:I.DEFAULT,description:"[?] command palette",action:()=>{Z("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=y();return hr({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),w({mode:I.PALETTE}),u("Opening command palette",null)}},{intent:E.Confirm,mode:I.PALETTE,action:()=>{let{selectedNode:e}=y();if(!e||!tr(e))return c("Command only applicable on text nodes");if(e.props.disabled)return c("Command is not available in this context");let t=e.title;return t?(wN(t),u("Selected command",t)):u("No command selected",null)}},{intent:E.ExitCommandLine,mode:I.PALETTE,action:()=>(Ky(),u("Exiting palette",null))},{intent:E.Exit,mode:I.PALETTE,action:()=>(Ky(),u("Closed command palette",null))},{intent:E.NavPreviousItem,mode:I.PALETTE,description:"[arrows/hjkl] navigate",action:()=>($.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:E.NavNextItem,mode:I.PALETTE,action:()=>($.navigateToNextItem(),u("Navigating to next item",null))},{intent:E.NavToPreviousContainer,mode:I.PALETTE,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:E.NavToNextContainer,mode:I.PALETTE,action:()=>($.navigateToNextContainer(),u("Navigating to next container",null))}];var Yy=()=>{let e=fr();if(!e)return u("Nothing to comment on here",null);let t=_a();if(!t||t.sha!==e)return c("The diff is still loading");let{selectedIndex:n}=y(),r=Math.max(0,n),o=xd(t.rows,Td(e)??r,r);return o.ok?(w({mode:I.COMMAND_LINE}),Z(`${C.COMMENT} ${hh(o.value.start,o.value.end)} `),u("Commenting on a diff line",null)):c(o.reason)},Xy=[{intent:E.InitCommandLine,mode:I.DEFAULT,description:"[:] write command",action:()=>(w({mode:I.COMMAND_LINE}),Z(""),u("Entering command line mode",null))},...Gy,...zy,...qy,{intent:E.AddItem,mode:I.DEFAULT,description:"[n] new...",action:()=>(w({mode:I.COMMAND_LINE}),Z(`${C.NEW} `),u("Adding new item",null))},{intent:E.Delete,mode:I.DEFAULT,description:"[d] delete",action:()=>(w({mode:I.COMMAND_LINE}),Z(`${C.DELETE} `),u("Deleting item",null))},{intent:E.Confirm,mode:I.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=y();if(!xe(e?.id??"")?.length){let r=e?N.getAttachment(e.id):void 0;if(r)return Hy(r);if(fr())return Yy();if(e?.title===Te.DESCRIPTION)return w({mode:I.COMMAND_LINE}),Z(`${C.EDIT} description `),u("Propose command",!0);if(e?.title===Te.ASSIGNEES)return w({mode:I.COMMAND_LINE}),Z(`${C.ASSIGN} `),u("Propose command",!0);if(e?.title===Te.TAGS)return w({mode:I.COMMAND_LINE}),Z(`${C.TAG} `),u("Propose command",!0);if(t.title===Te.DESCRIPTION&&e?.context==="TEXT")return w({mode:I.COMMAND_LINE}),Z(`${C.EDIT} description `),u("Propose command",!0)}return $.enterChildNode(),u("Entering context",null)}},{intent:E.OpenInEditor,mode:I.DEFAULT,action:()=>{let{selectedNode:e,contextNode:t}=y(),n=t.parentNodeId,o=!!n&&t.id===Pe(n,"diff")?e?.id:fr()??void 0;return o?js({sha:o}):u("Nothing here opens in an editor",null)}},{intent:E.MarkDiffLine,mode:I.DEFAULT,action:()=>{let e=fr();if(!e)return u("Nothing to mark here",null);let{selectedIndex:t}=y(),n=Td(e);return Ur(n===t?null:{sha:e,row:Math.max(0,t)}),u("Marked diff line",null)}},{intent:E.CommentOnDiffLine,mode:I.DEFAULT,action:()=>fr()?Yy():u("Nothing to comment on here",null)},{intent:E.Yank,mode:I.DEFAULT,description:"[y] yank",action:()=>{let{selectedNode:e}=y(),t=e?.title===Te.DESCRIPTION?qe.DESCRIPTION:e?.title===Te.TAGS?qe.TAGS:e?.title===Te.ASSIGNEES?qe.ASSIGNEES:qe.REF,r=_e(C.YANK).includes(t)?t:qe.REF;return w({mode:I.COMMAND_LINE}),Z(`${C.YANK} ${r}`),u("Propose command",!0)}},{intent:E.EditTitle,mode:I.DEFAULT,description:"[r] rename title",action:()=>(w({mode:I.COMMAND_LINE}),Z(`${C.EDIT} title ${y().selectedNode?.title}`),u("Exiting context",null))},{intent:E.EditDescription,mode:I.DEFAULT,description:"[e] edit desc",action:()=>(w({mode:I.COMMAND_LINE}),Z(`${C.EDIT} description `),u("Exiting context",null))},{intent:E.Exit,mode:I.DEFAULT,description:"[q] exit context",action:()=>($.enterParentNode(),u("Exiting context",null))},{intent:E.NavPreviousItem,mode:I.DEFAULT,description:"[arrows/hjkl] navigate (shift x5)",action:()=>($.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:E.NavNextItem,mode:I.DEFAULT,action:()=>($.navigateToNextItem(),u("Navigating to next item",null))},{intent:E.NavPreviousItemJump,mode:I.DEFAULT,action:()=>($.jumpToPreviousItem(),u("Jumping to previous item",null))},{intent:E.NavNextItemJump,mode:I.DEFAULT,action:()=>($.jumpToNextItem(),u("Jumping to next item",null))},{intent:E.NavToPreviousContainer,mode:I.DEFAULT,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:E.NavToNextContainer,mode:I.DEFAULT,action:()=>($.navigateToNextContainer(),u("Navigating to next container",null))}];var MN=500,PN=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Jy=e=>{let t=PN(e);t&&Ea(n=>(n+t).slice(0,MN))};var LN=[I.COMMAND_LINE,I.PALETTE],kN=e=>e==="edit title "?y().selectedNode?.title??"":"",DN=e=>[{intent:E.MoveCursorLeft,mode:e,action:()=>(od(-1),u("Moving cursor left",null))},{intent:E.MoveCursorRight,mode:e,action:()=>(od(1),u("Moving cursor right",null))},{intent:E.MoveCursorLeftOfWord,mode:e,action:()=>(sd("left"),u("Moving cursor left of word",null))},{intent:E.MoveCursorRightOfWord,mode:e,action:()=>(sd("right"),u("Moving cursor right of word",null))},{intent:E.AutoCompleteCommand,mode:e,action:()=>(Ea((t,{remainder:n})=>{let r=n?t+n:t;return r+kN(r)}),u("Auto-completing command",null))},{intent:E.CaptureInput,mode:e,action:(t,{sequence:n})=>(Jy(n??""),u("Capturing input",null))},{intent:E.EraseInput,mode:e,action:()=>(xg(),u("Erasing input",null))},{intent:E.EraseInputWord,mode:e,action:()=>(Ig(),u("Erasing input word",null))}],Qy=[{intent:E.Confirm,mode:I.COMMAND_LINE,action:()=>($t(),u("Executing command",null))},{intent:E.ViewHelp,mode:I.DEFAULT,action:()=>(w({mode:I.HELP}),u("Viewing help",null))},...LN.flatMap(DN),{intent:E.ExitCommandLine,mode:I.COMMAND_LINE,action:()=>(w({mode:I.DEFAULT}),u("Exiting command line",null))},{intent:E.GetLastCommandFromHistory,mode:I.COMMAND_LINE,action:()=>(Cg(),u("Getting last command from history",null))},{intent:E.GetNextCommandFromHistory,mode:I.COMMAND_LINE,action:()=>(Ng(),u("Getting next command from history",null))}];var Vd=e=>{let t=/^\[(.+?)\]\s*(.+)$/.exec(e);return t?{keys:t[1]??"",label:t[2]??""}:null},Zy=({keys:e})=>e.length===1?0:1,ev=(e,t)=>{let n=new Set;for(let r of e)r.mode!==t||!r.description||n.add(r.description);return[...n].map(Vd).filter(r=>r!==null).sort((r,o)=>Zy(r)-Zy(o))};function tv(e,t,n){let r=t[e];if(!r)return c("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 l=o[o.length-1];return!l||l.id!==n?c("buildBreadCrumb(): node is not connected to root"):(o.reverse(),u("Breadcrumb built",o))}var nv=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 At,zd,Kd=new Set,qd=()=>{for(let e of Kd)e()},ON=e=>(Kd.add(e),()=>Kd.delete(e));function Yd(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return c("derive(): contextNodeId is missing");if(!r)return c("derive(): rootNode is missing");if(!o[r])return c("derive(): unable to find root node");let l=o[t];if(!l)return c("Unable to derive state, contextNode not found");let d=tv(t,o,r);if(a(d))return logger.error(d.message),d;let p=d.value,{context:m}=l,f=[...Xy,...$y[m]??[],...Qy],g=ev(f,n),v=nv(f),x=FN(o,s),b=x[t]?.[e.selectedIndex]??null;return u("Derived successfully",{...e,contextNode:l,breadCrumb:p,availableHints:g,availableActions:f,actionIndex:v,selectedNode:b,renderedChildrenIndex:x})}var y=()=>{if(!At)throw new Error("State not initialized. Call initWorkspaceState() first.");return At},Ie=()=>At?u("Retrieved state",At):c("State not initialized. Call initWorkspaceState() first.");$f(e=>At?un(At.emailLinks,e):[]);function ys(e){zd=e;let t=me(process.cwd()),n=!1;if(!a(t)){let s=Tt(t.value);if(a(s))return c(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},emailLinks:{},mode:I.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=Yd(r);return a(o)?o:(At=o.value,qd(),u("State initialized",null))}var Vr=!1,qs=null;function Fe(e){let t=y(),n=e(t);if(Vr)return n.nodes!==t.nodes&&(br=null),qs=n,At={...t,...n},u("State updated",null);let r=Yd(n);return a(r)?c(r.message??"Unable to update state"):(At=r.value,qd(),u("State updated",null))}function Qi(e){if(Vr)return u("Joined batch",e());Vr=!0,qs=null,br=new Set;let t=()=>{let n=qs;if(Vr=!1,qs=null,n===null)return null;let r=Yd(n);return a(r)?c(r.message??"Unable to update state"):(At=r.value,qd(),u("State updated",null))};try{let n=e(),r=t();return r&&a(r)?c(r.message):u("State updated",n)}finally{Vr&&t()}}var tf=()=>Vr,w=e=>Fe(t=>({...t,...e}));function zr(e,t,n){if(!Vr)return Fe(i=>({...i,[e]:{...i[e]??{},[t]:n}}));let r=y(),o=r[e]??{};if(e==="nodes"){let i=o[t],l=n;i?.parentNodeId&&br?.add(i.parentNodeId),l.parentNodeId&&br?.add(l.parentNodeId)}o[t]=n;let s={...r,[e]:o};return qs=s,At={...r,...s},u("State updated",null)}var re=()=>BN(ON,y,y),br=null,rv=null,FN=(e,t)=>{let n=At?.renderedChildrenIndex,r=n!==void 0&&br!==null&&e===rv&&t.length===0&&At?.filters.length===0,o;if(r){o={...n};let s=Jp(e,br);for(let i of br){let l=s[i];l?o[i]=l:delete o[i]}}else o=Xp(e,t);return rv=e,br=new Set,o},ce=e=>y()?.renderedChildrenIndex[e]??[],on=()=>zd?ys(zd):c("Cannot reset state: no initial workspace found"),Ot=()=>At!==void 0;var Nt=(e,t)=>{let{nodes:n}=y(),r=n[e];if(!r)return c("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 c(`No ancestor found for context: ${t}`)},Xd=(e,t)=>{let{nodes:n}=y(),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},xr=(e,t)=>e?e.readonly?c({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:c("Node not found"),N={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return c("Contributor not found");if(n.userId&&n.userId!==t)return c("Contributor is already linked to another user");let r={...n,userId:t},o=Fe(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?c("Unable to link contributor to user"):u("Linked contributor to user",r)},deleteNode(e){N.deleteNodes([e])},deleteNodes(e){e.length!==0&&Fe(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 c("Unable to create comment, missing issue");if(!_(t))return c("Can only comment on issues");let n=zr("comments",e.id,{...e,deleted:!1});return a(n)?c("Unable to create comment"):u("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return c("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return c("Unable to edit comment, missing issue");if(!_(r))return c("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=zr("comments",e,o);return a(s)?c("Unable to edit comment"):u("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return c("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=zr("comments",e,n);return a(r)?c("Unable to delete comment"):u("Deleted comment",n)},getComment(e){return y().comments?.[e]},getCommentsByIssue(e){return Object.values(y().comments??{}).filter(t=>t.issue===e&&!t.deleted)},getCommentsGroupedByIssue(){let e=new Map;for(let t of Object.values(y().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 c("Unable to create attachment, missing issue");if(!_(t))return c("Can only attach to issues");let n=Fe(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?c("Unable to create attachment"):u("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return c("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=Fe(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return a(r)?c("Unable to delete attachment"):u("Deleted attachment",n)},getAttachment(e){return y().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(y().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},getAttachmentsGroupedByIssue(){let e=new Map;for(let t of Object.values(y().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}=y(),r=n[e];if(!r)return c("Edit target node not found");let o=xr(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 c("Rename target node not found");let r=xr(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),u("Renamed node",o)},getExistingTags(){let{tags:e}=y();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=y();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return xe(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=y(),o=this.getNode(e),s=this.getNode(t);if(!o)return c("Node not found");if(!s)return c("Target parent not found");if(r===e)return c("Cannot move root node");if(e===t)return c("Cannot move node into itself");let i=xr(o,"move");if(i)return i;if(Xd(t,e))return c("Cannot move node into its own descendant");let l={...o,parentNodeId:t,rank:n};return this.updateNode(l),u("Moved node successfully",l)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=y(),o=this.getNode(e);if(!o)return c("Node not found");if(r===e)return c("Cannot delete root node");let s=xr(o,"delete");if(s)return s;let i=new Set,l=p=>{let m=t[p];if(!(!m||i.has(p))){i.add(p);for(let f of xe(m.id))l(f.id)}};l(e);let d={...structuredClone(t)};for(let p of i){if(!d[p])return c("Unable to locate node to delete");d[p]={...d[p],isDeleted:!0}}return n?(w({nodes:d}),u("Successfully tomb stoned",o)):c("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return c("Contributor not found");let n={...t,name:mo,tombstoned:!0},r=Fe(o=>({...o,contributors:{...o.contributors,[e]:n}}));return a(r)?c("Unable to remove contributor"):u("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return c("Contributor not found");if(n.tombstoned)return c("Cannot rename a removed contributor");let r={...n,name:t},o=Fe(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?c("Unable to rename contributor"):u("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return c("Contributor not found");let r={...n,name:t,tombstoned:!1},o=Fe(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?c("Unable to restore contributor"):u("Restored contributor",r)},linkContributorEmail({email:e,contributor:t,authorId:n}){if(!this.getContributor(t))return c("Unable to link email, missing contributor");let r={email:Ze(e),contributor:t,authorId:n},o=cs(r.email,t),s=y().emailLinks[o];if(s&&!s.tombstoned)return u("Email already linked",s);let i=Fe(l=>({...l,emailLinks:{...l.emailLinks,[o]:r}}));return a(i)?c("Unable to link email"):u("Linked email to contributor",r)},unlinkContributorEmail(e,t,n){let r=cs(e,t),o=y().emailLinks[r];if(!o)return c("Unable to unlink, no such link");if(o.tombstoned)return u("Email already unlinked",o);if(!_i(n,o))return c("Only the author of a link or the contributor it names may remove it");let s={...o,tombstoned:!0},i=Fe(l=>({...l,emailLinks:{...l.emailLinks,[r]:s}}));return a(i)?c("Unable to unlink email"):u("Unlinked email from contributor",s)},getEmailLinks(){return y().emailLinks},createContributor(e){let t=Fe(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?c("Unable to create contributor"):u("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return c("Unable to assign contributor, missing contributor");if(!r)return c("Unable to assign contributor, missing target");let o=xr(r,"edit");if(o)return o;if(!_(r))return c("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return c("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 c("Unable to unassign, missing contributor");if(!r)return c("Unable to unassign, missing target");let o=xr(r,"edit");if(o)return o;if(!_(r))return c("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(l=>l!==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 c("Unable to add tag, missing tag");if(!r)return c("Unable to add tag, missing target");let o=xr(r,"edit");if(o)return o;if(!_(r))return c("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return c("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 c("Unable to remove tag, missing tag");if(!r)return c("Unable to remove tag, missing target");let o=xr(r,"edit");if(o)return o;if(!_(r))return c("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(l=>l!==t)}};return this.updateNode(i),u("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return c("Tag not found");let n={...t,tombstoned:!0},r=Fe(o=>({...o,tags:{...o.tags,[e]:n}}));return a(r)?c("Unable to delete tag"):u("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return c("Tag not found");let r={...n,name:t,tombstoned:!1},o=Fe(s=>({...s,tags:{...s.tags,[e]:r}}));return a(o)?c("Unable to restore tag"):u("Restored tag",r)},createTag(e){let t=Fe(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?c("Could not create tag"):u("Tag created",e)},createNode(e){let t=zr("nodes",e.id,e);return a(t)?c("Unable to create node"):u("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return c("Failed to locate node");let n={...t,readonly:!0},r=zr("nodes",e,n);return a(r)?c(r.message):u("Locked node",n)},updateNode(e){let t=zr("nodes",e.id,e);return a(t)?t:u("Updated node",e)},getContributor(e){return y().contributors[e]},getTag(e){let t=y().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return y().tags[e]},getTags(){return Object.values(y().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return y().nodes[e]},getSiblings(e){return xe(e)}};var _N=(e,t)=>e+" ".repeat(Math.max(0,t-ov(e))),jN=(e,t)=>" ".repeat(Math.max(0,t-ov(e)))+e,nl=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","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),$N=(e,t)=>t?e<t?"up":e>t?"down":null:null,UN=(e,t)=>{let n=N.getNode(e.payload.parent),r=n?Ir.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=$N(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},sv=e=>`${Math.max(1,Math.round(e/1024))} KB`,iv=e=>N.getAttachment(e)?.name??"",HN=e=>{switch(e.action){case"add.issue.tag":{let t=y().tags[e.payload.tag];return t?Ir.bgHex(ze(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=y().tags[e.payload.tag];return t?Ir.bgHex(ze(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=y().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=y().contributors[e.payload.assignee];return t?Ir.hex(ze(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=y().contributors[e.payload.assignee];return t?Ir.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"add.issue.attachment":return`"${e.payload.name}" ${Ir.dim(`(${sv(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=iv(e.payload.id);return t?`"${t}"`:""}default:return""}},WN=e=>{let t=ur(Oe(e));return Ir.gray(jN(t,8))},GN=12,VN=e=>_N(`${e}`,GN),zN=e=>{let t=Ie();return a(t)?e:Fi(e,t.value.contributors[e]?.name)},KN=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=y().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=y().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=y().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"move.node":{let t=N.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${sv(e.payload.bytes)})`;case"delete.issue.attachment":{let t=iv(e.payload.id);return t?`"${t}"`:""}default:return""}},Xa=e=>[nl(e.action),KN(e)].filter(Boolean).join(" "),av=(e,t)=>{let n=WN(e.id),r=VN(zN(e.userId)),o=Ir.dim("\u203A"),s=e.action==="move.node"?UN(e,t):[nl(e.action),HN(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var qN=e=>Pe(e,"comments"),YN=e=>Pe(e,"description"),XN=e=>Pe(e,"assignees"),JN=e=>Pe(e,"tags"),QN=e=>Pe(e,"history"),ZN=e=>Pe(e,"diff"),eA=e=>Pe(e,"attachments"),Ys=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let l=N.getNode(e);if(!l){let m=N.createNode({...Ce.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(!lt(l))return c(`Existing virtual node ${e} is not a field`);if(!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==s||l.childRenderAxis!==i))return u("Virtual field unchanged",void 0);let p=N.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:s,childRenderAxis:i});return a(p)?p:u("Virtual field updated",void 0)},lv=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let i=N.getNode(e);if(!i){let p=N.createNode({...Ce.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(!us(i))return c(`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=N.updateNode({...i,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return a(d)?d:u("Virtual field list updated",void 0)},Wp=e=>{let t=Pt(qt/4n),n=Pt(qt/2n),r=Pt(qt*3n/4n),o=Pt(qt*7n/8n),s=Pt(qt*15n/16n),i=Pt(qt*13n/16n),l=Pt(qt*27n/32n);if(a(t))return t;if(a(n))return n;if(a(r))return r;if(a(o))return o;if(a(s))return s;if(a(i))return i;if(a(l))return l;let d=Ys({id:YN(e.id),name:Te.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(a(d))return d;let p=lv({id:XN(e.id),name:Te.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(a(p))return p;let m=lv({id:JN(e.id),name:Te.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(a(m))return m;let f=Ys({id:qN(e.id),name:Te.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(a(f))return f;let g=Ys({id:eA(e.id),name:Te.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(a(g))return g;let v=Ys({id:QN(e.id),name:Te.HISTORY,parentNodeId:e.id,rank:i.value,value:tA(e),readonly:!0,childRenderAxis:"vertical"});if(a(v))return v;let x=Ys({id:ZN(e.id),name:Te.DIFF,parentNodeId:e.id,rank:l.value,value:"",readonly:!0,childRenderAxis:"vertical"});return a(x)?x:u("Ticket virtual nodes materialized",void 0)},tA=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=>av(r,n.get(r.action)??[])).join(`
|
|
98
|
+
`)},cv=!0,dv=e=>{cv=e},Pc=()=>cv;import BT from"node:http";import Zr from"node:path";import{fileURLToPath as OT}from"node:url";var nA=e=>{switch(e.action){case"add.issue":case"move.node":case"close.issue":case"reopen.issue":return e.payload.parent;default:return null}},Jd=(e,t)=>{let n=[];for(let r of e){let o=nA(r);if(o===null||o===n.at(-1)?.laneId)continue;let s=Zn(r);n.push({laneId:o,enteredAt:s===null?t:ls(s)})}return n},rl=(e,t)=>Jd(e,t).at(-1)?.enteredAt??t;var rA=e=>e.payload??{},Qd=e=>{let t=new Map,n={},r=new Set,o=new Set,s=new Set;for(let i of e){let{id:l,name:d}=rA(i);if(l)switch(i.action){case"create.contributor":case"create.tag":t.set(l,d??""),r.add(l),o.delete(l);break;case"rename.contributor":d!==void 0&&r.has(l)&&!o.has(l)&&t.set(l,d);break;case"tombstone.contributor":r.has(l)&&(t.set(l,mo),o.add(l));break;case"restore.contributor":case"restore.tag":d!==void 0&&r.has(l)&&(t.set(l,d),o.delete(l));break;case"add.board":d!==void 0&&(t.set(l,d),s.add(l));break;case"add.swimlane":d!==void 0&&(t.set(l,d),s.add(l),n[l]=d);break;case"edit.title":d!==void 0&&s.has(l)&&(t.set(l,d),l in n&&(n[l]=d));break;default:break}}return{byId:t,lanes:n}};var oA=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},mv=e=>{let t=e.payload;return e.action==="tombstone.tag"||e.action==="restore.tag"?t?.id:t?.tag},sA=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}},iA=(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},aA=new Set(["add.issue","move.node","close.issue","reopen.issue"]),lA=(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,l=null;if(aA.has(r.action)&&i?.id===s&&i.parent){let d=n.get(s);d!==void 0&&d!==i.parent&&(l=d),n.set(s,i.parent)}return{lane:n.get(s)??null,laneBefore:l}})},uv=90,cA=e=>{let t=e.trim().split(`
|
|
99
|
+
`)[0]?.trim()??"";return t.length>uv?`${t.slice(0,uv).trimEnd()}\u2026`:t},dA=(e,t,n)=>{let r=e.payload,o=mv(e),s=e.action?nl(e.action):"";if(r?.md!==void 0){let l=cA(r.md);return l?`${s}: ${l}`:s}if(e.action==="move.node"&&r?.parent){let l=t.get(r.parent);return l?n.get(e.id)===r.parent?`Moved within ${l}`:`Moved to ${l}`:s}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(" ")},Zd=(e,t)=>e?Ke(e,t.get(e)):null,uA=(e,t)=>{let n=e.payload;return{actor:Zd(e.userId,t),tag:Zd(mv(e),t),assignee:Zd(n?.assignee,t)}},pv=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 l=o.action==="close.issue"?r(i):null,d=s.parent??s.issue;return d&&t.set(i,d),l!==null?l:n.has(i)?i:r(i)})},fv=e=>mA.has(e),mA=new Set(["create.contributor","rename.contributor","tombstone.contributor","restore.contributor","link.contributor.user","link.contributor.email","unlink.contributor.email"]),gv=(e,t)=>{let n=pv(e);return e.filter((r,o)=>n[o]===t)},pA=(e,t=new Map)=>{let n=new Map([...t,...Qd(e).byId]),r=oA(e),o=sA(e),s=e.map(m=>iA(m,o)),i=lA(e,s),l=pv(e),d=co(e.map(m=>Zn(m)));return e.flatMap((m,f)=>{let g=d[f]??null;return g===null?[]:[{id:m.id,t:g,action:m.action,label:dA(m,n,r),issue:s[f]??null,...i[f],board:l[f]??null,...uA(m,n)}]}).sort((m,f)=>m.t-f.t)},fA=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===he?s.t:null})}return n},gA=(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]},hv=(e,t,n)=>{let r={};for(let[o,s]of e){if(s.from>=t||s.closedFrom!==null&&s.closedFrom<t)continue;let i=gA(s.changes,t);i===void 0||i.lane===he||n&&i.board!==n||(r[o]=i.lane)}return r},hA=e=>Qd(e).lanes,Xs=null,yv=e=>{let t=pn(e);if(Xs&&Xs.root===e&&Xs.signature===t)return u("Timeline entries, cached",Xs.index);let n=ar(e);if(a(n))return c(n.message);let r=pA(n.value,ir(e)),o={entries:r,lanes:fA(r),laneNames:hA(n.value)};return Xs={root:e,signature:t,index:o},u("Timeline entries, built",o)};var vv=1e5,yA=2e4,ol=null,bv=Promise.resolve(),Er=e=>{let t=bv.then(e,e);return bv=t.then(()=>{},()=>{}),t},sl=e=>{let t=tn(e);return a(t)?t:ge({repoRoot:t.value})},st=()=>{if(!Ot())return{mode:"live",asOfTime:null};let{timeMode:e}=y();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:ol}},xv=(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},Iv=async(e={})=>{let t=sl(e.repoRoot);if(a(t))return c(t.message);let n=yv(t.value);if(a(n))return c(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:[],events:[],lanesAtStart:{},laneNames:n.value.laneNames,closedLane:he,earliest:i,latest:s});let l=xv(r,i),d=xv(r,s),p=r.slice(l,d).filter(x=>!e.boardId||x.board===e.boardId||fv(x.action)),m=p.map(x=>x.t),f=Math.max(1,Math.ceil((s-i)/vv)),g=new Map;for(let x of m){let b=Math.min(vv-1,Math.floor((x-i)/f)),R=i+b*f;g.set(R,(g.get(R)??0)+1)}let v=[...g.entries()].sort(([x],[b])=>x-b).map(([x,b])=>({t:x,count:b}));return u("Computed event timeline",{bucketMs:f,buckets:v,events:p.length>yA?[]:p,lanesAtStart:hv(n.value.lanes,i,e.boardId),laneNames:n.value.laneNames,closedLane:he,earliest:i,latest:s})},Ev=e=>{let t=ar(e);if(a(t))return c(t.message);let n=on();if(a(n))return c(n.message);ol=null;let r=Xt(t.value),{fatal:o,skipped:s}=fn(r);return o.length>0?c(o.map(i=>i.message).join(", ")):(gn(s),w({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Restored live state",!0))},vA=(e,t)=>{ol=null;let n=Ev(e);return a(n)?c(`${t} (recovery to live also failed: ${n.message})`):c(t)},eu=e=>Er(async()=>{let t=sl(e.repoRoot);if(a(t))return c(t.message);let n=Zi(t.value,e.targetTime);if(a(n))return c(n.message);let{appliedEvents:r,unappliedEvents:o}=n.value,s=on();if(a(s))return s;let i=Xt(r),{fatal:l,skipped:d}=fn(i);return l.length>0?vA(t.value,l.map(p=>p.message).join(", ")):(gn(d),w({readOnly:!0,timeMode:"peek",unappliedEvents:o,replay:null}),ol=e.targetTime,u("Checked out historical state",{asOfTime:e.targetTime}))}),Sv=async e=>{let t=sl(e.repoRoot);if(a(t))return c(t.message);let n=ea(t.value);if(a(n))return c(n.message);let r=n.value.get(e.eventId)??null;return r===null?c("Event not found in the log"):eu({repoRoot:e.repoRoot,targetTime:r+1})},Rv=(e={})=>Er(async()=>{let t=sl(e.repoRoot);if(a(t))return c(t.message);let n=Ev(t.value);return a(n)?c(n.message):u("Returned to live state",!0)});import xA from"node:fs";var Cv=new Map,bA=3e4,Nv=async e=>{let t=Cv.get(e);if(t&&Date.now()-t.readAt<bA)return{name:t.name,email:t.email};let n=await Be({args:["config","--get-regexp","^user\\.(name|email)$"],cwd:e}),r=null,o=null;if(n.exitCode===0)for(let s of(n.stdout??"").split(`
|
|
100
|
+
`)){let i=s.indexOf(" ");if(i===-1)continue;let l=s.slice(0,i),d=s.slice(i+1);l==="user.name"&&(r=d.trim()||null),l==="user.email"&&(o=Ze(d)||null)}return Cv.set(e,{name:r,email:o,readAt:Date.now()}),{name:r,email:o}},il=async e=>(await Nv(e)).email,jo=async e=>(await Nv(e)).name;var Kr=e=>{let t=me(e??process.cwd());return a(t)?c(t.message):u("Resolved Epiq repo root",t.value)},al=null,ee=async(e,t)=>{let n=Kr(e);if(a(n))return n;let r=ge({repoRoot:n.value});if(a(r))return c(r.message);let o=Qe(n.value);if(a(o))return c(o.message);if(!(al!==null&&al.repoRoot===n.value&&al.stateBranchRoot===r.value&&xA.existsSync(Tr(r.value)))){let f=await Es({repoRoot:n.value,stateBranchName:o.value});if(a(f))return c(f.message);let g=await lr({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(a(g))return c(g.message);al={repoRoot:n.value,stateBranchRoot:r.value}}if(t?.pull??!1){let f=await U({cwd:r.value,args:["pull","--ff-only"]});a(f)&&oe.info(3,f.message)}let i={repoRoot:n.value,stateBranchRoot:r.value},l=Mt();a(l)||ke(l.value),ke({gitEmail:await il(n.value),gitName:await jo(n.value)});let d=pn(r.value);if(mp(r.value)===d&&Ot()&&st().mode==="live")return u("Booted Epiq state, unchanged",i);let p=Jt(r.value);if(a(p))return c(p.message);let m=Qt(p.value.events,p.value.unreadable);return a(m)?c(m.message):(pp(r.value,d),u("Booted Epiq state",i))},te=()=>{let e=Mt();return a(e)?c(e.message):e.value.userId?e.value.userName?u("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):c("Unable to retrieve user name"):c("Unable to retrieve user id")},Y=()=>{let e=Ie();return a(e)?c(e.message):e};var $o=e=>xn(e).map(t=>Ke(t.id,t.name));var Uo=e=>In(e).map(({id:t,name:n})=>Ke(t,n));import IA from"node:fs";import EA from"node:path";import{ulid as nu}from"ulid";var et=e=>{let t=Y();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?c("Issue not found"):_(n)?n.readonly?c("Issue is readonly"):u("Found issue",n):c("Target must be an issue")},Sr=e=>{let t=Y();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?c("Swimlane not found"):mn(n)?n.readonly?c("Swimlane is readonly"):u("Found swimlane",n):c("Target must be a swimlane")},tu=e=>{let t=Y();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?c("Board not found"):nr(n)?n.readonly?c("Board is readonly"):u("Found board",n):c("Target must be a board")};var SA=e=>{if(e.filePath)try{return u("Read attachment file",{data:IA.readFileSync(e.filePath),name:e.name??EA.basename(e.filePath)})}catch(t){return c(`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"}):c("Provide either filePath or dataBase64")},ll=()=>{let e=Mt();return a(e)?En:e.value.attachmentMaxKb??En},ru=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=et(e.issueId);if(a(o))return o;let s=SA(e);if(a(s))return s;let i=sg(t.value.stateBranchRoot,s.value.data,ll());if(a(i))return i;let l=Re(s.value.name).trim()||"image",d=nu(),p={id:nu(),...D(n.value),action:"add.issue.attachment",payload:{id:d,issue:e.issueId,author:n.value.userId,hash:i.value.hash,ext:i.value.ext,name:l,bytes:i.value.bytes}},m=B([p],t.value.stateBranchRoot);if(a(m))return c(m.message);let f=_r(i.value.hash,i.value.ext);return u("Added issue attachment",{id:d,issueId:e.issueId,fileName:f,bytes:i.value.bytes,markdown:Zc(l,f)})},ou=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=r.value.eventLog.find(p=>p.action==="add.issue.attachment"&&p.payload.id===e.attachmentId);if(!o)return c("Unable to resolve attachment");if(o.payload.author!==n.value.userId)return c("You can only delete your own attachments");let s=et(o.payload.issue);if(a(s))return s;if(r.value.eventLog.some(p=>p.action==="delete.issue.attachment"&&p.payload.id===e.attachmentId))return u("Attachment already deleted",{id:e.attachmentId,issueId:o.payload.issue});let l={id:nu(),...D(n.value),action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},d=B([l],t.value.stateBranchRoot);return a(d)?c(d.message):u("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},su=async e=>{let t=await ee(e.repoRoot,{pull:!1});return a(t)?t:ig(t.value.stateBranchRoot,e.fileName,ll())};var RA=365*24*60*60*1e3,iu=e=>{let t=Y();if(a(t))return t;let n=t.value.nodes[e];return u("Issue description",n&&_(n)&&!n.isDeleted?n.props.description??"":"")},qr=()=>{let e=Y();if(a(e))return e;let t=st(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(b=>nr(b)&&!b.isDeleted),s=Date.now()-RA,i=new Map,l=new Map;for(let b of r)if(!b.isDeleted){if(mn(b)&&b.parentNodeId){let R=i.get(b.parentNodeId)??[];R.push(b),i.set(b.parentNodeId,R)}if(_(b)&&b.parentNodeId){if(b.parentNodeId===he&&Oe(b.id)<s)continue;let R=l.get(b.parentNodeId)??[];R.push(b),l.set(b.parentNodeId,R)}}let d=new Set;for(let b of l.values())for(let R of b)d.add(R.id);let p=Mt();if(a(p))return p;let m={},f=N.getCommentsGroupedByIssue();for(let b of r.filter(_))b.isDeleted||!d.has(b.id)||(m[b.id]=(f.get(b.id)??[]).map(R=>{let S=N.getContributor(R.authorId);return{id:R.id,issueId:R.issue,body:R.md,author:Ke(R.authorId,S?.name),createdAt:Oe(R.id)}}));let g=new Map;for(let b of e.value.eventLog)b.action==="add.issue.attachment"&&g.set(b.payload.id,b.payload.author);let v={},x=N.getAttachmentsGroupedByIssue();for(let b of r.filter(_))b.isDeleted||!d.has(b.id)||(v[b.id]=(x.get(b.id)??[]).map(R=>({id:R.id,issueId:R.issue,name:R.name,fileName:_r(R.hash,R.ext),bytes:R.bytes,createdAt:Oe(R.id),canDelete:g.get(R.id)===p.value.userId})));return u("Retrieved Epiq GUI state",{boards:o.sort((b,R)=>b.rank.localeCompare(R.rank)).map(b=>({id:b.id,ref:H(b.id),title:b.title,readonly:!!b.readonly||n,swimlanes:(i.get(b.id)??[]).sort((R,S)=>R.rank.localeCompare(S.rank)).map(R=>({id:R.id,title:R.title,readonly:!!R.readonly||n,issues:(l.get(R.id)??[]).sort((S,A)=>S.rank.localeCompare(A.rank)).map(S=>({id:S.id,ref:H(S.id),title:Re(S.title),description:S.props.description??"",createdAt:Oe(S.id),enteredLaneAt:rl(S.log??[],Oe(S.id)),readonly:!!S.readonly||n,tags:$o(S),assignees:Uo(S),parentNodeId:S.parentNodeId,isClosed:S.parentNodeId===he})),parentNodeId:R.parentNodeId}))})),tags:N.getTags().map(b=>({...b,...Ke(b.id,b.name)})),contributors:Object.values(e.value.contributors).map(b=>({...b,...Ke(b.id,b.name)})),user:{id:p.value.userId??"",name:p.value.userName??"",color:ze(p.value.userName??"")},commentsByIssueId:m,attachmentsByIssueId:v,attachmentMaxKb:ll(),timeTravel:t})},Av=null,CA=e=>{if(e===Av)return;let t=fa({root:e});if(a(t)){oe.info(t.message);return}Av=e},Ut=async(e={})=>{if(st().mode!=="live")return qr();let t=await ee(e.repoRoot,{pull:!1});return a(t)?t:(CA(t.value.repoRoot),qr())},Js=async(e={})=>{fo();let t=Kr(e.repoRoot);if(a(t))return c("Sync failed");let n=te();if(a(n))return n;let r=await da({cwd:t.value,ownEventFileName:or(n.value)});return a(r)?(Dc(r.message),r):(Br(),u("Synced",r.value))};import{ulid as Ht}from"ulid";var Qs=e=>{let t=[...new Set([...e.issueIds??[],...e.issueId?[e.issueId]:[]])];return t.length?u("Resolved targets",t):c("Provide issueId or issueIds")},Ho=(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):c(`${r}: ${t.failed.map(o=>`${o.ref} ${o.reason}`).join("; ")}`)},Zs=(e,t)=>{let n={done:[],failed:[]};for(let r of e){let o=t(r);a(o)?n.failed.push({id:r,ref:H(r),reason:o.message}):n.done.push({id:r,ref:H(r)})}return n};var Mv=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase();async function cu(e){let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=Y();if(a(n))return n;let r=n.value.nodes,o=e.query?.trim().toLowerCase(),s=Object.values(r).filter(_).filter(l=>!l.isDeleted).filter(l=>e.includeClosed||l.parentNodeId!==he).filter(l=>e.boardId?(l.parentNodeId?r[l.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).filter(l=>!e.swimlaneId||l.parentNodeId===e.swimlaneId).filter(l=>!e.tag||$o(l).some(d=>Mv(d.name,e.tag))).filter(l=>!e.assignee||Uo(l).some(d=>Mv(d.name,e.assignee))).filter(l=>!o||l.title.toLowerCase().includes(o)||(l.props.description??"").toLowerCase().includes(o)),i=l=>Re((l.parentNodeId?r[l.parentNodeId]?.title:void 0)??"");return e.brief?u("Listed issues",s.map(l=>({id:l.id,ref:H(l.id),title:Re(l.title),swimlane:i(l),tags:$o(l).map(d=>d.name),assignees:Uo(l).map(d=>d.name)}))):u("Listed issues",s.map(l=>({id:l.id,ref:H(l.id),title:Re(l.title),description:l.props.description??"",createdAt:Oe(l.id),enteredLaneAt:rl(l.log??[],Oe(l.id)),parentNodeId:l.parentNodeId,isClosed:l.parentNodeId===he,readonly:!!l.readonly,tags:$o(l),assignees:Uo(l)})))}var du=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=Re(e.title);if(!o)return c("Issue title cannot be empty");let s=e.description??"",i=dt("Issue title",o,300)??dt("Issue description",s,2e4);if(i)return c(i);if((e.tagNames?.length??0)>20)return c(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return c(`Cannot set more than ${20} assignees at once`);let l=Sr(e.parentId);if(a(l))return l;let d=_n(e.parentId,n.value,t.value.stateBranchRoot);if(a(d))return d;let p=Wa({name:o,parent:e.parentId,user:n.value,rank:d.value});if(a(p))return p;let m=[...p.value],f=m.find(b=>b.action==="add.issue")?.payload.id;if(!f)return c("Unable to determine created issue id");s&&m.push({id:Ht(),...D(n.value),action:"edit.description",payload:{id:f,md:s}});let g=[];for(let b of e.tagNames??[]){let R=Re(b).trim();if(!R||g.some(P=>P.name===R))continue;let S=dt("Tag name",R,60);if(S)return c(S);let A=N.findTagByName(R),T=A?.id??Ht();A||m.push({id:Ht(),...D(n.value),action:"create.tag",payload:{id:T,name:R}}),m.push({id:Ht(),...D(n.value),action:"add.issue.tag",payload:{id:f,tag:T}}),g.push({id:T,name:R})}let v=[];for(let b of e.assigneeNames??[]){let R=Re(b).trim();if(!R||v.some(P=>P.name===R))continue;let S=dt("Assignee name",R,80);if(S)return c(S);let A=Object.values(r.value.contributors).find(P=>P.name===R),T=A?.id??Ht();A||m.push({id:Ht(),...D(n.value),action:"create.contributor",payload:{id:T,name:R}}),m.push({id:Ht(),...D(n.value),action:"add.issue.assignee",payload:{id:f,assignee:T}}),v.push({id:T,name:R})}let x=B(m,t.value.stateBranchRoot);return a(x)?c(x.message):u("Created issue",{id:f,ref:H(f),title:o,parentId:e.parentId,description:s,tags:g,assignees:v})},NA=(e,t,n)=>{let r=et(e);if(a(r))return r;let o=hn(he,e,{at:"end"},t,n);if(a(o))return o;let s={id:Ht(),...D(t),action:"close.issue",payload:{id:e,parent:he,rank:o.value}},i=B([s],n);return a(i)?c(i.message):u("Closed issue",{id:e,ref:H(e)})};async function uu(e){let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Qs(e);if(a(r))return r;let o=s=>NA(s,n.value,t.value.stateBranchRoot);return e.issueIds?Ho("Closed",Zs(r.value,o)):o(r.value[0])}var mu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o||o.isDeleted)return c("Issue not found");if(!_(o))return c("Target must be an issue");if(o.parentNodeId!==he)return c("Issue is not closed");let s=Ja(o);if(!s)return c("Unable to resolve previous parent from issue history");if(s===he)return c("Previous parent resolves to closed swimlane");let i=Sr(s);if(a(i))return i;let l=i.value,d=hn(l.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(a(d))return d;let p={id:Ht(),...D(n.value),action:"reopen.issue",payload:{id:o.id,parent:l.id,rank:d.value}},m=B([p],t.value.stateBranchRoot);return a(m)?c(m.message):u("Reopened issue",{id:o.id,ref:H(o.id),parentId:l.id})},AA=(e,t,n,r)=>{let o=et(e);if(a(o))return o;let s=Sr(t.parentId);if(a(s))return s;let i=hn(t.parentId,e,t.position??{at:"end"},n,r);if(a(i))return i;let l={id:Ht(),...D(n),action:"move.node",payload:{id:e,parent:t.parentId,rank:i.value}},d=B([l],r);return a(d)?c(d.message):u("Moved issue",{id:e,ref:H(e),parentId:t.parentId})};async function pu(e){let t=Kr(e.repoRoot);if(a(t))return t;let n=te();if(a(n))return n;let r=ge({repoRoot:t.value});if(a(r))return r;let o=Jt(r.value);if(a(o))return o;let s=Qt(o.value.events,o.value.unreadable);if(a(s))return s;let i=Qs(e);if(a(i))return i;let l=d=>AA(d,e,n.value,r.value);return e.issueIds?Ho("Moved",Zs(i.value,l)):l(i.value[0])}var fu=e=>{let t=Y();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:Oe(r.id),action:r.action,label:Xa(r),...r.action==="move.node"?{parentId:r.payload.parent}:{},actor:Ke(r.userId,t.value.contributors[r.userId]?.name)}))):c("Issue not found")},gu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=et(e.issueId);if(a(o))return o;let s=o.value,i=dt("Issue description",e.description,2e4);if(i)return c(i);let l=s.props.description??"";if(l===e.description)return u("No changes made",{id:e.issueId,ref:H(e.issueId),description:l});let d={id:Ht(),...D(n.value),action:"edit.description",payload:{id:e.issueId,md:e.description}},p=B([d],t.value.stateBranchRoot);return a(p)?c(p.message):u("Edited issue description",{id:e.issueId,ref:H(e.issueId),description:e.description})},hu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=et(e.issueId);if(a(o))return o;let s=o.value,i=Re(e.title);if(!i.trim())return c("Issue title cannot be empty");let l=dt("Issue title",i,300);if(l)return c(l);if(s.title===i)return u("No changes made",{id:e.issueId,ref:H(e.issueId),title:i});let d={id:Ht(),...D(n.value),action:"edit.title",payload:{id:e.issueId,name:i}},p=B([d],t.value.stateBranchRoot);return a(p)?c(p.message):u("Edited issue title",{id:e.issueId,ref:H(e.issueId),title:i})};import{ulid as Rr}from"ulid";var yu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=r.value.nodes[r.value.rootNodeId];if(!o)return c("Workspace not found");if(st().mode!=="live")return c("Cannot add a board while time travelling");let s=Re(e.title);if(!s.trim())return c("Board title cannot be empty");let i=dt("Board title",s,300);if(i)return c(i);let l=_n(o.id,n.value,t.value.stateBranchRoot);if(a(l))return l;let d=Rr(),p={id:Rr(),...D(n.value),action:"add.board",payload:{id:d,name:s,parent:o.id,rank:l.value}},m=B([p],t.value.stateBranchRoot);return a(m)?c(m.message):u("Created board",{id:d,ref:H(d),title:s})},vu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=r.value.nodes[e.boardId];if(!o||o.isDeleted)return c("Board not found");if(!nr(o))return c("Edit target must be a board");if(o.readonly)return c("Cannot edit readonly board");if(st().mode!=="live")return c("Cannot rename a board while time travelling");let s=Re(e.title);if(!s.trim())return c("Board title cannot be empty");let i=dt("Board title",s,300);if(i)return c(i);if(o.title===s)return u("No changes made",{id:e.boardId,ref:H(e.boardId),title:s});let l={id:Rr(),...D(n.value),action:"edit.title",payload:{id:e.boardId,name:s}},d=B([l],t.value.stateBranchRoot);return a(d)?c(d.message):u("Edited board title",{id:e.boardId,ref:H(e.boardId),title:s})};var bu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=tu(e.boardId);if(a(o))return o;if(st().mode!=="live")return c("Cannot add a swimlane while time travelling");let s=Re(e.title);if(!s.trim())return c("Swimlane title cannot be empty");let i=dt("Swimlane title",s,300);if(i)return c(i);let l=_n(e.boardId,n.value,t.value.stateBranchRoot);if(a(l))return l;let d=Rr(),p={id:Rr(),...D(n.value),action:"add.swimlane",payload:{id:d,name:s,parent:e.boardId,rank:l.value}},m=B([p],t.value.stateBranchRoot);return a(m)?c(m.message):u("Created swimlane",{id:d,ref:H(d),title:s,boardId:e.boardId})},xu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=Sr(e.swimlaneId);if(a(o))return o;let s=o.value,i=Re(e.title);if(!i.trim())return c("Swimlane title cannot be empty");let l=dt("Swimlane title",i,300);if(l)return c(l);if(s.title===i)return u("No changes made",{id:e.swimlaneId,ref:H(e.swimlaneId),title:i});let d={id:Rr(),...D(n.value),action:"edit.title",payload:{id:e.swimlaneId,name:i}},p=B([d],t.value.stateBranchRoot);return a(p)?c(p.message):u("Edited swimlane title",{id:e.swimlaneId,ref:H(e.swimlaneId),title:i})},Iu=async e=>{let t=Kr(e.repoRoot);if(a(t))return t;let n=te();if(a(n))return n;let r=ge({repoRoot:t.value});if(a(r))return r;let o=Jt(r.value);if(a(o))return o;let s=Qt(o.value.events,o.value.unreadable);if(a(s))return s;let i=Sr(e.swimlaneId);if(a(i))return i;let l=tu(e.boardId);if(a(l))return l;let d=hn(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(a(d))return d;let p={id:Rr(),...D(n.value),action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:d.value}},m=B([p],r.value);return a(m)?c(m.message):u("Moved swimlane",{id:e.swimlaneId,ref:H(e.swimlaneId),boardId:e.boardId})},Eu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=Sr(e.swimlaneId);if(a(o))return o;let s={id:Rr(),...D(n.value),action:"delete.node",payload:{id:e.swimlaneId}},i=B([s],t.value.stateBranchRoot);return a(i)?c(i.message):u("Deleted swimlane",{id:e.swimlaneId,ref:H(e.swimlaneId)})};import{ulid as ei}from"ulid";async function Su(e){let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Qs(e);if(a(r))return r;let o=Re(e.tagName).trim();if(!o)return c("Tag name cannot be empty");let s=dt("Tag name",o,60);if(s)return c(s);let i=Zs(r.value,et);if(!e.issueIds&&i.failed[0])return c(i.failed[0].reason);if(i.done.length===0)return c(Ho("Tagged",i).message);let l=N.findTagByName(o),d=l?.id??ei(),p=[...l?[]:[{id:ei(),...D(n.value),action:"create.tag",payload:{id:d,name:o}}],...i.done.map(({id:v})=>({id:ei(),...D(n.value),action:"add.issue.tag",payload:{id:v,tag:d}}))],m=B(p,t.value.stateBranchRoot);if(a(m))return c(m.message);let f={id:d,name:o};if(!e.issueIds)return u("Added issue tag",{...i.done[0],tag:f});let g=Ho("Tagged",i);return a(g)?g:u(g.message,{...g.value,tag:f})}var Ru=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=r.value.tags[e.tagId];if(!o)return c("Tag not found");if(o.tombstoned)return c("Tag is already deleted");let s=[{id:ei(),...D(n.value),action:"tombstone.tag",payload:{id:e.tagId}}],i=B(s,t.value.stateBranchRoot);return a(i)?c(i.message):u("Deleted tag",{id:o.id,name:o.name})};var Cu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=et(e.issueId);if(a(o))return o;if(!r.value.tags[e.tagId])return c("Tag not found");let s={id:ei(),...D(n.value),action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},i=B([s],t.value.stateBranchRoot);return a(i)?c(i.message):u("Removed issue tag",{id:e.issueId,ref:H(e.issueId),tagId:e.tagId})};import{ulid as Xr}from"ulid";var Lv=async(e,t)=>{let n=ir(e).get(t);return n===void 0?void 0:{id:t,name:n}},Nu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=et(e.issueId);if(a(o))return o;let s=e.self?n.value.userId:e.assigneeId;if(s){let b=r.value.contributors[s],R=b?void 0:await Lv(t.value.stateBranchRoot,s);if(!b&&!R)return c("Unknown assignee id");let S=b??R,A=[...b?[]:[{id:Xr(),...D(n.value),action:"create.contributor",payload:{id:S.id,name:S.name}}],{id:Xr(),...D(n.value),action:"add.issue.assignee",payload:{id:e.issueId,assignee:S.id}}],T=B(A,t.value.stateBranchRoot);return a(T)?c(T.message):u("Added issue assignee",{id:e.issueId,ref:H(e.issueId),assignee:{id:S.id,name:S.name}})}let i=Re(e.assigneeName??"").trim();if(!i)return c("Provide assigneeId, self or assigneeName");let l=dt("Assignee name",i,80);if(l)return c(l);let d=Ks({events:r.value.eventLog??[],registry:r.value.contributors,logFileNames:ir(t.value.stateBranchRoot)}).filter(b=>b.name===i);if(d.length>1)return c(`"${i}" matches ${d.length} contributors (${d.map(({id:b})=>b).join(", ")}). Assign by assigneeId to choose.`);let p=d[0];if(!p&&!e.createUnlinked)return c(`No contributor named "${i}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let m=p?.id??Xr(),f=p?.name??i,v=[...!!r.value.contributors[m]?[]:[{id:Xr(),...D(n.value),action:"create.contributor",payload:{id:m,name:f}}],{id:Xr(),...D(n.value),action:"add.issue.assignee",payload:{id:e.issueId,assignee:m}}],x=B(v,t.value.stateBranchRoot);return a(x)?c(x.message):u("Added issue assignee",{id:e.issueId,ref:H(e.issueId),assignee:{id:m,name:f}})},Au=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;if(!r.value.contributors[e.contributorId])return c("Contributor not found");if(await Lv(t.value.stateBranchRoot,e.contributorId))return c("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let i=[{id:Xr(),...D(n.value),action:"tombstone.contributor",payload:{id:e.contributorId}}],l=B(i,t.value.stateBranchRoot);return a(l)?c(l.message):u("Tombstoned contributor",{id:e.contributorId,name:mo})};var Tu=async(e={})=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=ar(t.value.stateBranchRoot);if(a(o))return c(o.message);let s=e.boardId?gv(o.value,e.boardId):o.value,i=new Set,l=Gp(t.value.stateBranchRoot);if(a(l))return c(l.message);for(let m of l.value)m.userId&&i.add(m.userId);let d=r.value.contributors,p=Ks({events:s,registry:d,logFileNames:ir(t.value.stateBranchRoot)}).map(({id:m,name:f,isExternal:g})=>({...Ke(m,f),isSelf:m===n.value.userId,isExternal:g,isRemoved:d[m]?.tombstoned===!0,hasAuthoredAnywhere:i.has(m)}));return u("Listed board contributors",p)},wu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=et(e.issueId);if(a(o))return o;if(!r.value.contributors[e.assigneeId])return c("Assignee not found");let s={id:Xr(),...D(n.value),action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},i=B([s],t.value.stateBranchRoot);return a(i)?c(i.message):u("Removed issue assignee",{id:e.issueId,ref:H(e.issueId),assigneeId:e.assigneeId})};import{ulid as cl}from"ulid";var ti=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=et(e.issueId);if(a(o))return o;let s=e.body.trim();if(!s)return c("Comment cannot be empty");if(s.length>4e3)return c(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let i=cl(),l={id:cl(),...D(n.value),action:"add.issue.comment",payload:{id:i,issue:e.issueId,md:s,author:n.value.userId}},d=B([l],t.value.stateBranchRoot);return a(d)?c(d.message):u("Added issue comment",{id:i,issueId:e.issueId,body:s})},ni=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=r.value.eventLog.find(p=>p.action==="add.issue.comment"&&p.payload.id===e.commentId);if(!o)return c("Unable to resolve comment");if(o.payload.author!==n.value.userId)return c("You can only delete your own comments");let s=et(o.payload.issue);if(a(s))return s;if(r.value.eventLog.some(p=>p.action==="delete.issue.comment"&&p.payload.id===e.commentId))return u("Comment already deleted",{id:e.commentId,issueId:o.payload.issue});let l={id:cl(),...D(n.value),action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},d=B([l],t.value.stateBranchRoot);return a(d)?c(d.message):u("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},Mu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!o)return c("Unable to resolve comment");if(o.payload.author!==n.value.userId)return c("You can only edit your own comments");let s=et(o.payload.issue);if(a(s))return s;if(r.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return c("Comment was deleted");let l=e.body.trim();if(!l)return c("Comment cannot be empty");if(l.length>4e3)return c(`Comment cannot exceed ${4e3} characters (got ${l.length})`);let d={id:cl(),...D(n.value),action:"edit.issue.comment",payload:{id:e.commentId,issue:o.payload.issue,md:l}},p=B([d],t.value.stateBranchRoot);return a(p)?c(p.message):u("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:l})};import{ulid as kv}from"ulid";var Pu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;if(!er(e.email))return c(`Not an email address: ${e.email}`);let o=Ze(e.email),s=e.contributorId??n.value.userId;if(!r.value.contributors[s])return c(`Unknown contributor: ${s}`);let i=ds(r.value.emailLinks,o);if(i.includes(s))return u(`${o} is already yours`,{contributor:s,email:o,contested:i.filter(d=>d!==s)});let l=B([{id:kv(),action:"link.contributor.email",payload:{contributor:s,email:o},userId:n.value.userId}],t.value.stateBranchRoot);return a(l)?c(l.message):u(i.length>0?`Claimed ${o}, but somebody else claims it too, so it now resolves to neither of you`:`Claimed ${o}`,{contributor:s,email:o,contested:i})},Lu=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let o=Ze(e.email),s=e.contributorId??n.value.userId,i=r.value.emailLinks[cs(o,s)];if(!i||i.tombstoned)return c(`No such link: ${o} to ${s}`);if(!_i(n.value.userId,i))return c("Only whoever made a claim, or the contributor it names, may undo it");let l=B([{id:kv(),action:"unlink.contributor.email",payload:{contributor:s,email:o},userId:n.value.userId}],t.value.stateBranchRoot);return a(l)?c(l.message):u(`Unclaimed ${o}`,{contributor:s,email:o})},dl=async(e={})=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=Y();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(v=>Ke(v,o[v]?.name))})).sort((f,g)=>f.email.localeCompare(g.email)),l=te(),d=a(l)?[]:un(r,l.value.userId),p=V().gitEmail,m=p?ds(r,p).filter(f=>a(l)||f!==l.value.userId):[];return u("Listed contributor emails",{emails:i,mine:d,git:p?{email:p,linkedToMe:d.includes(p),heldByOthers:m.map(f=>Ke(f,o[f]?.name))}:null})},ul=async(e={})=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Y();if(a(r))return r;let{userId:o,userName:s}=n.value,i=Qe(t.value.repoRoot),l=await yr({repoRoot:t.value.repoRoot,stateBranch:a(i)?void 0:i.value,names:[s,await jo(t.value.repoRoot)],links:r.value.emailLinks});if(a(l))return l;let d=vr(l.value),p=d.filter(m=>m.looksLikeYours);return u(d.length===0?"No unclaimed addresses in this history":`${d.length} unclaimed address(es) in this history, ${p.length>0?`${p.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:o,candidates:d,likely:p.length})};var Nn="1.9.0";import TA from"node:fs";import Dv from"node:path";var ri=Number(process.env.EPIQ_GUI_PORT)||3710,ku="/api/instance",Du="epiq",ml=e=>{try{return TA.realpathSync(Dv.resolve(e))}catch{return Dv.resolve(e)}},wA=e=>{let t=e;return typeof t=="object"&&t!==null&&t.app===Du&&typeof t.repoRoot=="string"&&typeof t.version=="string"&&typeof t.pid=="number"},Bv=async(e,t=500)=>{let n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let o=await fetch(`http://127.0.0.1:${e}${ku}`,{signal:n.signal});if(!o.ok)return null;let s=await o.json();return wA(s)?s:null}catch{return null}finally{clearTimeout(r)}};var MA=/^(```|~~~)[^\n]*\n[\s\S]*?\n\1[ \t]*$/gm,PA=/^(?:```|~~~)[\s\S]*$/m,LA=/^[ \t]*\|?[ \t]*:?-{2,}:?[ \t]*(?:\|[ \t]*:?-{2,}:?[ \t]*)*\|?[ \t]*$/gm,kA=/^[ \t]*\|.*$/gm,DA=/!\[[^\]]*\]\([^)]*\)/g,BA=/\[([^\]]*)\]\([^)]*\)/g,OA=/^[ \t]*(?:[#>]+[ \t]*|[-*+][ \t]+|\d+[.)][ \t]+)/gm,FA=/^[ \t]*(?:-{3,}|\*{3,}|_{3,})[ \t]*$/gm,_A=/[*`~]/g,jA=/(?<![0-9A-Za-z])_|_(?![0-9A-Za-z])/g,$A=e=>Re(e.replace(MA," ").replace(PA," ").replace(DA," ").replace(BA,"$1").replace(FA," ").replace(LA," ").replace(kA,t=>t.replaceAll("|"," ")).replace(OA,"").replace(_A,"").replace(jA,"")),UA=.5,Ov=(e,t)=>{if(t<=0)return"";let n=$A(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*UA?s.slice(0,i):s).trimEnd()}${r}`};var HA=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))}),Jr=e=>a(e)?e:u(e.message,HA(e.value)),WA=(e,t)=>(e.boards??[]).flatMap(n=>n.swimlanes??[]).flatMap(n=>n.issues??[]).find(n=>n.id===t),Fv=(e,t)=>{let n=WA(e,t);return{issueId:t,description:n?.description??"",comments:e.commentsByIssueId?.[t]??[]}},GA=280,_v=(e,t)=>({issueId:e,excerpt:Ov(t,GA)});var VA=15e3,jv=e=>{let t,n=!1,r=!1,o=0,s=i();function i(){let g=me(e.project.repoRoot);if(a(g))return null;let v=ge({repoRoot:g.value});return a(v)?null:pn(v.value)}let l=()=>{let g=Qn();return a(g)?(oe.error(g.message),null):g.value},d=()=>{let g=l();if(!g)return!1;let{autoSync:v,preferredEditor:x}=g,b=Mt(),R=a(b)?null:b.value.userName;return!!(v&&R&&x)},p=()=>{let g=l()?.autoSyncDebounceMs??VA;return Math.max(0,g-(Date.now()-o))},m=async()=>{if(!(n||r)){r=!0,o=Date.now();try{await Er(async()=>{if(st().mode!=="live")return;await Js({repoRoot:e.project.repoRoot});let g=i();if(g===null||g===s)return;s=g;let v=Jr(await Ut({repoRoot:e.project.repoRoot}));a(v)||Dr({type:"state",payload:v})})}finally{r=!1,f()}}};function f(){n||!d()||r||t||(t=setTimeout(()=>{t=void 0,m()},p()))}return f(),{queueSync:f,dispose:()=>{n=!0,t&&clearTimeout(t)}}};var zA=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),Bu=(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:!zA.has(n.hostname)},$v=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:Bu(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 LT}from"ws";var An=e=>({path:e.path,sha:e.shas[e.shas.length-1]??""});var KA=e=>{let t=e.lastIndexOf("/");return t===-1?".":e.slice(0,t)},Uv=({commits:e,patch:t})=>{let n=e.map(i=>i.time),o=t.files.map(i=>({...An(i),changed:i.addedCount+i.removed})).reduce((i,l)=>i===null||l.changed>i.changed?l: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=>KA(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 tt={line:["//"],block:[["/*","*/"]]},Wt={line:["#"],block:[]},Ou={line:["--"],block:[]},Wo={line:[],block:[["<!--","-->"]]},qA={line:[],block:[]},q=(e,t)=>({name:e,comment:t}),pl=q("TypeScript",tt),fl=q("JavaScript",tt),Hv={ts:pl,tsx:pl,mts:pl,cts:pl,js:fl,jsx:fl,mjs:fl,cjs:fl,py:q("Python",{line:["#"],block:[['"""','"""']]}),rb:q("Ruby",{line:["#"],block:[["=begin","=end"]]}),go:q("Go",tt),rs:q("Rust",tt),java:q("Java",tt),kt:q("Kotlin",tt),swift:q("Swift",tt),c:q("C",tt),h:q("C",tt),cc:q("C++",tt),cpp:q("C++",tt),hpp:q("C++",tt),cs:q("C#",tt),php:q("PHP",tt),scala:q("Scala",tt),dart:q("Dart",tt),lua:q("Lua",Ou),hs:q("Haskell",Ou),sql:q("SQL",Ou),ex:q("Elixir",Wt),exs:q("Elixir",Wt),pl:q("Perl",Wt),r:q("R",Wt),jl:q("Julia",Wt),sh:q("Shell",Wt),bash:q("Shell",Wt),zsh:q("Shell",Wt),vue:q("Vue",Wo),svelte:q("Svelte",Wo),html:q("HTML",Wo),xml:q("XML",Wo),md:q("Markdown",Wo),mdx:q("Markdown",Wo),css:q("CSS",{line:[],block:[["/*","*/"]]}),scss:q("CSS",tt),less:q("CSS",tt),yml:q("YAML",Wt),yaml:q("YAML",Wt),toml:q("TOML",Wt),ini:q("INI",Wt),json:q("JSON",qA)},YA="Other",Wv=e=>{let t=e.slice(e.lastIndexOf("/")+1),n=t.lastIndexOf(".");return n<=0?"":t.slice(n+1).toLowerCase()},Qr=e=>Hv[Wv(e)]?.name??YA,oi=e=>Hv[Wv(e)]?.comment??null,XA=[/\.(test|spec)\.[a-z0-9]+$/i,/(^|\/)test_[^/]+\.py$/,/_test\.[a-z0-9]+$/i,/(^|\/)conftest\.py$/,/Tests?\.(java|kt|cs|scala)$/],JA=/(^|\/)(tests?|__tests__|spec|specs|e2e|src\/test|features)\//i,Go=e=>JA.test(e)||XA.some(t=>t.test(e)),QA=/(^|\/)(package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|Cargo\.lock|go\.sum|poetry\.lock|Gemfile\.lock|composer\.lock)$/,ZA=/(^|\/)(node_modules|dist|build|out|target|vendor|coverage|\.next|__snapshots__)\//,eT=/(\.min\.(js|css)|\.map|\.snap|\.pb\.go|_pb2\.py)$/,sn=e=>QA.test(e)||ZA.test(e)||eT.test(e),Gv=e=>/(^|\/)(package\.json|go\.mod|Cargo\.toml|requirements[^/]*\.txt|pyproject\.toml|Gemfile|composer\.json|pom\.xml|build\.gradle(\.kts)?)$/.test(e),Vv=e=>/(^|\/)\.github\/workflows\//.test(e)||/(^|\/)(Dockerfile|docker-compose[^/]*\.ya?ml|Makefile|Jenkinsfile|\.gitlab-ci\.yml)$/.test(e)||/\.tf$/.test(e),zv=e=>/\.(md|mdx|rst|txt)$/i.test(e)||/(^|\/)docs?\//i.test(e),tT=/\b(it|test|describe|context|suite)\.skip\b|\bx(it|describe|test)\s*\(|@pytest\.mark\.skip|@unittest\.skip|\bt\.Skip\s*\(|@(Ignore|Disabled)\b/,nT=/\b(it|test|describe|context|suite)\.only\b|\bf(it|describe|test)\s*\(/,Kv=e=>tT.test(e),qv=e=>nT.test(e);var Yv=/\b(TODO|FIXME|HACK|XXX)\b/,rT=/[;{}]\s*$|^\s*(const|let|var|function|def|class|if|for|while|return|import|export|await|print)\b.*[=(]/,Fu=(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"},oT=(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},Xv=({patch:e,repoShareByLanguage:t})=>{let n=new Map,r=0,o=0,s=0,i=0,l=0,d=0;for(let m of e.files){if(m.binary||sn(m.path))continue;let f=oi(m.path);if(!f||f.line.length===0&&f.block.length===0)continue;let g=Qr(m.path),v=n.get(g)??{comment:0,code:0};for(let{text:x}of m.added){let b=Fu(x,f);if(Yv.test(x)&&i++,b==="blank"){s++;continue}if(b==="comment"){r++,v.comment++,f&&rT.test(oT(x,f))&&d++;continue}o++,v.code++}for(let{text:x}of m.removedLines)Yv.test(x)&&l++;n.set(g,v)}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:l,commentedOutCodeLines:d}};var sT=/\bconsole\.(log|debug|dir)\s*\(|\bdebugger\b|^\s*print\s*\(|\bfmt\.Print(ln|f)?\s*\(|\bSystem\.out\.print|\bdbg!\s*\(/,gl=6,_u=10,iT=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)},aT=(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)},lT=e=>{if(e.length<gl*2)return 0;let t=new Map,n=new Array(e.length).fill(!1);for(let r=0;r+gl<=e.length;r++){let o=e.slice(r,r+gl);if(o.some(l=>l.text.length<3))continue;let s=o.map(l=>l.text).join(`
|
|
101
|
+
`),i=t.get(s);if(i===void 0){t.set(s,{...o[0],at:r});continue}if(i.file!==o[0]?.file)for(let l=0;l<gl;l++)n[i.at+l]=!0,n[r+l]=!0}return n.filter(Boolean).length},Jv=({patch:e})=>{let t=[],n=[],r=[],o=!1,s=0,i=0,l=null,d=[];for(let[p,m]of e.files.entries()){if(sn(m.path)&&t.push(An(m)),Gv(m.path)&&n.push(An(m)),Vv(m.path)&&r.push(An(m)),zv(m.path)&&(o=!0),m.binary||sn(m.path))continue;let f=m.added.map(x=>x.text),g=iT(f),v=m.status!=="deleted";for(let x of f){sT.test(x)&&s++;let b=aT(x,g);b>i&&(i=b,l=An(m)),v&&d.push({text:x.trim(),file:p})}d.push({text:" ",file:p})}return{generatedPaths:t.slice(0,_u),dependencyManifests:n.slice(0,_u),buildOrCiPaths:r.slice(0,_u),docsTouched:o,debugPrintLinesAdded:s,maxIndentLevels:i,deepestFile:l,duplicatedLines:lT(d)}};var Qv=({patch:e,languagesBefore:t})=>{let n=new Map,r=0;for(let i of e.files){if(i.binary)continue;let l=i.addedCount+i.removed;if(sn(i.path)){r+=l;continue}let d=Qr(i.path),p=n.get(d)??{name:d,added:0,removed:0,addedInTests:0,share:0};p.added+=i.addedCount,p.removed+=i.removed,Go(i.path)&&(p.addedInTests+=i.addedCount),n.set(d,p)}let o=[...n.values()].reduce((i,l)=>i+l.added+l.removed,0),s=[...n.values()].map(i=>({...i,share:o===0?0:(i.added+i.removed)/o})).sort((i,l)=>l.added+l.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 cT=200,ju=2e5,dT=5e4,Zv=25,uT=64*1024*1024,$u="",mT=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/,pT=/^diff --git a\/(.+) b\/\1$/,eb=(e,t)=>e==="/dev/null"?null:e.startsWith(t)?e.slice(2):e,tb=(e,t)=>e===null?"added":t===null?"deleted":"modified",fT=()=>({byPath:new Map,insertions:0,deletions:0,selfChurn:0,retainedLines:0}),gT=(e,t)=>{let n=e.byPath,r="",o=null,s=null,i=null,l=!1,d=0,p=(f,g)=>g==="modified"&&f==="added"?"added":g,m=(f,g)=>{let v=n.get(f);if(v)return v.entry.status=p(v.entry.status,g),v.entry.shas.includes(r)||v.entry.shas.push(r),v;let b={entry:{path:f,status:g,binary:!1,added:[],addedCount:0,removed:0,removedLines:[],shas:[r]},pendingByText:new Map};return n.set(f,b),b};for(let f of t.split(`
|
|
102
|
+
`)){if(f.startsWith($u)){r=f.slice($u.length).trim(),o=null,s=null,i=null,l=!1;continue}if(f.startsWith("diff --git ")){o=null,i=null,l=!0,s=pT.exec(f)?.[1]??null;continue}if(l&&f.startsWith("Binary files ")&&s){let[,v=""]=/^Binary files (.*) differ$/.exec(f)??[],[x="",b=""]=v.split(" and ");o=m(s,tb(x==="/dev/null"?null:x,b==="/dev/null"?null:b)),o.entry.binary=!0;continue}if(l&&f.startsWith("--- ")){i=eb(f.slice(4),"a/");continue}if(l&&f.startsWith("+++ ")){let v=eb(f.slice(4),"b/"),x=v??i??s;x&&(o=m(x,tb(i,v)));continue}let g=mT.exec(f);if(g){d=Number(g[1]),l=!1;continue}if(o){if(f.startsWith("+")){let v=f.slice(1);e.insertions++,o.entry.addedCount++,e.retainedLines<ju&&(o.entry.added.push({sha:r,line:d,text:v}),e.retainedLines++),o.pendingByText.size<dT&&o.pendingByText.set(v,(o.pendingByText.get(v)??0)+1),d++;continue}if(f.startsWith("-")){let v=f.slice(1);e.deletions++,o.entry.removed++,e.retainedLines<ju&&(o.entry.removedLines.push({sha:r,line:0,text:v}),e.retainedLines++);let x=o.pendingByText.get(v)??0;x>0&&v.trim().length>2&&(e.selfChurn++,o.pendingByText.set(v,x-1))}}}},hT=e=>({files:[...e.byPath.values()].map(t=>t.entry),insertions:e.insertions,deletions:e.deletions,selfChurn:e.selfChurn,retainedLines:e.retainedLines});var nb=async({repoRoot:e,shas:t})=>{if(t.length===0)return u("No commits to scan",{files:[],insertions:0,deletions:0,selfChurn:0,scannedCommits:0,truncated:!1});let n=t.slice(0,cT).reverse(),r=fT(),o=0,s=0,i=!1;for(let d=0;d<n.length;d+=Zv){let p=n.slice(d,d+Zv),m=await U({cwd:e,args:["-c","core.quotePath=false","show","--unified=0","--no-renames","--no-color",`--format=${$u}%H`,...p]});if(a(m))return c(m.message);if(gT(r,m.value.stdout),o+=m.value.stdout.length,s+=p.length,o>uT){i=!0;break}}let l=hT(r);return u("Scanned ticket patch",{files:l.files,insertions:l.insertions,deletions:l.deletions,selfChurn:l.selfChurn,scannedCommits:s,truncated:i||s<t.length||l.retainedLines>=ju})};var yT=40,vT=/^\d{6} blob ([0-9a-f]{40})\t(.+)$/,rb=async({repoRoot:e,sha:t})=>{let n=await Be({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(`
|
|
103
|
+
`)){let f=vT.exec(m);if(!f)continue;let[,g="",v=""]=f;if(sn(v))continue;let x=Qr(v);if(r.add(x),Go(v)||!oi(v))continue;let b=o.get(x)??[];b.length<yT&&(b.push({blob:g,path:v}),o.set(x,b))}let s=[...o.values()].flat(),i=await Ni(s.map(m=>m.blob),e);if(a(i))return{languages:r,commentShareByLanguage:new Map};let l=i.value,d=new Map;for(let{blob:m,path:f}of s){let g=l.get(m);if(g===void 0)continue;let v=oi(f),x=Qr(f),b=d.get(x)??{comment:0,code:0};for(let R of g.split(`
|
|
104
|
+
`)){let S=Fu(R,v);S==="comment"&&b.comment++,S==="code"&&b.code++}d.set(x,b)}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 ob=({patch:e})=>{let t=0,n=0,r=[],o=[],s=0,i=0;for(let l of e.files)if(!(l.binary||sn(l.path))&&Go(l.path)){t+=l.addedCount,n+=l.removed,l.status==="added"&&r.push(An(l)),l.status==="deleted"&&o.push(An(l));for(let{text:d}of l.added)Kv(d)&&s++,qv(d)&&i++}return{testLinesAdded:t,testLinesRemoved:n,addedTestFiles:r,deletedTestFiles:o,skippedTestLinesAdded:s,focusedTestLinesAdded:i}};var bT=e=>e.reduce((t,n)=>t===null||n.time<t.time?n:t,null)?.sha??null,sb=async({repoRoot:e,ref:t,commits:n})=>{let r=await nb({repoRoot:e,shas:n.map(l=>l.sha)});if(a(r))return c(r.message);let o=r.value,s=bT(n),i=s?await rb({repoRoot:e,sha:s}):null;return u("Derived issue stats",{ref:t,shape:Uv({commits:n,patch:o}),languages:Qv({patch:o,languagesBefore:i?.languages??null}),tests:ob({patch:o}),comments:Xv({patch:o,repoShareByLanguage:i?.commentShareByLanguage??null}),flags:Jv({patch:o})})};var si=e=>{if(a(e))return e;let t=Ie(),n=a(t)?{}:t.value.emailLinks,r=a(t)?{}:t.value.contributors,o=Gm(n),s=e.value.map(i=>({...i,authorIdentity:Cy({authorName:i.author,authorEmail:i.authorEmail,owners:o,registry:r})}));return u(e.message,s)};var xT=32,ii=new Map;var IT=(e,t)=>{if(ii.set(e,t),ii.size>xT){let n=ii.keys().next();n.done||ii.delete(n.value)}return t},hl=async(e={idOrRef:""})=>{let t=e.idOrRef.trim();if(!t)return c("idOrRef must not be empty");let n=t.length>7?H(t):t.toUpperCase(),r=me(e.repoRoot??process.cwd());if(a(r))return c(r.message);let o=r.value,s=si(await Gn({repoRoot:o,ref:n}));if(a(s))return c(s.message);let i=s.value.map(m=>({sha:m.sha,time:m.time,author:m.authorIdentity?.resolved?m.authorIdentity.name:m.author,subject:m.subject})),l=[o,n,i.map(m=>`${m.sha}:${m.author}`).join(",")].join(" "),d=ii.get(l);if(d)return u("Derived issue stats",d);let p=await sb({repoRoot:o,ref:n,commits:i});return a(p)?c(p.message):u("Derived issue stats",IT(l,p.value))};var ET=new RegExp(`^[0-9A-Z]{${7}}$`),ST=e=>{let t=e.indexOf(" ");if(t===-1)return null;let n=e.slice(0,t).toUpperCase();return ET.test(n)?n:null},RT=e=>{let t={};for(let n of e){let r=ST(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},ib=async(e={})=>{let t=await ko({repoRoot:e.repoRoot});return a(t)?t:u("Collected diff stats by ref",RT(t.value))};var CT="Filed here",ab=(e,t)=>e.set(t,(e.get(t)??0)+1),lb=(e,t,n)=>[...e.entries()].map(([r,o])=>({laneId:r,title:r===null?CT:n(r),count:o,share:t===0?0:o/t})).sort((r,o)=>o.count-r.count||r.title.localeCompare(o.title)),cb=(e,t,n)=>{let r=new Map,o=new Map,s=0,i=0;for(let l of t)for(let[d,p]of l.entries()){if(p!==e)continue;s++,ab(r,l[d-1]??null);let m=l[d+1];m!==void 0&&(i++,ab(o,m))}return{arrived:s,departed:i,arrivesFrom:lb(r,s,n),movesOnTo:lb(o,i,n)}};var db=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 ai=1440*60*1e3,NT=({laneIds:e,journeys:t,now:n,days:r})=>{let o=n-(r-1)*ai,s=new Map(e.map(i=>[i,Array.from({length:r},()=>[])]));for(let i of t)for(let[l,d]of i.entries()){let p=s.get(d.laneId);if(!p)continue;let m=i[l+1]?.enteredAt,f=Math.max(0,Math.ceil((d.enteredAt-o)/ai)),g=m===void 0?r-1:Math.min(r-1,Math.ceil((m-o)/ai)-1);for(let v=f;v<=g;v++)p[v].push(o+v*ai-d.enteredAt)}return Object.fromEntries([...s].map(([i,l])=>[i,l.map((d,p)=>({t:o+p*ai,median:db(d.sort((m,f)=>m-f)),count:d.length}))]))},ub=({laneId:e,journeys:t,now:n,days:r})=>NT({laneIds:[e],journeys:t,now:n,days:r})[e];var AT=40,TT=30,wT=()=>({tickets:0,commits:0,insertions:0,deletions:0}),MT=async(e,t)=>{let n=wT();for(let r of t.slice(0,AT)){let o=await hl({repoRoot:e,idOrRef:H(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},mb=async e=>{let t=Y();if(a(t))return t;let{nodes:n}=t.value;if(!n[e.swimlaneId])return c("Swimlane not found");let o=Object.values(n).filter(_),s=o.map(d=>Jd(d.log??[],Oe(d.id))),i=cb(e.swimlaneId,s.map(d=>d.map(p=>p.laneId)),d=>n[d]?.title??"Elsewhere"),l=o.filter(d=>d.parentNodeId===e.swimlaneId).map(d=>d.id);return u("Derived swimlane stats",{swimlaneId:e.swimlaneId,createdAt:Oe(e.swimlaneId),...i,stayTrend:ub({laneId:e.swimlaneId,journeys:s,now:Date.now(),days:TT}),code:await MT(e.repoRoot,l)})};var pb=new Set(["sync","email:link","email:unlink","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 fb=e=>{let t=Un({exclude:e});return a(t)?[]:t.value.map(n=>({projectId:n.projectId,name:bo(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},gb=e=>{let t=Un();if(a(t))return c(t.message);let n=t.value.find(r=>r.root===e);return n?u("Resolved recent project",n.root):c(`Not a recent project: ${e}`)};import{z as k}from"zod";var ne=k.string().min(1),hb=k.discriminatedUnion("at",[k.object({at:k.literal("start")}),k.object({at:k.literal("end")}),k.object({at:k.literal("before"),sibling:ne}),k.object({at:k.literal("after"),sibling:ne})]),li=k.number().finite(),ue=(e,t)=>k.object({type:k.literal(e),payload:t}),ci=e=>k.object({type:k.literal(e)}),PT=k.discriminatedUnion("type",[ci("state:get"),ci("issues:list"),ci("sync"),ci("time-travel:live"),ci("diff-stats:get"),ue("project:open",k.object({root:k.string().min(1)})),ue("issues:create",k.object({title:k.string(),parentId:ne,description:k.string().optional(),tagNames:k.array(k.string()).optional()})),ue("board:create",k.object({title:k.string()})),ue("board:edit:title",k.object({boardId:ne,title:k.string()})),ue("swimlane:create",k.object({title:k.string(),boardId:ne})),ue("swimlane:edit:title",k.object({swimlaneId:ne,title:k.string()})),ue("swimlane:delete",k.object({swimlaneId:ne})),ue("swimlane:move",k.object({swimlaneId:ne,boardId:ne,position:hb.optional()})),ue("issues:move",k.object({issueId:ne,parentId:ne,position:hb.optional()})),ue("issue:edit:title",k.object({issueId:ne,title:k.string()})),ue("issue:edit:description",k.object({issueId:ne,description:k.string()})),ue("issue:tag:add",k.object({issueId:ne,tagName:k.string()})),ue("issue:tag:remove",k.object({issueId:ne,tagId:ne})),ue("contributor:remove",k.object({contributorId:ne})),ue("tag:remove",k.object({tagId:ne})),k.object({type:k.literal("contributors:get"),payload:k.object({boardId:ne.optional()}).optional()}),ue("issue:assignee:add",k.object({issueId:ne,assigneeId:ne.optional(),assigneeName:k.string().optional(),createUnlinked:k.boolean().optional()})),ue("issue:assignee:remove",k.object({issueId:ne,assigneeId:ne})),ue("issue:close",k.object({issueId:ne})),ue("issue:reopen",k.object({issueId:ne})),ue("issue:comment:add",k.object({issueId:ne,body:k.string()})),ue("issue:comment:delete",k.object({issueId:ne,commentId:ne})),ue("issue:comment:edit",k.object({issueId:ne,commentId:ne,body:k.string()})),ue("issue:get",k.object({issueId:ne})),ue("issue:preview:get",k.object({issueId:ne})),k.object({type:k.literal("timeline:get"),payload:k.object({start:li.optional(),end:li.optional(),boardId:ne.optional(),requestId:k.number().finite().optional()}).optional()}),k.object({type:k.literal("commits:get"),payload:k.object({start:li.optional(),end:li.optional(),requestId:k.number().finite().optional()}).optional()}),ue("time-travel:scrub",k.object({targetTime:li})),ue("time-travel:checkout-event",k.object({eventId:k.string().min(1)})),ue("commit:inspect",k.object({sha:k.string()})),k.object({type:k.literal("emails:get")}),ue("email:link",k.object({email:k.string().min(1).max(254),contributorId:k.string().min(1).optional()})),ue("email:unlink",k.object({email:k.string().min(1).max(254),contributorId:k.string().min(1).optional()})),ue("commit:diff:get",k.object({sha:k.string()})),ue("issue:commits:get",k.object({issueId:ne})),ue("issue:squashed-diff:get",k.object({issueId:ne})),ue("issue:stats:get",k.object({issueId:ne})),ue("swimlane:stats:get",k.object({swimlaneId:ne}))]);var yb=e=>{let t=PT.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 kT=1024*1024,Uu=()=>{Dr({type:"state",payload:Jr(qr())})},le=(e,t)=>{e.send(JSON.stringify(t))},di=async(e,t)=>{let n=Jr(await Ut({repoRoot:t}));return a(n)&&n.message===tc?le(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:fb(t)}}):le(e,{type:"state",payload:n})},DT=async(e,t)=>{let n=()=>le(e,{type:"state",payload:Jr(qr())});if(st().mode!=="live")return n();let r=await Ut({repoRoot:t});return st().mode!=="live"?n():le(e,{type:"state",payload:Jr(r)})},Ve=async(e,t,n,r,o)=>{if(le(e,{type:r,payload:o}),a(o))return le(e,{type:"failed",payload:o.message});n(),DT(e,t)},vb=(e,t,{onStateChanged:n,getPort:r})=>{new LT({server:e,path:"/ws",maxPayload:kT,verifyClient:s=>!Bu(s.origin,r())}).on("connection",s=>{mf(s),s.on("message",async i=>{let l=async d=>{let{type:p}=d,m=t.repoRoot;if(p==="project:open"){let f=gb(d.payload.root);return le(s,{type:"project:open:result",payload:f}),a(f)?void 0:(t.repoRoot=f.value,di(s,f.value))}if(p==="timeline:get"){let{requestId:f,...g}=d.payload??{};return le(s,{type:"timeline",requestId:f,payload:await Iv({repoRoot:m,...g})})}if(p==="issue:get"){let f=d.payload?.issueId,g=qr(),v=fu(f);return le(s,{type:"issue",payload:a(g)?g:u("Issue detail",{...Fv(g.value,f),history:a(v)?[]:v.value})})}if(p==="issue:preview:get"){let{issueId:f}=d.payload,g=iu(f);return le(s,{type:"issue:preview:result",payload:{issueId:f,result:a(g)?g:u("Issue preview",_v(f,g.value))}})}if(p==="commits:get"){let{requestId:f,...g}=d.payload??{};return le(s,{type:"commits",requestId:f,payload:si(await ko({repoRoot:m,...g}))})}if(p==="emails:get")return le(s,{type:"emails",payload:await dl({repoRoot:m}),suggestions:await ul({repoRoot:m})});if(p==="email:link"||p==="email:unlink"){let g=await(p==="email:link"?Pu:Lu)({repoRoot:m,...d.payload});return le(s,{type:"emails",payload:await dl({repoRoot:m}),suggestions:await ul({repoRoot:m}),lastAction:a(g)?{ok:!1,message:g.message}:{ok:!0,message:g.message}}),Ve(s,m,n,`${p}:result`,g)}if(p==="commit:inspect")return le(s,{type:"commit:inspect:result",payload:await js({repoRoot:m,sha:d.payload.sha})});if(p==="commit:diff:get"){let{sha:f}=d.payload;return le(s,{type:"commit:diff:result",payload:{sha:f,result:await fd({repoRoot:m,sha:f})}})}if(p==="issue:commits:get"){let{issueId:f}=d.payload;return le(s,{type:"issue:commits:result",payload:{issueId:f,result:si(await Gn({repoRoot:m,ref:H(f)}))}})}if(p==="issue:squashed-diff:get"){let{issueId:f}=d.payload;return le(s,{type:"issue:squashed-diff:result",payload:{issueId:f,result:await gd({repoRoot:m,ref:H(f)})}})}if(p==="issue:stats:get"){let{issueId:f}=d.payload;return le(s,{type:"issue:stats:result",payload:{issueId:f,result:await hl({repoRoot:m,idOrRef:H(f)})}})}if(p==="diff-stats:get")return le(s,{type:"diff-stats",payload:await ib({repoRoot:m})});if(p==="swimlane:stats:get"){let{swimlaneId:f}=d.payload;return le(s,{type:"swimlane:stats:result",payload:{swimlaneId:f,result:await mb({repoRoot:m,swimlaneId:f})}})}if(p==="time-travel:scrub"){let f=await eu({repoRoot:m,targetTime:d.payload.targetTime});return le(s,{type:"time-travel:result",payload:f}),a(f)?void 0:Uu()}if(p==="time-travel:checkout-event"){let f=await Sv({repoRoot:m,eventId:d.payload.eventId});return le(s,{type:"time-travel:result",payload:f}),a(f)?void 0:Uu()}if(p==="time-travel:live"){let f=await Rv({repoRoot:m});return le(s,{type:"time-travel:result",payload:f}),a(f)?void 0:Uu()}if(p==="state:get")return di(s,m);if(p==="sync"){let f=await Js({repoRoot:m});return le(s,{type:"sync:result",payload:f}),n(),di(s,m)}if(p==="issue:comment:add"){let f=await ti({repoRoot:m,...d.payload});return Ve(s,m,n,"issue:comment:add:result",f)}if(p==="issue:comment:edit"){let f=await Mu({repoRoot:m,...d.payload});return Ve(s,m,n,"issue:comment:edit:result",f)}if(p==="issue:comment:delete"){let f=await ni({repoRoot:m,...d.payload});return le(s,{type:"issue:comment:delete:result",payload:f}),a(f)?le(s,{type:"failed",payload:f.message}):(n(),di(s,m))}if(p==="issue:edit:description"){let f=await gu({repoRoot:m,...d.payload});return Ve(s,m,n,"issue:edit:description:result",f)}if(p==="issue:edit:title"){let f=await hu({repoRoot:m,...d.payload});return Ve(s,m,n,"issue:edit:title:result",f)}if(p==="issue:tag:add"){let f=await Su({repoRoot:m,...d.payload});return Ve(s,m,n,"issue:tag:add:result",f)}if(p==="issue:tag:remove"){let f=await Cu({repoRoot:m,...d.payload});return Ve(s,m,n,"issue:tag:remove:result",f)}if(p==="contributor:remove"){let f=await Au({repoRoot:m,...d.payload});return Ve(s,m,n,"contributor:remove:result",f)}if(p==="tag:remove"){let f=await Ru({repoRoot:m,...d.payload});return Ve(s,m,n,"tag:remove:result",f)}if(p==="contributors:get")return le(s,{type:"contributors",payload:await Tu({repoRoot:m,...d.payload})});if(p==="issue:assignee:add"){let f=await Nu({repoRoot:m,...d.payload});return Ve(s,m,n,"issue:assignee:add:result",f)}if(p==="issue:assignee:remove"){let f=await wu({repoRoot:m,...d.payload});return Ve(s,m,n,"issue:assignee:remove:result",f)}if(p==="issues:list")return le(s,{type:"issues",payload:await cu({repoRoot:m})});if(p==="issues:create"){let f=await du({...d.payload,repoRoot:m});return le(s,{type:"issues:create:result",payload:f}),a(f)?Dr({type:"failed",payload:f.message}):(n(),di(s,m))}if(p==="board:create"){let f=await yu({...d.payload,repoRoot:m});return Ve(s,m,n,"board:create:result",f)}if(p==="board:edit:title"){let f=await vu({...d.payload,repoRoot:m});return Ve(s,m,n,"board:edit:title:result",f)}if(p==="swimlane:create"){let f=await bu({...d.payload,repoRoot:m});return Ve(s,m,n,"swimlane:create:result",f)}if(p==="swimlane:edit:title"){let f=await xu({...d.payload,repoRoot:m});return Ve(s,m,n,"swimlane:edit:title:result",f)}if(p==="swimlane:delete"){let f=await Eu({...d.payload,repoRoot:m});return Ve(s,m,n,"swimlane:delete:result",f)}if(p==="swimlane:move"){if(!d.payload.position)return le(s,{type:"error",message:"Missing move position"});let f=await Iu({...d.payload,repoRoot:m});return Ve(s,m,n,"swimlane:move:result",f)}if(p==="issues:move"){if(!d.payload.position)return le(s,{type:"error",message:"Missing move position"});let f=await pu({...d.payload,repoRoot:m});return Ve(s,m,n,"issues:move:result",f)}if(p==="issue:close"){let f=await uu({repoRoot:m,issueId:d.payload.issueId});return Ve(s,m,n,"issue:close:result",f)}if(p==="issue:reopen"){let f=await mu({repoRoot:m,issueId:d.payload.issueId});return Ve(s,m,n,"issue:reopen:result",f)}return le(s,{type:"error",message:"Unknown message type"})};try{let d=yb(JSON.parse(i.toString()));if(!d.ok)return le(s,{type:"error",message:d.error});let p=d.message;return pb.has(p.type)?await Er(async()=>st().mode!=="live"?le(s,{type:"failed",payload:"Read-only while viewing history"}):l(p)):await l(p)}catch(d){return le(s,{type:"error",message:d instanceof Error?d.message:String(d)})}})})};var FT=Zr.dirname(OT(import.meta.url)),_T=process.env.IS_LOCAL==="true"?Zr.resolve(process.cwd(),"dist/gui"):Zr.join(FT,"gui"),yl,jT=async()=>(yl===void 0&&(yl=await import("node:sea").catch(()=>null)),yl?.isSea()?yl:null),De=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},$T=e=>De(e,409,{isError:!0,message:"Read-only while viewing history"}),vl=(e,t)=>Er(async()=>st().mode!=="live"?$T(e):t()),bb=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)}),UT=2*1024*1024,HT={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},WT=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",xb=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),r=Zr.resolve(_T),o=Zr.resolve(r,n),s=Zr.relative(r,o);if(s.startsWith("..")||Zr.isAbsolute(s))return De(t,403,{isError:!0,message:"Forbidden"});let i=await jT();try{let l=i?Buffer.from(i.getAsset(`gui/${s}`)):await Ib(o);return t.writeHead(200,{"content-type":WT(o)}),t.end(l)}catch{return De(t,404,{isError:!0,message:`Not found: ${n}`})}},GT=async(e,t=ri)=>new Promise((n,r)=>{let o=s=>{let i=d=>{if(e.off("listening",l),d.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),o(0);return}r(d)},l=()=>{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",l),e.listen(s,"127.0.0.1")};o(t)}),Eb=async e=>{dv(!1);let t=0,n={repoRoot:e.repoRoot},r=BT.createServer(async(i,l)=>{let d=new URL(i.url??"/","http://127.0.0.1"),p=$v({method:i.method,origin:i.headers.origin,contentType:i.headers["content-type"]},t);if(p)return De(l,p.status,{isError:!0,message:p.message});if(i.method==="GET"&&d.pathname===ku)return De(l,200,{app:Du,repoRoot:ml(n.repoRoot),version:Nn,pid:process.pid});if(d.pathname==="/api/state")return De(l,200,await Ut({repoRoot:n.repoRoot}));if(i.method==="POST"&&d.pathname==="/api/comments")try{let m=await bb(i);if(!m.issueId||!m.body?.trim())return De(l,400,{isError:!0,message:"Missing issueId or body"});let f=m.issueId,g=m.body;return await vl(l,async()=>{let v=await ti({repoRoot:n.repoRoot,issueId:f,body:g});return a(v)?De(l,400,{isError:!0,message:v.message}):De(l,200,await Ut({repoRoot:n.repoRoot}))})}catch(m){return De(l,400,{isError:!0,message:m instanceof Error?m.message:"Unable to add comment"})}if(i.method==="POST"&&d.pathname==="/api/attachments")try{let m=await bb(i,UT);if(!m.issueId||!m.dataBase64)return De(l,400,{isError:!0,message:"Missing issueId or dataBase64"});let f=m.issueId,g=m.dataBase64,v=m.name??"";return await vl(l,async()=>{let x=await ru({repoRoot:n.repoRoot,issueId:f,name:v,dataBase64:g});return a(x)?De(l,400,{isError:!0,message:x.message}):De(l,200,{...await Ut({repoRoot:n.repoRoot}),attachment:x.value})})}catch(m){return De(l,400,{isError:!0,message:m instanceof Error?m.message:"Unable to add attachment"})}if(i.method==="DELETE"&&d.pathname.startsWith("/api/attachments/")){let m=decodeURIComponent(d.pathname.replace("/api/attachments/",""));return m?vl(l,async()=>{let f=await ou({repoRoot:n.repoRoot,attachmentId:m});return a(f)?De(l,400,{isError:!0,message:f.message}):De(l,200,await Ut({repoRoot:n.repoRoot}))}):De(l,400,{isError:!0,message:"Missing attachment id"})}if(i.method==="GET"&&d.pathname.startsWith("/media/")){let m=decodeURIComponent(d.pathname.replace("/media/","")),f=await su({repoRoot:n.repoRoot,fileName:m});if(a(f))return De(l,404,{isError:!0,message:f.message});try{let g=await Ib(f.value.filePath);return l.writeHead(200,{"content-type":HT[f.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),l.end(g)}catch{return De(l,404,{isError:!0,message:"Attachment blob not found"})}}if(i.method==="DELETE"&&d.pathname.startsWith("/api/comments/")){let m=decodeURIComponent(d.pathname.replace("/api/comments/",""));return m?vl(l,async()=>{let f=await ni({repoRoot:n.repoRoot,commentId:m});return a(f)?De(l,400,{isError:!0,message:f.message}):De(l,200,await Ut({repoRoot:n.repoRoot}))}):De(l,400,{isError:!0,message:"Missing comment id"})}return d.pathname.startsWith("/board/")||d.pathname==="/log"?xb("/",l):xb(d.pathname,l)});try{t=await GT(r)}catch(i){return c(i instanceof Error?`Unable to start GUI server: ${i.message}`:`Unable to start GUI server: ${String(i)}`)}let o=jv({project:n});vb(r,n,{onStateChanged:()=>o.queueSync(),getPort:()=>t}),r.on("close",o.dispose);let s=r.address();return!s||typeof s=="string"?(r.close(),c("Unable to resolve GUI server address")):u("Started GUI server",{url:`http://epiq.localhost:${s.port}${e.boardId?`/board/${e.boardId}`:""}`,server:r})};var Rb=async e=>{let t=oo({});if(a(t))return c(t.message);let n=Mt();be(n)&&ke(n.value);let r=await Bv(ri);if(r&&r.repoRoot===ml(e.repoRoot)){let i=`http://127.0.0.1:${ri}`;return console.log(`Epiq GUI already running for this project at ${Sb.cyan(i)}`),ac(i),u("Reused running GUI",{url:i})}let o=await Eb({...e,boardId:""});if(a(o))return o;let{url:s}=o.value;return console.log(`Epiq GUI running at ${Sb.cyan(s)}`),ac(s),u("Started GUI",{url:s})};import{Box as qn}from"ink";import Le from"react";import{Box as Hu,Text as ui}from"ink";import an,{useEffect as VT,useMemo as zT}from"react";import{ulid as KT}from"ulid";var Cb=({text:e,match:t,color:n,highlightColor:r=h.secondary,dimColor:o=!1})=>{if(!t)return an.createElement(ui,{color:n,dimColor:o},e);let s=e.toLowerCase(),i=t.toLowerCase(),l=s.indexOf(i);return l===-1?an.createElement(ui,{color:n,dimColor:o},e):an.createElement(ui,{color:n,dimColor:o},e.slice(0,l),an.createElement(ui,{backgroundColor:r,bold:!0},e.slice(l,l+t.length)),e.slice(l+t.length))},Nb=KT(),qT=e=>`${e}`,YT=e=>{let{pendingNavTarget:t}=gr();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(_e(C.NONE,{breadCrumb:n,contextNode:r,readOnly:y().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 l=Ra(i),d=Za.find(p=>p.intent===l);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,l)=>i.isAvailable!==l.isAvailable?i.isAvailable?-1:1:i.command.localeCompare(l.command))},XT=e=>Ce.text({id:Nb,parentNodeId:e,rank:"000000",name:"Command Palette",readonly:!0,isVirtual:!0}),JT=(e,t,n)=>Ce.text({id:qT(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,disabled:!e.isAvailable,readonly:!0,isVirtual:!0}),Wu=[],QT=e=>{Ab();let t=N.createNode(XT(y().rootNodeId));a(t)||!tr(t.value)||(Wu=[t.value,...e.map((n,r)=>JT(n,r,Nb)).map(N.createNode).filter(be).map(({value:n})=>n).filter(tr)],$.navigate({contextNode:t.value,selectedIndex:0}))},Ab=()=>{let e=Wu.map(t=>t.id);Wu=[];for(let t of e)N.deleteNode(t)};function Tb({width:e,height:t}){let r=Ag().value.trim().toLowerCase(),o=zT(()=>YT(r),[r]);VT(()=>(QT(o),()=>{Ab()}),[o]);let s=y().selectedIndex;return an.createElement(Hu,{flexDirection:"column",width:e,height:t-2},an.createElement(mt,{height:t-4,itemHeight:3,selectedIndex:s},o.map((i,l)=>{let d=l===s,p=i.isAvailable?h.accent:h.secondary2,m=i.isAvailable?"":"[unavailable] ";return an.createElement(Hu,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:h.secondary,borderStyle:"single"},an.createElement(ui,{color:p,dimColor:!i.isAvailable},d?"\u276F ":" ",an.createElement(Cb,{text:Jm(i.command),match:r,color:p,dimColor:!i.isAvailable})),an.createElement(Hu,{paddingLeft:2},an.createElement(Cb,{text:m+i.description,match:r.length>=2?r:"",color:d&&i.isAvailable?h.primary:h.secondary2,dimColor:!i.isAvailable})))})))}import{Box as pw}from"ink";import Il from"react";import pi from"chalk";import{Box as mi,Text as Lb}from"ink";import eo,{useEffect as kb,useMemo as ZT,useState as Db}from"react";var Vo=["\u2803","\u2806","\u2830","\u2818"],wb=120,Mb=({isPalette:e,isPending:t,frame:n})=>{if(t){let r=(n%Vo.length+Vo.length)%Vo.length;return Vo[r]}return e?"?":":"},Pb=({infoMessage:e,isPending:t})=>t&&e.includes(fe)?"":e;var Bb=pi.hex(h.secondary),ew=pi.inverse,tw=pi.inverse.hex(h.secondary2),nw={hint:"",hints:[],overlap:0,remainder:""},Fb=({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}},rw=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ze(t);return{bg:r=>pi.bgHex(n).black(r),bgCursor:r=>pi.bgHex(n).inverse.black(r)}}return uc(t)},ow=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Fb({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}},Ob=()=>({value:ut.value,cursorPosition:ut.cursorPosition,commandIsPending:ut.commandIsPending,autoCompletion:ut.commandMeta.autoCompletion??nw,infoMessage:ut.commandMeta.infoMessage,validationStatus:ut.commandMeta.validity,command:ut.commandMeta.command,inputString:ut.commandMeta.inputString,modifier:ut.commandMeta.modifier}),sw=(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,_b=({width:e,mode:t})=>{let[n,r]=Db(Ob());kb(()=>{let A=()=>{let P=Ob();r(M=>sw(M,P)?M:P)},T=rd(A);return A(),()=>{T()}},[]);let{value:o,cursorPosition:s,infoMessage:i,commandIsPending:l,autoCompletion:d,command:p,modifier:m,validationStatus:f}=n,g=l&&f===Sn.Invalid,v=Pb({infoMessage:i,isPending:l}),[x,b]=Db(0);kb(()=>{if(!l){b(0);return}let A=setInterval(()=>{b(T=>(T+1)%Vo.length)},wb);return()=>{clearInterval(A)}},[l]);let R=Mb({isPalette:t===I.PALETTE,isPending:l,frame:x}),S=ZT(()=>{let A=Math.max(0,Math.min(s,o.length)),T=Fb({value:o,command:p}),P=ow({value:o,command:p,modifier:m}),M=p?uc(p):null,O=rw({command:p,modifier:m}),W=(it,ft)=>{let no=T&&ft>=T.start&&ft<T.end,Fl=P&&ft>=P.start&&ft<P.end;return no&&M?M.fg(it):Fl&&O?O.bg(it):it},J=(it,ft)=>{let no=T&&ft>=T.start&&ft<T.end,Fl=P&&ft>=P.start&&ft<P.end;return no&&M?M.fgCursor(it):Fl&&O?O.bgCursor(it):ew(it)},Ee=o.slice(0,A),F=o[A]??" ",X=A<o.length?o.slice(A+1):"",rt=Array.from(Ee).map((it,ft)=>W(it,ft)).join(""),Yn=J(F,A),Jo=Array.from(X).map((it,ft)=>W(it,A+1+ft)).join("");if(d.hint){let it=d.hint[d.overlap]??F;Yn=tw(it),Jo=Bb(d.remainder.slice(1)+X)}return rt+Yn+Jo},[o,s,d,p,m]);return eo.createElement(mi,{flexDirection:"column",justifyContent:"flex-start"},eo.createElement(mi,{flexDirection:"column",paddingX:1,borderColor:h.secondary,borderStyle:"round",width:e},eo.createElement(mi,{height:1,flexWrap:"nowrap"},eo.createElement(mi,{flexShrink:0},eo.createElement(Lb,{wrap:"truncate-start"},Bb(R),S)),v&&eo.createElement(mi,{flexShrink:1,minWidth:0},eo.createElement(Lb,{wrap:"truncate",color:g?h.red:h.secondary2},` ${v} `)))))};import{Box as iw,Text as fi}from"ink";import zo from"react";var jb=" ",aw=({keys:e,label:t})=>e.length+1+t.length,lw=(e,t)=>{let n=[],r=0;for(let o of e){let i=(n.length>0?jb.length:0)+aw(o);if(r+i>t-4)break;n.push(o),r+=i}return n},$b=({width:e,availableHints:t})=>{let n=lw(t,e);return zo.createElement(iw,{width:e,borderStyle:"round",borderColor:h.secondary,paddingX:1},n.length?zo.createElement(fi,{wrap:"truncate"},n.map(({keys:o,label:s},i)=>zo.createElement(fi,{key:`${o}-${s}`},i>0?jb:"",zo.createElement(fi,{color:h.accent},o),zo.createElement(fi,{color:h.secondary2}," ",s)))):zo.createElement(fi,{color:h.secondary2},"\xA0"))};import{Box as cw,Text as bl}from"ink";import gi,{useEffect as dw,useRef as Ko,useState as uw}from"react";var mw=40,xl=.3,Gu="\u2500",Ub=1,Hb=16,Wb=({width:e})=>{let{replay:t}=re(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),i=s*Ub,[l,d]=uw(0),p=Ko(r);p.current=r;let m=Ko(0),f=Ko(0),g=Ko(0),v=Ko(0),x=Ko(0);if(dw(()=>{if(!n){m.current=0,g.current=0,v.current=0,x.current=0,d(0);return}m.current=p.current,f.current=Date.now(),g.current=p.current;let T=setInterval(()=>{let P=Date.now(),M=p.current;if(M!==g.current){let F=M-g.current,X=P-f.current;if(F<0)v.current=0,x.current=0;else if(F>0&&X>0){let rt=F/X;v.current=v.current===0?rt:v.current*(1-xl)+rt*xl,x.current=x.current===0?F:x.current*(1-xl)+F*xl}m.current=M,f.current=P,g.current=M}let O=P-f.current,W=Math.min(x.current,v.current*O),J=Math.min(1,m.current+W),Ee=Math.round(J*i);d(F=>F===Ee?F:Ee)},mw);return()=>clearInterval(T)},[n,i]),!t)return null;let b=T=>{let P=s>1?T/(s-1):0,M=Math.round(P*(Hb-1))/(Hb-1);return Di(M)},R=Math.min(s,Math.floor(l/Ub)),S=[];for(let T=0;T<R;T++){let P=b(T),M=S[S.length-1];M&&M.color===P?M.text+=Gu:S.push({text:Gu,color:P})}let A=Gu.repeat(Math.max(0,s-R));return gi.createElement(cw,{width:e,borderStyle:"round",borderColor:h.secondary,paddingX:1,columnGap:1},gi.createElement(bl,{color:h.secondary2},"\u25B6"),gi.createElement(bl,null,S.map((T,P)=>gi.createElement(bl,{key:P,color:T.color},T.text)),gi.createElement(bl,{color:h.secondary,dimColor:!0},A)))};var hi=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=re(),o=t===I.COMMAND_LINE||t===I.PALETTE;return Il.createElement(pw,null,o?Il.createElement(_b,{width:e,mode:t}):r==="replay"?Il.createElement(Wb,{width:e}):Il.createElement($b,{width:e,mode:t,availableHints:n}))};import{Box as Cr,Text as qo}from"ink";import vt,{useEffect as fw,useMemo as gw}from"react";import{ulid as Gb}from"ulid";var Sl=Gb(),hw=()=>[...new Set([...y().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(Vd).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})),yw=e=>Ce.text({id:Sl,parentNodeId:e,rank:"000000",name:"Help",isVirtual:!0,readonly:!0}),vw=(e,t,n)=>Ce.text({id:Gb(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,readonly:!0,isVirtual:!0}),El=[],Vb=()=>{let e=El.filter(n=>n.id!==Sl).map(n=>n.id),t=El.filter(n=>n.id===Sl).map(n=>n.id);El=[];for(let n of[...e,...t])N.deleteNode(n)},bw=e=>{Vb();let t=N.createNode(yw(y().rootNodeId));if(a(t)||!tr(t.value))return logger.error("Could not attach help nodes");El=[t.value,...e.map((n,r)=>vw(n,r,Sl)).map(N.createNode).filter(be).map(({value:n})=>n).filter(tr)],$.navigate({contextNode:t.value,selectedIndex:0})},zb=({width:e,height:t})=>{let n=gw(()=>hw(),[]);fw(()=>(bw(n),()=>{Vb()}),[n]);let r=y().selectedIndex;return vt.createElement(Cr,{flexDirection:"column",marginTop:3,borderColor:h.secondary,borderStyle:"round",width:e,height:t-2},vt.createElement(Cr,{paddingX:1,justifyContent:"center"},vt.createElement(qo,{color:h.accent},"Help"),vt.createElement(qo,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),vt.createElement(Cr,{paddingX:1,marginTop:1},vt.createElement(Cr,{width:20,justifyContent:"flex-end"},vt.createElement(qo,{color:h.secondary},"Key(s)")),vt.createElement(Cr,{flexGrow:1,width:40,paddingLeft:2},vt.createElement(qo,{color:h.secondary},"Action"))),vt.createElement(mt,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},i)=>{let l=i===r;return vt.createElement(Cr,{paddingX:1,key:`${o}-${s}-${i}`,flexDirection:"row"},vt.createElement(Cr,{width:20,justifyContent:"flex-end"},vt.createElement(qo,{color:h.accent},o)),vt.createElement(Cr,{flexGrow:1,width:40,paddingLeft:2},vt.createElement(qo,{color:l?h.primary:h.secondary2},s)))})))};import{Box as Yo,Text as bt}from"ink";import we,{useEffect as xw,useState as Vu}from"react";var Rl=({index:e,email:t,note:n,noteColor:r})=>we.createElement(Yo,null,we.createElement(bt,{color:h.accent},e===void 0?" ":` ${e}.`),we.createElement(bt,null," ",t),n&&we.createElement(bt,{color:r??h.secondary2},` ${n}`)),Kb=({height:e})=>{let[t,n]=Vu([]),[r,o]=Vu([]),[s,i]=Vu(null),{userName:l,gitEmail:d,gitName:p,userId:m}=V();return xw(()=>{let f=!0;return(async()=>{let v=Ie(),x=me(process.cwd());if(a(v)||a(x)||!m)return;let b=v.value.emailLinks,R=un(b,m);n(R.map(P=>({email:P,others:ds(b,P).filter(M=>M!==m).map(M=>v.value.contributors[M]?.name??M)})));let S=Qe(x.value),A=await yr({repoRoot:x.value,stateBranch:a(S)?void 0:S.value,names:[l,p],links:b});if(!f)return;if(a(A)){i(A.message);return}let T=vr(A.value);xo(T.map(P=>P.email)),o(T)})(),()=>{f=!1}},[m,l,p,d]),we.createElement(Yo,{height:e-4,flexDirection:"column",paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},we.createElement(Yo,null,we.createElement(bt,{color:h.accent,bold:!0},l??"Not configured"),we.createElement(bt,{color:h.secondary2}," on this board")),s&&we.createElement(bt,{color:h.red},s),we.createElement(Yo,{flexDirection:"column"},we.createElement(bt,{color:h.secondary2},"CLAIMED"),t.length===0?we.createElement(Rl,{email:"Nothing claimed \u2014 your commits show the name git signed them with.",note:""}):t.map(f=>we.createElement(Rl,{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?h.yellow:void 0}))),we.createElement(Yo,{flexDirection:"column"},we.createElement(bt,{color:h.secondary2},"UNCLAIMED IN THIS HISTORY"),r.length===0?we.createElement(Rl,{email:"Nothing left to claim here."}):r.map(f=>we.createElement(Rl,{key:f.email,email:f.email,note:`${f.commits} commit${f.commits===1?"":"s"} as ${f.names.join(", ")||"unknown"}`}))),we.createElement(Yo,{flexDirection:"column"},we.createElement(bt,{color:h.secondary2},we.createElement(bt,{color:h.accent},"[enter]")," writes a claim for the first into the command line, to confirm or change."),we.createElement(bt,{color:h.secondary2},we.createElement(bt,{color:h.accent},":config emails")," claims by address,",we.createElement(bt,{color:h.accent}," :config emails-unclaim "),"gives one back."),we.createElement(bt,{color:h.secondary2},we.createElement(bt,{color:h.accent},"[esc]")," to close")))};import Iw from"chalk";import{Box as to,Text as nt}from"ink";import Me from"react";var Ew=8,Sw=()=>{let e=Un({exclude:process.cwd()});return a(e)?[]:e.value.slice(0,Ew)},qb=({width:e,height:t})=>{let n=Sw();return Me.createElement(to,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},Me.createElement(nt,{color:h.accent,bold:!0},"Initialize project"),Me.createElement(nt,null,`This folder is not an ${Iw.hex(h.accent)("epiq")} project yet.`),Me.createElement(nt,{color:h.primary},"To start tracking issues here, we need to initialize a new",Me.createElement(nt,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json "),"file in this repository."),Me.createElement(to,{marginTop:1,flexDirection:"column"},Me.createElement(to,null,Me.createElement(nt,{color:h.accent}," "),Me.createElement(nt,{color:h.primary},"Type "),Me.createElement(nt,{backgroundColor:h.secondary}," :init "))),Me.createElement(to,{marginTop:1},Me.createElement(nt,{color:h.secondary2},"This will create, commit and push "),Me.createElement(nt,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json ")),n.length>0&&Me.createElement(to,{marginTop:1,flexDirection:"column"},Me.createElement(nt,{color:h.accent,bold:!0},"Or open a recent project"),n.map((r,o)=>Me.createElement(to,{key:r.projectId},Me.createElement(nt,{color:h.accent},` ${o+1} `),Me.createElement(nt,{color:h.primary},bo(r.root)),Me.createElement(nt,{color:h.secondary2},` ${r.root}`))),Me.createElement(to,{marginTop:1},Me.createElement(nt,{color:h.accent}," "),Me.createElement(nt,{color:h.primary},"Type "),Me.createElement(nt,{backgroundColor:h.secondary}," :open 1 "),Me.createElement(nt,{color:h.secondary2}," or "),Me.createElement(nt,{backgroundColor:h.secondary}," :open <path> "))))};import{Box as Nl,Text as Bt}from"ink";import $e from"react";import{Box as Cl,Text as Kn}from"ink";import Dt,{useEffect as Rw,useState as Yb}from"react";var Xb=()=>{let[e,t]=Yb(null),[n,r]=Yb(null);return Rw(()=>{let o=!0;return(async()=>{let i=Ie(),l=me(process.cwd());if(a(i)||a(l))return;let d=Qe(l.value),{userName:p,gitName:m}=V(),f=await yr({repoRoot:l.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=vr(f.value);xo(g.map(v=>v.email)),t(g)})(),()=>{o=!1}},[]),n?Dt.createElement(Cl,{marginTop:1},Dt.createElement(Kn,{color:h.red},n)):e===null?null:e.length===0?Dt.createElement(Cl,{marginTop:1},Dt.createElement(Kn,{color:h.secondary2},"No unclaimed addresses in this history \u2014 type",Dt.createElement(Kn,{color:h.accent}," :config emails none "),"to move on.")):Dt.createElement(Cl,{flexDirection:"column",marginTop:1},e.map(o=>Dt.createElement(Kn,{key:o.email},Dt.createElement(Kn,{color:h.accent}," \xB7 "),Dt.createElement(Kn,null,o.email),Dt.createElement(Kn,{color:h.secondary2},` ${o.commits} commit${o.commits===1?"":"s"} as ${o.names.join(", ")||"unknown"}`))),Dt.createElement(Cl,{marginTop:1},Dt.createElement(Kn,{color:h.secondary2},"Claim yours by address, or",Dt.createElement(Kn,{color:h.accent}," none "),"to skip.")))};var Cw=({isDone:e,command:t,value:n,verb:r="Type",hint:o})=>$e.createElement(Nl,null,$e.createElement(Bt,{color:h.accent,dimColor:e},e?" \u2714 ":" "),$e.createElement(Bt,{dimColor:e},r," "),$e.createElement(Bt,{backgroundColor:h.secondary,dimColor:e}," "+t+" "),n!==void 0&&$e.createElement($e.Fragment,null,$e.createElement(Bt,{dimColor:e}," "),$e.createElement(Bt,{color:h.secondary,dimColor:e},"<"+n+">")),o),Nw=(e,t)=>e.length===0?void 0:On(e.join(", "),Math.max(12,t-34)),Aw=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function zu({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:i,isSetAutoSync:l,isSetEmails:d,claimedEmails:p,emailSetupDeclined:m}=Hn(),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:l,command:":config autosync",value:i,message:"Almost there. Configure auto sync."},{key:"emails",done:d,command:":config emails",value:m?"declined":Nw(p,e),message:"Last one. Claim the git addresses whose commits are yours, so the board calls them by your name."}],g=f.findIndex(x=>!x.done),v=g===-1?void 0:f[g];return $e.createElement(Nl,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},$e.createElement(Bt,{color:h.accent,bold:!0},"Welcome! \u{1F539}"),$e.createElement(Bt,null,"Let's get you started - it's a breeze."),$e.createElement(Bt,{color:h.secondary2},"Remember - you can always search available commands by typing:",$e.createElement(Bt,{color:h.accent}," ? ")),v&&$e.createElement(Bt,{color:h.secondary2},v.message),$e.createElement(Nl,{flexDirection:"column"},f.map((x,b)=>{if(!(g===-1||b<=g))return null;let S=b===g,A=S&&g===0;return $e.createElement(Nl,{key:x.key,flexDirection:"column",marginBottom:1},$e.createElement(Cw,{isDone:x.done,command:A?":config us":x.command,value:x.done?Aw(x.value):void 0,verb:S&&!A?"Waiting:":"Type",hint:A?$e.createElement(Bt,{color:h.secondary2}," then ",$e.createElement(Bt,{color:h.accent},"tab")," to auto-complete ",$e.createElement(Bt,{backgroundColor:h.secondary},` ${x.command.split(" ").pop()} `)):void 0}),x.key==="emails"&&!x.done&&$e.createElement(Xb,null))})))}import Pl from"chalk";import{Box as vi,Text as Xo}from"ink";import Je from"react";import{Box as Al,Text as Jb}from"ink";import Nr from"react";import Tw from"chalk";var ww=e=>(N.getTag(e)?.name??"").length+3,Mw=e=>{let t=N.getContributor(e);return(t?t.name:"").length+3},Qb=({width:e})=>{let{viewMode:t}=V(),n=re(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:i}=n,l=i[o.id]?.[s],d=Nt(l?.id??o.id,"TICKET"),p=be(d)?d.value:void 0,m=(p?.props.tags??[]).filter(M=>N.getTag(M)),f=p?.props.assignees??[],g=p?.parentNodeId?!Xd(o.id,p.parentNodeId)&&t==="dense":!1,v=r.map((M,O)=>{let W=O===r.length-1,J=xe(M.id),Ee=W?J?.[s]?.title:void 0;return`${O?" / ":""}${M.title??""}${Ee?` \u25B8 ${Ee}`:""}`}).join(""),x=p?N.getCommentsByIssue(p.id):[],b=x.length?String(x.length).length+11:0,R=g?m.reduce((M,O)=>M+ww(O),0)+f.reduce((M,O)=>M+Mw(O),0)+b:0,S=l?.id!=null&&!(t==="wide"&&_(l)),A=Math.max(0,e-R),T=v.substring(0,A)+(S?Tw.hex(h.secondary2).dim(` ${H(l.id)}`):""),P=g?[...m.map(M=>Nr.createElement(Al,{key:`tag-${M}`,paddingLeft:1},Nr.createElement(Co,{id:M}))),...f.map(M=>Nr.createElement(Al,{key:`assignee-${M}`,paddingLeft:1},Nr.createElement(cr,{id:M}))),x.length?Nr.createElement(Al,{key:"comments",paddingLeft:1},Nr.createElement(Jb,{color:h.accent},"[",x.length," comment",x.length===1?"":"s","]")):null]:[];return Nr.createElement(Al,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Nr.createElement(Jb,{color:h.secondary2},T),P)};import{Box as Pw,Text as Zb}from"ink";import Tl from"react";var Lw=({filters:e})=>Tl.createElement(Pw,{columnGap:1},Tl.createElement(Zb,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Tl.createElement(Zb,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),ex=Tl.memo(Lw);import{Box as kw,Text as wl}from"ink";import yi from"react";function tx(){let{eventLog:e,unappliedEvents:t}=re(),n=e.at(-1)?.id,r=Li(n??""),o=be(r)?wa(r.value):"INVALID DATE";return yi.createElement(kw,{paddingLeft:1},yi.createElement(wl,{backgroundColor:h.accent,color:h.secondary}," Readonly "),yi.createElement(wl,{color:h.accent}," "+t.length+" edits ago at "+o+"."),yi.createElement(wl,{color:h.accent}," Resume with "),yi.createElement(wl,{backgroundColor:h.accent,color:h.secondary}," ",":peek now"," "))}import{Box as Dw,Text as Ku}from"ink";import Ml from"react";function nx(){let{replay:e}=re();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return Ml.createElement(Dw,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},Ml.createElement(Ku,{backgroundColor:h.accent,color:h.secondary}," \u25B6 REPLAY "),Ml.createElement(Ku,{color:h.secondary2},wa(new Date(r))),Ml.createElement(Ku,{color:h.accent},`${t}/${n} edits`))}import qu from"chalk";import{Box as Bw,Text as rx}from"ink";import Yu,{useEffect as Ow,useState as Fw}from"react";var _w=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],jw=150,ox=12,$w=.36,sx=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},Uw=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},Hw=(e,t,n)=>{let r=sx(e),o=sx(t);return Uw({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Ww=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,s=e[r],i=e[Math.min(r+1,e.length-1)];return Hw(s,i,o)};function ix({syncStatus:e,autoSync:t}){let[n,r]=Fw(0);Ow(()=>{if(e.status!=="syncing"){r(0);return}let l=0,d=setInterval(()=>{l+=1;let p=(Math.sin(l*$w)+1)/2,m=Math.round(p*(ox-1));r(f=>f===m?f:m)},jw);return()=>clearInterval(d)},[e.status]);let o={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},i={synced:h.secondary2,failed:h.yellow,offline:h.secondary2,pending:h.secondary2,syncing:Ww(_w,n/(ox-1))??""}[e.status];return Yu.createElement(Bw,null,Yu.createElement(rx,null,qu.hex(h.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Yu.createElement(rx,null,qu.hex(i)("\u25CF")+qu.hex(h.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import ux from"chalk";import{Text as mx}from"ink";import px,{useEffect as Kw,useState as qw}from"react";import Xu from"chalk";var Gw="https://registry.npmjs.org/epiq/latest",Ju=null,ax=0,Vw=1e3*60*60*24,lx=e=>e.replace(/^v/,""),zw=(e,t)=>{let n=lx(e).split(".").map(Number),r=lx(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},cx=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Ju&&Date.now()-ax<Vw)return Ju;try{let t=await fetch(Gw);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?zw(r,e)>0:!1};return Ju=o,ax=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},dx=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,i)=>s!=n[i]);return r.map((s,i)=>i>=o?Xu.hex(h.accent).dim(s):Xu.hex(h.secondary).dim(s)).join(Xu.hex(h.secondary2).dim("."))};function fx(){let[e,t]=qw({current:Nn,latest:null,updateAvailable:!1});return Kw(()=>{let n=!0;return cx(Nn).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?px.createElement(mx,{dimColor:!0,color:h.secondary2},Nn+" "):px.createElement(mx,null,ux.hex(h.secondary2).dim(Nn),ux.hex(h.accent).dim(" \u2197 "),dx(Nn,e.latest))}function bi({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=re(),{userName:i,preferredEditor:l,autoSync:d}=V(),p=64,m=process.stdout.columns-p-8,f=t||n==="replay",g=s?Bn(s.currentLabel,Math.max(0,m)):"";return Je.createElement(vi,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?Je.createElement(vi,{paddingLeft:1},Je.createElement(Xo,{color:h.secondary2},g)):f?Je.createElement(Xo,null," "):o===I.PALETTE?Je.createElement(vi,null,Je.createElement(Xo,{color:h.accent},"Command Palette"),Je.createElement(Xo,{dimColor:!0,color:h.secondary2}," ","- search, select and press enter")):Je.createElement(vi,{paddingLeft:1},e.length>0?Je.createElement(ex,{filters:e}):Je.createElement(Qb,{width:m})),n==="live"?Je.createElement(vi,{columnGap:1,paddingRight:2,"max-width":p,overflow:"hidden",justifyContent:"flex-end"},Je.createElement(ix,{autoSync:!!d,syncStatus:r}),Je.createElement(Xo,null,Pl.hex(h.secondary2).dim("Mode: ")+Pl.hex(h.secondary2).dim(o.padEnd(8," "))," "),Je.createElement(gx,{icon:"@",value:i}),Je.createElement(gx,{icon:"\u276F",value:l}),Je.createElement(fx,null)):"",n==="peek"?Je.createElement(tx,null):"",n==="replay"?Je.createElement(nx,null):"")}function gx({icon:e,value:t}){return Je.createElement(Xo,null,Pl.dim(e)+Pl.hex(h.accent)(` ${t??"-"} `))}import{Box as Yw,Text as Xw}from"ink";import xi from"react";import{Box as Ll,Text as Qu}from"ink";import Ar from"react";function Zu(){let e=re(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?ce(t?.id):[];return Ar.createElement(Ll,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:h.secondary,width:s},Ar.createElement(Ll,{padding:1,paddingTop:0,paddingBottom:0},Ar.createElement(Qu,null,"Select a board:")),Ar.createElement(Ll,{padding:1,flexDirection:"column"},i.map((l,d)=>{let p=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===d,f=ce(l.id).flatMap(({id:g})=>xe(g)).length;return Ar.createElement(Ll,{key:l.id??d},Ar.createElement(Qu,{color:p?h.accent:h.secondary2},Ar.createElement(St,{isSelected:p})),Ar.createElement(Qu,{color:p?h.accent:h.secondary2},l.title," (",f," issues)",l.readonly?" \u{1F512}":""))})))}var Jw=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:i})=>{let{renderedChildrenIndex:l}=re(),d=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return xi.createElement(Yw,{flexDirection:"row"},e.context==="WORKSPACE"?xi.createElement(Zu,null):d?xi.createElement(Ua,{height:f,width:i,swimlanes:(l[d.id]??[]).filter(g=>g!==void 0&&mn(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):xi.createElement(Xw,null))},hx=xi.memo(Jw);import{useEffect as Qw}from"react";var Zw=e=>{Qw(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:i}=V();i&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:l,mode:d}=y();d==="default"&&!l&&ma(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},yx=({autoSync:e})=>(Zw(e),null);function em({width:e,height:t}){let n=re(),{autoSync:r,viewMode:o}=Om(),s=n.filters;if(n.mode===I.HELP)return Le.createElement(qn,{flexDirection:"column"},Le.createElement(zb,{width:e,height:t}));if(n.mode===I.IDENTITY)return Le.createElement(qn,{flexDirection:"column"},Le.createElement(Kb,{width:e,height:t}));if(n.mode===I.PALETTE)return Le.createElement(qn,{flexDirection:"column"},Le.createElement(bi,{filters:s}),Le.createElement(Tb,{width:e,height:t-2}),Le.createElement(hi,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=Hn(),l=!i,d=i&&!n.hasProjectDefinition;if(l)return Le.createElement(qn,{flexDirection:"column"},Le.createElement(qn,{flexDirection:"column"},Le.createElement(bi,{hideBreadCrumb:!0,filters:s}),Le.createElement(zu,{height:t,width:e})),Le.createElement(hi,{width:e,mode:n.mode,availableHints:[]}));if(d)return Le.createElement(qn,{flexDirection:"column"},Le.createElement(qn,{flexDirection:"column"},Le.createElement(bi,{hideBreadCrumb:!0,filters:s}),Le.createElement(qb,{height:t,width:e})),Le.createElement(hi,{width:e,mode:n.mode,availableHints:[]}));let p=ht(n.breadCrumb??[],"BOARD");if(be(p)){let m=p.value.id,f=ce(m).length,g=3,v=Math.floor(e/g),x=Math.floor(e/Math.max(f,1));e=Math.min(x,v)*Math.max(f,g)}return Le.createElement(qn,{flexDirection:"column"},Le.createElement(yx,{autoSync:r}),Le.createElement(qn,{flexDirection:"column"},Le.createElement(bi,{filters:s}),Le.createElement(hx,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),Le.createElement(hi,{width:e,mode:n.mode,availableHints:n.availableHints}))}import eM from"readline";var kl,Dl,Tn,tM=new Set([E.MoveCursorLeft,E.EraseInputWord,E.MoveCursorLeftOfWord,E.MoveCursorRight,E.MoveCursorRightOfWord,E.NavToPreviousContainer,E.NavToNextContainer,E.NavPreviousItem,E.NavNextItem,E.NavPreviousItemJump,E.NavNextItemJump,E.SetViewDense,E.SetViewWide,E.Confirm,E.Exit,E.Yank,E.InitCommandLine,E.InitCommandPalette,E.ExitCommandLine,E.CaptureInput,E.EraseInput,E.EraseInputWord,E.HideHelp,E.ViewHelp,E.SetViewDense,E.SetViewWide,E.GetLastCommandFromHistory,E.GetNextCommandFromHistory,E.AutoCompleteCommand]),nM=new Set([E.NavPreviousItem,E.NavNextItem,E.NavPreviousItemJump,E.NavNextItemJump,E.NavToPreviousContainer,E.NavToNextContainer,E.Confirm,E.Exit,E.InitCommandPalette,E.InitMove,E.MoveNextItem,E.MovePreviousItem,E.MoveNextItemJump,E.MovePreviousItemJump,E.MoveToNextContainer,E.MoveToPreviousContainer,E.Delete,E.AddItem,E.EditTitle,E.EditDescription,E.ConfirmMove,E.Edit,E.ViewHelp,E.Yank]),vx=async e=>{if(e.ctrl&&e.name==="c")return $.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=y(),s=Tg(e,n);if(!s||r&&!tM.has(s)||o==="replay"&&n===I.DEFAULT&&nM.has(s))return;let i=t[n]?.[s];if(i?.action)try{await i.action(i,e)}catch(l){logger.error(l)}},rM=()=>async function(t,n){n.name!=="escape"&&(Tn&&(clearTimeout(Tn),Tn=void 0),await vx(n))},oM=()=>async function(t){if(t.length===1&&t[0]===27){Tn&&clearTimeout(Tn),Tn=setTimeout(()=>{vx({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Tn=void 0},25);return}Tn&&(clearTimeout(Tn),Tn=void 0)};function bx(){kl&&process.stdin.removeListener("keypress",kl),Dl&&process.stdin.removeListener("data",Dl),kl=rM(),Dl=oM(),eM.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Dl),process.stdin.on("keypress",kl)}async function xx(){try{let e=oo({});if(a(e))return Zt(0,e.message);let t=Mt();be(t)&&ke(t.value);let n=me(process.cwd());ke({gitEmail:await il(process.cwd()),gitName:await jo(process.cwd())});let r=be(n)?await Va(n.value):ay();if(a(r))return r;let o=tm();return a(o)?Zt(6,o.message):(bx(),be(n)&&za(n.value),u("Booted Epiq",void 0))}catch(e){return Zt(0,go(e))}}Gh();var lM=`${ln.bold("Epiq CLI")}
|
|
91
105
|
|
|
92
|
-
${
|
|
93
|
-
${
|
|
106
|
+
${ln.dim("Boot in directory:")}
|
|
107
|
+
${ln.cyan("$ epiq")}
|
|
94
108
|
|
|
95
|
-
${
|
|
96
|
-
${
|
|
109
|
+
${ln.dim("Launch GUI:")}
|
|
110
|
+
${ln.cyan("$ epiq gui")}
|
|
97
111
|
|
|
98
|
-
${
|
|
99
|
-
${
|
|
100
|
-
`,
|
|
101
|
-
${e.message}`)),process.exitCode=1)}else{console.clear();let e=await
|
|
102
|
-
${e.message}`)),process.exitCode=1)}export{
|
|
112
|
+
${ln.dim("Act as somebody other than the configured user:")}
|
|
113
|
+
${ln.cyan("$ epiq --as claude")}
|
|
114
|
+
`,nm=iM(lM,{importMeta:import.meta,version:Nn,flags:{init:{type:"boolean",default:!1},as:{type:"string"}}}),Bl=nm.input[0];Bl&&Bl!=="gui"&&(console.error(ln.red(`Unknown command: ${Bl}`)),process.exit(1));if(nm.flags.as!==void 0){let e=$l(nm.flags.as,"--as");a(e)&&(console.error(ln.red(e.message)),process.exit(1))}var Ix=process.stdout.columns||120,Ex=process.stdout.rows||20,Ol=null,cM=e=>{try{return Ol?(Ol.rerender(e),u("Rerendered app",void 0)):(Ol=sM(e),u("Rendered app",void 0))}catch(t){return c(`Unable to render app: ${go(t)}`)}},tm=()=>cM(aM.createElement(em,{width:Ix,height:Ex}));process.stdout.on("resize",()=>{if(Ix=process.stdout.columns||120,Ex=process.stdout.rows||20,!Ol)return;let e=tm();a(e)&&logger.info(`[boot:resize] ${e.message}`)});if(Bl==="gui"){let e=await Rb({repoRoot:process.cwd()});a(e)&&(console.error(ln.red(`Failed to start Epiq GUI:
|
|
115
|
+
${e.message}`)),process.exitCode=1)}else{console.clear();let e=await xx();a(e)&&(logger.info(e.message),console.error(ln.red(`Failed to boot Epiq:
|
|
116
|
+
${e.message}`)),process.exitCode=1)}export{tm as renderApp};
|