epiq 1.6.0 → 1.6.1
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 +13 -2
- package/dist/index.js +36 -36
- package/dist/mcp.js +29 -29
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import Cn from"chalk";import{render as
|
|
3
|
-
`,"utf8"),u("Created project.json",null)}catch(o){return i(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};import
|
|
2
|
+
import Cn from"chalk";import{render as UI}from"ink";import _I from"meow";import $I from"react";import Cx from"chalk";import Ff from"node:crypto";var Qt={Success:"success",Fail:"fail"},i=e=>({status:Qt.Fail,message:e,value:null}),u=(e,t)=>({status:Qt.Success,message:e,value:t}),d=e=>e.status==="fail",de=e=>e.status==="success";var Gn="EPIQ_USER_NAME",vo="EPIQ_USER_ID",fd="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Of=26,gd=80,fi=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),gi=e=>e.trim().length>0&&e.length<=gd,yo=e=>e.trim().toLowerCase(),Uf=e=>{let t=Ff.createHash("sha256").update(`epiq:actor:${yo(e)}`).digest(),n="";for(let r=0;r<Of;r++)n+=fd[(t[r]??0)%fd.length];return n},Vn=(e,t=process.env)=>{let n=(t[Gn]??"").trim(),r=(t[vo]??"").trim();return n?gi(n)?!r&&e.userId&&e.userName&&yo(e.userName)===yo(n)?u("Actor override names the configured user",{userId:e.userId,userName:e.userName}):r&&!fi(r)?i(`${vo} must be 26 characters of Crockford base32`):r&&e.userId&&r===e.userId?i(`${vo} 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||Uf(n),userName:r?n:yo(n)}):i(`${Gn} must be 1-${gd} characters of text`):r?i(`${vo} is set without ${Gn}`):u("No actor override",null)};import ag from"node:path";import{z as $t}from"zod";import Er from"node:fs";import Nt from"node:path";import en from"node:fs";import it from"node:path";import hr from"node:fs";import{ulid as _f}from"ulid";import{z as bo}from"zod";var $f="__epiq_state__",jf=bo.object({projectId:bo.string().min(1),stateBranch:bo.string().min(1),createdAt:bo.iso.datetime()}),xo=()=>({projectId:_f(),stateBranch:$f,createdAt:new Date().toISOString()}),Ct=e=>{let t=Io(e);if(!hr.existsSync(t))return i("Missing .epiq/project.json");try{let n=hr.readFileSync(t,"utf8"),r=JSON.parse(n),o=jf.safeParse(r);return o.success?u("Read project.json",o.data):i(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return i(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},vr=e=>{let t=Ct(e);return d(t)?i(t.message):u("Read projectId",t.value.projectId)},hd=({repoRoot:e,fileContents:t})=>{let n=yr(e),r=Io(e);try{if(hr.mkdirSync(n,{recursive:!0}),hr.existsSync(r)){let o=Ct(e);return d(o)?i(o.message):u("Project already initialized",null)}return hr.writeFileSync(r,JSON.stringify(t,null,2)+`
|
|
3
|
+
`,"utf8"),u("Created project.json",null)}catch(o){return i(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};import Hf from"node:os";import Wf from"node:path";var pt=".epiq-global",Rn=()=>process.env.EPIQ_GLOBAL_DIR??Wf.join(Hf.homedir(),pt);var hi=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let a=r(...s);if(!n.has(a)){let c=e(...s).then(l=>(d(l)&&n.delete(a),l));n.set(a,c)}return n.get(a)});return o.clear=()=>n.clear(),o};import br from"fs";import xi from"path";import Gf from"util";var vd=1e3,Vf=50,vi=0,yd=()=>process.env.EPIQ_MCP==="true",bd=()=>{let e=process.cwd(),t=Eo(e);return d(t)?yd()?xi.join(process.cwd(),".epiq-mcp.log"):void 0:xi.join(t.value,et,"log","epiq.log")};function Kf(){let e=bd();if(!e||!br.existsSync(e))return;let n=br.readFileSync(e,"utf8").split(`
|
|
4
4
|
`);if(n[n.length-1]===""&&n.pop(),n.length<=vd)return;let r=n.slice(-vd).join(`
|
|
5
5
|
`)+`
|
|
6
|
-
`;br.writeFileSync(e,r,"utf8")}function yi(e,t,n=!1){let r=bd();if(!r)return;let o=
|
|
7
|
-
`;br.mkdirSync(xi.dirname(r),{recursive:!0}),br.appendFileSync(r,c,"utf8"),vi++,vi>=
|
|
6
|
+
`;br.writeFileSync(e,r,"utf8")}function yi(e,t,n=!1){let r=bd();if(!r)return;let o=Gf.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
|
|
7
|
+
`;br.mkdirSync(xi.dirname(r),{recursive:!0}),br.appendFileSync(r,c,"utf8"),vi++,vi>=Vf&&(vi=0,Kf())}var bi=()=>yd()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",Y={info(...e){let t=bi();(t==="info"||t==="debug")&&yi("[Info]",e,!1)},debug(...e){bi()==="debug"&&yi("[Debug]",e,!0)},error(...e){let t=bi();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;yi("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=Y;import{spawn as Id}from"node:child_process";import An from"node:fs";import Tn from"node:path";var xe={stage:({cwd:e,pathspec:t})=>_({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:r})=>_({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...r?.length?["--",...r]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>_({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>_({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>_({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 _({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>_({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>_({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>_({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>_({args:["worktree","prune"],cwd:e})};var Zt=e=>{let t=_e(e);if(d(t))return i("Unable to resolve epiq project root");let n=Ct(t.value);return d(n)?i("Unable to read project.json"):u("Resolved state branch",n.value.stateBranch)},st="origin";var So=1e4,zf=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(Tn.delimiter))if(t)for(let n of e){let r=Tn.join(t,n);try{if(!An.statSync(r).isFile())continue;return An.accessSync(r,An.constants.X_OK),r}catch{continue}}return"git"},Ed=zf(),Sd={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},Cd=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!An.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(i(p));return}let o=Id(Ed,e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Sd}),s=!1,a="",c="",l=p=>{s||(s=!0,clearTimeout(m),r(p))},m=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${So}ms`].join(`
|
|
8
8
|
`);l(n?{stdout:a,stderr:p,exitCode:124}:i(p))},So);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{a+=p}),o.stderr.on("data",p=>{c+=p}),o.on("error",p=>{if(n){l({stdout:a,stderr:p.message,exitCode:1});return}l(i([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
|
|
9
9
|
`)))}),o.on("close",p=>{let f=p??1;if(n){l({stdout:a,stderr:c,exitCode:f});return}if(f!==0){l(i([`git ${e.join(" ")}`,c.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
|
|
10
10
|
`)));return}l(u("Git command succeeded",{stdout:a,stderr:c,exitCode:f}))})}),_=({args:e,cwd:t})=>Cd({args:e,cwd:t,allowFail:!1}),Je=({args:e,cwd:t})=>Cd({args:e,cwd:t,allowFail:!0}),Nd=(e,t)=>new Promise(n=>{if(e.length===0){n(u("No blobs to read",new Map));return}let r=Id(Ed,["cat-file","--batch"],{cwd:t,stdio:["pipe","pipe","pipe"],env:Sd}),o=[],s="",a=!1,c=m=>{a||(a=!0,clearTimeout(l),n(m))},l=setTimeout(()=>{r.kill("SIGTERM"),c(i(`git cat-file --batch timed out after ${So}ms`))},So);r.stdout.on("data",m=>o.push(m)),r.stderr.setEncoding("utf8"),r.stderr.on("data",m=>{s+=m}),r.on("error",m=>c(i(m.message))),r.on("close",m=>{if(m!==0){c(i(`git cat-file --batch exited ${m}${s?`
|
|
@@ -12,73 +12,73 @@ ${s}`:""}`));return}let p=Buffer.concat(o),f=new Map,g=0;for(let I of e){let E=p
|
|
|
12
12
|
`)+`
|
|
13
13
|
`),r.stdin.end()}),Kn=async({cwd:e,message:t,pathspec:n})=>{let r=await xe.commit({cwd:e,message:t,pathspec:n});if(d(r))return i(`Failed to create commit
|
|
14
14
|
${r.message}`);let o=await _({args:["rev-parse","HEAD"],cwd:e});return d(o)?i(`Commit created, but failed to read HEAD SHA
|
|
15
|
-
${o.message}`):u("Created commit and resolved SHA",o.value.stdout.trim())},Ii=async e=>{let t=await _({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return i(t.message);let n=t.value.stdout.trim();return u("Resolved git dir",Tn.isAbsolute(n)?n:Tn.resolve(e,n))},
|
|
16
|
-
`).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(xr).includes(r);return u("Checked worktree registration",o)},Ci=async e=>{let t=await Je({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return u("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Ro=async e=>{let t=await _({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?i(t.message):u("Resolved current branch",t.value.stdout.trim())},Ad=async e=>{let t=await _({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?i(t.message):u("Resolved short HEAD sha",t.value.stdout.trim())},Td=e=>e.includes("fetch first")||e.includes("non-fast-forward"),
|
|
15
|
+
${o.message}`):u("Created commit and resolved SHA",o.value.stdout.trim())},Ii=async e=>{let t=await _({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return i(t.message);let n=t.value.stdout.trim();return u("Resolved git dir",Tn.isAbsolute(n)?n:Tn.resolve(e,n))},qf=async e=>{let t=await Ii(e);if(d(t))return i(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,a]of Object.entries(r))if(An.existsSync(Tn.join(n,s)))return u("Checked for in-progress Git operation",a);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,a]of Object.entries(o))if(An.existsSync(Tn.join(n,s)))return u("Checked for in-progress Git operation",a);return u("Checked for in-progress Git operation",null)},Co=async e=>{let t=await qf(e);return d(t)?i(t.message):u("Checked for in-progress Git operation",t.value!==null)},Ei=async({repoRoot:e})=>{let n=(await Je({args:["remote","get-url",st],cwd:e})).exitCode===0;return u(`Checked remote ${n}`,n)},Si=async({repoRoot:e,branch:t})=>{let n=await Je({args:["ls-remote","--heads",st,t],cwd:e});return n.exitCode!==0?i(n.stderr.trim()||`Unable to inspect remote branch ${st}/${t}`):u("Checked remote branch",n.stdout.trim().length>0)},No=async({repoRoot:e,branch:t})=>{let n=await Je({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):i(n.stderr.trim()||`Unable to inspect branch ${t}`)},xr=e=>{try{return An.realpathSync.native(e)}catch{return Tn.resolve(e)}},Rd=async({repoRoot:e,worktreeRoot:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return i(n.message);let r=xr(t),o=n.value.stdout.split(`
|
|
16
|
+
`).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(xr).includes(r);return u("Checked worktree registration",o)},Ci=async e=>{let t=await Je({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return u("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Ro=async e=>{let t=await _({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?i(t.message):u("Resolved current branch",t.value.stdout.trim())},Ad=async e=>{let t=await _({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?i(t.message):u("Resolved short HEAD sha",t.value.stdout.trim())},Td=e=>e.includes("fetch first")||e.includes("non-fast-forward"),Yf=async e=>(await Je({cwd:e,args:["rebase","--abort"]})).exitCode===0?u("Aborted stale rebase",!0):u("No rebase to abort",!1),xd=async e=>{let t=await Je({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},Ni=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)||/git command timed out after/i.test(e),Xf=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),Ri=async({cwd:e,branch:t})=>{let n=await Yf(e);if(d(n))return i(n.message);let r=await xd(e),o=await xe.fetch({cwd:e,remote:st,branch:t});if(d(o))return Xf(o.message)?u("Remote branch missing, skipped pull",!1):i(`Failed to fetch ${t}
|
|
17
17
|
${o.message}`);let s=await xe.rebaseOnto({cwd:e,ref:`${st}/${t}`});if(d(s))return i(`Failed during rebase
|
|
18
|
-
${s.message}`);let a=await xd(e),c=r!==null&&a!==null&&r!==a;return u(c?"Pulled with rebase":"Already up to date",c)},wd=async e=>{let t=await Je({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)},Md=async e=>{let t=await Je({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?i(t.stderr.trim()||"Unable to inspect the worktree for changes"):u("Inspected worktree for changes",t.stdout.trim().length>0)},Pd=async(e,t)=>{let n=await Je({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):i(n.stderr.trim()||"Unable to inspect staged changes")};var Ld=async e=>{let t=await Ro(e);return d(t)?i(t.message):u("Checked detached HEAD state",t.value==="HEAD")};var Dd="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Bd=e=>it.join(et,wn,e),Fd=()=>it.join(et,wi),Od=Rn,Ao=()=>it.join(Od(),"worktrees"),Se=({repoRoot:e})=>{let t=vr(e);return d(t)?i(t.message):u("Resolved state branch root",it.join(Ao(),t.value))},
|
|
18
|
+
${s.message}`);let a=await xd(e),c=r!==null&&a!==null&&r!==a;return u(c?"Pulled with rebase":"Already up to date",c)},wd=async e=>{let t=await Je({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)},Md=async e=>{let t=await Je({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?i(t.stderr.trim()||"Unable to inspect the worktree for changes"):u("Inspected worktree for changes",t.stdout.trim().length>0)},Pd=async(e,t)=>{let n=await Je({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):i(n.stderr.trim()||"Unable to inspect staged changes")};var Ld=async e=>{let t=await Ro(e);return d(t)?i(t.message):u("Checked detached HEAD state",t.value==="HEAD")};var Dd="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Bd=e=>it.join(et,wn,e),Fd=()=>it.join(et,wi),Od=Rn,Ao=()=>it.join(Od(),"worktrees"),Se=({repoRoot:e})=>{let t=vr(e);return d(t)?i(t.message):u("Resolved state branch root",it.join(Ao(),t.value))},Jf=e=>it.join(e,et),kd=e=>it.join(Jf(e),wn);var Ir=e=>{try{return en.mkdirSync(e,{recursive:!0}),u("Ensured directory",void 0)}catch(t){return i(t instanceof Error?t.message:String(t))}},To=()=>{let e=Od(),t=Ao(),n=!en.existsSync(e)||!en.existsSync(t),r=Ir(e);if(d(r))return i(`Ensure epiq home failed.
|
|
19
19
|
`+r.message);let o=Ir(t);return d(o)?i(`Ensure worktrees dir failed.
|
|
20
20
|
`+o.message):u("Ensured epiq storage",n)},Ud=e=>{en.existsSync(e)&&(Y.debug("[sync] remove path",e),en.rmSync(e,{recursive:!0,force:!0}))};var Ai=`*.jsonl merge=union
|
|
21
|
-
`,Ti=()=>it.join(et,wn,".gitattributes"),_d=(e,t)=>{for(let r of[kd(e),kd(t)]){let o=Ir(r);if(d(o))return i(o.message)}let n=it.join(t,Ti());try{en.readFileSync(n,"utf8")!==Ai&&en.writeFileSync(n,Ai)}catch{en.writeFileSync(n,Ai)}return u("Ensured state branch",void 0)}
|
|
21
|
+
`,Ti=()=>it.join(et,wn,".gitattributes"),_d=(e,t)=>{for(let r of[kd(e),kd(t)]){let o=Ir(r);if(d(o))return i(o.message)}let n=it.join(t,Ti());try{en.readFileSync(n,"utf8")!==Ai&&en.writeFileSync(n,Ai)}catch{en.writeFileSync(n,Ai)}return u("Ensured state branch",void 0)},$d=async e=>{let t=await _({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return i(`ensure state branch is storage only failed
|
|
22
22
|
`+t.message);let r=t.value.stdout.trim().split(`
|
|
23
23
|
`).filter(Boolean).filter(a=>a!==et);if(r.length===0)return u("State branch is storage-only",!1);let o=await _({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return i(`Failed to clean storage branch
|
|
24
|
-
${o.message}`);let s=await Kn({cwd:e,message:"[epiq:repair-storage-branch]"});return d(s)?i(s.message):u("Cleaned storage branch",!0)},ft=hi(async(e=process.cwd())=>{let t=await _({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?i("Not inside a Git repository"):u("Resolved repo root",t.value.stdout.trim())},e=>it.resolve(e)),
|
|
25
|
-
`),u("Config written",null)}catch{return i(`Unable to write ~/${pt}/config.json`)}},at=e=>{let t=qn();if(d(t))return i("Failed to read existing config");let n={...t.value,...e};return qd(n)},At=()=>{let e=Li(),t=ki();if(d(t))return i(`Unable to create ~/${pt}`);if(!(Te.readFile(e)!==null)){let E=qd(ag);if(d(E))throw new Error(`Unable to create ~/${pt}/config.json`)}let r=qn();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:a,autoSync:c,autoSyncDebounceMs:l,attachmentMaxKb:m,logLevel:p,viewMode:f}=r.value,g=Vn({userId:a,userName:s});if(d(g))return i(g.message);let I=g.value??{userId:a,userName:s};return!I.userName||!I.userId?i(`User name or ID not configured in ~/${pt}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,u("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:I.userName,userId:I.userId,autoSync:c??!1,autoSyncIntervalMs:l??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))};import{useSyncExternalStore as lg}from"react";var Rr={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Di=new Set,ug=()=>{for(let e of Di)e()},Q=()=>Rr,Yd=()=>lg(e=>(Di.add(e),()=>{Di.delete(e)}),()=>Rr),je=e=>(Rr={...Rr,...e},ug(),Rr);import{spawn as mg}from"node:child_process";import Bi from"node:process";var Xd=e=>{let t=Bi.platform==="darwin"?"open":Bi.platform==="win32"?"cmd":"xdg-open",n=Bi.platform==="win32"?["/c","start","",e]:[e];mg(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as jp}from"node:fs/promises";import vn from"chalk";import Cm from"string-width";import{decodeTime as Tb}from"ulid";var Mo="removed",ze=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?u("Found node",n):i("Unable to find node in breadcrumb")},Jd=["png","jpg","gif","webp"];var F={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Fi(e){return e.context===F.WORKSPACE}function M(e){return e.context===F.TICKET}function tn(e){return e.context===F.TEXT}function tt(e){return e.context===F.FIELD}function Ar(e){return e.context===F.FIELD_LIST}var Tt=e=>e.context===F.SWIMLANE,Tr=e=>e.context===F.BOARD,wr=e=>e.context===F.COMMENT;import{useSyncExternalStore as Nb}from"react";var y={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var Qd=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Zd=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",ec=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",tc=(e,t)=>{if(Zd(e,e.sequence))return x.MoveCursorLeftOfWord;if(ec(e,e.sequence))return x.MoveCursorRightOfWord;if(Qd(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.GetLastCommandFromHistory;case"down":return x.GetNextCommandFromHistory;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}},nc=(e,t)=>{if(Zd(e,e.sequence))return x.MoveCursorLeftOfWord;if(ec(e,e.sequence))return x.MoveCursorRightOfWord;if(Qd(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.NavPreviousItem;case"down":return x.NavNextItem;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}};function Po(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var dt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",qe=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),rc=e=>e.charAt(0).toUpperCase()+e.slice(1);var oc=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},sc=(e,t)=>t?e.get(t)??[]:[];var ic=new WeakMap,pg=e=>{let t=ic.get(e);return t||(t=oc(e),ic.set(e,t)),t};var ac=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return sc(pg(e),r).filter(s=>Po(r,s)>=n)};var fg={hint:"",hints:[],overlap:0,remainder:""},dc=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return fg;let o=ac({wordList:r,inputToMatch:e,overlapThreshold:1});return gg(t,o)},gg=(e,t)=>{let n=t[0]??"",r=Po(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),a=r<(o??"").length,c=!!s,p=(c&&a?o:n)+(c&&a?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}};import{ulid as yg}from"ulid";var Yn=24n,hg=Yn*4n,gt=(1n<<hg)-1n,vg=/^[0-9a-f]+$/;function cc(e){return!e||!vg.test(e)?i(`Invalid hex rank: ${e}`):u("Converted rank to bigint",BigInt("0x"+e))}function nt(e,t=Yn){if(e<0n)return i("Negative rank not allowed");let n=e.toString(16);return u("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Ye(e,t){if(!e&&!t)return nt(gt/2n,Yn);let n=e?cc(e):u("Resolved lower bound",0n);if(d(n))return n;let r=t?cc(t):u("Resolved upper bound",gt);if(d(r))return r;let o=n.value,s=r.value;if(s<=o)return nt(gt/2n,Yn);let a=(o+s)/2n;return a===o||a===s?i("No rank space available between neighbors"):nt(a,Yn)}function lc(e){if(e<=0)return u("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=gt*BigInt(r+1)/(t+1n),s=nt(o,Yn);if(d(s))return s;n.push(s.value)}return u("Resolved evenly spaced ranks",n)}var Oi=(e,t)=>{let n=Z(e),r=lc(n.length);if(d(r))return r;let o={};for(let s=0;s<n.length;s++){let a=n[s],c=r.value[s];if(!a||!c)return i("Unable to assign rebalance rank");o[a.id]=c}return u("Created rebalance event",{id:yg(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import{ulid as th}from"ulid";var ce={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var V=e=>e.slice(-7).toUpperCase(),Lo=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?V(e).includes(n):!0};var le={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:F.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:V(e)},context:F.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:F.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:a=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:F.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:a}),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:F.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:V(e)},context:F.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:F.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:a=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:F.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:a})};var bg=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ce,ko]=bg;var Ui=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),D=(e,t)=>({...Ui(e,t),convergence:!0}),Mr=e=>d(e)&&e.convergence===!0,$t=e=>{let t=e.filter(d);return{fatal:t.filter(n=>!Mr(n)),skipped:t.filter(Mr)}},Ht=e=>{e.length!==0&&Y.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},uc=e=>{let t=S.getNode(e);if(!t||!M(t)||t.isDeleted)return null;let n=fc(t);return d(n)?n:null},mc=e=>{if(!ji())return null;for(let t of e){let n=uc(t);if(n)return n;let r=h().nodes[t]?.parentNodeId;if(!r)continue;let o=uc(r);if(o)return o}return null},xg=(e,t)=>{let n=S.getNode(e);n&&S.updateNode({...n,log:[...n.log??[],t]})},Ig=e=>{let t=[e],n=h().nodes[e]?.parentNodeId;return n&&t.push(n),t},_i=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 Ig(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[]}},Eg=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},Sg=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?Ui("Invalid user ID format",e):u("Valid user",null)},ht=null,Cg=e=>{for(let[t,n]of e.nodeLog){let r=S.getNode(t);r&&S.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&ue(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),mc([...e.virtualNodeIds])},Ng=(e,t)=>{let n=Sg(e);if(d(n))return n;let r=[...new Set(_i(e))];if(ht){for(let s of r){if(!t){let a=ht.nodeLog.get(s);a?a.push(e):ht.nodeLog.set(s,[e])}if(ji()){ht.virtualNodeIds.add(s);let a=h().nodes[s]?.parentNodeId;a&&ht.virtualNodeIds.add(a)}}return t||ht.appLog.push(e),null}t||(r.forEach(s=>xg(s,e)),Eg(e));let o=mc(r);return o||null},Rg={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=le.workspace(t,n,r),s=Pr(o);if(d(s))return Ui(s.message,e);let a=S.createNode(o);return d(a)?D(a.message??"Failed to initialize workspace",e):Fi(a.value)?u("Workspace initialized",{action:e.action,result:a.value}):i("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=S.createNode(le.workspace(t,n,r));return d(o)?D(o.message??"Failed to add workspace",e):Fi(o.value)?u("Added workspace",{action:e.action,result:o.value}):i("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=S.createNode(le.board(t,n,r,o));return d(s)?D(s.message??"Unable to create board",e):Tr(s.value)?u("Added board",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=S.createNode(le.swimlane(t,n,r,o));return d(s)?D(s.message??"Unable to create swimlane",e):Tt(s.value)?u("Added swimlane",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=S.createNode(le.ticket(t,n,r,o));return d(s)?D(s.message??"Unable to create issue",e):M(s.value)?u("Added issue",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,a=S.createNode(le.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(ce.DESCRIPTION)?"vertical":"horizontal"}));return d(a)?D(a.message??`Unable to create field: ${n}`,e):tt(a.value)?u("Added field",{action:e.action,result:a.value}):i("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!S.getNode(t))return D(`Unable to locate node with id ${t}`,e);let o=S.renameNode(t,n);return d(o)?D(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=S.tombstoneNode(t);return d(n)?D(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=S.createTag({id:t,name:n});return d(r)?D(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=S.tombstoneTag(t);return d(n)?D(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=S.restoreTag(t,n);return d(r)?D(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=S.createContributor({id:t,name:n});return d(r)?D(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=S.renameContributor(t,n);return d(r)?D(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=S.tombstoneContributor(t);return d(n)?D(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=S.restoreContributor(t,n);return d(r)?D(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=S.tag(t,n);return d(r)?D(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=S.untag(t,n);return d(r)?D(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=S.assign(t,n);return d(r)?D(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=S.unassign(t,n);return d(r)?D(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=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?D(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=S.editValue(t,n);return d(r)?D(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=S.getNode(t);if(!o)return D("Unable to locate issue",e);if(!M(o))return D("Can only close issues",e);let s=S.getNode(Ce);if(!s)return D("Unable to locate target swimlane",e);if(n!==s.id)return D("Close target must be closed swimlane",e);let a=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(a)?D(a.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=S.getNode(t);if(!o)return D("Unable to locate issue",e);if(!M(o))return D("Can only reopen issues",e);let s=S.getNode(Ce);if(!s)return D("Unable to locate closed swimlane",e);if(n===s.id)return D("Cannot reopen issue into closed swimlane",e);if(!S.getNode(n))return D("Reopen parent no longer exists",e);let c=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?D(c.message??"Unable to reopen issue",e):u("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=S.lockNode(t);return d(n)?D(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=S.getNode(r);if(!s)return D(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return D(`Node ${r} is not child of ${t}`,e);let a=S.updateNode({...s,rank:o});if(d(a))return D(a.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=S.createComment({id:t,issue:n,authorId:r,authorName:S.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return d(s)?D(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=S.getComment(t);if(!o)return D("Unable to locate comment",e);if(o.issue!==n)return D("Comment does not belong to issue",e);let s=S.editComment(t,r);return d(s)?D(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=S.getComment(t);if(!r)return D("Unable to locate comment",e);if(r.issue!==n)return D("Comment does not belong to issue",e);let o=S.deleteComment(t);return d(o)?D(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:a}=e.payload,c=S.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:a,deleted:!1});return d(c)?D(c.message??"Unable to add attachment",e):u("Attachment added",{action:e.action,result:{id:t,issue:n,hash:r}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,r=S.getAttachment(t);if(!r)return D("Unable to locate attachment",e);if(r.issue!==n)return D("Attachment does not belong to issue",e);let o=S.deleteAttachment(t);return d(o)?D(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=S.linkUserId({contributorId:t,userId:e.userId});return d(n)?D(n.message??"Unable to link contributor",e):u("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function nn(e,t=!1){let n=Rg[e.action];if(!n)return i(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);if(!wt()&&e.action!=="init.workspace")return D(`${e.action} arrived before the workspace was initialized`,e);let r=n(e);if(d(r))return r;let o=Ng(e,t);return o||r}var vt=e=>{let t=pc(()=>{let n=ht===null;n&&(ht={appLog:[],nodeLog:new Map,virtualNodeIds:new Set});try{let r=e.map(o=>nn(o));if(n&&ht){let o=Cg(ht);if(o)return e.map(()=>o)}return r}finally{n&&(ht=null)}});return d(t)?e.map(()=>i(t.message)):t.value};import Hg from"node:fs";import Wg from"node:path";import{decodeTime as Gg,monotonicFactory as Vg}from"ulid";import{z as Pn}from"zod";var $i=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";import Do from"node:fs";import Bo from"node:path";import{decodeTime as wg}from"ulid";import{z as Hi}from"zod";var Ag=["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"];var Tg=new Set(Ag),gc=e=>Tg.has(e),hc=e=>({action:e.action,payload:e.payload});var Mg=Hi.object({userId:Hi.string().min(1).default("unknown"),userName:Hi.string().min(1).default("unknown")}),vc=e=>{let t=Object.entries(e).filter(([o])=>o!=="id"&&o!=="v"&&o!=="userId"&&o!=="userName");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},Pg=/^[0-9a-hjkmnp-tv-z]{26}$/i,Lg=e=>Pg.test(e)?e.toUpperCase():e,kg=e=>{let t=Bo.basename(e,".jsonl"),n=t.indexOf("."),r=n===-1?t:t.slice(0,n),o=n===-1?void 0:t.slice(n+1),s=Mg.safeParse({userId:Lg(r),userName:o});return s.success?u("Parsed event file actor",s.data):i(`Invalid event file name ${Bo.basename(e)}: ${s.error.issues.map(a=>a.path.join(".")||a.message).join(", ")}`)},Dg=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?i(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?i("Invalid persisted event: action key is missing or invalid"):u("Resolved persisted action",t[0])},Bg=(e,t)=>t in e,Fg=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Og=e=>{let{userId:t,userName:n,...r}=e,o=Dg(r);if(d(o))return i(o.message);let s=o.value,a=e.id?.[0];return a?Bg(r,s)?u("Decoded persisted event",Fg({id:a,action:s,payload:r[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},Gi=(e,t)=>{let n=[],r=new Map,o=new Map;for(let s of e){if(!xc(s.v)){o.set(s.v,(o.get(s.v)??0)+1),t?.push({eventId:s.id[0],reason:"unsupported-schema-version",detail:`v${s.v}`,targetNodeId:vc(s)});continue}let a=Og(s);if(d(a))return i(`Failed to decode event ${s.id?.[0]??"<unknown>"}: ${a.message}`);let c=a.value.action;if(!gc(c)){r.set(c,(r.get(c)??0)+1),t?.push({eventId:s.id[0],reason:"unknown-action",detail:c,targetNodeId:vc(s)});continue}n.push(a.value)}if(r.size>0){let s=[...r.entries()].map(([a,c])=>`${a} (x${c})`).join(", ");Y.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${s}. Upgrade to apply them.`)}if(o.size>0){let s=[...o.entries()].map(([a,c])=>`v${a} (x${c})`).join(", ");Y.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${s}. Upgrade to apply them.`)}return u("Decoded reconstructed events",n)},Ug=(e,t)=>{if(!Do.existsSync(e))return u("Event file missing",[]);let n=kg(e);if(d(n))return i(n.message);let r=Do.readFileSync(e,"utf8"),o=[],s=Bo.basename(e),a=(c,l)=>{t?.push({eventId:null,reason:"corrupt-line",detail:`${s}:${c} (${l})`,targetNodeId:null})};for(let[c,l]of r.split(`
|
|
26
|
-
`).entries()){let m=l.trim();if(!m)continue;let p;try{p=JSON.parse(m)}catch{a(c+1,"invalid JSON");continue}let f=bc(p);if(d(f)){a(c+1,f.message);continue}o.push({...f.value,userId:n.value.userId,userName:n.value.userName})}return u("Parsed persisted events file",o)};function Fo(e,t){let n=Sr(e);if(!Do.existsSync(n))return u("No events found",[]);let r=Do.readdirSync(n).filter(s=>s.endsWith(".jsonl")).map(s=>Bo.join(n,s)),o=[];for(let s of r){let a=
|
|
27
|
-
`,"utf8"),u("Event persisted",{path:r.value,entry:a.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return i(`Failed to persist event: ${r}`)}}function Cc(e,t){let n=nn(e);if(n.status!==Qt.Success)return n;let r=Uo({event:e,rootDir:t});return d(r)?r:n}function O(e,t){if(e.length===0||!e[0])return i("No events provided");if(h().readOnly)return i(h().readOnlyReason??"Cannot change the board while time travelling");let n=
|
|
24
|
+
${o.message}`);let s=await Kn({cwd:e,message:"[epiq:repair-storage-branch]"});return d(s)?i(s.message):u("Cleaned storage branch",!0)},ft=hi(async(e=process.cwd())=>{let t=await _({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?i("Not inside a Git repository"):u("Resolved repo root",t.value.stdout.trim())},e=>it.resolve(e)),_E=hi(async e=>{let t=await _({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return i(t.message);let n=t.value.stdout.trim(),r=it.isAbsolute(n)?n:it.join(e,n);return u("Resolved git dir",r)},e=>it.resolve(e));var KE=process.env.IS_LOCAL==="true",et=".epiq",wn="events",wi="media",Qf="project.json",yr=e=>Nt.join(e,et),Io=e=>Nt.join(yr(e),Qf),Sr=e=>Nt.join(yr(e),wn),Cr=e=>Nt.join(yr(e),wi),jd=e=>Nt.join(e,et),Zf=e=>{let t=Nt.join(e,et);return Er.existsSync(t)&&Er.statSync(t).isDirectory()},Nr=e=>{let t=Io(e);return Er.existsSync(t)&&Er.statSync(t).isFile()},Eo=e=>{let t=Nt.resolve(e);for(;;){if(Zf(t))return u("Resolved closest .epiq root",t);let n=Nt.dirname(t);if(n===t)return i("No .epiq directory found in any parent");t=n}},Mi="No .epiq/project.json found in any parent",_e=e=>{let t=Nt.resolve(e);for(;;){if(Nr(t))return u("Resolved closest epiq project root",t);let n=Nt.dirname(t);if(n===t)return i(Mi);t=n}},Hd=e=>{let t=Sr(e);try{return Er.mkdirSync(t,{recursive:!0}),u("Resolved events dir",t)}catch(n){return i(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},Rt=async()=>{let e=await ft(process.cwd());if(d(e))return e;let t=Se({repoRoot:e.value});return d(t)?t:u("Resolved persist root",t.value)};import{accessSync as eg,copyFileSync as tg,existsSync as wo,mkdirSync as Wd,readdirSync as Gd,readFileSync as ng,renameSync as rg,rmSync as og,statSync as Vd,unlinkSync as sg,writeFileSync as ig}from"node:fs";import zn from"node:path";var Pi=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",Te={writeToFile:(e,t)=>{try{let n=zn.dirname(e);wo(n)||Wd(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);ig(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return ng(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Te.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 wo(e)&&Vd(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await eg(e),!0}catch{return!1}},mkDir:e=>Wd(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=zn.parse(t);for(;;){let r=zn.join(t,e);try{if(wo(r)&&Vd(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=zn.dirname(t)}return null},readFirstJSON(e){try{if(!Te.dirExists(e))return null;let t=Gd(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=zn.join(e,t);return Te.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Te.dirExists(e)?Gd(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{sg(e)}catch(t){(!Pi(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{og(e,{recursive:!0,force:!0})}catch(t){(!Pi(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(zn.dirname(t)),!n?.overwrite&&wo(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{rg(e,t)}catch(r){if(Pi(r)&&r.code==="EXDEV"){tg(e,t),this.rmFile(e);return}throw r}}};var dg={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Kd=$t.object({logLevel:$t.enum(["info","error","debug"]),preferredEditor:$t.string().optional(),userName:$t.string().optional(),userId:$t.string().optional(),autoSync:$t.boolean().nullable().optional(),autoSyncDebounceMs:$t.number().optional(),attachmentMaxKb:$t.number().optional(),viewMode:$t.enum(["dense","wide"]).optional()}).partial(),cg="config.json",zd=Rn,Li=()=>ag.join(zd(),cg),ki=()=>{try{return Te.mkDir(zd()),u(`Ensured ~/${pt} exists`,null)}catch{return i(`Unable to create ~/${pt}`)}},lg=e=>{let t;try{t=JSON.parse(e)}catch{return i(`Invalid ~/${pt}/config.json JSON`)}let n=Kd.safeParse(t??{});return n.success?u("Parsed config",n.data):i(`Invalid ~/${pt}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},qn=()=>{let e=ki();if(d(e))return i(e.message);let t=Li(),n=Te.readFile(t);return n==null||n.trim()===""?u("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):lg(n)},qd=e=>{let t=ki();if(d(t))return i(t.message);let n=Kd.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Li();try{return Te.writeToFile(r,JSON.stringify(n.data,null,2)+`
|
|
25
|
+
`),u("Config written",null)}catch{return i(`Unable to write ~/${pt}/config.json`)}},at=e=>{let t=qn();if(d(t))return i("Failed to read existing config");let n={...t.value,...e};return qd(n)},At=()=>{let e=Li(),t=ki();if(d(t))return i(`Unable to create ~/${pt}`);if(!(Te.readFile(e)!==null)){let E=qd(dg);if(d(E))throw new Error(`Unable to create ~/${pt}/config.json`)}let r=qn();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:a,autoSync:c,autoSyncDebounceMs:l,attachmentMaxKb:m,logLevel:p,viewMode:f}=r.value,g=Vn({userId:a,userName:s});if(d(g))return i(g.message);let I=g.value??{userId:a,userName:s};return!I.userName||!I.userId?i(`User name or ID not configured in ~/${pt}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,u("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:I.userName,userId:I.userId,autoSync:c??!1,autoSyncIntervalMs:l??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))};import{useSyncExternalStore as ug}from"react";var Rr={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Di=new Set,mg=()=>{for(let e of Di)e()},Q=()=>Rr,Yd=()=>ug(e=>(Di.add(e),()=>{Di.delete(e)}),()=>Rr),$e=e=>(Rr={...Rr,...e},mg(),Rr);import{spawn as pg}from"node:child_process";import Bi from"node:process";var Xd=e=>{let t=Bi.platform==="darwin"?"open":Bi.platform==="win32"?"cmd":"xdg-open",n=Bi.platform==="win32"?["/c","start","",e]:[e];pg(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as jp}from"node:fs/promises";import vn from"chalk";import Nm from"string-width";import{decodeTime as Mb}from"ulid";var Mo="removed",ze=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?u("Found node",n):i("Unable to find node in breadcrumb")},Jd=["png","jpg","gif","webp"];var F={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Fi(e){return e.context===F.WORKSPACE}function M(e){return e.context===F.TICKET}function tn(e){return e.context===F.TEXT}function tt(e){return e.context===F.FIELD}function Ar(e){return e.context===F.FIELD_LIST}var Tt=e=>e.context===F.SWIMLANE,Tr=e=>e.context===F.BOARD,wr=e=>e.context===F.COMMENT;import{useSyncExternalStore as Ab}from"react";var y={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var Qd=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Zd=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",ec=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",tc=(e,t)=>{if(Zd(e,e.sequence))return x.MoveCursorLeftOfWord;if(ec(e,e.sequence))return x.MoveCursorRightOfWord;if(Qd(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.GetLastCommandFromHistory;case"down":return x.GetNextCommandFromHistory;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}},nc=(e,t)=>{if(Zd(e,e.sequence))return x.MoveCursorLeftOfWord;if(ec(e,e.sequence))return x.MoveCursorRightOfWord;if(Qd(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.NavPreviousItem;case"down":return x.NavNextItem;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}};function Po(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var dt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",qe=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),rc=e=>e.charAt(0).toUpperCase()+e.slice(1);var oc=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},sc=(e,t)=>t?e.get(t)??[]:[];var ic=new WeakMap,fg=e=>{let t=ic.get(e);return t||(t=oc(e),ic.set(e,t)),t};var ac=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return sc(fg(e),r).filter(s=>Po(r,s)>=n)};var gg={hint:"",hints:[],overlap:0,remainder:""},dc=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return gg;let o=ac({wordList:r,inputToMatch:e,overlapThreshold:1});return hg(t,o)},hg=(e,t)=>{let n=t[0]??"",r=Po(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),a=r<(o??"").length,c=!!s,p=(c&&a?o:n)+(c&&a?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}};import{ulid as bg}from"ulid";var Yn=24n,vg=Yn*4n,gt=(1n<<vg)-1n,yg=/^[0-9a-f]+$/;function cc(e){return!e||!yg.test(e)?i(`Invalid hex rank: ${e}`):u("Converted rank to bigint",BigInt("0x"+e))}function nt(e,t=Yn){if(e<0n)return i("Negative rank not allowed");let n=e.toString(16);return u("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Ye(e,t){if(!e&&!t)return nt(gt/2n,Yn);let n=e?cc(e):u("Resolved lower bound",0n);if(d(n))return n;let r=t?cc(t):u("Resolved upper bound",gt);if(d(r))return r;let o=n.value,s=r.value;if(s<=o)return nt(gt/2n,Yn);let a=(o+s)/2n;return a===o||a===s?i("No rank space available between neighbors"):nt(a,Yn)}function lc(e){if(e<=0)return u("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=gt*BigInt(r+1)/(t+1n),s=nt(o,Yn);if(d(s))return s;n.push(s.value)}return u("Resolved evenly spaced ranks",n)}var Oi=(e,t)=>{let n=Z(e),r=lc(n.length);if(d(r))return r;let o={};for(let s=0;s<n.length;s++){let a=n[s],c=r.value[s];if(!a||!c)return i("Unable to assign rebalance rank");o[a.id]=c}return u("Created rebalance event",{id:bg(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import{ulid as nh}from"ulid";var ce={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var V=e=>e.slice(-7).toUpperCase(),Lo=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?V(e).includes(n):!0};var le={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:F.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:V(e)},context:F.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:F.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:a=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:F.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:a}),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:F.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:V(e)},context:F.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:F.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:a=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:F.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:a})};var xg=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ce,ko]=xg;var Ui=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),D=(e,t)=>({...Ui(e,t),convergence:!0}),Mr=e=>d(e)&&e.convergence===!0,jt=e=>{let t=e.filter(d);return{fatal:t.filter(n=>!Mr(n)),skipped:t.filter(Mr)}},Ht=e=>{e.length!==0&&Y.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},uc=e=>{let t=S.getNode(e);if(!t||!M(t)||t.isDeleted)return null;let n=fc(t);return d(n)?n:null},mc=e=>{if(!$i())return null;for(let t of e){let n=uc(t);if(n)return n;let r=h().nodes[t]?.parentNodeId;if(!r)continue;let o=uc(r);if(o)return o}return null},Ig=(e,t)=>{let n=S.getNode(e);n&&S.updateNode({...n,log:[...n.log??[],t]})},Eg=e=>{let t=[e],n=h().nodes[e]?.parentNodeId;return n&&t.push(n),t},_i=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 Eg(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[]}},Sg=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},Cg=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?Ui("Invalid user ID format",e):u("Valid user",null)},ht=null,Ng=e=>{for(let[t,n]of e.nodeLog){let r=S.getNode(t);r&&S.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&ue(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),mc([...e.virtualNodeIds])},Rg=(e,t)=>{let n=Cg(e);if(d(n))return n;let r=[...new Set(_i(e))];if(ht){for(let s of r){if(!t){let a=ht.nodeLog.get(s);a?a.push(e):ht.nodeLog.set(s,[e])}if($i()){ht.virtualNodeIds.add(s);let a=h().nodes[s]?.parentNodeId;a&&ht.virtualNodeIds.add(a)}}return t||ht.appLog.push(e),null}t||(r.forEach(s=>Ig(s,e)),Sg(e));let o=mc(r);return o||null},Ag={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=le.workspace(t,n,r),s=Pr(o);if(d(s))return Ui(s.message,e);let a=S.createNode(o);return d(a)?D(a.message??"Failed to initialize workspace",e):Fi(a.value)?u("Workspace initialized",{action:e.action,result:a.value}):i("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=S.createNode(le.workspace(t,n,r));return d(o)?D(o.message??"Failed to add workspace",e):Fi(o.value)?u("Added workspace",{action:e.action,result:o.value}):i("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=S.createNode(le.board(t,n,r,o));return d(s)?D(s.message??"Unable to create board",e):Tr(s.value)?u("Added board",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=S.createNode(le.swimlane(t,n,r,o));return d(s)?D(s.message??"Unable to create swimlane",e):Tt(s.value)?u("Added swimlane",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=S.createNode(le.ticket(t,n,r,o));return d(s)?D(s.message??"Unable to create issue",e):M(s.value)?u("Added issue",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,a=S.createNode(le.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(ce.DESCRIPTION)?"vertical":"horizontal"}));return d(a)?D(a.message??`Unable to create field: ${n}`,e):tt(a.value)?u("Added field",{action:e.action,result:a.value}):i("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!S.getNode(t))return D(`Unable to locate node with id ${t}`,e);let o=S.renameNode(t,n);return d(o)?D(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=S.tombstoneNode(t);return d(n)?D(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=S.createTag({id:t,name:n});return d(r)?D(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=S.tombstoneTag(t);return d(n)?D(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=S.restoreTag(t,n);return d(r)?D(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=S.createContributor({id:t,name:n});return d(r)?D(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=S.renameContributor(t,n);return d(r)?D(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=S.tombstoneContributor(t);return d(n)?D(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=S.restoreContributor(t,n);return d(r)?D(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=S.tag(t,n);return d(r)?D(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=S.untag(t,n);return d(r)?D(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=S.assign(t,n);return d(r)?D(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=S.unassign(t,n);return d(r)?D(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=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?D(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=S.editValue(t,n);return d(r)?D(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=S.getNode(t);if(!o)return D("Unable to locate issue",e);if(!M(o))return D("Can only close issues",e);let s=S.getNode(Ce);if(!s)return D("Unable to locate target swimlane",e);if(n!==s.id)return D("Close target must be closed swimlane",e);let a=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(a)?D(a.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=S.getNode(t);if(!o)return D("Unable to locate issue",e);if(!M(o))return D("Can only reopen issues",e);let s=S.getNode(Ce);if(!s)return D("Unable to locate closed swimlane",e);if(n===s.id)return D("Cannot reopen issue into closed swimlane",e);if(!S.getNode(n))return D("Reopen parent no longer exists",e);let c=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?D(c.message??"Unable to reopen issue",e):u("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=S.lockNode(t);return d(n)?D(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=S.getNode(r);if(!s)return D(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return D(`Node ${r} is not child of ${t}`,e);let a=S.updateNode({...s,rank:o});if(d(a))return D(a.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=S.createComment({id:t,issue:n,authorId:r,authorName:S.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return d(s)?D(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=S.getComment(t);if(!o)return D("Unable to locate comment",e);if(o.issue!==n)return D("Comment does not belong to issue",e);let s=S.editComment(t,r);return d(s)?D(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=S.getComment(t);if(!r)return D("Unable to locate comment",e);if(r.issue!==n)return D("Comment does not belong to issue",e);let o=S.deleteComment(t);return d(o)?D(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:a}=e.payload,c=S.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:a,deleted:!1});return d(c)?D(c.message??"Unable to add attachment",e):u("Attachment added",{action:e.action,result:{id:t,issue:n,hash:r}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,r=S.getAttachment(t);if(!r)return D("Unable to locate attachment",e);if(r.issue!==n)return D("Attachment does not belong to issue",e);let o=S.deleteAttachment(t);return d(o)?D(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=S.linkUserId({contributorId:t,userId:e.userId});return d(n)?D(n.message??"Unable to link contributor",e):u("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function nn(e,t=!1){let n=Ag[e.action];if(!n)return i(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);if(!wt()&&e.action!=="init.workspace")return D(`${e.action} arrived before the workspace was initialized`,e);let r=n(e);if(d(r))return r;let o=Rg(e,t);return o||r}var vt=e=>{let t=pc(()=>{let n=ht===null;n&&(ht={appLog:[],nodeLog:new Map,virtualNodeIds:new Set});try{let r=e.map(o=>nn(o));if(n&&ht){let o=Ng(ht);if(o)return e.map(()=>o)}return r}finally{n&&(ht=null)}});return d(t)?e.map(()=>i(t.message)):t.value};import Wg from"node:fs";import Gg from"node:path";import{decodeTime as Vg,monotonicFactory as Kg}from"ulid";import{z as Pn}from"zod";var ji=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";import Do from"node:fs";import Bo from"node:path";import{decodeTime as Mg}from"ulid";import{z as Hi}from"zod";var Tg=["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"];var wg=new Set(Tg),gc=e=>wg.has(e),hc=e=>({action:e.action,payload:e.payload});var Pg=Hi.object({userId:Hi.string().min(1).default("unknown"),userName:Hi.string().min(1).default("unknown")}),vc=e=>{let t=Object.entries(e).filter(([o])=>o!=="id"&&o!=="v"&&o!=="userId"&&o!=="userName");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},Lg=/^[0-9a-hjkmnp-tv-z]{26}$/i,kg=e=>Lg.test(e)?e.toUpperCase():e,Dg=e=>{let t=Bo.basename(e,".jsonl"),n=t.indexOf("."),r=n===-1?t:t.slice(0,n),o=n===-1?void 0:t.slice(n+1),s=Pg.safeParse({userId:kg(r),userName:o});return s.success?u("Parsed event file actor",s.data):i(`Invalid event file name ${Bo.basename(e)}: ${s.error.issues.map(a=>a.path.join(".")||a.message).join(", ")}`)},Bg=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?i(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?i("Invalid persisted event: action key is missing or invalid"):u("Resolved persisted action",t[0])},Fg=(e,t)=>t in e,Og=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Ug=e=>{let{userId:t,userName:n,...r}=e,o=Bg(r);if(d(o))return i(o.message);let s=o.value,a=e.id?.[0];return a?Fg(r,s)?u("Decoded persisted event",Og({id:a,action:s,payload:r[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},Gi=(e,t)=>{let n=[],r=new Map,o=new Map;for(let s of e){if(!xc(s.v)){o.set(s.v,(o.get(s.v)??0)+1),t?.push({eventId:s.id[0],reason:"unsupported-schema-version",detail:`v${s.v}`,targetNodeId:vc(s)});continue}let a=Ug(s);if(d(a))return i(`Failed to decode event ${s.id?.[0]??"<unknown>"}: ${a.message}`);let c=a.value.action;if(!gc(c)){r.set(c,(r.get(c)??0)+1),t?.push({eventId:s.id[0],reason:"unknown-action",detail:c,targetNodeId:vc(s)});continue}n.push(a.value)}if(r.size>0){let s=[...r.entries()].map(([a,c])=>`${a} (x${c})`).join(", ");Y.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${s}. Upgrade to apply them.`)}if(o.size>0){let s=[...o.entries()].map(([a,c])=>`v${a} (x${c})`).join(", ");Y.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${s}. Upgrade to apply them.`)}return u("Decoded reconstructed events",n)},_g=(e,t)=>{if(!Do.existsSync(e))return u("Event file missing",[]);let n=Dg(e);if(d(n))return i(n.message);let r=Do.readFileSync(e,"utf8"),o=[],s=Bo.basename(e),a=(c,l)=>{t?.push({eventId:null,reason:"corrupt-line",detail:`${s}:${c} (${l})`,targetNodeId:null})};for(let[c,l]of r.split(`
|
|
26
|
+
`).entries()){let m=l.trim();if(!m)continue;let p;try{p=JSON.parse(m)}catch{a(c+1,"invalid JSON");continue}let f=bc(p);if(d(f)){a(c+1,f.message);continue}o.push({...f.value,userId:n.value.userId,userName:n.value.userName})}return u("Parsed persisted events file",o)};function Fo(e,t){let n=Sr(e);if(!Do.existsSync(n))return u("No events found",[]);let r=Do.readdirSync(n).filter(s=>s.endsWith(".jsonl")).map(s=>Bo.join(n,s)),o=[];for(let s of r){let a=_g(s,t);if(d(a))return i(a.message);o.push(...a.value)}return u("All events loaded",jg(o))}var $g=[];function Wt(e){let t=[],n=Fo(e,t);if(d(n))return i(n.message);let r=Gi(n.value,t);return d(r)?i(r.message):($g=t,u("Loaded merged events",{events:r.value,unreadable:t}))}function Vi(e){let t=Fo(e);return d(t)?i(t.message):u("Loaded event actors",t.value.map(({userId:n,userName:r})=>({userId:n,userName:r})))}function Mn(e){let t=Wt(e);return d(t)?i(t.message):u("Loaded merged events",t.value.events)}function Oo(e,t){let n=Fo(e);if(d(n))return i(n.message);let{appliedEvents:r,unappliedEvents:o}=Hg(n.value,t),s=Gi(r);if(d(s))return i(s.message);let a=Gi(o);return d(a)?i(a.message):u("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:a.value})}function yc(e=process.cwd()){let t=Fo(e);return d(t)?i(t.message):u("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var Wi=(e,t)=>{let n=e.id[0].localeCompare(t.id[0]);return n!==0?n:JSON.stringify(e).localeCompare(JSON.stringify(t))},jg=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],f=m.id[1]??null;t.set(p,m);let g=n.get(f)??[];g.push(m),n.set(f,g)}for(let m of n.values())m.sort(Wi);let r=[],o=new Set,s=m=>{let p=[m];for(;p.length>0;){let f=p.pop(),g=f.id[0];if(o.has(g))continue;r.push(f),o.add(g);let I=n.get(g)??[];for(let E=I.length-1;E>=0;E--)p.push(I[E])}},a=n.get(null)??[];for(let m of a)s(m);let c=e.filter(m=>{let p=m.id[0],f=m.id[1]??null;return!o.has(p)&&f!==null&&!t.has(f)}).sort(Wi);for(let m of c)s(m);let l=e.filter(m=>!o.has(m.id[0])).sort(Wi);for(let m of l)s(m);return r},Hg=(e,t)=>{let n=new Set,r=[],o=[];for(let s of e){let a=s.id[0],c=s.id[1],l=!1;try{l=Mg(a)<t}catch{l=!1}!l||c&&n.has(c)?(n.add(a),o.push(s)):r.push(s)}return{appliedEvents:r,unappliedEvents:o}};var Ec=1,Ic=Kg(),zg=0xffffffffffff,qg=e=>{let t=Date.now(),n;try{n=Vg(e)}catch{return t}return n>=zg?t:Math.max(t,n+1)},Sc=Pn.tuple([Pn.string().min(1),Pn.string().min(1).nullable()]),Yg=Pn.looseObject({v:Pn.literal(Ec),id:Sc}),Xg=Pn.looseObject({v:Pn.number().int().positive(),id:Sc}),bc=e=>{let t=Xg.safeParse(e);return t.success?u("Parsed persisted event envelope",t.data):i(`Invalid persisted event envelope: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Jg=[1];var Qg=new Set(Jg),xc=e=>Qg.has(e),Zg=e=>{let t=Yg.safeParse(e);return t.success?u("Parsed persisted event",t.data):i(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},he=()=>{let{userName:e,userId:t}=Q();return e?t?fi(t)?gi(e)?u("Successfully resolved actor ID",{userId:t,userName:e}):i("Invalid user name in config"):i("Invalid user ID in config"):i("User ID not configured"):i("User name not configured")},Ln=({userId:e,userName:t})=>`${ji(e)}.${ji(t)}.jsonl`,eh=(e,{userId:t,userName:n})=>{let r=Ln({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return i(`Invalid event log file name: ${r}`);let s=Gg.join(Sr(e),r);return u("Successfully resolved event log path",s)},th=(e,t)=>{let n={[e.action]:e.payload,v:Ec,id:t};return Zg(n)};function Uo({event:e,rootDir:t}){try{let n=Hd(t);if(d(n))return n;let r=eh(t,{userId:e.userId,userName:e.userName});if(d(r))return r;let o=yc(t);if(d(o))return i(o.message);let s=o.value?Ic(qg(o.value)):Ic(),a=th(hc(e),[s,o.value]);return d(a)?i(a.message):(Wg.appendFileSync(r.value,`${JSON.stringify(a.value)}
|
|
27
|
+
`,"utf8"),u("Event persisted",{path:r.value,entry:a.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return i(`Failed to persist event: ${r}`)}}function Cc(e,t){let n=nn(e);if(n.status!==Qt.Success)return n;let r=Uo({event:e,rootDir:t});return d(r)?r:n}function O(e,t){if(e.length===0||!e[0])return i("No events provided");if(h().readOnly)return i(h().readOnlyReason??"Cannot change the board while time travelling");let n=rh(e[0],t);if(d(n))return n;let r=e.map(s=>Cc(s,t)),o=r.filter(d);return o.length>0?i("Materialize and persist failed: "+o.map(s=>s.message).join(", ")):u("Materialization succeeded",r.map(s=>s.value))}var rh=(e,t)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return u("Contributor write already in flight",void 0);let n=S.getContributor(e.userId),r={id:nh(),action:n?"rename.contributor":"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName};if(n&&(n.tombstoned||n.name===e.userName))return u("Contributor name is current",void 0);let o=Cc(r,t);return d(o)?i(o.message):u("Contributor name recorded",void 0)};var Nc=e=>_o(Z(e),{at:"end"}),_o=(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(Ye(void 0,void 0));let r=()=>n(Ye(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Ye(void 0,o.rank)):i("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Ye(o.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let o=Rc(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let a=o>0?e[o-1]:void 0;return n(Ye(a?.rank,s.rank))}case"after":{let o=Rc(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let a=o<e.length-1?e[o+1]:void 0;return n(Ye(s.rank,a?.rank))}}},Z=e=>Object.values(h().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Rc=(e,t)=>e.findIndex(n=>n.id===t),Ac=(e,t,n={at:"end"})=>_o(Z(t).filter(r=>r.id!==e),n),rn=(e,t,n,r,o)=>{let s=Ac(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return u("Resolved rank",s.value.rank);let a=Oi(e,r);if(d(a))return a;let c=O([a.value],o);if(d(c))return c;let l=Ac(t,e,n);return d(l)?l:l.value.needsRebalance?i("Rank rebalance failed to create space"):u("Resolved rank after rebalance",l.value.rank)},kn=(e,t,n)=>{let r=Nc(e);if(d(r))return r;if(!r.value.needsRebalance)return u("Resolved rank",r.value.rank);let o=Oi(e,t);if(d(o))return o;let s=O([o.value],n);if(d(s))return s;let a=Nc(e);return d(a)?a:a.value.needsRebalance?i("Rank rebalance failed to create space"):u("Resolved rank after rebalance",a.value.rank)};var k={exit(){process.exit(0)},enterChildNode(){let e=h(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=J(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||k.navigate({contextNode:o,selectedIndex:J(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=J(n.id),o=r.findIndex(({id:a})=>a===e.id),s=r.length===0?-1:o>=0?o:0;k.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Tc(1),navigateToPreviousItem:()=>Tc(-1),navigateToNextContainer:()=>wc(1),navigateToPreviousContainer:()=>wc(-1),navigate:({contextNode:e,selectedIndex:t})=>{N({contextNodeId:e.id,selectedIndex:t})}},Tc=e=>{let{selectedIndex:t,contextNode:n}=h(),r=J(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;k.navigate({selectedIndex:s,contextNode:n})},wc=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=J(o.id),a=s.findIndex(g=>g.id===t.id);if(a<0)return;let c=s.at(a+e)??s.at(0);if(!c)return;let l=J(c.id),m=Math.max(0,l.length-1),p=Math.min(Math.max(0,r),m),f=l.length?p:-1;k.navigate({contextNode:c,selectedIndex:f})};var Pc=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Lc=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=h();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},oh=e=>{let t=h().nodes[e];return!!t&&!t.isDeleted&&tt(t)&&t.childRenderAxis==="vertical"},$o=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r||r.isDeleted)return!1;let o=Z(r.id);return k.navigate({contextNode:r,selectedIndex:Pc(t,o.length)}),!0},kc=e=>{let{nodes:t}=h(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return $o(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let a=Z(o.id).findIndex(c=>c.id===n.id);return a>=0?(k.navigate({contextNode:o,selectedIndex:a}),!0):kc(o.id)},Mc=e=>{let{nodes:t}=h(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),kc(n))return!0;n=t[n]?.parentNodeId}return!1},sh=e=>{if(!e)return!1;let t=h().nodes[e];return!!t&&!t.isDeleted},Dc=e=>{let{nodes:t,rootNodeId:n}=h();if(oh(e.contextNodeId)&&$o(e.contextNodeId,e.selectedIndex))return u("Restored navigation inside text container",null);if(sh(e.selectedNodeId)&&e.selectedNodeId&&Mc(e.selectedNodeId))return u("Restored navigation to selected node or ancestor",null);if($o(e.contextNodeId,e.selectedIndex))return u("Restored navigation to previous container",null);if(e.parentNodeId&&$o(e.parentNodeId,e.selectedIndex))return u("Restored navigation to previous parent",null);if(Mc(e.contextNodeId))return u("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return i("Unable to restore navigation");let o=Z(r.id);return k.navigate({contextNode:r,selectedIndex:Pc(e.selectedIndex,o.length)}),u("Restored navigation to root",null)};import{monotonicFactory as ih,ulid as Mt}from"ulid";var Lr=ih();function ah(){let e=Qe();if(d(e))return i("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return i("No workspace found in event log");let[r]=J(n.id),[o]=r?J(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 dh(){let e=ah();return d(e)?e:k.navigate(e.value)}function Bc({userId:e,userName:t}){let n=Lr(),r=Lr(),o=Lr(),s=Lr(),a=Lr(),c=Ye(void 0,void 0);if(d(c))return c;let l=Ye(void 0,void 0);if(d(l))return l;let m=Ye(l.value,void 0);if(d(m))return m;let p=Ye(void 0,void 0);if(d(p))return p;let f=Ye(p.value,void 0);if(d(f))return f;let g=Ye(f.value,void 0);if(d(g))return g;let I=Ye(void 0,void 0);return d(I)?I:u("Created default events",[{id:Mt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:Mt(),userId:e,userName:t,action:"create.contributor",payload:{id:e,name:t}},{id:Mt(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:l.value}},{id:Mt(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Mt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:Mt(),userId:e,userName:t,action:"add.swimlane",payload:{id:a,name:"Done",parent:r,rank:g.value}},{id:Mt(),userId:e,userName:t,action:"add.board",payload:{id:ko,name:"Closed",parent:n,rank:m.value}},{id:Mt(),userId:e,userName:t,action:"add.swimlane",payload:{id:Ce,name:"Closed",parent:ko,rank:I.value}},{id:Mt(),userId:e,userName:t,action:"lock.node",payload:{id:ko}},{id:Mt(),userId:e,userName:t,action:"lock.node",payload:{id:Ce}}])}var ch=()=>{let e=Qe();if(d(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},lh=e=>{if(e.length===0)return;let t=e.filter(r=>r.reason==="corrupt-line"),n=e.filter(r=>r.reason!=="corrupt-line");if(n.length>0){let r=[...new Set(n.map(o=>o.detail))].join(", ");Y.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(", ");Y.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}};function Gt(e,t=[]){if(ch())return u("Skipped boot while checked out at a historical point",null);if(!e.length){let s=le.workspace("temporary-uninitialized-workspace","Workspace","a0"),a=Pr(s);return d(a)?a:(N({hasProjectDefinition:!1,mode:y.DEFAULT}),u("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return i("Initialized Epiq project has no workspace init event");let n=vt(e),{fatal:r,skipped:o}=jt(n);return r.length>0?i(`Materializing failed:
|
|
28
28
|
${r.map(s=>s.message).join(`
|
|
29
|
-
`)}`):(Ht(o),
|
|
30
|
-
`).filter(t=>t.trim().length>0),_c=e=>{let t=Uc.join(e,et,wn);try{if(!zi.existsSync(t))return u("No events directory",[]);let n=zi.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>Ko(zi.readFileSync(Uc.join(t,r),"utf8")).length>0);return u("Looked for stranded event logs",n)}catch(n){return i(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},
|
|
31
|
-
`)
|
|
32
|
-
`));Y.info("Creating initial commit");let r=await _({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(d(r))return i(r.message);let o=await _({args:["commit-tree",r.value.stdout.trim(),"-m",
|
|
29
|
+
`)}`):(Ht(o),dh(),N({hasProjectDefinition:!0}),lh(t),u("State booted successfully",null))}import{WebSocket as uh}from"ws";var jo=new Set,Fc=e=>{jo.add(e),e.on("close",()=>{jo.delete(e)}),e.on("error",()=>{jo.delete(e)})},on=e=>{let t=JSON.stringify(e);for(let n of jo)n.readyState===uh.OPEN&&n.send(t)};var Ho=e=>{wt()&&(N({syncStatus:e}),on({type:"sync-status",payload:e}))},Wo=(e="Syncing...")=>{Ho({status:"syncing",msg:e})},Go=(e="Synced")=>{Ho({status:"synced",msg:e})},Ki=e=>{Ho({status:"failed",msg:e})},Oc=e=>{Ho({status:"offline",msg:e})},je=e=>(Ki(e),i(e));var Pt=(e,t)=>(logger.error(`[boot:${e}] ${t}`),i(`[boot:${e}] ${t}`)),Vo=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)}},ee=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);import Rh from"node:fs";import Vt from"node:fs";import kr from"node:path";import zi from"node:fs";import Uc from"node:path";var Ko=e=>e.split(`
|
|
30
|
+
`).filter(t=>t.trim().length>0),_c=e=>{let t=Uc.join(e,et,wn);try{if(!zi.existsSync(t))return u("No events directory",[]);let n=zi.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>Ko(zi.readFileSync(Uc.join(t,r),"utf8")).length>0);return u("Looked for stranded event logs",n)}catch(n){return i(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},mh=(e,t)=>{let n=new Set(Ko(t));return Ko(e).filter(r=>!n.has(r))},ph=(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(`
|
|
31
|
+
`),$c=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let r=await Je({args:["show",`HEAD:${t}`],cwd:e});if(r.exitCode!==0)return u("No committed log to compare against",void 0);let o=mh(r.stdout,n);return o.length>0?i(ph(t,o,Ko(r.stdout).length)):u("Event log only grew",void 0)};var fh="[epiq:init-repo]",Hc=async e=>{let t=await Je({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 i(["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(`
|
|
32
|
+
`));Y.info("Creating initial commit");let r=await _({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(d(r))return i(r.message);let o=await _({args:["commit-tree",r.value.stdout.trim(),"-m",fh],cwd:e});if(d(o))return i(o.message);let s=await _({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return d(s)?i(s.message):u("Created initial commit",!0)},jc=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",gh=async e=>{let t=await Ro(e);if(d(t))return i(t.message);let n=await Ad(e);return d(n)?i(n.message):u("Built sync commit message",`[sync|branch:${jc(t.value)}:sha:${jc(n.value)}]`)},qi=async({repoRoot:e,stateBranchName:t})=>{Y.info(`Creating ${t}`);let n=await _({args:["commit-tree",Dd,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return i(`Failed to create state branch commit
|
|
33
33
|
${n.message}`);let r=n.value.stdout.trim(),o=await _({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?i(`Failed to create ${t}
|
|
34
34
|
${o.message}`):u("Created state branch",!0)},Yi=async({repoRoot:e,stateBranchName:t})=>{let n=await No({repoRoot:e,branch:t});if(d(n))return i(`Ensure local state branch failed
|
|
35
35
|
`+n.message);if(n.value)return u("Local state branch already exists",!1);let r=await Ei({repoRoot:e});if(d(r))return i(`Ensure local state branch failed
|
|
36
36
|
`+r.message);let o=r.value,s=o?await Si({repoRoot:e,branch:t}):u("No remote, no remote state branch",!1);if(d(s))return i(`Ensure local state branch failed
|
|
37
37
|
`+s.message);let a=s.value;if(o&&a){let c=await xe.fetch({cwd:e,remote:st,branch:t});if(d(c))return i(`Failed to fetch ${t} from remote
|
|
38
38
|
${c.message}`)}if(a){let c=await _({args:["branch","--track",t,`${st}/${t}`],cwd:e});return d(c)?i(`Failed to create local ${t} from remote
|
|
39
|
-
${c.message}`):u("Created local state branch from remote",!0)}return qi({repoRoot:e,stateBranchName:t})},
|
|
40
|
-
`),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)},
|
|
39
|
+
${c.message}`):u("Created local state branch from remote",!0)}return qi({repoRoot:e,stateBranchName:t})},hh=async({repoRoot:e,branch:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return i(n.message);let r=n.value.stdout.split(`
|
|
40
|
+
`),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)},vh=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Ir(kr.dirname(t));if(d(r))return i(`Failed to create state branch worktree
|
|
41
41
|
`+r.message);if(Vt.existsSync(t)&&!Vt.existsSync(kr.join(t,".git"))){let s=_c(t);if(d(s))return i(s.message);if(s.value.length>0)return i([`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(a=>` ${a}`),"","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(`
|
|
42
42
|
`));Y.info("Removing broken state branch worktree path"),Ud(t)}Y.info("Creating state branch worktree");let o=await xe.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?i(`Failed to create state branch worktree
|
|
43
|
-
${o.message}`):u("Created state branch worktree",!0)},Dn=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await
|
|
43
|
+
${o.message}`):u("Created state branch worktree",!0)},Dn=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await hh({repoRoot:e,branch:n});if(d(r))return i(r.message);let o=xr(t),s=r.value?xr(r.value):null;if(s&&s===o&&Vt.existsSync(s))return u("State branch already checked out in expected worktree",!1);if(s&&s!==o){let l=await Md(s);if(d(l))return i(l.message);if(l.value)return i([`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(`
|
|
44
44
|
`));Y.info("Moving state branch worktree to expected location");let m=await xe.worktreeRemove({cwd:e,worktreeRoot:s});if(d(m))return i(`Failed to remove existing state branch worktree
|
|
45
45
|
${m.message}`)}if(s&&!Vt.existsSync(s)){Y.info("Pruning stale state branch worktree");let l=await xe.worktreePrune({cwd:e});if(d(l))return i(`Failed to prune stale worktrees
|
|
46
46
|
${l.message}`)}let a=await Rd({repoRoot:e,worktreeRoot:t});if(d(a))return i(a.message);let c=Vt.existsSync(t);if(a.value&&c)return u("State branch worktree already exists",!1);if(a.value&&!c){Y.info("Pruning missing registered state branch worktree");let l=await xe.worktreePrune({cwd:e});if(d(l))return i(`Failed to prune stale worktrees
|
|
47
|
-
${l.message}`)}return
|
|
48
|
-
${o.message}`):u("Checked out state branch",!0)},
|
|
47
|
+
${l.message}`)}return vh({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},yh=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Ro(e);if(d(n))return i(n.message);if(n.value===t)return u("State branch already checked out",!1);(await Je({cwd:e,args:["rebase","--abort"]})).exitCode===0&&Y.info("Aborted stale state branch rebase");let o=await xe.checkout({cwd:e,branch:t});return d(o)?i(`Failed to checkout ${t}
|
|
48
|
+
${o.message}`):u("Checked out state branch",!0)},bh=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Ci(t);if(d(n))return i(n.message);if(n.value)return u("State branch upstream already configured",!1);let r=await Ei({repoRoot:t});if(d(r))return i(r.message);if(!r.value)return u("No remote available for state branch upstream",!1);let o=Zt(e);if(d(o))return o;let s=o.value,a=await Si({repoRoot:t,branch:s});if(d(a))return i(a.message);if(!a.value)return u("Remote state branch missing; upstream will be configured on first push",!1);Y.info(`Configuring ${s} upstream`);let c=await xe.fetch({cwd:t,remote:st,branch:s});if(d(c))return i(`Failed to fetch ${s}
|
|
49
49
|
${c.message}`);let l=await xe.setUpstream({cwd:t,branch:s,upstream:`${st}/${s}`});return d(l)?i(`Failed to set state branch upstream
|
|
50
|
-
${l.message}`):u("Configured state branch upstream",!0)},zo=async({stateBranchRoot:e,eventFileName:t})=>{let n=Bd(t),r=kr.join(e,n);if(!Vt.existsSync(r))return u("No event file to stage",null);let o=await
|
|
50
|
+
${l.message}`):u("Configured state branch upstream",!0)},zo=async({stateBranchRoot:e,eventFileName:t})=>{let n=Bd(t),r=kr.join(e,n);if(!Vt.existsSync(r))return u("No event file to stage",null);let o=await $c({stateBranchRoot:e,relativePath:n,workingContent:Vt.readFileSync(r,"utf8")});if(d(o))return i(o.message);let s=await xe.stage({cwd:e,pathspec:[n]});return d(s)?i(`Failed to stage state branch event file
|
|
51
51
|
${s.message}`):u("Staged state branch event file",n)},Wc=async({stateBranchRoot:e})=>{let t=Fd(),n=kr.join(e,t);if(!Vt.existsSync(n))return u("No media directory to stage",null);let r=await xe.stage({cwd:e,pathspec:[t]});return d(r)?i(`Failed to stage state branch media files
|
|
52
52
|
${r.message}`):u("Staged state branch media files",t)},Gc=async({stateBranchRoot:e})=>{let t=Ti();if(!Vt.existsSync(kr.join(e,t)))return u("No event log attributes to stage",null);let n=await xe.stage({cwd:e,pathspec:[t]});return d(n)?i(`Failed to stage event log attributes
|
|
53
|
-
${n.message}`):u("Staged event log attributes",t)},Vc=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await
|
|
53
|
+
${n.message}`):u("Staged event log attributes",t)},Vc=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await gh(e);return d(r)?i(`Create state branch sync commit failed
|
|
54
54
|
`+r.message):Kn({cwd:t,message:r.value,pathspec:n})},Dr=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Ci(t);if(d(n))return i(n.message);let r=Zt(e);if(d(r))return r;let o=r.value,s=n.value?await xe.push({cwd:t}):await xe.push({cwd:t,remote:st,branch:o,setUpstream:!0});if(d(s))return i(`Failed during state branch push
|
|
55
|
-
${s.message}`);let a=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return u(a?"Pushed state branch":"Remote already up to date",a)},Kc=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Zt(e);if(d(o))return o;let s=o.value,a=[To(),await Yi({repoRoot:e,stateBranchName:s}),await Dn({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await vh({stateBranchRoot:t,stateBranchName:s}),await jd(t),n?await yh({stateBranchRoot:t,repoRoot:e}):u("Skipped state branch upstream bootstrap",!1)];for(let c of a){if(d(c))return i(c.message);r=r||!!c.value}return u(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import qo from"node:fs";import Ji from"node:os";import bh from"node:path";var xh="epiq-sync.lock",zc=600*1e3,Ih=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}},Eh=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Sh=e=>e&&(e.hostname!==Ji.hostname()||Eh(e.pid))?Date.now()-e.startedAt>zc:!0,Yc=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Xi=e=>{try{return Ih(qo.readFileSync(e,"utf8"))}catch{return null}},qc=(e,t)=>{let n={pid:process.pid,hostname:Ji.hostname(),startedAt:Date.now(),operation:t};try{return qo.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},Ch=async({worktreeRoot:e,operation:t})=>{let n=await Ii(e);if(d(n))return i(n.message);let r=bh.join(n.value,xh),o=()=>{try{let c=Xi(r);c&&c.pid===process.pid&&qo.rmSync(r)}catch{}};if(qc(r,t))return u("Acquired sync lock",{acquired:!0,release:o});let s=Xi(r);if(!Sh(s))return u("Sync lock is held",{acquired:!1,heldBy:s});Y.info(`Breaking an abandoned sync lock: ${s?Yc(s):"unreadable lock file"}`);try{qo.rmSync(r,{force:!0})}catch{}if(qc(r,t))return u("Acquired sync lock after breaking a stale one",{acquired:!0,release:o});let a=Xi(r);return u("Sync lock taken by another process",{acquired:!1,heldBy:a??{pid:-1,hostname:Ji.hostname(),startedAt:Date.now(),operation:"unknown"}})},Xc=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await Ch({worktreeRoot:e,operation:t});if(d(r))return i(r.message);if(!r.value.acquired)return Y.info(`Skipping ${t}: the state worktree is held by ${Yc(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 Rh=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=ee("getRepoRootDir",await ft(e));if(d(n))return i(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=ee("getStateBranchRoot",Se({repoRoot:r}));if(d(o))return i(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 a=ee("bootstrapStateBranchStorage",await Kc({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(d(a))return i(a.message);logger.debug("[sync] bootstrap result",{bootstrapped:a.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let c=ee("hasInProgressGitOperation(stateBranchRoot)",await Co(s));if(d(c))return i(c.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:c.value}),c.value)return logger.info("[sync] state branch git operation in progress"),i("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 l=ee("ensureStateBranchLayout",_d(r,s));return d(l)?i(l.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:a.value}),u("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:a.value}))},Ah=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=ee("stageStateBranchOwnEventFile",await zo({stateBranchRoot:t,eventFileName:n}));if(d(r))return i(r.message);let o=ee("stageStateBranchMediaFiles",await Wc({stateBranchRoot:t}));if(d(o))return i(o.message);let s=ee("stageStateBranchEventAttributes",await Gc({stateBranchRoot:t}));if(d(s))return i(s.message);let a=[r.value,o.value,s.value].filter(m=>m!==null);if(a.length===0)return u("Nothing to stage",{createdCommit:!1});let c=ee("hasStagedChanges(after stage)",await Pd(t,a));if(d(c))return i(c.message);if(logger.debug("[sync] state branch change check after stage result",{changed:c.value}),!c.value)return logger.info("[sync] no own event file changes to commit"),u("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let l=ee("createStateBranchSyncCommit",await Vc({repoRoot:e,stateBranchRoot:t,pathspec:a}));return d(l)?i(l.message):(logger.debug("[sync] created sync commit",l.value),u("Committed own event file",{createdCommit:!0,commitSha:l.value}))},Jc=e=>{let t=e.createdCommit?"Committed locally, offline":"Offline";return Oc(t),u(t,{...e,pulled:!1,pushed:!1,offline:!0})},Qc=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}),i("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}),i("Own event file must end with .jsonl");Wo();let n=ee("ensureSyncReady",await Rh({cwd:e,ensureUpstream:!0}));if(d(n))return $e(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,a=ee("isDetachedHead(stateBranchRoot)",await Ld(o));if(d(a))return $e(a.message);if(logger.debug("[sync] detached state branch check result",{detached:a.value}),a.value)return $e("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,l,m=!1,p=!1,f=ee("getStateBranch",Zt(r));if(d(f))return $e(f.message);let g=f.value;logger.debug("[sync] resolved state branch",{stateBranch:g,stateBranchRoot:o});let I=ee("commitOwnEventFileToStateBranch",await Ah({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(I))return $e(I.message);c=I.value.createdCommit,l=I.value.commitSha;let E=ee("pullBranchRebaseIfPresent",await Ri({cwd:o,branch:g}));if(d(E))return Ni(E.message)?Jc({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:l,bootstrapped:s}):$e(E.message);m=E.value;let C=ee("isAheadOfUpstream",await wd(o));if(d(C))return $e(C.message);if(c||s||C.value){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:o});let A=ee("pushStateBranch",await Dr({stateBranchRoot:o,repoRoot:r}));if(d(A)&&Td(A.message)){let w=ee("pullBranchRebaseIfPresent(retry)",await Ri({cwd:o,branch:g}));if(d(w))return $e(w.message);m=m||w.value,A=ee("pushStateBranch(retry)",await Dr({stateBranchRoot:o,repoRoot:r}))}if(d(A))return Ni(A.message)?Jc({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:l,bootstrapped:s}):$e(A.message);p=A.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let A=ee("git rev-parse HEAD",await _({args:["rev-parse","HEAD"],cwd:o}));if(d(A))return $e(A.message);l=A.value.stdout.trim(),logger.debug("[sync] final sync commit sha",l)}return Go(p?"Synced and pushed":m||c?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),u("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:l,pulled:m,pushed:p,bootstrapped:s,offline:!1})},Yo=async e=>{let t=e.cwd??process.cwd(),n=await ft(t);if(d(n))return $e(n.message);let r=Se({repoRoot:n.value});if(d(r))return $e(r.message);let o=r.value;if(!Nh.existsSync(o))return Qc(e);let s=await Xc({worktreeRoot:o,operation:"sync",fn:()=>Qc(e)});return d(s)?$e(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 Lt=null,Xo=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Lt,currentStatus:h().syncStatus?.status,currentMessage:h().syncStatus?.msg}),Lt)return logger.debug("[sync] syncAndReloadState joining existing promise"),Lt;logger.debug("[sync] syncAndReloadState creating promise"),Lt=Th();try{let e=await Lt;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}),Lt||i(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:h().syncStatus?.status,statusMessageBeforeClear:h().syncStatus?.msg}),Lt=null}},Th=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:h().mode,syncStatus:h().syncStatus});let e=Zc();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:h().mode,message:e.message,syncStatus:h().syncStatus}),e;if(Lt)return Lt;logger.debug("[sync] syncAndReloadState:start");let t=ee("resolveActorId",he());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),i("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=Ln(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=ee("syncEpiqWithRemote",await Yo({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}),$e(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let a=ee("loadMergedEvents",Wt(o));if(logger.debug("[sync] loadMergedEvents:result",{success:!d(a),message:(d(a),a.message),count:d(a)?void 0:a.value.events.length}),d(a))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:h().syncStatus}),i(`Unable to load events. ${a.message}`);logger.debug("[sync] loaded merged events after sync",{count:a.value.events.length});let c=Zc();if(c)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:h().mode,message:c.message,syncStatus:h().syncStatus}),c;let l=Lc(),m=h().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:l,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:a.value.events.length});let f=ee("bootStateFromEventLog",Gt(a.value.events,a.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(f),message:(d(f),f.message)}),d(f))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:h().syncStatus}),i(`Unable to boot synced state. ${f.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:m}),logger.debug("[sync] restoreNavigationAnchor:start");let p=ee("restoreNavigationAnchor",Dc(l));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(p),message:d(p)?p.message:"Navigation restored",selectedNodeId:h().selectedNode?.id,contextNodeId:h().contextNode?.id}),d(p)?(N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:h().syncStatus}),p):(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))},Zc=()=>h().mode===y.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:h().mode,syncStatus:h().syncStatus}),N({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),i("Will not re-materialize if not in default mode, to not lose edit data"));var Xn=3e3,el=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Xn?null:t},tl=0,Qi,Zi=!1,Br=!1,ea=()=>{if(Zi)return!0;let e=Qe();return d(e)?!1:e.value.syncStatus.status==="syncing"},wh=()=>{let e=Q().autoSyncIntervalMs??1e4,t=Date.now()-tl;return Math.max(0,e-t)},nl=()=>{Qi||(Qi=setTimeout(async()=>{if(Qi=void 0,!!wt()){if(ea()){Br=!0;return}Br=!1,await Mh()}},wh()))},Mh=async()=>{if(h().readOnly||h().timeMode==="peek"||h().timeMode==="replay")return i("Cannot auto-sync while peeking");if(!wt())return i("Cannot auto-sync before state is initialized");if(ea())return Br=!0,i("Sync already in progress");Zi=!0,tl=Date.now(),N({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Xo()}finally{Zi=!1,Br&&nl()}},Jo=()=>{wt()&&(Br=!0,!ea()&&nl())};import Fr from"node:fs";import Or from"node:path";import{z as Jn}from"zod";var Qo="recent-projects.json",Ph=20,Lh=Jn.object({projectId:Jn.string().min(1),root:Jn.string().min(1),lastOpenedAt:Jn.number().finite()}),kh=Jn.object({projects:Jn.array(Lh)}),ol=()=>Or.join(Rn(),Qo),Qn=e=>Or.basename(e)||e,rl=e=>{let t=Or.resolve(e);try{return Fr.realpathSync(t)}catch{return t}},sl=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,il=e=>{if(!Nr(e.root))return!1;let t=vr(e.root);return!d(t)&&t.value===e.projectId},al=()=>{let e=ol();if(!Fr.existsSync(e))return u("No recent projects recorded",[]);let t;try{t=JSON.parse(Fr.readFileSync(e,"utf8"))}catch(r){return i(`Invalid ${Qo}: ${r instanceof Error?r.message:String(r)}`)}let n=kh.safeParse(t);return n.success?u("Read recent projects",n.data.projects):i(`Invalid ${Qo} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Dh=e=>{let t=ol();try{Fr.mkdirSync(Or.dirname(t),{recursive:!0}),Fr.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
|
|
56
|
-
`,"utf8")}catch(n){return i(`Unable to write ${Qo}: ${n instanceof Error?n.message:String(n)}`)}return u("Recorded recent project",e)},Kt=({exclude:e}={})=>{let t=al();if(d(t))return t;let n=e===void 0?null:rl(e);return u("Listed recent projects",t.value.filter(r=>n===null||rl(r.root)!==n).filter(il).sort(sl))},Zo=({root:e,now:t=Date.now()})=>{let n=Or.resolve(e),r=vr(n);if(d(r))return i(r.message);let o=r.value,s=al(),a=d(s)?[]:s.value,c=[{projectId:o,root:n,lastOpenedAt:t},...a.filter(l=>l.projectId!==o&&l.root!==n)].filter(il).sort(sl).slice(0,Ph);return Dh(c)};var sn=()=>{let e=Q(),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}},dl=()=>{let e=_e(process.cwd());if(d(e))return!1;let t=Ct(e.value);return de(t)},cl=e=>e===!0?"on":e===!1?"off":null,ll=e=>e==="on"?!0:e==="off"?!1:null;var He={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"},v={accent:He.cyan,accent2:He.magenta,primary:He.white,secondary:He.grayDark,secondary2:He.grayLight,gray:He.gray,green:He.green,yellow:He.yellow,red:He.red};var R={red:He.red,yellow:He.yellow,green:He.green,blue:He.blue,magenta:He.magenta,cyan:He.cyan},Zn={urgent:R.red,critical:R.red,important:R.red,blocker:R.red,asap:R.red,immediate:R.red,fail:R.red,failure:R.red,broken:R.red,bug:R.red,error:R.red,incident:R.red,outage:R.red,production:R.red,crash:R.red,security:R.red,warning:R.yellow,warn:R.yellow,risky:R.yellow,risk:R.yellow,attention:R.yellow,pending:R.yellow,review:R.yellow,"needs-review":R.yellow,qa:R.yellow,testing:R.yellow,test:R.yellow,validate:R.yellow,verification:R.yellow,staging:R.yellow,check:R.yellow,"follow-up":R.yellow,followup:R.yellow,waiting:R.yellow,blocked:R.yellow,hold:R.yellow,done:R.green,complete:R.green,completed:R.green,success:R.green,ok:R.green,stable:R.green,resolved:R.green,fixed:R.green,closed:R.green,merged:R.green,released:R.green,deployed:R.green,approved:R.green,verified:R.green,working:R.green,healthy:R.green,pass:R.green,passing:R.green,info:R.blue,information:R.blue,note:R.blue,docs:R.blue,documentation:R.blue,doc:R.blue,guide:R.blue,help:R.blue,explanation:R.blue,detail:R.blue,details:R.blue,context:R.blue,design:R.blue,discussion:R.blue,proposal:R.blue,idea:R.blue,feature:R.magenta,enhancement:R.magenta,improvement:R.magenta,refactor:R.magenta,refactoring:R.magenta,cleanup:R.magenta,optimize:R.magenta,optimization:R.magenta,perf:R.magenta,performance:R.magenta,upgrade:R.magenta,migration:R.magenta,modernize:R.magenta,debt:R.magenta,todo:R.cyan,next:R.cyan,planned:R.cyan,plan:R.cyan,future:R.cyan,backlog:R.cyan,investigate:R.cyan,explore:R.cyan,prototype:R.cyan};var Bh=e=>e.props.tags??[],Fh=e=>e.props.assignees??[],an=e=>Bh(e).map(t=>S.getTag(t)).filter(t=>!!t),dn=e=>Fh(e).map(t=>S.getContributor(t)).filter(t=>!!t),es=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!M(n)?i("Invalid untag target"):u("Retrieved tags from ticket in breadcrumb",an(n))},ts=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!M(n)?i("Invalid unassign target"):u("Retrieved assignees from ticket in breadcrumb",dn(n))};var b={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",COFFEE:"coffee",NONE:""};var Oh=/^(\d+)(h|d|w|mo|y)$/,Uh=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,_h=({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},jh=(e,t=new Date)=>{let n=e.match(Oh);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-s),a;case"d":return a.setDate(a.getDate()-s),a;case"w":return a.setDate(a.getDate()-s*7),a;case"mo":return a.setMonth(a.getMonth()-s),a;case"y":return a.setFullYear(a.getFullYear()-s),a;default:return null}},$h=e=>{let t=e.match(Uh);if(!t)return null;let[,n,r,o,s,a]=t,c=Number(n),l=Number(r),m=Number(o),p=s?Number(s):0,f=a?Number(a):0;return _h({year:c,month:l,day:m,hour:p,minute:f})?new Date(c,l-1,m,p,f):null},Bn=e=>{let t=e.trim().toLowerCase();return jh(t)??$h(t)};var ul=/^(\d+)(s|m)?$/,ns=e=>{let t=e.trim().toLowerCase().match(ul);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},rs=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&ul.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},ml=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Hh=[{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}],ta=(e=Hh)=>{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 Wh=["BOARD","TICKET","SWIMLANE","COMMENT"],pe={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},rt={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Ne={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},Gh=[pe.EDITOR,pe.VIEW,pe.USERNAME,pe.AUTOSYNC,pe.SYNC_DEBOUNCE_MS,pe.ATTACHMENT_MAX_KB,pe.LOG_LEVEL],Vh=(e=h().selectedNode?.context)=>{switch(e){case"TICKET":return[rt.TITLE,rt.DESCRIPTION];case"BOARD":case"SWIMLANE":return[rt.TITLE];case"COMMENT":return[rt.COMMENT];default:return[]}},ra=[String(Xn),"5000","15000","30000","60000"],oa=["250","500","1000"],gl=["10s","20s","30s","45s"],Fn=[b.COFFEE,b.EXIT,b.SYNC,b.HELP,b.EXPORT,b.CONFIG,b.YANK],os=[b.NEW,b.EDIT,b.DELETE,b.MOVE],na=[b.TAG,b.UNTAG,b.ASSIGN,b.UNASSIGN,b.CLOSE_ISSUE,b.RE_OPEN_ISSUE,b.EDIT,b.COMMENT],pl=[b.FILTER,b.PEEK,b.REPLAY],Kh={WORKSPACE:[...Fn,...os],BOARD:[...pl,...Fn,...os],SWIMLANE:[...pl,...Fn,...os],TICKET:[...Fn,...os,...na],FIELD:[...Fn,...na],FIELD_LIST:[...Fn,...na],TEXT:[...Fn],COMMENT:[b.EDIT,b.DELETE,b.YANK]},zh=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ur=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&M(n)),fl=e=>e.parentNodeId===Ce,qh=({selectedNode:e,breadCrumb:t})=>{let n=Vh(e?.context);return Ur({breadCrumb:t,selectedNode:e})?n.includes(rt.DESCRIPTION)?n:[...n,rt.DESCRIPTION]:n},Yh=({selectedNode:e,breadCrumb:t})=>{let n=Ur({breadCrumb:t,selectedNode:e});return n?[Ne.REF,Ne.TITLE,...n.props?.description?.trim()?[Ne.DESCRIPTION]:[],...an(n).length>0?[Ne.TAGS]:[],...dn(n).length>0?[Ne.ASSIGNEES]:[]]:e?[Ne.REF,Ne.TITLE]:[]},sa=()=>{let e=Kt({exclude:process.cwd()});return d(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},Xh=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=sn();if(!r)return[b.HELP,b.CONFIG];if(!dl())return[b.HELP,b.INIT,b.OPEN];if(t)return[b.HELP,b.PEEK,b.REPLAY,b.EXPORT,b.CONFIG,b.YANK];let o=e?.context,s=o&&Wh.includes(o),a=[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?Kh[l]:[]))],c=Ur({breadCrumb:n,selectedNode:e});return a.filter(l=>l===b.MOVE?!1:l===b.YANK?!!(c??e):l===b.EDIT?s||!!c:l===b.DELETE?s:l===b.UNTAG?!!(c&&an(c).length>0):l===b.UNASSIGN?!!(c&&dn(c).length>0):l===b.RE_OPEN_ISSUE?!!(c&&fl(c)):l===b.CLOSE_ISSUE?!!(c&&!fl(c)):!0)},ve=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=h())=>{let s=t.context??"WORKSPACE";return{[b.NONE]:Xh({breadCrumb:o,readOnly:r,selectedNode:n}),[b.EXIT]:["confirm"],[b.EXPORT]:[],[b.SYNC]:[],[b.INIT]:[],[b.OPEN]:e===b.OPEN?sa():[],[b.HELP]:[],[b.PEEK]:[...ta(),"now","prev","next"],[b.REPLAY]:[...ta()],[b.EDIT]:qh({selectedNode:n,breadCrumb:o}),[b.YANK]:Yh({selectedNode:n,breadCrumb:o}),[b.COMMENT]:[],[b.DELETE]:["confirm"],[b.RE_OPEN_ISSUE]:["confirm"],[b.CLOSE_ISSUE]:["confirm"],[b.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[b.FILTER]:["tag","assignee","description","title","ref","clear"],[b.TAG]:[...new Set([...Object.keys(Zn),...S.getExistingTags()])],[b.UNTAG]:[...es()?.value?.map(({name:c})=>c)??[]],[b.UNASSIGN]:[...ts()?.value?.map(({name:c})=>c)??[]],[b.ASSIGN]:S.getExistingAssignees(),[b.NEW]:zh(s),[b.CONFIG]:[...Gh],[b.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import Ll from"chalk";var hl=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as vl}from"ulid";var ss=e=>{try{return u("Decoded date",new Date(vl(e)))}catch(t){return i("Decoding failed + "+t.message)}},cn=e=>{if(!e?.id)return null;try{return vl(e.id)}catch{return null}};import tv from"zod";import Jh from"node:crypto";import _r from"node:fs";import yl from"node:path";var kt=500,Qh=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,er=(e,t)=>`${e}.${t}`,Zh=e=>Qh.test(e),bl=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"):i(`Unsupported image format. Allowed: ${Jd.join(", ")}`),xl=e=>Jh.createHash("sha256").update(e).digest("hex"),ev=(e,t=kt)=>{if(e.length===0)return i("Attachment is empty");if(e.length>t*1024)return i(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=bl(e);return d(n)?n:u("Validated attachment data",{hash:xl(e),ext:n.value,bytes:e.length})},Il=(e,t,n=kt)=>{let r=ev(t,n);if(d(r))return r;let o=Cr(e),s=yl.join(o,er(r.value.hash,r.value.ext));try{_r.existsSync(s)||(_r.mkdirSync(o,{recursive:!0}),_r.writeFileSync(s,t))}catch(a){return i(`Unable to write attachment blob: ${a instanceof Error?a.message:String(a)}`)}return u("Wrote attachment blob",r.value)},El=(e,t,n=kt)=>{if(!Zh(t))return i("Invalid attachment file name");let r=yl.join(Cr(e),t);if(!_r.existsSync(r))return i("Attachment blob not found");let o;try{o=_r.readFileSync(r)}catch(l){return i(`Unable to read attachment blob: ${l instanceof Error?l.message:String(l)}`)}if(o.length>n*1024)return i(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,a]=t.split(".");if(xl(o)!==s)return i("Attachment blob does not match its content hash");let c=bl(o);return d(c)?c:c.value!==a?i("Attachment blob content does not match its extension"):u("Resolved attachment blob",{filePath:r,ext:a,bytes:o.length})};var jr=50,$r=5e3,Sl=()=>{let e=te().commandMeta.inputString,t=tv.coerce.number().int().min(jr).max($r).safeParse(e);if(!t.success)return i(`Attachment size cap must be ${jr}-${$r} KB (default ${kt})`);let n=at({attachmentMaxKb:t.data});return d(n)?n:(je({attachmentMaxKb:t.data}),N({mode:y.DEFAULT}),u(`Attachment size cap set to ${t.data} KB`,null))};import tr from"chalk";var aa={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Cl=(e,t,n)=>Math.max(t,Math.min(n,e)),ia=(e,t,n)=>e+(t-e)*n,Nl=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},nv=e=>e.toLowerCase().trim(),rv=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,a=e/60,c=s*(1-Math.abs(a%2-1)),l=0,m=0,p=0;a>=0&&a<1?(l=s,m=c):a>=1&&a<2?(l=c,m=s):a>=2&&a<3?(m=s,p=c):a>=3&&a<4?(m=c,p=s):a>=4&&a<5?(l=c,p=s):(l=s,p=c);let f=o-s/2;return[Math.round((l+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},Rl=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var ov=(e,t,n)=>{let r=Cl(n,0,1);return[Math.round(ia(e[0],t[0],r)),Math.round(ia(e[1],t[1],r)),Math.round(ia(e[2],t[2],r))]};var sv=(e,t,n)=>ov(e,t,n),Hr=e=>{let t=Nl(e)%360,n=rv(t,aa.stringColor.saturation,aa.stringColor.lightness);return Rl(n)},oe=(e,t=Zn)=>{let n=nv(e);return n&&t[n]?t[n]:Hr(n)};var Al=e=>{let t=aa.gradient.stops,n=Cl(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),a=o-s;return sv(t[s],t[s+1],a)},is=e=>Rl(Al(e)),as=e=>Nl(e.toLowerCase().trim())/4294967295,Tl=e=>{let t=as(e);return Al(t)},iv=e=>{let[t,n,r]=Tl(e);return{normal:o=>tr.bgRgb(t,n,r).black(o),cursor:o=>tr.bgRgb(t,n,r).white.bold(o)}},da=e=>{let[t,n,r]=Tl(e);return{fg:o=>tr.rgb(t,n,r)(o),fgCursor:o=>tr.rgb(t,n,r).inverse(o),bg:o=>tr.bgRgb(t,n,r).black(o),bgCursor:o=>tr.bgRgb(t,n,r).white.bold(o)}},ds=e=>iv(e).normal(` ${e} `);var yt=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as av}from"node:crypto";var dv="0123456789ABCDEFGHJKMNPQRSTVWXYZ",cv=e=>{let t=av("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+=dv[Number(n>>s&31n)]}return r},we=(e,t)=>cv(`${e}:virtual:${t}`);import wl from"chalk";var re=e=>wl.dim(e),Me=e=>wl.hex(v.primary)(e),Pe=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let a=o.trim();if(a.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(a))].sort((f,g)=>as(f)-as(g)).slice(0,r).map(f=>ds(f)).join(" ");return p?`${re(e)}${p}${re(n)}`:""};var Dt={None:"none",Invalid:"invalid",Valid:"valid"};var lv=["BOARD","TICKET","SWIMLANE"],Ml=()=>{let e=h().selectedNode;if(!e?.context)return $({message:re("Missing target context")});if(lv.includes(e.context))return X();if(e.parentNodeId){let t=h().nodes[e.parentNodeId];if(t?.id===we(t?.parentNodeId??"","comments"))return X()}return $({message:re("Command not available in this context")})},me="<ENTER> to confirm",X=(e="",t=[])=>({message:re(e),validity:Dt.Valid,completionWordList:t}),$=({message:e,completionWordList:t=[]})=>({validity:Dt.Invalid,message:e,completionWordList:t}),nr=e=>e.length===0,Pl=(e,t)=>{let n=ze(h().breadCrumb,"BOARD");if(d(n))return $({message:Me("Command is not applicable in this context")});let r=ss(n.value.id);return d(r)?$({message:Me(`Unable to ${t}: board id is not a valid ULID`)}):ml({date:e,horizonDate:r.value})?null:$({message:Me(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},cs=e=>` ${Ll.hex("#000").bgHex(oe(e))(` ${e} `)} `,ca=({modifier:e})=>{let t="confirm";return e===t?X(me):$({message:nr(e)?re("if you are certain, enter ")+ds(t):"",completionWordList:[t]})},uv=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?$({message:re(n)}):X():$({message:nr(r)?t:"",completionWordList:[...e]}),On=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>nr(n)&&nr(r)?$({message:e,completionWordList:[]}):X(t??me),mv=({modifier:e,inputString:t})=>{let n=sa();return!nr(e)||!nr(t)?X(me):$({message:n.length?re("number from the list, or a path"):re("path to an epiq project"),completionWordList:n})},pv=({modifier:e,inputString:t})=>{let n=ve(b.CONFIG);if(!n.includes(e))return $({message:Pe({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case pe.EDITOR:{let r=[...hl];return t.trim()?r.includes(t.trim())?X(me):$({message:Pe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):$({message:Pe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case pe.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?X(me):$({message:Pe({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case pe.USERNAME:return t.trim()?X(me):$({message:Me("Enter a user name. Saved in ")+Ll.bgBlack("~/.epiq-global/config.json")});case pe.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?X(me):$({message:Pe({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case pe.AUTOSYNC:{let r=["on","off"],o=Q().autoSync;if(!r.includes(t.trim())){let s=cl(o);return $({message:Pe({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return X(me)}case pe.ATTACHMENT_MAX_KB:{let r=Q().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<jr||o>$r){let s=Pe({prefix:" examples: ",wordList:oa,minLengthForHints:0,inputString:t});return $({message:Me(`provide a size cap in KB (${jr}-${$r}). current: ${r??kt} KB.`)+s,completionWordList:oa})}return X(me)}case pe.SYNC_DEBOUNCE_MS:{let r=Q().autoSyncIntervalMs,o=el(t);if(!t.trim()||o===null||o<Xn){let s=Pe({prefix:" examples: ",wordList:ra,minLengthForHints:0,inputString:t});return $({message:Me(`provide duration above ${Xn}ms. current duration: ${r}ms.`)+s,completionWordList:ra})}return X(me)}default:return $({message:Me("Unknown config option"),completionWordList:n})}},fv=({modifier:e,inputString:t})=>{let n=ve(b.EDIT);if(!n.length)return $({message:Me("Command not available in this context")});if(!n.includes(e)){let r=Pe({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return $({message:r||Me("Unknown edit option"),completionWordList:n})}switch(e){case rt.COMMENT:return t.trim()?X(me):$({message:re("write a comment...")});case rt.TITLE:return X(me);case rt.DESCRIPTION:{let{preferredEditor:r}=Q();return r?X(re("<ENTER> to edit in ")+r):$({message:"No editor selected"})}default:return $({message:Me("Unknown edit option"),completionWordList:n})}},gv=({modifier:e})=>{let t=ve(b.YANK);return t.length?t.includes(e)?X(me+re(" and copy to clipboard")):$({message:Pe({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):$({message:Me("Nothing selected to copy from")})},hv={[b.EXPORT]:()=>X(me+re(", and create export markdown file")),[b.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return X(me);let n={message:re("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=Bn(r);if(!r||!o)return $(n);let s=Pl(o,"peek");return s||X(me)},[b.REPLAY]:e=>{let{dateInput:t,durationInput:n}=rs(e.modifier,e.inputString),r={message:re("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=Bn(t);if(!t||!o)return $(r);let s=Pl(o,"replay");return s||(n&&ns(n)===null?$({message:Me("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):X("<ENTER> to replay board history",n?gl:[]))},[b.EXIT]:()=>X(me+re(" and exit the application")),[b.INIT]:()=>X(me),[b.OPEN]:mv,[b.PALETTE]:()=>X(me),[b.FILTER]:e=>{if(e.modifier==="clear")return X(me);let t=s=>ve(b.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return $({message:Pe({wordList:ve(b.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ve(b.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())?$({message:Pe({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):X():$({message:Pe({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[b.NONE]:e=>{let t=ve(b.NONE);return $({message:Pe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[b.NEW]:e=>uv({list:ve(b.NEW),hint:Pe({wordList:ve(b.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[b.HELP]:()=>X(me),[b.EDIT]:fv,[b.COMMENT]:e=>{let t=On({hint:re(`write a comment (max ${4e3} char)...`),onOk:re(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===Dt.Invalid?t:e.inputString.length>4e3?X(Me("max input exceeded")):t},[b.CONFIG]:pv,[b.YANK]:gv,[b.DELETE]:e=>{let t=Ml();return t.validity==="invalid"?t:ca(e)},[b.CLOSE_ISSUE]:e=>ca(e),[b.RE_OPEN_ISSUE]:e=>ca(e),[b.MOVE]:e=>{let t=Ml();return t.validity==="invalid"?t:On({hint:Pe({prefix:"hey hacker! These commands are blocked for you... ",wordList:ve(b.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[b.TAG]:e=>{let n=S.getExistingTags().slice(0,10).map(cs).join("");return On({hint:n.length?re("create tag or reuse:")+n+re(""):re("create tag ...")})(e)},[b.UNTAG]:e=>{let t=es();if(d(t))return $({message:Me("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(cs).slice(0,10);return n.length?On({hint:re(" ... ")+n.join("")})(e):$({message:Me("Issue has no tags"),completionWordList:[]})},[b.ASSIGN]:e=>{let t=S.getExistingAssignees().map(cs).slice(0,10);return On({hint:re("assignees... ")+t.join("")})(e)},[b.UNASSIGN]:e=>{let t=ts();if(d(t))return $({message:Me("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(cs).slice(0,10);return n.length?On({hint:re("remove assignee... ")+n.join("")})(e):$({message:Me("Issue has no assignees"),completionWordList:[]})},[b.SYNC]:()=>X(me),[b.COFFEE]:e=>{let{modifier:t}=e,n=ve(b.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?$({message:re("enter an amount ... "),completionWordList:n.filter(r=>r.startsWith(t))}):On({hint:Pe({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},kl=Object.fromEntries(Object.entries(hv).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ls=["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 vv=3,yv=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"]),bv=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},xv=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=vv&&!yv.has(t)&&!/^\d+$/.test(t)),Iv=e=>{let t=new Map;for(let s of bv(e))for(let a of xv(s))t.set(a,(t.get(a)??0)+1);let n=[...t.entries()].sort((s,a)=>a[1]-s[1]||s[0].localeCompare(a[0])).map(([s])=>s),r=new Set(n),o=ls.filter(s=>!r.has(s));return[...n,...o]},Dl=ls,Bl=-1,Fl=()=>{let e=Qe();if(d(e))return ls;let t=e.value,n=t.eventLog.length;return n!==Bl&&(Dl=Iv(t),Bl=n),Dl};var Ol=e=>Object.values(b).includes(e),Ul=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:a,validity:c,completionWordList:l}=kl[n].validate(n,r,s),m=n!==b.PEEK&&n!==b.REPLAY,p=o==="command"||o==="modifier"?ve(n):m?Fl():[],{mode:f}=h(),g=f===y.COMMAND_LINE?a??"":"",I=[...l,...p];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?dc(e,I):{hint:"",hints:[],remainder:"",overlap:0}}};var _l=e=>{let t=e.trimStart(),n=Sv(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),a=Cv(e),c=Ol(r)?r:null,l=c!==null,m=r!=="",p=c?ve(c)??[]:[],f=c&&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 I=s?"":a,E=Ev(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:a,hasCommand:m,command:c,isCommandKeyword:l,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:I,inputString:E}},Ev=(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},Sv=e=>e.trim()?e.trim().split(/\s+/):[],Cv=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Nv}from"react";var rr=e=>e===la||e===":",la=" ",We={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Dt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},ua=new Set,jl=()=>{for(let e of ua)e()},ma=e=>(ua.add(e),()=>ua.delete(e)),Bt=e=>{let n=e(We),r=_l(n.value),o=n.cursorPosition===n.value.length;We={...n,commandMeta:Ul(r,o)},jl()},Wr=({message:e,status:t})=>{let n=structuredClone(We);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,We=n,jl(),u(e,null)},pa=e=>{Bt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},fa=e=>{Bt(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&rr(n[o-1]);)o--;for(;o>0&&!rr(n[o-1]);)o--}else{for(;o<n.length&&!rr(n[o]);)o++;for(;o<n.length&&rr(n[o]);)o++}return{...t,cursorPosition:o}})},$l=()=>{Bt(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}})},Hl=()=>{Bt(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&rr(t[r-1]);)r--;for(;r>0&&!rr(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},us=e=>{Bt(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),a=s+o,c=Math.max(0,Math.min(s.length,a.length));return{...t,value:a,cursorPosition:c,commandIsPending:!1}})},Wl=()=>{Bt(e=>({...e,commandIsPending:!0}))},K=e=>{Bt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Gl=({addToHistory:e=!0})=>{Bt(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},Vl=()=>{Bt(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}})},Kl=()=>{Bt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},te=()=>We,zl=()=>Nv(ma,te,te),ms=()=>{let[e,...t]=We.value.split(la);return t.join(la).trim()};var x={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 Rv(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function Av(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function Tv(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 ql(e,t){let n=te();if(e.sequence==="?"&&t!==y.PALETTE)return x.InitCommandPalette;if(e.sequence===":"&&t!==y.COMMAND_LINE)return x.InitCommandLine;if(t===y.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===y.COMMAND_LINE)return tc(e,n.value);if(t===y.PALETTE)return nc(e,n.value);let r=Rv(e)||Av(e);if(r)return wv(r,t);if(e.ctrl&&e.name==="c")return x.Exit;switch(e.name){case"r":return x.EditTitle;case"e":return x.EditDescription;case"n":return x.AddItem;case"m":return x.InitMove;case"d":return x.Delete;case"y":return x.Yank;case"return":return x.Confirm;case"space":return x.Confirm;case"v":return Q().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;default:return null}}function wv(e,t){let n=t===y.MOVE?{prevItem:x.MovePreviousItem,nextItem:x.MoveNextItem,prevContainer:x.MoveToPreviousContainer,nextContainer:x.MoveToNextContainer}:{prevItem:x.NavPreviousItem,nextItem:x.NavNextItem,prevContainer:x.NavToPreviousContainer,nextContainer:x.NavToNextContainer};return Tv(h().contextNode.childRenderAxis,e,n)}var ps=e=>{let{context:t}=h().contextNode;if(!t)return B.None;switch(e){case b.EXIT:return B.Exit;case b.EXPORT:return B.Export;case b.COFFEE:return B.Coffee;case b.INIT:return B.Init;case b.OPEN:return B.OpenProject;case b.DELETE:return B.Delete;case b.EDIT:return B.Edit;case b.COMMENT:return B.Comment;case b.HELP:return B.ViewHelp;case b.RE_OPEN_ISSUE:return B.ReopenIssue;case b.CLOSE_ISSUE:return B.CloseIssue;case b.TAG:return B.TagTicket;case b.UNTAG:return B.UntagTicket;case b.ASSIGN:return B.AssignUserToTicket;case b.UNASSIGN:return B.UnassignUserFromTicket;case b.NEW:return B.NewItem;case b.FILTER:return B.Filter;case b.MOVE:return B.Move;case b.PEEK:return B.Peek;case b.REPLAY:return B.Replay;case b.CONFIG:return B.Config;case b.YANK:return B.Yank;case b.SYNC:return B.Sync;default:return B.None}},B={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",Coffee:"coffee"};import{ulid as Ke}from"ulid";import Au from"node:fs";import Ry from"node:path";import Ay from"react";import{Box as Cy}from"ink";import Is from"react";import Yv from"chalk";import{Box as va,Text as Xv}from"ink";import Ft from"react";import{Text as Yl}from"ink";import Xl,{useEffect as Jl,useState as Mv}from"react";var Ql={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},Ge=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=z(),r=Ql[n]??Ql.default,[o,s]=Mv(0);if(Jl(()=>{s(0)},[r]),Jl(()=>{if(!e)return;let c=setInterval(()=>{s(l=>(l+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return Xl.createElement(Yl,null,t);let a=r[o]??r[0]??t;return Xl.createElement(Yl,{color:v.accent,dimColor:o===1},a)};import{Box as ga,Text as Pv}from"ink";import fs from"react";var Lv=(e,t,n,r)=>{let o=l=>Math.max(1,e[l]??1),s=n,a=n+1,c=o(n);for(;a<t&&c+o(a)<=r;)c+=o(a),a++;for(;s>0&&c+o(s-1)<=r;)s--,c+=o(s);return{start:s,end:a}},ct=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,itemHeights:o,scrollByOne:s=!1})=>{if(e.length===0)return null;let a=Math.max(1,Math.floor(t)),c=Math.max(1,Math.ceil(r)),l=Math.max(0,Math.min(n,e.length-1)),m=Math.max(1,Math.floor(a/c)),p=Math.max(0,e.length-m),{start:f,end:g}=o?Lv(o,e.length,l,a):s?{start:Math.min(p,Math.max(0,l-m+1)),end:Math.min(p,Math.max(0,l-m+1))+m}:{start:Math.min(p,Math.floor(l/m)*m),end:Math.min(p,Math.floor(l/m)*m)+m},I=Math.max(1,g-f),E=e.slice(f,g),C=e.length>I,A=a,w=C?Math.max(1,Math.floor(I/e.length*A)):A,L=Math.max(0,A-w),j=Math.max(1,e.length-I),G=C?Math.floor(f/j*L):0;return fs.createElement(ga,{flexDirection:"row",height:a,width:"100%"},fs.createElement(ga,{flexDirection:"column",flexGrow:1,height:a},E),fs.createElement(ga,{flexDirection:"column",width:1,height:A},Array.from({length:A}).map((P,U)=>fs.createElement(Pv,{key:U,color:C&&U>=G&&U<G+w?v.accent:v.secondary},C?"\u2502":" "))))};import{Box as Vr,Text as Kr}from"ink";import lt from"react";var Zl,ha,kv=()=>{let{eventLog:e=[]}=h();if(ha&&Zl===e)return ha;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return Zl=e,ha=t,t},gs=e=>kv().has(e);import{Text as Dv}from"ink";import Bv from"react";var Fv=e=>e.toLowerCase().trim(),Ov=(e,t=Zn)=>{let n=Fv(e);return t[n]?t[n]:Hr(n)},ln=({id:e,isSelected:t,maxWidth:n})=>{let r=S.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:dt(o,n);return Bv.createElement(Dv,{underline:t,color:Ov(o)},"@"+s,gs(e)?"":"\u2197")};import{Text as Uv}from"ink";import _v from"react";var or=({id:e,isSelected:t,maxWidth:n})=>{let r=S.getTag(e);if(!r)return;let o=n===void 0?r.name:dt(r.name,n);return _v.createElement(Uv,{underline:t,backgroundColor:oe(r.name),color:v.secondary}," "+o+" ")};import{useEffect as jv,useState as $v}from"react";var Hv=80,eu=1400,hs=new Set,Gr=null,Wv=e=>(hs.add(e),Gr||(Gr=setInterval(()=>{for(let t of hs)t()},Hv)),()=>{hs.delete(e),hs.size===0&&Gr&&(clearInterval(Gr),Gr=null)}),Gv=()=>{let e=Date.now()%eu/eu;return e<.5?e*2:(1-e)*2},sr=e=>{let[,t]=$v(0);return jv(()=>{if(e)return Wv(()=>t(n=>n+1))},[e]),is(Gv())};var Vv=(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),dt(e.slice(o).trim(),n)]},tu=3,Kv=2,zv=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let a=e.length-o-1,c=a>0?String(a).length+1:0;if(r+s.width+c>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},nu=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=sr(r),s=e-4,a=s-7-1,[c,l]=Vv(qe(t.title),a,s),m=l?null:dt(qe(t.props.description),s)||null,p=an(t),f=dn(t).map(C=>({...C,name:C.name})),g=Math.max(1,s-tu),{shown:I,hidden:E}=zv([...p.map(C=>({id:C.id,isTag:!0,width:Math.min(C.name.length,g)+tu})),...f.map(C=>({id:C.id,isTag:!1,width:Math.min(C.name.length,g)+Kv+(gs(C.id)?0:1)}))],s);return lt.createElement(Vr,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?v.accent:v.secondary,justifyContent:"space-between"},lt.createElement(Vr,{paddingLeft:1,paddingRight:1,flexDirection:"column"},lt.createElement(Vr,{justifyContent:"space-between"},lt.createElement(Kr,{color:v.primary},c),lt.createElement(Kr,{color:v.secondary2,dimColor:!0},V(t.id))),l&<.createElement(Kr,{color:v.primary},l),m&<.createElement(Kr,{color:v.secondary2,dimColor:!0},m)),lt.createElement(Vr,{flexDirection:"row",paddingLeft:1,paddingRight:1},I.map(C=>lt.createElement(Vr,{paddingRight:1,key:C.id},C.isTag?lt.createElement(or,{id:C.id,maxWidth:g}):lt.createElement(ln,{id:C.id,maxWidth:g}))),E>0&<.createElement(Kr,{color:v.secondary2,dimColor:!0},"+",E)))};import{Box as Un,Text as zr}from"ink";import ot from"react";var qv=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,ru=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:a})=>{let c=sr(s),l=(r.props.tags??[]).map(P=>S.getTag(P)).filter(P=>!!P),m=(r.props.assignees??[]).map(P=>S.getContributor(P)).map(P=>P&&{...P,name:P.name}).filter(P=>!!P),p=1,f=l.length*(1+p),g=m.length*(2+p),I=l.map(P=>ot.createElement(Un,{key:P.id,paddingRight:p},ot.createElement(zr,{color:oe(P.name)},"\u25A0"))),E=m.map(P=>ot.createElement(Un,{key:P.id,paddingRight:p},ot.createElement(zr,{color:Hr(P.name)},"@"+P.name.at(0)))),C=s?c:o?v.accent:a===y.MOVE?v.secondary:v.primary,A=S.getCommentsByIssue(r.id),w=A.length?String(A.length).length+2+p:0,L=A.length?ot.createElement(Un,{paddingRight:p},ot.createElement(zr,{color:v.accent},"[",A.length,"]")):null,j=f+g+w,G=Math.max(1,n-t-j-(j>0?1:0));return ot.createElement(Un,{justifyContent:"space-between"},ot.createElement(Un,null,ot.createElement(Un,{width:t},o?ot.createElement(Ge,{isSelected:!0}):ot.createElement(zr,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),ot.createElement(zr,{wrap:"truncate",color:C},qv(r.title,G))),ot.createElement(Un,null,I,E,L))};var Jv=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:a,mode:c})=>{let{renderedChildrenIndex:l,replay:m}=z(),p=l[e.id]??[],f=m?new Set(m.flashNodeIds):null,g=f?.has(e.id)??!1,I=sr(g),E=`${e.title} ${Yv.hex(v.secondary2).dim("("+p.length+")")}`,C=3,A=o?1:5,w=s&&a===-1,L=n-3-(o?1:0)-(w?2:0),j=Math.max(2,String(p.length).length+1),G=r-C-1,P=Ft.createElement(va,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},Ft.createElement(Ge,{isSelected:t}),Ft.createElement(Xv,{bold:!0,color:g?I:t?v.accent:v.primary},E," ",e.readonly?"\u{1F512}":"")),U=(H,Ze)=>{let Ue=s&&a===Ze;if(!M(H))return null;let De=f?.has(H.id)??!1;return o?Ft.createElement(ru,{key:H.id,index:Ze,labelWidth:j,width:L,ticket:H,isSelected:Ue,isFlashing:De,mode:c}):Ft.createElement(nu,{key:H.id,width:L,ticket:H,isSelected:Ue,isFlashing:De})};return Ft.createElement(va,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},P,Ft.createElement(va,null,p.length>0&&Ft.createElement(ct,{selectedIndex:a,height:G,itemHeight:A},p.map(U)),w&&Ft.createElement(Ge,{isSelected:!0})))},ou=Ft.memo(Jv);import{Box as jn,Text as wa}from"ink";import Le,{useMemo as Xr}from"react";var su=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},iu=(e,t,n)=>le.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 ar,Text as zt}from"ink";import Ve,{useEffect as Qv,useMemo as Zv,useRef as ey}from"react";import{decodeTime as ya}from"ulid";var ir=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"},ys=e=>String(e).padStart(2,"0"),bs=e=>`${e.getFullYear()}-${ys(e.getMonth()+1)}-${ys(e.getDate())} ${ys(e.getHours())}:${ys(e.getMinutes())}`;var ty=e=>we(e,"attachments"),ny=e=>S.getAttachmentsByIssue(e.id).sort((t,n)=>ya(t.id)-ya(n.id)),au=e=>{for(let t of e)S.deleteNode(t.id)},ry=(e,t,n)=>le.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),oy=(e,t)=>{let n=S.getNode(ty(e.id));if(!n||!tt(n))return[];let r=t.map((o,s)=>ry(o,s,n.id)).map(o=>S.createNode(o)).filter(de).map(({value:o})=>o).filter(tt);return t.length>0&&h().selectedIndex<0&&k.navigate({contextNode:n,selectedIndex:0}),r},sy=e=>`${Math.max(1,Math.round(e/1024))} KB`;function du({ticket:e,width:t,height:n}){let r=Zv(()=>ny(e),[e]),o=ey([]);Qv(()=>(au(o.current),o.current=oy(e,r),()=>{au(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=z(),c=Math.max(1,n-4),l=Math.max(12,t-32);return r.length===0?Ve.createElement(ar,{flexDirection:"column",width:t,height:n,padding:1},Ve.createElement(zt,{color:v.primary},"No attachments yet."),Ve.createElement(ar,{paddingTop:1},Ve.createElement(zt,{color:v.primary},"Attach images from the browser GUI"),Ve.createElement(zt,{color:v.accent}," epiq gui "),Ve.createElement(zt,{color:v.primary},"by dropping or pasting them."))):Ve.createElement(ar,{flexDirection:"column",width:t,height:n},Ve.createElement(ar,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:v.secondary,borderStyle:"single",paddingBottom:1},Ve.createElement(zt,{color:v.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),Ve.createElement(ct,{height:c,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let f=p===s,g=m.name.length>l?m.name.slice(0,l-1)+"\u2026":m.name;return Ve.createElement(ar,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Ve.createElement(zt,{color:v.accent},f?"\u276F ":" "),Ve.createElement(ar,{paddingLeft:1},Ve.createElement(zt,{color:v.secondary2},`#${p+1} `),Ve.createElement(zt,{color:f?v.accent:v.primary},g),Ve.createElement(zt,{color:v.secondary2}," "+sy(m.bytes)+" "+ir(ya(m.id)))))})))}import{Box as un,Text as mn}from"ink";import Re,{useEffect as ly,useMemo as xu,useRef as uy}from"react";import{decodeTime as Ca}from"ulid";var lu=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,ba=e=>e.replace(lu,"");var cu=e=>e==="additions"||e==="deletions",xa=e=>{let t=lu.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"||!cu(r.side)||!cu(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var uu=/```\n([\s\S]*?)\n?```\s*$/,mu=e=>uu.exec(e)?.[1]??null,iy=/`[^`\n]+`[^\n]*\n?$/,pu=e=>ba(e).replace(uu,"").replace(iy,"").trim(),ay=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})`},Ia=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${ay(e)}`;var dy=(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 a of r){let c=a;for(;c.length>n;)s&&(o.push(s),s=""),o.push(c.slice(0,n)),c=c.slice(n);s?s.length+1+c.length<=n?s=`${s} ${c}`:(o.push(s),s=c):s=c}return s&&o.push(s),o},qr=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)},cy=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),Ea=e=>{let t=!1;return e.map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=xa(n);if(r)return{kind:"caption",text:Ia(r)};if(n.trim()==="")return{kind:"blank"};let o=/^#{1,6}\s+(.*)$/.exec(n);return o?{kind:"heading",spans:qr(o[1]??"")}:{kind:"text",spans:qr(n)}})},gu=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],fu=(e,t)=>{let n=[];for(let r of Ea(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 gu(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of dy(cy(r.spans),t))n.push({kind:r.kind,spans:qr(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},hu=(e,t)=>{let n=xa(e),r=n?mu(e):null;if(!n||r===null)return fu(ba(e).split(`
|
|
55
|
+
${s.message}`);let a=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return u(a?"Pushed state branch":"Remote already up to date",a)},Kc=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Zt(e);if(d(o))return o;let s=o.value,a=[To(),await Yi({repoRoot:e,stateBranchName:s}),await Dn({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await yh({stateBranchRoot:t,stateBranchName:s}),await $d(t),n?await bh({stateBranchRoot:t,repoRoot:e}):u("Skipped state branch upstream bootstrap",!1)];for(let c of a){if(d(c))return i(c.message);r=r||!!c.value}return u(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import qo from"node:fs";import Ji from"node:os";import xh from"node:path";var Ih="epiq-sync.lock",zc=600*1e3,Eh=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}},Sh=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Ch=e=>e&&(e.hostname!==Ji.hostname()||Sh(e.pid))?Date.now()-e.startedAt>zc:!0,Yc=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Xi=e=>{try{return Eh(qo.readFileSync(e,"utf8"))}catch{return null}},qc=(e,t)=>{let n={pid:process.pid,hostname:Ji.hostname(),startedAt:Date.now(),operation:t};try{return qo.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},Nh=async({worktreeRoot:e,operation:t})=>{let n=await Ii(e);if(d(n))return i(n.message);let r=xh.join(n.value,Ih),o=()=>{try{let c=Xi(r);c&&c.pid===process.pid&&qo.rmSync(r)}catch{}};if(qc(r,t))return u("Acquired sync lock",{acquired:!0,release:o});let s=Xi(r);if(!Ch(s))return u("Sync lock is held",{acquired:!1,heldBy:s});Y.info(`Breaking an abandoned sync lock: ${s?Yc(s):"unreadable lock file"}`);try{qo.rmSync(r,{force:!0})}catch{}if(qc(r,t))return u("Acquired sync lock after breaking a stale one",{acquired:!0,release:o});let a=Xi(r);return u("Sync lock taken by another process",{acquired:!1,heldBy:a??{pid:-1,hostname:Ji.hostname(),startedAt:Date.now(),operation:"unknown"}})},Xc=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await Nh({worktreeRoot:e,operation:t});if(d(r))return i(r.message);if(!r.value.acquired)return Y.info(`Skipping ${t}: the state worktree is held by ${Yc(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 Ah=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=ee("getRepoRootDir",await ft(e));if(d(n))return i(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=ee("getStateBranchRoot",Se({repoRoot:r}));if(d(o))return i(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 a=ee("bootstrapStateBranchStorage",await Kc({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(d(a))return i(a.message);logger.debug("[sync] bootstrap result",{bootstrapped:a.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let c=ee("hasInProgressGitOperation(stateBranchRoot)",await Co(s));if(d(c))return i(c.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:c.value}),c.value)return logger.info("[sync] state branch git operation in progress"),i("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 l=ee("ensureStateBranchLayout",_d(r,s));return d(l)?i(l.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:a.value}),u("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:a.value}))},Th=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=ee("stageStateBranchOwnEventFile",await zo({stateBranchRoot:t,eventFileName:n}));if(d(r))return i(r.message);let o=ee("stageStateBranchMediaFiles",await Wc({stateBranchRoot:t}));if(d(o))return i(o.message);let s=ee("stageStateBranchEventAttributes",await Gc({stateBranchRoot:t}));if(d(s))return i(s.message);let a=[r.value,o.value,s.value].filter(m=>m!==null);if(a.length===0)return u("Nothing to stage",{createdCommit:!1});let c=ee("hasStagedChanges(after stage)",await Pd(t,a));if(d(c))return i(c.message);if(logger.debug("[sync] state branch change check after stage result",{changed:c.value}),!c.value)return logger.info("[sync] no own event file changes to commit"),u("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let l=ee("createStateBranchSyncCommit",await Vc({repoRoot:e,stateBranchRoot:t,pathspec:a}));return d(l)?i(l.message):(logger.debug("[sync] created sync commit",l.value),u("Committed own event file",{createdCommit:!0,commitSha:l.value}))},Jc=e=>{let t=e.createdCommit?"Committed locally, offline":"Offline";return Oc(t),u(t,{...e,pulled:!1,pushed:!1,offline:!0})},Qc=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}),i("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}),i("Own event file must end with .jsonl");Wo();let n=ee("ensureSyncReady",await Ah({cwd:e,ensureUpstream:!0}));if(d(n))return je(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,a=ee("isDetachedHead(stateBranchRoot)",await Ld(o));if(d(a))return je(a.message);if(logger.debug("[sync] detached state branch check result",{detached:a.value}),a.value)return je("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,l,m=!1,p=!1,f=ee("getStateBranch",Zt(r));if(d(f))return je(f.message);let g=f.value;logger.debug("[sync] resolved state branch",{stateBranch:g,stateBranchRoot:o});let I=ee("commitOwnEventFileToStateBranch",await Th({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(I))return je(I.message);c=I.value.createdCommit,l=I.value.commitSha;let E=ee("pullBranchRebaseIfPresent",await Ri({cwd:o,branch:g}));if(d(E))return Ni(E.message)?Jc({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:l,bootstrapped:s}):je(E.message);m=E.value;let C=ee("isAheadOfUpstream",await wd(o));if(d(C))return je(C.message);if(c||s||C.value){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:o});let A=ee("pushStateBranch",await Dr({stateBranchRoot:o,repoRoot:r}));if(d(A)&&Td(A.message)){let w=ee("pullBranchRebaseIfPresent(retry)",await Ri({cwd:o,branch:g}));if(d(w))return je(w.message);m=m||w.value,A=ee("pushStateBranch(retry)",await Dr({stateBranchRoot:o,repoRoot:r}))}if(d(A))return Ni(A.message)?Jc({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:l,bootstrapped:s}):je(A.message);p=A.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let A=ee("git rev-parse HEAD",await _({args:["rev-parse","HEAD"],cwd:o}));if(d(A))return je(A.message);l=A.value.stdout.trim(),logger.debug("[sync] final sync commit sha",l)}return Go(p?"Synced and pushed":m||c?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),u("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:l,pulled:m,pushed:p,bootstrapped:s,offline:!1})},Yo=async e=>{let t=e.cwd??process.cwd(),n=await ft(t);if(d(n))return je(n.message);let r=Se({repoRoot:n.value});if(d(r))return je(r.message);let o=r.value;if(!Rh.existsSync(o))return Qc(e);let s=await Xc({worktreeRoot:o,operation:"sync",fn:()=>Qc(e)});return d(s)?je(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 Lt=null,Xo=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Lt,currentStatus:h().syncStatus?.status,currentMessage:h().syncStatus?.msg}),Lt)return logger.debug("[sync] syncAndReloadState joining existing promise"),Lt;logger.debug("[sync] syncAndReloadState creating promise"),Lt=wh();try{let e=await Lt;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}),Lt||i(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:h().syncStatus?.status,statusMessageBeforeClear:h().syncStatus?.msg}),Lt=null}},wh=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:h().mode,syncStatus:h().syncStatus});let e=Zc();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:h().mode,message:e.message,syncStatus:h().syncStatus}),e;if(Lt)return Lt;logger.debug("[sync] syncAndReloadState:start");let t=ee("resolveActorId",he());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),i("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=Ln(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=ee("syncEpiqWithRemote",await Yo({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}),je(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let a=ee("loadMergedEvents",Wt(o));if(logger.debug("[sync] loadMergedEvents:result",{success:!d(a),message:(d(a),a.message),count:d(a)?void 0:a.value.events.length}),d(a))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:h().syncStatus}),i(`Unable to load events. ${a.message}`);logger.debug("[sync] loaded merged events after sync",{count:a.value.events.length});let c=Zc();if(c)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:h().mode,message:c.message,syncStatus:h().syncStatus}),c;let l=Lc(),m=h().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:l,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:a.value.events.length});let f=ee("bootStateFromEventLog",Gt(a.value.events,a.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(f),message:(d(f),f.message)}),d(f))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:h().syncStatus}),i(`Unable to boot synced state. ${f.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:m}),logger.debug("[sync] restoreNavigationAnchor:start");let p=ee("restoreNavigationAnchor",Dc(l));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(p),message:d(p)?p.message:"Navigation restored",selectedNodeId:h().selectedNode?.id,contextNodeId:h().contextNode?.id}),d(p)?(N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:h().syncStatus}),p):(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))},Zc=()=>h().mode===y.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:h().mode,syncStatus:h().syncStatus}),N({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),i("Will not re-materialize if not in default mode, to not lose edit data"));var Xn=3e3,el=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Xn?null:t},tl=0,Qi,Zi=!1,Br=!1,ea=()=>{if(Zi)return!0;let e=Qe();return d(e)?!1:e.value.syncStatus.status==="syncing"},Mh=()=>{let e=Q().autoSyncIntervalMs??1e4,t=Date.now()-tl;return Math.max(0,e-t)},nl=()=>{Qi||(Qi=setTimeout(async()=>{if(Qi=void 0,!!wt()){if(ea()){Br=!0;return}Br=!1,await Ph()}},Mh()))},Ph=async()=>{if(h().readOnly||h().timeMode==="peek"||h().timeMode==="replay")return i("Cannot auto-sync while peeking");if(!wt())return i("Cannot auto-sync before state is initialized");if(ea())return Br=!0,i("Sync already in progress");Zi=!0,tl=Date.now(),N({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Xo()}finally{Zi=!1,Br&&nl()}},Jo=()=>{wt()&&(Br=!0,!ea()&&nl())};import Fr from"node:fs";import Or from"node:path";import{z as Jn}from"zod";var Qo="recent-projects.json",Lh=20,kh=Jn.object({projectId:Jn.string().min(1),root:Jn.string().min(1),lastOpenedAt:Jn.number().finite()}),Dh=Jn.object({projects:Jn.array(kh)}),ol=()=>Or.join(Rn(),Qo),Qn=e=>Or.basename(e)||e,rl=e=>{let t=Or.resolve(e);try{return Fr.realpathSync(t)}catch{return t}},sl=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,il=e=>{if(!Nr(e.root))return!1;let t=vr(e.root);return!d(t)&&t.value===e.projectId},al=()=>{let e=ol();if(!Fr.existsSync(e))return u("No recent projects recorded",[]);let t;try{t=JSON.parse(Fr.readFileSync(e,"utf8"))}catch(r){return i(`Invalid ${Qo}: ${r instanceof Error?r.message:String(r)}`)}let n=Dh.safeParse(t);return n.success?u("Read recent projects",n.data.projects):i(`Invalid ${Qo} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Bh=e=>{let t=ol();try{Fr.mkdirSync(Or.dirname(t),{recursive:!0}),Fr.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
|
|
56
|
+
`,"utf8")}catch(n){return i(`Unable to write ${Qo}: ${n instanceof Error?n.message:String(n)}`)}return u("Recorded recent project",e)},Kt=({exclude:e}={})=>{let t=al();if(d(t))return t;let n=e===void 0?null:rl(e);return u("Listed recent projects",t.value.filter(r=>n===null||rl(r.root)!==n).filter(il).sort(sl))},Zo=({root:e,now:t=Date.now()})=>{let n=Or.resolve(e),r=vr(n);if(d(r))return i(r.message);let o=r.value,s=al(),a=d(s)?[]:s.value,c=[{projectId:o,root:n,lastOpenedAt:t},...a.filter(l=>l.projectId!==o&&l.root!==n)].filter(il).sort(sl).slice(0,Lh);return Bh(c)};var sn=()=>{let e=Q(),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}},dl=()=>{let e=_e(process.cwd());if(d(e))return!1;let t=Ct(e.value);return de(t)},cl=e=>e===!0?"on":e===!1?"off":null,ll=e=>e==="on"?!0:e==="off"?!1:null;var He={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"},v={accent:He.cyan,accent2:He.magenta,primary:He.white,secondary:He.grayDark,secondary2:He.grayLight,gray:He.gray,green:He.green,yellow:He.yellow,red:He.red};var R={red:He.red,yellow:He.yellow,green:He.green,blue:He.blue,magenta:He.magenta,cyan:He.cyan},Zn={urgent:R.red,critical:R.red,important:R.red,blocker:R.red,asap:R.red,immediate:R.red,fail:R.red,failure:R.red,broken:R.red,bug:R.red,error:R.red,incident:R.red,outage:R.red,production:R.red,crash:R.red,security:R.red,warning:R.yellow,warn:R.yellow,risky:R.yellow,risk:R.yellow,attention:R.yellow,pending:R.yellow,review:R.yellow,"needs-review":R.yellow,qa:R.yellow,testing:R.yellow,test:R.yellow,validate:R.yellow,verification:R.yellow,staging:R.yellow,check:R.yellow,"follow-up":R.yellow,followup:R.yellow,waiting:R.yellow,blocked:R.yellow,hold:R.yellow,done:R.green,complete:R.green,completed:R.green,success:R.green,ok:R.green,stable:R.green,resolved:R.green,fixed:R.green,closed:R.green,merged:R.green,released:R.green,deployed:R.green,approved:R.green,verified:R.green,working:R.green,healthy:R.green,pass:R.green,passing:R.green,info:R.blue,information:R.blue,note:R.blue,docs:R.blue,documentation:R.blue,doc:R.blue,guide:R.blue,help:R.blue,explanation:R.blue,detail:R.blue,details:R.blue,context:R.blue,design:R.blue,discussion:R.blue,proposal:R.blue,idea:R.blue,feature:R.magenta,enhancement:R.magenta,improvement:R.magenta,refactor:R.magenta,refactoring:R.magenta,cleanup:R.magenta,optimize:R.magenta,optimization:R.magenta,perf:R.magenta,performance:R.magenta,upgrade:R.magenta,migration:R.magenta,modernize:R.magenta,debt:R.magenta,todo:R.cyan,next:R.cyan,planned:R.cyan,plan:R.cyan,future:R.cyan,backlog:R.cyan,investigate:R.cyan,explore:R.cyan,prototype:R.cyan};var Fh=e=>e.props.tags??[],Oh=e=>e.props.assignees??[],an=e=>Fh(e).map(t=>S.getTag(t)).filter(t=>!!t),dn=e=>Oh(e).map(t=>S.getContributor(t)).filter(t=>!!t),es=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!M(n)?i("Invalid untag target"):u("Retrieved tags from ticket in breadcrumb",an(n))},ts=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!M(n)?i("Invalid unassign target"):u("Retrieved assignees from ticket in breadcrumb",dn(n))};var b={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",COFFEE:"coffee",NONE:""};var Uh=/^(\d+)(h|d|w|mo|y)$/,_h=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,$h=({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},jh=(e,t=new Date)=>{let n=e.match(Uh);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-s),a;case"d":return a.setDate(a.getDate()-s),a;case"w":return a.setDate(a.getDate()-s*7),a;case"mo":return a.setMonth(a.getMonth()-s),a;case"y":return a.setFullYear(a.getFullYear()-s),a;default:return null}},Hh=e=>{let t=e.match(_h);if(!t)return null;let[,n,r,o,s,a]=t,c=Number(n),l=Number(r),m=Number(o),p=s?Number(s):0,f=a?Number(a):0;return $h({year:c,month:l,day:m,hour:p,minute:f})?new Date(c,l-1,m,p,f):null},Bn=e=>{let t=e.trim().toLowerCase();return jh(t)??Hh(t)};var ul=/^(\d+)(s|m)?$/,ns=e=>{let t=e.trim().toLowerCase().match(ul);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},rs=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&ul.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},ml=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Wh=[{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}],ta=(e=Wh)=>{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 Gh=["BOARD","TICKET","SWIMLANE","COMMENT"],pe={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},rt={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Ne={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},Vh=[pe.EDITOR,pe.VIEW,pe.USERNAME,pe.AUTOSYNC,pe.SYNC_DEBOUNCE_MS,pe.ATTACHMENT_MAX_KB,pe.LOG_LEVEL],Kh=(e=h().selectedNode?.context)=>{switch(e){case"TICKET":return[rt.TITLE,rt.DESCRIPTION];case"BOARD":case"SWIMLANE":return[rt.TITLE];case"COMMENT":return[rt.COMMENT];default:return[]}},ra=[String(Xn),"5000","15000","30000","60000"],oa=["250","500","1000"],gl=["10s","20s","30s","45s"],Fn=[b.COFFEE,b.EXIT,b.SYNC,b.HELP,b.EXPORT,b.CONFIG,b.YANK],os=[b.NEW,b.EDIT,b.DELETE,b.MOVE],na=[b.TAG,b.UNTAG,b.ASSIGN,b.UNASSIGN,b.CLOSE_ISSUE,b.RE_OPEN_ISSUE,b.EDIT,b.COMMENT],pl=[b.FILTER,b.PEEK,b.REPLAY],zh={WORKSPACE:[...Fn,...os],BOARD:[...pl,...Fn,...os],SWIMLANE:[...pl,...Fn,...os],TICKET:[...Fn,...os,...na],FIELD:[...Fn,...na],FIELD_LIST:[...Fn,...na],TEXT:[...Fn],COMMENT:[b.EDIT,b.DELETE,b.YANK]},qh=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ur=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&M(n)),fl=e=>e.parentNodeId===Ce,Yh=({selectedNode:e,breadCrumb:t})=>{let n=Kh(e?.context);return Ur({breadCrumb:t,selectedNode:e})?n.includes(rt.DESCRIPTION)?n:[...n,rt.DESCRIPTION]:n},Xh=({selectedNode:e,breadCrumb:t})=>{let n=Ur({breadCrumb:t,selectedNode:e});return n?[Ne.REF,Ne.TITLE,...n.props?.description?.trim()?[Ne.DESCRIPTION]:[],...an(n).length>0?[Ne.TAGS]:[],...dn(n).length>0?[Ne.ASSIGNEES]:[]]:e?[Ne.REF,Ne.TITLE]:[]},sa=()=>{let e=Kt({exclude:process.cwd()});return d(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},Jh=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=sn();if(!r)return[b.HELP,b.CONFIG];if(!dl())return[b.HELP,b.INIT,b.OPEN];if(t)return[b.HELP,b.PEEK,b.REPLAY,b.EXPORT,b.CONFIG,b.YANK];let o=e?.context,s=o&&Gh.includes(o),a=[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?zh[l]:[]))],c=Ur({breadCrumb:n,selectedNode:e});return a.filter(l=>l===b.MOVE?!1:l===b.YANK?!!(c??e):l===b.EDIT?s||!!c:l===b.DELETE?s:l===b.UNTAG?!!(c&&an(c).length>0):l===b.UNASSIGN?!!(c&&dn(c).length>0):l===b.RE_OPEN_ISSUE?!!(c&&fl(c)):l===b.CLOSE_ISSUE?!!(c&&!fl(c)):!0)},ve=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=h())=>{let s=t.context??"WORKSPACE";return{[b.NONE]:Jh({breadCrumb:o,readOnly:r,selectedNode:n}),[b.EXIT]:["confirm"],[b.EXPORT]:[],[b.SYNC]:[],[b.INIT]:[],[b.OPEN]:e===b.OPEN?sa():[],[b.HELP]:[],[b.PEEK]:[...ta(),"now","prev","next"],[b.REPLAY]:[...ta()],[b.EDIT]:Yh({selectedNode:n,breadCrumb:o}),[b.YANK]:Xh({selectedNode:n,breadCrumb:o}),[b.COMMENT]:[],[b.DELETE]:["confirm"],[b.RE_OPEN_ISSUE]:["confirm"],[b.CLOSE_ISSUE]:["confirm"],[b.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[b.FILTER]:["tag","assignee","description","title","ref","clear"],[b.TAG]:[...new Set([...Object.keys(Zn),...S.getExistingTags()])],[b.UNTAG]:[...es()?.value?.map(({name:c})=>c)??[]],[b.UNASSIGN]:[...ts()?.value?.map(({name:c})=>c)??[]],[b.ASSIGN]:S.getExistingAssignees(),[b.NEW]:qh(s),[b.CONFIG]:[...Vh],[b.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import Ll from"chalk";var hl=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as vl}from"ulid";var ss=e=>{try{return u("Decoded date",new Date(vl(e)))}catch(t){return i("Decoding failed + "+t.message)}},cn=e=>{if(!e?.id)return null;try{return vl(e.id)}catch{return null}};import nv from"zod";import Qh from"node:crypto";import _r from"node:fs";import yl from"node:path";var kt=500,Zh=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,er=(e,t)=>`${e}.${t}`,ev=e=>Zh.test(e),bl=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"):i(`Unsupported image format. Allowed: ${Jd.join(", ")}`),xl=e=>Qh.createHash("sha256").update(e).digest("hex"),tv=(e,t=kt)=>{if(e.length===0)return i("Attachment is empty");if(e.length>t*1024)return i(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=bl(e);return d(n)?n:u("Validated attachment data",{hash:xl(e),ext:n.value,bytes:e.length})},Il=(e,t,n=kt)=>{let r=tv(t,n);if(d(r))return r;let o=Cr(e),s=yl.join(o,er(r.value.hash,r.value.ext));try{_r.existsSync(s)||(_r.mkdirSync(o,{recursive:!0}),_r.writeFileSync(s,t))}catch(a){return i(`Unable to write attachment blob: ${a instanceof Error?a.message:String(a)}`)}return u("Wrote attachment blob",r.value)},El=(e,t,n=kt)=>{if(!ev(t))return i("Invalid attachment file name");let r=yl.join(Cr(e),t);if(!_r.existsSync(r))return i("Attachment blob not found");let o;try{o=_r.readFileSync(r)}catch(l){return i(`Unable to read attachment blob: ${l instanceof Error?l.message:String(l)}`)}if(o.length>n*1024)return i(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,a]=t.split(".");if(xl(o)!==s)return i("Attachment blob does not match its content hash");let c=bl(o);return d(c)?c:c.value!==a?i("Attachment blob content does not match its extension"):u("Resolved attachment blob",{filePath:r,ext:a,bytes:o.length})};var $r=50,jr=5e3,Sl=()=>{let e=te().commandMeta.inputString,t=nv.coerce.number().int().min($r).max(jr).safeParse(e);if(!t.success)return i(`Attachment size cap must be ${$r}-${jr} KB (default ${kt})`);let n=at({attachmentMaxKb:t.data});return d(n)?n:($e({attachmentMaxKb:t.data}),N({mode:y.DEFAULT}),u(`Attachment size cap set to ${t.data} KB`,null))};import tr from"chalk";var aa={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Cl=(e,t,n)=>Math.max(t,Math.min(n,e)),ia=(e,t,n)=>e+(t-e)*n,Nl=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},rv=e=>e.toLowerCase().trim(),ov=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,a=e/60,c=s*(1-Math.abs(a%2-1)),l=0,m=0,p=0;a>=0&&a<1?(l=s,m=c):a>=1&&a<2?(l=c,m=s):a>=2&&a<3?(m=s,p=c):a>=3&&a<4?(m=c,p=s):a>=4&&a<5?(l=c,p=s):(l=s,p=c);let f=o-s/2;return[Math.round((l+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},Rl=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var sv=(e,t,n)=>{let r=Cl(n,0,1);return[Math.round(ia(e[0],t[0],r)),Math.round(ia(e[1],t[1],r)),Math.round(ia(e[2],t[2],r))]};var iv=(e,t,n)=>sv(e,t,n),Hr=e=>{let t=Nl(e)%360,n=ov(t,aa.stringColor.saturation,aa.stringColor.lightness);return Rl(n)},oe=(e,t=Zn)=>{let n=rv(e);return n&&t[n]?t[n]:Hr(n)};var Al=e=>{let t=aa.gradient.stops,n=Cl(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),a=o-s;return iv(t[s],t[s+1],a)},is=e=>Rl(Al(e)),as=e=>Nl(e.toLowerCase().trim())/4294967295,Tl=e=>{let t=as(e);return Al(t)},av=e=>{let[t,n,r]=Tl(e);return{normal:o=>tr.bgRgb(t,n,r).black(o),cursor:o=>tr.bgRgb(t,n,r).white.bold(o)}},da=e=>{let[t,n,r]=Tl(e);return{fg:o=>tr.rgb(t,n,r)(o),fgCursor:o=>tr.rgb(t,n,r).inverse(o),bg:o=>tr.bgRgb(t,n,r).black(o),bgCursor:o=>tr.bgRgb(t,n,r).white.bold(o)}},ds=e=>av(e).normal(` ${e} `);var yt=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as dv}from"node:crypto";var cv="0123456789ABCDEFGHJKMNPQRSTVWXYZ",lv=e=>{let t=dv("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+=cv[Number(n>>s&31n)]}return r},we=(e,t)=>lv(`${e}:virtual:${t}`);import wl from"chalk";var re=e=>wl.dim(e),Me=e=>wl.hex(v.primary)(e),Pe=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let a=o.trim();if(a.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(a))].sort((f,g)=>as(f)-as(g)).slice(0,r).map(f=>ds(f)).join(" ");return p?`${re(e)}${p}${re(n)}`:""};var Dt={None:"none",Invalid:"invalid",Valid:"valid"};var uv=["BOARD","TICKET","SWIMLANE"],Ml=()=>{let e=h().selectedNode;if(!e?.context)return j({message:re("Missing target context")});if(uv.includes(e.context))return X();if(e.parentNodeId){let t=h().nodes[e.parentNodeId];if(t?.id===we(t?.parentNodeId??"","comments"))return X()}return j({message:re("Command not available in this context")})},me="<ENTER> to confirm",X=(e="",t=[])=>({message:re(e),validity:Dt.Valid,completionWordList:t}),j=({message:e,completionWordList:t=[]})=>({validity:Dt.Invalid,message:e,completionWordList:t}),nr=e=>e.length===0,Pl=(e,t)=>{let n=ze(h().breadCrumb,"BOARD");if(d(n))return j({message:Me("Command is not applicable in this context")});let r=ss(n.value.id);return d(r)?j({message:Me(`Unable to ${t}: board id is not a valid ULID`)}):ml({date:e,horizonDate:r.value})?null:j({message:Me(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},cs=e=>` ${Ll.hex("#000").bgHex(oe(e))(` ${e} `)} `,ca=({modifier:e})=>{let t="confirm";return e===t?X(me):j({message:nr(e)?re("if you are certain, enter ")+ds(t):"",completionWordList:[t]})},mv=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?j({message:re(n)}):X():j({message:nr(r)?t:"",completionWordList:[...e]}),On=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>nr(n)&&nr(r)?j({message:e,completionWordList:[]}):X(t??me),pv=({modifier:e,inputString:t})=>{let n=sa();return!nr(e)||!nr(t)?X(me):j({message:n.length?re("number from the list, or a path"):re("path to an epiq project"),completionWordList:n})},fv=({modifier:e,inputString:t})=>{let n=ve(b.CONFIG);if(!n.includes(e))return j({message:Pe({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case pe.EDITOR:{let r=[...hl];return t.trim()?r.includes(t.trim())?X(me):j({message:Pe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):j({message:Pe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case pe.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?X(me):j({message:Pe({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case pe.USERNAME:return t.trim()?X(me):j({message:Me("Enter a user name. Saved in ")+Ll.bgBlack("~/.epiq-global/config.json")});case pe.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?X(me):j({message:Pe({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case pe.AUTOSYNC:{let r=["on","off"],o=Q().autoSync;if(!r.includes(t.trim())){let s=cl(o);return j({message:Pe({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return X(me)}case pe.ATTACHMENT_MAX_KB:{let r=Q().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<$r||o>jr){let s=Pe({prefix:" examples: ",wordList:oa,minLengthForHints:0,inputString:t});return j({message:Me(`provide a size cap in KB (${$r}-${jr}). current: ${r??kt} KB.`)+s,completionWordList:oa})}return X(me)}case pe.SYNC_DEBOUNCE_MS:{let r=Q().autoSyncIntervalMs,o=el(t);if(!t.trim()||o===null||o<Xn){let s=Pe({prefix:" examples: ",wordList:ra,minLengthForHints:0,inputString:t});return j({message:Me(`provide duration above ${Xn}ms. current duration: ${r}ms.`)+s,completionWordList:ra})}return X(me)}default:return j({message:Me("Unknown config option"),completionWordList:n})}},gv=({modifier:e,inputString:t})=>{let n=ve(b.EDIT);if(!n.length)return j({message:Me("Command not available in this context")});if(!n.includes(e)){let r=Pe({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return j({message:r||Me("Unknown edit option"),completionWordList:n})}switch(e){case rt.COMMENT:return t.trim()?X(me):j({message:re("write a comment...")});case rt.TITLE:return X(me);case rt.DESCRIPTION:{let{preferredEditor:r}=Q();return r?X(re("<ENTER> to edit in ")+r):j({message:"No editor selected"})}default:return j({message:Me("Unknown edit option"),completionWordList:n})}},hv=({modifier:e})=>{let t=ve(b.YANK);return t.length?t.includes(e)?X(me+re(" and copy to clipboard")):j({message:Pe({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):j({message:Me("Nothing selected to copy from")})},vv={[b.EXPORT]:()=>X(me+re(", and create export markdown file")),[b.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return X(me);let n={message:re("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=Bn(r);if(!r||!o)return j(n);let s=Pl(o,"peek");return s||X(me)},[b.REPLAY]:e=>{let{dateInput:t,durationInput:n}=rs(e.modifier,e.inputString),r={message:re("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=Bn(t);if(!t||!o)return j(r);let s=Pl(o,"replay");return s||(n&&ns(n)===null?j({message:Me("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):X("<ENTER> to replay board history",n?gl:[]))},[b.EXIT]:()=>X(me+re(" and exit the application")),[b.INIT]:()=>X(me),[b.OPEN]:pv,[b.PALETTE]:()=>X(me),[b.FILTER]:e=>{if(e.modifier==="clear")return X(me);let t=s=>ve(b.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return j({message:Pe({wordList:ve(b.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ve(b.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())?j({message:Pe({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):X():j({message:Pe({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[b.NONE]:e=>{let t=ve(b.NONE);return j({message:Pe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[b.NEW]:e=>mv({list:ve(b.NEW),hint:Pe({wordList:ve(b.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[b.HELP]:()=>X(me),[b.EDIT]:gv,[b.COMMENT]:e=>{let t=On({hint:re(`write a comment (max ${4e3} char)...`),onOk:re(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===Dt.Invalid?t:e.inputString.length>4e3?X(Me("max input exceeded")):t},[b.CONFIG]:fv,[b.YANK]:hv,[b.DELETE]:e=>{let t=Ml();return t.validity==="invalid"?t:ca(e)},[b.CLOSE_ISSUE]:e=>ca(e),[b.RE_OPEN_ISSUE]:e=>ca(e),[b.MOVE]:e=>{let t=Ml();return t.validity==="invalid"?t:On({hint:Pe({prefix:"hey hacker! These commands are blocked for you... ",wordList:ve(b.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[b.TAG]:e=>{let n=S.getExistingTags().slice(0,10).map(cs).join("");return On({hint:n.length?re("create tag or reuse:")+n+re(""):re("create tag ...")})(e)},[b.UNTAG]:e=>{let t=es();if(d(t))return j({message:Me("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(cs).slice(0,10);return n.length?On({hint:re(" ... ")+n.join("")})(e):j({message:Me("Issue has no tags"),completionWordList:[]})},[b.ASSIGN]:e=>{let t=S.getExistingAssignees().map(cs).slice(0,10);return On({hint:re("assignees... ")+t.join("")})(e)},[b.UNASSIGN]:e=>{let t=ts();if(d(t))return j({message:Me("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(cs).slice(0,10);return n.length?On({hint:re("remove assignee... ")+n.join("")})(e):j({message:Me("Issue has no assignees"),completionWordList:[]})},[b.SYNC]:()=>X(me),[b.COFFEE]:e=>{let{modifier:t}=e,n=ve(b.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?j({message:re("enter an amount ... "),completionWordList:n.filter(r=>r.startsWith(t))}):On({hint:Pe({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},kl=Object.fromEntries(Object.entries(vv).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ls=["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 yv=3,bv=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"]),xv=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},Iv=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=yv&&!bv.has(t)&&!/^\d+$/.test(t)),Ev=e=>{let t=new Map;for(let s of xv(e))for(let a of Iv(s))t.set(a,(t.get(a)??0)+1);let n=[...t.entries()].sort((s,a)=>a[1]-s[1]||s[0].localeCompare(a[0])).map(([s])=>s),r=new Set(n),o=ls.filter(s=>!r.has(s));return[...n,...o]},Dl=ls,Bl=-1,Fl=()=>{let e=Qe();if(d(e))return ls;let t=e.value,n=t.eventLog.length;return n!==Bl&&(Dl=Ev(t),Bl=n),Dl};var Ol=e=>Object.values(b).includes(e),Ul=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:a,validity:c,completionWordList:l}=kl[n].validate(n,r,s),m=n!==b.PEEK&&n!==b.REPLAY,p=o==="command"||o==="modifier"?ve(n):m?Fl():[],{mode:f}=h(),g=f===y.COMMAND_LINE?a??"":"",I=[...l,...p];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?dc(e,I):{hint:"",hints:[],remainder:"",overlap:0}}};var _l=e=>{let t=e.trimStart(),n=Cv(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),a=Nv(e),c=Ol(r)?r:null,l=c!==null,m=r!=="",p=c?ve(c)??[]:[],f=c&&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 I=s?"":a,E=Sv(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:a,hasCommand:m,command:c,isCommandKeyword:l,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:I,inputString:E}},Sv=(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},Cv=e=>e.trim()?e.trim().split(/\s+/):[],Nv=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Rv}from"react";var rr=e=>e===la||e===":",la=" ",We={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Dt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},ua=new Set,$l=()=>{for(let e of ua)e()},ma=e=>(ua.add(e),()=>ua.delete(e)),Bt=e=>{let n=e(We),r=_l(n.value),o=n.cursorPosition===n.value.length;We={...n,commandMeta:Ul(r,o)},$l()},Wr=({message:e,status:t})=>{let n=structuredClone(We);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,We=n,$l(),u(e,null)},pa=e=>{Bt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},fa=e=>{Bt(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&rr(n[o-1]);)o--;for(;o>0&&!rr(n[o-1]);)o--}else{for(;o<n.length&&!rr(n[o]);)o++;for(;o<n.length&&rr(n[o]);)o++}return{...t,cursorPosition:o}})},jl=()=>{Bt(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}})},Hl=()=>{Bt(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&rr(t[r-1]);)r--;for(;r>0&&!rr(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},us=e=>{Bt(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),a=s+o,c=Math.max(0,Math.min(s.length,a.length));return{...t,value:a,cursorPosition:c,commandIsPending:!1}})},Wl=()=>{Bt(e=>({...e,commandIsPending:!0}))},K=e=>{Bt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Gl=({addToHistory:e=!0})=>{Bt(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},Vl=()=>{Bt(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}})},Kl=()=>{Bt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},te=()=>We,zl=()=>Rv(ma,te,te),ms=()=>{let[e,...t]=We.value.split(la);return t.join(la).trim()};var x={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 Av(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function Tv(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function wv(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 ql(e,t){let n=te();if(e.sequence==="?"&&t!==y.PALETTE)return x.InitCommandPalette;if(e.sequence===":"&&t!==y.COMMAND_LINE)return x.InitCommandLine;if(t===y.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===y.COMMAND_LINE)return tc(e,n.value);if(t===y.PALETTE)return nc(e,n.value);let r=Av(e)||Tv(e);if(r)return Mv(r,t);if(e.ctrl&&e.name==="c")return x.Exit;switch(e.name){case"r":return x.EditTitle;case"e":return x.EditDescription;case"n":return x.AddItem;case"m":return x.InitMove;case"d":return x.Delete;case"y":return x.Yank;case"return":return x.Confirm;case"space":return x.Confirm;case"v":return Q().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;default:return null}}function Mv(e,t){let n=t===y.MOVE?{prevItem:x.MovePreviousItem,nextItem:x.MoveNextItem,prevContainer:x.MoveToPreviousContainer,nextContainer:x.MoveToNextContainer}:{prevItem:x.NavPreviousItem,nextItem:x.NavNextItem,prevContainer:x.NavToPreviousContainer,nextContainer:x.NavToNextContainer};return wv(h().contextNode.childRenderAxis,e,n)}var ps=e=>{let{context:t}=h().contextNode;if(!t)return B.None;switch(e){case b.EXIT:return B.Exit;case b.EXPORT:return B.Export;case b.COFFEE:return B.Coffee;case b.INIT:return B.Init;case b.OPEN:return B.OpenProject;case b.DELETE:return B.Delete;case b.EDIT:return B.Edit;case b.COMMENT:return B.Comment;case b.HELP:return B.ViewHelp;case b.RE_OPEN_ISSUE:return B.ReopenIssue;case b.CLOSE_ISSUE:return B.CloseIssue;case b.TAG:return B.TagTicket;case b.UNTAG:return B.UntagTicket;case b.ASSIGN:return B.AssignUserToTicket;case b.UNASSIGN:return B.UnassignUserFromTicket;case b.NEW:return B.NewItem;case b.FILTER:return B.Filter;case b.MOVE:return B.Move;case b.PEEK:return B.Peek;case b.REPLAY:return B.Replay;case b.CONFIG:return B.Config;case b.YANK:return B.Yank;case b.SYNC:return B.Sync;default:return B.None}},B={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",Coffee:"coffee"};import{ulid as Ke}from"ulid";import Tu from"node:fs";import Ty from"node:path";import wy from"react";import{Box as Ry}from"ink";import Is from"react";import Xv from"chalk";import{Box as va,Text as Jv}from"ink";import Ft from"react";import{Text as Yl}from"ink";import Xl,{useEffect as Jl,useState as Pv}from"react";var Ql={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},Ge=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=z(),r=Ql[n]??Ql.default,[o,s]=Pv(0);if(Jl(()=>{s(0)},[r]),Jl(()=>{if(!e)return;let c=setInterval(()=>{s(l=>(l+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return Xl.createElement(Yl,null,t);let a=r[o]??r[0]??t;return Xl.createElement(Yl,{color:v.accent,dimColor:o===1},a)};import{Box as ga,Text as Lv}from"ink";import fs from"react";var kv=(e,t,n,r)=>{let o=l=>Math.max(1,e[l]??1),s=n,a=n+1,c=o(n);for(;a<t&&c+o(a)<=r;)c+=o(a),a++;for(;s>0&&c+o(s-1)<=r;)s--,c+=o(s);return{start:s,end:a}},ct=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,itemHeights:o,scrollByOne:s=!1})=>{if(e.length===0)return null;let a=Math.max(1,Math.floor(t)),c=Math.max(1,Math.ceil(r)),l=Math.max(0,Math.min(n,e.length-1)),m=Math.max(1,Math.floor(a/c)),p=Math.max(0,e.length-m),{start:f,end:g}=o?kv(o,e.length,l,a):s?{start:Math.min(p,Math.max(0,l-m+1)),end:Math.min(p,Math.max(0,l-m+1))+m}:{start:Math.min(p,Math.floor(l/m)*m),end:Math.min(p,Math.floor(l/m)*m)+m},I=Math.max(1,g-f),E=e.slice(f,g),C=e.length>I,A=a,w=C?Math.max(1,Math.floor(I/e.length*A)):A,L=Math.max(0,A-w),$=Math.max(1,e.length-I),G=C?Math.floor(f/$*L):0;return fs.createElement(ga,{flexDirection:"row",height:a,width:"100%"},fs.createElement(ga,{flexDirection:"column",flexGrow:1,height:a},E),fs.createElement(ga,{flexDirection:"column",width:1,height:A},Array.from({length:A}).map((P,U)=>fs.createElement(Lv,{key:U,color:C&&U>=G&&U<G+w?v.accent:v.secondary},C?"\u2502":" "))))};import{Box as Vr,Text as Kr}from"ink";import lt from"react";var Zl,ha,Dv=()=>{let{eventLog:e=[]}=h();if(ha&&Zl===e)return ha;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return Zl=e,ha=t,t},gs=e=>Dv().has(e);import{Text as Bv}from"ink";import Fv from"react";var Ov=e=>e.toLowerCase().trim(),Uv=(e,t=Zn)=>{let n=Ov(e);return t[n]?t[n]:Hr(n)},ln=({id:e,isSelected:t,maxWidth:n})=>{let r=S.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:dt(o,n);return Fv.createElement(Bv,{underline:t,color:Uv(o)},"@"+s,gs(e)?"":"\u2197")};import{Text as _v}from"ink";import $v from"react";var or=({id:e,isSelected:t,maxWidth:n})=>{let r=S.getTag(e);if(!r)return;let o=n===void 0?r.name:dt(r.name,n);return $v.createElement(_v,{underline:t,backgroundColor:oe(r.name),color:v.secondary}," "+o+" ")};import{useEffect as jv,useState as Hv}from"react";var Wv=80,eu=1400,hs=new Set,Gr=null,Gv=e=>(hs.add(e),Gr||(Gr=setInterval(()=>{for(let t of hs)t()},Wv)),()=>{hs.delete(e),hs.size===0&&Gr&&(clearInterval(Gr),Gr=null)}),Vv=()=>{let e=Date.now()%eu/eu;return e<.5?e*2:(1-e)*2},sr=e=>{let[,t]=Hv(0);return jv(()=>{if(e)return Gv(()=>t(n=>n+1))},[e]),is(Vv())};var Kv=(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),dt(e.slice(o).trim(),n)]},tu=3,zv=2,qv=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let a=e.length-o-1,c=a>0?String(a).length+1:0;if(r+s.width+c>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},nu=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=sr(r),s=e-4,a=s-7-1,[c,l]=Kv(qe(t.title),a,s),m=l?null:dt(qe(t.props.description),s)||null,p=an(t),f=dn(t).map(C=>({...C,name:C.name})),g=Math.max(1,s-tu),{shown:I,hidden:E}=qv([...p.map(C=>({id:C.id,isTag:!0,width:Math.min(C.name.length,g)+tu})),...f.map(C=>({id:C.id,isTag:!1,width:Math.min(C.name.length,g)+zv+(gs(C.id)?0:1)}))],s);return lt.createElement(Vr,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?v.accent:v.secondary,justifyContent:"space-between"},lt.createElement(Vr,{paddingLeft:1,paddingRight:1,flexDirection:"column"},lt.createElement(Vr,{justifyContent:"space-between"},lt.createElement(Kr,{color:v.primary},c),lt.createElement(Kr,{color:v.secondary2,dimColor:!0},V(t.id))),l&<.createElement(Kr,{color:v.primary},l),m&<.createElement(Kr,{color:v.secondary2,dimColor:!0},m)),lt.createElement(Vr,{flexDirection:"row",paddingLeft:1,paddingRight:1},I.map(C=>lt.createElement(Vr,{paddingRight:1,key:C.id},C.isTag?lt.createElement(or,{id:C.id,maxWidth:g}):lt.createElement(ln,{id:C.id,maxWidth:g}))),E>0&<.createElement(Kr,{color:v.secondary2,dimColor:!0},"+",E)))};import{Box as Un,Text as zr}from"ink";import ot from"react";var Yv=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,ru=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:a})=>{let c=sr(s),l=(r.props.tags??[]).map(P=>S.getTag(P)).filter(P=>!!P),m=(r.props.assignees??[]).map(P=>S.getContributor(P)).map(P=>P&&{...P,name:P.name}).filter(P=>!!P),p=1,f=l.length*(1+p),g=m.length*(2+p),I=l.map(P=>ot.createElement(Un,{key:P.id,paddingRight:p},ot.createElement(zr,{color:oe(P.name)},"\u25A0"))),E=m.map(P=>ot.createElement(Un,{key:P.id,paddingRight:p},ot.createElement(zr,{color:Hr(P.name)},"@"+P.name.at(0)))),C=s?c:o?v.accent:a===y.MOVE?v.secondary:v.primary,A=S.getCommentsByIssue(r.id),w=A.length?String(A.length).length+2+p:0,L=A.length?ot.createElement(Un,{paddingRight:p},ot.createElement(zr,{color:v.accent},"[",A.length,"]")):null,$=f+g+w,G=Math.max(1,n-t-$-($>0?1:0));return ot.createElement(Un,{justifyContent:"space-between"},ot.createElement(Un,null,ot.createElement(Un,{width:t},o?ot.createElement(Ge,{isSelected:!0}):ot.createElement(zr,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),ot.createElement(zr,{wrap:"truncate",color:C},Yv(r.title,G))),ot.createElement(Un,null,I,E,L))};var Qv=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:a,mode:c})=>{let{renderedChildrenIndex:l,replay:m}=z(),p=l[e.id]??[],f=m?new Set(m.flashNodeIds):null,g=f?.has(e.id)??!1,I=sr(g),E=`${e.title} ${Xv.hex(v.secondary2).dim("("+p.length+")")}`,C=3,A=o?1:5,w=s&&a===-1,L=n-3-(o?1:0)-(w?2:0),$=Math.max(2,String(p.length).length+1),G=r-C-1,P=Ft.createElement(va,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},Ft.createElement(Ge,{isSelected:t}),Ft.createElement(Jv,{bold:!0,color:g?I:t?v.accent:v.primary},E," ",e.readonly?"\u{1F512}":"")),U=(H,Ze)=>{let Ue=s&&a===Ze;if(!M(H))return null;let De=f?.has(H.id)??!1;return o?Ft.createElement(ru,{key:H.id,index:Ze,labelWidth:$,width:L,ticket:H,isSelected:Ue,isFlashing:De,mode:c}):Ft.createElement(nu,{key:H.id,width:L,ticket:H,isSelected:Ue,isFlashing:De})};return Ft.createElement(va,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},P,Ft.createElement(va,null,p.length>0&&Ft.createElement(ct,{selectedIndex:a,height:G,itemHeight:A},p.map(U)),w&&Ft.createElement(Ge,{isSelected:!0})))},ou=Ft.memo(Qv);import{Box as $n,Text as wa}from"ink";import Le,{useMemo as Xr}from"react";var su=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},iu=(e,t,n)=>le.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 ar,Text as zt}from"ink";import Ve,{useEffect as Zv,useMemo as ey,useRef as ty}from"react";import{decodeTime as ya}from"ulid";var ir=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"},ys=e=>String(e).padStart(2,"0"),bs=e=>`${e.getFullYear()}-${ys(e.getMonth()+1)}-${ys(e.getDate())} ${ys(e.getHours())}:${ys(e.getMinutes())}`;var ny=e=>we(e,"attachments"),ry=e=>S.getAttachmentsByIssue(e.id).sort((t,n)=>ya(t.id)-ya(n.id)),au=e=>{for(let t of e)S.deleteNode(t.id)},oy=(e,t,n)=>le.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),sy=(e,t)=>{let n=S.getNode(ny(e.id));if(!n||!tt(n))return[];let r=t.map((o,s)=>oy(o,s,n.id)).map(o=>S.createNode(o)).filter(de).map(({value:o})=>o).filter(tt);return t.length>0&&h().selectedIndex<0&&k.navigate({contextNode:n,selectedIndex:0}),r},iy=e=>`${Math.max(1,Math.round(e/1024))} KB`;function du({ticket:e,width:t,height:n}){let r=ey(()=>ry(e),[e]),o=ty([]);Zv(()=>(au(o.current),o.current=sy(e,r),()=>{au(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=z(),c=Math.max(1,n-4),l=Math.max(12,t-32);return r.length===0?Ve.createElement(ar,{flexDirection:"column",width:t,height:n,padding:1},Ve.createElement(zt,{color:v.primary},"No attachments yet."),Ve.createElement(ar,{paddingTop:1},Ve.createElement(zt,{color:v.primary},"Attach images from the browser GUI"),Ve.createElement(zt,{color:v.accent}," epiq gui "),Ve.createElement(zt,{color:v.primary},"by dropping or pasting them."))):Ve.createElement(ar,{flexDirection:"column",width:t,height:n},Ve.createElement(ar,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:v.secondary,borderStyle:"single",paddingBottom:1},Ve.createElement(zt,{color:v.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),Ve.createElement(ct,{height:c,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let f=p===s,g=m.name.length>l?m.name.slice(0,l-1)+"\u2026":m.name;return Ve.createElement(ar,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Ve.createElement(zt,{color:v.accent},f?"\u276F ":" "),Ve.createElement(ar,{paddingLeft:1},Ve.createElement(zt,{color:v.secondary2},`#${p+1} `),Ve.createElement(zt,{color:f?v.accent:v.primary},g),Ve.createElement(zt,{color:v.secondary2}," "+iy(m.bytes)+" "+ir(ya(m.id)))))})))}import{Box as un,Text as mn}from"ink";import Re,{useEffect as my,useMemo as Iu,useRef as py}from"react";import{decodeTime as Ca}from"ulid";var lu=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,ba=e=>e.replace(lu,"");var cu=e=>e==="additions"||e==="deletions",xa=e=>{let t=lu.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"||!cu(r.side)||!cu(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var uu=/```\n([\s\S]*?)\n?```\s*$/,mu=e=>uu.exec(e)?.[1]??null,ay=/`[^`\n]+`[^\n]*\n?$/,pu=e=>ba(e).replace(uu,"").replace(ay,"").trim(),dy=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})`},Ia=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${dy(e)}`;var cy=(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 a of r){let c=a;for(;c.length>n;)s&&(o.push(s),s=""),o.push(c.slice(0,n)),c=c.slice(n);s?s.length+1+c.length<=n?s=`${s} ${c}`:(o.push(s),s=c):s=c}return s&&o.push(s),o},qr=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)},ly=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),uy=4,gu=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(uy)),Ea=e=>{let t=!1;return e.map(gu).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=xa(n);if(r)return{kind:"caption",text:Ia(r)};if(n.trim()==="")return{kind:"blank"};let o=/^#{1,6}\s+(.*)$/.exec(n);return o?{kind:"heading",spans:qr(o[1]??"")}:{kind:"text",spans:qr(n)}})},hu=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],fu=(e,t)=>{let n=[];for(let r of Ea(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 hu(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of cy(ly(r.spans),t))n.push({kind:r.kind,spans:qr(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},vu=(e,t)=>{let n=xa(e),r=n?mu(e):null;if(!n||r===null)return fu(ba(e).split(`
|
|
57
57
|
`),t);let o=pu(e),s=r.split(`
|
|
58
|
-
`),a=n.side===n.endSide?n.start:void 0,c=a===void 0?0:String(a+s.length-1).length+3;return[...o?[...fu(o.split(`
|
|
59
|
-
`),t),{kind:"blank"}]:[],{kind:"caption",text:Ia(n)},...s.flatMap((l,m)=>gu(l,Math.max(1,t-c)).map((p,f)=>({kind:"code",text:p,number:a===void 0||f>0?void 0:a+m})))]};import{Box as vu,Text as _n}from"ink";import ut from"react";var yu=({spans:e,bold:t})=>ut.createElement(_n,{color:v.primary,bold:t},e.map((n,r)=>n.code?ut.createElement(_n,{key:r,color:v.yellow},n.text):ut.createElement(_n,{key:r},n.text))),Sa=({line:e,width:t,gutter:n=0})=>{switch(e.kind){case"blank":return ut.createElement(_n,null," ");case"fence":return ut.createElement(_n,{color:v.secondary2},"```");case"caption":return ut.createElement(_n,{color:v.accent},e.text);case"heading":return ut.createElement(yu,{spans:e.spans,bold:!0});case"text":return ut.createElement(yu,{spans:e.spans});case"code":{let r=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return ut.createElement(_n,{backgroundColor:v.secondary,color:v.primary},r,e.text.padEnd(Math.max(0,t-r.length)))}}},bu=({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 ut.createElement(vu,{flexDirection:"column"},e.map((o,s)=>ut.createElement(vu,{key:s},ut.createElement(Sa,{line:o,width:t,gutter:r}))))};var my=4,py=e=>we(e,"comments"),fy=e=>S.getCommentsByIssue(e.id).sort((t,n)=>Ca(t.id)-Ca(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Iu=e=>{for(let t of e)S.deleteNode(t.id)},gy=(e,t)=>{let n=S.getNode(py(e.id));if(!n||!tt(n))return[];let r=t.map((o,s)=>iu(o,s,n.id)).map(S.createNode).filter(de).map(({value:o})=>o).filter(wr);return t.length>0&&h().selectedIndex<0&&k.navigate({contextNode:n,selectedIndex:0}),r};function Eu({ticket:e,width:t,height:n}){let r=xu(()=>fy(e),[e]),o=uy([]);ly(()=>(Iu(o.current),o.current=gy(e,r),()=>{Iu(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=z(),c=Math.max(1,n-4),l=Math.max(20,t-8),m=xu(()=>r.map(f=>{let g=hu(f.md,l);return g.length>0?g:[{kind:"blank"}]}),[r,l]),p=m.map(f=>f.length+my);return r.length===0?Re.createElement(un,{flexDirection:"column",width:t,height:n,padding:1},Re.createElement(mn,{color:v.primary},"No comments yet."),Re.createElement(un,{paddingTop:1},Re.createElement(mn,{color:v.primary},"Use"),Re.createElement(mn,{color:v.accent}," :comment "),Re.createElement(mn,{color:v.primary},"to add the first one."))):Re.createElement(un,{flexDirection:"column",width:t,height:n},Re.createElement(un,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:v.secondary,borderStyle:"single",paddingBottom:1},Re.createElement(mn,{color:v.secondary2},"Comments (",r.length,") ")),Re.createElement(ct,{height:c,itemHeights:p,selectedIndex:s},r.map((f,g)=>{let I=g===s;return Re.createElement(un,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:v.secondary,borderStyle:"single"},Re.createElement(un,{flexDirection:"row",paddingBottom:1},Re.createElement(mn,{color:v.accent},I?"\u276F ":" "),Re.createElement(un,{paddingLeft:1},Re.createElement(mn,{color:v.secondary2},`#${g+1} `),Re.createElement(ln,{id:f.authorId}),Re.createElement(mn,{color:v.secondary2}," "+ir(Ca(f.id))))),Re.createElement(un,{paddingLeft:3,paddingBottom:1},Re.createElement(bu,{lines:m[g]??[],width:l})))})))}import{Box as xs,Text as hy}from"ink";import qt from"react";var Su=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=z(),{title:o}=t,s=t.parentNodeId?S.getNode(t.parentNodeId):void 0,a=s&&M(s)?o===ce.ASSIGNEES?s.props.assignees??[]:o===ce.TAGS?(s.props.tags??[]).filter(c=>S.getTag(c)):[]:[];return qt.createElement(xs,{alignItems:"center",paddingTop:1},qt.createElement(xs,{minWidth:12},qt.createElement(Ge,{isSelected:n}),qt.createElement(hy,{color:n?v.accent:v.secondary2},o,":")),qt.createElement(xs,{flexDirection:"row",marginLeft:1,paddingRight:1},a.map((c,l)=>{let m=r.id===t.id&&l===e;return qt.createElement(xs,{key:`${o}-${c}`,paddingRight:2,minHeight:1},qt.createElement(Ge,{isSelected:m}),o===ce.ASSIGNEES?qt.createElement(ln,{isSelected:m,id:c}):o===ce.TAGS?qt.createElement(or,{isSelected:m,id:c}):null)})))};import{Box as Yr,Text as Na}from"ink";import xt,{useEffect as vy,useMemo as Ra}from"react";var yy="\u2029",Cu=(e,t)=>`${e}::inline-line::${t}`,Aa=new Map,Nu=e=>{let t=Aa.get(e)??[];Aa.delete(e);for(let n of t)S.deleteNode(n)},by=(e,t)=>{Nu(e);let n=[];t.forEach((r,o)=>{let s=nt(BigInt(o+1));if(!de(s))return;let a=S.createNode(le.text({id:Cu(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));de(a)&&n.push(a.value.id)}),Aa.set(e,n)},Ta=({id:e,label:t,text:n,height:r,selected:o,maxWidth:s})=>{let{selectedIndex:a,contextNode:c}=z(),l=Ra(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=Ra(()=>l.join("\0"),[l]);vy(()=>(by(e,l),()=>{Nu(e)}),[e,m]);let p=s-10,g=Ra(()=>Ea(l).map(I=>{if(I.kind==="code")return{...I,text:dt(I.text,p)};if(I.kind==="text"||I.kind==="heading"){let E=I.spans.map(C=>C.code?`\`${C.text}\``:C.text).join("");return{...I,spans:qr(dt(E,p))}}return I}),[l,p]).map((I,E)=>{let C=c.id===e&&a===E;return xt.createElement(Yr,{key:Cu(e,E)},xt.createElement(Na,{color:C?v.primary:v.secondary2,dimColor:!C},`${E+1} `.padStart(5,"\xA0")),I.kind==="blank"?xt.createElement(Na,{backgroundColor:C?"gray":void 0},yy):xt.createElement(Yr,null,xt.createElement(Sa,{line:I,width:I.kind==="code"?p:0})))});return xt.createElement(Yr,{flexDirection:"column",paddingTop:1},xt.createElement(Yr,null,xt.createElement(Ge,{isSelected:o}),xt.createElement(Na,{color:o?v.accent:v.secondary2},t)),xt.createElement(Yr,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,marginLeft:1},xt.createElement(ct,{scrollByOne:!0,height:r-3,selectedIndex:a,itemHeight:1},g)))};var xy=e=>we(e,"description"),Iy=e=>we(e,"comments"),Ey=e=>we(e,"history"),Sy=e=>we(e,"attachments"),Ru=({ticket:e,height:t})=>{let n=Xr(()=>su(e),[e]),{selectedIndex:r,contextNode:o}=z(),s=process.stdout.columns||120,a=Xr(()=>xy(e.id),[e.id]),c=Xr(()=>Iy(e.id),[e.id]),l=Xr(()=>Ey(e.id),[e.id]),m=Xr(()=>Sy(e.id),[e.id]),p=S.getAttachmentsByIssue(e.id).length,f=o.id===e.id,g=o.id===c||o.parentNodeId===c,I=o.id===l||o.parentNodeId===l,E=o.id===m||o.parentNodeId===m,C=J(e.id);if(g){let H=t-3;return Le.createElement(jn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Le.createElement(Eu,{ticket:e,width:s,height:H}))}if(E){let H=t-3;return Le.createElement(jn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Le.createElement(du,{ticket:e,width:s,height:H}))}if(I){let U=S.getNode(l),H=U&&tt(U)?U.props.value??"":"",Ue=t-3;return Le.createElement(jn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},U?Le.createElement(Ta,{id:U.id,label:"Event log",text:H,selected:!1,maxWidth:s,height:Ue}):null)}let A=C.reduce((U,H)=>Ar(H)||H.id===c||H.id===m||H.id===l?U+1:U,0),w=2,L=3,j=A,G=t-L-j-w,P=(U,H)=>U.id===a?Le.createElement(Ta,{key:U.id,id:a,label:"Description (press e to edit)",text:e.props.description??"",selected:H,maxWidth:s,height:G}):Ar(U)?Le.createElement(Su,{key:U.id,parent:U,selected:H,selectedIndex:r}):U.id===c?Le.createElement(jn,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(wa,{backgroundColor:v.secondary,color:H?v.accent:v.primary},` Comments (${n}) \u203A\u203A `)):U.id===m?Le.createElement(jn,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(wa,{backgroundColor:v.secondary,color:H?v.accent:v.primary},` Attachments (${p}) \u203A\u203A `)):U.id===l?Le.createElement(jn,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(wa,{backgroundColor:v.secondary,color:H?v.accent:v.primary}," History \u203A\u203A ")):null;return Le.createElement(jn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},C.map((U,H)=>P(U,f&&r===H)))};var Ny=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:a,width:c})=>{let l=t.context,m=l===F.TICKET||l===F.FIELD_LIST||l===F.FIELD,p=l===F.BOARD||l===F.SWIMLANE,f=l===F.TICKET?t:r.find(A=>A.context===F.TICKET),g=Math.floor(c/3),I=Math.floor(c/Math.max(e.length,1)),E=Math.min(I,g),C=s==="dense";return Is.createElement(Cy,{flexDirection:"row",height:a},p&&e.map((A,w)=>{let L=t.id===A.id,j=L?n:-1,G=t.context===F.BOARD&&n===w;return Is.createElement(ou,{key:A.id,height:a,width:E,swimlane:A,isSelected:G,isDense:C,isFocused:L,listSelectedIndex:j,mode:o})}),m&&f&&Is.createElement(Ru,{height:a,ticket:f}))},Es=Is.memo(Ny);import{render as Ty}from"ink";import{Writable as wy}from"node:stream";var Jr=e=>String(e).padStart(2,"0"),My=e=>{let t=e.getUTCFullYear(),n=Jr(e.getUTCMonth()+1),r=Jr(e.getUTCDate()),o=Jr(e.getUTCHours()),s=Jr(e.getUTCMinutes()),a=Jr(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${a}`},Py=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Ly=async(e,{width:t,height:n})=>{let r="",o=new wy({write(a,c,l){let m=ky(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),l()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=Ty(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),s.unmount(),r},ky=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Tu=async()=>{let{viewMode:e}=Q(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=h(),a=r.find(w=>w.context==="BOARD");if(!a)return i("No board found to export");let c=120,l=40,m=await Ly(Ay.createElement(Es,{height:l,width:c,swimlanes:(s[a.id]??[]).filter(w=>w!==void 0&&Tt(w)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:l});if(!m)return i("Failed to render board export");let p=Eo(process.cwd());if(d(p))return i("Unable to export, epiq root not found");let f=new Date,g=My(f),I=`board_${Py(a.title)}_${g}.md`,E=$d(p.value);Au.mkdirSync(E,{recursive:!0});let C=Ry.join(E,I),A=`# Board - ${a.title}
|
|
58
|
+
`).map(gu),a=n.side===n.endSide?n.start:void 0,c=a===void 0?0:String(a+s.length-1).length+3;return[...o?[...fu(o.split(`
|
|
59
|
+
`),t),{kind:"blank"}]:[],{kind:"caption",text:Ia(n)},...s.flatMap((l,m)=>hu(l,Math.max(1,t-c)).map((p,f)=>({kind:"code",text:p,number:a===void 0||f>0?void 0:a+m})))]};import{Box as yu,Text as _n}from"ink";import ut from"react";var bu=({spans:e,bold:t})=>ut.createElement(_n,{color:v.primary,bold:t},e.map((n,r)=>n.code?ut.createElement(_n,{key:r,color:v.yellow},n.text):ut.createElement(_n,{key:r},n.text))),Sa=({line:e,width:t,gutter:n=0})=>{switch(e.kind){case"blank":return ut.createElement(_n,null," ");case"fence":return ut.createElement(_n,{color:v.secondary2},"```");case"caption":return ut.createElement(_n,{color:v.accent},e.text);case"heading":return ut.createElement(bu,{spans:e.spans,bold:!0});case"text":return ut.createElement(bu,{spans:e.spans});case"code":{let r=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return ut.createElement(_n,{backgroundColor:v.secondary,color:v.primary},r,e.text.padEnd(Math.max(0,t-r.length)))}}},xu=({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 ut.createElement(yu,{flexDirection:"column"},e.map((o,s)=>ut.createElement(yu,{key:s},ut.createElement(Sa,{line:o,width:t,gutter:r}))))};var fy=4,gy=e=>we(e,"comments"),hy=e=>S.getCommentsByIssue(e.id).sort((t,n)=>Ca(t.id)-Ca(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Eu=e=>{for(let t of e)S.deleteNode(t.id)},vy=(e,t)=>{let n=S.getNode(gy(e.id));if(!n||!tt(n))return[];let r=t.map((o,s)=>iu(o,s,n.id)).map(S.createNode).filter(de).map(({value:o})=>o).filter(wr);return t.length>0&&h().selectedIndex<0&&k.navigate({contextNode:n,selectedIndex:0}),r};function Su({ticket:e,width:t,height:n}){let r=Iu(()=>hy(e),[e]),o=py([]);my(()=>(Eu(o.current),o.current=vy(e,r),()=>{Eu(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=z(),c=Math.max(1,n-4),l=Math.max(20,t-8),m=Iu(()=>r.map(f=>{let g=vu(f.md,l);return g.length>0?g:[{kind:"blank"}]}),[r,l]),p=m.map(f=>f.length+fy);return r.length===0?Re.createElement(un,{flexDirection:"column",width:t,height:n,padding:1},Re.createElement(mn,{color:v.primary},"No comments yet."),Re.createElement(un,{paddingTop:1},Re.createElement(mn,{color:v.primary},"Use"),Re.createElement(mn,{color:v.accent}," :comment "),Re.createElement(mn,{color:v.primary},"to add the first one."))):Re.createElement(un,{flexDirection:"column",width:t,height:n},Re.createElement(un,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:v.secondary,borderStyle:"single",paddingBottom:1},Re.createElement(mn,{color:v.secondary2},"Comments (",r.length,") ")),Re.createElement(ct,{height:c,itemHeights:p,selectedIndex:s},r.map((f,g)=>{let I=g===s;return Re.createElement(un,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:v.secondary,borderStyle:"single"},Re.createElement(un,{flexDirection:"row",paddingBottom:1},Re.createElement(mn,{color:v.accent},I?"\u276F ":" "),Re.createElement(un,{paddingLeft:1},Re.createElement(mn,{color:v.secondary2},`#${g+1} `),Re.createElement(ln,{id:f.authorId}),Re.createElement(mn,{color:v.secondary2}," "+ir(Ca(f.id))))),Re.createElement(un,{paddingLeft:3,paddingBottom:1},Re.createElement(xu,{lines:m[g]??[],width:l})))})))}import{Box as xs,Text as yy}from"ink";import qt from"react";var Cu=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=z(),{title:o}=t,s=t.parentNodeId?S.getNode(t.parentNodeId):void 0,a=s&&M(s)?o===ce.ASSIGNEES?s.props.assignees??[]:o===ce.TAGS?(s.props.tags??[]).filter(c=>S.getTag(c)):[]:[];return qt.createElement(xs,{alignItems:"center",paddingTop:1},qt.createElement(xs,{minWidth:12},qt.createElement(Ge,{isSelected:n}),qt.createElement(yy,{color:n?v.accent:v.secondary2},o,":")),qt.createElement(xs,{flexDirection:"row",marginLeft:1,paddingRight:1},a.map((c,l)=>{let m=r.id===t.id&&l===e;return qt.createElement(xs,{key:`${o}-${c}`,paddingRight:2,minHeight:1},qt.createElement(Ge,{isSelected:m}),o===ce.ASSIGNEES?qt.createElement(ln,{isSelected:m,id:c}):o===ce.TAGS?qt.createElement(or,{isSelected:m,id:c}):null)})))};import{Box as Yr,Text as Na}from"ink";import xt,{useEffect as by,useMemo as Ra}from"react";var xy="\u2029",Nu=(e,t)=>`${e}::inline-line::${t}`,Aa=new Map,Ru=e=>{let t=Aa.get(e)??[];Aa.delete(e);for(let n of t)S.deleteNode(n)},Iy=(e,t)=>{Ru(e);let n=[];t.forEach((r,o)=>{let s=nt(BigInt(o+1));if(!de(s))return;let a=S.createNode(le.text({id:Nu(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));de(a)&&n.push(a.value.id)}),Aa.set(e,n)},Ta=({id:e,label:t,text:n,height:r,selected:o,maxWidth:s})=>{let{selectedIndex:a,contextNode:c}=z(),l=Ra(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=Ra(()=>l.join("\0"),[l]);by(()=>(Iy(e,l),()=>{Ru(e)}),[e,m]);let p=s-10,g=Ra(()=>Ea(l).map(I=>{if(I.kind==="code")return{...I,text:dt(I.text,p)};if(I.kind==="text"||I.kind==="heading"){let E=I.spans.map(C=>C.code?`\`${C.text}\``:C.text).join("");return{...I,spans:qr(dt(E,p))}}return I}),[l,p]).map((I,E)=>{let C=c.id===e&&a===E;return xt.createElement(Yr,{key:Nu(e,E)},xt.createElement(Na,{color:C?v.primary:v.secondary2,dimColor:!C},`${E+1} `.padStart(5,"\xA0")),I.kind==="blank"?xt.createElement(Na,{backgroundColor:C?"gray":void 0},xy):xt.createElement(Yr,null,xt.createElement(Sa,{line:I,width:I.kind==="code"?p:0})))});return xt.createElement(Yr,{flexDirection:"column",paddingTop:1},xt.createElement(Yr,null,xt.createElement(Ge,{isSelected:o}),xt.createElement(Na,{color:o?v.accent:v.secondary2},t)),xt.createElement(Yr,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,marginLeft:1},xt.createElement(ct,{scrollByOne:!0,height:r-3,selectedIndex:a,itemHeight:1},g)))};var Ey=e=>we(e,"description"),Sy=e=>we(e,"comments"),Cy=e=>we(e,"history"),Ny=e=>we(e,"attachments"),Au=({ticket:e,height:t})=>{let n=Xr(()=>su(e),[e]),{selectedIndex:r,contextNode:o}=z(),s=process.stdout.columns||120,a=Xr(()=>Ey(e.id),[e.id]),c=Xr(()=>Sy(e.id),[e.id]),l=Xr(()=>Cy(e.id),[e.id]),m=Xr(()=>Ny(e.id),[e.id]),p=S.getAttachmentsByIssue(e.id).length,f=o.id===e.id,g=o.id===c||o.parentNodeId===c,I=o.id===l||o.parentNodeId===l,E=o.id===m||o.parentNodeId===m,C=J(e.id);if(g){let H=t-3;return Le.createElement($n,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Le.createElement(Su,{ticket:e,width:s,height:H}))}if(E){let H=t-3;return Le.createElement($n,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Le.createElement(du,{ticket:e,width:s,height:H}))}if(I){let U=S.getNode(l),H=U&&tt(U)?U.props.value??"":"",Ue=t-3;return Le.createElement($n,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},U?Le.createElement(Ta,{id:U.id,label:"Event log",text:H,selected:!1,maxWidth:s,height:Ue}):null)}let A=C.reduce((U,H)=>Ar(H)||H.id===c||H.id===m||H.id===l?U+1:U,0),w=2,L=3,$=A,G=t-L-$-w,P=(U,H)=>U.id===a?Le.createElement(Ta,{key:U.id,id:a,label:"Description (press e to edit)",text:e.props.description??"",selected:H,maxWidth:s,height:G}):Ar(U)?Le.createElement(Cu,{key:U.id,parent:U,selected:H,selectedIndex:r}):U.id===c?Le.createElement($n,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(wa,{backgroundColor:v.secondary,color:H?v.accent:v.primary},` Comments (${n}) \u203A\u203A `)):U.id===m?Le.createElement($n,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(wa,{backgroundColor:v.secondary,color:H?v.accent:v.primary},` Attachments (${p}) \u203A\u203A `)):U.id===l?Le.createElement($n,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(wa,{backgroundColor:v.secondary,color:H?v.accent:v.primary}," History \u203A\u203A ")):null;return Le.createElement($n,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},C.map((U,H)=>P(U,f&&r===H)))};var Ay=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:a,width:c})=>{let l=t.context,m=l===F.TICKET||l===F.FIELD_LIST||l===F.FIELD,p=l===F.BOARD||l===F.SWIMLANE,f=l===F.TICKET?t:r.find(A=>A.context===F.TICKET),g=Math.floor(c/3),I=Math.floor(c/Math.max(e.length,1)),E=Math.min(I,g),C=s==="dense";return Is.createElement(Ry,{flexDirection:"row",height:a},p&&e.map((A,w)=>{let L=t.id===A.id,$=L?n:-1,G=t.context===F.BOARD&&n===w;return Is.createElement(ou,{key:A.id,height:a,width:E,swimlane:A,isSelected:G,isDense:C,isFocused:L,listSelectedIndex:$,mode:o})}),m&&f&&Is.createElement(Au,{height:a,ticket:f}))},Es=Is.memo(Ay);import{render as My}from"ink";import{Writable as Py}from"node:stream";var Jr=e=>String(e).padStart(2,"0"),Ly=e=>{let t=e.getUTCFullYear(),n=Jr(e.getUTCMonth()+1),r=Jr(e.getUTCDate()),o=Jr(e.getUTCHours()),s=Jr(e.getUTCMinutes()),a=Jr(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${a}`},ky=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Dy=async(e,{width:t,height:n})=>{let r="",o=new Py({write(a,c,l){let m=By(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),l()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=My(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),s.unmount(),r},By=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),wu=async()=>{let{viewMode:e}=Q(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=h(),a=r.find(w=>w.context==="BOARD");if(!a)return i("No board found to export");let c=120,l=40,m=await Dy(wy.createElement(Es,{height:l,width:c,swimlanes:(s[a.id]??[]).filter(w=>w!==void 0&&Tt(w)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:l});if(!m)return i("Failed to render board export");let p=Eo(process.cwd());if(d(p))return i("Unable to export, epiq root not found");let f=new Date,g=Ly(f),I=`board_${ky(a.title)}_${g}.md`,E=jd(p.value);Tu.mkdirSync(E,{recursive:!0});let C=Ty.join(E,I),A=`# Board - ${a.title}
|
|
60
60
|
Date: ${f.toISOString()}
|
|
61
61
|
|
|
62
62
|
\`\`\`text
|
|
63
63
|
${m}
|
|
64
64
|
\`\`\`
|
|
65
|
-
`;return
|
|
65
|
+
`;return Tu.writeFileSync(C,A,"utf8"),u("Exported board layout",C)};var Ss=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};import{useSyncExternalStore as yL}from"react";var Cs,Fy=new Set,Mu=()=>{for(let e of Fy)e()};var pn=()=>{if(!Cs)throw new Error("Ui state not initialized. Call initUiState() first.");return Cs};var Pu=(e={})=>(Cs=e,Mu(),u("UX state initialized",null)),Oy=e=>{let t=pn();return Cs=e(t),Mu(),u("UX state updated",null)},fn=e=>Oy(t=>({...t,...e}));import{spawn as Uy}from"node:child_process";function Qr(e){let t=process.platform,o=Uy(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}import{ulid as ka}from"ulid";import{spawn as _y,spawnSync as $y}from"node:child_process";import jy from"node:os";import Lu from"node:path";import{ulid as Hy}from"ulid";function Ma(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 Wy(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function Ns(){let{preferredEditor:e}=Q(),t=[e?Wy(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Pa(e){let[t=""]=Ma(e);return/(^|\/)code(-insiders)?$/.test(t)}function ku(e,t){let[n="",...r]=Ma(e);return{command:n,args:[...r,...t]}}function Du(e,t){return ku(e,Pa(e)?["--wait",t]:[t])}function Gy(e,t,n,r="new"){return ku(e,[r==="new"?"--new-window":"--reuse-window","--diff",t,n])}function Bu(e){let t=Lu.join(jy.tmpdir(),"epiq");Te.mkDir(t);let n=Lu.join(t,Hy());Te.writeToFile(n,e??"");let r=Ns();for(let o of r){let{command:s,args:a}=Du(o,n);if(!s)continue;let c=$y(s,a,{stdio:"inherit"});if(!c.error&&c.status===0){let l=Te.readFile(n);if(l==null)return i("Unable to read edited file");let m=l.replace(/\r?\n$/,"");return u("Successfully edited",m)}}return i("Unable to open editor")}var Vy=new Set(["vim","vi","nvim","nano","pico","ed"]);function Ky(e){let[t=""]=Ma(e),n=t.split("/").pop()??t;return Vy.has(n)}var zy=600;function Fu({command:e,args:t},n){return new Promise(r=>{if(!e){r(i(`"${n}" is not a usable editor command`));return}let o=_y(e,t,{stdio:"ignore",detached:!0}),s=!1,a=l=>{s||(s=!0,clearTimeout(c),r(l))};o.on("error",l=>a(i(l.message))),o.on("exit",l=>{a(l===0?u("Opened editor",!0):i(`"${n}" exited with code ${l}`))});let c=setTimeout(()=>{o.unref(),a(u("Opened editor",!0))},zy)})}function qy(e,t){return Ky(e)?Promise.resolve(i(`"${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}`)):Fu(Du(e,t),e)}function La(e,t,n,r="new"){return Fu(Gy(e,t,n,r),e)}async function Ou(e){let t=Ns();if(t.length===0)return i("No editor configured (preferredEditor, VISUAL, or EDITOR)");let n=i("Unable to open editor");for(let r of t){let o=await qy(r,e);if(!d(o))return o;n=o,logger.error(`Failed to open editor "${r}" for ${e}: ${o.message}`)}return n}var Uu=async e=>{let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(e.modifier===rt.DESCRIPTION)return Xy();if(r&&wr(r))return Yy(e);if(e.modifier===rt.TITLE){let o=he();if(d(o))return i("Unable to resolve user ID");let s=r;if(!s)return i("Missing node");if(s.readonly)return i("Cannot rename readonly node");let a=e.inputString.trim();if(!a)return i("Provide a title");let c=await Rt();return d(c)?c:O([{id:ka(),action:"edit.title",payload:{id:s.id,name:a},...o.value}],c.value)}return i("Unknown edit command")},Yy=async e=>{let t=he();if(d(t))return i("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=h(),o=J(n.id)[r];if(!o||!wr(o))return i("Select a comment first");if(o.readonly)return i("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return i("Unable to resolve comment issue");let a=h().nodes[s];if(!a||!M(a))return i("Unable to resolve comment issue");if(a.readonly)return i("Cannot edit readonly issue");let c=o.id.split(":").at(0)??"",l=S.getComment(c);if(!l||l.deleted)return i("Unable to resolve comment");if(l.issue!==a.id)return i("Comment does not belong to selected issue");if(l.authorId!==t.value.userId)return i("You can only edit your own comments"+l.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return i("Provide a comment");let p=await Rt();if(d(p))return p;let f=p.value;return O([{id:ka(),action:"edit.issue.comment",payload:{id:l.id,issue:a.id,md:m},...t.value}],f)},Xy=async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let t=await Rt();if(d(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=h(),s=ze([...r,o],"TICKET");if(d(s))return i("Edit target must be an issue");let a=s.value;if(!M(a))return i("Edit target must be an issue");if(a.readonly)return i("Cannot edit readonly issue");let c=J(a.id).find(f=>f.title===ce.DESCRIPTION);if(!c)return i("No target found");if(c.readonly)return i("Cannot edit readonly field");let l=a.props.description??"";if(typeof l!="string")return i("Selected field is not editable text");let m=Bu(l);if(d(m))return i("Failed to edit field");let p=m.value;return p===l?u("No changes made",null):O([{id:ka(),action:"edit.description",payload:{id:a.id,md:p},...e.value}],n)};import Qy from"node:fs";import $u from"node:path";import Da from"node:fs";import Jy from"node:path";var _u=async e=>{let t=Jy.join(e,".gitignore"),n=Da.existsSync(t)?Da.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
|
|
66
66
|
`).map(l=>l.trim()),s=r.filter(l=>!o.some(m=>m===l||m===l.replace(/\/$/,"")||m==="/"+l||m==="/"+l.replace(/\/$/,"")));if(s.length===0)return u("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...s].join(`
|
|
67
67
|
`);return n=n.trimEnd()+`
|
|
68
68
|
|
|
69
69
|
${c}
|
|
70
|
-
`,Da.writeFileSync(t,n,"utf8"),Y.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),u("Local epiq paths ignored",!0)};var
|
|
71
|
-
`));let Nn=Qe();if(d(Nn))return se(16,Nn.message);let{rootNodeId:gr,nodes:Df}=Nn.value,md=Df[gr];return md?(k.navigate({contextNode:md,selectedIndex:0}),N({hasProjectDefinition:!0,mode:y.DEFAULT}),u(Ze,null)):se(16,"Unable to resolve initialized root node")};import{ulid as Zy}from"ulid";import{ulid as Qy}from"ulid";var $u=null,gn=()=>structuredClone($u),Zr=e=>{$u=e},Hu=()=>{let{contextNode:e,selectedIndex:t}=h(),r=Z(e.id)[t];return r?u("Resolved selected child",r):i("Target node not found")},Ba=({id:e,parentId:t,position:n={at:"end"}})=>{let r=Z(t).filter(o=>o.id!==e);return _o(r,n)},Wu=({id:e,parentId:t,position:n={at:"end"}})=>{let r=he();if(d(r))return i("Unable to resolve user ID");let o=Ba({parentId:t,id:e,position:n});return d(o)?o:u("Created pending move state",{id:Qy(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Gu=e=>{Zr(e);let t=nn(e,!0);return d(t)?t:u("Node moved successfully",t.value)};function Fa(e){let t=Hu();if(d(t))return t;let{contextNode:n,nodes:r}=h();if(!n.parentNodeId)return i("Missing parent node id");let o=r[n.parentNodeId];if(!o)return i("Missing parent node");let s=Z(o.id),a=s.findIndex(({id:m})=>m===n.id);if(a<0)return i("Current node not found among siblings");let c=s[a+e];if(!c)return i("Missing sibling node");let l=Wu({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(l)?l:Gu(l.value)}function Oa(e){let t=Hu();if(d(t))return t;let{contextNode:n,selectedIndex:r}=h(),s=Z(n.id)[r+e];if(!s)return i("Missing sibling node");let a=Wu({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(a)?a:Gu(a.value)}var Vu=()=>{let e=gn();if(!e)return i("No pending move state");let t=e.payload.id,n=e.payload.parent,r=h().nodes[n];if(!r)return i("Move parent not found");let o=Z(n).findIndex(s=>s.id===t);return o===-1?i("Moved node not found among rendered children"):(k.navigate({contextNode:r,selectedIndex:o}),u("Synchronized navigation to moved node",null))},Rs=(e,t="Moved preview")=>{if(d(e))return e;let n=Vu();return d(n)?n:(N({mode:y.MOVE}),u(t,null))},Ku=async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t}=te().commandMeta,{contextNode:n,selectedIndex:r}=h(),o=Z(n.id)[r];if(!o)return N({mode:y.DEFAULT}),i("No move target");if(t==="start"){if(o.readonly)return i("Target node is read-only");if(r===-1)return i("No item selected");if(!o.parentNodeId)return i("Target has no parent");let s=Z(o.parentNodeId),a=s.findIndex(({id:f})=>f===o.id);if(a===-1)return i("Target not found among siblings");let c=s[a-1],l=s[a+1],m=l!=null?{at:"before",sibling:l.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=Ba({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(Zr({id:Zy(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),N({mode:y.MOVE}),u("Move initialized",null))}if(t==="next")return Rs(Oa(1));if(t==="previous")return Rs(Oa(-1));if(t==="to-next")return Rs(Fa(1));if(t==="to-previous")return Rs(Fa(-1));if(t==="confirm"){let s=gn();if(!s)return i("No pending move to confirm");let a=await Rt();if(d(a))return a;let c=O([s],a.value);if(d(c))return c;let l=Vu();return d(l)?l:(Zr(null),N({mode:y.DEFAULT}),u("Moved item",null))}return t==="cancel"?(Zr(null),N({mode:y.DEFAULT}),u("Cancelling move",null)):i("Invalid move modifier")};import{ulid as Ts}from"ulid";import{monotonicFactory as eb,ulid as tb}from"ulid";var nb=eb(),As=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=nb();return u("Created issue events",[{id:tb(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var zu=async(e,t)=>{let n=he();if(d(n))return i("Unable to resolve user ID");let r=await Rt();if(d(r))return r;let o=r.value;if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:a,selectedIndex:c}=h(),l=m=>{let p=O([m],o);if(d(p))return p;let f=S.getNode(p.value[0].result.id);if(!f)return i("Created node not found");if(!f.parentNodeId)return p;let g=S.getNode(f.parentNodeId);return g?(k.navigate({contextNode:g,selectedIndex:S.getSiblings(f.parentNodeId).findIndex(({id:I})=>I===f.id)}),p):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=h(),p=S.getNode(m);if(!p)return i("Workspace not found");let f=kn(p.id,n.value,o);return d(f)?f:l({id:Ts(),action:"add.board",payload:{id:Ts(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=ze(s,"BOARD");if(d(m))return i("Unable to add swimlane in this context");let p=kn(m.value.id,n.value,o);return d(p)?p:l({id:Ts(),action:"add.swimlane",payload:{id:Ts(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=J(a.id)[c],p=a.context==="SWIMLANE"?a:a.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let L=ze(s,"SWIMLANE");return d(L)?null:L.value})();if(!p)return i("Unable to add issue in this context");let f=kn(p.id,n.value,o);if(d(f))return f;let g=As({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(d(g))return g;let I=g.value,E=O([...I],o);if(d(E))return E;if(!E.value[0])return i("Issue creation failed");let w=I.find(L=>L.action==="add.issue")?.payload.id;return w?(k.navigate({contextNode:p,selectedIndex:S.getSiblings(p.id).findIndex(({id:L})=>L===w)}),u("Issue created",null)):i("Unable to determine ticket id")}return u("Success",null)};import rb from"node:os";import Yu from"node:path";var ws=async e=>{let t=Se({repoRoot:e});if(d(t))return Pt(3,t.message);let n=await Dn({repoRoot:e,stateBranchRoot:t.value,stateBranchName:xo().stateBranch});if(d(n))return Pt(3,n.message);let r=await _({cwd:t.value,args:["pull","--ff-only"]});d(r)&&logger.info(3,r.message);let o=Wt(t.value);if(d(o))return Pt(3,o.message);let{events:s,unreadable:a}=o.value,c=Gt(s,a);if(d(c))return Pt(4,c.message);N({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let l=Zo({root:e});return d(l)&&logger.info(l.message),u("Loaded project",void 0)},qu=()=>{let e=Gt([]);return d(e)?Pt(4,e.message):(N({hasProjectDefinition:!1,hasInitializingEvents:!1}),u("Booted without a project",void 0))};var ob=e=>e==="~"||e.startsWith("~/")?Yu.join(rb.homedir(),e.slice(1)):e,sb=(e,t)=>{let n=e.trim();if(!n)return i("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):i(`No recent project #${n}`)}let r=_e(Yu.resolve(ob(n)));return d(r)?i(`No epiq project at ${n}`):u("Resolved project path",r.value)},Xu=async()=>{let e=ms();if(K(""),h().hasProjectDefinition)return i("Already in a project; run epiq from another directory");let t=Kt({exclude:process.cwd()}),n=d(t)?[]:t.value,r=sb(e,n);if(d(r))return i(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(c){return i(`Unable to enter ${o}: ${c instanceof Error?c.message:String(c)}`)}let a=await ws(o);return d(a)?(process.chdir(s),i(a.message)):u(`Opened ${Qn(o)}`,null)};var Ms=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=h(),s=Oo(n,t);if(d(s))return i(s.message);let{appliedEvents:a,unappliedEvents:c}=s.value,l=It();if(d(l))return l;let m=vt(a),{fatal:p,skipped:f}=$t(m);if(p.length>0)return It(),N(o),i(p.map(I=>I.message).join(", "));Ht(f);let g=h().nodes[e];return g?(k.navigate({contextNode:g,selectedIndex:r}),u("",{unappliedEvents:c})):(It(),N(o),i("Board did not exist at that date"))};var ib=20,ab=16,db=150,Ps=null,Ls=null;var $n=()=>{Ps!==null&&(clearInterval(Ps),Ps=null),Ls!==null&&(clearTimeout(Ls),Ls=null)},Ju=()=>{$n(),N({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},cb=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)},Qu=({events:e,startTime:t,durationMs:n})=>{$n();let r=e.length,o=e.map(f=>cn(f)??t),s=o[r-1]??Date.now(),a=cb(o),c=Math.max(1,Math.round(n*ib/1e3)),l=Math.max(Math.round(n/c),ab),m=0,p=0;N({mode:y.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Ps=setInterval(()=>{m++;let f=m/c,g=[],I;for(;p<r&&a[p]<=f;){let C=e[p],A=nn(C);if(d(A)){if(Mr(A)){p++;continue}Ju();return}g.push(..._i(C)),I=C,p++}if(p>=r||m>=c){for(;p<r;p++){let A=nn(e[p]);if(d(A)&&!Mr(A))break}let C=h().replay;N({unappliedEvents:[],replay:C&&{...C,progress:1,appliedCount:r}}),$n(),Ls=setTimeout(Ju,db);return}let E=h().replay;N({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:I?cn(I)??E?.currentTime??t:E?.currentTime??t,currentLabel:I?ks(I):E?.currentLabel??"",flashNodeIds:I?[...new Set(g)]:E?.flashNodeIds??[]}})},l)};var Zu=async()=>{let e=ze(h().breadCrumb,"BOARD");if(d(e))return e;let t=await ft(process.cwd());if(d(t))return i("Unable to locate repo root");let n=Se({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=te().commandMeta;if($n(),r==="now"){let c=Mn(n.value);if(d(c))return i(c.message);let l=It();if(d(l))return l;let m=vt(c.value),{fatal:p,skipped:f}=$t(m);return p.length>0?i(p.map(g=>g.message).join(", ")):(Ht(f),N({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Peeking now",!0))}let s;if(r==="prev"){let c=h().eventLog.at(-1),l=cn(c);if(l===null)return i("No previous event to peek");s=l}else if(r==="next"){let c=h().unappliedEvents.at(0),l=cn(c);if(l===null)return i("No next event to peek");s=l+1}else{let c=Bn(r||o.trim());if(!c)return i("Invalid peek date");s=c.getTime()}let a=Ms({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return d(a)?a:(N({mode:y.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:a.value.unappliedEvents,replay:null}),u("Peeking",!0))};var em=async()=>{let e=ze(h().breadCrumb,"BOARD");if(d(e))return e;let t=await ft(process.cwd());if(d(t))return i("Unable to locate repo root");let n=Se({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=te().commandMeta,{dateInput:s,durationInput:a}=rs(r,o);if($n(),h().syncStatus.status==="syncing")return i("Cannot replay while syncing, try again in a moment");let c=Bn(s);if(!c)return i("Invalid replay date");let l=a?ns(a):15e3;if(l===null)return i("Invalid replay duration (try e.g. 30s or 2m)");let m=c.getTime(),p=h(),f=Ms({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?(It(),N(p),u("Nothing to replay from that point",!0)):(Qu({events:g,startTime:m,durationMs:l}),u("Replaying board history",!0))};import ub from"zod";var tm=()=>{let e=te().commandMeta.inputString,t=ub.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return i("Auto sync duration must be a number of at least 3000 ms");let n=at({autoSyncDebounceMs:t.data});return d(n)?n:(je({autoSyncIntervalMs:t.data}),N({mode:y.DEFAULT}),u(`Auto sync interval set to ${t.data}ms`,null))};var nm=()=>{let e=te().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return i("Invalid response");let t=ll(e),n=at({autoSync:t});return d(n)?n:(je({autoSync:t}),N({mode:y.DEFAULT}),u(`Auto sync set to "${e}"`,null))};var rm=()=>{let e=te().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return i("Invalid response");let n=at({logLevel:e});return d(n)?n:(je({logLevel:e}),N({mode:y.DEFAULT}),u(`Auto sync set to "${e}"`,null))};import{spawn as mb}from"node:child_process";var pb=()=>{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"]}}},om=async e=>new Promise(t=>{let{command:n,args:r}=pb();try{let o=mb(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(i(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?u("Copied to clipboard",null):i(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(i(`Clipboard tool not available (${n})`))}});var eo=async(e,t)=>{if(!e.trim())return i(`Nothing to copy: ${t} is empty`);let n=await om(e);return d(n)?n:u(`Copied ${t} to clipboard`,null)},sm=async e=>{let{breadCrumb:t,selectedNode:n}=h(),r=Ur({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return i("Nothing selected to copy from");switch(e.modifier){case Ne.REF:return eo(V(o.id),"ref");case Ne.TITLE:return eo(o.title,"title");case Ne.DESCRIPTION:return r?eo(r.props?.description??"","description"):i("No issue in scope");case Ne.TAGS:{if(!r)return i("No issue in scope");let s=an(r).map(({name:a})=>a);return eo(s.join(", "),"tags")}case Ne.ASSIGNEES:{if(!r)return i("No issue in scope");let s=dn(r).map(({name:a})=>a);return eo(s.join(", "),"assignees")}default:return i("Yank one of: ref, title, description, tags, assignees")}};var im=async()=>{K(""),N({mode:y.DEFAULT});let e=Qe();if(d(e))return i(e.message);if(e.value.syncStatus.status==="syncing")return i("Sync already in progress");N({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Xo();return d(t)?(N({syncStatus:{msg:t.message,status:"failed"}}),t):(N({mode:y.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var fb=e=>e.action==="add.issue.comment",am=()=>{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)}))},Yt=async()=>{let e=await Rt();return d(e)?e:u("Resolved persist root",e.value)},Ds=[{systemOnly:!0,intent:B.Move,description:"Internal move-state command",mode:y.COMMAND_LINE,action:Ku},{intent:B.Delete,description:"Delete the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to resolve child to delete");let o=await Yt();if(d(o))return o;if(r.context==="COMMENT"){let s=r.id,a=M(t)?t.id:t.parentNodeId;if(!a)return i("Unable to resolve comment issue");let c=h().nodes[a];if(!c||!M(c))return i("Unable to resolve comment issue");let l=c.log?.filter(fb).find(m=>m.payload.id===s);return l?l.payload.author!==e.value.userId?i("You can only delete your own comments"):O([{id:Ke(),action:"delete.issue.comment",payload:{id:s,issue:a},...e.value}],o.value):i("Unable to resolve comment")}return O([{id:Ke(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:y.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=te().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(a=>ve(b.FILTER).map(c=>c.split(n)[0]).includes(a))(r))return i("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return ue(a=>({...a,filters:e==="clear"?[]:[...a.filters,s],mode:y.DEFAULT})),u("Filter updated",null)}},{intent:B.ViewHelp,description:"Open the help screen",mode:y.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return fn({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),N({mode:y.HELP}),u("Viewing help",null)}},{intent:B.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to close issue, no target found");if(!M(r))return i("Cannot close in this context");let o=h().nodes[Ce];if(!o)return i("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return i("Issue is already closed");let s=await Yt();if(d(s))return s;let a=s.value,c=rn(o.id,r.id,{at:"end"},e.value,a);if(d(c))return c;let l=O([{id:Ke(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value}],a);return d(l)?l:u("Issue closed",null)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to reopen issue, no target found");let o=r.context==="TICKET"?u("Resolved ticket",r):Xt(r.id,"TICKET");if(d(o))return i("Cannot reopen in this context");let s=o.value,a=h().nodes[Ce];if(!a)return i("Unable to locate closed swimlane");if(s.parentNodeId!==a.id)return i("Issue is not closed");if(!M(s))return i("Target node is not issue");let c=Ss(s);if(!c)return i("Unable to resolve previous parent from issue history");if(c===a.id)return i("Previous parent resolves to closed swimlane");let l=h().nodes[c];if(!l)return i("Previous parent no longer exists");let m=await Yt();if(d(m))return m;let p=m.value,f=rn(l.id,s.id,{at:"end"},e.value,p);if(d(f))return f;let g=O([{id:Ke(),action:"reopen.issue",payload:{id:s.id,parent:l.id,rank:f.value},...e.value}],p);return d(g)?g:u("Issue reopened",null)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Init,description:"Initialize Epiq in the current git repository",mode:y.COMMAND_LINE,action:ju},{intent:B.OpenProject,description:"Open a recently used epiq project, by number or path",mode:y.COMMAND_LINE,action:Xu,onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.NewItem,description:"Create a new board, swimlane, or issue",mode:y.COMMAND_LINE,action:zu,onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Rename,description:"Rename the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Missing node");if(r.readonly)return i("Cannot rename readonly node");let o=ms();if(!o)return i("Provide a title");let s=await Yt();return d(s)?s:O([{id:Ke(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.UntagTicket,description:"Remove a tag from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=te().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let o=S.findTagByName(r);if(!o)return i(`Tag "${r}" does not exist`);let{selectedNode:s}=h();if(!s)return i("Invalid untag target");let a=Xt(s.id,"TICKET");if(d(a))return i("Unable to untag issue in this context");let c=a.value;if(!M(c))return i("Target node is not issue");if(!(c.props.tags??[]).includes(o.id))return i("Issue is not tagged with that tag");let m=await Yt();return d(m)?m:O([{id:Ke(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}],m.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.TagTicket,description:"Add or create a tag on the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=te().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let{selectedNode:o}=h();if(!o)return i("Invalid tag target");let s=Xt(o.id,"TICKET");if(d(s))return i("Unable to tag issue in this context");let a=s.value;if(!M(a))return i("Target node is not issue");let c=await Yt();if(d(c))return c;let l=S.findTagByName(r),m=l?.id??Ke();return(a.props.tags??[]).includes(m)?i("Already tagged with that tag"):O([...l?[]:[{id:Ke(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:Ke(),action:"add.issue.tag",payload:{id:a.id,tag:m},...e.value}],c.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.AssignUserToTicket,description:"Assign a user to the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=te().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return i("Provide an assignee");let{selectedIndex:a,contextNode:c}=h(),l=J(c.id)[a];if(!l)return i("Invalid assign target");let m=Xt(l.id,"TICKET");if(d(m))return i("Unable to assign issue in this context");let p=m.value;if(!M(p))return i("Target node is not issue");let f=await Yt();if(d(f))return f;let g=am(),I=!o&&s.toLowerCase()==="me",E,C;if(I)E=e.value.userId,C=g.find(L=>L.id===E)?.name??e.value.userName;else{let L=g.filter(G=>G.name===s);if(L.length>1)return i(`"${s}" matches ${L.length} contributors (${L.map(G=>G.id).join(", ")}). Assign from the GUI to choose by id.`);let j=L[0];if(!j&&!o)return i(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);E=j?.id??Ke(),C=j?.name??s}if((p.props.assignees??[]).includes(E))return i("Assignee already assigned");let w=!!h().contributors[E];return O([...w?[]:[{id:Ke(),action:"create.contributor",payload:{id:E,name:C},...e.value}],{id:Ke(),action:"add.issue.assignee",payload:{id:p.id,assignee:E},...e.value}],f.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=te().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee to remove");let{selectedNode:o}=h();if(!o)return i("Invalid unassign target");let s=Xt(o.id,"TICKET");if(d(s))return i("Unable to unassign in this context");let a=s.value;if(!M(a))return i("Target node is not issue");let c=a.props.assignees??[],l=r.toLowerCase()==="me",m=l?c.filter(g=>g===e.value.userId):am().filter(g=>g.name===r&&c.includes(g.id)).map(g=>g.id);if(m.length>1)return i(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return i(l?"Issue is not assigned to you":`Issue is not assigned to "${r}"`);let f=await Yt();return d(f)?f:O([{id:Ke(),action:"remove.issue.assignee",payload:{id:a.id,assignee:p},...e.value}],f.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Comment,description:"Add a comment to the selected issue",mode:y.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return i("Provide a comment");if(n.length>4e3)return i(`Cannot exceed ${4e3} characters`);let r=he();if(d(r))return i("Unable to resolve user ID");let{breadCrumb:o,selectedNode:s}=h(),a=ze([...o,s],"TICKET");if(d(a))return i("Edit target must be an issue");let c=a.value;if(!c)return i("Invalid comment target");let l=c.context==="TICKET"?u("Resolved ticket",c):Xt(c.id,"TICKET");if(d(l))return i("Unable to comment on issue in this context");let m=l.value;if(!M(m))return i("Target node is not issue");let p=await Yt();return d(p)?p:O([{id:Ke(),action:"add.issue.comment",payload:{id:Ke(),issue:m.id,author:r.value.userId,md:n},...r.value}],p.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Sync,description:"Pull, commit, and push Epiq state",mode:y.COMMAND_LINE,action:im},{intent:B.Peek,description:"View board state at another point in time",mode:y.COMMAND_LINE,action:Zu},{intent:B.Replay,description:"Replay board history forward from a point in time",mode:y.COMMAND_LINE,action:em},{intent:B.Export,description:"Export the current board layout to markdown",mode:y.COMMAND_LINE,action:async()=>{let e=await Tu();return d(e)?e:(N({mode:y.DEFAULT}),u("Export successful",!0))}},{intent:B.Exit,description:"Exit the application",mode:y.COMMAND_LINE,action:async()=>(k.exit(),u("Exit successful",!0))},{intent:B.Edit,description:"Edit title or description",mode:y.COMMAND_LINE,action:async(e,t)=>Ou(t),onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:y.COMMAND_LINE,action:async(e,t)=>sm(t),onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:y.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case pe.USERNAME:{if(process.env[Gn])return i(`Cannot change the configured user while ${Gn} names this process`);let r=qn();if(d(r))return r;let{userId:o,preferredEditor:s,userName:a}=r.value,c=n||a,l=o||Ke();if(!c||!l)return i("Unable to resolve user name or id");let m=at({userName:c,userId:l,preferredEditor:s??""});return d(m)?m:(je({userName:c,userId:l}),N({mode:y.DEFAULT}),u(`Username set to "${c}"`,null))}case pe.EDITOR:{if(!n)return i("No editor provided");let r=at({preferredEditor:n});return d(r)?r:(je({preferredEditor:n}),N({mode:y.DEFAULT}),u(`Editor configuration set to "${n}"`,null))}case pe.VIEW:{if(n!=="wide"&&n!=="dense")return i("Invalid view mode");let r=at({viewMode:n});return d(r)?r:(je({viewMode:n}),N({mode:y.DEFAULT}),u(`View set to "${n}"`,null))}case pe.AUTOSYNC:return nm();case pe.LOG_LEVEL:return rm();case pe.SYNC_DEBOUNCE_MS:return tm();case pe.ATTACHMENT_MAX_KB:return Sl();default:return i("Unknown config command")}}},{intent:B.Coffee,description:"Sponsor the development of Epiq!",mode:y.COMMAND_LINE,action:()=>{let e=te().commandMeta.modifier;return e==="custom"?Qr("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):Qr(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),K(""),u("Thanks you!",null)}}];var gb=new Set(["peek","replay","filter","view-help","yank"]),Ot=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=te();if(!t)return i("No command to confirm");if(!e&&n===Dt.Invalid)return i("Invalid command");let s=ps(t);Wl();let{readOnly:a}=h();if(a&&!gb.has(s))return Wr({status:Qt.Fail,message:"Command not available in readonly state",value:null});let c=Ds.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return Wr({status:Qt.Fail,message:"Command not found",value:null});let l;try{l=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return Wr({status:Qt.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(l)?Wr(l):(Gl({addToHistory:!e}),c.onSuccess?.(),Q().autoSync&&Jo(),l)};var Bs=[{intent:x.Exit,mode:y.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(N({mode:y.COMMAND_LINE}),K("move cancel"),Ot({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:y.DEFAULT,description:"[m] move (init/confirm)",action:()=>(N({mode:y.COMMAND_LINE}),K("move start"),Ot({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:y.MOVE,action:()=>(N({mode:y.COMMAND_LINE}),K("move confirm"),Ot({isForceExecutedBySystem:!0}))}],Fs=[{intent:x.MovePreviousItem,mode:y.MOVE,action:()=>gn()?(N({mode:y.COMMAND_LINE}),K("move previous"),Ot({isForceExecutedBySystem:!0})):i("No pending move")},{intent:x.MoveNextItem,mode:y.MOVE,action:()=>gn()?(N({mode:y.COMMAND_LINE}),K("move next"),Ot({isForceExecutedBySystem:!0})):i("No pending move")}],dm=[{intent:x.MoveToNextContainer,mode:y.MOVE,action:()=>gn()?(N({mode:y.COMMAND_LINE}),K("move to-next"),Ot({isForceExecutedBySystem:!0})):i("No pending move")},{intent:x.MoveToPreviousContainer,mode:y.MOVE,action:()=>gn()?(N({mode:y.COMMAND_LINE}),K("move to-previous"),Ot({isForceExecutedBySystem:!0})):i("No pending move")}];var cm={[F.WORKSPACE]:[...Bs,...Fs],[F.BOARD]:[...Bs,...Fs],[F.SWIMLANE]:[...Bs,...Fs,...dm],[F.TICKET]:[],[F.FIELD]:[],[F.FIELD_LIST]:[],[F.TEXT]:[],[F.COMMENT]:[]};import hb from"node:fs";import vb from"node:path";var lm=e=>{let t=_e(process.cwd());if(d(t))return i("Unable to resolve project root");let n=Se({repoRoot:t.value});if(d(n))return i(n.message);let r=er(e.hash,e.ext),o=vb.join(Cr(n.value),r);return hb.existsSync(o)?(Qr(o),u(`Opened ${e.name}`,null)):i("Attachment file not found \u2014 run :sync to fetch it")};var um=()=>{K("");let{pendingNavTarget:e}=pn();N({mode:y.DEFAULT}),e&&k.navigate(e),fn({pendingNavTarget:void 0})},mm=[{intent:x.ExitCommandLine,mode:y.HELP,action:()=>(um(),u("Exiting help",null))},{intent:x.Exit,mode:y.HELP,action:()=>(um(),u("Closed help",null))},{intent:x.NavPreviousItem,mode:y.HELP,description:"[arrows/hjkl] navigate",action:()=>(k.navigateToPreviousItem(),u("Navigating to previous help item",null))},{intent:x.NavNextItem,mode:y.HELP,action:()=>(k.navigateToNextItem(),u("Navigating to next help item",null))},{intent:x.NavToPreviousContainer,mode:y.HELP,action:()=>(k.navigateToPreviousContainer(),u("Navigating to previous help container",null))},{intent:x.NavToNextContainer,mode:y.HELP,action:()=>(k.navigateToNextContainer(),u("Navigating to next help container",null))}];var yb=e=>{N({mode:y.COMMAND_LINE});let{pendingNavTarget:t}=pn();t&&k.navigate(t),fn({pendingNavTarget:void 0}),K(`${e} `)},pm=()=>{K("");let{pendingNavTarget:e}=pn();e&&k.navigate(e),fn({pendingNavTarget:void 0}),N({mode:y.DEFAULT})},fm=[{intent:x.InitCommandPalette,mode:y.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{K("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return fn({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),N({mode:y.PALETTE}),u("Opening command palette",null)}},{intent:x.Confirm,mode:y.PALETTE,action:()=>{let{selectedNode:e}=h();if(!e||!tn(e))return i("Command only applicable on text nodes");if(e.props.disabled)return i("Command is not available in this context");let t=e.title;return t?(yb(t),u("Selected command",t)):u("No command selected",null)}},{intent:x.ExitCommandLine,mode:y.PALETTE,action:()=>(pm(),u("Exiting palette",null))},{intent:x.Exit,mode:y.PALETTE,action:()=>(pm(),u("Closed command palette",null))},{intent:x.NavPreviousItem,mode:y.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(k.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:x.NavNextItem,mode:y.PALETTE,action:()=>(k.navigateToNextItem(),u("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:y.PALETTE,action:()=>(k.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:y.PALETTE,action:()=>(k.navigateToNextContainer(),u("Navigating to next container",null))}];var gm=[...mm,...fm,{intent:x.AddItem,mode:y.DEFAULT,description:"[n] new...",action:()=>(N({mode:y.COMMAND_LINE}),K(`${b.NEW} `),u("Adding new item",null))},{intent:x.Delete,mode:y.DEFAULT,description:"[d] delete",action:()=>(N({mode:y.COMMAND_LINE}),K(`${b.DELETE} `),u("Deleting item",null))},{intent:x.InitCommandLine,mode:y.DEFAULT,description:"[:] focus command line",action:()=>(N({mode:y.COMMAND_LINE}),K(""),u("Entering command line mode",null))},{intent:x.Confirm,mode:y.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=h();if(!Z(e?.id??"")?.length){let r=e?S.getAttachment(e.id):void 0;if(r)return lm(r);if(e?.title===ce.DESCRIPTION)return N({mode:y.COMMAND_LINE}),K(`${b.EDIT} description `),u("Propose command",!0);if(e?.title===ce.ASSIGNEES)return N({mode:y.COMMAND_LINE}),K(`${b.ASSIGN} `),u("Propose command",!0);if(e?.title===ce.TAGS)return N({mode:y.COMMAND_LINE}),K(`${b.TAG} `),u("Propose command",!0);if(t.title===ce.DESCRIPTION&&e?.context==="TEXT")return N({mode:y.COMMAND_LINE}),K(`${b.EDIT} description `),u("Propose command",!0)}return k.enterChildNode(),u("Entering context",null)}},{intent:x.Yank,mode:y.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=h(),t=e?.title===ce.DESCRIPTION?Ne.DESCRIPTION:e?.title===ce.TAGS?Ne.TAGS:e?.title===ce.ASSIGNEES?Ne.ASSIGNEES:Ne.REF,r=ve(b.YANK).includes(t)?t:Ne.REF;return N({mode:y.COMMAND_LINE}),K(`${b.YANK} ${r}`),u("Propose command",!0)}},{intent:x.EditTitle,mode:y.DEFAULT,description:"[r] rename title",action:()=>(N({mode:y.COMMAND_LINE}),K(`${b.EDIT} title ${h().selectedNode?.title}`),u("Exiting context",null))},{intent:x.EditDescription,mode:y.DEFAULT,description:"[e] edit description",action:()=>(N({mode:y.COMMAND_LINE}),K(`${b.EDIT} description `),u("Exiting context",null))},{intent:x.Exit,mode:y.DEFAULT,description:"[q] exit context",action:()=>(k.enterParentNode(),u("Exiting context",null))},{intent:x.NavPreviousItem,mode:y.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(k.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:x.NavNextItem,mode:y.DEFAULT,action:()=>(k.navigateToNextItem(),u("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:y.DEFAULT,action:()=>(k.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:y.DEFAULT,action:()=>(k.navigateToNextContainer(),u("Navigating to next container",null))}];var bb=500,xb=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),hm=e=>{let t=xb(e);t&&us(n=>(n+t).slice(0,bb))};var Ib=[y.COMMAND_LINE,y.PALETTE],Eb=e=>[{intent:x.MoveCursorLeft,mode:e,action:()=>(pa(-1),u("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:e,action:()=>(pa(1),u("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:e,action:()=>(fa("left"),u("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:e,action:()=>(fa("right"),u("Moving cursor right of word",null))},{intent:x.AutoCompleteCommand,mode:e,action:()=>(us((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:x.CaptureInput,mode:e,action:(t,{sequence:n})=>(hm(n??""),u("Capturing input",null))},{intent:x.EraseInput,mode:e,action:()=>($l(),u("Erasing input",null))},{intent:x.EraseInputWord,mode:e,action:()=>(Hl(),u("Erasing input word",null))}],vm=[{intent:x.Confirm,mode:y.COMMAND_LINE,action:()=>(Ot(),u("Executing command",null))},{intent:x.ViewHelp,mode:y.DEFAULT,action:()=>(N({mode:y.HELP}),u("Viewing help",null))},...Ib.flatMap(Eb),{intent:x.ExitCommandLine,mode:y.COMMAND_LINE,action:()=>(N({mode:y.DEFAULT}),u("Exiting command line",null))},{intent:x.GetLastCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(Vl(),u("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(Kl(),u("Getting next command from history",null))}];import xm from"chalk";var Os=xm.dim.hex(v.secondary2)(": for command line"),ym="q to exit",bm=`${xm.hex(v.accent)("m")} to confirm`,Ua={[F.WORKSPACE]:[Os],[F.BOARD]:[Os],[F.BOARD+y.COMMAND_LINE]:[Os],[F.SWIMLANE]:[Os],[F.TICKET+y.HELP]:[ym],[F.SWIMLANE+y.HELP]:[ym],[F.TICKET]:[],[F.FIELD]:[],[F.SWIMLANE+y.MOVE]:[bm],[F.TICKET+y.MOVE]:[bm]};var dr=e=>e.trim().toLocaleLowerCase(),_a=(e,t)=>dr(e).includes(dr(t));var Sb=e=>{let{tags:t}=h();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},Cb=e=>{let{contributors:t}=h();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},Im=(e,t)=>{let n=dr(t.value);if(!n)return!0;switch(t.target){case"title":return _a(e.title??"",n);case"description":return _a(e.props.description??"",n);case"tag":return Sb(e).map(dr).some(o=>o.includes(n));case"assignee":return Cb(e).map(dr).some(o=>o.includes(n));case"ref":return Lo(e.id,t.value);default:return!0}};function Em(e,t,n){let r=t[e];if(!r)return i("buildBreadCrumb(): current node not found");let o=[],s=r;for(;s&&(o.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?i("buildBreadCrumb(): node is not connected to root"):(o.reverse(),u("Breadcrumb built",o))}var Sm=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 Jt,ja,$a=new Set,Ha=()=>{for(let e of $a)e()},Rb=e=>($a.add(e),()=>$a.delete(e));function Wa(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return i("derive(): contextNodeId is missing");if(!r)return i("derive(): rootNode is missing");if(!o[r])return i("derive(): unable to find root node");let c=o[t];if(!c)return i("Unable to derive state, contextNode not found");let l=Em(t,o,r);if(d(l))return logger.error(l.message),l;let m=l.value,{context:p}=c,f=Ua[p+n]??Ua[p]??[],g=[...gm,...cm[p]??[],...vm],I=Sm(g),E=Ab(o,s),C=E[t]?.[e.selectedIndex]??null;return u("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:f,availableActions:g,actionIndex:I,selectedNode:C,renderedChildrenIndex:E})}var h=()=>{if(!Jt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Jt},Qe=()=>Jt?u("Retrieved state",Jt):i("State not initialized. Call initWorkspaceState() first.");function Pr(e){ja=e;let t=_e(process.cwd()),n=!1;if(!d(t)){let s=Ct(t.value);if(d(s))return i(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:y.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=Wa(r);return d(o)?o:(Jt=o.value,Ha(),u("State initialized",null))}var to=!1,Us=null;function ue(e){let t=h(),n=e(t);if(to)return Us=n,Jt={...t,...n},u("State updated",null);let r=Wa(n);return d(r)?i(r.message??"Unable to update state"):(Jt=r.value,Ha(),u("State updated",null))}function pc(e){if(to)return u("Joined batch",e());to=!0,Us=null;let t=()=>{let n=Us;if(to=!1,Us=null,n===null)return null;let r=Wa(n);return d(r)?i(r.message??"Unable to update state"):(Jt=r.value,Ha(),u("State updated",null))};try{let n=e(),r=t();return r&&d(r)?i(r.message):u("State updated",n)}finally{to&&t()}}var N=e=>ue(t=>({...t,...e}));var z=()=>Nb(Rb,h,h),Ab=(e,t)=>{let n={};for(let r of Object.values(e))M(r)&&t.length>0&&!t.every(o=>Im(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,s)=>{let a=e[o.id],c=e[s.id];return!a||!c?0:a.rank.localeCompare(c.rank)});return n},J=e=>h()?.renderedChildrenIndex[e]??[],It=()=>ja?Pr(ja):i("Cannot reset state: no initial workspace found"),wt=()=>Jt!==void 0;var Xt=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r)return i("Node not found");if(r.context===t)return u("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return u("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},Ga=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},hn=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:i("Node not found"),S={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.userId&&n.userId!==t)return i("Contributor is already linked to another user");let r={...n,userId:t},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?i("Unable to link contributor to user"):u("Linked contributor to user",r)},deleteNode(e){ue(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create comment, missing issue");if(!M(t))return i("Can only comment on issues");let n=ue(r=>({...r,comments:{...r.comments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?i("Unable to create comment"):u("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return i("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return i("Unable to edit comment, missing issue");if(!M(r))return i("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=ue(a=>({...a,comments:{...a.comments??{},[e]:o}}));return d(s)?i("Unable to edit comment"):u("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return i("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=ue(o=>({...o,comments:{...o.comments??{},[e]:n}}));return d(r)?i("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)},createAttachment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create attachment, missing issue");if(!M(t))return i("Can only attach to issues");let n=ue(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?i("Unable to create attachment"):u("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return i("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=ue(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return d(r)?i("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)},editValue(e,t){let{nodes:n}=h(),r=n[e];if(!r)return i("Edit target node not found");let o=hn(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 i("Rename target node not found");let r=hn(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 Z(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 i("Node not found");if(!s)return i("Target parent not found");if(r===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let a=hn(o,"move");if(a)return a;if(Ga(t,e))return i("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),u("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=h(),o=this.getNode(e);if(!o)return i("Node not found");if(r===e)return i("Cannot delete root node");let s=hn(o,"delete");if(s)return s;let a=new Set,c=m=>{let p=t[m];if(!(!p||a.has(m))){a.add(m);for(let f of Z(p.id))c(f.id)}};c(e);let l={...structuredClone(t)};for(let m of a){if(!l[m])return i("Unable to locate node to delete");l[m]={...l[m],isDeleted:!0}}return n?(N({nodes:l}),u("Successfully tomb stoned",o)):i("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return i("Contributor not found");let n={...t,name:Mo,tombstoned:!0},r=ue(o=>({...o,contributors:{...o.contributors,[e]:n}}));return d(r)?i("Unable to remove contributor"):u("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.tombstoned)return i("Cannot rename a removed contributor");let r={...n,name:t},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?i("Unable to rename contributor"):u("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");let r={...n,name:t,tombstoned:!1},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?i("Unable to restore contributor"):u("Restored contributor",r)},createContributor(e){let t=ue(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?i("Unable to create contributor"):u("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return i("Unable to assign contributor, missing contributor");if(!r)return i("Unable to assign contributor, missing target");let o=hn(r,"edit");if(o)return o;if(!M(r))return i("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return i("Contributor already assigned");let a={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(a),u("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!r)return i("Unable to unassign, missing target");let o=hn(r,"edit");if(o)return o;if(!M(r))return i("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 a={...r,props:{...r.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(a),u("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return i("Unable to add tag, missing tag");if(!r)return i("Unable to add tag, missing target");let o=hn(r,"edit");if(o)return o;if(!M(r))return i("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return i("Tag already assigned");let a={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(a),u("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),r=this.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!r)return i("Unable to remove tag, missing target");let o=hn(r,"edit");if(o)return o;if(!M(r))return i("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 a={...r,props:{...r.props,tags:s.filter(c=>c!==t)}};return this.updateNode(a),u("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return i("Tag not found");let n={...t,tombstoned:!0},r=ue(o=>({...o,tags:{...o.tags,[e]:n}}));return d(r)?i("Unable to delete tag"):u("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return i("Tag not found");let r={...n,name:t,tombstoned:!1},o=ue(s=>({...s,tags:{...s.tags,[e]:r}}));return d(o)?i("Unable to restore tag"):u("Restored tag",r)},createTag(e){let t=ue(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?i("Could not create tag"):u("Tag created",e)},createNode(e){let t=ue(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?i("Unable to create node"):u("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},r=ue(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?i(r.message):u("Locked node",n)},updateNode(e){let t=ue(n=>({...n,nodes:{...n.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 Z(e)}};var wb=(e,t)=>e+" ".repeat(Math.max(0,t-Cm(e))),Mb=(e,t)=>" ".repeat(Math.max(0,t-Cm(e)))+e,_s=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`),Pb=(e,t)=>t?e<t?"up":e>t?"down":null:null,Lb=(e,t)=>{let n=S.getNode(e.payload.parent),r=n?vn.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=Pb(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},Nm=e=>`${Math.max(1,Math.round(e/1024))} KB`,Rm=e=>S.getAttachment(e)?.name??"",kb=e=>{switch(e.action){case"add.issue.tag":{let t=h().tags[e.payload.tag];return t?vn.bgHex(oe(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=h().tags[e.payload.tag];return t?vn.bgHex(oe(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?vn.hex(oe(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?vn.hex(oe(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}" ${vn.dim(`(${Nm(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Rm(e.payload.id);return t?`"${t}"`:""}default:return""}},Db=e=>{let t=ir(Tb(e));return vn.gray(Mb(t,8))},Bb=12,Fb=e=>wb(`${e}`,Bb),Ob=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=S.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${Nm(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Rm(e.payload.id);return t?`"${t}"`:""}default:return""}},ks=e=>[_s(e.action),Ob(e)].filter(Boolean).join(" "),Am=(e,t)=>{let n=Db(e.id),r=Fb(e.userName),o=vn.dim("\u203A"),s=e.action==="move.node"?Lb(e,t):[_s(e.action),kb(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var Ub=e=>we(e,"comments"),_b=e=>we(e,"description"),jb=e=>we(e,"assignees"),$b=e=>we(e,"tags"),Hb=e=>we(e,"history"),Wb=e=>we(e,"attachments"),js=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:a="horizontal"})=>{let c=S.getNode(e);if(!c){let p=S.createNode({...le.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:a});return d(p)?p:u("Virtual field created",void 0)}if(!tt(c))return i(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==r||c.props.value!==o||c.readonly!==s||c.childRenderAxis!==a))return u("Virtual field unchanged",void 0);let m=S.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:a});return d(m)?m:u("Virtual field updated",void 0)},Tm=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let a=S.getNode(e);if(!a){let m=S.createNode({...le.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(!Ar(a))return i(`Existing virtual node ${e} is not a field list`);if(!(a.title!==t||a.parentNodeId!==n||a.rank!==r||a.readonly!==o||a.childRenderAxis!==s))return u("Virtual field list unchanged",void 0);let l=S.updateNode({...a,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return d(l)?l:u("Virtual field list updated",void 0)},fc=e=>{let t=nt(gt/4n),n=nt(gt/2n),r=nt(gt*3n/4n),o=nt(gt*7n/8n),s=nt(gt*15n/16n),a=nt(gt*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(a))return a;let c=js({id:_b(e.id),name:ce.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(c))return c;let l=Tm({id:jb(e.id),name:ce.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(l))return l;let m=Tm({id:$b(e.id),name:ce.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(d(m))return m;let p=js({id:Ub(e.id),name:ce.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(p))return p;let f=js({id:Wb(e.id),name:ce.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(d(f))return f;let g=js({id:Hb(e.id),name:ce.HISTORY,parentNodeId:e.id,rank:a.value,value:Gb(e),readonly:!0,childRenderAxis:"vertical"});return d(g)?g:u("Ticket virtual nodes materialized",void 0)},Gb=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=>Am(r,n.get(r.action)??[])).join(`
|
|
72
|
-
`)},
|
|
73
|
-
`),[m,p,f,...g]=(c??"").split(no);if(!m||!p)return null;let I=l.join(" "),E=Number(/(\d+) insertion/.exec(I)?.[1]??0),C=Number(/(\d+) deletion/.exec(I)?.[1]??0);return{sha:m,time:Number(p)*1e3,author:f??"unknown",subject:g.join(no),linesChanged:E+C,insertions:E,deletions:C}}).filter(a=>a!==null).filter(a=>(e.start===void 0||a.time>=e.start)&&(e.end===void 0||a.time<=e.end));return r&&(cr={repoRoot:t.value,stateBranch:n.value.stateBranch,fetchedAt:Date.now(),result:s}),u("Computed commit timeline",s)},
|
|
74
|
-
`).map(o=>o.trim()).filter(Boolean);return r.length===0?i("No changed files found for this commit"):u("Listed changed files",r)},
|
|
75
|
-
`).filter(a=>a!==""),o=r.filter(a=>!Um.test(a));if(o.length>0)return i(`Could not parse ${o.length} line(s) of "git diff --raw" output, e.g. "${o[0]}"`);let s=r.map(a=>{let c=Um.exec(a),l=c?.[1]??"",m=c?.[2]??"";return{path:c?.[3]??"",beforeBlob:Om(l)?null:l,afterBlob:Om(m)?null:m}});return s.length===0?i("No changed files found for this commit"):u("Listed changed files with blob hashes",s)},Vm=async e=>{if(!Wm(e.sha))return i("Invalid commit sha");let t=Hs(e.repoRoot);if(d(t))return i(t.message);let n=t.value,r=await nx(n,e.sha);if(d(r))return i(r.message);let o=r.value;if(o.length>tx)return i(`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)),a=await Nd(s,n);if(d(a))return i(a.message);let c=a.value,l=o.map(m=>({path:m.path,before:m.beforeBlob?c.get(m.beforeBlob)??"":"",after:m.afterBlob?c.get(m.afterBlob)??"":""}));return u("Loaded commit diff",{sha:e.sha,files:l})},Km=e=>{let t=Mn(e);if(d(t))return i(t.message);let n=It();if(d(n))return i(n.message);$s=null;let r=vt(t.value),{fatal:o,skipped:s}=$t(r);return o.length>0?i(o.map(a=>a.message).join(", ")):(Ht(s),N({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Restored live state",!0))},rx=(e,t)=>{$s=null;let n=Km(e);return d(n)?i(`${t} (recovery to live also failed: ${n.message})`):i(t)},zm=e=>yn(async()=>{let t=za(e.repoRoot);if(d(t))return i(t.message);let n=Oo(t.value,e.targetTime);if(d(n))return i(n.message);let{appliedEvents:r,unappliedEvents:o}=n.value,s=It();if(d(s))return s;let a=vt(r),{fatal:c,skipped:l}=$t(a);return c.length>0?rx(t.value,c.map(m=>m.message).join(", ")):(Ht(l),N({readOnly:!0,timeMode:"peek",unappliedEvents:o,replay:null}),$s=e.targetTime,u("Checked out historical state",{asOfTime:e.targetTime}))}),qm=(e={})=>yn(async()=>{let t=za(e.repoRoot);if(d(t))return i(t.message);let n=Km(t.value);return d(n)?i(n.message):u("Returned to live state",!0)});var Xa=()=>{let e=At();return d(e)?kt:e.value.attachmentMaxKb??kt},Gs=e=>{let t=_e(e??process.cwd());return d(t)?i(t.message):u("Resolved Epiq repo root",t.value)},fe=async(e,t)=>{let n=Gs(e);if(d(n))return n;let r=Se({repoRoot:n.value});if(d(r))return i(r.message);let o=Zt(n.value);if(d(o))return i(o.message);let s=await Yi({repoRoot:n.value,stateBranchName:o.value});if(d(s))return i(s.message);let a=await Dn({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(d(a))return i(a.message);if(t?.pull??!1){let m=await _({cwd:r.value,args:["pull","--ff-only"]});d(m)&&Y.info(3,m.message)}let c=Wt(r.value);if(d(c))return i(c.message);let l=Gt(c.value.events,c.value.unreadable);return d(l)?i(l.message):u("Booted Epiq state",{repoRoot:n.value,stateBranchRoot:r.value})},ge=()=>{let e=At();return d(e)?i(e.message):e.value.userId?e.value.userName?u("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},ye=()=>{let e=Qe();return d(e)?i(e.message):e},tp=e=>(e.props.tags??[]).map(t=>S.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:oe(t.name)})),ox=()=>{let e=Qe(),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},np=(e,t)=>{let n=new Map(e);for(let r of Object.values(t))n.set(r.id,r.name);return n},rp=e=>(e.props.assignees??[]).map(t=>S.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:oe(n)}));var op=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ye();if(d(n))return n;let r=n.value.nodes,o=Object.values(r).filter(M).filter(s=>!s.isDeleted).filter(s=>e.includeClosed||s.parentNodeId!==Ce).filter(s=>e.boardId?(s.parentNodeId?r[s.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(s=>({id:s.id,ref:V(s.id),title:qe(s.title),description:s.props.description??"",createdAt:ro(s.id),parentNodeId:s.parentNodeId,isClosed:s.parentNodeId===Ce,readonly:!!s.readonly,tags:tp(s),assignees:rp(s)}));return u("Listed issues",o)},sp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=qe(e.title);if(!o)return i("Issue title cannot be empty");let s=e.description??"",a=yt("Issue title",o,300)??yt("Issue description",s,1e5);if(a)return i(a);if((e.tagNames?.length??0)>20)return i(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return i(`Cannot set more than ${20} assignees at once`);let c=kn(e.parentId,n.value,t.value.stateBranchRoot);if(d(c))return c;let l=As({name:o,parent:e.parentId,user:n.value,rank:c.value});if(d(l))return l;let m=[...l.value],p=m.find(E=>E.action==="add.issue")?.payload.id;if(!p)return i("Unable to determine created issue id");s&&m.push({id:W(),...n.value,action:"edit.description",payload:{id:p,md:s}});let f=[];for(let E of e.tagNames??[]){let C=qe(E).trim();if(!C||f.some(j=>j.name===C))continue;let A=yt("Tag name",C,60);if(A)return i(A);let w=S.findTagByName(C),L=w?.id??W();w||m.push({id:W(),...n.value,action:"create.tag",payload:{id:L,name:C}}),m.push({id:W(),...n.value,action:"add.issue.tag",payload:{id:p,tag:L}}),f.push({id:L,name:C})}let g=[];for(let E of e.assigneeNames??[]){let C=qe(E).trim();if(!C||g.some(j=>j.name===C))continue;let A=yt("Assignee name",C,80);if(A)return i(A);let w=Object.values(r.value.contributors).find(j=>j.name===C),L=w?.id??W();w||m.push({id:W(),...n.value,action:"create.contributor",payload:{id:L,name:C}}),m.push({id:W(),...n.value,action:"add.issue.assignee",payload:{id:p,assignee:L}}),g.push({id:L,name:C})}let I=O(m,t.value.stateBranchRoot);return d(I)?i(I.message):u("Created issue",{id:p,ref:V(p),title:o,parentId:e.parentId,description:s,tags:f,assignees:g})},ip=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=rn(Ce,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(r))return r;let o={id:W(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:Ce,rank:r.value}},s=O([o],t.value.stateBranchRoot);return d(s)?i(s.message):u("Closed issue",{id:e.issueId,ref:V(e.issueId)})},ap=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Target node is not issue");if(o.parentNodeId!==Ce)return i("Issue is not closed");let s=Ss(o);if(!s)return i("Unable to resolve previous parent from issue history");if(s===Ce)return i("Previous parent resolves to closed swimlane");let a=r.value.nodes[s];if(!a)return i("Previous parent no longer exists");let c=rn(a.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let l={id:W(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:a.id,rank:c.value}},m=O([l],t.value.stateBranchRoot);return d(m)?i(m.message):u("Reopened issue",{id:o.id,ref:V(o.id),parentId:a.id})},dp=async e=>{let t=Gs(e.repoRoot);if(d(t))return t;let n=ge();if(d(n))return n;let r=Se({repoRoot:t.value});if(d(r))return r;let o=Wt(r.value);if(d(o))return o;let s=Gt(o.value.events,o.value.unreadable);if(d(s))return s;let a=rn(e.parentId,e.issueId,e.position??{at:"end"},n.value,r.value);if(d(a))return a;let c={id:W(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:a.value}},l=O([c],r.value);return d(l)?i(l.message):u("Moved issue",{id:e.issueId,ref:V(e.issueId),parentId:e.parentId})},cp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.boardId];if(!o)return i("Board not found");if(!Tr(o))return i("Target parent must be a board");if(o.readonly)return i("Cannot add a swimlane to a readonly board");if(mt().mode!=="live")return i("Cannot add a swimlane while time travelling");let s=qe(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let a=yt("Swimlane title",s,300);if(a)return i(a);let c=kn(e.boardId,n.value,t.value.stateBranchRoot);if(d(c))return c;let l=W(),m={id:W(),...n.value,action:"add.swimlane",payload:{id:l,name:s,parent:e.boardId,rank:c.value}},p=O([m],t.value.stateBranchRoot);return d(p)?i(p.message):u("Created swimlane",{id:l,ref:V(l),title:s,boardId:e.boardId})},lp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!Tt(o))return i("Edit target must be a swimlane");if(o.readonly)return i("Cannot edit readonly swimlane");let s=qe(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let a=yt("Swimlane title",s,300);if(a)return i(a);if(o.title===s)return u("No changes made",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s});let c={id:W(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Edited swimlane title",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s})},up=async e=>{let t=Gs(e.repoRoot);if(d(t))return t;let n=ge();if(d(n))return n;let r=Se({repoRoot:t.value});if(d(r))return r;let o=Wt(r.value);if(d(o))return o;let s=Gt(o.value.events,o.value.unreadable);if(d(s))return s;let a=rn(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(d(a))return a;let c={id:W(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:a.value}},l=O([c],r.value);return d(l)?i(l.message):u("Moved swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId),boardId:e.boardId})},mp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!Tt(o))return i("Delete target must be a swimlane");let s={id:W(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):u("Deleted swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId)})},Vs=async(e={})=>{Wo();let t=Gs(e.repoRoot);if(d(t))return i("Sync failed");let n=ge();if(d(n))return n;let r=await Yo({cwd:t.value,ownEventFileName:Ln(n.value)});return d(r)?(Ki(r.message),r):(Go(),u("Synced",r.value))},pp=e=>{let t=ye();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:ro(r.id),action:r.action,label:ks(r),actor:{id:r.userId,name:r.userName,color:oe(r.userName)}}))):i("Issue not found")};var ur=()=>{let e=ye();if(d(e))return e;let t=mt(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(f=>Tr(f)&&!f.isDeleted),s=new Map,a=new Map;for(let f of r)if(!f.isDeleted){if(Tt(f)&&f.parentNodeId){let g=s.get(f.parentNodeId)??[];g.push(f),s.set(f.parentNodeId,g)}if(M(f)&&f.parentNodeId){let g=a.get(f.parentNodeId)??[];g.push(f),a.set(f.parentNodeId,g)}}let c=At();if(d(c))return c;let l={};for(let f of r.filter(M))f.isDeleted||(l[f.id]=S.getCommentsByIssue(f.id).map(g=>{let I=S.getContributor(g.authorId);return{id:g.id,issueId:g.issue,body:g.md,author:{id:g.authorId,name:I?.name??"Unknown",color:oe(I?.name??g.authorId)},createdAt:ro(g.id)}}));let m=new Map;for(let f of e.value.eventLog)f.action==="add.issue.attachment"&&m.set(f.payload.id,f.payload.author);let p={};for(let f of r.filter(M))f.isDeleted||(p[f.id]=S.getAttachmentsByIssue(f.id).map(g=>({id:g.id,issueId:g.issue,name:g.name,fileName:er(g.hash,g.ext),bytes:g.bytes,createdAt:ro(g.id),canDelete:m.get(g.id)===c.value.userId})));return u("Retrieved Epiq GUI state",{boards:o.sort((f,g)=>f.rank.localeCompare(g.rank)).map(f=>({id:f.id,ref:V(f.id),title:f.title,readonly:!!f.readonly||n,swimlanes:(s.get(f.id)??[]).sort((g,I)=>g.rank.localeCompare(I.rank)).map(g=>({id:g.id,title:g.title,readonly:!!g.readonly||n,issues:(a.get(g.id)??[]).sort((I,E)=>I.rank.localeCompare(E.rank)).map(I=>({id:I.id,ref:V(I.id),title:qe(I.title),description:I.props.description??"",createdAt:ro(I.id),readonly:!!I.readonly||n,tags:tp(I),assignees:rp(I),parentNodeId:I.parentNodeId,isClosed:I.parentNodeId===Ce})),parentNodeId:g.parentNodeId}))})),tags:S.getTags().map(f=>({...f,color:oe(f.name)})),contributors:Object.values(e.value.contributors).map(f=>({...f,color:oe(f.name)})),user:{name:c.value.userName??"",id:c.value.userId??"",color:oe(c.value.userName??"")},commentsByIssueId:l,attachmentsByIssueId:p,attachmentMaxKb:Xa(),timeTravel:t})},Jm=null,sx=e=>{if(e===Jm)return;let t=Zo({root:e});if(d(t)){Y.info(t.message);return}Jm=e},Et=async(e={})=>{if(mt().mode!=="live")return ur();let t=await fe(e.repoRoot,{pull:!1});return d(t)?t:(sx(t.value.repoRoot),ur())},fp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=yt("Issue description",e.description,1e5);if(s)return i(s);let a=o.props.description??"";if(a===e.description)return u("No changes made",{id:e.issueId,ref:V(e.issueId),description:a});let c={id:W(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Edited issue description",{id:e.issueId,ref:V(e.issueId),description:e.description})},gp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=qe(e.title);if(!s.trim())return i("Issue title cannot be empty");let a=yt("Issue title",s,300);if(a)return i(a);if(o.title===s)return u("No changes made",{id:e.issueId,ref:V(e.issueId),title:s});let c={id:W(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Edited issue title",{id:e.issueId,ref:V(e.issueId),title:s})},hp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Tag target must be an issue");if(o.readonly)return i("Cannot tag readonly issue");let s=qe(e.tagName).trim();if(!s)return i("Tag name cannot be empty");let a=yt("Tag name",s,60);if(a)return i(a);let c=S.findTagByName(s),l=c?.id??W(),m=[...c?[]:[{id:W(),...n.value,action:"create.tag",payload:{id:l,name:s}}],{id:W(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:l}}],p=O(m,t.value.stateBranchRoot);return d(p)?i(p.message):u("Added issue tag",{id:e.issueId,ref:V(e.issueId),tag:{id:l,name:s}})},vp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.tags[e.tagId];if(!o)return i("Tag not found");if(o.tombstoned)return i("Tag is already deleted");let s=[{id:W(),...n.value,action:"tombstone.tag",payload:{id:e.tagId}}],a=O(s,t.value.stateBranchRoot);return d(a)?i(a.message):u("Deleted tag",{id:o.id,name:o.name})};var yp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Untag target must be an issue");if(o.readonly)return i("Cannot untag readonly issue");if(!r.value.tags[e.tagId])return i("Tag not found");let s={id:W(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):u("Removed issue tag",{id:e.issueId,ref:V(e.issueId),tagId:e.tagId})},bp=async(e,t)=>{let n=Vi(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}},xp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Assign target must be an issue");if(o.readonly)return i("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let A=r.value.contributors[s],w=A?void 0:await bp(t.value.stateBranchRoot,s);if(!A&&!w)return i("Unknown assignee id");let L=A??w,j=[...A?[]:[{id:W(),...n.value,action:"create.contributor",payload:{id:L.id,name:L.name}}],{id:W(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:L.id}}],G=O(j,t.value.stateBranchRoot);return d(G)?i(G.message):u("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:L.id,name:L.name}})}let a=qe(e.assigneeName??"").trim();if(!a)return i("Provide assigneeId, self or assigneeName");let c=yt("Assignee name",a,80);if(c)return i(c);let m=[...np(ox(),r.value.contributors).entries()].filter(([,A])=>A===a);if(m.length>1)return i(`"${a}" matches ${m.length} contributors (${m.map(([A])=>A).join(", ")}). Assign by assigneeId to choose.`);let p=m[0];if(!p&&!e.createUnlinked)return i(`No contributor named "${a}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[f=W(),g=a]=p??[],E=[...!!r.value.contributors[f]?[]:[{id:W(),...n.value,action:"create.contributor",payload:{id:f,name:g}}],{id:W(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:f}}],C=O(E,t.value.stateBranchRoot);return d(C)?i(C.message):u("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:f,name:g}})},Ip=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;if(!r.value.contributors[e.contributorId])return i("Contributor not found");if(await bp(t.value.stateBranchRoot,e.contributorId))return i("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let a=[{id:W(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],c=O(a,t.value.stateBranchRoot);return d(c)?i(c.message):u("Tombstoned contributor",{id:e.contributorId,name:Mo})};var Ep=async(e={})=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=Mn(t.value.stateBranchRoot);if(d(o))return i(o.message);let s=e.boardId?qa(o.value,e.boardId):o.value,a=new Map,c=new Set,l=new Set,m=Vi(t.value.stateBranchRoot);if(d(m))return i(m.message);for(let I of m.value)I.userId&&l.add(I.userId);for(let I of s)I.userId&&(a.set(I.userId,I.userName??""),c.add(I.userId));let p=r.value.contributors,g=[...np(a,p).entries()].map(([I,E])=>({id:I,name:E,color:oe(E),isSelf:I===n.value.userId,isExternal:!c.has(I),isRemoved:p[I]?.tombstoned===!0,hasAuthoredAnywhere:l.has(I)}));return u("Listed board contributors",g)},Sp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Unassign target must be an issue");if(o.readonly)return i("Cannot unassign readonly issue");if(!r.value.contributors[e.assigneeId])return i("Assignee not found");let s={id:W(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):u("Removed issue assignee",{id:e.issueId,ref:V(e.issueId),assigneeId:e.assigneeId})},Ks=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Comment target must be an issue");if(o.readonly)return i("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return i("Comment cannot be empty");if(s.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let a=W(),c={id:W(),...n.value,action:"add.issue.comment",payload:{id:a,issue:e.issueId,md:s,author:n.value.userId}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Added issue comment",{id:a,issueId:e.issueId,body:s})},zs=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();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 i("Unable to resolve comment");if(o.payload.author!==n.value.userId)return i("You can only delete your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!M(s))return i("Comment target must be an issue");if(s.readonly)return i("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 c={id:W(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},Cp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();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 i("Unable to resolve comment");if(o.payload.author!==n.value.userId)return i("You can only edit your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!M(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot edit comment on readonly issue");if(r.value.eventLog.some(p=>p.action==="delete.issue.comment"&&p.payload.id===e.commentId))return i("Comment was deleted");let c=e.body.trim();if(!c)return i("Comment cannot be empty");if(c.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${c.length})`);let l={id:W(),...n.value,action:"edit.issue.comment",payload:{id:e.commentId,issue:o.payload.issue,md:c}},m=O([l],t.value.stateBranchRoot);return d(m)?i(m.message):u("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:c})},Np=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Attachment target must be an issue");if(o.readonly)return i("Cannot attach to readonly issue");let s=Buffer.from(e.dataBase64??"","base64"),a=Il(t.value.stateBranchRoot,s,Xa());if(d(a))return a;let c=qe(e.name??"").trim()||"image",l=W(),m={id:W(),...n.value,action:"add.issue.attachment",payload:{id:l,issue:e.issueId,author:n.value.userId,hash:a.value.hash,ext:a.value.ext,name:c,bytes:a.value.bytes}},p=O([m],t.value.stateBranchRoot);return d(p)?i(p.message):u("Added issue attachment",{id:l,issueId:e.issueId,fileName:er(a.value.hash,a.value.ext),bytes:a.value.bytes})},Rp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();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 i("Unable to resolve attachment");if(o.payload.author!==n.value.userId)return i("You can only delete your own attachments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!M(s))return i("Attachment target must be an issue");if(s.readonly)return i("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 c={id:W(),...n.value,action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},Ap=async e=>{let t=await fe(e.repoRoot,{pull:!1});return d(t)?t:El(t.value.stateBranchRoot,e.fileName,Xa())};var ix=15e3,Tp=e=>{let t,n=!1,r=!1,o=0,s=()=>{let p=qn();return d(p)?(Y.error(p.message),null):p.value},a=()=>{let p=s();if(!p)return!1;let{autoSync:f,preferredEditor:g}=p,I=At(),E=d(I)?null:I.value.userName;return!!(f&&E&&g)},c=()=>{let p=s()?.autoSyncDebounceMs??ix;return Math.max(0,p-(Date.now()-o))},l=async()=>{if(!(n||r)){r=!0,o=Date.now();try{await yn(async()=>{if(mt().mode!=="live")return;let p=await Vs({repoRoot:e.project.repoRoot});if(d(p))return;let{pulled:f,createdCommit:g,bootstrapped:I}=p.value;!f&&!g&&!I||on({type:"state",payload:await Et({repoRoot:e.project.repoRoot})})})}finally{r=!1,m()}}};function m(){n||!a()||r||t||(t=setTimeout(()=>{t=void 0,l()},c()))}return m(),{queueSync:m,dispose:()=>{n=!0,t&&clearTimeout(t)}}};var ax=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),Ja=(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:!ax.has(n.hostname)},wp=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:Ja(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 lx}from"ws";var Mp=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 Pp=e=>{let t=Kt({exclude:e});return d(t)?[]:t.value.map(n=>({projectId:n.projectId,name:Qn(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},Lp=e=>{let t=Kt();if(d(t))return i(t.message);let n=t.value.find(r=>r.root===e);return n?u("Resolved recent project",n.root):i(`Not a recent project: ${e}`)};import{z as T}from"zod";var q=T.string().min(1),kp=T.discriminatedUnion("at",[T.object({at:T.literal("start")}),T.object({at:T.literal("end")}),T.object({at:T.literal("before"),sibling:q}),T.object({at:T.literal("after"),sibling:q})]),oo=T.number().finite(),ie=(e,t)=>T.object({type:T.literal(e),payload:t}),qs=e=>T.object({type:T.literal(e)}),dx=T.discriminatedUnion("type",[qs("state:get"),qs("issues:list"),qs("sync"),qs("time-travel:live"),ie("project:open",T.object({root:T.string().min(1)})),ie("issues:create",T.object({title:T.string(),parentId:q,description:T.string().optional(),tagNames:T.array(T.string()).optional()})),ie("swimlane:create",T.object({title:T.string(),boardId:q})),ie("swimlane:edit:title",T.object({swimlaneId:q,title:T.string()})),ie("swimlane:delete",T.object({swimlaneId:q})),ie("swimlane:move",T.object({swimlaneId:q,boardId:q,position:kp.optional()})),ie("issues:move",T.object({issueId:q,parentId:q,position:kp.optional()})),ie("issue:edit:title",T.object({issueId:q,title:T.string()})),ie("issue:edit:description",T.object({issueId:q,description:T.string()})),ie("issue:tag:add",T.object({issueId:q,tagName:T.string()})),ie("issue:tag:remove",T.object({issueId:q,tagId:q})),ie("contributor:remove",T.object({contributorId:q})),ie("tag:remove",T.object({tagId:q})),T.object({type:T.literal("contributors:get"),payload:T.object({boardId:q.optional()}).optional()}),ie("issue:assignee:add",T.object({issueId:q,assigneeId:q.optional(),assigneeName:T.string().optional(),createUnlinked:T.boolean().optional()})),ie("issue:assignee:remove",T.object({issueId:q,assigneeId:q})),ie("issue:close",T.object({issueId:q})),ie("issue:reopen",T.object({issueId:q})),ie("issue:comment:add",T.object({issueId:q,body:T.string()})),ie("issue:comment:delete",T.object({issueId:q,commentId:q})),ie("issue:comment:edit",T.object({issueId:q,commentId:q,body:T.string()})),ie("issue:get",T.object({issueId:q})),T.object({type:T.literal("timeline:get"),payload:T.object({start:oo.optional(),end:oo.optional(),boardId:q.optional(),requestId:T.number().finite().optional()}).optional()}),T.object({type:T.literal("commits:get"),payload:T.object({start:oo.optional(),end:oo.optional(),requestId:T.number().finite().optional()}).optional()}),ie("time-travel:scrub",T.object({targetTime:oo})),ie("commit:inspect",T.object({sha:T.string()})),ie("commit:diff:get",T.object({sha:T.string()})),ie("issue:commits:get",T.object({issueId:q}))]);var Dp=e=>{let t=dx.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 cx=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))}),so=e=>d(e)?e:u(e.message,cx(e.value)),Bp=(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 Fp=()=>{on({type:"state",payload:so(ur())})},ne=(e,t)=>{e.send(JSON.stringify(t))},io=async(e,t)=>{let n=so(await Et({repoRoot:t}));return d(n)&&n.message===Mi?ne(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:Pp(t)}}):ne(e,{type:"state",payload:n})},ux=async(e,t)=>{let n=()=>ne(e,{type:"state",payload:so(ur())});if(mt().mode!=="live")return n();let r=await Et({repoRoot:t});return mt().mode!=="live"?n():ne(e,{type:"state",payload:so(r)})},Fe=async(e,t,n,r,o)=>{if(ne(e,{type:r,payload:o}),d(o))return ne(e,{type:"failed",payload:o.message});n(),ux(e,t)},Op=(e,t,{onStateChanged:n,getPort:r})=>{new lx({server:e,path:"/ws",verifyClient:s=>!Ja(s.origin,r())}).on("connection",s=>{Fc(s),s.on("message",async a=>{let c=async l=>{let{type:m}=l,p=t.repoRoot;if(m==="project:open"){let f=Lp(l.payload.root);return ne(s,{type:"project:open:result",payload:f}),d(f)?void 0:(t.repoRoot=f.value,io(s,f.value))}if(m==="timeline:get"){let{requestId:f,...g}=l.payload??{};return ne(s,{type:"timeline",requestId:f,payload:await $m({repoRoot:p,...g})})}if(m==="issue:get"){let f=l.payload?.issueId,g=ur(),I=pp(f);return ne(s,{type:"issue",payload:d(g)?g:u("Issue detail",{...Bp(g.value,f),history:d(I)?[]:I.value})})}if(m==="commits:get"){let{requestId:f,...g}=l.payload??{};return ne(s,{type:"commits",requestId:f,payload:await Ya({repoRoot:p,...g})})}if(m==="commit:inspect")return ne(s,{type:"commit:inspect:result",payload:await Gm({repoRoot:p,sha:l.payload.sha})});if(m==="commit:diff:get"){let{sha:f}=l.payload;return ne(s,{type:"commit:diff:result",payload:{sha:f,result:await Vm({repoRoot:p,sha:f})}})}if(m==="issue:commits:get"){let{issueId:f}=l.payload;return ne(s,{type:"issue:commits:result",payload:{issueId:f,result:await Hm({repoRoot:p,ref:V(f)})}})}if(m==="time-travel:scrub"){let f=await zm({repoRoot:p,targetTime:l.payload.targetTime});return ne(s,{type:"time-travel:result",payload:f}),d(f)?void 0:Fp()}if(m==="time-travel:live"){let f=await qm({repoRoot:p});return ne(s,{type:"time-travel:result",payload:f}),d(f)?void 0:Fp()}if(m==="state:get")return io(s,p);if(m==="sync"){let f=await Vs({repoRoot:p});return ne(s,{type:"sync:result",payload:f}),n(),io(s,p)}if(m==="issue:comment:add"){let f=await Ks({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:comment:add:result",f)}if(m==="issue:comment:edit"){let f=await Cp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:comment:edit:result",f)}if(m==="issue:comment:delete"){let f=await zs({repoRoot:p,...l.payload});return ne(s,{type:"issue:comment:delete:result",payload:f}),d(f)?ne(s,{type:"failed",payload:f.message}):(n(),io(s,p))}if(m==="issue:edit:description"){let f=await fp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:edit:description:result",f)}if(m==="issue:edit:title"){let f=await gp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:edit:title:result",f)}if(m==="issue:tag:add"){let f=await hp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:tag:add:result",f)}if(m==="issue:tag:remove"){let f=await yp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:tag:remove:result",f)}if(m==="contributor:remove"){let f=await Ip({repoRoot:p,...l.payload});return Fe(s,p,n,"contributor:remove:result",f)}if(m==="tag:remove"){let f=await vp({repoRoot:p,...l.payload});return Fe(s,p,n,"tag:remove:result",f)}if(m==="contributors:get")return ne(s,{type:"contributors",payload:await Ep({repoRoot:p,...l.payload})});if(m==="issue:assignee:add"){let f=await xp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:assignee:add:result",f)}if(m==="issue:assignee:remove"){let f=await Sp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:assignee:remove:result",f)}if(m==="issues:list")return ne(s,{type:"issues",payload:await op({repoRoot:p})});if(m==="issues:create"){let f=await sp({...l.payload,repoRoot:p});return ne(s,{type:"issues:create:result",payload:f}),d(f)?on({type:"failed",payload:f.message}):(on({type:"issue:created",payload:f.value}),n(),io(s,p))}if(m==="swimlane:create"){let f=await cp({...l.payload,repoRoot:p});return Fe(s,p,n,"swimlane:create:result",f)}if(m==="swimlane:edit:title"){let f=await lp({...l.payload,repoRoot:p});return Fe(s,p,n,"swimlane:edit:title:result",f)}if(m==="swimlane:delete"){let f=await mp({...l.payload,repoRoot:p});return Fe(s,p,n,"swimlane:delete:result",f)}if(m==="swimlane:move"){if(!l.payload.position)return ne(s,{type:"error",message:"Missing move position"});let f=await up({...l.payload,repoRoot:p});return Fe(s,p,n,"swimlane:move:result",f)}if(m==="issues:move"){if(!l.payload.position)return ne(s,{type:"error",message:"Missing move position"});let f=await dp({...l.payload,repoRoot:p});return Fe(s,p,n,"issues:move:result",f)}if(m==="issue:close"){let f=await ip({repoRoot:p,issueId:l.payload.issueId});return Fe(s,p,n,"issue:close:result",f)}if(m==="issue:reopen"){let f=await ap({repoRoot:p,issueId:l.payload.issueId});return Fe(s,p,n,"issue:reopen:result",f)}return ne(s,{type:"error",message:"Unknown message type"})};try{let l=Dp(JSON.parse(a.toString()));if(!l.ok)return ne(s,{type:"error",message:l.error});let m=l.message;return Mp.has(m.type)?await yn(async()=>mt().mode!=="live"?ne(s,{type:"failed",payload:"Read-only while viewing history"}):c(m)):await c(m)}catch(l){return ne(s,{type:"error",message:l instanceof Error?l.message:String(l)})}})})};var fx=Hn.dirname(px(import.meta.url)),gx=process.env.IS_LOCAL==="true"?Hn.resolve(process.cwd(),"dist/gui"):Hn.join(fx,"gui"),Ys,hx=async()=>(Ys===void 0&&(Ys=await import("node:sea").catch(()=>null)),Ys?.isSea()?Ys:null),Ie=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},vx=e=>Ie(e,409,{isError:!0,message:"Read-only while viewing history"}),Xs=(e,t)=>yn(async()=>mt().mode!=="live"?vx(e):t()),Up=async(e,t=1024*1024)=>new Promise((n,r)=>{let o=[],s=0;e.on("data",a=>{if(s+=a.length,s>t){e.destroy(),r(new Error("Request body too large"));return}o.push(a)}),e.on("end",()=>{let a=Buffer.concat(o).toString("utf8");try{n(a?JSON.parse(a):{})}catch{r(new Error("Invalid JSON body"))}}),e.on("error",r)}),yx=2*1024*1024,bx={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},xx=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",_p=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),r=Hn.resolve(gx),o=Hn.resolve(r,n),s=Hn.relative(r,o);if(s.startsWith("..")||Hn.isAbsolute(s))return Ie(t,403,{isError:!0,message:"Forbidden"});let a=await hx();try{let c=a?Buffer.from(a.getAsset(`gui/${s}`)):await jp(o);return t.writeHead(200,{"content-type":xx(o)}),t.end(c)}catch{return Ie(t,404,{isError:!0,message:`Not found: ${n}`})}},Ix=async(e,t=3710)=>new Promise((n,r)=>{let o=s=>{let a=l=>{if(e.off("listening",c),l.code==="EADDRINUSE"&&s===t){e.removeListener("error",a),o(0);return}r(l)},c=()=>{e.off("error",a);let l=e.address();if(!l||typeof l=="string"){r(new Error("Unable to resolve address"));return}n(l.port)};e.once("error",a),e.once("listening",c),e.listen(s,"127.0.0.1")};o(t)}),$p=async e=>{Mm(!1);let t=0,n={repoRoot:e.repoRoot},r=mx.createServer(async(a,c)=>{let l=new URL(a.url??"/","http://127.0.0.1"),m=wp({method:a.method,origin:a.headers.origin,contentType:a.headers["content-type"]},t);if(m)return Ie(c,m.status,{isError:!0,message:m.message});if(l.pathname==="/api/state")return Ie(c,200,await Et({repoRoot:n.repoRoot}));if(a.method==="POST"&&l.pathname==="/api/comments")try{let p=await Up(a);if(!p.issueId||!p.body?.trim())return Ie(c,400,{isError:!0,message:"Missing issueId or body"});let f=p.issueId,g=p.body;return await Xs(c,async()=>{let I=await Ks({repoRoot:n.repoRoot,issueId:f,body:g});return d(I)?Ie(c,400,{isError:!0,message:I.message}):Ie(c,200,await Et({repoRoot:n.repoRoot}))})}catch(p){return Ie(c,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add comment"})}if(a.method==="POST"&&l.pathname==="/api/attachments")try{let p=await Up(a,yx);if(!p.issueId||!p.dataBase64)return Ie(c,400,{isError:!0,message:"Missing issueId or dataBase64"});let f=p.issueId,g=p.dataBase64,I=p.name??"";return await Xs(c,async()=>{let E=await Np({repoRoot:n.repoRoot,issueId:f,name:I,dataBase64:g});return d(E)?Ie(c,400,{isError:!0,message:E.message}):Ie(c,200,await Et({repoRoot:n.repoRoot}))})}catch(p){return Ie(c,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add attachment"})}if(a.method==="DELETE"&&l.pathname.startsWith("/api/attachments/")){let p=decodeURIComponent(l.pathname.replace("/api/attachments/",""));return p?Xs(c,async()=>{let f=await Rp({repoRoot:n.repoRoot,attachmentId:p});return d(f)?Ie(c,400,{isError:!0,message:f.message}):Ie(c,200,await Et({repoRoot:n.repoRoot}))}):Ie(c,400,{isError:!0,message:"Missing attachment id"})}if(a.method==="GET"&&l.pathname.startsWith("/media/")){let p=decodeURIComponent(l.pathname.replace("/media/","")),f=await Ap({repoRoot:n.repoRoot,fileName:p});if(d(f))return Ie(c,404,{isError:!0,message:f.message});try{let g=await jp(f.value.filePath);return c.writeHead(200,{"content-type":bx[f.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),c.end(g)}catch{return Ie(c,404,{isError:!0,message:"Attachment blob not found"})}}if(a.method==="DELETE"&&l.pathname.startsWith("/api/comments/")){let p=decodeURIComponent(l.pathname.replace("/api/comments/",""));return p?Xs(c,async()=>{let f=await zs({repoRoot:n.repoRoot,commentId:p});return d(f)?Ie(c,400,{isError:!0,message:f.message}):Ie(c,200,await Et({repoRoot:n.repoRoot}))}):Ie(c,400,{isError:!0,message:"Missing comment id"})}return l.pathname.startsWith("/board/")?_p("/",c):_p(l.pathname,c)});try{t=await Ix(r)}catch(a){return i(a instanceof Error?`Unable to start GUI server: ${a.message}`:`Unable to start GUI server: ${String(a)}`)}let o=Tp({project:n});Op(r,n,{onStateChanged:()=>o.queueSync(),getPort:()=>t}),r.on("close",o.dispose);let s=r.address();return!s||typeof s=="string"?(r.close(),i("Unable to resolve GUI server address")):u("Started GUI server",{url:`http://epiq.localhost:${s.port}${e.boardId?`/board/${e.boardId}`:""}`,server:r})};var Hp=async e=>{let t=Vn({});if(d(t))return i(t.message);let n=At();de(n)&&je(n.value);let r=await $p({...e,boardId:""});if(d(r))return r;let{url:o}=r.value;return console.log(`Epiq GUI running at ${Ex.cyan(o)}`),Xd(o),u("Started GUI",{url:o})};import{Box as Sn}from"ink";import be from"react";import{Box as Qa,Text as ao}from"ink";import St,{useEffect as Sx,useMemo as Cx}from"react";import{ulid as Nx}from"ulid";var Wp=({text:e,match:t,color:n,highlightColor:r=v.secondary,dimColor:o=!1})=>{if(!t)return St.createElement(ao,{color:n,dimColor:o},e);let s=e.toLowerCase(),a=t.toLowerCase(),c=s.indexOf(a);return c===-1?St.createElement(ao,{color:n,dimColor:o},e):St.createElement(ao,{color:n,dimColor:o},e.slice(0,c),St.createElement(ao,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},Gp=Nx(),Rx=e=>`${e}`,Ax=e=>{let{pendingNavTarget:t}=pn();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(ve(b.NONE,{breadCrumb:n,contextNode:r,readOnly:h().readOnly,selectedNode:o}));return[...new Set(Object.values(b))].filter(a=>a!=="move").filter(a=>a.length>0).filter(a=>a!==b.PALETTE).map(a=>{let c=ps(a),l=Ds.find(m=>m.intent===c);return{command:a,description:l?.description??`[${a}] Run command`,isAvailable:s.has(a)}}).filter(a=>a.command.toLowerCase().startsWith(e)||e.length>=2&&a.description.toLowerCase().includes(e)).sort((a,c)=>a.isAvailable!==c.isAvailable?a.isAvailable?-1:1:a.command.localeCompare(c.command))},Tx=e=>le.text({id:Gp,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),wx=(e,t,n)=>le.text({id:Rx(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),Za=[],Mx=e=>{Vp();let t=S.createNode(Tx(h().rootNodeId));d(t)||!tn(t.value)||(Za=[t.value,...e.map((n,r)=>wx(n,r,Gp)).map(S.createNode).filter(de).map(({value:n})=>n).filter(tn)],k.navigate({contextNode:t.value,selectedIndex:0}))},Vp=()=>{let e=Za.map(t=>t.id);Za=[];for(let t of e)S.deleteNode(t)};function Kp({width:e,height:t}){let r=zl().value.trim().toLowerCase(),o=Cx(()=>Ax(r),[r]);Sx(()=>(Mx(o),()=>{Vp()}),[o]);let s=h().selectedIndex;return St.createElement(Qa,{flexDirection:"column",width:e,height:t-2},St.createElement(ct,{height:t-4,itemHeight:3,selectedIndex:s},o.map((a,c)=>{let l=c===s,m=a.isAvailable?v.accent:v.secondary2,p=a.isAvailable?"":"[unavailable] ";return St.createElement(Qa,{key:a.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:v.secondary,borderStyle:"single"},St.createElement(ao,{color:m,dimColor:!a.isAvailable},l?"\u276F ":" ",St.createElement(Wp,{text:rc(a.command),match:r,color:m,dimColor:!a.isAvailable})),St.createElement(Qa,{paddingLeft:2},St.createElement(Wp,{text:p+a.description,match:r.length>=2?r:"",color:l&&a.isAvailable?v.primary:v.secondary2,dimColor:!a.isAvailable})))})))}import{Box as zx}from"ink";import Zs from"react";import lo from"chalk";import{Box as ed,Text as zp}from"ink";import co,{useEffect as Px,useMemo as Lx,useState as kx}from"react";var qp=lo.hex(v.secondary),Dx=lo.inverse,Bx=lo.inverse.hex(v.secondary2),Fx={hint:"",hints:[],overlap:0,remainder:""},Xp=({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}},Ox=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=oe(t);return{bg:r=>lo.bgHex(n).black(r),bgCursor:r=>lo.bgHex(n).inverse.black(r)}}return da(t)},Ux=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Xp({value:e,command:t});if(!r)return null;let s=e.slice(r.end).match(/^\s*/)?.[0].length??0,a=r.end+s;return e.slice(a,a+n.length)!==n?null:{start:a,end:a+n.length}},Yp=()=>({value:We.value,cursorPosition:We.cursorPosition,commandIsPending:We.commandIsPending,autoCompletion:We.commandMeta.autoCompletion??Fx,infoMessage:We.commandMeta.infoMessage,validationStatus:We.commandMeta.validity,command:We.commandMeta.command,inputString:We.commandMeta.inputString,modifier:We.commandMeta.modifier}),_x=(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,Jp=({width:e,mode:t})=>{let[n,r]=kx(Yp());Px(()=>{let E=()=>{let A=Yp();r(w=>_x(w,A)?w:A)},C=ma(E);return E(),()=>{C()}},[]);let{value:o,cursorPosition:s,infoMessage:a,commandIsPending:c,autoCompletion:l,command:m,modifier:p,validationStatus:f}=n,g=c&&f===Dt.Invalid,I=Lx(()=>{let E=Math.max(0,Math.min(s,o.length)),C=Xp({value:o,command:m}),A=Ux({value:o,command:m,modifier:p}),w=m?da(m):null,L=Ox({command:m,modifier:p}),j=(Be,Ee)=>{let Nn=C&&Ee>=C.start&&Ee<C.end,gr=A&&Ee>=A.start&&Ee<A.end;return Nn&&w?w.fg(Be):gr&&L?L.bg(Be):Be},G=(Be,Ee)=>{let Nn=C&&Ee>=C.start&&Ee<C.end,gr=A&&Ee>=A.start&&Ee<A.end;return Nn&&w?w.fgCursor(Be):gr&&L?L.bgCursor(Be):Dx(Be)},P=o.slice(0,E),U=o[E]??" ",H=E<o.length?o.slice(E+1):"",Ze=Array.from(P).map((Be,Ee)=>j(Be,Ee)).join(""),Ue=G(U,E),De=Array.from(H).map((Be,Ee)=>j(Be,E+1+Ee)).join("");if(l.hint){let Be=l.hint[l.overlap]??U;Ue=Bx(Be),De=qp(l.remainder.slice(1)+H)}return qp(t===y.PALETTE?"?":":")+Ze+Ue+De},[o,s,l,m,p]);return co.createElement(ed,{flexDirection:"column",justifyContent:"flex-start"},co.createElement(ed,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},co.createElement(ed,null,co.createElement(zp,null,I),a&&co.createElement(zp,{wrap:"truncate",color:g?v.red:v.secondary2},` ${a} `))))};import{Box as jx,Text as $x}from"ink";import Qp from"react";var Hx=(e,t)=>{let n=[],r=0;for(let o of e){let a=(n.length>0?" | ":"").length+o.length;if(r+a>t-4)break;n.push(o),r+=a}return n},Zp=({width:e,availableHints:t})=>{let n=Hx(t,e).join(" | ");return Qp.createElement(jx,{width:e,borderStyle:"round",borderColor:v.secondary,paddingX:1},Qp.createElement($x,{color:v.secondary2},n.length?n:"\xA0"))};import{Box as Wx,Text as Js}from"ink";import uo,{useEffect as Gx,useRef as mr,useState as Vx}from"react";var Kx=40,Qs=.3,td="\u2500",ef=1,tf=16,nf=({width:e})=>{let{replay:t}=z(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),a=s*ef,[c,l]=Vx(0),m=mr(r);m.current=r;let p=mr(0),f=mr(0),g=mr(0),I=mr(0),E=mr(0);if(Gx(()=>{if(!n){p.current=0,g.current=0,I.current=0,E.current=0,l(0);return}p.current=m.current,f.current=Date.now(),g.current=m.current;let j=setInterval(()=>{let G=Date.now(),P=m.current;if(P!==g.current){let De=P-g.current,Be=G-f.current;if(De<0)I.current=0,E.current=0;else if(De>0&&Be>0){let Ee=De/Be;I.current=I.current===0?Ee:I.current*(1-Qs)+Ee*Qs,E.current=E.current===0?De:E.current*(1-Qs)+De*Qs}p.current=P,f.current=G,g.current=P}let U=G-f.current,H=Math.min(E.current,I.current*U),Ze=Math.min(1,p.current+H),Ue=Math.round(Ze*a);l(De=>De===Ue?De:Ue)},Kx);return()=>clearInterval(j)},[n,a]),!t)return null;let C=j=>{let G=s>1?j/(s-1):0,P=Math.round(G*(tf-1))/(tf-1);return is(P)},A=Math.min(s,Math.floor(c/ef)),w=[];for(let j=0;j<A;j++){let G=C(j),P=w[w.length-1];P&&P.color===G?P.text+=td:w.push({text:td,color:G})}let L=td.repeat(Math.max(0,s-A));return uo.createElement(Wx,{width:e,borderStyle:"round",borderColor:v.secondary,paddingX:1,columnGap:1},uo.createElement(Js,{color:v.secondary2},"\u25B6"),uo.createElement(Js,null,w.map((j,G)=>uo.createElement(Js,{key:G,color:j.color},j.text)),uo.createElement(Js,{color:v.secondary,dimColor:!0},L)))};var mo=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=z(),o=t===y.COMMAND_LINE||t===y.PALETTE;return Zs.createElement(zx,null,o?Zs.createElement(Jp,{width:e,mode:t}):r==="replay"?Zs.createElement(nf,{width:e}):Zs.createElement(Zp,{width:e,mode:t,availableHints:n}))};import{Box as bn,Text as pr}from"ink";import Xe,{useEffect as qx,useMemo as Yx}from"react";import{ulid as rf}from"ulid";var ti=rf(),Xx=()=>[...new Set([...h().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),r=t?.replace("[",""),o=n?.trim();return[r,o]}).filter(e=>e[0]!==void 0&&e[1]!==void 0).sort(([e],[t])=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(([e,t])=>({keys:e,action:t})),Jx=e=>le.text({id:ti,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),Qx=(e,t,n)=>le.text({id:rf(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),ei=[],of=()=>{let e=ei.filter(n=>n.id!==ti).map(n=>n.id),t=ei.filter(n=>n.id===ti).map(n=>n.id);ei=[];for(let n of[...e,...t])S.deleteNode(n)},Zx=e=>{of();let t=S.createNode(Jx(h().rootNodeId));if(d(t)||!tn(t.value))return logger.error("Could not attach help nodes");ei=[t.value,...e.map((n,r)=>Qx(n,r,ti)).map(S.createNode).filter(de).map(({value:n})=>n).filter(tn)],k.navigate({contextNode:t.value,selectedIndex:0})},sf=({width:e,height:t})=>{let n=Yx(()=>Xx(),[]);qx(()=>(Zx(n),()=>{of()}),[n]);let r=h().selectedIndex;return Xe.createElement(bn,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,height:t-2},Xe.createElement(bn,{paddingX:1,justifyContent:"center"},Xe.createElement(pr,{color:v.accent},"Help"),Xe.createElement(pr,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Xe.createElement(bn,{paddingX:1,marginTop:1},Xe.createElement(bn,{width:20,justifyContent:"flex-end"},Xe.createElement(pr,{color:v.secondary},"Key(s)")),Xe.createElement(bn,{flexGrow:1,width:40,paddingLeft:2},Xe.createElement(pr,{color:v.secondary},"Action"))),Xe.createElement(ct,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},a)=>{let c=a===r;return Xe.createElement(bn,{paddingX:1,key:`${o}-${s}-${a}`,flexDirection:"row"},Xe.createElement(bn,{width:20,justifyContent:"flex-end"},Xe.createElement(pr,{color:v.accent},o)),Xe.createElement(bn,{flexGrow:1,width:40,paddingLeft:2},Xe.createElement(pr,{color:c?v.primary:v.secondary2},s)))})))};import eI from"chalk";import{Box as Wn,Text as ke}from"ink";import ae from"react";var tI=8,nI=()=>{let e=Kt({exclude:process.cwd()});return d(e)?[]:e.value.slice(0,tI)},af=({width:e,height:t})=>{let n=nI();return ae.createElement(Wn,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},ae.createElement(ke,{color:v.accent,bold:!0},"Initialize project"),ae.createElement(ke,null,`This folder is not an ${eI.hex(v.accent)("epiq")} project yet.`),ae.createElement(ke,{color:v.primary},"To start tracking issues here, we need to initialize a new",ae.createElement(ke,{color:v.primary,backgroundColor:v.secondary}," .epiq/project.json "),"file in this repository."),ae.createElement(Wn,{marginTop:1,flexDirection:"column"},ae.createElement(Wn,null,ae.createElement(ke,{color:v.accent}," "),ae.createElement(ke,{color:v.primary},"Type "),ae.createElement(ke,{backgroundColor:v.secondary}," :init "))),ae.createElement(Wn,{marginTop:1},ae.createElement(ke,{color:v.secondary2},"This will create, commit and push "),ae.createElement(ke,{color:v.primary,backgroundColor:v.secondary}," .epiq/project.json ")),n.length>0&&ae.createElement(Wn,{marginTop:1,flexDirection:"column"},ae.createElement(ke,{color:v.accent,bold:!0},"Or open a recent project"),n.map((r,o)=>ae.createElement(Wn,{key:r.projectId},ae.createElement(ke,{color:v.accent},` ${o+1} `),ae.createElement(ke,{color:v.primary},Qn(r.root)),ae.createElement(ke,{color:v.secondary2},` ${r.root}`))),ae.createElement(Wn,{marginTop:1},ae.createElement(ke,{color:v.accent}," "),ae.createElement(ke,{color:v.primary},"Type "),ae.createElement(ke,{backgroundColor:v.secondary}," :open 1 "),ae.createElement(ke,{color:v.secondary2}," or "),ae.createElement(ke,{backgroundColor:v.secondary}," :open <path> "))))};import{Box as ni,Text as Ut}from"ink";import Oe from"react";var rI=({isDone:e,command:t,value:n})=>Oe.createElement(ni,null,Oe.createElement(Ut,{color:v.accent,dimColor:e},e?" \u2714 ":" "),Oe.createElement(Ut,{dimColor:e},"Type "),Oe.createElement(Ut,{backgroundColor:v.secondary,dimColor:e}," "+t+" "),n!==void 0&&Oe.createElement(Oe.Fragment,null,Oe.createElement(Ut,{dimColor:e}," "),Oe.createElement(Ut,{color:v.secondary,dimColor:e},"<"+n+">"))),oI=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function nd({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:a,isSetAutoSync:c}=sn(),l=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:s,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:a,message:"Almost there. Configure auto sync."}],m=l.findIndex(f=>!f.done),p=m===-1?void 0:l[m];return Oe.createElement(ni,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},Oe.createElement(Ut,{color:v.accent,bold:!0},"Welcome! \u{1F539}"),Oe.createElement(Ut,null,"Let's get you started - it's a breeze."),Oe.createElement(Ut,{color:v.secondary2},"Remember - you can always search available commands by typing:",Oe.createElement(Ut,{color:v.accent}," ? ")),p&&Oe.createElement(Ut,{color:v.secondary2},p.message),Oe.createElement(ni,{flexDirection:"column"},l.map((f,g)=>m===-1||g<=m?Oe.createElement(ni,{key:f.key,marginBottom:1},Oe.createElement(rI,{isDone:f.done,command:f.command,value:f.done?oI(f.value):void 0})):null)))}import ai from"chalk";import{Box as fo,Text as fr}from"ink";import Ae from"react";import{Box as ri,Text as df}from"ink";import xn from"react";import sI from"chalk";var iI=e=>(S.getTag(e)?.name??"").length+3,aI=e=>{let t=S.getContributor(e);return(t?t.name:"").length+3},cf=({width:e})=>{let{viewMode:t}=Q(),n=z(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:a}=n,c=a[o.id]?.[s],l=Xt(c?.id??o.id,"TICKET"),m=de(l)?l.value:void 0,p=(m?.props.tags??[]).filter(P=>S.getTag(P)),f=m?.props.assignees??[],g=m?.parentNodeId?!Ga(o.id,m.parentNodeId)&&t==="dense":!1,I=r.map((P,U)=>{let H=U===r.length-1,Ze=Z(P.id),Ue=H?Ze?.[s]?.title:void 0;return`${U?" / ":""}${P.title??""}${Ue?` \u25B8 ${Ue}`:""}`}).join(""),E=m?S.getCommentsByIssue(m.id):[],C=E.length?String(E.length).length+11:0,A=g?p.reduce((P,U)=>P+iI(U),0)+f.reduce((P,U)=>P+aI(U),0)+C:0,w=c?.id!=null&&!(t==="wide"&&M(c)),L=Math.max(0,e-A),j=I.substring(0,L)+(w?sI.hex(v.secondary2).dim(` ${V(c.id)}`):""),G=g?[...p.map(P=>xn.createElement(ri,{key:`tag-${P}`,paddingLeft:1},xn.createElement(or,{id:P}))),...f.map(P=>xn.createElement(ri,{key:`assignee-${P}`,paddingLeft:1},xn.createElement(ln,{id:P}))),E.length?xn.createElement(ri,{key:"comments",paddingLeft:1},xn.createElement(df,{color:v.accent},"[",E.length," comment",E.length===1?"":"s","]")):null]:[];return xn.createElement(ri,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},xn.createElement(df,{color:v.secondary2},j),G)};import{Box as dI,Text as lf}from"ink";import oi from"react";var cI=({filters:e})=>oi.createElement(dI,{columnGap:1},oi.createElement(lf,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>oi.createElement(lf,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),uf=oi.memo(cI);import{Box as lI,Text as si}from"ink";import po from"react";function mf(){let{eventLog:e,unappliedEvents:t}=z(),n=e.at(-1)?.id,r=ss(n??""),o=de(r)?bs(r.value):"INVALID DATE";return po.createElement(lI,{paddingLeft:1},po.createElement(si,{backgroundColor:v.accent,color:v.secondary}," Readonly "),po.createElement(si,{color:v.accent}," "+t.length+" edits ago at "+o+"."),po.createElement(si,{color:v.accent}," Resume with "),po.createElement(si,{backgroundColor:v.accent,color:v.secondary}," ",":peek now"," "))}import{Box as uI,Text as rd}from"ink";import ii from"react";function pf(){let{replay:e}=z();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return ii.createElement(uI,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},ii.createElement(rd,{backgroundColor:v.accent,color:v.secondary}," \u25B6 REPLAY "),ii.createElement(rd,{color:v.secondary2},bs(new Date(r))),ii.createElement(rd,{color:v.accent},`${t}/${n} edits`))}import od from"chalk";import{Box as mI,Text as ff}from"ink";import sd,{useEffect as pI,useState as fI}from"react";var gI=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],hI=150,gf=12,vI=.36,hf=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)}},yI=({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)}`},bI=(e,t,n)=>{let r=hf(e),o=hf(t);return yI({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},xI=(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],a=e[Math.min(r+1,e.length-1)];return bI(s,a,o)};function vf({syncStatus:e,autoSync:t}){let[n,r]=fI(0);pI(()=>{if(e.status!=="syncing"){r(0);return}let c=0,l=setInterval(()=>{c+=1;let m=(Math.sin(c*vI)+1)/2,p=Math.round(m*(gf-1));r(f=>f===p?f:p)},hI);return()=>clearInterval(l)},[e.status]);let o={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},a={synced:v.secondary2,failed:v.yellow,offline:v.secondary2,pending:v.secondary2,syncing:xI(gI,n/(gf-1))??""}[e.status];return sd.createElement(mI,null,sd.createElement(ff,null,od.hex(v.secondary2).dim(t?"Sync (auto): ":"Sync: ")),sd.createElement(ff,null,od.hex(a)("\u25CF")+od.hex(v.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import Ef from"chalk";import{Text as Sf}from"ink";import Cf,{useEffect as CI,useState as NI}from"react";var In="1.6.0";import id from"chalk";var II="https://registry.npmjs.org/epiq/latest",ad=null,yf=0,EI=1e3*60*60*24,bf=e=>e.replace(/^v/,""),SI=(e,t)=>{let n=bf(e).split(".").map(Number),r=bf(t).split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let s=n[o]??0,a=r[o]??0;if(s>a)return 1;if(s<a)return-1}return 0},xf=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(ad&&Date.now()-yf<EI)return ad;try{let t=await fetch(II);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?SI(r,e)>0:!1};return ad=o,yf=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},If=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,a)=>s!=n[a]);return r.map((s,a)=>a>=o?id.hex(v.accent).dim(s):id.hex(v.secondary).dim(s)).join(id.hex(v.secondary2).dim("."))};function Nf(){let[e,t]=NI({current:In,latest:null,updateAvailable:!1});return CI(()=>{let n=!0;return xf(In).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?Cf.createElement(Sf,{dimColor:!0,color:v.secondary2},In+" "):Cf.createElement(Sf,null,Ef.hex(v.secondary2).dim(In),Ef.hex(v.accent).dim(" \u2197 "),If(In,e.latest))}function go({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=z(),{userName:a,preferredEditor:c,autoSync:l}=Q(),m=64,p=process.stdout.columns-m-8,f=t||n==="replay",g=s?dt(s.currentLabel,Math.max(0,p)):"";return Ae.createElement(fo,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?Ae.createElement(fo,{paddingLeft:1},Ae.createElement(fr,{color:v.secondary2},g)):f?Ae.createElement(fr,null," "):o===y.PALETTE?Ae.createElement(fo,null,Ae.createElement(fr,{color:v.accent},"Command Palette"),Ae.createElement(fr,{dimColor:!0,color:v.secondary2}," ","- search, select and press enter")):Ae.createElement(fo,{paddingLeft:1},e.length>0?Ae.createElement(uf,{filters:e}):Ae.createElement(cf,{width:p})),n==="live"?Ae.createElement(fo,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},Ae.createElement(vf,{autoSync:!!l,syncStatus:r}),Ae.createElement(fr,null,ai.hex(v.secondary2).dim("Mode: ")+ai.hex(v.secondary2).dim(o.padEnd(8," "))," "),Ae.createElement(Rf,{icon:"@",value:a}),Ae.createElement(Rf,{icon:"\u276F",value:c}),Ae.createElement(Nf,null)):"",n==="peek"?Ae.createElement(mf,null):"",n==="replay"?Ae.createElement(pf,null):"")}function Rf({icon:e,value:t}){return Ae.createElement(fr,null,ai.dim(e)+ai.hex(v.accent)(` ${t??"-"} `))}import{Box as RI,Text as AI}from"ink";import ho from"react";import{Box as di,Text as dd}from"ink";import En from"react";function cd(){let e=z(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,a=t?.id?J(t?.id):[];return En.createElement(di,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:s},En.createElement(di,{padding:1,paddingTop:0,paddingBottom:0},En.createElement(dd,null,"Select a board:")),En.createElement(di,{padding:1,flexDirection:"column"},a.map((c,l)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===l,f=J(c.id).flatMap(({id:g})=>Z(g)).length;return En.createElement(di,{key:c.id??l},En.createElement(dd,{color:m?v.accent:v.secondary2},En.createElement(Ge,{isSelected:m})),En.createElement(dd,{color:m?v.accent:v.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var TI=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:a})=>{let{renderedChildrenIndex:c}=z(),l=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return ho.createElement(RI,{flexDirection:"row"},e.context==="WORKSPACE"?ho.createElement(cd,null):l?ho.createElement(Es,{height:f,width:a,swimlanes:(c[l.id]??[]).filter(g=>g!==void 0&&Tt(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):ho.createElement(AI,null))},Af=ho.memo(TI);import{useEffect as wI}from"react";var MI=e=>{wI(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:a}=Q();a&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:l}=h();l==="default"&&!c&&Jo(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},Tf=({autoSync:e})=>(MI(e),null);function ld({width:e,height:t}){let n=z(),{autoSync:r,viewMode:o}=Yd(),s=n.filters;if(n.mode===y.HELP)return be.createElement(Sn,{flexDirection:"column"},be.createElement(sf,{width:e,height:t}));if(n.mode===y.PALETTE)return be.createElement(Sn,{flexDirection:"column"},be.createElement(go,{filters:s}),be.createElement(Kp,{width:e,height:t-2}),be.createElement(mo,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:a}=sn(),c=!a,l=a&&!n.hasProjectDefinition;if(c)return be.createElement(Sn,{flexDirection:"column"},be.createElement(Sn,{flexDirection:"column"},be.createElement(go,{hideBreadCrumb:!0,filters:s}),be.createElement(nd,{height:t,width:e})),be.createElement(mo,{width:e,mode:n.mode,availableHints:n.availableHints}));if(l)return be.createElement(Sn,{flexDirection:"column"},be.createElement(Sn,{flexDirection:"column"},be.createElement(go,{hideBreadCrumb:!0,filters:s}),be.createElement(af,{height:t,width:e})),be.createElement(mo,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=ze(n.breadCrumb??[],"BOARD");if(de(m)){let p=m.value.id,f=J(p).length,g=3,I=Math.floor(e/g),E=Math.floor(e/Math.max(f,1));e=Math.min(E,I)*Math.max(f,g)}return be.createElement(Sn,{flexDirection:"column"},be.createElement(Tf,{autoSync:r}),be.createElement(Sn,{flexDirection:"column"},be.createElement(go,{filters:s}),be.createElement(Af,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),be.createElement(mo,{width:e,mode:n.mode,availableHints:n.availableHints}))}import PI from"readline";var ci,li,_t,LI=new Set([x.MoveCursorLeft,x.EraseInputWord,x.MoveCursorLeftOfWord,x.MoveCursorRight,x.MoveCursorRightOfWord,x.NavToPreviousContainer,x.NavToNextContainer,x.NavPreviousItem,x.NavNextItem,x.SetViewDense,x.SetViewWide,x.Confirm,x.Exit,x.Yank,x.InitCommandLine,x.InitCommandPalette,x.ExitCommandLine,x.CaptureInput,x.EraseInput,x.EraseInputWord,x.HideHelp,x.ViewHelp,x.SetViewDense,x.SetViewWide,x.GetLastCommandFromHistory,x.GetNextCommandFromHistory,x.AutoCompleteCommand]),kI=new Set([x.NavPreviousItem,x.NavNextItem,x.NavToPreviousContainer,x.NavToNextContainer,x.Confirm,x.Exit,x.InitCommandPalette,x.InitMove,x.MoveNextItem,x.MovePreviousItem,x.MoveToNextContainer,x.MoveToPreviousContainer,x.Delete,x.AddItem,x.EditTitle,x.EditDescription,x.ConfirmMove,x.Edit,x.ViewHelp,x.Yank]),wf=async e=>{if(e.ctrl&&e.name==="c")return k.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=h(),s=ql(e,n);if(!s||r&&!LI.has(s)||o==="replay"&&n===y.DEFAULT&&kI.has(s))return;let a=t[n]?.[s];if(a?.action)try{await a.action(a,e)}catch(c){logger.error(c)}},DI=()=>async function(t,n){n.name!=="escape"&&(_t&&(clearTimeout(_t),_t=void 0),await wf(n))},BI=()=>async function(t){if(t.length===1&&t[0]===27){_t&&clearTimeout(_t),_t=setTimeout(()=>{wf({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),_t=void 0},25);return}_t&&(clearTimeout(_t),_t=void 0)};function Mf(){ci&&process.stdin.removeListener("keypress",ci),li&&process.stdin.removeListener("data",li),ci=DI(),li=BI(),PI.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",li),process.stdin.on("keypress",ci)}async function Pf(){try{let e=Vn({});if(d(e))return Pt(0,e.message);let t=At();de(t)&&je(t.value);let n=_e(process.cwd()),r=de(n)?await ws(n.value):qu();if(d(r))return r;let o=ud();return d(o)?Pt(6,o.message):(Mf(),u("Booted Epiq",void 0))}catch(e){return Pt(0,Vo(e))}}Mu();var _I=`${Cn.bold("Epiq CLI")}
|
|
70
|
+
`,Da.writeFileSync(t,n,"utf8"),Y.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),u("Local epiq paths ignored",!0)};var Zy=async e=>{let t=await _({cwd:e,args:["status","--porcelain"]});return d(t)?t:u("Checked git diff",t.value.stdout.trim().length>0)},se=(e,t)=>i(`[${e}] ${t}`),ju=async()=>{K("");let e=xo(),t=await ft(process.cwd());if(d(t))return se(1,t.message);let n=t.value,r=await Co(n);if(d(r))return se(2,r.message);if(r.value)return se(2,`Cannot initialize Epiq while a git operation is in progress: ${r.value}`);let o=await Zy(n);if(d(o))return se(2.5,o.message);if(o.value)return se(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Nr(n))return se(4,"Epiq project already initialized");let s=sn();if(!s.isSetupDone||!s.userName)return se(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let a=Q(),c=a.userName,l=a.userId;if(!l||!c)return se(5,"Missing Epiq user id");let m=await Hc(n);if(d(m))return se(6,m.message);let p=e.stateBranch,f=await No({repoRoot:n,branch:p});if(d(f))return se(6,f.message);if(f.value)return se(6,`State branch already exists: ${p}`);let g=await qi({repoRoot:n,stateBranchName:p});if(d(g))return se(6,g.message);let I=To();if(d(I))return se(7,I.message);let E=$u.join(Ao(),e.projectId),C=await Dn({repoRoot:n,stateBranchRoot:E,stateBranchName:p});if(d(C))return se(8,C.message);let A=$u.join(E,".epiq");Qy.mkdirSync(A,{recursive:!0});let w=Bc({userId:l,userName:c});if(d(w))return se(9,w.message);for(let pi of w.value){let pd=Uo({event:pi,rootDir:E});if(d(pd))return se(9,pd.message)}let L=await zo({stateBranchRoot:E,eventFileName:Ln({userId:l,userName:c})});if(d(L))return se(10,L.message);let $=await Kn({cwd:E,message:"[epiq:init]"});if(d($))return se(10,$.message);let G=await _u(n);if(d(G))return se(11,G.message);let P=hd({repoRoot:n,fileContents:e});if(d(P))return se(12,P.message);let U=await xe.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(U))return se(13,U.message);let H=await xe.commit({cwd:n,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(d(H))return se(13,H.message);let Ze="Project initialized!",Ue=await _({cwd:n,args:["push","-u","origin","HEAD"]});d(Ue)&&(Ze+=` Warn: [init:14] ${Ue.message}`);let De=await Dr({repoRoot:n,stateBranchRoot:E});d(De)&&(Ze+=` Warn: [init:15] ${De.message}`);let Ee=vt(w.value).filter(d);if(Ee.length>0)return se(16,Ee.map(pi=>pi.message).join(`
|
|
71
|
+
`));let Nn=Qe();if(d(Nn))return se(16,Nn.message);let{rootNodeId:gr,nodes:Bf}=Nn.value,md=Bf[gr];return md?(k.navigate({contextNode:md,selectedIndex:0}),N({hasProjectDefinition:!0,mode:y.DEFAULT}),u(Ze,null)):se(16,"Unable to resolve initialized root node")};import{ulid as tb}from"ulid";import{ulid as eb}from"ulid";var Hu=null,gn=()=>structuredClone(Hu),Zr=e=>{Hu=e},Wu=()=>{let{contextNode:e,selectedIndex:t}=h(),r=Z(e.id)[t];return r?u("Resolved selected child",r):i("Target node not found")},Ba=({id:e,parentId:t,position:n={at:"end"}})=>{let r=Z(t).filter(o=>o.id!==e);return _o(r,n)},Gu=({id:e,parentId:t,position:n={at:"end"}})=>{let r=he();if(d(r))return i("Unable to resolve user ID");let o=Ba({parentId:t,id:e,position:n});return d(o)?o:u("Created pending move state",{id:eb(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Vu=e=>{Zr(e);let t=nn(e,!0);return d(t)?t:u("Node moved successfully",t.value)};function Fa(e){let t=Wu();if(d(t))return t;let{contextNode:n,nodes:r}=h();if(!n.parentNodeId)return i("Missing parent node id");let o=r[n.parentNodeId];if(!o)return i("Missing parent node");let s=Z(o.id),a=s.findIndex(({id:m})=>m===n.id);if(a<0)return i("Current node not found among siblings");let c=s[a+e];if(!c)return i("Missing sibling node");let l=Gu({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(l)?l:Vu(l.value)}function Oa(e){let t=Wu();if(d(t))return t;let{contextNode:n,selectedIndex:r}=h(),s=Z(n.id)[r+e];if(!s)return i("Missing sibling node");let a=Gu({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(a)?a:Vu(a.value)}var Ku=()=>{let e=gn();if(!e)return i("No pending move state");let t=e.payload.id,n=e.payload.parent,r=h().nodes[n];if(!r)return i("Move parent not found");let o=Z(n).findIndex(s=>s.id===t);return o===-1?i("Moved node not found among rendered children"):(k.navigate({contextNode:r,selectedIndex:o}),u("Synchronized navigation to moved node",null))},Rs=(e,t="Moved preview")=>{if(d(e))return e;let n=Ku();return d(n)?n:(N({mode:y.MOVE}),u(t,null))},zu=async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t}=te().commandMeta,{contextNode:n,selectedIndex:r}=h(),o=Z(n.id)[r];if(!o)return N({mode:y.DEFAULT}),i("No move target");if(t==="start"){if(o.readonly)return i("Target node is read-only");if(r===-1)return i("No item selected");if(!o.parentNodeId)return i("Target has no parent");let s=Z(o.parentNodeId),a=s.findIndex(({id:f})=>f===o.id);if(a===-1)return i("Target not found among siblings");let c=s[a-1],l=s[a+1],m=l!=null?{at:"before",sibling:l.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=Ba({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(Zr({id:tb(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),N({mode:y.MOVE}),u("Move initialized",null))}if(t==="next")return Rs(Oa(1));if(t==="previous")return Rs(Oa(-1));if(t==="to-next")return Rs(Fa(1));if(t==="to-previous")return Rs(Fa(-1));if(t==="confirm"){let s=gn();if(!s)return i("No pending move to confirm");let a=await Rt();if(d(a))return a;let c=O([s],a.value);if(d(c))return c;let l=Ku();return d(l)?l:(Zr(null),N({mode:y.DEFAULT}),u("Moved item",null))}return t==="cancel"?(Zr(null),N({mode:y.DEFAULT}),u("Cancelling move",null)):i("Invalid move modifier")};import{ulid as Ts}from"ulid";import{monotonicFactory as nb,ulid as rb}from"ulid";var ob=nb(),As=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=ob();return u("Created issue events",[{id:rb(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var qu=async(e,t)=>{let n=he();if(d(n))return i("Unable to resolve user ID");let r=await Rt();if(d(r))return r;let o=r.value;if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:a,selectedIndex:c}=h(),l=m=>{let p=O([m],o);if(d(p))return p;let f=S.getNode(p.value[0].result.id);if(!f)return i("Created node not found");if(!f.parentNodeId)return p;let g=S.getNode(f.parentNodeId);return g?(k.navigate({contextNode:g,selectedIndex:S.getSiblings(f.parentNodeId).findIndex(({id:I})=>I===f.id)}),p):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=h(),p=S.getNode(m);if(!p)return i("Workspace not found");let f=kn(p.id,n.value,o);return d(f)?f:l({id:Ts(),action:"add.board",payload:{id:Ts(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=ze(s,"BOARD");if(d(m))return i("Unable to add swimlane in this context");let p=kn(m.value.id,n.value,o);return d(p)?p:l({id:Ts(),action:"add.swimlane",payload:{id:Ts(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=J(a.id)[c],p=a.context==="SWIMLANE"?a:a.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let L=ze(s,"SWIMLANE");return d(L)?null:L.value})();if(!p)return i("Unable to add issue in this context");let f=kn(p.id,n.value,o);if(d(f))return f;let g=As({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(d(g))return g;let I=g.value,E=O([...I],o);if(d(E))return E;if(!E.value[0])return i("Issue creation failed");let w=I.find(L=>L.action==="add.issue")?.payload.id;return w?(k.navigate({contextNode:p,selectedIndex:S.getSiblings(p.id).findIndex(({id:L})=>L===w)}),u("Issue created",null)):i("Unable to determine ticket id")}return u("Success",null)};import sb from"node:os";import Xu from"node:path";var ws=async e=>{let t=Se({repoRoot:e});if(d(t))return Pt(3,t.message);let n=await Dn({repoRoot:e,stateBranchRoot:t.value,stateBranchName:xo().stateBranch});if(d(n))return Pt(3,n.message);let r=await _({cwd:t.value,args:["pull","--ff-only"]});d(r)&&logger.info(3,r.message);let o=Wt(t.value);if(d(o))return Pt(3,o.message);let{events:s,unreadable:a}=o.value,c=Gt(s,a);if(d(c))return Pt(4,c.message);N({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let l=Zo({root:e});return d(l)&&logger.info(l.message),u("Loaded project",void 0)},Yu=()=>{let e=Gt([]);return d(e)?Pt(4,e.message):(N({hasProjectDefinition:!1,hasInitializingEvents:!1}),u("Booted without a project",void 0))};var ib=e=>e==="~"||e.startsWith("~/")?Xu.join(sb.homedir(),e.slice(1)):e,ab=(e,t)=>{let n=e.trim();if(!n)return i("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):i(`No recent project #${n}`)}let r=_e(Xu.resolve(ib(n)));return d(r)?i(`No epiq project at ${n}`):u("Resolved project path",r.value)},Ju=async()=>{let e=ms();if(K(""),h().hasProjectDefinition)return i("Already in a project; run epiq from another directory");let t=Kt({exclude:process.cwd()}),n=d(t)?[]:t.value,r=ab(e,n);if(d(r))return i(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(c){return i(`Unable to enter ${o}: ${c instanceof Error?c.message:String(c)}`)}let a=await ws(o);return d(a)?(process.chdir(s),i(a.message)):u(`Opened ${Qn(o)}`,null)};var Ms=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=h(),s=Oo(n,t);if(d(s))return i(s.message);let{appliedEvents:a,unappliedEvents:c}=s.value,l=It();if(d(l))return l;let m=vt(a),{fatal:p,skipped:f}=jt(m);if(p.length>0)return It(),N(o),i(p.map(I=>I.message).join(", "));Ht(f);let g=h().nodes[e];return g?(k.navigate({contextNode:g,selectedIndex:r}),u("",{unappliedEvents:c})):(It(),N(o),i("Board did not exist at that date"))};var db=20,cb=16,lb=150,Ps=null,Ls=null;var jn=()=>{Ps!==null&&(clearInterval(Ps),Ps=null),Ls!==null&&(clearTimeout(Ls),Ls=null)},Qu=()=>{jn(),N({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},ub=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)},Zu=({events:e,startTime:t,durationMs:n})=>{jn();let r=e.length,o=e.map(f=>cn(f)??t),s=o[r-1]??Date.now(),a=ub(o),c=Math.max(1,Math.round(n*db/1e3)),l=Math.max(Math.round(n/c),cb),m=0,p=0;N({mode:y.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Ps=setInterval(()=>{m++;let f=m/c,g=[],I;for(;p<r&&a[p]<=f;){let C=e[p],A=nn(C);if(d(A)){if(Mr(A)){p++;continue}Qu();return}g.push(..._i(C)),I=C,p++}if(p>=r||m>=c){for(;p<r;p++){let A=nn(e[p]);if(d(A)&&!Mr(A))break}let C=h().replay;N({unappliedEvents:[],replay:C&&{...C,progress:1,appliedCount:r}}),jn(),Ls=setTimeout(Qu,lb);return}let E=h().replay;N({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:I?cn(I)??E?.currentTime??t:E?.currentTime??t,currentLabel:I?ks(I):E?.currentLabel??"",flashNodeIds:I?[...new Set(g)]:E?.flashNodeIds??[]}})},l)};var em=async()=>{let e=ze(h().breadCrumb,"BOARD");if(d(e))return e;let t=await ft(process.cwd());if(d(t))return i("Unable to locate repo root");let n=Se({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=te().commandMeta;if(jn(),r==="now"){let c=Mn(n.value);if(d(c))return i(c.message);let l=It();if(d(l))return l;let m=vt(c.value),{fatal:p,skipped:f}=jt(m);return p.length>0?i(p.map(g=>g.message).join(", ")):(Ht(f),N({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Peeking now",!0))}let s;if(r==="prev"){let c=h().eventLog.at(-1),l=cn(c);if(l===null)return i("No previous event to peek");s=l}else if(r==="next"){let c=h().unappliedEvents.at(0),l=cn(c);if(l===null)return i("No next event to peek");s=l+1}else{let c=Bn(r||o.trim());if(!c)return i("Invalid peek date");s=c.getTime()}let a=Ms({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return d(a)?a:(N({mode:y.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:a.value.unappliedEvents,replay:null}),u("Peeking",!0))};var tm=async()=>{let e=ze(h().breadCrumb,"BOARD");if(d(e))return e;let t=await ft(process.cwd());if(d(t))return i("Unable to locate repo root");let n=Se({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=te().commandMeta,{dateInput:s,durationInput:a}=rs(r,o);if(jn(),h().syncStatus.status==="syncing")return i("Cannot replay while syncing, try again in a moment");let c=Bn(s);if(!c)return i("Invalid replay date");let l=a?ns(a):15e3;if(l===null)return i("Invalid replay duration (try e.g. 30s or 2m)");let m=c.getTime(),p=h(),f=Ms({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?(It(),N(p),u("Nothing to replay from that point",!0)):(Zu({events:g,startTime:m,durationMs:l}),u("Replaying board history",!0))};import pb from"zod";var nm=()=>{let e=te().commandMeta.inputString,t=pb.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return i("Auto sync duration must be a number of at least 3000 ms");let n=at({autoSyncDebounceMs:t.data});return d(n)?n:($e({autoSyncIntervalMs:t.data}),N({mode:y.DEFAULT}),u(`Auto sync interval set to ${t.data}ms`,null))};var rm=()=>{let e=te().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return i("Invalid response");let t=ll(e),n=at({autoSync:t});return d(n)?n:($e({autoSync:t}),N({mode:y.DEFAULT}),u(`Auto sync set to "${e}"`,null))};var om=()=>{let e=te().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return i("Invalid response");let n=at({logLevel:e});return d(n)?n:($e({logLevel:e}),N({mode:y.DEFAULT}),u(`Auto sync set to "${e}"`,null))};import{spawn as fb}from"node:child_process";var gb=()=>{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"]}}},sm=async e=>new Promise(t=>{let{command:n,args:r}=gb();try{let o=fb(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(i(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?u("Copied to clipboard",null):i(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(i(`Clipboard tool not available (${n})`))}});var eo=async(e,t)=>{if(!e.trim())return i(`Nothing to copy: ${t} is empty`);let n=await sm(e);return d(n)?n:u(`Copied ${t} to clipboard`,null)},im=async e=>{let{breadCrumb:t,selectedNode:n}=h(),r=Ur({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return i("Nothing selected to copy from");switch(e.modifier){case Ne.REF:return eo(V(o.id),"ref");case Ne.TITLE:return eo(o.title,"title");case Ne.DESCRIPTION:return r?eo(r.props?.description??"","description"):i("No issue in scope");case Ne.TAGS:{if(!r)return i("No issue in scope");let s=an(r).map(({name:a})=>a);return eo(s.join(", "),"tags")}case Ne.ASSIGNEES:{if(!r)return i("No issue in scope");let s=dn(r).map(({name:a})=>a);return eo(s.join(", "),"assignees")}default:return i("Yank one of: ref, title, description, tags, assignees")}};var am=async()=>{K(""),N({mode:y.DEFAULT});let e=Qe();if(d(e))return i(e.message);if(e.value.syncStatus.status==="syncing")return i("Sync already in progress");N({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Xo();return d(t)?(N({syncStatus:{msg:t.message,status:"failed"}}),t):(N({mode:y.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var hb=e=>e.action==="add.issue.comment",dm=()=>{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)}))},Yt=async()=>{let e=await Rt();return d(e)?e:u("Resolved persist root",e.value)},Ds=[{systemOnly:!0,intent:B.Move,description:"Internal move-state command",mode:y.COMMAND_LINE,action:zu},{intent:B.Delete,description:"Delete the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to resolve child to delete");let o=await Yt();if(d(o))return o;if(r.context==="COMMENT"){let s=r.id,a=M(t)?t.id:t.parentNodeId;if(!a)return i("Unable to resolve comment issue");let c=h().nodes[a];if(!c||!M(c))return i("Unable to resolve comment issue");let l=c.log?.filter(hb).find(m=>m.payload.id===s);return l?l.payload.author!==e.value.userId?i("You can only delete your own comments"):O([{id:Ke(),action:"delete.issue.comment",payload:{id:s,issue:a},...e.value}],o.value):i("Unable to resolve comment")}return O([{id:Ke(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:y.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=te().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(a=>ve(b.FILTER).map(c=>c.split(n)[0]).includes(a))(r))return i("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return ue(a=>({...a,filters:e==="clear"?[]:[...a.filters,s],mode:y.DEFAULT})),u("Filter updated",null)}},{intent:B.ViewHelp,description:"Open the help screen",mode:y.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return fn({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),N({mode:y.HELP}),u("Viewing help",null)}},{intent:B.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to close issue, no target found");if(!M(r))return i("Cannot close in this context");let o=h().nodes[Ce];if(!o)return i("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return i("Issue is already closed");let s=await Yt();if(d(s))return s;let a=s.value,c=rn(o.id,r.id,{at:"end"},e.value,a);if(d(c))return c;let l=O([{id:Ke(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value}],a);return d(l)?l:u("Issue closed",null)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to reopen issue, no target found");let o=r.context==="TICKET"?u("Resolved ticket",r):Xt(r.id,"TICKET");if(d(o))return i("Cannot reopen in this context");let s=o.value,a=h().nodes[Ce];if(!a)return i("Unable to locate closed swimlane");if(s.parentNodeId!==a.id)return i("Issue is not closed");if(!M(s))return i("Target node is not issue");let c=Ss(s);if(!c)return i("Unable to resolve previous parent from issue history");if(c===a.id)return i("Previous parent resolves to closed swimlane");let l=h().nodes[c];if(!l)return i("Previous parent no longer exists");let m=await Yt();if(d(m))return m;let p=m.value,f=rn(l.id,s.id,{at:"end"},e.value,p);if(d(f))return f;let g=O([{id:Ke(),action:"reopen.issue",payload:{id:s.id,parent:l.id,rank:f.value},...e.value}],p);return d(g)?g:u("Issue reopened",null)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Init,description:"Initialize Epiq in the current git repository",mode:y.COMMAND_LINE,action:ju},{intent:B.OpenProject,description:"Open a recently used epiq project, by number or path",mode:y.COMMAND_LINE,action:Ju,onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.NewItem,description:"Create a new board, swimlane, or issue",mode:y.COMMAND_LINE,action:qu,onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Rename,description:"Rename the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Missing node");if(r.readonly)return i("Cannot rename readonly node");let o=ms();if(!o)return i("Provide a title");let s=await Yt();return d(s)?s:O([{id:Ke(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.UntagTicket,description:"Remove a tag from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=te().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let o=S.findTagByName(r);if(!o)return i(`Tag "${r}" does not exist`);let{selectedNode:s}=h();if(!s)return i("Invalid untag target");let a=Xt(s.id,"TICKET");if(d(a))return i("Unable to untag issue in this context");let c=a.value;if(!M(c))return i("Target node is not issue");if(!(c.props.tags??[]).includes(o.id))return i("Issue is not tagged with that tag");let m=await Yt();return d(m)?m:O([{id:Ke(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}],m.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.TagTicket,description:"Add or create a tag on the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=te().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let{selectedNode:o}=h();if(!o)return i("Invalid tag target");let s=Xt(o.id,"TICKET");if(d(s))return i("Unable to tag issue in this context");let a=s.value;if(!M(a))return i("Target node is not issue");let c=await Yt();if(d(c))return c;let l=S.findTagByName(r),m=l?.id??Ke();return(a.props.tags??[]).includes(m)?i("Already tagged with that tag"):O([...l?[]:[{id:Ke(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:Ke(),action:"add.issue.tag",payload:{id:a.id,tag:m},...e.value}],c.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.AssignUserToTicket,description:"Assign a user to the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=te().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return i("Provide an assignee");let{selectedIndex:a,contextNode:c}=h(),l=J(c.id)[a];if(!l)return i("Invalid assign target");let m=Xt(l.id,"TICKET");if(d(m))return i("Unable to assign issue in this context");let p=m.value;if(!M(p))return i("Target node is not issue");let f=await Yt();if(d(f))return f;let g=dm(),I=!o&&s.toLowerCase()==="me",E,C;if(I)E=e.value.userId,C=g.find(L=>L.id===E)?.name??e.value.userName;else{let L=g.filter(G=>G.name===s);if(L.length>1)return i(`"${s}" matches ${L.length} contributors (${L.map(G=>G.id).join(", ")}). Assign from the GUI to choose by id.`);let $=L[0];if(!$&&!o)return i(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);E=$?.id??Ke(),C=$?.name??s}if((p.props.assignees??[]).includes(E))return i("Assignee already assigned");let w=!!h().contributors[E];return O([...w?[]:[{id:Ke(),action:"create.contributor",payload:{id:E,name:C},...e.value}],{id:Ke(),action:"add.issue.assignee",payload:{id:p.id,assignee:E},...e.value}],f.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=te().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee to remove");let{selectedNode:o}=h();if(!o)return i("Invalid unassign target");let s=Xt(o.id,"TICKET");if(d(s))return i("Unable to unassign in this context");let a=s.value;if(!M(a))return i("Target node is not issue");let c=a.props.assignees??[],l=r.toLowerCase()==="me",m=l?c.filter(g=>g===e.value.userId):dm().filter(g=>g.name===r&&c.includes(g.id)).map(g=>g.id);if(m.length>1)return i(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return i(l?"Issue is not assigned to you":`Issue is not assigned to "${r}"`);let f=await Yt();return d(f)?f:O([{id:Ke(),action:"remove.issue.assignee",payload:{id:a.id,assignee:p},...e.value}],f.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Comment,description:"Add a comment to the selected issue",mode:y.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return i("Provide a comment");if(n.length>4e3)return i(`Cannot exceed ${4e3} characters`);let r=he();if(d(r))return i("Unable to resolve user ID");let{breadCrumb:o,selectedNode:s}=h(),a=ze([...o,s],"TICKET");if(d(a))return i("Edit target must be an issue");let c=a.value;if(!c)return i("Invalid comment target");let l=c.context==="TICKET"?u("Resolved ticket",c):Xt(c.id,"TICKET");if(d(l))return i("Unable to comment on issue in this context");let m=l.value;if(!M(m))return i("Target node is not issue");let p=await Yt();return d(p)?p:O([{id:Ke(),action:"add.issue.comment",payload:{id:Ke(),issue:m.id,author:r.value.userId,md:n},...r.value}],p.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Sync,description:"Pull, commit, and push Epiq state",mode:y.COMMAND_LINE,action:am},{intent:B.Peek,description:"View board state at another point in time",mode:y.COMMAND_LINE,action:em},{intent:B.Replay,description:"Replay board history forward from a point in time",mode:y.COMMAND_LINE,action:tm},{intent:B.Export,description:"Export the current board layout to markdown",mode:y.COMMAND_LINE,action:async()=>{let e=await wu();return d(e)?e:(N({mode:y.DEFAULT}),u("Export successful",!0))}},{intent:B.Exit,description:"Exit the application",mode:y.COMMAND_LINE,action:async()=>(k.exit(),u("Exit successful",!0))},{intent:B.Edit,description:"Edit title or description",mode:y.COMMAND_LINE,action:async(e,t)=>Uu(t),onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:y.COMMAND_LINE,action:async(e,t)=>im(t),onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:y.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case pe.USERNAME:{if(process.env[Gn])return i(`Cannot change the configured user while ${Gn} names this process`);let r=qn();if(d(r))return r;let{userId:o,preferredEditor:s,userName:a}=r.value,c=n||a,l=o||Ke();if(!c||!l)return i("Unable to resolve user name or id");let m=at({userName:c,userId:l,preferredEditor:s??""});return d(m)?m:($e({userName:c,userId:l}),N({mode:y.DEFAULT}),u(`Username set to "${c}"`,null))}case pe.EDITOR:{if(!n)return i("No editor provided");let r=at({preferredEditor:n});return d(r)?r:($e({preferredEditor:n}),N({mode:y.DEFAULT}),u(`Editor configuration set to "${n}"`,null))}case pe.VIEW:{if(n!=="wide"&&n!=="dense")return i("Invalid view mode");let r=at({viewMode:n});return d(r)?r:($e({viewMode:n}),N({mode:y.DEFAULT}),u(`View set to "${n}"`,null))}case pe.AUTOSYNC:return rm();case pe.LOG_LEVEL:return om();case pe.SYNC_DEBOUNCE_MS:return nm();case pe.ATTACHMENT_MAX_KB:return Sl();default:return i("Unknown config command")}}},{intent:B.Coffee,description:"Sponsor the development of Epiq!",mode:y.COMMAND_LINE,action:()=>{let e=te().commandMeta.modifier;return e==="custom"?Qr("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):Qr(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),K(""),u("Thanks you!",null)}}];var vb=new Set(["peek","replay","filter","view-help","yank"]),Ot=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=te();if(!t)return i("No command to confirm");if(!e&&n===Dt.Invalid)return i("Invalid command");let s=ps(t);Wl();let{readOnly:a}=h();if(a&&!vb.has(s))return Wr({status:Qt.Fail,message:"Command not available in readonly state",value:null});let c=Ds.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return Wr({status:Qt.Fail,message:"Command not found",value:null});let l;try{l=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return Wr({status:Qt.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(l)?Wr(l):(Gl({addToHistory:!e}),c.onSuccess?.(),Q().autoSync&&Jo(),l)};var Bs=[{intent:x.Exit,mode:y.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(N({mode:y.COMMAND_LINE}),K("move cancel"),Ot({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:y.DEFAULT,description:"[m] move (init/confirm)",action:()=>(N({mode:y.COMMAND_LINE}),K("move start"),Ot({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:y.MOVE,action:()=>(N({mode:y.COMMAND_LINE}),K("move confirm"),Ot({isForceExecutedBySystem:!0}))}],Fs=[{intent:x.MovePreviousItem,mode:y.MOVE,action:()=>gn()?(N({mode:y.COMMAND_LINE}),K("move previous"),Ot({isForceExecutedBySystem:!0})):i("No pending move")},{intent:x.MoveNextItem,mode:y.MOVE,action:()=>gn()?(N({mode:y.COMMAND_LINE}),K("move next"),Ot({isForceExecutedBySystem:!0})):i("No pending move")}],cm=[{intent:x.MoveToNextContainer,mode:y.MOVE,action:()=>gn()?(N({mode:y.COMMAND_LINE}),K("move to-next"),Ot({isForceExecutedBySystem:!0})):i("No pending move")},{intent:x.MoveToPreviousContainer,mode:y.MOVE,action:()=>gn()?(N({mode:y.COMMAND_LINE}),K("move to-previous"),Ot({isForceExecutedBySystem:!0})):i("No pending move")}];var lm={[F.WORKSPACE]:[...Bs,...Fs],[F.BOARD]:[...Bs,...Fs],[F.SWIMLANE]:[...Bs,...Fs,...cm],[F.TICKET]:[],[F.FIELD]:[],[F.FIELD_LIST]:[],[F.TEXT]:[],[F.COMMENT]:[]};import yb from"node:fs";import bb from"node:path";var um=e=>{let t=_e(process.cwd());if(d(t))return i("Unable to resolve project root");let n=Se({repoRoot:t.value});if(d(n))return i(n.message);let r=er(e.hash,e.ext),o=bb.join(Cr(n.value),r);return yb.existsSync(o)?(Qr(o),u(`Opened ${e.name}`,null)):i("Attachment file not found \u2014 run :sync to fetch it")};var mm=()=>{K("");let{pendingNavTarget:e}=pn();N({mode:y.DEFAULT}),e&&k.navigate(e),fn({pendingNavTarget:void 0})},pm=[{intent:x.ExitCommandLine,mode:y.HELP,action:()=>(mm(),u("Exiting help",null))},{intent:x.Exit,mode:y.HELP,action:()=>(mm(),u("Closed help",null))},{intent:x.NavPreviousItem,mode:y.HELP,description:"[arrows/hjkl] navigate",action:()=>(k.navigateToPreviousItem(),u("Navigating to previous help item",null))},{intent:x.NavNextItem,mode:y.HELP,action:()=>(k.navigateToNextItem(),u("Navigating to next help item",null))},{intent:x.NavToPreviousContainer,mode:y.HELP,action:()=>(k.navigateToPreviousContainer(),u("Navigating to previous help container",null))},{intent:x.NavToNextContainer,mode:y.HELP,action:()=>(k.navigateToNextContainer(),u("Navigating to next help container",null))}];var xb=e=>{N({mode:y.COMMAND_LINE});let{pendingNavTarget:t}=pn();t&&k.navigate(t),fn({pendingNavTarget:void 0}),K(`${e} `)},fm=()=>{K("");let{pendingNavTarget:e}=pn();e&&k.navigate(e),fn({pendingNavTarget:void 0}),N({mode:y.DEFAULT})},gm=[{intent:x.InitCommandPalette,mode:y.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{K("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return fn({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),N({mode:y.PALETTE}),u("Opening command palette",null)}},{intent:x.Confirm,mode:y.PALETTE,action:()=>{let{selectedNode:e}=h();if(!e||!tn(e))return i("Command only applicable on text nodes");if(e.props.disabled)return i("Command is not available in this context");let t=e.title;return t?(xb(t),u("Selected command",t)):u("No command selected",null)}},{intent:x.ExitCommandLine,mode:y.PALETTE,action:()=>(fm(),u("Exiting palette",null))},{intent:x.Exit,mode:y.PALETTE,action:()=>(fm(),u("Closed command palette",null))},{intent:x.NavPreviousItem,mode:y.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(k.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:x.NavNextItem,mode:y.PALETTE,action:()=>(k.navigateToNextItem(),u("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:y.PALETTE,action:()=>(k.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:y.PALETTE,action:()=>(k.navigateToNextContainer(),u("Navigating to next container",null))}];var hm=[...pm,...gm,{intent:x.AddItem,mode:y.DEFAULT,description:"[n] new...",action:()=>(N({mode:y.COMMAND_LINE}),K(`${b.NEW} `),u("Adding new item",null))},{intent:x.Delete,mode:y.DEFAULT,description:"[d] delete",action:()=>(N({mode:y.COMMAND_LINE}),K(`${b.DELETE} `),u("Deleting item",null))},{intent:x.InitCommandLine,mode:y.DEFAULT,description:"[:] focus command line",action:()=>(N({mode:y.COMMAND_LINE}),K(""),u("Entering command line mode",null))},{intent:x.Confirm,mode:y.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=h();if(!Z(e?.id??"")?.length){let r=e?S.getAttachment(e.id):void 0;if(r)return um(r);if(e?.title===ce.DESCRIPTION)return N({mode:y.COMMAND_LINE}),K(`${b.EDIT} description `),u("Propose command",!0);if(e?.title===ce.ASSIGNEES)return N({mode:y.COMMAND_LINE}),K(`${b.ASSIGN} `),u("Propose command",!0);if(e?.title===ce.TAGS)return N({mode:y.COMMAND_LINE}),K(`${b.TAG} `),u("Propose command",!0);if(t.title===ce.DESCRIPTION&&e?.context==="TEXT")return N({mode:y.COMMAND_LINE}),K(`${b.EDIT} description `),u("Propose command",!0)}return k.enterChildNode(),u("Entering context",null)}},{intent:x.Yank,mode:y.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=h(),t=e?.title===ce.DESCRIPTION?Ne.DESCRIPTION:e?.title===ce.TAGS?Ne.TAGS:e?.title===ce.ASSIGNEES?Ne.ASSIGNEES:Ne.REF,r=ve(b.YANK).includes(t)?t:Ne.REF;return N({mode:y.COMMAND_LINE}),K(`${b.YANK} ${r}`),u("Propose command",!0)}},{intent:x.EditTitle,mode:y.DEFAULT,description:"[r] rename title",action:()=>(N({mode:y.COMMAND_LINE}),K(`${b.EDIT} title ${h().selectedNode?.title}`),u("Exiting context",null))},{intent:x.EditDescription,mode:y.DEFAULT,description:"[e] edit description",action:()=>(N({mode:y.COMMAND_LINE}),K(`${b.EDIT} description `),u("Exiting context",null))},{intent:x.Exit,mode:y.DEFAULT,description:"[q] exit context",action:()=>(k.enterParentNode(),u("Exiting context",null))},{intent:x.NavPreviousItem,mode:y.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(k.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:x.NavNextItem,mode:y.DEFAULT,action:()=>(k.navigateToNextItem(),u("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:y.DEFAULT,action:()=>(k.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:y.DEFAULT,action:()=>(k.navigateToNextContainer(),u("Navigating to next container",null))}];var Ib=500,Eb=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),vm=e=>{let t=Eb(e);t&&us(n=>(n+t).slice(0,Ib))};var Sb=[y.COMMAND_LINE,y.PALETTE],Cb=e=>[{intent:x.MoveCursorLeft,mode:e,action:()=>(pa(-1),u("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:e,action:()=>(pa(1),u("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:e,action:()=>(fa("left"),u("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:e,action:()=>(fa("right"),u("Moving cursor right of word",null))},{intent:x.AutoCompleteCommand,mode:e,action:()=>(us((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:x.CaptureInput,mode:e,action:(t,{sequence:n})=>(vm(n??""),u("Capturing input",null))},{intent:x.EraseInput,mode:e,action:()=>(jl(),u("Erasing input",null))},{intent:x.EraseInputWord,mode:e,action:()=>(Hl(),u("Erasing input word",null))}],ym=[{intent:x.Confirm,mode:y.COMMAND_LINE,action:()=>(Ot(),u("Executing command",null))},{intent:x.ViewHelp,mode:y.DEFAULT,action:()=>(N({mode:y.HELP}),u("Viewing help",null))},...Sb.flatMap(Cb),{intent:x.ExitCommandLine,mode:y.COMMAND_LINE,action:()=>(N({mode:y.DEFAULT}),u("Exiting command line",null))},{intent:x.GetLastCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(Vl(),u("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(Kl(),u("Getting next command from history",null))}];import Im from"chalk";var Os=Im.dim.hex(v.secondary2)(": for command line"),bm="q to exit",xm=`${Im.hex(v.accent)("m")} to confirm`,Ua={[F.WORKSPACE]:[Os],[F.BOARD]:[Os],[F.BOARD+y.COMMAND_LINE]:[Os],[F.SWIMLANE]:[Os],[F.TICKET+y.HELP]:[bm],[F.SWIMLANE+y.HELP]:[bm],[F.TICKET]:[],[F.FIELD]:[],[F.SWIMLANE+y.MOVE]:[xm],[F.TICKET+y.MOVE]:[xm]};var dr=e=>e.trim().toLocaleLowerCase(),_a=(e,t)=>dr(e).includes(dr(t));var Nb=e=>{let{tags:t}=h();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},Rb=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=(e,t)=>{let n=dr(t.value);if(!n)return!0;switch(t.target){case"title":return _a(e.title??"",n);case"description":return _a(e.props.description??"",n);case"tag":return Nb(e).map(dr).some(o=>o.includes(n));case"assignee":return Rb(e).map(dr).some(o=>o.includes(n));case"ref":return Lo(e.id,t.value);default:return!0}};function Sm(e,t,n){let r=t[e];if(!r)return i("buildBreadCrumb(): current node not found");let o=[],s=r;for(;s&&(o.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?i("buildBreadCrumb(): node is not connected to root"):(o.reverse(),u("Breadcrumb built",o))}var Cm=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 Jt,$a,ja=new Set,Ha=()=>{for(let e of ja)e()},Tb=e=>(ja.add(e),()=>ja.delete(e));function Wa(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return i("derive(): contextNodeId is missing");if(!r)return i("derive(): rootNode is missing");if(!o[r])return i("derive(): unable to find root node");let c=o[t];if(!c)return i("Unable to derive state, contextNode not found");let l=Sm(t,o,r);if(d(l))return logger.error(l.message),l;let m=l.value,{context:p}=c,f=Ua[p+n]??Ua[p]??[],g=[...hm,...lm[p]??[],...ym],I=Cm(g),E=wb(o,s),C=E[t]?.[e.selectedIndex]??null;return u("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:f,availableActions:g,actionIndex:I,selectedNode:C,renderedChildrenIndex:E})}var h=()=>{if(!Jt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Jt},Qe=()=>Jt?u("Retrieved state",Jt):i("State not initialized. Call initWorkspaceState() first.");function Pr(e){$a=e;let t=_e(process.cwd()),n=!1;if(!d(t)){let s=Ct(t.value);if(d(s))return i(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:y.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=Wa(r);return d(o)?o:(Jt=o.value,Ha(),u("State initialized",null))}var to=!1,Us=null;function ue(e){let t=h(),n=e(t);if(to)return Us=n,Jt={...t,...n},u("State updated",null);let r=Wa(n);return d(r)?i(r.message??"Unable to update state"):(Jt=r.value,Ha(),u("State updated",null))}function pc(e){if(to)return u("Joined batch",e());to=!0,Us=null;let t=()=>{let n=Us;if(to=!1,Us=null,n===null)return null;let r=Wa(n);return d(r)?i(r.message??"Unable to update state"):(Jt=r.value,Ha(),u("State updated",null))};try{let n=e(),r=t();return r&&d(r)?i(r.message):u("State updated",n)}finally{to&&t()}}var N=e=>ue(t=>({...t,...e}));var z=()=>Ab(Tb,h,h),wb=(e,t)=>{let n={};for(let r of Object.values(e))M(r)&&t.length>0&&!t.every(o=>Em(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,s)=>{let a=e[o.id],c=e[s.id];return!a||!c?0:a.rank.localeCompare(c.rank)});return n},J=e=>h()?.renderedChildrenIndex[e]??[],It=()=>$a?Pr($a):i("Cannot reset state: no initial workspace found"),wt=()=>Jt!==void 0;var Xt=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r)return i("Node not found");if(r.context===t)return u("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return u("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},Ga=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},hn=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:i("Node not found"),S={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.userId&&n.userId!==t)return i("Contributor is already linked to another user");let r={...n,userId:t},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?i("Unable to link contributor to user"):u("Linked contributor to user",r)},deleteNode(e){ue(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create comment, missing issue");if(!M(t))return i("Can only comment on issues");let n=ue(r=>({...r,comments:{...r.comments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?i("Unable to create comment"):u("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return i("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return i("Unable to edit comment, missing issue");if(!M(r))return i("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=ue(a=>({...a,comments:{...a.comments??{},[e]:o}}));return d(s)?i("Unable to edit comment"):u("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return i("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=ue(o=>({...o,comments:{...o.comments??{},[e]:n}}));return d(r)?i("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)},createAttachment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create attachment, missing issue");if(!M(t))return i("Can only attach to issues");let n=ue(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?i("Unable to create attachment"):u("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return i("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=ue(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return d(r)?i("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)},editValue(e,t){let{nodes:n}=h(),r=n[e];if(!r)return i("Edit target node not found");let o=hn(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 i("Rename target node not found");let r=hn(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 Z(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 i("Node not found");if(!s)return i("Target parent not found");if(r===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let a=hn(o,"move");if(a)return a;if(Ga(t,e))return i("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),u("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=h(),o=this.getNode(e);if(!o)return i("Node not found");if(r===e)return i("Cannot delete root node");let s=hn(o,"delete");if(s)return s;let a=new Set,c=m=>{let p=t[m];if(!(!p||a.has(m))){a.add(m);for(let f of Z(p.id))c(f.id)}};c(e);let l={...structuredClone(t)};for(let m of a){if(!l[m])return i("Unable to locate node to delete");l[m]={...l[m],isDeleted:!0}}return n?(N({nodes:l}),u("Successfully tomb stoned",o)):i("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return i("Contributor not found");let n={...t,name:Mo,tombstoned:!0},r=ue(o=>({...o,contributors:{...o.contributors,[e]:n}}));return d(r)?i("Unable to remove contributor"):u("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.tombstoned)return i("Cannot rename a removed contributor");let r={...n,name:t},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?i("Unable to rename contributor"):u("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");let r={...n,name:t,tombstoned:!1},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?i("Unable to restore contributor"):u("Restored contributor",r)},createContributor(e){let t=ue(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?i("Unable to create contributor"):u("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return i("Unable to assign contributor, missing contributor");if(!r)return i("Unable to assign contributor, missing target");let o=hn(r,"edit");if(o)return o;if(!M(r))return i("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return i("Contributor already assigned");let a={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(a),u("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!r)return i("Unable to unassign, missing target");let o=hn(r,"edit");if(o)return o;if(!M(r))return i("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 a={...r,props:{...r.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(a),u("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return i("Unable to add tag, missing tag");if(!r)return i("Unable to add tag, missing target");let o=hn(r,"edit");if(o)return o;if(!M(r))return i("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return i("Tag already assigned");let a={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(a),u("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),r=this.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!r)return i("Unable to remove tag, missing target");let o=hn(r,"edit");if(o)return o;if(!M(r))return i("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 a={...r,props:{...r.props,tags:s.filter(c=>c!==t)}};return this.updateNode(a),u("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return i("Tag not found");let n={...t,tombstoned:!0},r=ue(o=>({...o,tags:{...o.tags,[e]:n}}));return d(r)?i("Unable to delete tag"):u("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return i("Tag not found");let r={...n,name:t,tombstoned:!1},o=ue(s=>({...s,tags:{...s.tags,[e]:r}}));return d(o)?i("Unable to restore tag"):u("Restored tag",r)},createTag(e){let t=ue(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?i("Could not create tag"):u("Tag created",e)},createNode(e){let t=ue(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?i("Unable to create node"):u("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},r=ue(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?i(r.message):u("Locked node",n)},updateNode(e){let t=ue(n=>({...n,nodes:{...n.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 Z(e)}};var Pb=(e,t)=>e+" ".repeat(Math.max(0,t-Nm(e))),Lb=(e,t)=>" ".repeat(Math.max(0,t-Nm(e)))+e,_s=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`),kb=(e,t)=>t?e<t?"up":e>t?"down":null:null,Db=(e,t)=>{let n=S.getNode(e.payload.parent),r=n?vn.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=kb(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},Rm=e=>`${Math.max(1,Math.round(e/1024))} KB`,Am=e=>S.getAttachment(e)?.name??"",Bb=e=>{switch(e.action){case"add.issue.tag":{let t=h().tags[e.payload.tag];return t?vn.bgHex(oe(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=h().tags[e.payload.tag];return t?vn.bgHex(oe(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?vn.hex(oe(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?vn.hex(oe(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}" ${vn.dim(`(${Rm(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Am(e.payload.id);return t?`"${t}"`:""}default:return""}},Fb=e=>{let t=ir(Mb(e));return vn.gray(Lb(t,8))},Ob=12,Ub=e=>Pb(`${e}`,Ob),_b=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=S.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${Rm(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Am(e.payload.id);return t?`"${t}"`:""}default:return""}},ks=e=>[_s(e.action),_b(e)].filter(Boolean).join(" "),Tm=(e,t)=>{let n=Fb(e.id),r=Ub(e.userName),o=vn.dim("\u203A"),s=e.action==="move.node"?Db(e,t):[_s(e.action),Bb(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var $b=e=>we(e,"comments"),jb=e=>we(e,"description"),Hb=e=>we(e,"assignees"),Wb=e=>we(e,"tags"),Gb=e=>we(e,"history"),Vb=e=>we(e,"attachments"),$s=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:a="horizontal"})=>{let c=S.getNode(e);if(!c){let p=S.createNode({...le.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:a});return d(p)?p:u("Virtual field created",void 0)}if(!tt(c))return i(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==r||c.props.value!==o||c.readonly!==s||c.childRenderAxis!==a))return u("Virtual field unchanged",void 0);let m=S.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:a});return d(m)?m:u("Virtual field updated",void 0)},wm=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let a=S.getNode(e);if(!a){let m=S.createNode({...le.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(!Ar(a))return i(`Existing virtual node ${e} is not a field list`);if(!(a.title!==t||a.parentNodeId!==n||a.rank!==r||a.readonly!==o||a.childRenderAxis!==s))return u("Virtual field list unchanged",void 0);let l=S.updateNode({...a,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return d(l)?l:u("Virtual field list updated",void 0)},fc=e=>{let t=nt(gt/4n),n=nt(gt/2n),r=nt(gt*3n/4n),o=nt(gt*7n/8n),s=nt(gt*15n/16n),a=nt(gt*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(a))return a;let c=$s({id:jb(e.id),name:ce.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(c))return c;let l=wm({id:Hb(e.id),name:ce.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(l))return l;let m=wm({id:Wb(e.id),name:ce.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(d(m))return m;let p=$s({id:$b(e.id),name:ce.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(p))return p;let f=$s({id:Vb(e.id),name:ce.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(d(f))return f;let g=$s({id:Gb(e.id),name:ce.HISTORY,parentNodeId:e.id,rank:a.value,value:Kb(e),readonly:!0,childRenderAxis:"vertical"});return d(g)?g:u("Ticket virtual nodes materialized",void 0)},Kb=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=>Tm(r,n.get(r.action)??[])).join(`
|
|
72
|
+
`)},Mm=!0,Pm=e=>{Mm=e},$i=()=>Mm;import fx from"node:http";import Hn from"node:path";import{fileURLToPath as gx}from"node:url";import{decodeTime as ro,ulid as W}from"ulid";import{existsSync as Va}from"node:fs";import{chmod as Ka}from"node:fs/promises";import $m from"node:os";import lr from"node:path";var Lm=(e,t)=>e.reduce((n,r)=>r<n?r:n,t);var km=1e5,zb=2e4,js=null,Dm=Promise.resolve(),yn=e=>{let t=Dm.then(e,e);return Dm=t.then(()=>{},()=>{}),t},Hs=e=>{let t=_e(e??process.cwd());return d(t)?i(t.message):u("Resolved Epiq repo root",t.value)},za=e=>{let t=Hs(e);return d(t)?t:Se({repoRoot:t.value})},mt=()=>{if(!wt())return{mode:"live",asOfTime:null};let{timeMode:e}=h();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:js}},qb=e=>{let t=new Map;for(let n of e){if(n.action!=="create.tag"&&n.action!=="create.contributor")continue;let r=n.payload;r?.id&&r.name&&t.set(r.id,r.name)}return t},jm=e=>{let t=e.payload;return e.action==="tombstone.tag"||e.action==="restore.tag"?t?.id:t?.tag},Yb=(e,t)=>{let n=e.payload,r=jm(e),o=r!==void 0?t.get(r)??"":n?.assignee!==void 0?t.get(n.assignee)??"":n?.name!==void 0?`"${n.name}"`:"";return[e.action?_s(e.action):"",o].filter(Boolean).join(" ")},Bm=(e,t)=>{if(!e)return null;let n=t.get(e)??e;return{id:e,name:n,color:oe(n)}},Xb=(e,t)=>{let n=e.payload;return{actor:e.userId?{id:e.userId,name:e.userName??e.userId,color:oe(e.userName??e.userId)}:null,tag:Bm(jm(e),t),assignee:Bm(n?.assignee,t)}},qa=(e,t)=>{let n=new Map,r=new Set,o=a=>{let c=new Set,l=a;for(;l&&!c.has(l);){if(r.has(l))return l;c.add(l),l=n.get(l)}return null},s=[];for(let a of e){let c=a.payload,l=c?.id;if(!l)continue;a.action==="add.board"&&r.add(l);let m=c.parent??c.issue;m&&n.set(l,m),(l===t||o(l)===t)&&s.push(a)}return s},Hm=async(e={})=>{let t=za(e.repoRoot);if(d(t))return i(t.message);let n=Mn(t.value);if(d(n))return i(n.message);let r=e.boardId?qa(n.value,e.boardId):n.value,o=qb(n.value),s=r.flatMap(E=>{let C=cn(E);return C===null?[]:[{id:E.id,t:C,action:E.action,label:Yb(E,o),...Xb(E,o)}]}),a=Date.now(),c=e.end??a,l=e.start??Lm(s.map(E=>E.t),c);if(c<=l)return u("Empty time window",{bucketMs:0,buckets:[],events:[],earliest:l,latest:c});let m=s.filter(E=>E.t>=l&&E.t<c).sort((E,C)=>E.t-C.t),p=m.map(E=>E.t),f=Math.max(1,Math.ceil((c-l)/km)),g=new Map;for(let E of p){let C=Math.min(km-1,Math.floor((E-l)/f)),A=l+C*f;g.set(A,(g.get(A)??0)+1)}let I=[...g.entries()].sort(([E],[C])=>E-C).map(([E,C])=>({t:E,count:C}));return u("Computed event timeline",{bucketMs:f,buckets:I,events:m.length>zb?[]:m,earliest:l,latest:c})},no="",Fm="",Jb=5e3,cr=null;var Ya=async(e={})=>{let t=Hs(e.repoRoot);if(d(t))return i(t.message);let n=Ct(t.value);if(d(n))return i(n.message);let r=e.start===void 0&&e.end===void 0;if(r&&cr&&cr.repoRoot===t.value&&cr.stateBranch===n.value.stateBranch&&Date.now()-cr.fetchedAt<Jb)return u("Computed commit timeline",cr.result);let o=await _({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=${Fm}%H${no}%at${no}%an${no}%s`]});if(d(o))return i(o.message);let s=o.value.stdout.split(Fm).filter(a=>a.trim().length>0).map(a=>{let[c,...l]=a.split(`
|
|
73
|
+
`),[m,p,f,...g]=(c??"").split(no);if(!m||!p)return null;let I=l.join(" "),E=Number(/(\d+) insertion/.exec(I)?.[1]??0),C=Number(/(\d+) deletion/.exec(I)?.[1]??0);return{sha:m,time:Number(p)*1e3,author:f??"unknown",subject:g.join(no),linesChanged:E+C,insertions:E,deletions:C}}).filter(a=>a!==null).filter(a=>(e.start===void 0||a.time>=e.start)&&(e.end===void 0||a.time<=e.end));return r&&(cr={repoRoot:t.value,stateBranch:n.value.stateBranch,fetchedAt:Date.now(),result:s}),u("Computed commit timeline",s)},Wm=async e=>{let t=e.ref.trim();if(!t)return i("ref must not be empty");if(t.length!==7)return i(`"${t}" is ${t.length} characters; a ref is ${7}. Read it off the issue rather than slicing the id by hand.`);let n=await Ya({repoRoot:e.repoRoot});if(d(n))return i(n.message);let r=`${t.toUpperCase()} `,o=c=>c.subject.toUpperCase().startsWith(r),s=n.value,a=[];for(let[c,l]of s.entries()){if(!o(l))continue;let m=s[c+1];a.push({...l,precedingSha:m&&o(m)?m.sha:null})}return u("Matched commits by ref",a)},Gm=e=>/^[0-9a-f]{7,40}$/i.test(e),Qb=async(e,t)=>{let n=await _({cwd:e,args:["show",t]});if(d(n))return i(n.message);let r=lr.join($m.tmpdir(),"epiq","commit-diffs");Te.mkDir(r);let o=lr.join(r,`${t}.diff`);return Va(o)||(Te.writeToFile(o,n.value.stdout),await Ka(o,292)),Ou(o)},Zb=12,ex=800,Om=async(e,t,n)=>{let r=await _({cwd:e,args:["show",`${t}:${n}`]});return d(r)?"":r.value.stdout},tx=async(e,t)=>{let n=await _({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(d(n))return i(n.message);let r=n.value.stdout.split(`
|
|
74
|
+
`).map(o=>o.trim()).filter(Boolean);return r.length===0?i("No changed files found for this commit"):u("Listed changed files",r)},nx=async(e,t,n)=>{let r=await tx(e,t);if(d(r))return i(r.message);let o=r.value;if(o.length>Zb)return i(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=lr.join($m.tmpdir(),"epiq","commit-diffs",t),a=await Promise.all(o.map(async(f,g)=>{let[I,E]=await Promise.all([Om(e,`${t}~1`,f),Om(e,t,f)]),C=lr.basename(f),A=lr.join(s,String(g),"before",C),w=lr.join(s,String(g),"after",C);return Va(A)||(Te.writeToFile(A,I),await Ka(A,292)),Va(w)||(Te.writeToFile(w,E),await Ka(w,292)),{beforePath:A,afterPath:w}})),[c,...l]=a;if(!c)return i("No changed files found for this commit");let m=await La(n,c.beforePath,c.afterPath,"new");if(d(m)||l.length===0)return m;await new Promise(f=>setTimeout(f,ex));let p=await Promise.all(l.map(({beforePath:f,afterPath:g})=>La(n,f,g,"reuse")));for(let f of p)d(f)&&logger.error(`Failed to open an additional diff tab for ${t}: ${f.message}`);return m},Vm=async e=>{if(!Gm(e.sha))return i("Invalid commit sha");let t=Hs(e.repoRoot);if(d(t))return i(t.message);let n=t.value,r=Ns()[0];if(r&&Pa(r)){let o=await nx(n,e.sha,r);if(!d(o))return o;logger.error(`Side-by-side diff failed for ${e.sha}, falling back to unified diff: ${o.message}`)}return Qb(n,e.sha)},rx=200,Um=e=>/^0+$/.test(e),_m=/^:\d{6} \d{6} ([0-9a-f]{40}) ([0-9a-f]{40}) [A-Z]\d*\t(.+)$/,ox=async(e,t)=>{let n=await _({cwd:e,args:["diff","--raw","--no-renames","--abbrev=40",`${t}~1`,t]});if(d(n))return i(n.message);let r=n.value.stdout.split(`
|
|
75
|
+
`).filter(a=>a!==""),o=r.filter(a=>!_m.test(a));if(o.length>0)return i(`Could not parse ${o.length} line(s) of "git diff --raw" output, e.g. "${o[0]}"`);let s=r.map(a=>{let c=_m.exec(a),l=c?.[1]??"",m=c?.[2]??"";return{path:c?.[3]??"",beforeBlob:Um(l)?null:l,afterBlob:Um(m)?null:m}});return s.length===0?i("No changed files found for this commit"):u("Listed changed files with blob hashes",s)},Km=async e=>{if(!Gm(e.sha))return i("Invalid commit sha");let t=Hs(e.repoRoot);if(d(t))return i(t.message);let n=t.value,r=await ox(n,e.sha);if(d(r))return i(r.message);let o=r.value;if(o.length>rx)return i(`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)),a=await Nd(s,n);if(d(a))return i(a.message);let c=a.value,l=o.map(m=>({path:m.path,before:m.beforeBlob?c.get(m.beforeBlob)??"":"",after:m.afterBlob?c.get(m.afterBlob)??"":""}));return u("Loaded commit diff",{sha:e.sha,files:l})},zm=e=>{let t=Mn(e);if(d(t))return i(t.message);let n=It();if(d(n))return i(n.message);js=null;let r=vt(t.value),{fatal:o,skipped:s}=jt(r);return o.length>0?i(o.map(a=>a.message).join(", ")):(Ht(s),N({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Restored live state",!0))},sx=(e,t)=>{js=null;let n=zm(e);return d(n)?i(`${t} (recovery to live also failed: ${n.message})`):i(t)},qm=e=>yn(async()=>{let t=za(e.repoRoot);if(d(t))return i(t.message);let n=Oo(t.value,e.targetTime);if(d(n))return i(n.message);let{appliedEvents:r,unappliedEvents:o}=n.value,s=It();if(d(s))return s;let a=vt(r),{fatal:c,skipped:l}=jt(a);return c.length>0?sx(t.value,c.map(m=>m.message).join(", ")):(Ht(l),N({readOnly:!0,timeMode:"peek",unappliedEvents:o,replay:null}),js=e.targetTime,u("Checked out historical state",{asOfTime:e.targetTime}))}),Ym=(e={})=>yn(async()=>{let t=za(e.repoRoot);if(d(t))return i(t.message);let n=zm(t.value);return d(n)?i(n.message):u("Returned to live state",!0)});var Xa=()=>{let e=At();return d(e)?kt:e.value.attachmentMaxKb??kt},Gs=e=>{let t=_e(e??process.cwd());return d(t)?i(t.message):u("Resolved Epiq repo root",t.value)},fe=async(e,t)=>{let n=Gs(e);if(d(n))return n;let r=Se({repoRoot:n.value});if(d(r))return i(r.message);let o=Zt(n.value);if(d(o))return i(o.message);let s=await Yi({repoRoot:n.value,stateBranchName:o.value});if(d(s))return i(s.message);let a=await Dn({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(d(a))return i(a.message);if(t?.pull??!1){let m=await _({cwd:r.value,args:["pull","--ff-only"]});d(m)&&Y.info(3,m.message)}let c=Wt(r.value);if(d(c))return i(c.message);let l=Gt(c.value.events,c.value.unreadable);return d(l)?i(l.message):u("Booted Epiq state",{repoRoot:n.value,stateBranchRoot:r.value})},ge=()=>{let e=At();return d(e)?i(e.message):e.value.userId?e.value.userName?u("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},ye=()=>{let e=Qe();return d(e)?i(e.message):e},np=e=>(e.props.tags??[]).map(t=>S.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:oe(t.name)})),ix=()=>{let e=Qe(),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},rp=(e,t)=>{let n=new Map(e);for(let r of Object.values(t))n.set(r.id,r.name);return n},op=e=>(e.props.assignees??[]).map(t=>S.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:oe(n)}));var sp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ye();if(d(n))return n;let r=n.value.nodes,o=Object.values(r).filter(M).filter(s=>!s.isDeleted).filter(s=>e.includeClosed||s.parentNodeId!==Ce).filter(s=>e.boardId?(s.parentNodeId?r[s.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(s=>({id:s.id,ref:V(s.id),title:qe(s.title),description:s.props.description??"",createdAt:ro(s.id),parentNodeId:s.parentNodeId,isClosed:s.parentNodeId===Ce,readonly:!!s.readonly,tags:np(s),assignees:op(s)}));return u("Listed issues",o)},ip=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=qe(e.title);if(!o)return i("Issue title cannot be empty");let s=e.description??"",a=yt("Issue title",o,300)??yt("Issue description",s,1e5);if(a)return i(a);if((e.tagNames?.length??0)>20)return i(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return i(`Cannot set more than ${20} assignees at once`);let c=kn(e.parentId,n.value,t.value.stateBranchRoot);if(d(c))return c;let l=As({name:o,parent:e.parentId,user:n.value,rank:c.value});if(d(l))return l;let m=[...l.value],p=m.find(E=>E.action==="add.issue")?.payload.id;if(!p)return i("Unable to determine created issue id");s&&m.push({id:W(),...n.value,action:"edit.description",payload:{id:p,md:s}});let f=[];for(let E of e.tagNames??[]){let C=qe(E).trim();if(!C||f.some($=>$.name===C))continue;let A=yt("Tag name",C,60);if(A)return i(A);let w=S.findTagByName(C),L=w?.id??W();w||m.push({id:W(),...n.value,action:"create.tag",payload:{id:L,name:C}}),m.push({id:W(),...n.value,action:"add.issue.tag",payload:{id:p,tag:L}}),f.push({id:L,name:C})}let g=[];for(let E of e.assigneeNames??[]){let C=qe(E).trim();if(!C||g.some($=>$.name===C))continue;let A=yt("Assignee name",C,80);if(A)return i(A);let w=Object.values(r.value.contributors).find($=>$.name===C),L=w?.id??W();w||m.push({id:W(),...n.value,action:"create.contributor",payload:{id:L,name:C}}),m.push({id:W(),...n.value,action:"add.issue.assignee",payload:{id:p,assignee:L}}),g.push({id:L,name:C})}let I=O(m,t.value.stateBranchRoot);return d(I)?i(I.message):u("Created issue",{id:p,ref:V(p),title:o,parentId:e.parentId,description:s,tags:f,assignees:g})},ap=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=rn(Ce,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(r))return r;let o={id:W(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:Ce,rank:r.value}},s=O([o],t.value.stateBranchRoot);return d(s)?i(s.message):u("Closed issue",{id:e.issueId,ref:V(e.issueId)})},dp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Target node is not issue");if(o.parentNodeId!==Ce)return i("Issue is not closed");let s=Ss(o);if(!s)return i("Unable to resolve previous parent from issue history");if(s===Ce)return i("Previous parent resolves to closed swimlane");let a=r.value.nodes[s];if(!a)return i("Previous parent no longer exists");let c=rn(a.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let l={id:W(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:a.id,rank:c.value}},m=O([l],t.value.stateBranchRoot);return d(m)?i(m.message):u("Reopened issue",{id:o.id,ref:V(o.id),parentId:a.id})},cp=async e=>{let t=Gs(e.repoRoot);if(d(t))return t;let n=ge();if(d(n))return n;let r=Se({repoRoot:t.value});if(d(r))return r;let o=Wt(r.value);if(d(o))return o;let s=Gt(o.value.events,o.value.unreadable);if(d(s))return s;let a=rn(e.parentId,e.issueId,e.position??{at:"end"},n.value,r.value);if(d(a))return a;let c={id:W(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:a.value}},l=O([c],r.value);return d(l)?i(l.message):u("Moved issue",{id:e.issueId,ref:V(e.issueId),parentId:e.parentId})},lp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.boardId];if(!o)return i("Board not found");if(!Tr(o))return i("Target parent must be a board");if(o.readonly)return i("Cannot add a swimlane to a readonly board");if(mt().mode!=="live")return i("Cannot add a swimlane while time travelling");let s=qe(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let a=yt("Swimlane title",s,300);if(a)return i(a);let c=kn(e.boardId,n.value,t.value.stateBranchRoot);if(d(c))return c;let l=W(),m={id:W(),...n.value,action:"add.swimlane",payload:{id:l,name:s,parent:e.boardId,rank:c.value}},p=O([m],t.value.stateBranchRoot);return d(p)?i(p.message):u("Created swimlane",{id:l,ref:V(l),title:s,boardId:e.boardId})},up=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!Tt(o))return i("Edit target must be a swimlane");if(o.readonly)return i("Cannot edit readonly swimlane");let s=qe(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let a=yt("Swimlane title",s,300);if(a)return i(a);if(o.title===s)return u("No changes made",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s});let c={id:W(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Edited swimlane title",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s})},mp=async e=>{let t=Gs(e.repoRoot);if(d(t))return t;let n=ge();if(d(n))return n;let r=Se({repoRoot:t.value});if(d(r))return r;let o=Wt(r.value);if(d(o))return o;let s=Gt(o.value.events,o.value.unreadable);if(d(s))return s;let a=rn(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(d(a))return a;let c={id:W(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:a.value}},l=O([c],r.value);return d(l)?i(l.message):u("Moved swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId),boardId:e.boardId})},pp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!Tt(o))return i("Delete target must be a swimlane");let s={id:W(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):u("Deleted swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId)})},Vs=async(e={})=>{Wo();let t=Gs(e.repoRoot);if(d(t))return i("Sync failed");let n=ge();if(d(n))return n;let r=await Yo({cwd:t.value,ownEventFileName:Ln(n.value)});return d(r)?(Ki(r.message),r):(Go(),u("Synced",r.value))},fp=e=>{let t=ye();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:ro(r.id),action:r.action,label:ks(r),actor:{id:r.userId,name:r.userName,color:oe(r.userName)}}))):i("Issue not found")};var ur=()=>{let e=ye();if(d(e))return e;let t=mt(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(f=>Tr(f)&&!f.isDeleted),s=new Map,a=new Map;for(let f of r)if(!f.isDeleted){if(Tt(f)&&f.parentNodeId){let g=s.get(f.parentNodeId)??[];g.push(f),s.set(f.parentNodeId,g)}if(M(f)&&f.parentNodeId){let g=a.get(f.parentNodeId)??[];g.push(f),a.set(f.parentNodeId,g)}}let c=At();if(d(c))return c;let l={};for(let f of r.filter(M))f.isDeleted||(l[f.id]=S.getCommentsByIssue(f.id).map(g=>{let I=S.getContributor(g.authorId);return{id:g.id,issueId:g.issue,body:g.md,author:{id:g.authorId,name:I?.name??"Unknown",color:oe(I?.name??g.authorId)},createdAt:ro(g.id)}}));let m=new Map;for(let f of e.value.eventLog)f.action==="add.issue.attachment"&&m.set(f.payload.id,f.payload.author);let p={};for(let f of r.filter(M))f.isDeleted||(p[f.id]=S.getAttachmentsByIssue(f.id).map(g=>({id:g.id,issueId:g.issue,name:g.name,fileName:er(g.hash,g.ext),bytes:g.bytes,createdAt:ro(g.id),canDelete:m.get(g.id)===c.value.userId})));return u("Retrieved Epiq GUI state",{boards:o.sort((f,g)=>f.rank.localeCompare(g.rank)).map(f=>({id:f.id,ref:V(f.id),title:f.title,readonly:!!f.readonly||n,swimlanes:(s.get(f.id)??[]).sort((g,I)=>g.rank.localeCompare(I.rank)).map(g=>({id:g.id,title:g.title,readonly:!!g.readonly||n,issues:(a.get(g.id)??[]).sort((I,E)=>I.rank.localeCompare(E.rank)).map(I=>({id:I.id,ref:V(I.id),title:qe(I.title),description:I.props.description??"",createdAt:ro(I.id),readonly:!!I.readonly||n,tags:np(I),assignees:op(I),parentNodeId:I.parentNodeId,isClosed:I.parentNodeId===Ce})),parentNodeId:g.parentNodeId}))})),tags:S.getTags().map(f=>({...f,color:oe(f.name)})),contributors:Object.values(e.value.contributors).map(f=>({...f,color:oe(f.name)})),user:{name:c.value.userName??"",id:c.value.userId??"",color:oe(c.value.userName??"")},commentsByIssueId:l,attachmentsByIssueId:p,attachmentMaxKb:Xa(),timeTravel:t})},Qm=null,ax=e=>{if(e===Qm)return;let t=Zo({root:e});if(d(t)){Y.info(t.message);return}Qm=e},Et=async(e={})=>{if(mt().mode!=="live")return ur();let t=await fe(e.repoRoot,{pull:!1});return d(t)?t:(ax(t.value.repoRoot),ur())},gp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=yt("Issue description",e.description,1e5);if(s)return i(s);let a=o.props.description??"";if(a===e.description)return u("No changes made",{id:e.issueId,ref:V(e.issueId),description:a});let c={id:W(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Edited issue description",{id:e.issueId,ref:V(e.issueId),description:e.description})},hp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=qe(e.title);if(!s.trim())return i("Issue title cannot be empty");let a=yt("Issue title",s,300);if(a)return i(a);if(o.title===s)return u("No changes made",{id:e.issueId,ref:V(e.issueId),title:s});let c={id:W(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Edited issue title",{id:e.issueId,ref:V(e.issueId),title:s})},vp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Tag target must be an issue");if(o.readonly)return i("Cannot tag readonly issue");let s=qe(e.tagName).trim();if(!s)return i("Tag name cannot be empty");let a=yt("Tag name",s,60);if(a)return i(a);let c=S.findTagByName(s),l=c?.id??W(),m=[...c?[]:[{id:W(),...n.value,action:"create.tag",payload:{id:l,name:s}}],{id:W(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:l}}],p=O(m,t.value.stateBranchRoot);return d(p)?i(p.message):u("Added issue tag",{id:e.issueId,ref:V(e.issueId),tag:{id:l,name:s}})},yp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.tags[e.tagId];if(!o)return i("Tag not found");if(o.tombstoned)return i("Tag is already deleted");let s=[{id:W(),...n.value,action:"tombstone.tag",payload:{id:e.tagId}}],a=O(s,t.value.stateBranchRoot);return d(a)?i(a.message):u("Deleted tag",{id:o.id,name:o.name})};var bp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Untag target must be an issue");if(o.readonly)return i("Cannot untag readonly issue");if(!r.value.tags[e.tagId])return i("Tag not found");let s={id:W(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):u("Removed issue tag",{id:e.issueId,ref:V(e.issueId),tagId:e.tagId})},xp=async(e,t)=>{let n=Vi(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}},Ip=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Assign target must be an issue");if(o.readonly)return i("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let A=r.value.contributors[s],w=A?void 0:await xp(t.value.stateBranchRoot,s);if(!A&&!w)return i("Unknown assignee id");let L=A??w,$=[...A?[]:[{id:W(),...n.value,action:"create.contributor",payload:{id:L.id,name:L.name}}],{id:W(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:L.id}}],G=O($,t.value.stateBranchRoot);return d(G)?i(G.message):u("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:L.id,name:L.name}})}let a=qe(e.assigneeName??"").trim();if(!a)return i("Provide assigneeId, self or assigneeName");let c=yt("Assignee name",a,80);if(c)return i(c);let m=[...rp(ix(),r.value.contributors).entries()].filter(([,A])=>A===a);if(m.length>1)return i(`"${a}" matches ${m.length} contributors (${m.map(([A])=>A).join(", ")}). Assign by assigneeId to choose.`);let p=m[0];if(!p&&!e.createUnlinked)return i(`No contributor named "${a}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[f=W(),g=a]=p??[],E=[...!!r.value.contributors[f]?[]:[{id:W(),...n.value,action:"create.contributor",payload:{id:f,name:g}}],{id:W(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:f}}],C=O(E,t.value.stateBranchRoot);return d(C)?i(C.message):u("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:f,name:g}})},Ep=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;if(!r.value.contributors[e.contributorId])return i("Contributor not found");if(await xp(t.value.stateBranchRoot,e.contributorId))return i("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let a=[{id:W(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],c=O(a,t.value.stateBranchRoot);return d(c)?i(c.message):u("Tombstoned contributor",{id:e.contributorId,name:Mo})};var Sp=async(e={})=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=Mn(t.value.stateBranchRoot);if(d(o))return i(o.message);let s=e.boardId?qa(o.value,e.boardId):o.value,a=new Map,c=new Set,l=new Set,m=Vi(t.value.stateBranchRoot);if(d(m))return i(m.message);for(let I of m.value)I.userId&&l.add(I.userId);for(let I of s)I.userId&&(a.set(I.userId,I.userName??""),c.add(I.userId));let p=r.value.contributors,g=[...rp(a,p).entries()].map(([I,E])=>({id:I,name:E,color:oe(E),isSelf:I===n.value.userId,isExternal:!c.has(I),isRemoved:p[I]?.tombstoned===!0,hasAuthoredAnywhere:l.has(I)}));return u("Listed board contributors",g)},Cp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Unassign target must be an issue");if(o.readonly)return i("Cannot unassign readonly issue");if(!r.value.contributors[e.assigneeId])return i("Assignee not found");let s={id:W(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):u("Removed issue assignee",{id:e.issueId,ref:V(e.issueId),assigneeId:e.assigneeId})},Ks=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Comment target must be an issue");if(o.readonly)return i("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return i("Comment cannot be empty");if(s.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let a=W(),c={id:W(),...n.value,action:"add.issue.comment",payload:{id:a,issue:e.issueId,md:s,author:n.value.userId}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Added issue comment",{id:a,issueId:e.issueId,body:s})},zs=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();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 i("Unable to resolve comment");if(o.payload.author!==n.value.userId)return i("You can only delete your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!M(s))return i("Comment target must be an issue");if(s.readonly)return i("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 c={id:W(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},Np=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();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 i("Unable to resolve comment");if(o.payload.author!==n.value.userId)return i("You can only edit your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!M(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot edit comment on readonly issue");if(r.value.eventLog.some(p=>p.action==="delete.issue.comment"&&p.payload.id===e.commentId))return i("Comment was deleted");let c=e.body.trim();if(!c)return i("Comment cannot be empty");if(c.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${c.length})`);let l={id:W(),...n.value,action:"edit.issue.comment",payload:{id:e.commentId,issue:o.payload.issue,md:c}},m=O([l],t.value.stateBranchRoot);return d(m)?i(m.message):u("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:c})},Rp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Attachment target must be an issue");if(o.readonly)return i("Cannot attach to readonly issue");let s=Buffer.from(e.dataBase64??"","base64"),a=Il(t.value.stateBranchRoot,s,Xa());if(d(a))return a;let c=qe(e.name??"").trim()||"image",l=W(),m={id:W(),...n.value,action:"add.issue.attachment",payload:{id:l,issue:e.issueId,author:n.value.userId,hash:a.value.hash,ext:a.value.ext,name:c,bytes:a.value.bytes}},p=O([m],t.value.stateBranchRoot);return d(p)?i(p.message):u("Added issue attachment",{id:l,issueId:e.issueId,fileName:er(a.value.hash,a.value.ext),bytes:a.value.bytes})},Ap=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();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 i("Unable to resolve attachment");if(o.payload.author!==n.value.userId)return i("You can only delete your own attachments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!M(s))return i("Attachment target must be an issue");if(s.readonly)return i("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 c={id:W(),...n.value,action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},l=O([c],t.value.stateBranchRoot);return d(l)?i(l.message):u("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},Tp=async e=>{let t=await fe(e.repoRoot,{pull:!1});return d(t)?t:El(t.value.stateBranchRoot,e.fileName,Xa())};var dx=15e3,wp=e=>{let t,n=!1,r=!1,o=0,s=()=>{let p=qn();return d(p)?(Y.error(p.message),null):p.value},a=()=>{let p=s();if(!p)return!1;let{autoSync:f,preferredEditor:g}=p,I=At(),E=d(I)?null:I.value.userName;return!!(f&&E&&g)},c=()=>{let p=s()?.autoSyncDebounceMs??dx;return Math.max(0,p-(Date.now()-o))},l=async()=>{if(!(n||r)){r=!0,o=Date.now();try{await yn(async()=>{if(mt().mode!=="live")return;let p=await Vs({repoRoot:e.project.repoRoot});if(d(p))return;let{pulled:f,createdCommit:g,bootstrapped:I}=p.value;!f&&!g&&!I||on({type:"state",payload:await Et({repoRoot:e.project.repoRoot})})})}finally{r=!1,m()}}};function m(){n||!a()||r||t||(t=setTimeout(()=>{t=void 0,l()},c()))}return m(),{queueSync:m,dispose:()=>{n=!0,t&&clearTimeout(t)}}};var cx=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),Ja=(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:!cx.has(n.hostname)},Mp=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:Ja(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 mx}from"ws";var Pp=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 Lp=e=>{let t=Kt({exclude:e});return d(t)?[]:t.value.map(n=>({projectId:n.projectId,name:Qn(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},kp=e=>{let t=Kt();if(d(t))return i(t.message);let n=t.value.find(r=>r.root===e);return n?u("Resolved recent project",n.root):i(`Not a recent project: ${e}`)};import{z as T}from"zod";var q=T.string().min(1),Dp=T.discriminatedUnion("at",[T.object({at:T.literal("start")}),T.object({at:T.literal("end")}),T.object({at:T.literal("before"),sibling:q}),T.object({at:T.literal("after"),sibling:q})]),oo=T.number().finite(),ie=(e,t)=>T.object({type:T.literal(e),payload:t}),qs=e=>T.object({type:T.literal(e)}),lx=T.discriminatedUnion("type",[qs("state:get"),qs("issues:list"),qs("sync"),qs("time-travel:live"),ie("project:open",T.object({root:T.string().min(1)})),ie("issues:create",T.object({title:T.string(),parentId:q,description:T.string().optional(),tagNames:T.array(T.string()).optional()})),ie("swimlane:create",T.object({title:T.string(),boardId:q})),ie("swimlane:edit:title",T.object({swimlaneId:q,title:T.string()})),ie("swimlane:delete",T.object({swimlaneId:q})),ie("swimlane:move",T.object({swimlaneId:q,boardId:q,position:Dp.optional()})),ie("issues:move",T.object({issueId:q,parentId:q,position:Dp.optional()})),ie("issue:edit:title",T.object({issueId:q,title:T.string()})),ie("issue:edit:description",T.object({issueId:q,description:T.string()})),ie("issue:tag:add",T.object({issueId:q,tagName:T.string()})),ie("issue:tag:remove",T.object({issueId:q,tagId:q})),ie("contributor:remove",T.object({contributorId:q})),ie("tag:remove",T.object({tagId:q})),T.object({type:T.literal("contributors:get"),payload:T.object({boardId:q.optional()}).optional()}),ie("issue:assignee:add",T.object({issueId:q,assigneeId:q.optional(),assigneeName:T.string().optional(),createUnlinked:T.boolean().optional()})),ie("issue:assignee:remove",T.object({issueId:q,assigneeId:q})),ie("issue:close",T.object({issueId:q})),ie("issue:reopen",T.object({issueId:q})),ie("issue:comment:add",T.object({issueId:q,body:T.string()})),ie("issue:comment:delete",T.object({issueId:q,commentId:q})),ie("issue:comment:edit",T.object({issueId:q,commentId:q,body:T.string()})),ie("issue:get",T.object({issueId:q})),T.object({type:T.literal("timeline:get"),payload:T.object({start:oo.optional(),end:oo.optional(),boardId:q.optional(),requestId:T.number().finite().optional()}).optional()}),T.object({type:T.literal("commits:get"),payload:T.object({start:oo.optional(),end:oo.optional(),requestId:T.number().finite().optional()}).optional()}),ie("time-travel:scrub",T.object({targetTime:oo})),ie("commit:inspect",T.object({sha:T.string()})),ie("commit:diff:get",T.object({sha:T.string()})),ie("issue:commits:get",T.object({issueId:q}))]);var Bp=e=>{let t=lx.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 ux=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))}),so=e=>d(e)?e:u(e.message,ux(e.value)),Fp=(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 Op=()=>{on({type:"state",payload:so(ur())})},ne=(e,t)=>{e.send(JSON.stringify(t))},io=async(e,t)=>{let n=so(await Et({repoRoot:t}));return d(n)&&n.message===Mi?ne(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:Lp(t)}}):ne(e,{type:"state",payload:n})},px=async(e,t)=>{let n=()=>ne(e,{type:"state",payload:so(ur())});if(mt().mode!=="live")return n();let r=await Et({repoRoot:t});return mt().mode!=="live"?n():ne(e,{type:"state",payload:so(r)})},Fe=async(e,t,n,r,o)=>{if(ne(e,{type:r,payload:o}),d(o))return ne(e,{type:"failed",payload:o.message});n(),px(e,t)},Up=(e,t,{onStateChanged:n,getPort:r})=>{new mx({server:e,path:"/ws",verifyClient:s=>!Ja(s.origin,r())}).on("connection",s=>{Fc(s),s.on("message",async a=>{let c=async l=>{let{type:m}=l,p=t.repoRoot;if(m==="project:open"){let f=kp(l.payload.root);return ne(s,{type:"project:open:result",payload:f}),d(f)?void 0:(t.repoRoot=f.value,io(s,f.value))}if(m==="timeline:get"){let{requestId:f,...g}=l.payload??{};return ne(s,{type:"timeline",requestId:f,payload:await Hm({repoRoot:p,...g})})}if(m==="issue:get"){let f=l.payload?.issueId,g=ur(),I=fp(f);return ne(s,{type:"issue",payload:d(g)?g:u("Issue detail",{...Fp(g.value,f),history:d(I)?[]:I.value})})}if(m==="commits:get"){let{requestId:f,...g}=l.payload??{};return ne(s,{type:"commits",requestId:f,payload:await Ya({repoRoot:p,...g})})}if(m==="commit:inspect")return ne(s,{type:"commit:inspect:result",payload:await Vm({repoRoot:p,sha:l.payload.sha})});if(m==="commit:diff:get"){let{sha:f}=l.payload;return ne(s,{type:"commit:diff:result",payload:{sha:f,result:await Km({repoRoot:p,sha:f})}})}if(m==="issue:commits:get"){let{issueId:f}=l.payload;return ne(s,{type:"issue:commits:result",payload:{issueId:f,result:await Wm({repoRoot:p,ref:V(f)})}})}if(m==="time-travel:scrub"){let f=await qm({repoRoot:p,targetTime:l.payload.targetTime});return ne(s,{type:"time-travel:result",payload:f}),d(f)?void 0:Op()}if(m==="time-travel:live"){let f=await Ym({repoRoot:p});return ne(s,{type:"time-travel:result",payload:f}),d(f)?void 0:Op()}if(m==="state:get")return io(s,p);if(m==="sync"){let f=await Vs({repoRoot:p});return ne(s,{type:"sync:result",payload:f}),n(),io(s,p)}if(m==="issue:comment:add"){let f=await Ks({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:comment:add:result",f)}if(m==="issue:comment:edit"){let f=await Np({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:comment:edit:result",f)}if(m==="issue:comment:delete"){let f=await zs({repoRoot:p,...l.payload});return ne(s,{type:"issue:comment:delete:result",payload:f}),d(f)?ne(s,{type:"failed",payload:f.message}):(n(),io(s,p))}if(m==="issue:edit:description"){let f=await gp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:edit:description:result",f)}if(m==="issue:edit:title"){let f=await hp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:edit:title:result",f)}if(m==="issue:tag:add"){let f=await vp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:tag:add:result",f)}if(m==="issue:tag:remove"){let f=await bp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:tag:remove:result",f)}if(m==="contributor:remove"){let f=await Ep({repoRoot:p,...l.payload});return Fe(s,p,n,"contributor:remove:result",f)}if(m==="tag:remove"){let f=await yp({repoRoot:p,...l.payload});return Fe(s,p,n,"tag:remove:result",f)}if(m==="contributors:get")return ne(s,{type:"contributors",payload:await Sp({repoRoot:p,...l.payload})});if(m==="issue:assignee:add"){let f=await Ip({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:assignee:add:result",f)}if(m==="issue:assignee:remove"){let f=await Cp({repoRoot:p,...l.payload});return Fe(s,p,n,"issue:assignee:remove:result",f)}if(m==="issues:list")return ne(s,{type:"issues",payload:await sp({repoRoot:p})});if(m==="issues:create"){let f=await ip({...l.payload,repoRoot:p});return ne(s,{type:"issues:create:result",payload:f}),d(f)?on({type:"failed",payload:f.message}):(on({type:"issue:created",payload:f.value}),n(),io(s,p))}if(m==="swimlane:create"){let f=await lp({...l.payload,repoRoot:p});return Fe(s,p,n,"swimlane:create:result",f)}if(m==="swimlane:edit:title"){let f=await up({...l.payload,repoRoot:p});return Fe(s,p,n,"swimlane:edit:title:result",f)}if(m==="swimlane:delete"){let f=await pp({...l.payload,repoRoot:p});return Fe(s,p,n,"swimlane:delete:result",f)}if(m==="swimlane:move"){if(!l.payload.position)return ne(s,{type:"error",message:"Missing move position"});let f=await mp({...l.payload,repoRoot:p});return Fe(s,p,n,"swimlane:move:result",f)}if(m==="issues:move"){if(!l.payload.position)return ne(s,{type:"error",message:"Missing move position"});let f=await cp({...l.payload,repoRoot:p});return Fe(s,p,n,"issues:move:result",f)}if(m==="issue:close"){let f=await ap({repoRoot:p,issueId:l.payload.issueId});return Fe(s,p,n,"issue:close:result",f)}if(m==="issue:reopen"){let f=await dp({repoRoot:p,issueId:l.payload.issueId});return Fe(s,p,n,"issue:reopen:result",f)}return ne(s,{type:"error",message:"Unknown message type"})};try{let l=Bp(JSON.parse(a.toString()));if(!l.ok)return ne(s,{type:"error",message:l.error});let m=l.message;return Pp.has(m.type)?await yn(async()=>mt().mode!=="live"?ne(s,{type:"failed",payload:"Read-only while viewing history"}):c(m)):await c(m)}catch(l){return ne(s,{type:"error",message:l instanceof Error?l.message:String(l)})}})})};var hx=Hn.dirname(gx(import.meta.url)),vx=process.env.IS_LOCAL==="true"?Hn.resolve(process.cwd(),"dist/gui"):Hn.join(hx,"gui"),Ys,yx=async()=>(Ys===void 0&&(Ys=await import("node:sea").catch(()=>null)),Ys?.isSea()?Ys:null),Ie=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},bx=e=>Ie(e,409,{isError:!0,message:"Read-only while viewing history"}),Xs=(e,t)=>yn(async()=>mt().mode!=="live"?bx(e):t()),_p=async(e,t=1024*1024)=>new Promise((n,r)=>{let o=[],s=0;e.on("data",a=>{if(s+=a.length,s>t){e.destroy(),r(new Error("Request body too large"));return}o.push(a)}),e.on("end",()=>{let a=Buffer.concat(o).toString("utf8");try{n(a?JSON.parse(a):{})}catch{r(new Error("Invalid JSON body"))}}),e.on("error",r)}),xx=2*1024*1024,Ix={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},Ex=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",$p=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),r=Hn.resolve(vx),o=Hn.resolve(r,n),s=Hn.relative(r,o);if(s.startsWith("..")||Hn.isAbsolute(s))return Ie(t,403,{isError:!0,message:"Forbidden"});let a=await yx();try{let c=a?Buffer.from(a.getAsset(`gui/${s}`)):await jp(o);return t.writeHead(200,{"content-type":Ex(o)}),t.end(c)}catch{return Ie(t,404,{isError:!0,message:`Not found: ${n}`})}},Sx=async(e,t=3710)=>new Promise((n,r)=>{let o=s=>{let a=l=>{if(e.off("listening",c),l.code==="EADDRINUSE"&&s===t){e.removeListener("error",a),o(0);return}r(l)},c=()=>{e.off("error",a);let l=e.address();if(!l||typeof l=="string"){r(new Error("Unable to resolve address"));return}n(l.port)};e.once("error",a),e.once("listening",c),e.listen(s,"127.0.0.1")};o(t)}),Hp=async e=>{Pm(!1);let t=0,n={repoRoot:e.repoRoot},r=fx.createServer(async(a,c)=>{let l=new URL(a.url??"/","http://127.0.0.1"),m=Mp({method:a.method,origin:a.headers.origin,contentType:a.headers["content-type"]},t);if(m)return Ie(c,m.status,{isError:!0,message:m.message});if(l.pathname==="/api/state")return Ie(c,200,await Et({repoRoot:n.repoRoot}));if(a.method==="POST"&&l.pathname==="/api/comments")try{let p=await _p(a);if(!p.issueId||!p.body?.trim())return Ie(c,400,{isError:!0,message:"Missing issueId or body"});let f=p.issueId,g=p.body;return await Xs(c,async()=>{let I=await Ks({repoRoot:n.repoRoot,issueId:f,body:g});return d(I)?Ie(c,400,{isError:!0,message:I.message}):Ie(c,200,await Et({repoRoot:n.repoRoot}))})}catch(p){return Ie(c,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add comment"})}if(a.method==="POST"&&l.pathname==="/api/attachments")try{let p=await _p(a,xx);if(!p.issueId||!p.dataBase64)return Ie(c,400,{isError:!0,message:"Missing issueId or dataBase64"});let f=p.issueId,g=p.dataBase64,I=p.name??"";return await Xs(c,async()=>{let E=await Rp({repoRoot:n.repoRoot,issueId:f,name:I,dataBase64:g});return d(E)?Ie(c,400,{isError:!0,message:E.message}):Ie(c,200,await Et({repoRoot:n.repoRoot}))})}catch(p){return Ie(c,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add attachment"})}if(a.method==="DELETE"&&l.pathname.startsWith("/api/attachments/")){let p=decodeURIComponent(l.pathname.replace("/api/attachments/",""));return p?Xs(c,async()=>{let f=await Ap({repoRoot:n.repoRoot,attachmentId:p});return d(f)?Ie(c,400,{isError:!0,message:f.message}):Ie(c,200,await Et({repoRoot:n.repoRoot}))}):Ie(c,400,{isError:!0,message:"Missing attachment id"})}if(a.method==="GET"&&l.pathname.startsWith("/media/")){let p=decodeURIComponent(l.pathname.replace("/media/","")),f=await Tp({repoRoot:n.repoRoot,fileName:p});if(d(f))return Ie(c,404,{isError:!0,message:f.message});try{let g=await jp(f.value.filePath);return c.writeHead(200,{"content-type":Ix[f.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),c.end(g)}catch{return Ie(c,404,{isError:!0,message:"Attachment blob not found"})}}if(a.method==="DELETE"&&l.pathname.startsWith("/api/comments/")){let p=decodeURIComponent(l.pathname.replace("/api/comments/",""));return p?Xs(c,async()=>{let f=await zs({repoRoot:n.repoRoot,commentId:p});return d(f)?Ie(c,400,{isError:!0,message:f.message}):Ie(c,200,await Et({repoRoot:n.repoRoot}))}):Ie(c,400,{isError:!0,message:"Missing comment id"})}return l.pathname.startsWith("/board/")?$p("/",c):$p(l.pathname,c)});try{t=await Sx(r)}catch(a){return i(a instanceof Error?`Unable to start GUI server: ${a.message}`:`Unable to start GUI server: ${String(a)}`)}let o=wp({project:n});Up(r,n,{onStateChanged:()=>o.queueSync(),getPort:()=>t}),r.on("close",o.dispose);let s=r.address();return!s||typeof s=="string"?(r.close(),i("Unable to resolve GUI server address")):u("Started GUI server",{url:`http://epiq.localhost:${s.port}${e.boardId?`/board/${e.boardId}`:""}`,server:r})};var Wp=async e=>{let t=Vn({});if(d(t))return i(t.message);let n=At();de(n)&&$e(n.value);let r=await Hp({...e,boardId:""});if(d(r))return r;let{url:o}=r.value;return console.log(`Epiq GUI running at ${Cx.cyan(o)}`),Xd(o),u("Started GUI",{url:o})};import{Box as Sn}from"ink";import be from"react";import{Box as Qa,Text as ao}from"ink";import St,{useEffect as Nx,useMemo as Rx}from"react";import{ulid as Ax}from"ulid";var Gp=({text:e,match:t,color:n,highlightColor:r=v.secondary,dimColor:o=!1})=>{if(!t)return St.createElement(ao,{color:n,dimColor:o},e);let s=e.toLowerCase(),a=t.toLowerCase(),c=s.indexOf(a);return c===-1?St.createElement(ao,{color:n,dimColor:o},e):St.createElement(ao,{color:n,dimColor:o},e.slice(0,c),St.createElement(ao,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},Vp=Ax(),Tx=e=>`${e}`,wx=e=>{let{pendingNavTarget:t}=pn();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(ve(b.NONE,{breadCrumb:n,contextNode:r,readOnly:h().readOnly,selectedNode:o}));return[...new Set(Object.values(b))].filter(a=>a!=="move").filter(a=>a.length>0).filter(a=>a!==b.PALETTE).map(a=>{let c=ps(a),l=Ds.find(m=>m.intent===c);return{command:a,description:l?.description??`[${a}] Run command`,isAvailable:s.has(a)}}).filter(a=>a.command.toLowerCase().startsWith(e)||e.length>=2&&a.description.toLowerCase().includes(e)).sort((a,c)=>a.isAvailable!==c.isAvailable?a.isAvailable?-1:1:a.command.localeCompare(c.command))},Mx=e=>le.text({id:Vp,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),Px=(e,t,n)=>le.text({id:Tx(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),Za=[],Lx=e=>{Kp();let t=S.createNode(Mx(h().rootNodeId));d(t)||!tn(t.value)||(Za=[t.value,...e.map((n,r)=>Px(n,r,Vp)).map(S.createNode).filter(de).map(({value:n})=>n).filter(tn)],k.navigate({contextNode:t.value,selectedIndex:0}))},Kp=()=>{let e=Za.map(t=>t.id);Za=[];for(let t of e)S.deleteNode(t)};function zp({width:e,height:t}){let r=zl().value.trim().toLowerCase(),o=Rx(()=>wx(r),[r]);Nx(()=>(Lx(o),()=>{Kp()}),[o]);let s=h().selectedIndex;return St.createElement(Qa,{flexDirection:"column",width:e,height:t-2},St.createElement(ct,{height:t-4,itemHeight:3,selectedIndex:s},o.map((a,c)=>{let l=c===s,m=a.isAvailable?v.accent:v.secondary2,p=a.isAvailable?"":"[unavailable] ";return St.createElement(Qa,{key:a.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:v.secondary,borderStyle:"single"},St.createElement(ao,{color:m,dimColor:!a.isAvailable},l?"\u276F ":" ",St.createElement(Gp,{text:rc(a.command),match:r,color:m,dimColor:!a.isAvailable})),St.createElement(Qa,{paddingLeft:2},St.createElement(Gp,{text:p+a.description,match:r.length>=2?r:"",color:l&&a.isAvailable?v.primary:v.secondary2,dimColor:!a.isAvailable})))})))}import{Box as Yx}from"ink";import Zs from"react";import lo from"chalk";import{Box as ed,Text as qp}from"ink";import co,{useEffect as kx,useMemo as Dx,useState as Bx}from"react";var Yp=lo.hex(v.secondary),Fx=lo.inverse,Ox=lo.inverse.hex(v.secondary2),Ux={hint:"",hints:[],overlap:0,remainder:""},Jp=({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}},_x=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=oe(t);return{bg:r=>lo.bgHex(n).black(r),bgCursor:r=>lo.bgHex(n).inverse.black(r)}}return da(t)},$x=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Jp({value:e,command:t});if(!r)return null;let s=e.slice(r.end).match(/^\s*/)?.[0].length??0,a=r.end+s;return e.slice(a,a+n.length)!==n?null:{start:a,end:a+n.length}},Xp=()=>({value:We.value,cursorPosition:We.cursorPosition,commandIsPending:We.commandIsPending,autoCompletion:We.commandMeta.autoCompletion??Ux,infoMessage:We.commandMeta.infoMessage,validationStatus:We.commandMeta.validity,command:We.commandMeta.command,inputString:We.commandMeta.inputString,modifier:We.commandMeta.modifier}),jx=(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,Qp=({width:e,mode:t})=>{let[n,r]=Bx(Xp());kx(()=>{let E=()=>{let A=Xp();r(w=>jx(w,A)?w:A)},C=ma(E);return E(),()=>{C()}},[]);let{value:o,cursorPosition:s,infoMessage:a,commandIsPending:c,autoCompletion:l,command:m,modifier:p,validationStatus:f}=n,g=c&&f===Dt.Invalid,I=Dx(()=>{let E=Math.max(0,Math.min(s,o.length)),C=Jp({value:o,command:m}),A=$x({value:o,command:m,modifier:p}),w=m?da(m):null,L=_x({command:m,modifier:p}),$=(Be,Ee)=>{let Nn=C&&Ee>=C.start&&Ee<C.end,gr=A&&Ee>=A.start&&Ee<A.end;return Nn&&w?w.fg(Be):gr&&L?L.bg(Be):Be},G=(Be,Ee)=>{let Nn=C&&Ee>=C.start&&Ee<C.end,gr=A&&Ee>=A.start&&Ee<A.end;return Nn&&w?w.fgCursor(Be):gr&&L?L.bgCursor(Be):Fx(Be)},P=o.slice(0,E),U=o[E]??" ",H=E<o.length?o.slice(E+1):"",Ze=Array.from(P).map((Be,Ee)=>$(Be,Ee)).join(""),Ue=G(U,E),De=Array.from(H).map((Be,Ee)=>$(Be,E+1+Ee)).join("");if(l.hint){let Be=l.hint[l.overlap]??U;Ue=Ox(Be),De=Yp(l.remainder.slice(1)+H)}return Yp(t===y.PALETTE?"?":":")+Ze+Ue+De},[o,s,l,m,p]);return co.createElement(ed,{flexDirection:"column",justifyContent:"flex-start"},co.createElement(ed,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},co.createElement(ed,null,co.createElement(qp,null,I),a&&co.createElement(qp,{wrap:"truncate",color:g?v.red:v.secondary2},` ${a} `))))};import{Box as Hx,Text as Wx}from"ink";import Zp from"react";var Gx=(e,t)=>{let n=[],r=0;for(let o of e){let a=(n.length>0?" | ":"").length+o.length;if(r+a>t-4)break;n.push(o),r+=a}return n},ef=({width:e,availableHints:t})=>{let n=Gx(t,e).join(" | ");return Zp.createElement(Hx,{width:e,borderStyle:"round",borderColor:v.secondary,paddingX:1},Zp.createElement(Wx,{color:v.secondary2},n.length?n:"\xA0"))};import{Box as Vx,Text as Js}from"ink";import uo,{useEffect as Kx,useRef as mr,useState as zx}from"react";var qx=40,Qs=.3,td="\u2500",tf=1,nf=16,rf=({width:e})=>{let{replay:t}=z(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),a=s*tf,[c,l]=zx(0),m=mr(r);m.current=r;let p=mr(0),f=mr(0),g=mr(0),I=mr(0),E=mr(0);if(Kx(()=>{if(!n){p.current=0,g.current=0,I.current=0,E.current=0,l(0);return}p.current=m.current,f.current=Date.now(),g.current=m.current;let $=setInterval(()=>{let G=Date.now(),P=m.current;if(P!==g.current){let De=P-g.current,Be=G-f.current;if(De<0)I.current=0,E.current=0;else if(De>0&&Be>0){let Ee=De/Be;I.current=I.current===0?Ee:I.current*(1-Qs)+Ee*Qs,E.current=E.current===0?De:E.current*(1-Qs)+De*Qs}p.current=P,f.current=G,g.current=P}let U=G-f.current,H=Math.min(E.current,I.current*U),Ze=Math.min(1,p.current+H),Ue=Math.round(Ze*a);l(De=>De===Ue?De:Ue)},qx);return()=>clearInterval($)},[n,a]),!t)return null;let C=$=>{let G=s>1?$/(s-1):0,P=Math.round(G*(nf-1))/(nf-1);return is(P)},A=Math.min(s,Math.floor(c/tf)),w=[];for(let $=0;$<A;$++){let G=C($),P=w[w.length-1];P&&P.color===G?P.text+=td:w.push({text:td,color:G})}let L=td.repeat(Math.max(0,s-A));return uo.createElement(Vx,{width:e,borderStyle:"round",borderColor:v.secondary,paddingX:1,columnGap:1},uo.createElement(Js,{color:v.secondary2},"\u25B6"),uo.createElement(Js,null,w.map(($,G)=>uo.createElement(Js,{key:G,color:$.color},$.text)),uo.createElement(Js,{color:v.secondary,dimColor:!0},L)))};var mo=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=z(),o=t===y.COMMAND_LINE||t===y.PALETTE;return Zs.createElement(Yx,null,o?Zs.createElement(Qp,{width:e,mode:t}):r==="replay"?Zs.createElement(rf,{width:e}):Zs.createElement(ef,{width:e,mode:t,availableHints:n}))};import{Box as bn,Text as pr}from"ink";import Xe,{useEffect as Xx,useMemo as Jx}from"react";import{ulid as of}from"ulid";var ti=of(),Qx=()=>[...new Set([...h().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),r=t?.replace("[",""),o=n?.trim();return[r,o]}).filter(e=>e[0]!==void 0&&e[1]!==void 0).sort(([e],[t])=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(([e,t])=>({keys:e,action:t})),Zx=e=>le.text({id:ti,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),eI=(e,t,n)=>le.text({id:of(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),ei=[],sf=()=>{let e=ei.filter(n=>n.id!==ti).map(n=>n.id),t=ei.filter(n=>n.id===ti).map(n=>n.id);ei=[];for(let n of[...e,...t])S.deleteNode(n)},tI=e=>{sf();let t=S.createNode(Zx(h().rootNodeId));if(d(t)||!tn(t.value))return logger.error("Could not attach help nodes");ei=[t.value,...e.map((n,r)=>eI(n,r,ti)).map(S.createNode).filter(de).map(({value:n})=>n).filter(tn)],k.navigate({contextNode:t.value,selectedIndex:0})},af=({width:e,height:t})=>{let n=Jx(()=>Qx(),[]);Xx(()=>(tI(n),()=>{sf()}),[n]);let r=h().selectedIndex;return Xe.createElement(bn,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,height:t-2},Xe.createElement(bn,{paddingX:1,justifyContent:"center"},Xe.createElement(pr,{color:v.accent},"Help"),Xe.createElement(pr,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Xe.createElement(bn,{paddingX:1,marginTop:1},Xe.createElement(bn,{width:20,justifyContent:"flex-end"},Xe.createElement(pr,{color:v.secondary},"Key(s)")),Xe.createElement(bn,{flexGrow:1,width:40,paddingLeft:2},Xe.createElement(pr,{color:v.secondary},"Action"))),Xe.createElement(ct,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},a)=>{let c=a===r;return Xe.createElement(bn,{paddingX:1,key:`${o}-${s}-${a}`,flexDirection:"row"},Xe.createElement(bn,{width:20,justifyContent:"flex-end"},Xe.createElement(pr,{color:v.accent},o)),Xe.createElement(bn,{flexGrow:1,width:40,paddingLeft:2},Xe.createElement(pr,{color:c?v.primary:v.secondary2},s)))})))};import nI from"chalk";import{Box as Wn,Text as ke}from"ink";import ae from"react";var rI=8,oI=()=>{let e=Kt({exclude:process.cwd()});return d(e)?[]:e.value.slice(0,rI)},df=({width:e,height:t})=>{let n=oI();return ae.createElement(Wn,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},ae.createElement(ke,{color:v.accent,bold:!0},"Initialize project"),ae.createElement(ke,null,`This folder is not an ${nI.hex(v.accent)("epiq")} project yet.`),ae.createElement(ke,{color:v.primary},"To start tracking issues here, we need to initialize a new",ae.createElement(ke,{color:v.primary,backgroundColor:v.secondary}," .epiq/project.json "),"file in this repository."),ae.createElement(Wn,{marginTop:1,flexDirection:"column"},ae.createElement(Wn,null,ae.createElement(ke,{color:v.accent}," "),ae.createElement(ke,{color:v.primary},"Type "),ae.createElement(ke,{backgroundColor:v.secondary}," :init "))),ae.createElement(Wn,{marginTop:1},ae.createElement(ke,{color:v.secondary2},"This will create, commit and push "),ae.createElement(ke,{color:v.primary,backgroundColor:v.secondary}," .epiq/project.json ")),n.length>0&&ae.createElement(Wn,{marginTop:1,flexDirection:"column"},ae.createElement(ke,{color:v.accent,bold:!0},"Or open a recent project"),n.map((r,o)=>ae.createElement(Wn,{key:r.projectId},ae.createElement(ke,{color:v.accent},` ${o+1} `),ae.createElement(ke,{color:v.primary},Qn(r.root)),ae.createElement(ke,{color:v.secondary2},` ${r.root}`))),ae.createElement(Wn,{marginTop:1},ae.createElement(ke,{color:v.accent}," "),ae.createElement(ke,{color:v.primary},"Type "),ae.createElement(ke,{backgroundColor:v.secondary}," :open 1 "),ae.createElement(ke,{color:v.secondary2}," or "),ae.createElement(ke,{backgroundColor:v.secondary}," :open <path> "))))};import{Box as ni,Text as Ut}from"ink";import Oe from"react";var sI=({isDone:e,command:t,value:n})=>Oe.createElement(ni,null,Oe.createElement(Ut,{color:v.accent,dimColor:e},e?" \u2714 ":" "),Oe.createElement(Ut,{dimColor:e},"Type "),Oe.createElement(Ut,{backgroundColor:v.secondary,dimColor:e}," "+t+" "),n!==void 0&&Oe.createElement(Oe.Fragment,null,Oe.createElement(Ut,{dimColor:e}," "),Oe.createElement(Ut,{color:v.secondary,dimColor:e},"<"+n+">"))),iI=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function nd({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:a,isSetAutoSync:c}=sn(),l=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:s,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:a,message:"Almost there. Configure auto sync."}],m=l.findIndex(f=>!f.done),p=m===-1?void 0:l[m];return Oe.createElement(ni,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},Oe.createElement(Ut,{color:v.accent,bold:!0},"Welcome! \u{1F539}"),Oe.createElement(Ut,null,"Let's get you started - it's a breeze."),Oe.createElement(Ut,{color:v.secondary2},"Remember - you can always search available commands by typing:",Oe.createElement(Ut,{color:v.accent}," ? ")),p&&Oe.createElement(Ut,{color:v.secondary2},p.message),Oe.createElement(ni,{flexDirection:"column"},l.map((f,g)=>m===-1||g<=m?Oe.createElement(ni,{key:f.key,marginBottom:1},Oe.createElement(sI,{isDone:f.done,command:f.command,value:f.done?iI(f.value):void 0})):null)))}import ai from"chalk";import{Box as fo,Text as fr}from"ink";import Ae from"react";import{Box as ri,Text as cf}from"ink";import xn from"react";import aI from"chalk";var dI=e=>(S.getTag(e)?.name??"").length+3,cI=e=>{let t=S.getContributor(e);return(t?t.name:"").length+3},lf=({width:e})=>{let{viewMode:t}=Q(),n=z(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:a}=n,c=a[o.id]?.[s],l=Xt(c?.id??o.id,"TICKET"),m=de(l)?l.value:void 0,p=(m?.props.tags??[]).filter(P=>S.getTag(P)),f=m?.props.assignees??[],g=m?.parentNodeId?!Ga(o.id,m.parentNodeId)&&t==="dense":!1,I=r.map((P,U)=>{let H=U===r.length-1,Ze=Z(P.id),Ue=H?Ze?.[s]?.title:void 0;return`${U?" / ":""}${P.title??""}${Ue?` \u25B8 ${Ue}`:""}`}).join(""),E=m?S.getCommentsByIssue(m.id):[],C=E.length?String(E.length).length+11:0,A=g?p.reduce((P,U)=>P+dI(U),0)+f.reduce((P,U)=>P+cI(U),0)+C:0,w=c?.id!=null&&!(t==="wide"&&M(c)),L=Math.max(0,e-A),$=I.substring(0,L)+(w?aI.hex(v.secondary2).dim(` ${V(c.id)}`):""),G=g?[...p.map(P=>xn.createElement(ri,{key:`tag-${P}`,paddingLeft:1},xn.createElement(or,{id:P}))),...f.map(P=>xn.createElement(ri,{key:`assignee-${P}`,paddingLeft:1},xn.createElement(ln,{id:P}))),E.length?xn.createElement(ri,{key:"comments",paddingLeft:1},xn.createElement(cf,{color:v.accent},"[",E.length," comment",E.length===1?"":"s","]")):null]:[];return xn.createElement(ri,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},xn.createElement(cf,{color:v.secondary2},$),G)};import{Box as lI,Text as uf}from"ink";import oi from"react";var uI=({filters:e})=>oi.createElement(lI,{columnGap:1},oi.createElement(uf,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>oi.createElement(uf,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),mf=oi.memo(uI);import{Box as mI,Text as si}from"ink";import po from"react";function pf(){let{eventLog:e,unappliedEvents:t}=z(),n=e.at(-1)?.id,r=ss(n??""),o=de(r)?bs(r.value):"INVALID DATE";return po.createElement(mI,{paddingLeft:1},po.createElement(si,{backgroundColor:v.accent,color:v.secondary}," Readonly "),po.createElement(si,{color:v.accent}," "+t.length+" edits ago at "+o+"."),po.createElement(si,{color:v.accent}," Resume with "),po.createElement(si,{backgroundColor:v.accent,color:v.secondary}," ",":peek now"," "))}import{Box as pI,Text as rd}from"ink";import ii from"react";function ff(){let{replay:e}=z();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return ii.createElement(pI,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},ii.createElement(rd,{backgroundColor:v.accent,color:v.secondary}," \u25B6 REPLAY "),ii.createElement(rd,{color:v.secondary2},bs(new Date(r))),ii.createElement(rd,{color:v.accent},`${t}/${n} edits`))}import od from"chalk";import{Box as fI,Text as gf}from"ink";import sd,{useEffect as gI,useState as hI}from"react";var vI=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],yI=150,hf=12,bI=.36,vf=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)}},xI=({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)}`},II=(e,t,n)=>{let r=vf(e),o=vf(t);return xI({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},EI=(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],a=e[Math.min(r+1,e.length-1)];return II(s,a,o)};function yf({syncStatus:e,autoSync:t}){let[n,r]=hI(0);gI(()=>{if(e.status!=="syncing"){r(0);return}let c=0,l=setInterval(()=>{c+=1;let m=(Math.sin(c*bI)+1)/2,p=Math.round(m*(hf-1));r(f=>f===p?f:p)},yI);return()=>clearInterval(l)},[e.status]);let o={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},a={synced:v.secondary2,failed:v.yellow,offline:v.secondary2,pending:v.secondary2,syncing:EI(vI,n/(hf-1))??""}[e.status];return sd.createElement(fI,null,sd.createElement(gf,null,od.hex(v.secondary2).dim(t?"Sync (auto): ":"Sync: ")),sd.createElement(gf,null,od.hex(a)("\u25CF")+od.hex(v.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import Sf from"chalk";import{Text as Cf}from"ink";import Nf,{useEffect as RI,useState as AI}from"react";var In="1.6.1";import id from"chalk";var SI="https://registry.npmjs.org/epiq/latest",ad=null,bf=0,CI=1e3*60*60*24,xf=e=>e.replace(/^v/,""),NI=(e,t)=>{let n=xf(e).split(".").map(Number),r=xf(t).split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let s=n[o]??0,a=r[o]??0;if(s>a)return 1;if(s<a)return-1}return 0},If=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(ad&&Date.now()-bf<CI)return ad;try{let t=await fetch(SI);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?NI(r,e)>0:!1};return ad=o,bf=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},Ef=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,a)=>s!=n[a]);return r.map((s,a)=>a>=o?id.hex(v.accent).dim(s):id.hex(v.secondary).dim(s)).join(id.hex(v.secondary2).dim("."))};function Rf(){let[e,t]=AI({current:In,latest:null,updateAvailable:!1});return RI(()=>{let n=!0;return If(In).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?Nf.createElement(Cf,{dimColor:!0,color:v.secondary2},In+" "):Nf.createElement(Cf,null,Sf.hex(v.secondary2).dim(In),Sf.hex(v.accent).dim(" \u2197 "),Ef(In,e.latest))}function go({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=z(),{userName:a,preferredEditor:c,autoSync:l}=Q(),m=64,p=process.stdout.columns-m-8,f=t||n==="replay",g=s?dt(s.currentLabel,Math.max(0,p)):"";return Ae.createElement(fo,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?Ae.createElement(fo,{paddingLeft:1},Ae.createElement(fr,{color:v.secondary2},g)):f?Ae.createElement(fr,null," "):o===y.PALETTE?Ae.createElement(fo,null,Ae.createElement(fr,{color:v.accent},"Command Palette"),Ae.createElement(fr,{dimColor:!0,color:v.secondary2}," ","- search, select and press enter")):Ae.createElement(fo,{paddingLeft:1},e.length>0?Ae.createElement(mf,{filters:e}):Ae.createElement(lf,{width:p})),n==="live"?Ae.createElement(fo,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},Ae.createElement(yf,{autoSync:!!l,syncStatus:r}),Ae.createElement(fr,null,ai.hex(v.secondary2).dim("Mode: ")+ai.hex(v.secondary2).dim(o.padEnd(8," "))," "),Ae.createElement(Af,{icon:"@",value:a}),Ae.createElement(Af,{icon:"\u276F",value:c}),Ae.createElement(Rf,null)):"",n==="peek"?Ae.createElement(pf,null):"",n==="replay"?Ae.createElement(ff,null):"")}function Af({icon:e,value:t}){return Ae.createElement(fr,null,ai.dim(e)+ai.hex(v.accent)(` ${t??"-"} `))}import{Box as TI,Text as wI}from"ink";import ho from"react";import{Box as di,Text as dd}from"ink";import En from"react";function cd(){let e=z(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,a=t?.id?J(t?.id):[];return En.createElement(di,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:s},En.createElement(di,{padding:1,paddingTop:0,paddingBottom:0},En.createElement(dd,null,"Select a board:")),En.createElement(di,{padding:1,flexDirection:"column"},a.map((c,l)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===l,f=J(c.id).flatMap(({id:g})=>Z(g)).length;return En.createElement(di,{key:c.id??l},En.createElement(dd,{color:m?v.accent:v.secondary2},En.createElement(Ge,{isSelected:m})),En.createElement(dd,{color:m?v.accent:v.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var MI=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:a})=>{let{renderedChildrenIndex:c}=z(),l=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return ho.createElement(TI,{flexDirection:"row"},e.context==="WORKSPACE"?ho.createElement(cd,null):l?ho.createElement(Es,{height:f,width:a,swimlanes:(c[l.id]??[]).filter(g=>g!==void 0&&Tt(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):ho.createElement(wI,null))},Tf=ho.memo(MI);import{useEffect as PI}from"react";var LI=e=>{PI(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:a}=Q();a&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:l}=h();l==="default"&&!c&&Jo(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},wf=({autoSync:e})=>(LI(e),null);function ld({width:e,height:t}){let n=z(),{autoSync:r,viewMode:o}=Yd(),s=n.filters;if(n.mode===y.HELP)return be.createElement(Sn,{flexDirection:"column"},be.createElement(af,{width:e,height:t}));if(n.mode===y.PALETTE)return be.createElement(Sn,{flexDirection:"column"},be.createElement(go,{filters:s}),be.createElement(zp,{width:e,height:t-2}),be.createElement(mo,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:a}=sn(),c=!a,l=a&&!n.hasProjectDefinition;if(c)return be.createElement(Sn,{flexDirection:"column"},be.createElement(Sn,{flexDirection:"column"},be.createElement(go,{hideBreadCrumb:!0,filters:s}),be.createElement(nd,{height:t,width:e})),be.createElement(mo,{width:e,mode:n.mode,availableHints:n.availableHints}));if(l)return be.createElement(Sn,{flexDirection:"column"},be.createElement(Sn,{flexDirection:"column"},be.createElement(go,{hideBreadCrumb:!0,filters:s}),be.createElement(df,{height:t,width:e})),be.createElement(mo,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=ze(n.breadCrumb??[],"BOARD");if(de(m)){let p=m.value.id,f=J(p).length,g=3,I=Math.floor(e/g),E=Math.floor(e/Math.max(f,1));e=Math.min(E,I)*Math.max(f,g)}return be.createElement(Sn,{flexDirection:"column"},be.createElement(wf,{autoSync:r}),be.createElement(Sn,{flexDirection:"column"},be.createElement(go,{filters:s}),be.createElement(Tf,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),be.createElement(mo,{width:e,mode:n.mode,availableHints:n.availableHints}))}import kI from"readline";var ci,li,_t,DI=new Set([x.MoveCursorLeft,x.EraseInputWord,x.MoveCursorLeftOfWord,x.MoveCursorRight,x.MoveCursorRightOfWord,x.NavToPreviousContainer,x.NavToNextContainer,x.NavPreviousItem,x.NavNextItem,x.SetViewDense,x.SetViewWide,x.Confirm,x.Exit,x.Yank,x.InitCommandLine,x.InitCommandPalette,x.ExitCommandLine,x.CaptureInput,x.EraseInput,x.EraseInputWord,x.HideHelp,x.ViewHelp,x.SetViewDense,x.SetViewWide,x.GetLastCommandFromHistory,x.GetNextCommandFromHistory,x.AutoCompleteCommand]),BI=new Set([x.NavPreviousItem,x.NavNextItem,x.NavToPreviousContainer,x.NavToNextContainer,x.Confirm,x.Exit,x.InitCommandPalette,x.InitMove,x.MoveNextItem,x.MovePreviousItem,x.MoveToNextContainer,x.MoveToPreviousContainer,x.Delete,x.AddItem,x.EditTitle,x.EditDescription,x.ConfirmMove,x.Edit,x.ViewHelp,x.Yank]),Mf=async e=>{if(e.ctrl&&e.name==="c")return k.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=h(),s=ql(e,n);if(!s||r&&!DI.has(s)||o==="replay"&&n===y.DEFAULT&&BI.has(s))return;let a=t[n]?.[s];if(a?.action)try{await a.action(a,e)}catch(c){logger.error(c)}},FI=()=>async function(t,n){n.name!=="escape"&&(_t&&(clearTimeout(_t),_t=void 0),await Mf(n))},OI=()=>async function(t){if(t.length===1&&t[0]===27){_t&&clearTimeout(_t),_t=setTimeout(()=>{Mf({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),_t=void 0},25);return}_t&&(clearTimeout(_t),_t=void 0)};function Pf(){ci&&process.stdin.removeListener("keypress",ci),li&&process.stdin.removeListener("data",li),ci=FI(),li=OI(),kI.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",li),process.stdin.on("keypress",ci)}async function Lf(){try{let e=Vn({});if(d(e))return Pt(0,e.message);let t=At();de(t)&&$e(t.value);let n=_e(process.cwd()),r=de(n)?await ws(n.value):Yu();if(d(r))return r;let o=ud();return d(o)?Pt(6,o.message):(Pf(),u("Booted Epiq",void 0))}catch(e){return Pt(0,Vo(e))}}Pu();var jI=`${Cn.bold("Epiq CLI")}
|
|
76
76
|
|
|
77
77
|
${Cn.dim("Boot in directory:")}
|
|
78
78
|
${Cn.cyan("$ epiq")}
|
|
79
79
|
|
|
80
80
|
${Cn.dim("Launch GUI:")}
|
|
81
81
|
${Cn.cyan("$ epiq gui")}
|
|
82
|
-
`,
|
|
83
|
-
${e.message}`)),process.exitCode=1)}else{console.clear();let e=await
|
|
82
|
+
`,HI=_I(jI,{importMeta:import.meta,version:In,flags:{init:{type:"boolean",default:!1}}}),ui=HI.input[0];ui&&ui!=="gui"&&(console.error(Cn.red(`Unknown command: ${ui}`)),process.exit(1));var kf=process.stdout.columns||120,Df=process.stdout.rows||20,mi=null,WI=e=>{try{return mi?(mi.rerender(e),u("Rerendered app",void 0)):(mi=UI(e),u("Rendered app",void 0))}catch(t){return i(`Unable to render app: ${Vo(t)}`)}},ud=()=>WI($I.createElement(ld,{width:kf,height:Df}));process.stdout.on("resize",()=>{if(kf=process.stdout.columns||120,Df=process.stdout.rows||20,!mi)return;let e=ud();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(ui==="gui"){let e=await Wp({repoRoot:process.cwd()});d(e)&&(console.error(Cn.red(`Failed to start Epiq GUI:
|
|
83
|
+
${e.message}`)),process.exitCode=1)}else{console.clear();let e=await Lf();d(e)&&(logger.info(e.message),console.error(Cn.red(`Failed to boot Epiq:
|
|
84
84
|
${e.message}`)),process.exitCode=1)}export{ud as renderApp};
|