epiq 1.3.4 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,67 +1,69 @@
1
1
  #!/usr/bin/env node
2
- import Zt from"chalk";import{render as vy}from"ink";import yy from"meow";import hy from"react";import ov from"chalk";var Pt={Success:"success",Fail:"fail"},a=e=>({status:Pt.Fail,message:e,value:null}),l=(e,t)=>({status:Pt.Success,message:e,value:t}),d=e=>e.status==="fail",ne=e=>e.status==="success";import{spawn as Eu}from"node:child_process";import cs from"node:process";var Di=e=>{let t=cs.platform==="darwin"?"open":cs.platform==="win32"?"cmd":"xdg-open",n=cs.platform==="win32"?["/c","start","",e]:[e];Eu(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as wl}from"node:fs/promises";import Yg from"node:http";import vn from"node:path";import{fileURLToPath as Xg}from"node:url";import{decodeTime as dl,ulid as J}from"ulid";import bs from"node:fs";import lt from"node:path";import zn from"node:fs";import{ulid as Ru}from"ulid";import{z as Dr}from"zod";import jn from"node:fs";import st from"node:path";import Su from"node:os";import Cu from"node:path";var nt=".epiq-global",Wn=()=>process.env.EPIQ_GLOBAL_DIR??Cu.join(Su.homedir(),nt);var Dy=process.env.IS_LOCAL==="true",it=".epiq",Pr="events",ls="media",Nu="project.json",Vn=e=>st.join(e,it),Lr=e=>st.join(Vn(e),Nu),Kn=e=>st.join(Vn(e),Pr),Gn=e=>st.join(Vn(e),ls),Fi=e=>st.join(e,it),Au=e=>{let t=st.join(e,it);return jn.existsSync(t)&&jn.statSync(t).isDirectory()},us=e=>{let t=Lr(e);return jn.existsSync(t)&&jn.statSync(t).isFile()},kr=e=>{let t=st.resolve(e);for(;;){if(Au(t))return l("Resolved closest .epiq root",t);let n=st.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},qe=e=>{let t=st.resolve(e);for(;;){if(us(t))return l("Resolved closest epiq project root",t);let n=st.dirname(t);if(n===t)return a("No .epiq/project.json found in any parent");t=n}},Bi=e=>{let t=Kn(e);try{return jn.mkdirSync(t,{recursive:!0}),l("Resolved events dir",t)}catch(n){return a(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},at=async()=>{let e=await dt(process.cwd());if(d(e))return e;let t=Pe({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};var Tu="__epiq_state__",wu=Dr.object({projectId:Dr.string().min(1),stateBranch:Dr.string().min(1),createdAt:Dr.iso.datetime()}),yn=()=>({projectId:Ru(),stateBranch:Tu,createdAt:new Date().toISOString()}),Lt=e=>{let t=Lr(e);if(!zn.existsSync(t))return a("Missing .epiq/project.json");try{let n=zn.readFileSync(t,"utf8"),r=JSON.parse(n),o=wu.safeParse(r);return o.success?l("Read project.json",o.data):a(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return a(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Ui=e=>{let t=Lt(e);return d(t)?a(t.message):l("Read projectId",t.value.projectId)},Oi=({repoRoot:e,fileContents:t})=>{let n=Vn(e),r=Lr(e);try{if(zn.mkdirSync(n,{recursive:!0}),zn.existsSync(r)){let o=Lt(e);return d(o)?a(o.message):l("Project already initialized",null)}return zn.writeFileSync(r,JSON.stringify(t,null,2)+`
3
- `,"utf8"),l("Created project.json",null)}catch(o){return a(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var ms=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let i=r(...s);if(!n.has(i)){let c=e(...s).then(u=>(d(u)&&n.delete(i),u));n.set(i,c)}return n.get(i)});return o.clear=()=>n.clear(),o};import qn from"fs";import vs from"path";import Mu from"util";var _i=1e3,Pu=50,ps=0,$i=()=>process.env.EPIQ_MCP==="true",Hi=()=>{let e=process.cwd(),t=kr(e);return d(t)?$i()?vs.join(process.cwd(),".epiq-mcp.log"):void 0:vs.join(t.value,it,"log","epiq.log")};function Lu(){let e=Hi();if(!e||!qn.existsSync(e))return;let n=qn.readFileSync(e,"utf8").split(`
4
- `);if(n[n.length-1]===""&&n.pop(),n.length<=_i)return;let r=n.slice(-_i).join(`
2
+ import an from"chalk";import{render as Nh}from"ink";import Rh from"meow";import Ah from"react";import py from"chalk";import Um from"node:path";import{z as Rt}from"zod";import er from"node:fs";import vt from"node:path";var Bt={Success:"success",Fail:"fail"},a=e=>({status:Bt.Fail,message:e,value:null}),u=(e,t)=>({status:Bt.Success,message:e,value:t}),d=e=>e.status==="fail",Q=e=>e.status==="success";import Ls from"node:fs";import ft from"node:path";import zn from"node:fs";import{ulid as fm}from"ulid";import{z as Or}from"zod";var gm="__epiq_state__",vm=Or.object({projectId:Or.string().min(1),stateBranch:Or.string().min(1),createdAt:Or.iso.datetime()}),Sn=()=>({projectId:fm(),stateBranch:gm,createdAt:new Date().toISOString()}),ut=e=>{let t=_r(e);if(!zn.existsSync(t))return a("Missing .epiq/project.json");try{let n=zn.readFileSync(t,"utf8"),r=JSON.parse(n),o=vm.safeParse(r);return o.success?u("Read project.json",o.data):a(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return a(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},oa=e=>{let t=ut(e);return d(t)?a(t.message):u("Read projectId",t.value.projectId)},sa=({repoRoot:e,fileContents:t})=>{let n=qn(e),r=_r(e);try{if(zn.mkdirSync(n,{recursive:!0}),zn.existsSync(r)){let o=ut(e);return d(o)?a(o.message):u("Project already initialized",null)}return zn.writeFileSync(r,JSON.stringify(t,null,2)+`
3
+ `,"utf8"),u("Created project.json",null)}catch(o){return a(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};import ym from"node:os";import hm from"node:path";var rt=".epiq-global",Yn=()=>process.env.EPIQ_GLOBAL_DIR??hm.join(ym.homedir(),rt);var Cs=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let i=r(...s);if(!n.has(i)){let c=e(...s).then(l=>(d(l)&&n.delete(i),l));n.set(i,c)}return n.get(i)});return o.clear=()=>n.clear(),o};import Xn from"fs";import Ts from"path";import xm from"util";var ia=1e3,bm=50,Ns=0,aa=()=>process.env.EPIQ_MCP==="true",da=()=>{let e=process.cwd(),t=$r(e);return d(t)?aa()?Ts.join(process.cwd(),".epiq-mcp.log"):void 0:Ts.join(t.value,mt,"log","epiq.log")};function Im(){let e=da();if(!e||!Xn.existsSync(e))return;let n=Xn.readFileSync(e,"utf8").split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=ia)return;let r=n.slice(-ia).join(`
5
5
  `)+`
6
- `;qn.writeFileSync(e,r,"utf8")}function fs(e,t,n=!1){let r=Hi();if(!r)return;let o=Mu.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
7
- `;qn.mkdirSync(vs.dirname(r),{recursive:!0}),qn.appendFileSync(r,c,"utf8"),ps++,ps>=Pu&&(ps=0,Lu())}var gs=()=>$i()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",se={info(...e){let t=gs();(t==="info"||t==="debug")&&fs("[Info]",e,!1)},debug(...e){gs()==="debug"&&fs("[Debug]",e,!0)},error(...e){let t=gs();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;fs("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=se;import{spawn as ku}from"node:child_process";import Fr from"node:fs";import Yn from"node:path";var ce={stage:({cwd:e,pathspec:t})=>_({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>_({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>_({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>_({args:["pull","--rebase",t,n],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",...r?["-u"]:[],t,n]:["push"];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 hn=e=>{let t=qe(e);if(d(t))return a("Unable to resolve epiq project root");let n=Lt(t.value);return d(n)?a("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},Ye="origin";var Wi=1e4,Du={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},ji=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Fr.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(a(p));return}let o=ku("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Du}),s=!1,i="",c="",u=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 ${Wi}ms`].join(`
8
- `);u(n?{stdout:i,stderr:p,exitCode:124}:a(p))},Wi);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{i+=p}),o.stderr.on("data",p=>{c+=p}),o.on("error",p=>{if(n){u({stdout:i,stderr:p.message,exitCode:1});return}u(a([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
9
- `)))}),o.on("close",p=>{let f=p??1;if(n){u({stdout:i,stderr:c,exitCode:f});return}if(f!==0){u(a([`git ${e.join(" ")}`,c.trim()||i.trim()||"Git command failed"].filter(Boolean).join(`
10
- `)));return}u(l("Git command succeeded",{stdout:i,stderr:c,exitCode:f}))})}),_=({args:e,cwd:t})=>ji({args:e,cwd:t,allowFail:!1}),ct=({args:e,cwd:t})=>ji({args:e,cwd:t,allowFail:!0}),xn=async({cwd:e,message:t})=>{let n=await ce.commit({cwd:e,message:t});if(d(n))return a(`Failed to create commit
11
- ${n.message}`);let r=await _({args:["rev-parse","HEAD"],cwd:e});return d(r)?a(`Commit created, but failed to read HEAD SHA
12
- ${r.message}`):l("Created commit and resolved SHA",r.value.stdout.trim())},Fu=async e=>{let t=await _({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return a(t.message);let n=t.value.stdout.trim();return l("Resolved git dir",Yn.isAbsolute(n)?n:Yn.resolve(e,n))},Bu=async e=>{let t=await Fu(e);if(d(t))return a(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(r))if(Fr.existsSync(Yn.join(n,s)))return l("Checked for in-progress Git operation",i);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(o))if(Fr.existsSync(Yn.join(n,s)))return l("Checked for in-progress Git operation",i);return l("Checked for in-progress Git operation",null)},Br=async e=>{let t=await Bu(e);return d(t)?a(t.message):l("Checked for in-progress Git operation",t.value!==null)},ys=async({repoRoot:e})=>{let n=(await ct({args:["remote","get-url",Ye],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},Ur=async({repoRoot:e,branch:t})=>{let n=await ct({args:["ls-remote","--heads",Ye,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${Ye}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},Or=async({repoRoot:e,branch:t})=>{let n=await ct({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?l("Local branch exists",!0):n.exitCode===1?l("Local branch missing",!1):a(n.stderr.trim()||`Unable to inspect branch ${t}`)},Xn=e=>{try{return Fr.realpathSync.native(e)}catch{return Yn.resolve(e)}},Vi=async({repoRoot:e,worktreeRoot:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=Xn(t),o=n.value.stdout.split(`
13
- `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Xn).includes(r);return l("Checked worktree registration",o)},hs=async e=>{let t=await ct({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},_r=async e=>{let t=await _({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved current branch",t.value.stdout.trim())},Ki=async e=>{let t=await _({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},Gi=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Uu=async e=>(await ct({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1);var xs=async({cwd:e,branch:t})=>{let n=await Ur({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return l("Remote branch missing, skipped pull",!1);let r=await Uu(e);if(d(r))return a(r.message);let o=await ce.fetch({cwd:e,remote:Ye,branch:t});if(d(o))return a(`Failed to fetch ${t}
14
- ${o.message}`);let s=await ce.pullRebase({cwd:e,remote:Ye,branch:t});return d(s)?a(`Failed during pull --rebase
15
- ${s.message}`):l("Pulled with rebase",!0)},zi=async e=>{let t=await ct({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?l("No staged changes",!1):t.exitCode===1?l("Has staged changes",!0):a(t.stderr.trim()||"Unable to inspect staged changes")};var qi=async e=>{let t=await _r(e);return d(t)?a(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var Xi="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Is=e=>lt.join(it,Pr,e),Ji=()=>lt.join(it,ls),Qi=Wn,$r=()=>lt.join(Qi(),"worktrees"),Pe=({repoRoot:e})=>{let t=Ui(e);return d(t)?a(t.message):l("Resolved state branch root",lt.join($r(),t.value))},Ou=e=>lt.join(e,it),Yi=e=>lt.join(Ou(e),Pr);var Jn=e=>{try{return bs.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},Hr=()=>{let e=Jn(Qi());if(d(e))return a(`Ensure epiq home failed.
16
- `+e.message);let t=Jn($r());return d(t)?a(`Ensure worktrees dir failed.
17
- `+t.message):l("Ensured epiq storage",!0)},Zi=e=>{bs.existsSync(e)&&(se.debug("[sync] remove path",e),bs.rmSync(e,{recursive:!0,force:!0}))};var ea=(e,t)=>{for(let n of[Yi(e),Yi(t)]){let r=Jn(n);if(d(r))return a(r.message)}return l("Ensured state branch",void 0)},ta=async e=>{let t=await _({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return a(`ensure state branch is storage only failed
6
+ `;Xn.writeFileSync(e,r,"utf8")}function Rs(e,t,n=!1){let r=da();if(!r)return;let o=xm.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
7
+ `;Xn.mkdirSync(Ts.dirname(r),{recursive:!0}),Xn.appendFileSync(r,c,"utf8"),Ns++,Ns>=bm&&(Ns=0,Im())}var As=()=>aa()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",se={info(...e){let t=As();(t==="info"||t==="debug")&&Rs("[Info]",e,!1)},debug(...e){As()==="debug"&&Rs("[Debug]",e,!0)},error(...e){let t=As();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;Rs("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=se;import{spawn as Em}from"node:child_process";import Hr from"node:fs";import Jn from"node:path";var le={stage:({cwd:e,pathspec:t})=>F({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>F({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>F({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>F({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>F({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push",...r?["-u"]:[],t,n]:["push"];return F({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>F({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>F({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>F({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>F({args:["worktree","prune"],cwd:e})};var Cn=e=>{let t=_e(e);if(d(t))return a("Unable to resolve epiq project root");let n=ut(t.value);return d(n)?a("Unable to read project.json"):u("Resolved state branch",n.value.stateBranch)},Je="origin";var ca=1e4,Sm={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},la=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Hr.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(a(p));return}let o=Em("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Sm}),s=!1,i="",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 ${ca}ms`].join(`
8
+ `);l(n?{stdout:i,stderr:p,exitCode:124}:a(p))},ca);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{i+=p}),o.stderr.on("data",p=>{c+=p}),o.on("error",p=>{if(n){l({stdout:i,stderr:p.message,exitCode:1});return}l(a([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
9
+ `)))}),o.on("close",p=>{let f=p??1;if(n){l({stdout:i,stderr:c,exitCode:f});return}if(f!==0){l(a([`git ${e.join(" ")}`,c.trim()||i.trim()||"Git command failed"].filter(Boolean).join(`
10
+ `)));return}l(u("Git command succeeded",{stdout:i,stderr:c,exitCode:f}))})}),F=({args:e,cwd:t})=>la({args:e,cwd:t,allowFail:!1}),pt=({args:e,cwd:t})=>la({args:e,cwd:t,allowFail:!0}),Nn=async({cwd:e,message:t})=>{let n=await le.commit({cwd:e,message:t});if(d(n))return a(`Failed to create commit
11
+ ${n.message}`);let r=await F({args:["rev-parse","HEAD"],cwd:e});return d(r)?a(`Commit created, but failed to read HEAD SHA
12
+ ${r.message}`):u("Created commit and resolved SHA",r.value.stdout.trim())},Cm=async e=>{let t=await F({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return a(t.message);let n=t.value.stdout.trim();return u("Resolved git dir",Jn.isAbsolute(n)?n:Jn.resolve(e,n))},Nm=async e=>{let t=await Cm(e);if(d(t))return a(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(r))if(Hr.existsSync(Jn.join(n,s)))return u("Checked for in-progress Git operation",i);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(o))if(Hr.existsSync(Jn.join(n,s)))return u("Checked for in-progress Git operation",i);return u("Checked for in-progress Git operation",null)},jr=async e=>{let t=await Nm(e);return d(t)?a(t.message):u("Checked for in-progress Git operation",t.value!==null)},ws=async({repoRoot:e})=>{let n=(await pt({args:["remote","get-url",Je],cwd:e})).exitCode===0;return u(`Checked remote ${n}`,n)},Wr=async({repoRoot:e,branch:t})=>{let n=await pt({args:["ls-remote","--heads",Je,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${Je}/${t}`):u("Checked remote branch",n.stdout.trim().length>0)},Vr=async({repoRoot:e,branch:t})=>{let n=await pt({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):a(n.stderr.trim()||`Unable to inspect branch ${t}`)},Qn=e=>{try{return Hr.realpathSync.native(e)}catch{return Jn.resolve(e)}},ua=async({repoRoot:e,worktreeRoot:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=Qn(t),o=n.value.stdout.split(`
13
+ `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Qn).includes(r);return u("Checked worktree registration",o)},Ms=async e=>{let t=await pt({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return u("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Gr=async e=>{let t=await F({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):u("Resolved current branch",t.value.stdout.trim())},ma=async e=>{let t=await F({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):u("Resolved short HEAD sha",t.value.stdout.trim())},pa=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Rm=async e=>(await pt({cwd:e,args:["rebase","--abort"]})).exitCode===0?u("Aborted stale rebase",!0):u("No rebase to abort",!1);var Ps=async({cwd:e,branch:t})=>{let n=await Wr({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return u("Remote branch missing, skipped pull",!1);let r=await Rm(e);if(d(r))return a(r.message);let o=await le.fetch({cwd:e,remote:Je,branch:t});if(d(o))return a(`Failed to fetch ${t}
14
+ ${o.message}`);let s=await le.pullRebase({cwd:e,remote:Je,branch:t});return d(s)?a(`Failed during pull --rebase
15
+ ${s.message}`):u("Pulled with rebase",!0)},fa=async e=>{let t=await pt({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?u("No staged changes",!1):t.exitCode===1?u("Has staged changes",!0):a(t.stderr.trim()||"Unable to inspect staged changes")};var ga=async e=>{let t=await Gr(e);return d(t)?a(t.message):u("Checked detached HEAD state",t.value==="HEAD")};var ya="4b825dc642cb6eb9a060e54bf8d69288fbee4904",ks=e=>ft.join(mt,qr,e),ha=()=>ft.join(mt,Ds),xa=Yn,Kr=()=>ft.join(xa(),"worktrees"),Re=({repoRoot:e})=>{let t=oa(e);return d(t)?a(t.message):u("Resolved state branch root",ft.join(Kr(),t.value))},Am=e=>ft.join(e,mt),va=e=>ft.join(Am(e),qr);var Zn=e=>{try{return Ls.mkdirSync(e,{recursive:!0}),u("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},zr=()=>{let e=Zn(xa());if(d(e))return a(`Ensure epiq home failed.
16
+ `+e.message);let t=Zn(Kr());return d(t)?a(`Ensure worktrees dir failed.
17
+ `+t.message):u("Ensured epiq storage",!0)},ba=e=>{Ls.existsSync(e)&&(se.debug("[sync] remove path",e),Ls.rmSync(e,{recursive:!0,force:!0}))};var Ia=(e,t)=>{for(let n of[va(e),va(t)]){let r=Zn(n);if(d(r))return a(r.message)}return u("Ensured state branch",void 0)},Ea=async e=>{let t=await F({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return a(`ensure state branch is storage only failed
18
18
  `+t.message);let r=t.value.stdout.trim().split(`
19
- `).filter(Boolean).filter(i=>i!==it);if(r.length===0)return l("State branch is storage-only",!1);let o=await _({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return a(`Failed to clean storage branch
20
- ${o.message}`);let s=await xn({cwd:e,message:"[epiq:repair-storage-branch]"});return d(s)?a(s.message):l("Cleaned storage branch",!0)},dt=ms(async(e=process.cwd())=>{let t=await _({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?a("Not inside a Git repository"):l("Resolved repo root",t.value.stdout.trim())},e=>lt.resolve(e)),Ch=ms(async e=>{let t=await _({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return a(t.message);let n=t.value.stdout.trim(),r=lt.isAbsolute(n)?n:lt.join(e,n);return l("Resolved git dir",r)},e=>lt.resolve(e));import en from"node:fs";import Wr from"node:path";var ra=async e=>{if((await ct({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return l("Initial commit already exists",!1);se.info("Creating initial commit");let n=await ce.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?a(n.message):l("Created initial commit",!0)},na=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",_u=async e=>{let t=await _r(e);if(d(t))return a(t.message);let n=await Ki(e);return d(n)?a(n.message):l("Built sync commit message",`[sync|branch:${na(t.value)}:sha:${na(n.value)}]`)},Es=async({repoRoot:e,stateBranchName:t})=>{se.info(`Creating ${t}`);let n=await _({args:["commit-tree",Xi,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return a(`Failed to create state branch commit
21
- ${n.message}`);let r=n.value.stdout.trim(),o=await _({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?a(`Failed to create ${t}
22
- ${o.message}`):l("Created state branch",!0)},$u=async({repoRoot:e,stateBranchName:t})=>{let n=await ys({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
23
- `+n.message);let r=n.value,o=r?await Ur({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(d(o))return a(`Ensure local state branch failed
24
- `+o.message);let s=o.value;if(r&&s){let c=await ce.fetch({cwd:e,remote:Ye,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
25
- ${c.message}`)}let i=await Or({repoRoot:e,branch:t});if(d(i))return a(`Ensure local state branch failed
26
- `+i.message);if(i.value)return l("Local state branch already exists",!1);if(s){let c=await _({args:["branch","--track",t,`${Ye}/${t}`],cwd:e});return d(c)?a(`Failed to create local ${t} from remote
27
- ${c.message}`):l("Created local state branch from remote",!0)}return Es({repoRoot:e,stateBranchName:t})},Hu=async({repoRoot:e,branch:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=n.value.stdout.split(`
28
- `),o=null;for(let s of r){if(s.startsWith("worktree ")){o=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&o)return l("Found worktree for branch",o)}return l("No worktree found for branch",null)},Wu=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Jn(Wr.dirname(t));if(d(r))return a(`Failed to create state branch worktree
29
- `+r.message);en.existsSync(t)&&!en.existsSync(Wr.join(t,".git"))&&(se.info("Removing broken state branch worktree path"),Zi(t)),se.info("Creating state branch worktree");let o=await ce.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?a(`Failed to create state branch worktree
30
- ${o.message}`):l("Created state branch worktree",!0)},tn=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Hu({repoRoot:e,branch:n});if(d(r))return a(r.message);let o=Xn(t),s=r.value?Xn(r.value):null;if(s&&s===o&&en.existsSync(s))return l("State branch already checked out in expected worktree",!1);if(s&&s!==o){se.info("Moving state branch worktree to expected location");let u=await ce.worktreeRemove({cwd:e,worktreeRoot:s});if(d(u))return a(`Failed to remove existing state branch worktree
31
- ${u.message}`)}if(s&&!en.existsSync(s)){se.info("Pruning stale state branch worktree");let u=await ce.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
32
- ${u.message}`)}let i=await Vi({repoRoot:e,worktreeRoot:t});if(d(i))return a(i.message);let c=en.existsSync(t);if(i.value&&c)return l("State branch worktree already exists",!1);if(i.value&&!c){se.info("Pruning missing registered state branch worktree");let u=await ce.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
33
- ${u.message}`)}return Wu({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},ju=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await _r(e);if(d(n))return a(n.message);if(n.value===t)return l("State branch already checked out",!1);(await ct({cwd:e,args:["rebase","--abort"]})).exitCode===0&&se.info("Aborted stale state branch rebase");let o=await ce.checkout({cwd:e,branch:t});return d(o)?a(`Failed to checkout ${t}
34
- ${o.message}`):l("Checked out state branch",!0)},Vu=async({repoRoot:e,stateBranchRoot:t})=>{let n=await hs(t);if(d(n))return a(n.message);if(n.value)return l("State branch upstream already configured",!1);let r=await ys({repoRoot:t});if(d(r))return a(r.message);if(!r.value)return l("No remote available for state branch upstream",!1);let o=hn(e);if(d(o))return o;let s=o.value,i=await Ur({repoRoot:t,branch:s});if(d(i))return a(i.message);if(!i.value)return l("Remote state branch missing; upstream will be configured on first push",!1);se.info(`Configuring ${s} upstream`);let c=await ce.fetch({cwd:t,remote:Ye,branch:s});if(d(c))return a(`Failed to fetch ${s}
35
- ${c.message}`);let u=await ce.setUpstream({cwd:t,branch:s,upstream:`${Ye}/${s}`});return d(u)?a(`Failed to set state branch upstream
36
- ${u.message}`):l("Configured state branch upstream",!0)},jr=async({stateBranchRoot:e,eventFileName:t})=>{let n=Is(t),r=Wr.join(e,n);if(!en.existsSync(r))return l("No event file to stage",void 0);let o=await ce.stage({cwd:e,pathspec:[n]});return d(o)?a(`Failed to stage state branch event file
37
- ${o.message}`):l("Staged state branch event file",void 0)},oa=async({stateBranchRoot:e})=>{let t=Ji(),n=Wr.join(e,t);if(!en.existsSync(n))return l("No media directory to stage",void 0);let r=await ce.stage({cwd:e,pathspec:[t]});return d(r)?a(`Failed to stage state branch media files
38
- ${r.message}`):l("Staged state branch media files",void 0)},sa=async({repoRoot:e,stateBranchRoot:t})=>{let n=await _u(e);return d(n)?a(`Create state branch sync commit failed
39
- `+n.message):xn({cwd:t,message:n.value})},Qn=async({repoRoot:e,stateBranchRoot:t})=>{let n=await hs(t);if(d(n))return a(n.message);let r=hn(e);if(d(r))return r;let o=r.value,s=n.value?await ce.push({cwd:t}):await ce.push({cwd:t,remote:Ye,branch:o,setUpstream:!0});return d(s)?a(`Failed during state branch push
40
- ${s.message}`):l("Pushed state branch",!0)},ia=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=hn(e);if(d(o))return o;let s=o.value,i=[Hr(),await $u({repoRoot:e,stateBranchName:s}),await tn({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await ju({stateBranchRoot:t,stateBranchName:s}),await ta(t),n?await Vu({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(d(c))return a(c.message);r=r||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{WebSocket as Ku}from"ws";var Vr=new Set,aa=e=>{Vr.add(e),e.on("close",()=>{Vr.delete(e)}),e.on("error",()=>{Vr.delete(e)})},nn=e=>{let t=JSON.stringify(e);for(let n of Vr)n.readyState===Ku.OPEN&&n.send(t)};import{useSyncExternalStore as jg}from"react";var L={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Ss(e){return e.context===L.WORKSPACE}function R(e){return e.context===L.TICKET}function kt(e){return e.context===L.TEXT}function _e(e){return e.context===L.FIELD}function Zn(e){return e.context===L.FIELD_LIST}var Dt=e=>e.context===L.SWIMLANE,Kr=e=>e.context===L.BOARD,er=e=>e.context===L.COMMENT;var v={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var da=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",ca=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",la=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",ua=(e,t)=>{if(ca(e,e.sequence))return h.MoveCursorLeftOfWord;if(la(e,e.sequence))return h.MoveCursorRightOfWord;if(da(e,e.sequence))return h.EraseInputWord;switch(e.name){case"tab":return h.AutoCompleteCommand;case"up":return h.GetLastCommandFromHistory;case"down":return h.GetNextCommandFromHistory;case"left":return h.MoveCursorLeft;case"right":return h.MoveCursorRight;case"return":return h.Confirm;case"backspace":return t?h.EraseInput:h.ExitCommandLine;case"escape":return h.ExitCommandLine;default:return h.CaptureInput}},ma=(e,t)=>{if(ca(e,e.sequence))return h.MoveCursorLeftOfWord;if(la(e,e.sequence))return h.MoveCursorRightOfWord;if(da(e,e.sequence))return h.EraseInputWord;switch(e.name){case"tab":return h.AutoCompleteCommand;case"up":return h.NavPreviousItem;case"down":return h.NavNextItem;case"left":return h.MoveCursorLeft;case"right":return h.MoveCursorRight;case"return":return h.Confirm;case"backspace":return t?h.EraseInput:h.ExitCommandLine;case"escape":return h.ExitCommandLine;default:return h.CaptureInput}};function Gr(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var rn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Xe=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),pa=e=>e.charAt(0).toUpperCase()+e.slice(1);var fa=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},ga=(e,t)=>t?e.get(t)??[]:[];var va=new WeakMap,Gu=e=>{let t=va.get(e);return t||(t=fa(e),va.set(e,t)),t};var ya=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return ga(Gu(e),r).filter(s=>Gr(r,s)>=n)};var zu={hint:"",hints:[],overlap:0,remainder:""},ha=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return zu;let o=ya({wordList:r,inputToMatch:e,overlapThreshold:1});return qu(t,o)},qu=(e,t)=>{let n=t[0]??"",r=Gr(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),i=r<(o??"").length,c=!!s,p=(c&&i?o:n)+(c&&i?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}};import{useSyncExternalStore as Yu}from"react";var tr={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Cs=new Set,Xu=()=>{for(let e of Cs)e()},K=()=>tr,xa=()=>Yu(e=>(Cs.add(e),()=>{Cs.delete(e)}),()=>tr),Fe=e=>(tr={...tr,...e},Xu(),tr);import{ulid as Zu}from"ulid";var bn=24n,Ju=bn*4n,rt=(1n<<Ju)-1n,Qu=/^[0-9a-f]+$/;function ba(e){return!e||!Qu.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function $e(e,t=bn){if(e<0n)return a("Negative rank not allowed");let n=e.toString(16);return l("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Be(e,t){if(!e&&!t)return $e(rt/2n,bn);let n=e?ba(e):l("Resolved lower bound",0n);if(d(n))return n;let r=t?ba(t):l("Resolved upper bound",rt);if(d(r))return r;let o=n.value,s=r.value;if(s<=o)return $e(rt/2n,bn);let i=(o+s)/2n;return i===o||i===s?a("No rank space available between neighbors"):$e(i,bn)}function Ia(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=rt*BigInt(r+1)/(t+1n),s=$e(o,bn);if(d(s))return s;n.push(s.value)}return l("Resolved evenly spaced ranks",n)}var Ns=(e,t)=>{let n=q(e),r=Ia(n.length);if(d(r))return r;let o={};for(let s=0;s<n.length;s++){let i=n[s],c=r.value[s];if(!i||!c)return a("Unable to assign rebalance rank");o[i.id]=c}return l("Created rebalance event",{id:Zu(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import{ulid as tp}from"ulid";var It=(e,t)=>{let{nodes:n}=g(),r=n[e];if(!r)return a("Node not found");if(r.context===t)return l("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return l("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return a(`No ancestor found for context: ${t}`)},As=(e,t)=>{let{nodes:n}=g(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},Ft=(e,t)=>e?e.readonly?a({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:a("Node not found"),I={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.userId&&n.userId!==t)return a("Contributor is already linked to another user");let r={...n,userId:t},o=he(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to link contributor to user"):l("Linked contributor to user",r)},deleteNode(e){he(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create comment, missing issue");if(!R(t))return a("Can only comment on issues");let n=he(r=>({...r,comments:{...r.comments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?a("Unable to create comment"):l("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return a("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return a("Unable to edit comment, missing issue");if(!R(r))return a("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=he(i=>({...i,comments:{...i.comments??{},[e]:o}}));return d(s)?a("Unable to edit comment"):l("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return a("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=he(o=>({...o,comments:{...o.comments??{},[e]:n}}));return d(r)?a("Unable to delete comment"):l("Deleted comment",n)},getComment(e){return g().comments?.[e]},getCommentsByIssue(e){return Object.values(g().comments??{}).filter(t=>t.issue===e&&!t.deleted)},createAttachment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create attachment, missing issue");if(!R(t))return a("Can only attach to issues");let n=he(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?a("Unable to create attachment"):l("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return a("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=he(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return d(r)?a("Unable to delete attachment"):l("Deleted attachment",n)},getAttachment(e){return g().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(g().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},editValue(e,t){let{nodes:n}=g(),r=n[e];if(!r)return a("Edit target node not found");let o=Ft(r,"edit");if(o)return o;let s={...r,props:{...r.props,description:t}};return this.updateNode(s),l("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return a("Rename target node not found");let r=Ft(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),l("Renamed node",o)},getExistingTags(){let{tags:e}=g();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=g();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return q(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=g(),o=this.getNode(e),s=this.getNode(t);if(!o)return a("Node not found");if(!s)return a("Target parent not found");if(r===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let i=Ft(o,"move");if(i)return i;if(As(t,e))return a("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=g(),o=this.getNode(e);if(!o)return a("Node not found");if(r===e)return a("Cannot delete root node");let s=Ft(o,"delete");if(s)return s;let i=new Set,c=m=>{let p=t[m];if(!(!p||i.has(m))){i.add(m);for(let f of q(p.id))c(f.id)}};c(e);let u={...structuredClone(t)};for(let m of i){if(!u[m])return a("Unable to locate node to delete");u[m]={...u[m],isDeleted:!0}}return n?(E({nodes:u}),l("Successfully tomb stoned",o)):a("Unable to delete undefined")},createContributor(e){let t=he(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?a("Unable to create contributor"):l("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!r)return a("Unable to assign contributor, missing target");let o=Ft(r,"edit");if(o)return o;if(!R(r))return a("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return a("Contributor already assigned");let i={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(i),l("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!r)return a("Unable to unassign, missing target");let o=Ft(r,"edit");if(o)return o;if(!R(r))return a("Target is not an issue");let s=r.props.assignees??[];if(!s.includes(t))return l("Issue is not assigned to that contributor",{assignee:t});let i={...r,props:{...r.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(i),l("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!r)return a("Unable to add tag, missing target");let o=Ft(r,"edit");if(o)return o;if(!R(r))return a("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return a("Tag already assigned");let i={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(i),l("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!r)return a("Unable to remove tag, missing target");let o=Ft(r,"edit");if(o)return o;if(!R(r))return a("Target is not an issue");let s=r.props.tags??[];if(!s.includes(t))return l("Issue is not tagged with that tag",{tag:t});let i={...r,props:{...r.props,tags:s.filter(c=>c!==t)}};return this.updateNode(i),l("Tag removed",{tag:t})},createTag(e){let t=he(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):l("Tag created",e)},createNode(e){let t=he(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?a("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return a("Failed to locate node");let n={...t,readonly:!0},r=he(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?a(r.message):l("Locked node",n)},updateNode(e){let t=he(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:l("Updated node",e)},getContributor(e){return g().contributors[e]},getTag(e){return g().tags[e]},getNode(e){return g().nodes[e]},getSiblings(e){return q(e)}};var Q={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var Ue=e=>e.slice(-7).toUpperCase(),Ea=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?Ue(e).includes(n):!0};var Z={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:L.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:Ue(e)},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:L.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:s="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:L.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:L.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:Ue(e)},context:L.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:L.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:s=!0,isVirtual:i=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:L.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};import Bt from"chalk";import wa from"string-width";import{decodeTime as sm}from"ulid";import En from"chalk";var Ne={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},y={accent:Ne.cyan,accent2:Ne.magenta,primary:Ne.white,secondary:Ne.grayDark,secondary2:Ne.grayLight,gray:Ne.gray,green:Ne.green,yellow:Ne.yellow,red:Ne.red};var S={red:Ne.red,yellow:Ne.yellow,green:Ne.green,blue:Ne.blue,magenta:Ne.magenta,cyan:Ne.cyan},In={urgent:S.red,critical:S.red,important:S.red,blocker:S.red,asap:S.red,immediate:S.red,fail:S.red,failure:S.red,broken:S.red,bug:S.red,error:S.red,incident:S.red,outage:S.red,production:S.red,crash:S.red,security:S.red,warning:S.yellow,warn:S.yellow,risky:S.yellow,risk:S.yellow,attention:S.yellow,pending:S.yellow,review:S.yellow,"needs-review":S.yellow,qa:S.yellow,testing:S.yellow,test:S.yellow,validate:S.yellow,verification:S.yellow,staging:S.yellow,check:S.yellow,"follow-up":S.yellow,followup:S.yellow,waiting:S.yellow,blocked:S.yellow,hold:S.yellow,done:S.green,complete:S.green,completed:S.green,success:S.green,ok:S.green,stable:S.green,resolved:S.green,fixed:S.green,closed:S.green,merged:S.green,released:S.green,deployed:S.green,approved:S.green,verified:S.green,working:S.green,healthy:S.green,pass:S.green,passing:S.green,info:S.blue,information:S.blue,note:S.blue,docs:S.blue,documentation:S.blue,doc:S.blue,guide:S.blue,help:S.blue,explanation:S.blue,detail:S.blue,details:S.blue,context:S.blue,design:S.blue,discussion:S.blue,proposal:S.blue,idea:S.blue,feature:S.magenta,enhancement:S.magenta,improvement:S.magenta,refactor:S.magenta,refactoring:S.magenta,cleanup:S.magenta,optimize:S.magenta,optimization:S.magenta,perf:S.magenta,performance:S.magenta,upgrade:S.magenta,migration:S.magenta,modernize:S.magenta,debt:S.magenta,todo:S.cyan,next:S.cyan,planned:S.cyan,plan:S.cyan,future:S.cyan,backlog:S.cyan,investigate:S.cyan,explore:S.cyan,prototype:S.cyan};var Ts={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Sa=(e,t,n)=>Math.max(t,Math.min(n,e)),Rs=(e,t,n)=>e+(t-e)*n,Ca=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},em=e=>e.toLowerCase().trim(),tm=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,i=e/60,c=s*(1-Math.abs(i%2-1)),u=0,m=0,p=0;i>=0&&i<1?(u=s,m=c):i>=1&&i<2?(u=c,m=s):i>=2&&i<3?(m=s,p=c):i>=3&&i<4?(m=c,p=s):i>=4&&i<5?(u=c,p=s):(u=s,p=c);let f=o-s/2;return[Math.round((u+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},Na=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var nm=(e,t,n)=>{let r=Sa(n,0,1);return[Math.round(Rs(e[0],t[0],r)),Math.round(Rs(e[1],t[1],r)),Math.round(Rs(e[2],t[2],r))]};var rm=(e,t,n)=>nm(e,t,n),nr=e=>{let n=Ca(e)%360,r=tm(n,Ts.stringColor.saturation,Ts.stringColor.lightness);return Na(r)},ue=(e,t=In)=>{let n=em(e);return n&&t[n]?t[n]:nr(n)};var Aa=e=>{let t=Ts.gradient.stops,n=Sa(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,s=Math.min(Math.floor(o),r-1),i=o-s;return rm(t[s],t[s+1],i)},zr=e=>Na(Aa(e)),qr=e=>Ca(e.toLowerCase().trim())/4294967295,Ra=e=>{let t=qr(e);return Aa(t)},om=e=>{let[t,n,r]=Ra(e);return{normal:o=>En.bgRgb(t,n,r).black(o),cursor:o=>En.bgRgb(t,n,r).white.bold(o)}},ws=e=>{let[t,n,r]=Ra(e);return{fg:o=>En.rgb(t,n,r)(o),fgCursor:o=>En.rgb(t,n,r).inverse(o),bg:o=>En.bgRgb(t,n,r).black(o),bgCursor:o=>En.bgRgb(t,n,r).white.bold(o)}},Yr=e=>om(e).normal(` ${e} `);import{decodeTime as Ta}from"ulid";var Sn=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"},Xr=e=>{let t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},Jr=e=>{try{return l("Decoded date",new Date(Ta(e)))}catch(t){return a("Decoding failed + "+t.message)}},Cn=e=>{if(!e?.id)return null;try{return Ta(e.id)}catch{return null}};var im=(e,t)=>e+" ".repeat(Math.max(0,t-wa(e))),am=(e,t)=>" ".repeat(Math.max(0,t-wa(e)))+e,Ma=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"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),dm=(e,t)=>t?e<t?"up":e>t?"down":null:null,cm=(e,t)=>{let n=I.getNode(e.payload.parent),r=n?Bt.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=dm(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},Pa=e=>`${Math.max(1,Math.round(e/1024))} KB`,La=e=>I.getAttachment(e)?.name??"",lm=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?Bt.bgHex(ue(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?Bt.bgHex(ue(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?Bt.hex(ue(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?Bt.hex(ue(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;case"add.issue.attachment":return`"${e.payload.name}" ${Bt.dim(`(${Pa(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=La(e.payload.id);return t?`"${t}"`:""}default:return""}},um=e=>{let t=Sn(sm(e));return Bt.gray(am(t,8))},mm=12,pm=e=>im(`${e}`,mm),fm=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?t.name:""}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return"name"in e.payload?`"${e.payload.name}"`:"";case"move.node":{let t=I.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${Pa(e.payload.bytes)})`;case"delete.issue.attachment":{let t=La(e.payload.id);return t?`"${t}"`:""}default:return""}},ka=e=>[Ma(e.action),fm(e)].filter(Boolean).join(" "),Da=(e,t)=>{let n=um(e.id),r=pm(e.userName),o=Bt.dim("\u203A"),s=e.action==="move.node"?cm(e,t):[Ma(e.action),lm(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};import{createHash as gm}from"node:crypto";var vm="0123456789ABCDEFGHJKMNPQRSTVWXYZ",ym=e=>{let t=gm("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+=vm[Number(n>>s&31n)]}return r},xe=(e,t)=>ym(`${e}:virtual:${t}`);var hm=e=>xe(e,"comments"),xm=e=>xe(e,"description"),bm=e=>xe(e,"assignees"),Im=e=>xe(e,"tags"),Em=e=>xe(e,"history"),Sm=e=>xe(e,"attachments"),Qr=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=I.getNode(e);if(!c){let p=I.createNode({...Z.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:i});return d(p)?p:l("Virtual field created",void 0)}if(!_e(c))return a(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==r||c.props.value!==o||c.readonly!==s||c.childRenderAxis!==i))return l("Virtual field unchanged",void 0);let m=I.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:i});return d(m)?m:l("Virtual field updated",void 0)},Fa=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let i=I.getNode(e);if(!i){let m=I.createNode({...Z.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return d(m)?m:l("Virtual field list created",void 0)}if(!Zn(i))return a(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==r||i.readonly!==o||i.childRenderAxis!==s))return l("Virtual field list unchanged",void 0);let u=I.updateNode({...i,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return d(u)?u:l("Virtual field list updated",void 0)},Ba=e=>{let t=$e(rt/4n),n=$e(rt/2n),r=$e(rt*3n/4n),o=$e(rt*7n/8n),s=$e(rt*15n/16n),i=$e(rt*13n/16n);if(d(t))return t;if(d(n))return n;if(d(r))return r;if(d(o))return o;if(d(s))return s;if(d(i))return i;let c=Qr({id:xm(e.id),name:Q.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(c))return c;let u=Fa({id:bm(e.id),name:Q.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(u))return u;let m=Fa({id:Im(e.id),name:Q.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(d(m))return m;let p=Qr({id:hm(e.id),name:Q.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(p))return p;let f=Qr({id:Sm(e.id),name:Q.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(d(f))return f;let b=Qr({id:Em(e.id),name:Q.HISTORY,parentNodeId:e.id,rank:i.value,value:Cm(e),readonly:!0,childRenderAxis:"vertical"});return d(b)?b:l("Ticket virtual nodes materialized",void 0)},Cm=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=>Da(r,n.get(r.action)??[])).join(`
41
- `)};var Nm=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[pe,Zr]=Nm;var k=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Ua=e=>{let t=I.getNode(e);if(!t||!R(t)||t.isDeleted)return null;let n=Ba(t);return d(n)?n:null},Am=e=>{for(let t of e){let n=Ua(t);if(n)return n;let r=g().nodes[t]?.parentNodeId;if(!r)continue;let o=Ua(r);if(o)return o}return null},Rm=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},Tm=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},Ms=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 Tm(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"create.contributor":case"link.contributor.user":default:return[]}},wm=e=>{he(t=>({...t,eventLog:[...t.eventLog,e]}))},Mm=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?k("Invalid user ID format",e):l("Valid user",null)},Pm=(e,t)=>{let n=Mm(e);if(d(n))return n;let r=[...new Set(Ms(e))];t||(r.forEach(s=>Rm(s,e)),wm(e));let o=Am(r);return o||null},Lm={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Z.workspace(t,n,r),s=rr(o);if(d(s))return k(s.message,e);let i=I.createNode(o);return d(i)?k(i.message??"Failed to initialize workspace",e):Ss(i.value)?l("Workspace initialized",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=I.createNode(Z.workspace(t,n,r));return d(o)?k(o.message??"Failed to add workspace",e):Ss(o.value)?l("Added workspace",{action:e.action,result:o.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=I.createNode(Z.board(t,n,r,o));return d(s)?k(s.message??"Unable to create board",e):Kr(s.value)?l("Added board",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=I.createNode(Z.swimlane(t,n,r,o));return d(s)?k(s.message??"Unable to create swimlane",e):Dt(s.value)?l("Added swimlane",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=I.createNode(Z.ticket(t,n,r,o));return d(s)?k(s.message??"Unable to create issue",e):R(s.value)?l("Added issue",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,i=I.createNode(Z.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(Q.DESCRIPTION)?"vertical":"horizontal"}));return d(i)?k(i.message??`Unable to create field: ${n}`,e):_e(i.value)?l("Added field",{action:e.action,result:i.value}):a("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!I.getNode(t))return k(`Unable to locate node with id ${t}`,e);let o=I.renameNode(t,n);return d(o)?k(o.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=I.tombstoneNode(t);return d(n)?k(n.message??"Unable to delete node",e):l("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=I.createTag({id:t,name:n});return d(r)?k(r.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=I.createContributor({id:t,name:n});return d(r)?k(r.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=I.tag(t,n);return d(r)?k(r.message??"Unable to tag issue",e):l("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=I.untag(t,n);return d(r)?k(r.message??"Unable to untag issue",e):l("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=I.assign(t,n);return d(r)?k(r.message??"Unable to assign issue",e):l("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=I.unassign(t,n);return d(r)?k(r.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?k(o.message??"Failed to move node",e):l("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=I.editValue(t,n);return d(r)?k(r.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.getNode(t);if(!o)return k("Unable to locate issue",e);if(!R(o))return k("Can only close issues",e);let s=I.getNode(pe);if(!s)return k("Unable to locate target swimlane",e);if(n!==s.id)return k("Close target must be closed swimlane",e);let i=I.moveNodeToRank({id:t,parentId:n,rank:r});return d(i)?k(i.message??"Unable to close issue",e):l("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.getNode(t);if(!o)return k("Unable to locate issue",e);if(!R(o))return k("Can only reopen issues",e);let s=I.getNode(pe);if(!s)return k("Unable to locate closed swimlane",e);if(n===s.id)return k("Cannot reopen issue into closed swimlane",e);if(!I.getNode(n))return k("Reopen parent no longer exists",e);let c=I.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?k(c.message??"Unable to reopen issue",e):l("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=I.lockNode(t);return d(n)?k(n.message??"Unable to lock node",e):l("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=I.getNode(r);if(!s)return k(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return k(`Node ${r} is not child of ${t}`,e);let i=I.updateNode({...s,rank:o});if(d(i))return k(i.message??"Unable to rebalance child",e)}return l("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:r,md:o}=e.payload,s=I.createComment({id:t,issue:n,authorId:r,authorName:I.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return d(s)?k(s.message??"Unable to add comment",e):l("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=I.getComment(t);if(!o)return k("Unable to locate comment",e);if(o.issue!==n)return k("Comment does not belong to issue",e);let s=I.editComment(t,r);return d(s)?k(s.message??"Unable to edit comment",e):l("Comment edited",{action:e.action,result:{id:t,issue:n,md:r}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,r=I.getComment(t);if(!r)return k("Unable to locate comment",e);if(r.issue!==n)return k("Comment does not belong to issue",e);let o=I.deleteComment(t);return d(o)?k(o.message??"Unable to delete comment",e):l("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"add.issue.attachment":e=>{let{id:t,issue:n,hash:r,ext:o,name:s,bytes:i}=e.payload,c=I.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:i,deleted:!1});return d(c)?k(c.message??"Unable to add attachment",e):l("Attachment added",{action:e.action,result:{id:t,issue:n,hash:r}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,r=I.getAttachment(t);if(!r)return k("Unable to locate attachment",e);if(r.issue!==n)return k("Attachment does not belong to issue",e);let o=I.deleteAttachment(t);return d(o)?k(o.message??"Unable to delete attachment",e):l("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=I.linkUserId({contributorId:t,userId:e.userId});return d(n)?k(n.message??"Unable to link contributor",e):l("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function Ut(e,t=!1){let n=Lm[e.action];if(!n)return a(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);let r=n(e);if(d(r))return r;let o=Pm(e,t);return o||r}var Ot=e=>e.map(t=>Ut(t));import Km from"node:fs";import Gm from"node:path";import{decodeTime as zm,monotonicFactory as qm}from"ulid";import{z as or}from"zod";import eo from"node:fs";import Ls from"node:path";import{decodeTime as Fm}from"ulid";import{z as Ps}from"zod";var km=["init.workspace","add.workspace","add.board","add.swimlane","add.issue","add.field","edit.title","delete.node","create.tag","create.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 Dm=new Set(km),Oa=e=>Dm.has(e),_a=e=>({action:e.action,payload:e.payload});var Bm=Ps.object({userId:Ps.string().min(1).default("unknown"),userName:Ps.string().min(1).default("unknown")}),Um=e=>{let[t,n]=Ls.basename(e,".jsonl").split("."),r=Bm.safeParse({userId:t,userName:n});return r.success?l("Parsed event file actor",r.data):a(`Invalid event file name ${Ls.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Om=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?a(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?a("Invalid persisted event: action key is missing or invalid"):l("Resolved persisted action",t[0])},_m=(e,t)=>t in e,$m=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Hm=e=>{let{userId:t,userName:n,...r}=e,o=Om(r);if(d(o))return a(o.message);let s=o.value,i=e.id?.[0];return i?_m(r,s)?l("Decoded persisted event",$m({id:i,action:s,payload:r[s],userId:t,userName:n})):a(`Persisted event is missing payload for action: ${s}`):a("Persisted event is missing id")},ks=e=>{let t=[],n=new Map;for(let r of e){let o=Hm(r);if(d(o))return a(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);let s=o.value.action;if(!Oa(s)){n.set(s,(n.get(s)??0)+1);continue}t.push(o.value)}if(n.size>0){let r=[...n.entries()].map(([o,s])=>`${o} (x${s})`).join(", ");se.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${r}. Upgrade to apply them.`)}return l("Decoded reconstructed events",t)},Wm=e=>{if(!eo.existsSync(e))return l("Event file missing",[]);let t=Um(e);if(d(t))return a(t.message);let n=eo.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
42
- `)){let s=o.trim();if(!s)continue;let i;try{i=JSON.parse(s)}catch{return a(`Failed to parse event JSON from ${e}: ${s}`)}let c=Fs(i);if(d(c))return a(`${c.message} in ${e}: ${s}`);r.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return l("Parsed persisted events file",r)};function Ds(e){let t=Kn(e);if(!eo.existsSync(t))return l("No events found",[]);let n=eo.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Ls.join(t,o)),r=[];for(let o of n){let s=Wm(o);if(d(s))return a(s.message);r.push(...s.value)}return l("All events loaded",jm(r))}function Et(e){let t=Ds(e);return d(t)?a(t.message):ks(t.value)}function $a(e,t){let n=Ds(e);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=Vm(n.value,t),s=ks(r);if(d(s))return a(s.message);let i=ks(o);return d(i)?a(i.message):l("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:i.value})}function Ha(e=process.cwd()){let t=Ds(e);return d(t)?a(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var jm=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 b=n.get(f)??[];b.push(m),n.set(f,b)}for(let m of n.values())m.sort((p,f)=>p.id[0].localeCompare(f.id[0]));let r=[],o=new Set,s=m=>{let p=m.id[0];if(o.has(p))return;r.push(m),o.add(p);let f=n.get(p)??[];for(let b of f)s(b)},i=n.get(null)??[];for(let m of i)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((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of c)s(m);let u=e.filter(m=>!o.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)s(m);return r},Vm=(e,t)=>{let n=new Set,r=[],o=[];for(let s of e){let i=s.id[0],c=s.id[1],u=!1;try{u=Fm(i)<t}catch{u=!1}!u||c&&n.has(c)?(n.add(i),o.push(s)):r.push(s)}return{appliedEvents:r,unappliedEvents:o}};var Va=1,Wa=qm(),Ym=or.tuple([or.string().min(1),or.string().min(1).nullable()]),Xm=or.looseObject({v:or.literal(Va),id:Ym}),Fs=e=>{let t=Xm.safeParse(e);return t.success?l("Parsed persisted event",t.data):a(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ja=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Jm=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Qm=e=>e.trim().length>0&&e.length<=80,ie=()=>{let{userName:e,userId:t}=K();return e?t?Jm(t)?Qm(e)?l("Successfully resolved actor ID",{userId:t,userName:e}):a("Invalid user name in config"):a("Invalid user ID in config"):a("User ID not configured"):a("User name not configured")},on=({userId:e,userName:t})=>`${ja(e)}.${ja(t)}.jsonl`,Zm=(e,{userId:t,userName:n})=>{let r=on({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return a(`Invalid event log file name: ${r}`);let s=Gm.join(Kn(e),r);return l("Successfully resolved event log path",s)},ep=(e,t)=>{let n={[e.action]:e.payload,v:Va,id:t};return Fs(n)};function to({event:e,rootDir:t}){try{let n=Bi(t);if(d(n))return n;let r=Zm(t,{userId:e.userId,userName:e.userName});if(d(r))return r;let o=Ha(t);if(d(o))return a(o.message);let s=o.value?Wa(Math.max(Date.now(),zm(o.value)+1)):Wa(),i=ep(_a(e),[s,o.value]);return d(i)?a(i.message):(Km.appendFileSync(r.value,`${JSON.stringify(i.value)}
43
- `,"utf8"),l("Event persisted",{path:r.value,entry:i.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return a(`Failed to persist event: ${r}`)}}function Ka(e,t){let n=Ut(e);if(n.status!==Pt.Success)return n;let r=to({event:e,rootDir:t});return d(r)?r:n}function B(e,t){if(e.length===0||!e[0])return a("No events provided");let n=np(e[0],t);if(d(n))return n;let r=e.map(s=>Ka(s,t)),o=r.filter(d);return o.length>0?a("Materialize and persist failed: "+o.map(s=>s.message).join(", ")):l("Materialization succeeded",r.map(s=>s.value))}var np=(e,t)=>{if(e.action==="create.contributor")return l("Contributor already being created",void 0);if(I.getContributor(e.userId))return l("Contributor exists",void 0);let n={id:tp(),action:"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName},r=Ka(n,t);return d(r)?a(r.message):l("Contributor created",void 0)};var Ga=e=>no(q(e),{at:"end"}),no=(e,t={at:"end"})=>{let n=r=>d(r)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(Be(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(Be(void 0,r.rank)):a("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(Be(r.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let r=za(e,t.sibling);if(r<0)return a("Sibling not found");let o=r>0?e[r-1]:void 0,s=e[r];return s?n(Be(o?.rank,s.rank)):a("Sibling not found")}case"after":{let r=za(e,t.sibling);if(r<0)return a("Sibling not found");let o=e[r],s=r<e.length-1?e[r+1]:void 0;return o?n(Be(o.rank,s?.rank)):a("Sibling not found")}}},q=e=>Object.values(g().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),za=(e,t)=>e.findIndex(n=>n.id===t),qa=(e,t,n={at:"end"})=>no(q(t).filter(r=>r.id!==e),n),sn=(e,t,n,r,o)=>{let s=qa(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return l("Resolved rank",s.value.rank);let i=Ns(e,r);if(d(i))return i;let c=B([i.value],o);if(d(c))return c;let u=qa(t,e,n);return d(u)?u:u.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",u.value.rank)},Nn=(e,t,n)=>{let r=Ga(e);if(d(r))return r;if(!r.value.needsRebalance)return l("Resolved rank",r.value.rank);let o=Ns(e,t);if(d(o))return o;let s=B([o.value],n);if(d(s))return s;let i=Ga(e);return d(i)?i:i.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",i.value.rank)};var T={exit(){process.exit(0)},enterChildNode(){let e=g(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=G(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||T.navigate({contextNode:o,selectedIndex:G(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=g();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=G(n.id),o=r.findIndex(({id:i})=>i===e.id),s=r.length===0?-1:o>=0?o:0;T.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Ya(1),navigateToPreviousItem:()=>Ya(-1),navigateToNextContainer:()=>Xa(1),navigateToPreviousContainer:()=>Xa(-1),navigate:({contextNode:e,selectedIndex:t})=>{E({contextNodeId:e.id,selectedIndex:t})}},Ya=e=>{let{selectedIndex:t,contextNode:n}=g(),r=G(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;T.navigate({selectedIndex:s,contextNode:n})},Xa=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=g();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=G(o.id),i=s.findIndex(b=>b.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let u=G(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),f=u.length?p:-1;T.navigate({contextNode:c,selectedIndex:f})};var Qa=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Za=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=g();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},rp=e=>{let t=g().nodes[e];return!!t&&!t.isDeleted&&_e(t)&&t.childRenderAxis==="vertical"},ro=(e,t)=>{let{nodes:n}=g(),r=n[e];if(!r||r.isDeleted)return!1;let o=q(r.id);return T.navigate({contextNode:r,selectedIndex:Qa(t,o.length)}),!0},ed=e=>{let{nodes:t}=g(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return ro(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let i=q(o.id).findIndex(c=>c.id===n.id);return i>=0?(T.navigate({contextNode:o,selectedIndex:i}),!0):ed(o.id)},Ja=e=>{let{nodes:t}=g(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),ed(n))return!0;n=t[n]?.parentNodeId}return!1},op=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},td=e=>{let{nodes:t,rootNodeId:n}=g();if(rp(e.contextNodeId)&&ro(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(op(e.selectedNodeId)&&e.selectedNodeId&&Ja(e.selectedNodeId))return l("Restored navigation to selected node or ancestor",null);if(ro(e.contextNodeId,e.selectedIndex))return l("Restored navigation to previous container",null);if(e.parentNodeId&&ro(e.parentNodeId,e.selectedIndex))return l("Restored navigation to previous parent",null);if(Ja(e.contextNodeId))return l("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return a("Unable to restore navigation");let o=q(r.id);return T.navigate({contextNode:r,selectedIndex:Qa(e.selectedIndex,o.length)}),l("Restored navigation to root",null)};import{monotonicFactory as sp,ulid as St}from"ulid";var sr=sp();function ip(){let e=Je();if(d(e))return a("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[r]=G(n.id),[o]=r?G(r.id):[];if(o){let s=t.renderedChildrenIndex?.[o.id]??[];return l("Resolved boot nav target",{contextNode:o,selectedIndex:s.length>0?0:-1})}else return r?l("Resolved boot nav target",{contextNode:r,selectedIndex:0}):n?l("Resolved boot nav target",{contextNode:n,selectedIndex:0}):l("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function ap(){let e=ip();return d(e)?e:T.navigate(e.value)}function nd({userId:e,userName:t}){let n=sr(),r=sr(),o=sr(),s=sr(),i=sr(),c=Be(void 0,void 0);if(d(c))return c;let u=Be(void 0,void 0);if(d(u))return u;let m=Be(u.value,void 0);if(d(m))return m;let p=Be(void 0,void 0);if(d(p))return p;let f=Be(p.value,void 0);if(d(f))return f;let b=Be(f.value,void 0);if(d(b))return b;let C=Be(void 0,void 0);return d(C)?C:l("Created default events",[{id:St(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:St(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:St(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:St(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:St(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"Done",parent:r,rank:b.value}},{id:St(),userId:e,userName:t,action:"add.board",payload:{id:Zr,name:"Closed",parent:n,rank:m.value}},{id:St(),userId:e,userName:t,action:"add.swimlane",payload:{id:pe,name:"Closed",parent:Zr,rank:C.value}},{id:St(),userId:e,userName:t,action:"lock.node",payload:{id:Zr}},{id:St(),userId:e,userName:t,action:"lock.node",payload:{id:pe}}])}function an(e){if(!e.length){let r=Z.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=rr(r);return d(o)?o:(E({hasProjectDefinition:!1,mode:v.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!e.some(r=>r.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=Ot(e).filter(d);return n.length>0?a(`Materializing failed:
19
+ `).filter(Boolean).filter(i=>i!==mt);if(r.length===0)return u("State branch is storage-only",!1);let o=await F({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return a(`Failed to clean storage branch
20
+ ${o.message}`);let s=await Nn({cwd:e,message:"[epiq:repair-storage-branch]"});return d(s)?a(s.message):u("Cleaned storage branch",!0)},gt=Cs(async(e=process.cwd())=>{let t=await F({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?a("Not inside a Git repository"):u("Resolved repo root",t.value.stdout.trim())},e=>ft.resolve(e)),Ex=Cs(async e=>{let t=await F({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return a(t.message);let n=t.value.stdout.trim(),r=ft.isAbsolute(n)?n:ft.join(e,n);return u("Resolved git dir",r)},e=>ft.resolve(e));var wx=process.env.IS_LOCAL==="true",mt=".epiq",qr="events",Ds="media",Tm="project.json",qn=e=>vt.join(e,mt),_r=e=>vt.join(qn(e),Tm),tr=e=>vt.join(qn(e),qr),nr=e=>vt.join(qn(e),Ds),Sa=e=>vt.join(e,mt),wm=e=>{let t=vt.join(e,mt);return er.existsSync(t)&&er.statSync(t).isDirectory()},Bs=e=>{let t=_r(e);return er.existsSync(t)&&er.statSync(t).isFile()},$r=e=>{let t=vt.resolve(e);for(;;){if(wm(t))return u("Resolved closest .epiq root",t);let n=vt.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},_e=e=>{let t=vt.resolve(e);for(;;){if(Bs(t))return u("Resolved closest epiq project root",t);let n=vt.dirname(t);if(n===t)return a("No .epiq/project.json found in any parent");t=n}},Ca=e=>{let t=tr(e);try{return er.mkdirSync(t,{recursive:!0}),u("Resolved events dir",t)}catch(n){return a(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},yt=async()=>{let e=await gt(process.cwd());if(d(e))return e;let t=Re({repoRoot:e.value});return d(t)?t:u("Resolved persist root",t.value)};import{accessSync as Mm,copyFileSync as Pm,existsSync as Yr,mkdirSync as Na,readdirSync as Ra,readFileSync as Lm,renameSync as km,rmSync as Dm,statSync as Aa,unlinkSync as Bm,writeFileSync as Fm}from"node:fs";import Rn from"node:path";var Fs=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",be={writeToFile:(e,t)=>{try{let n=Rn.dirname(e);Yr(n)||Na(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Fm(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Lm(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=be.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 Yr(e)&&Aa(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Mm(e),!0}catch{return!1}},mkDir:e=>Na(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Rn.parse(t);for(;;){let r=Rn.join(t,e);try{if(Yr(r)&&Aa(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Rn.dirname(t)}return null},readFirstJSON(e){try{if(!be.dirExists(e))return null;let t=Ra(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Rn.join(e,t);return be.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return be.dirExists(e)?Ra(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Bm(e)}catch(t){(!Fs(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Dm(e,{recursive:!0,force:!0})}catch(t){(!Fs(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Rn.dirname(t)),!n?.overwrite&&Yr(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{km(e,t)}catch(r){if(Fs(r)&&r.code==="EXDEV"){Pm(e,t),this.rmFile(e);return}throw r}}};var Om={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Ta=Rt.object({logLevel:Rt.enum(["info","error","debug"]),preferredEditor:Rt.string().optional(),userName:Rt.string().optional(),userId:Rt.string().optional(),autoSync:Rt.boolean().nullable().optional(),autoSyncDebounceMs:Rt.number().optional(),attachmentMaxKb:Rt.number().optional(),viewMode:Rt.enum(["dense","wide"]).optional()}).partial(),_m="config.json",wa=Yn,Us=()=>Um.join(wa(),_m),Os=()=>{try{return be.mkDir(wa()),u(`Ensured ~/${rt} exists`,null)}catch{return a(`Unable to create ~/${rt}`)}},$m=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${rt}/config.json JSON`)}let n=Ta.safeParse(t??{});return n.success?u("Parsed config",n.data):a(`Invalid ~/${rt}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},rr=()=>{let e=Os();if(d(e))return a(e.message);let t=Us(),n=be.readFile(t);return n==null||n.trim()===""?u("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):$m(n)},Ma=e=>{let t=Os();if(d(t))return a(t.message);let n=Ta.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Us();try{return be.writeToFile(r,JSON.stringify(n.data,null,2)+`
21
+ `),u("Config written",null)}catch{return a(`Unable to write ~/${rt}/config.json`)}},Qe=e=>{let t=rr();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return Ma(n)},Ft=()=>{let e=Us(),t=Os();if(d(t))return a(`Unable to create ~/${rt}`);if(!(be.readFile(e)!==null)){let g=Ma(Om);if(d(g))throw new Error(`Unable to create ~/${rt}/config.json`)}let r=rr();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:i,autoSync:c,autoSyncDebounceMs:l,attachmentMaxKb:m,logLevel:p,viewMode:f}=r.value;return!s||!i?a(`User name or ID not configured in ~/${rt}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,u("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:s,userId:i,autoSync:c??!1,autoSyncIntervalMs:l??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))};import{useSyncExternalStore as Hm}from"react";var or={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},_s=new Set,jm=()=>{for(let e of _s)e()},K=()=>or,Pa=()=>Hm(e=>(_s.add(e),()=>{_s.delete(e)}),()=>or),Me=e=>(or={...or,...e},jm(),or);import{spawn as Wm}from"node:child_process";import $s from"node:process";var La=e=>{let t=$s.platform==="darwin"?"open":$s.platform==="win32"?"cmd":"xdg-open",n=$s.platform==="win32"?["/c","start","",e]:[e];Wm(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as Iu}from"node:fs/promises";import ry from"node:http";import En from"node:path";import{fileURLToPath as oy}from"node:url";import{decodeTime as Yl,ulid as q}from"ulid";import dn from"node:fs";import Xr from"node:path";var Da=async e=>{if((await pt({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return u("Initial commit already exists",!1);se.info("Creating initial commit");let n=await le.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?a(n.message):u("Created initial commit",!0)},ka=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Vm=async e=>{let t=await Gr(e);if(d(t))return a(t.message);let n=await ma(e);return d(n)?a(n.message):u("Built sync commit message",`[sync|branch:${ka(t.value)}:sha:${ka(n.value)}]`)},Hs=async({repoRoot:e,stateBranchName:t})=>{se.info(`Creating ${t}`);let n=await F({args:["commit-tree",ya,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return a(`Failed to create state branch commit
22
+ ${n.message}`);let r=n.value.stdout.trim(),o=await F({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?a(`Failed to create ${t}
23
+ ${o.message}`):u("Created state branch",!0)},Gm=async({repoRoot:e,stateBranchName:t})=>{let n=await ws({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
24
+ `+n.message);let r=n.value,o=r?await Wr({repoRoot:e,branch:t}):u("No remote, no remote state branch",!1);if(d(o))return a(`Ensure local state branch failed
25
+ `+o.message);let s=o.value;if(r&&s){let c=await le.fetch({cwd:e,remote:Je,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
26
+ ${c.message}`)}let i=await Vr({repoRoot:e,branch:t});if(d(i))return a(`Ensure local state branch failed
27
+ `+i.message);if(i.value)return u("Local state branch already exists",!1);if(s){let c=await F({args:["branch","--track",t,`${Je}/${t}`],cwd:e});return d(c)?a(`Failed to create local ${t} from remote
28
+ ${c.message}`):u("Created local state branch from remote",!0)}return Hs({repoRoot:e,stateBranchName:t})},Km=async({repoRoot:e,branch:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=n.value.stdout.split(`
29
+ `),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)},zm=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Zn(Xr.dirname(t));if(d(r))return a(`Failed to create state branch worktree
30
+ `+r.message);dn.existsSync(t)&&!dn.existsSync(Xr.join(t,".git"))&&(se.info("Removing broken state branch worktree path"),ba(t)),se.info("Creating state branch worktree");let o=await le.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?a(`Failed to create state branch worktree
31
+ ${o.message}`):u("Created state branch worktree",!0)},cn=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Km({repoRoot:e,branch:n});if(d(r))return a(r.message);let o=Qn(t),s=r.value?Qn(r.value):null;if(s&&s===o&&dn.existsSync(s))return u("State branch already checked out in expected worktree",!1);if(s&&s!==o){se.info("Moving state branch worktree to expected location");let l=await le.worktreeRemove({cwd:e,worktreeRoot:s});if(d(l))return a(`Failed to remove existing state branch worktree
32
+ ${l.message}`)}if(s&&!dn.existsSync(s)){se.info("Pruning stale state branch worktree");let l=await le.worktreePrune({cwd:e});if(d(l))return a(`Failed to prune stale worktrees
33
+ ${l.message}`)}let i=await ua({repoRoot:e,worktreeRoot:t});if(d(i))return a(i.message);let c=dn.existsSync(t);if(i.value&&c)return u("State branch worktree already exists",!1);if(i.value&&!c){se.info("Pruning missing registered state branch worktree");let l=await le.worktreePrune({cwd:e});if(d(l))return a(`Failed to prune stale worktrees
34
+ ${l.message}`)}return zm({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},qm=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Gr(e);if(d(n))return a(n.message);if(n.value===t)return u("State branch already checked out",!1);(await pt({cwd:e,args:["rebase","--abort"]})).exitCode===0&&se.info("Aborted stale state branch rebase");let o=await le.checkout({cwd:e,branch:t});return d(o)?a(`Failed to checkout ${t}
35
+ ${o.message}`):u("Checked out state branch",!0)},Ym=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Ms(t);if(d(n))return a(n.message);if(n.value)return u("State branch upstream already configured",!1);let r=await ws({repoRoot:t});if(d(r))return a(r.message);if(!r.value)return u("No remote available for state branch upstream",!1);let o=Cn(e);if(d(o))return o;let s=o.value,i=await Wr({repoRoot:t,branch:s});if(d(i))return a(i.message);if(!i.value)return u("Remote state branch missing; upstream will be configured on first push",!1);se.info(`Configuring ${s} upstream`);let c=await le.fetch({cwd:t,remote:Je,branch:s});if(d(c))return a(`Failed to fetch ${s}
36
+ ${c.message}`);let l=await le.setUpstream({cwd:t,branch:s,upstream:`${Je}/${s}`});return d(l)?a(`Failed to set state branch upstream
37
+ ${l.message}`):u("Configured state branch upstream",!0)},Jr=async({stateBranchRoot:e,eventFileName:t})=>{let n=ks(t),r=Xr.join(e,n);if(!dn.existsSync(r))return u("No event file to stage",void 0);let o=await le.stage({cwd:e,pathspec:[n]});return d(o)?a(`Failed to stage state branch event file
38
+ ${o.message}`):u("Staged state branch event file",void 0)},Ba=async({stateBranchRoot:e})=>{let t=ha(),n=Xr.join(e,t);if(!dn.existsSync(n))return u("No media directory to stage",void 0);let r=await le.stage({cwd:e,pathspec:[t]});return d(r)?a(`Failed to stage state branch media files
39
+ ${r.message}`):u("Staged state branch media files",void 0)},Fa=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Vm(e);return d(n)?a(`Create state branch sync commit failed
40
+ `+n.message):Nn({cwd:t,message:n.value})},sr=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Ms(t);if(d(n))return a(n.message);let r=Cn(e);if(d(r))return r;let o=r.value,s=n.value?await le.push({cwd:t}):await le.push({cwd:t,remote:Je,branch:o,setUpstream:!0});return d(s)?a(`Failed during state branch push
41
+ ${s.message}`):u("Pushed state branch",!0)},Ua=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Cn(e);if(d(o))return o;let s=o.value,i=[zr(),await Gm({repoRoot:e,stateBranchName:s}),await cn({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await qm({stateBranchRoot:t,stateBranchName:s}),await Ea(t),n?await Ym({stateBranchRoot:t,repoRoot:e}):u("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(d(c))return a(c.message);r=r||!!c.value}return u(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{WebSocket as Xm}from"ws";var Qr=new Set,Oa=e=>{Qr.add(e),e.on("close",()=>{Qr.delete(e)}),e.on("error",()=>{Qr.delete(e)})},Ut=e=>{let t=JSON.stringify(e);for(let n of Qr)n.readyState===Xm.OPEN&&n.send(t)};import{useSyncExternalStore as Wv}from"react";var B={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function js(e){return e.context===B.WORKSPACE}function T(e){return e.context===B.TICKET}function Ot(e){return e.context===B.TEXT}function Ve(e){return e.context===B.FIELD}function ir(e){return e.context===B.FIELD_LIST}var _t=e=>e.context===B.SWIMLANE,Zr=e=>e.context===B.BOARD,ar=e=>e.context===B.COMMENT;var y={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var _a=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",$a=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Ha=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",ja=(e,t)=>{if($a(e,e.sequence))return x.MoveCursorLeftOfWord;if(Ha(e,e.sequence))return x.MoveCursorRightOfWord;if(_a(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}},Wa=(e,t)=>{if($a(e,e.sequence))return x.MoveCursorLeftOfWord;if(Ha(e,e.sequence))return x.MoveCursorRightOfWord;if(_a(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 eo(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var ln=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Ze=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),Va=e=>e.charAt(0).toUpperCase()+e.slice(1);var Ga=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},Ka=(e,t)=>t?e.get(t)??[]:[];var za=new WeakMap,Jm=e=>{let t=za.get(e);return t||(t=Ga(e),za.set(e,t)),t};var qa=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Ka(Jm(e),r).filter(s=>eo(r,s)>=n)};var Qm={hint:"",hints:[],overlap:0,remainder:""},Ya=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Qm;let o=qa({wordList:r,inputToMatch:e,overlapThreshold:1});return Zm(t,o)},Zm=(e,t)=>{let n=t[0]??"",r=eo(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),i=r<(o??"").length,c=!!s,p=(c&&i?o:n)+(c&&i?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}};import{ulid as np}from"ulid";var An=24n,ep=An*4n,ot=(1n<<ep)-1n,tp=/^[0-9a-f]+$/;function Xa(e){return!e||!tp.test(e)?a(`Invalid hex rank: ${e}`):u("Converted rank to bigint",BigInt("0x"+e))}function Ge(e,t=An){if(e<0n)return a("Negative rank not allowed");let n=e.toString(16);return u("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function $e(e,t){if(!e&&!t)return Ge(ot/2n,An);let n=e?Xa(e):u("Resolved lower bound",0n);if(d(n))return n;let r=t?Xa(t):u("Resolved upper bound",ot);if(d(r))return r;let o=n.value,s=r.value;if(s<=o)return Ge(ot/2n,An);let i=(o+s)/2n;return i===o||i===s?a("No rank space available between neighbors"):Ge(i,An)}function Ja(e){if(e<=0)return u("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=ot*BigInt(r+1)/(t+1n),s=Ge(o,An);if(d(s))return s;n.push(s.value)}return u("Resolved evenly spaced ranks",n)}var Ws=(e,t)=>{let n=Y(e),r=Ja(n.length);if(d(r))return r;let o={};for(let s=0;s<n.length;s++){let i=n[s],c=r.value[s];if(!i||!c)return a("Unable to assign rebalance rank");o[i.id]=c}return u("Created rebalance event",{id:np(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import{ulid as af}from"ulid";var to="removed",Ue=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?u("Found node",n):a("Unable to find node in breadcrumb")},Qa=["png","jpg","gif","webp"];var At=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return a("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 a(`No ancestor found for context: ${t}`)},Vs=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},$t=(e,t)=>e?e.readonly?a({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:a("Node not found"),E={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.userId&&n.userId!==t)return a("Contributor is already linked to another user");let r={...n,userId:t},o=pe(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to link contributor to user"):u("Linked contributor to user",r)},deleteNode(e){pe(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create comment, missing issue");if(!T(t))return a("Can only comment on issues");let n=pe(r=>({...r,comments:{...r.comments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?a("Unable to create comment"):u("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return a("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return a("Unable to edit comment, missing issue");if(!T(r))return a("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=pe(i=>({...i,comments:{...i.comments??{},[e]:o}}));return d(s)?a("Unable to edit comment"):u("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return a("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=pe(o=>({...o,comments:{...o.comments??{},[e]:n}}));return d(r)?a("Unable to delete comment"):u("Deleted comment",n)},getComment(e){return v().comments?.[e]},getCommentsByIssue(e){return Object.values(v().comments??{}).filter(t=>t.issue===e&&!t.deleted)},createAttachment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create attachment, missing issue");if(!T(t))return a("Can only attach to issues");let n=pe(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?a("Unable to create attachment"):u("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return a("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=pe(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return d(r)?a("Unable to delete attachment"):u("Deleted attachment",n)},getAttachment(e){return v().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(v().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},editValue(e,t){let{nodes:n}=v(),r=n[e];if(!r)return a("Edit target node not found");let o=$t(r,"edit");if(o)return o;let s={...r,props:{...r.props,description:t}};return this.updateNode(s),u("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return a("Rename target node not found");let r=$t(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),u("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return Y(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),s=this.getNode(t);if(!o)return a("Node not found");if(!s)return a("Target parent not found");if(r===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let i=$t(o,"move");if(i)return i;if(Vs(t,e))return a("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}=v(),o=this.getNode(e);if(!o)return a("Node not found");if(r===e)return a("Cannot delete root node");let s=$t(o,"delete");if(s)return s;let i=new Set,c=m=>{let p=t[m];if(!(!p||i.has(m))){i.add(m);for(let f of Y(p.id))c(f.id)}};c(e);let l={...structuredClone(t)};for(let m of i){if(!l[m])return a("Unable to locate node to delete");l[m]={...l[m],isDeleted:!0}}return n?(C({nodes:l}),u("Successfully tomb stoned",o)):a("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return a("Contributor not found");let n={...t,name:to,tombstoned:!0},r=pe(o=>({...o,contributors:{...o.contributors,[e]:n}}));return d(r)?a("Unable to remove contributor"):u("Tombstoned contributor",n)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return a("Contributor not found");let r={...n,name:t,tombstoned:!1},o=pe(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to restore contributor"):u("Restored contributor",r)},createContributor(e){let t=pe(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?a("Unable to create contributor"):u("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!r)return a("Unable to assign contributor, missing target");let o=$t(r,"edit");if(o)return o;if(!T(r))return a("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return a("Contributor already assigned");let i={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(i),u("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!r)return a("Unable to unassign, missing target");let o=$t(r,"edit");if(o)return o;if(!T(r))return a("Target is not an issue");let s=r.props.assignees??[];if(!s.includes(t))return u("Issue is not assigned to that contributor",{assignee:t});let i={...r,props:{...r.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(i),u("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!r)return a("Unable to add tag, missing target");let o=$t(r,"edit");if(o)return o;if(!T(r))return a("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return a("Tag already assigned");let i={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(i),u("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!r)return a("Unable to remove tag, missing target");let o=$t(r,"edit");if(o)return o;if(!T(r))return a("Target is not an issue");let s=r.props.tags??[];if(!s.includes(t))return u("Issue is not tagged with that tag",{tag:t});let i={...r,props:{...r.props,tags:s.filter(c=>c!==t)}};return this.updateNode(i),u("Tag removed",{tag:t})},createTag(e){let t=pe(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):u("Tag created",e)},createNode(e){let t=pe(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?a("Unable to create node"):u("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return a("Failed to locate node");let n={...t,readonly:!0},r=pe(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?a(r.message):u("Locked node",n)},updateNode(e){let t=pe(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:u("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings(e){return Y(e)}};var Z={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var He=e=>e.slice(-7).toUpperCase(),Za=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?He(e).includes(n):!0};var ee={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:B.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:He(e)},context:B.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:B.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:s="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:B.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:B.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:He(e)},context:B.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:B.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:s=!0,isVirtual:i=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:B.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};import Ht from"chalk";import sd from"string-width";import{decodeTime as dp}from"ulid";import wn from"chalk";var Pe={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},h={accent:Pe.cyan,accent2:Pe.magenta,primary:Pe.white,secondary:Pe.grayDark,secondary2:Pe.grayLight,gray:Pe.gray,green:Pe.green,yellow:Pe.yellow,red:Pe.red};var N={red:Pe.red,yellow:Pe.yellow,green:Pe.green,blue:Pe.blue,magenta:Pe.magenta,cyan:Pe.cyan},Tn={urgent:N.red,critical:N.red,important:N.red,blocker:N.red,asap:N.red,immediate:N.red,fail:N.red,failure:N.red,broken:N.red,bug:N.red,error:N.red,incident:N.red,outage:N.red,production:N.red,crash:N.red,security:N.red,warning:N.yellow,warn:N.yellow,risky:N.yellow,risk:N.yellow,attention:N.yellow,pending:N.yellow,review:N.yellow,"needs-review":N.yellow,qa:N.yellow,testing:N.yellow,test:N.yellow,validate:N.yellow,verification:N.yellow,staging:N.yellow,check:N.yellow,"follow-up":N.yellow,followup:N.yellow,waiting:N.yellow,blocked:N.yellow,hold:N.yellow,done:N.green,complete:N.green,completed:N.green,success:N.green,ok:N.green,stable:N.green,resolved:N.green,fixed:N.green,closed:N.green,merged:N.green,released:N.green,deployed:N.green,approved:N.green,verified:N.green,working:N.green,healthy:N.green,pass:N.green,passing:N.green,info:N.blue,information:N.blue,note:N.blue,docs:N.blue,documentation:N.blue,doc:N.blue,guide:N.blue,help:N.blue,explanation:N.blue,detail:N.blue,details:N.blue,context:N.blue,design:N.blue,discussion:N.blue,proposal:N.blue,idea:N.blue,feature:N.magenta,enhancement:N.magenta,improvement:N.magenta,refactor:N.magenta,refactoring:N.magenta,cleanup:N.magenta,optimize:N.magenta,optimization:N.magenta,perf:N.magenta,performance:N.magenta,upgrade:N.magenta,migration:N.magenta,modernize:N.magenta,debt:N.magenta,todo:N.cyan,next:N.cyan,planned:N.cyan,plan:N.cyan,future:N.cyan,backlog:N.cyan,investigate:N.cyan,explore:N.cyan,prototype:N.cyan};var Ks={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},ed=(e,t,n)=>Math.max(t,Math.min(n,e)),Gs=(e,t,n)=>e+(t-e)*n,td=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},rp=e=>e.toLowerCase().trim(),op=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,i=e/60,c=s*(1-Math.abs(i%2-1)),l=0,m=0,p=0;i>=0&&i<1?(l=s,m=c):i>=1&&i<2?(l=c,m=s):i>=2&&i<3?(m=s,p=c):i>=3&&i<4?(m=c,p=s):i>=4&&i<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)]},nd=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var sp=(e,t,n)=>{let r=ed(n,0,1);return[Math.round(Gs(e[0],t[0],r)),Math.round(Gs(e[1],t[1],r)),Math.round(Gs(e[2],t[2],r))]};var ip=(e,t,n)=>sp(e,t,n),dr=e=>{let n=td(e)%360,r=op(n,Ks.stringColor.saturation,Ks.stringColor.lightness);return nd(r)},ue=(e,t=Tn)=>{let n=rp(e);return n&&t[n]?t[n]:dr(n)};var rd=e=>{let t=Ks.gradient.stops,n=ed(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,s=Math.min(Math.floor(o),r-1),i=o-s;return ip(t[s],t[s+1],i)},no=e=>nd(rd(e)),ro=e=>td(e.toLowerCase().trim())/4294967295,od=e=>{let t=ro(e);return rd(t)},ap=e=>{let[t,n,r]=od(e);return{normal:o=>wn.bgRgb(t,n,r).black(o),cursor:o=>wn.bgRgb(t,n,r).white.bold(o)}},zs=e=>{let[t,n,r]=od(e);return{fg:o=>wn.rgb(t,n,r)(o),fgCursor:o=>wn.rgb(t,n,r).inverse(o),bg:o=>wn.bgRgb(t,n,r).black(o),bgCursor:o=>wn.bgRgb(t,n,r).white.bold(o)}},oo=e=>ap(e).normal(` ${e} `);var Mn=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"},so=e=>String(e).padStart(2,"0"),io=e=>`${e.getFullYear()}-${so(e.getMonth()+1)}-${so(e.getDate())} ${so(e.getHours())}:${so(e.getMinutes())}`;var cp=(e,t)=>e+" ".repeat(Math.max(0,t-sd(e))),lp=(e,t)=>" ".repeat(Math.max(0,t-sd(e)))+e,id=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"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),up=(e,t)=>t?e<t?"up":e>t?"down":null:null,mp=(e,t)=>{let n=E.getNode(e.payload.parent),r=n?Ht.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=up(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},ad=e=>`${Math.max(1,Math.round(e/1024))} KB`,dd=e=>E.getAttachment(e)?.name??"",pp=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?Ht.bgHex(ue(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?Ht.bgHex(ue(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?Ht.hex(ue(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?Ht.hex(ue(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;case"add.issue.attachment":return`"${e.payload.name}" ${Ht.dim(`(${ad(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=dd(e.payload.id);return t?`"${t}"`:""}default:return""}},fp=e=>{let t=Mn(dp(e));return Ht.gray(lp(t,8))},gp=12,vp=e=>cp(`${e}`,gp),yp=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?t.name:""}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return"name"in e.payload?`"${e.payload.name}"`:"";case"move.node":{let t=E.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${ad(e.payload.bytes)})`;case"delete.issue.attachment":{let t=dd(e.payload.id);return t?`"${t}"`:""}default:return""}},cd=e=>[id(e.action),yp(e)].filter(Boolean).join(" "),ld=(e,t)=>{let n=fp(e.id),r=vp(e.userName),o=Ht.dim("\u203A"),s=e.action==="move.node"?mp(e,t):[id(e.action),pp(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};import{createHash as hp}from"node:crypto";var xp="0123456789ABCDEFGHJKMNPQRSTVWXYZ",bp=e=>{let t=hp("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+=xp[Number(n>>s&31n)]}return r},Ie=(e,t)=>bp(`${e}:virtual:${t}`);var Ip=e=>Ie(e,"comments"),Ep=e=>Ie(e,"description"),Sp=e=>Ie(e,"assignees"),Cp=e=>Ie(e,"tags"),Np=e=>Ie(e,"history"),Rp=e=>Ie(e,"attachments"),ao=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=E.getNode(e);if(!c){let p=E.createNode({...ee.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:i});return d(p)?p:u("Virtual field created",void 0)}if(!Ve(c))return a(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==r||c.props.value!==o||c.readonly!==s||c.childRenderAxis!==i))return u("Virtual field unchanged",void 0);let m=E.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:i});return d(m)?m:u("Virtual field updated",void 0)},ud=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let i=E.getNode(e);if(!i){let m=E.createNode({...ee.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(!ir(i))return a(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==r||i.readonly!==o||i.childRenderAxis!==s))return u("Virtual field list unchanged",void 0);let l=E.updateNode({...i,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return d(l)?l:u("Virtual field list updated",void 0)},md=e=>{let t=Ge(ot/4n),n=Ge(ot/2n),r=Ge(ot*3n/4n),o=Ge(ot*7n/8n),s=Ge(ot*15n/16n),i=Ge(ot*13n/16n);if(d(t))return t;if(d(n))return n;if(d(r))return r;if(d(o))return o;if(d(s))return s;if(d(i))return i;let c=ao({id:Ep(e.id),name:Z.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(c))return c;let l=ud({id:Sp(e.id),name:Z.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(l))return l;let m=ud({id:Cp(e.id),name:Z.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(d(m))return m;let p=ao({id:Ip(e.id),name:Z.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(p))return p;let f=ao({id:Rp(e.id),name:Z.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(d(f))return f;let g=ao({id:Np(e.id),name:Z.HISTORY,parentNodeId:e.id,rank:i.value,value:Ap(e),readonly:!0,childRenderAxis:"vertical"});return d(g)?g:u("Ticket virtual nodes materialized",void 0)},Ap=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=>ld(r,n.get(r.action)??[])).join(`
42
+ `)};var Tp=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ve,co]=Tp;var L=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),pd=e=>{let t=E.getNode(e);if(!t||!T(t)||t.isDeleted)return null;let n=md(t);return d(n)?n:null},wp=e=>{for(let t of e){let n=pd(t);if(n)return n;let r=v().nodes[t]?.parentNodeId;if(!r)continue;let o=pd(r);if(o)return o}return null},Mp=(e,t)=>{let n=E.getNode(e);n&&E.updateNode({...n,log:[...n.log??[],t]})},Pp=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},qs=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 Pp(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"create.contributor":case"link.contributor.user":default:return[]}},Lp=e=>{pe(t=>({...t,eventLog:[...t.eventLog,e]}))},kp=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?L("Invalid user ID format",e):u("Valid user",null)},Dp=(e,t)=>{let n=kp(e);if(d(n))return n;let r=[...new Set(qs(e))];t||(r.forEach(s=>Mp(s,e)),Lp(e));let o=wp(r);return o||null},Bp={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=ee.workspace(t,n,r),s=cr(o);if(d(s))return L(s.message,e);let i=E.createNode(o);return d(i)?L(i.message??"Failed to initialize workspace",e):js(i.value)?u("Workspace initialized",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=E.createNode(ee.workspace(t,n,r));return d(o)?L(o.message??"Failed to add workspace",e):js(o.value)?u("Added workspace",{action:e.action,result:o.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=E.createNode(ee.board(t,n,r,o));return d(s)?L(s.message??"Unable to create board",e):Zr(s.value)?u("Added board",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=E.createNode(ee.swimlane(t,n,r,o));return d(s)?L(s.message??"Unable to create swimlane",e):_t(s.value)?u("Added swimlane",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=E.createNode(ee.ticket(t,n,r,o));return d(s)?L(s.message??"Unable to create issue",e):T(s.value)?u("Added issue",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,i=E.createNode(ee.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(Z.DESCRIPTION)?"vertical":"horizontal"}));return d(i)?L(i.message??`Unable to create field: ${n}`,e):Ve(i.value)?u("Added field",{action:e.action,result:i.value}):a("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!E.getNode(t))return L(`Unable to locate node with id ${t}`,e);let o=E.renameNode(t,n);return d(o)?L(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=E.tombstoneNode(t);return d(n)?L(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=E.createTag({id:t,name:n});return d(r)?L(r.message??"Unable to create tag",e):u("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=E.createContributor({id:t,name:n});return d(r)?L(r.message??"Unable to create contributor",e):u("Contributor created",{action:e.action,result:r.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=E.tombstoneContributor(t);return d(n)?L(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=E.restoreContributor(t,n);return d(r)?L(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=E.tag(t,n);return d(r)?L(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=E.untag(t,n);return d(r)?L(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=E.assign(t,n);return d(r)?L(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=E.unassign(t,n);return d(r)?L(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=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?L(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=E.editValue(t,n);return d(r)?L(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=E.getNode(t);if(!o)return L("Unable to locate issue",e);if(!T(o))return L("Can only close issues",e);let s=E.getNode(ve);if(!s)return L("Unable to locate target swimlane",e);if(n!==s.id)return L("Close target must be closed swimlane",e);let i=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(i)?L(i.message??"Unable to close issue",e):u("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return L("Unable to locate issue",e);if(!T(o))return L("Can only reopen issues",e);let s=E.getNode(ve);if(!s)return L("Unable to locate closed swimlane",e);if(n===s.id)return L("Cannot reopen issue into closed swimlane",e);if(!E.getNode(n))return L("Reopen parent no longer exists",e);let c=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?L(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=E.lockNode(t);return d(n)?L(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=E.getNode(r);if(!s)return L(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return L(`Node ${r} is not child of ${t}`,e);let i=E.updateNode({...s,rank:o});if(d(i))return L(i.message??"Unable to rebalance child",e)}return u("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:r,md:o}=e.payload,s=E.createComment({id:t,issue:n,authorId:r,authorName:E.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return d(s)?L(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=E.getComment(t);if(!o)return L("Unable to locate comment",e);if(o.issue!==n)return L("Comment does not belong to issue",e);let s=E.editComment(t,r);return d(s)?L(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=E.getComment(t);if(!r)return L("Unable to locate comment",e);if(r.issue!==n)return L("Comment does not belong to issue",e);let o=E.deleteComment(t);return d(o)?L(o.message??"Unable to delete comment",e):u("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"add.issue.attachment":e=>{let{id:t,issue:n,hash:r,ext:o,name:s,bytes:i}=e.payload,c=E.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:i,deleted:!1});return d(c)?L(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=E.getAttachment(t);if(!r)return L("Unable to locate attachment",e);if(r.issue!==n)return L("Attachment does not belong to issue",e);let o=E.deleteAttachment(t);return d(o)?L(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=E.linkUserId({contributorId:t,userId:e.userId});return d(n)?L(n.message??"Unable to link contributor",e):u("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function jt(e,t=!1){let n=Bp[e.action];if(!n)return a(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);let r=n(e);if(d(r))return r;let o=Dp(e,t);return o||r}var st=e=>e.map(t=>jt(t));import Xp from"node:fs";import Jp from"node:path";import{decodeTime as Qp,monotonicFactory as Zp}from"ulid";import{z as ur}from"zod";var lr=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown";import lo from"node:fs";import Xs from"node:path";import{decodeTime as Op}from"ulid";import{z as Ys}from"zod";var Fp=["init.workspace","add.workspace","add.board","add.swimlane","add.issue","add.field","edit.title","delete.node","create.tag","create.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 Up=new Set(Fp),fd=e=>Up.has(e),gd=e=>({action:e.action,payload:e.payload});var _p=Ys.object({userId:Ys.string().min(1).default("unknown"),userName:Ys.string().min(1).default("unknown")}),$p=/^[0-9a-hjkmnp-tv-z]{26}$/i,Hp=e=>$p.test(e)?e.toUpperCase():e,jp=e=>{let t=Xs.basename(e,".jsonl"),n=t.indexOf("."),r=n===-1?t:t.slice(0,n),o=n===-1?void 0:t.slice(n+1),s=_p.safeParse({userId:Hp(r),userName:o});return s.success?u("Parsed event file actor",s.data):a(`Invalid event file name ${Xs.basename(e)}: ${s.error.issues.map(i=>i.path.join(".")||i.message).join(", ")}`)},Wp=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?a(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?a("Invalid persisted event: action key is missing or invalid"):u("Resolved persisted action",t[0])},Vp=(e,t)=>t in e,Gp=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Kp=e=>{let{userId:t,userName:n,...r}=e,o=Wp(r);if(d(o))return a(o.message);let s=o.value,i=e.id?.[0];return i?Vp(r,s)?u("Decoded persisted event",Gp({id:i,action:s,payload:r[s],userId:t,userName:n})):a(`Persisted event is missing payload for action: ${s}`):a("Persisted event is missing id")},Js=e=>{let t=[],n=new Map;for(let r of e){let o=Kp(r);if(d(o))return a(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);let s=o.value.action;if(!fd(s)){n.set(s,(n.get(s)??0)+1);continue}t.push(o.value)}if(n.size>0){let r=[...n.entries()].map(([o,s])=>`${o} (x${s})`).join(", ");se.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${r}. Upgrade to apply them.`)}return u("Decoded reconstructed events",t)},zp=e=>{if(!lo.existsSync(e))return u("Event file missing",[]);let t=jp(e);if(d(t))return a(t.message);let n=lo.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
43
+ `)){let s=o.trim();if(!s)continue;let i;try{i=JSON.parse(s)}catch{return a(`Failed to parse event JSON from ${e}: ${s}`)}let c=Zs(i);if(d(c))return a(`${c.message} in ${e}: ${s}`);r.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return u("Parsed persisted events file",r)};function Qs(e){let t=tr(e);if(!lo.existsSync(t))return u("No events found",[]);let n=lo.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Xs.join(t,o)),r=[];for(let o of n){let s=zp(o);if(d(s))return a(s.message);r.push(...s.value)}return u("All events loaded",qp(r))}function je(e){let t=Qs(e);return d(t)?a(t.message):Js(t.value)}function uo(e,t){let n=Qs(e);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=Yp(n.value,t),s=Js(r);if(d(s))return a(s.message);let i=Js(o);return d(i)?a(i.message):u("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:i.value})}function vd(e=process.cwd()){let t=Qs(e);return d(t)?a(t.message):u("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var qp=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((p,f)=>p.id[0].localeCompare(f.id[0]));let r=[],o=new Set,s=m=>{let p=m.id[0];if(o.has(p))return;r.push(m),o.add(p);let f=n.get(p)??[];for(let g of f)s(g)},i=n.get(null)??[];for(let m of i)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((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of c)s(m);let l=e.filter(m=>!o.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of l)s(m);return r},Yp=(e,t)=>{let n=new Set,r=[],o=[];for(let s of e){let i=s.id[0],c=s.id[1],l=!1;try{l=Op(i)<t}catch{l=!1}!l||c&&n.has(c)?(n.add(i),o.push(s)):r.push(s)}return{appliedEvents:r,unappliedEvents:o}};var hd=1,yd=Zp(),ef=ur.tuple([ur.string().min(1),ur.string().min(1).nullable()]),tf=ur.looseObject({v:ur.literal(hd),id:ef}),Zs=e=>{let t=tf.safeParse(e);return t.success?u("Parsed persisted event",t.data):a(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},nf=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),rf=e=>e.trim().length>0&&e.length<=80,ie=()=>{let{userName:e,userId:t}=K();return e?t?nf(t)?rf(e)?u("Successfully resolved actor ID",{userId:t,userName:e}):a("Invalid user name in config"):a("Invalid user ID in config"):a("User ID not configured"):a("User name not configured")},un=({userId:e,userName:t})=>`${lr(e)}.${lr(t)}.jsonl`,of=(e,{userId:t,userName:n})=>{let r=un({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return a(`Invalid event log file name: ${r}`);let s=Jp.join(tr(e),r);return u("Successfully resolved event log path",s)},sf=(e,t)=>{let n={[e.action]:e.payload,v:hd,id:t};return Zs(n)};function mo({event:e,rootDir:t}){try{let n=Ca(t);if(d(n))return n;let r=of(t,{userId:e.userId,userName:e.userName});if(d(r))return r;let o=vd(t);if(d(o))return a(o.message);let s=o.value?yd(Math.max(Date.now(),Qp(o.value)+1)):yd(),i=sf(gd(e),[s,o.value]);return d(i)?a(i.message):(Xp.appendFileSync(r.value,`${JSON.stringify(i.value)}
44
+ `,"utf8"),u("Event persisted",{path:r.value,entry:i.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return a(`Failed to persist event: ${r}`)}}function xd(e,t){let n=jt(e);if(n.status!==Bt.Success)return n;let r=mo({event:e,rootDir:t});return d(r)?r:n}function U(e,t){if(e.length===0||!e[0])return a("No events provided");let n=df(e[0],t);if(d(n))return n;let r=e.map(s=>xd(s,t)),o=r.filter(d);return o.length>0?a("Materialize and persist failed: "+o.map(s=>s.message).join(", ")):u("Materialization succeeded",r.map(s=>s.value))}var df=(e,t)=>{if(e.action==="create.contributor")return u("Contributor already being created",void 0);if(E.getContributor(e.userId))return u("Contributor exists",void 0);let n={id:af(),action:"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName},r=xd(n,t);return d(r)?a(r.message):u("Contributor created",void 0)};var bd=e=>po(Y(e),{at:"end"}),po=(e,t={at:"end"})=>{let n=r=>d(r)?u("Rank space exhausted",{rank:"",needsRebalance:!0}):u("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n($e(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n($e(void 0,r.rank)):a("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n($e(r.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let r=Id(e,t.sibling);if(r<0)return a("Sibling not found");let o=r>0?e[r-1]:void 0,s=e[r];return s?n($e(o?.rank,s.rank)):a("Sibling not found")}case"after":{let r=Id(e,t.sibling);if(r<0)return a("Sibling not found");let o=e[r],s=r<e.length-1?e[r+1]:void 0;return o?n($e(o.rank,s?.rank)):a("Sibling not found")}}},Y=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Id=(e,t)=>e.findIndex(n=>n.id===t),Ed=(e,t,n={at:"end"})=>po(Y(t).filter(r=>r.id!==e),n),mn=(e,t,n,r,o)=>{let s=Ed(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return u("Resolved rank",s.value.rank);let i=Ws(e,r);if(d(i))return i;let c=U([i.value],o);if(d(c))return c;let l=Ed(t,e,n);return d(l)?l:l.value.needsRebalance?a("Rank rebalance failed to create space"):u("Resolved rank after rebalance",l.value.rank)},Pn=(e,t,n)=>{let r=bd(e);if(d(r))return r;if(!r.value.needsRebalance)return u("Resolved rank",r.value.rank);let o=Ws(e,t);if(d(o))return o;let s=U([o.value],n);if(d(s))return s;let i=bd(e);return d(i)?i:i.value.needsRebalance?a("Rank rebalance failed to create space"):u("Resolved rank after rebalance",i.value.rank)};var M={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=z(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||M.navigate({contextNode:o,selectedIndex:z(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=v();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=z(n.id),o=r.findIndex(({id:i})=>i===e.id),s=r.length===0?-1:o>=0?o:0;M.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Sd(1),navigateToPreviousItem:()=>Sd(-1),navigateToNextContainer:()=>Cd(1),navigateToPreviousContainer:()=>Cd(-1),navigate:({contextNode:e,selectedIndex:t})=>{C({contextNodeId:e.id,selectedIndex:t})}},Sd=e=>{let{selectedIndex:t,contextNode:n}=v(),r=z(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;M.navigate({selectedIndex:s,contextNode:n})},Cd=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=z(o.id),i=s.findIndex(g=>g.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let l=z(c.id),m=Math.max(0,l.length-1),p=Math.min(Math.max(0,r),m),f=l.length?p:-1;M.navigate({contextNode:c,selectedIndex:f})};var Rd=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Ad=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},cf=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&Ve(t)&&t.childRenderAxis==="vertical"},fo=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=Y(r.id);return M.navigate({contextNode:r,selectedIndex:Rd(t,o.length)}),!0},Td=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return fo(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let i=Y(o.id).findIndex(c=>c.id===n.id);return i>=0?(M.navigate({contextNode:o,selectedIndex:i}),!0):Td(o.id)},Nd=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Td(n))return!0;n=t[n]?.parentNodeId}return!1},lf=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},wd=e=>{let{nodes:t,rootNodeId:n}=v();if(cf(e.contextNodeId)&&fo(e.contextNodeId,e.selectedIndex))return u("Restored navigation inside text container",null);if(lf(e.selectedNodeId)&&e.selectedNodeId&&Nd(e.selectedNodeId))return u("Restored navigation to selected node or ancestor",null);if(fo(e.contextNodeId,e.selectedIndex))return u("Restored navigation to previous container",null);if(e.parentNodeId&&fo(e.parentNodeId,e.selectedIndex))return u("Restored navigation to previous parent",null);if(Nd(e.contextNodeId))return u("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return a("Unable to restore navigation");let o=Y(r.id);return M.navigate({contextNode:r,selectedIndex:Rd(e.selectedIndex,o.length)}),u("Restored navigation to root",null)};import{monotonicFactory as uf,ulid as Tt}from"ulid";var mr=uf();function mf(){let e=We();if(d(e))return a("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[r]=z(n.id),[o]=r?z(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}):n?u("Resolved boot nav target",{contextNode:n,selectedIndex:0}):u("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function pf(){let e=mf();return d(e)?e:M.navigate(e.value)}function Md({userId:e,userName:t}){let n=mr(),r=mr(),o=mr(),s=mr(),i=mr(),c=$e(void 0,void 0);if(d(c))return c;let l=$e(void 0,void 0);if(d(l))return l;let m=$e(l.value,void 0);if(d(m))return m;let p=$e(void 0,void 0);if(d(p))return p;let f=$e(p.value,void 0);if(d(f))return f;let g=$e(f.value,void 0);if(d(g))return g;let I=$e(void 0,void 0);return d(I)?I:u("Created default events",[{id:Tt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:Tt(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:l.value}},{id:Tt(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Tt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:Tt(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"Done",parent:r,rank:g.value}},{id:Tt(),userId:e,userName:t,action:"add.board",payload:{id:co,name:"Closed",parent:n,rank:m.value}},{id:Tt(),userId:e,userName:t,action:"add.swimlane",payload:{id:ve,name:"Closed",parent:co,rank:I.value}},{id:Tt(),userId:e,userName:t,action:"lock.node",payload:{id:co}},{id:Tt(),userId:e,userName:t,action:"lock.node",payload:{id:ve}}])}var ff=()=>{let e=We();if(d(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"};function pn(e){if(ff())return u("Skipped boot while checked out at a historical point",null);if(!e.length){let r=ee.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=cr(r);return d(o)?o:(C({hasProjectDefinition:!1,mode:y.DEFAULT}),u("Booted uninitialized workspace placeholder",null))}if(!e.some(r=>r.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=st(e).filter(d);return n.length>0?a(`Materializing failed:
44
45
  ${n.map(r=>r.message).join(`
45
- `)}`):(ap(),E({hasProjectDefinition:!0}),l("State booted successfully",null))}var dn=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),oo=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)}},X=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);var ut=null,so=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!ut,currentStatus:g().syncStatus?.status,currentMessage:g().syncStatus?.msg}),ut)return logger.debug("[sync] syncAndReloadState joining existing promise"),ut;logger.debug("[sync] syncAndReloadState creating promise"),ut=dp();try{let e=await ut;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!d(e),message:(d(e),e.message),statusAfterResolve:g().syncStatus?.status,statusMessageAfterResolve:g().syncStatus?.msg}),d(e)&&g().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),E({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}),ut||a(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:g().syncStatus?.status,statusMessageBeforeClear:g().syncStatus?.msg}),ut=null}},dp=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:g().mode,syncStatus:g().syncStatus});let e=rd();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:g().mode,message:e.message,syncStatus:g().syncStatus}),e;if(ut)return ut;logger.debug("[sync] syncAndReloadState:start");let t=X("resolveActorId",ie());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),a("Unable to resolve event log path");E({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:g().syncStatus});let n=on(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=X("syncEpiqWithRemote",await io({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),E({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:g().syncStatus}),Qe(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let s=X("loadMergedEvents",Et(o));if(logger.debug("[sync] loadMergedEvents:result",{success:!d(s),message:(d(s),s.message),count:d(s)?void 0:s.value.length}),d(s))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:g().syncStatus}),a(`Unable to load events. ${s.message}`);logger.debug("[sync] loaded merged events after sync",{count:s.value.length});let i=rd();if(i)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:g().mode,message:i.message,syncStatus:g().syncStatus}),i;let c=Za(),u=g().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:c,selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id,selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual}),!g().selectedNode?.isVirtual&&!g().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:s.value.length});let p=X("bootStateFromEventLog",an(s.value));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(p),message:(d(p),p.message)}),d(p))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:g().syncStatus}),a(`Unable to boot synced state. ${p.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),E({filters:u}),logger.debug("[sync] restoreNavigationAnchor:start");let m=X("restoreNavigationAnchor",td(c));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(m),message:d(m)?m.message:"Navigation restored",selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id}),d(m)?(E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:g().syncStatus}),m):(E({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:g().syncStatus}),l("Synced",!0))},rd=()=>g().mode===v.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:g().mode,syncStatus:g().syncStatus}),E({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var An=3e3,od=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<An?null:t},sd=0,Bs,Us=!1,ir=!1,Os=()=>{if(Us)return!0;let e=Je();return d(e)?!1:e.value.syncStatus.status==="syncing"},cp=()=>{let e=K().autoSyncIntervalMs??1e4,t=Date.now()-sd;return Math.max(0,e-t)},id=()=>{Bs||(Bs=setTimeout(async()=>{if(Bs=void 0,!!Rn()){if(Os()){ir=!0;return}ir=!1,await lp()}},cp()))},lp=async()=>{if(g().readOnly||g().timeMode==="peek"||g().timeMode==="replay")return a("Cannot auto-sync while peeking");if(!Rn())return a("Cannot auto-sync before state is initialized");if(Os())return ir=!0,a("Sync already in progress");Us=!0,sd=Date.now(),E({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await so()}finally{Us=!1,ir&&id()}},ao=()=>{Rn()&&(ir=!0,!Os()&&id())};var _t=()=>{let e=K(),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}},ad=()=>{let e=qe(process.cwd());if(d(e))return!1;let t=Lt(e.value);return ne(t)},dd=e=>e===!0?"on":e===!1?"off":null,cd=e=>e==="on"?!0:e==="off"?!1:null;var up=e=>e.props.tags??[],mp=e=>e.props.assignees??[],$t=e=>up(e).map(t=>I.getTag(t)).filter(t=>!!t),Ht=e=>mp(e).map(t=>I.getContributor(t)).filter(t=>!!t),co=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!R(n)?a("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",$t(n))},lo=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!R(n)?a("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",Ht(n))};var x={PALETTE:"?",EXIT:"exit",INIT:"init",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 pp=/^(\d+)(h|d|w|mo|y)$/,fp=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,gp=({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},vp=(e,t=new Date)=>{let n=e.match(pp);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let i=new Date(t);switch(o){case"h":return i.setHours(i.getHours()-s),i;case"d":return i.setDate(i.getDate()-s),i;case"w":return i.setDate(i.getDate()-s*7),i;case"mo":return i.setMonth(i.getMonth()-s),i;case"y":return i.setFullYear(i.getFullYear()-s),i;default:return null}},yp=e=>{let t=e.match(fp);if(!t)return null;let[,n,r,o,s,i]=t,c=Number(n),u=Number(r),m=Number(o),p=s?Number(s):0,f=i?Number(i):0;return gp({year:c,month:u,day:m,hour:p,minute:f})?new Date(c,u-1,m,p,f):null},cn=e=>{let t=e.trim().toLowerCase();return vp(t)??yp(t)};var ld=/^(\d+)(s|m)?$/,uo=e=>{let t=e.trim().toLowerCase().match(ld);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},mo=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&ld.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},ud=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,hp=[{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}],_s=(e=hp)=>{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 xp=["BOARD","TICKET","SWIMLANE","COMMENT"],re={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},He={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},fe={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},bp=[re.EDITOR,re.VIEW,re.USERNAME,re.AUTOSYNC,re.SYNC_DEBOUNCE_MS,re.ATTACHMENT_MAX_KB,re.LOG_LEVEL],Ip=(e=g().selectedNode?.context)=>{switch(e){case"TICKET":return[He.TITLE,He.DESCRIPTION];case"BOARD":case"SWIMLANE":return[He.TITLE];case"COMMENT":return[He.COMMENT];default:return[]}},Hs=[String(An),"5000","15000","30000","60000"],Ws=["250","500","1000"],fd=["10s","20s","30s","45s"],ln=[x.COFFEE,x.EXIT,x.SYNC,x.HELP,x.EXPORT,x.CONFIG,x.YANK],po=[x.NEW,x.EDIT,x.DELETE,x.MOVE],$s=[x.TAG,x.UNTAG,x.ASSIGN,x.UNASSIGN,x.CLOSE_ISSUE,x.RE_OPEN_ISSUE,x.EDIT,x.COMMENT],md=[x.FILTER,x.PEEK,x.REPLAY],Ep={WORKSPACE:[...ln,...po],BOARD:[...md,...ln,...po],SWIMLANE:[...md,...ln,...po],TICKET:[...ln,...po,...$s],FIELD:[...ln,...$s],FIELD_LIST:[...ln,...$s],TEXT:[...ln],COMMENT:[x.EDIT,x.DELETE,x.YANK]},Sp=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],ar=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&R(n)),pd=e=>e.parentNodeId===pe,Cp=({selectedNode:e,breadCrumb:t})=>{let n=Ip(e?.context);return ar({breadCrumb:t,selectedNode:e})?n.includes(He.DESCRIPTION)?n:[...n,He.DESCRIPTION]:n},Np=({selectedNode:e,breadCrumb:t})=>{let n=ar({breadCrumb:t,selectedNode:e});return n?[fe.REF,fe.TITLE,...n.props?.description?.trim()?[fe.DESCRIPTION]:[],...$t(n).length>0?[fe.TAGS]:[],...Ht(n).length>0?[fe.ASSIGNEES]:[]]:e?[fe.REF,fe.TITLE]:[]},Ap=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=_t();if(!r)return[x.HELP,x.CONFIG];if(!ad())return[x.HELP,x.INIT];if(t)return[x.HELP,x.PEEK,x.REPLAY,x.EXPORT,x.CONFIG,x.YANK];let o=e?.context,s=o&&xp.includes(o),i=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?Ep[u]:[]))],c=ar({breadCrumb:n,selectedNode:e});return i.filter(u=>u===x.MOVE?!1:u===x.YANK?!!(c??e):u===x.EDIT?s||!!c:u===x.DELETE?s:u===x.UNTAG?!!(c&&$t(c).length>0):u===x.UNASSIGN?!!(c&&Ht(c).length>0):u===x.RE_OPEN_ISSUE?!!(c&&pd(c)):u===x.CLOSE_ISSUE?!!(c&&!pd(c)):!0)},ae=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=g())=>{let s=t.context??"WORKSPACE";return{[x.NONE]:Ap({breadCrumb:o,readOnly:r,selectedNode:n}),[x.EXIT]:["confirm"],[x.EXPORT]:[],[x.SYNC]:[],[x.INIT]:[],[x.HELP]:[],[x.PEEK]:[..._s(),"now","prev","next"],[x.REPLAY]:[..._s()],[x.EDIT]:Cp({selectedNode:n,breadCrumb:o}),[x.YANK]:Np({selectedNode:n,breadCrumb:o}),[x.COMMENT]:[],[x.DELETE]:["confirm"],[x.RE_OPEN_ISSUE]:["confirm"],[x.CLOSE_ISSUE]:["confirm"],[x.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[x.FILTER]:["tag","assignee","description","title","ref","clear"],[x.TAG]:[...new Set([...Object.keys(In),...I.getExistingTags()])],[x.UNTAG]:[...co()?.value?.map(({name:c})=>c)??[]],[x.UNASSIGN]:[...lo()?.value?.map(({name:c})=>c)??[]],[x.ASSIGN]:I.getExistingAssignees(),[x.NEW]:Sp(s),[x.CONFIG]:[...bp],[x.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import Ld from"chalk";var gd=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Le=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?l("Found node",n):a("Unable to find node in breadcrumb")},vd=["png","jpg","gif","webp"];import Wp from"zod";import Dp from"node:path";import{z as Ct}from"zod";import{accessSync as Rp,copyFileSync as Tp,existsSync as fo,mkdirSync as yd,readdirSync as hd,readFileSync as wp,renameSync as Mp,rmSync as Pp,statSync as xd,unlinkSync as Lp,writeFileSync as kp}from"node:fs";import Tn from"node:path";var js=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",We={writeToFile:(e,t)=>{try{let n=Tn.dirname(e);fo(n)||yd(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);kp(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return wp(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=We.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 fo(e)&&xd(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Rp(e),!0}catch{return!1}},mkDir:e=>yd(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Tn.parse(t);for(;;){let r=Tn.join(t,e);try{if(fo(r)&&xd(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Tn.dirname(t)}return null},readFirstJSON(e){try{if(!We.dirExists(e))return null;let t=hd(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Tn.join(e,t);return We.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return We.dirExists(e)?hd(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Lp(e)}catch(t){(!js(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Pp(e,{recursive:!0,force:!0})}catch(t){(!js(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Tn.dirname(t)),!n?.overwrite&&fo(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Mp(e,t)}catch(r){if(js(r)&&r.code==="EXDEV"){Tp(e,t),this.rmFile(e);return}throw r}}};var Fp={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},bd=Ct.object({logLevel:Ct.enum(["info","error","debug"]),preferredEditor:Ct.string().optional(),userName:Ct.string().optional(),userId:Ct.string().optional(),autoSync:Ct.boolean().nullable().optional(),autoSyncDebounceMs:Ct.number().optional(),attachmentMaxKb:Ct.number().optional(),viewMode:Ct.enum(["dense","wide"]).optional()}).partial(),Bp="config.json",Id=Wn,Vs=()=>Dp.join(Id(),Bp),Ks=()=>{try{return We.mkDir(Id()),l(`Ensured ~/${nt} exists`,null)}catch{return a(`Unable to create ~/${nt}`)}},Up=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${nt}/config.json JSON`)}let n=bd.safeParse(t??{});return n.success?l("Parsed config",n.data):a(`Invalid ~/${nt}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},dr=()=>{let e=Ks();if(d(e))return a(e.message);let t=Vs(),n=We.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Up(n)},Ed=e=>{let t=Ks();if(d(t))return a(t.message);let n=bd.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Vs();try{return We.writeToFile(r,JSON.stringify(n.data,null,2)+`
46
- `),l("Config written",null)}catch{return a(`Unable to write ~/${nt}/config.json`)}},Ze=e=>{let t=dr();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return Ed(n)},wn=()=>{let e=Vs(),t=Ks();if(d(t))return a(`Unable to create ~/${nt}`);if(!(We.readFile(e)!==null)){let b=Ed(Fp);if(d(b))throw new Error(`Unable to create ~/${nt}/config.json`)}let r=dr();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:i,autoSync:c,autoSyncDebounceMs:u,attachmentMaxKb:m,logLevel:p,viewMode:f}=r.value;return!s||!i?a(`User name or ID not configured in ~/${nt}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,l("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:s,userId:i,autoSync:c??!1,autoSyncIntervalMs:u??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))};import Op from"node:crypto";import cr from"node:fs";import Sd from"node:path";var mt=500,_p=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,Mn=(e,t)=>`${e}.${t}`,$p=e=>_p.test(e),Cd=e=>e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?l("Sniffed image type","png"):e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?l("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")))?l("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"))?l("Sniffed image type","webp"):a(`Unsupported image format. Allowed: ${vd.join(", ")}`),Nd=e=>Op.createHash("sha256").update(e).digest("hex"),Hp=(e,t=mt)=>{if(e.length===0)return a("Attachment is empty");if(e.length>t*1024)return a(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=Cd(e);return d(n)?n:l("Validated attachment data",{hash:Nd(e),ext:n.value,bytes:e.length})},Ad=(e,t,n=mt)=>{let r=Hp(t,n);if(d(r))return r;let o=Gn(e),s=Sd.join(o,Mn(r.value.hash,r.value.ext));try{cr.existsSync(s)||(cr.mkdirSync(o,{recursive:!0}),cr.writeFileSync(s,t))}catch(i){return a(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return l("Wrote attachment blob",r.value)},Rd=(e,t,n=mt)=>{if(!$p(t))return a("Invalid attachment file name");let r=Sd.join(Gn(e),t);if(!cr.existsSync(r))return a("Attachment blob not found");let o;try{o=cr.readFileSync(r)}catch(u){return a(`Unable to read attachment blob: ${u instanceof Error?u.message:String(u)}`)}if(o.length>n*1024)return a(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(Nd(o)!==s)return a("Attachment blob does not match its content hash");let c=Cd(o);return d(c)?c:c.value!==i?a("Attachment blob content does not match its extension"):l("Resolved attachment blob",{filePath:r,ext:i,bytes:o.length})};var lr=50,ur=5e3,Td=()=>{let e=Y().commandMeta.inputString,t=Wp.coerce.number().int().min(lr).max(ur).safeParse(e);if(!t.success)return a(`Attachment size cap must be ${lr}-${ur} KB (default ${mt})`);let n=Ze({attachmentMaxKb:t.data});return d(n)?n:(Fe({attachmentMaxKb:t.data}),E({mode:v.DEFAULT}),l(`Attachment size cap set to ${t.data} KB`,null))};import wd from"chalk";var ee=e=>wd.dim(e),be=e=>wd.hex(y.primary)(e),Ie=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let i=o.trim();if(i.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(i))].sort((f,b)=>qr(f)-qr(b)).slice(0,r).map(f=>Yr(f)).join(" ");return p?`${ee(e)}${p}${ee(n)}`:""};var pt={None:"none",Invalid:"invalid",Valid:"valid"};var Pn=140,jp=["BOARD","TICKET","SWIMLANE"],Md=()=>{let e=g().selectedNode;if(!e?.context)return F({message:ee("Missing target context")});if(jp.includes(e.context))return V();if(e.parentNodeId){let t=g().nodes[e.parentNodeId];if(t?.id===xe(t?.parentNodeId??"","comments"))return V()}return F({message:ee("Command not available in this context")})},oe="<ENTER> to confirm",V=(e="",t=[])=>({message:ee(e),validity:pt.Valid,completionWordList:t}),F=({message:e,completionWordList:t=[]})=>({validity:pt.Invalid,message:e,completionWordList:t}),vo=e=>e.length===0,Pd=(e,t)=>{let n=Le(g().breadCrumb,"BOARD");if(d(n))return F({message:be("Command is not applicable in this context")});let r=Jr(n.value.id);return d(r)?F({message:be(`Unable to ${t}: board id is not a valid ULID`)}):ud({date:e,horizonDate:r.value})?null:F({message:be(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},go=e=>` ${Ld.hex("#000").bgHex(ue(e))(` ${e} `)} `,Gs=({modifier:e})=>{let t="confirm";return e===t?V(oe):F({message:vo(e)?ee("if you are certain, enter ")+Yr(t):"",completionWordList:[t]})},Vp=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?F({message:ee(n)}):V():F({message:vo(r)?t:"",completionWordList:[...e]}),un=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>vo(n)&&vo(r)?F({message:e,completionWordList:[]}):V(t??oe),Kp=({modifier:e,inputString:t})=>{let n=ae(x.CONFIG);if(!n.includes(e))return F({message:Ie({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case re.EDITOR:{let r=[...gd];return t.trim()?r.includes(t.trim())?V(oe):F({message:Ie({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):F({message:Ie({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case re.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?V(oe):F({message:Ie({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case re.USERNAME:return t.trim()?V(oe):F({message:be("Enter a user name. Saved in ")+Ld.bgBlack("~/.epiq-global/config.json")});case re.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?V(oe):F({message:Ie({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case re.AUTOSYNC:{let r=["on","off"],o=K().autoSync;if(!r.includes(t.trim())){let s=dd(o);return F({message:Ie({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return V(oe)}case re.ATTACHMENT_MAX_KB:{let r=K().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<lr||o>ur){let s=Ie({prefix:" examples: ",wordList:Ws,minLengthForHints:0,inputString:t});return F({message:be(`provide a size cap in KB (${lr}-${ur}). current: ${r??mt} KB.`)+s,completionWordList:Ws})}return V(oe)}case re.SYNC_DEBOUNCE_MS:{let r=K().autoSyncIntervalMs,o=od(t);if(!t.trim()||o===null||o<An){let s=Ie({prefix:" examples: ",wordList:Hs,minLengthForHints:0,inputString:t});return F({message:be(`provide duration above ${An}ms. current duration: ${r}ms.`)+s,completionWordList:Hs})}return V(oe)}default:return F({message:be("Unknown config option"),completionWordList:n})}},Gp=({modifier:e,inputString:t})=>{let n=ae(x.EDIT);if(!n.length)return F({message:be("Command not available in this context")});if(!n.includes(e)){let r=Ie({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return F({message:r||be("Unknown edit option"),completionWordList:n})}switch(e){case He.COMMENT:return t.trim()?V(oe):F({message:ee("write a comment...")});case He.TITLE:return V(oe);case He.DESCRIPTION:{let{preferredEditor:r}=K();return r?V(ee("<ENTER> to edit in ")+r):F({message:"No editor selected"})}default:return F({message:be("Unknown edit option"),completionWordList:n})}},zp=({modifier:e})=>{let t=ae(x.YANK);return t.length?t.includes(e)?V(oe+ee(" and copy to clipboard")):F({message:Ie({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):F({message:be("Nothing selected to copy from")})},qp={[x.EXPORT]:()=>V(oe+ee(", and create export markdown file")),[x.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return V(oe);let n={message:ee("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=cn(r);if(!r||!o)return F(n);let s=Pd(o,"peek");return s||V(oe)},[x.REPLAY]:e=>{let{dateInput:t,durationInput:n}=mo(e.modifier,e.inputString),r={message:ee("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=cn(t);if(!t||!o)return F(r);let s=Pd(o,"replay");return s||(n&&uo(n)===null?F({message:be("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):V("<ENTER> to replay board history",n?fd:[]))},[x.EXIT]:()=>V(oe+ee(" and exit the application")),[x.INIT]:()=>V(oe),[x.PALETTE]:()=>V(oe),[x.FILTER]:e=>{if(e.modifier==="clear")return V(oe);let t=s=>ae(x.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return F({message:Ie({wordList:ae(x.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ae(x.FILTER)});let n=Object.values(g().tags).map(s=>s.name),r=Object.values(g().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?F({message:Ie({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):V():F({message:Ie({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[x.NONE]:e=>{let t=ae(x.NONE);return F({message:Ie({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[x.NEW]:e=>Vp({list:ae(x.NEW),hint:Ie({wordList:ae(x.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[x.HELP]:()=>V(oe),[x.EDIT]:Gp,[x.COMMENT]:e=>{let t=un({hint:ee(`write a comment (max ${Pn} char)...`),onOk:ee(`(${e.inputString.length}/${Pn})`)})(e);return t.validity===pt.Invalid?t:e.inputString.length>Pn?V(be("max input exceeded")):t},[x.CONFIG]:Kp,[x.YANK]:zp,[x.DELETE]:e=>{let t=Md();return t.validity==="invalid"?t:Gs(e)},[x.CLOSE_ISSUE]:e=>Gs(e),[x.RE_OPEN_ISSUE]:e=>Gs(e),[x.MOVE]:e=>{let t=Md();return t.validity==="invalid"?t:un({hint:Ie({prefix:"hey hacker! These commands are blocked for you... ",wordList:ae(x.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[x.TAG]:e=>{let n=I.getExistingTags().slice(0,10).map(go).join("");return un({hint:n.length?ee("create tag or reuse:")+n+ee(""):ee("create tag ...")})(e)},[x.UNTAG]:e=>{let t=co();if(d(t))return F({message:be("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(go).slice(0,10);return n.length?un({hint:ee(" ... ")+n.join("")})(e):F({message:be("Issue has no tags"),completionWordList:[]})},[x.ASSIGN]:e=>{let t=I.getExistingAssignees().map(go).slice(0,10);return un({hint:ee("assignees... ")+t.join("")})(e)},[x.UNASSIGN]:e=>{let t=lo();if(d(t))return F({message:be("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(go).slice(0,10);return n.length?un({hint:ee("remove assignee... ")+n.join("")})(e):F({message:be("Issue has no assignees"),completionWordList:[]})},[x.SYNC]:()=>V(oe),[x.COFFEE]:e=>{let{modifier:t}=e,n=ae(x.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?F({message:ee("enter an amount ... "),completionWordList:n.filter(r=>r.startsWith(t))}):un({hint:Ie({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},kd=Object.fromEntries(Object.entries(qp).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var yo=["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 Yp=3,Xp=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"]),Jp=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},Qp=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=Yp&&!Xp.has(t)&&!/^\d+$/.test(t)),Zp=e=>{let t=new Map;for(let s of Jp(e))for(let i of Qp(s))t.set(i,(t.get(i)??0)+1);let n=[...t.entries()].sort((s,i)=>i[1]-s[1]||s[0].localeCompare(i[0])).map(([s])=>s),r=new Set(n),o=yo.filter(s=>!r.has(s));return[...n,...o]},Dd=yo,Fd=-1,Bd=()=>{let e=Je();if(d(e))return yo;let t=e.value,n=t.eventLog.length;return n!==Fd&&(Dd=Zp(t),Fd=n),Dd};var Ud=e=>Object.values(x).includes(e),Od=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:c,completionWordList:u}=kd[n].validate(n,r,s),m=n!==x.PEEK&&n!==x.REPLAY,p=o==="command"||o==="modifier"?ae(n):m?Bd():[],{mode:f}=g(),b=f===v.COMMAND_LINE?i??"":"",C=[...u,...p];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:b,autoCompletion:t?ha(e,C):{hint:"",hints:[],remainder:"",overlap:0}}};var _d=e=>{let t=e.trimStart(),n=tf(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=nf(e),c=Ud(r)?r:null,u=c!==null,m=r!=="",p=c?ae(c)??[]:[],f=c&&p.includes(o)?o:"",b="word";n.length===0||n.length===1&&!s?b="command":(n.length===1&&s||n.length===2&&!s)&&(b="modifier");let C=s?"":i,N=ef(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:s,modifier:f,target:b,inputToMatch:C,inputString:N}},ef=(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},tf=e=>e.trim()?e.trim().split(/\s+/):[],nf=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as rf}from"react";var Ln=e=>e===zs||e===":",zs=" ",Ae={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:pt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},qs=new Set,$d=()=>{for(let e of qs)e()},Ys=e=>(qs.add(e),()=>qs.delete(e)),ft=e=>{let n=e(Ae),r=_d(n.value),o=n.cursorPosition===n.value.length;Ae={...n,commandMeta:Od(r,o)},$d()},mr=({message:e,status:t})=>{let n=structuredClone(Ae);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Ae=n,$d(),l(e,null)},Xs=e=>{ft(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Js=e=>{ft(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Ln(n[o-1]);)o--;for(;o>0&&!Ln(n[o-1]);)o--}else{for(;o<n.length&&!Ln(n[o]);)o++;for(;o<n.length&&Ln(n[o]);)o++}return{...t,cursorPosition:o}})},Hd=()=>{ft(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}})},Wd=()=>{ft(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Ln(t[r-1]);)r--;for(;r>0&&!Ln(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},ho=e=>{ft(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),s=e(r,t.commandMeta.autoCompletion),i=s+o,c=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:c,commandIsPending:!1}})},jd=()=>{ft(e=>({...e,commandIsPending:!0}))},W=e=>{ft(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Vd=({addToHistory:e=!0})=>{ft(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},Kd=()=>{ft(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}})},Gd=()=>{ft(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Y=()=>Ae,zd=()=>rf(Ys,Y,Y),qd=()=>{let[e,...t]=Ae.value.split(zs);return t.join(zs).trim()};var h={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 of(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function sf(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function af(e,t,n){let r=g().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 Yd(e,t){let n=Y();if(e.sequence==="?"&&t!==v.PALETTE)return h.InitCommandPalette;if(e.sequence===":"&&t!==v.COMMAND_LINE)return h.InitCommandLine;if(t===v.MOVE)switch(e.name){case"m":case"return":return h.ConfirmMove}if(t===v.COMMAND_LINE)return ua(e,n.value);if(t===v.PALETTE)return ma(e,n.value);let r=of(e)||sf(e);if(r)return df(r,t);if(e.ctrl&&e.name==="c")return h.Exit;switch(e.name){case"r":return h.EditTitle;case"e":return h.EditDescription;case"n":return h.AddItem;case"m":return h.InitMove;case"d":return h.Delete;case"y":return h.Yank;case"return":return h.Confirm;case"space":return h.Confirm;case"v":return K().viewMode==="wide"?h.SetViewDense:h.SetViewWide;case"q":case"escape":return h.Exit;default:return null}}function df(e,t){let n=t===v.MOVE?{prevItem:h.MovePreviousItem,nextItem:h.MoveNextItem,prevContainer:h.MoveToPreviousContainer,nextContainer:h.MoveToNextContainer}:{prevItem:h.NavPreviousItem,nextItem:h.NavNextItem,prevContainer:h.NavToPreviousContainer,nextContainer:h.NavToNextContainer};return af(g().contextNode.childRenderAxis,e,n)}var xo=e=>{let{context:t}=g().contextNode;if(!t)return w.None;switch(e){case x.EXIT:return w.Exit;case x.EXPORT:return w.Export;case x.COFFEE:return w.Coffee;case x.INIT:return w.Init;case x.DELETE:return w.Delete;case x.EDIT:return w.Edit;case x.COMMENT:return w.Comment;case x.HELP:return w.ViewHelp;case x.RE_OPEN_ISSUE:return w.ReopenIssue;case x.CLOSE_ISSUE:return w.CloseIssue;case x.TAG:return w.TagTicket;case x.UNTAG:return w.UntagTicket;case x.ASSIGN:return w.AssignUserToTicket;case x.UNASSIGN:return w.UnassignUserFromTicket;case x.NEW:return w.NewItem;case x.FILTER:return w.Filter;case x.MOVE:return w.Move;case x.PEEK:return w.Peek;case x.REPLAY:return w.Replay;case x.CONFIG:return w.Config;case x.YANK:return w.Yank;case x.SYNC:return w.Sync;default:return w.None}},w={Exit:"exit",Init:"init",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 we}from"ulid";import gc from"node:fs";import Qf from"node:path";import Zf from"react";import{Box as Xf}from"ink";import No from"react";import Cf from"chalk";import{Box as Zs,Text as Nf}from"ink";import gt from"react";import{Text as Xd}from"ink";import Jd,{useEffect as Qd,useState as cf}from"react";var Zd={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},Re=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=H(),r=Zd[n]??Zd.default,[o,s]=cf(0);if(Qd(()=>{s(0)},[r]),Qd(()=>{if(!e)return;let c=setInterval(()=>{s(u=>(u+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return Jd.createElement(Xd,null,t);let i=r[o]??r[0]??t;return Jd.createElement(Xd,{color:y.accent,dimColor:o===1},i)};import{Box as Qs,Text as lf}from"ink";import bo from"react";var et=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let s=Math.max(1,Math.floor(t)),i=Math.max(1,Math.ceil(r)),c=Math.max(1,Math.floor(s/i)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-c),p=o?Math.min(m,Math.max(0,u-c+1)):Math.min(m,Math.floor(u/c)*c),f=p+c,b=e.slice(p,f),C=e.length>c,N=s,A=C?Math.max(1,Math.floor(c/e.length*N)):N,M=Math.max(0,N-A),U=Math.max(1,e.length-c),j=C?Math.floor(p/U*M):0;return bo.createElement(Qs,{flexDirection:"row",height:s,width:"100%"},bo.createElement(Qs,{flexDirection:"column",flexGrow:1,height:s},b),bo.createElement(Qs,{flexDirection:"column",width:1,height:N},Array.from({length:N}).map((D,z)=>bo.createElement(lf,{key:z,color:C&&z>=j&&z<j+A?y.accent:y.secondary},C?"\u2502":" "))))};import{Box as Fn,Text as Eo}from"ink";import tt from"react";import{Text as uf}from"ink";import mf from"react";var pf=e=>e.toLowerCase().trim(),ff=(e,t=In)=>{let n=pf(e);return t[n]?t[n]:nr(n)},Wt=({id:e,isSelected:t})=>{let n=I.getContributor(e);if(n)return mf.createElement(uf,{underline:t,color:ff(n.name)},"@"+n.name)};import{Text as gf}from"ink";import vf from"react";var kn=({id:e,isSelected:t})=>{let n=I.getTag(e);if(n)return vf.createElement(gf,{underline:t,backgroundColor:ue(n.name),color:y.secondary}," "+n.name+" ")};import{useEffect as yf,useState as hf}from"react";var xf=80,ec=1400,Io=new Set,pr=null,bf=e=>(Io.add(e),pr||(pr=setInterval(()=>{for(let t of Io)t()},xf)),()=>{Io.delete(e),Io.size===0&&pr&&(clearInterval(pr),pr=null)}),If=()=>{let e=Date.now()%ec/ec;return e<.5?e*2:(1-e)*2},Dn=e=>{let[,t]=hf(0);return yf(()=>{if(e)return bf(()=>t(n=>n+1))},[e]),zr(If())};var Ef=(e,t)=>{if(e.length<=t)return[e,null];let n=e.lastIndexOf(" ",t),r=n>0?n:t;return[e.slice(0,r),rn(e.slice(r).trim(),t)]},tc=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=Dn(r),s=e-4,[i,c]=Ef(Xe(t.title),s),u=c?null:rn(Xe(t.props.description),s)||null,m=$t(t),p=Ht(t);return tt.createElement(Fn,{borderStyle:"round",height:5,flexDirection:"column",borderDimColor:!n,borderColor:r?o:n?y.accent:y.secondary,justifyContent:"space-between"},tt.createElement(Fn,{paddingLeft:1,flexDirection:"column"},tt.createElement(Eo,{color:y.primary},i),c&&tt.createElement(Eo,{color:y.primary},c),u&&tt.createElement(Eo,{color:y.secondary2,dimColor:!0},u)),tt.createElement(Fn,{flexDirection:"row",justifyContent:"space-between",paddingLeft:1,paddingRight:1},tt.createElement(Fn,{flexDirection:"row"},m.map(f=>tt.createElement(Fn,{paddingRight:1,key:f.id},tt.createElement(kn,{key:f.id,id:f.id}))),p.map(f=>tt.createElement(Fn,{paddingRight:1,key:f.id},tt.createElement(Wt,{key:f.id,id:f.id})))),tt.createElement(Eo,{wrap:"truncate",color:y.secondary2,dimColor:!0},Ue(t.id))))};import{Box as mn,Text as fr}from"ink";import je from"react";var Sf=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,nc=({width:e,ticket:t,isSelected:n,isFlashing:r=!1,index:o,mode:s})=>{let i=Dn(r),c=(t.props.tags??[]).map(D=>I.getTag(D)).filter(D=>!!D),u=(t.props.assignees??[]).map(D=>I.getContributor(D)).filter(D=>!!D),m=1,p=c.length*(1+m),f=u.length*(2+m),b=c.map(D=>je.createElement(mn,{key:D.id,paddingRight:m},je.createElement(fr,{color:ue(D.name)},"\u25A0"))),C=u.map(D=>je.createElement(mn,{key:D.id,paddingRight:m},je.createElement(fr,{color:nr(D.name)},"@"+D.name.at(0)))),N=r?i:n?y.accent:s===v.MOVE?y.secondary:y.primary,A=4,M=I.getCommentsByIssue(t.id),U=M.length?String(M.length).length+2+m:0,j=M.length?je.createElement(mn,{paddingRight:m},je.createElement(fr,{color:y.accent},"[",M.length,"]")):null;return je.createElement(mn,{borderBottom:!0,justifyContent:"space-between"},je.createElement(mn,null,je.createElement(mn,{width:A},n?je.createElement(Re,{isSelected:n}):je.createElement(fr,{color:"gray",dimColor:!0},o+1)),je.createElement(fr,{wrap:"truncate",color:N},Sf(t.title,e-p-f-U-18))),je.createElement(mn,null,b,C,j))};var Af=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:u,replay:m}=H(),p=u[e.id]??[],f=m?new Set(m.flashNodeIds):null,b=f?.has(e.id)??!1,C=Dn(b),N=`${e.title} ${Cf.hex(y.secondary2).dim("("+p.length+")")}`,A=3,M=o?1:5,U=s&&i===-1,j=n-(U?7:5),D=r-A-(o?2:1),z=gt.createElement(Zs,{borderStyle:"round",borderColor:y.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},gt.createElement(Re,{isSelected:t}),gt.createElement(Nf,{bold:!0,color:b?C:t?y.accent:y.primary},N," ",e.readonly?"\u{1F512}":"")),$=(P,O)=>{let Ge=s&&i===O;if(!R(P))return null;let Ce=f?.has(P.id)??!1;return o?gt.createElement(nc,{key:P.id,index:O,width:n,ticket:P,isSelected:Ge,isFlashing:Ce,mode:c}):gt.createElement(tc,{key:P.id,width:j,ticket:P,isSelected:Ge,isFlashing:Ce})};return gt.createElement(Zs,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?y.accent:y.secondary,paddingRight:1,paddingLeft:1,height:r},z,gt.createElement(Zs,{padding:o?1:0},p.length>0&&gt.createElement(et,{selectedIndex:i,height:D,itemHeight:M},p.map($)),U&&gt.createElement(Re,{isSelected:!0})))},rc=gt.memo(Af);import{Box as pn,Text as si}from"ink";import Ee,{useMemo as gr}from"react";var oc=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},sc=(e,t,n)=>Z.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 Bn,Text as Nt}from"ink";import Te,{useEffect as Rf,useMemo as Tf,useRef as wf}from"react";import{decodeTime as ei}from"ulid";var Mf=e=>xe(e,"attachments"),Pf=e=>I.getAttachmentsByIssue(e.id).sort((t,n)=>ei(t.id)-ei(n.id)),ic=e=>{for(let t of e)I.deleteNode(t.id)},Lf=(e,t,n)=>Z.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),kf=(e,t)=>{let n=I.getNode(Mf(e.id));if(!n||!_e(n))return[];let r=t.map((o,s)=>Lf(o,s,n.id)).map(o=>I.createNode(o)).filter(ne).map(({value:o})=>o).filter(_e);return t.length>0&&g().selectedIndex<0&&T.navigate({contextNode:n,selectedIndex:0}),r},Df=e=>`${Math.max(1,Math.round(e/1024))} KB`;function ac({ticket:e,width:t,height:n}){let r=Tf(()=>Pf(e),[e]),o=wf([]);Rf(()=>(ic(o.current),o.current=kf(e,r),()=>{ic(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=H(),c=Math.max(1,n-4),u=Math.max(12,t-32);return r.length===0?Te.createElement(Bn,{flexDirection:"column",width:t,height:n,padding:1},Te.createElement(Nt,{color:y.primary},"No attachments yet."),Te.createElement(Bn,{paddingTop:1},Te.createElement(Nt,{color:y.primary},"Attach images from the browser GUI"),Te.createElement(Nt,{color:y.accent}," epiq gui "),Te.createElement(Nt,{color:y.primary},"by dropping or pasting them."))):Te.createElement(Bn,{flexDirection:"column",width:t,height:n},Te.createElement(Bn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},Te.createElement(Nt,{color:y.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),Te.createElement(et,{height:c,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let f=p===s,b=m.name.length>u?m.name.slice(0,u-1)+"\u2026":m.name;return Te.createElement(Bn,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Te.createElement(Nt,{color:y.accent},f?"\u276F ":" "),Te.createElement(Bn,{paddingLeft:1},Te.createElement(Nt,{color:y.secondary2},`#${p+1} `),Te.createElement(Nt,{color:f?y.accent:y.primary},b),Te.createElement(Nt,{color:y.secondary2}," "+Df(m.bytes)+" "+Sn(ei(m.id)))))})))}import{Box as jt,Text as At}from"ink";import ge,{useEffect as Ff,useMemo as Bf,useRef as Uf}from"react";import{decodeTime as ti}from"ulid";var Of=e=>xe(e,"comments"),_f=e=>I.getCommentsByIssue(e.id).sort((t,n)=>ti(t.id)-ti(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),dc=e=>{for(let t of e)I.deleteNode(t.id)},$f=(e,t)=>{let n=I.getNode(Of(e.id));if(!n||!_e(n))return[];let r=t.map((o,s)=>sc(o,s,n.id)).map(I.createNode).filter(ne).map(({value:o})=>o).filter(er);return t.length>0&&g().selectedIndex<0&&T.navigate({contextNode:n,selectedIndex:0}),r},Hf=(e,t)=>{let n=e.replace(/\s+/g," ").trim();return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}\u2026`};function cc({ticket:e,width:t,height:n}){let r=Bf(()=>_f(e),[e]),o=Uf([]);Ff(()=>(dc(o.current),o.current=$f(e,r),()=>{dc(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=H(),c=Math.max(1,n-4),u=Math.max(20,t-8);return r.length===0?ge.createElement(jt,{flexDirection:"column",width:t,height:n,padding:1},ge.createElement(At,{color:y.primary},"No comments yet."),ge.createElement(jt,{paddingTop:1},ge.createElement(At,{color:y.primary},"Use"),ge.createElement(At,{color:y.accent}," :comment "),ge.createElement(At,{color:y.primary},"to add the first one."))):ge.createElement(jt,{flexDirection:"column",width:t,height:n},ge.createElement(jt,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},ge.createElement(At,{color:y.secondary2},"Comments (",r.length,") ")),ge.createElement(et,{height:c,itemHeight:4,selectedIndex:s},r.map((m,p)=>{let f=p===s;return ge.createElement(jt,{key:m.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},ge.createElement(jt,{flexDirection:"row",paddingBottom:1},ge.createElement(At,{color:y.accent},f?"\u276F ":" "),ge.createElement(jt,{paddingLeft:1},ge.createElement(At,{color:y.secondary2},`#${p+1} `),ge.createElement(Wt,{id:m.authorId}),ge.createElement(At,{color:y.secondary2}," "+Sn(ti(m.id))))),ge.createElement(jt,{paddingLeft:3,paddingBottom:1},ge.createElement(At,{color:y.primary},Hf(m.md,u))))})))}import{Box as So,Text as Wf}from"ink";import Rt from"react";var lc=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=H(),{title:o}=t,s=t.parentNodeId?I.getNode(t.parentNodeId):void 0,i=s&&R(s)?o===Q.ASSIGNEES?s.props.assignees??[]:o===Q.TAGS?s.props.tags??[]:[]:[];return Rt.createElement(So,{alignItems:"center",paddingTop:1},Rt.createElement(So,{minWidth:12},Rt.createElement(Re,{isSelected:n}),Rt.createElement(Wf,{color:n?y.accent:y.secondary2},o,":")),Rt.createElement(So,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,u)=>{let m=r.id===t.id&&u===e;return Rt.createElement(So,{key:`${o}-${c}`,paddingRight:2,minHeight:1},Rt.createElement(Re,{isSelected:m}),o===Q.ASSIGNEES?Rt.createElement(Wt,{isSelected:m,id:c}):o===Q.TAGS?Rt.createElement(kn,{isSelected:m,id:c}):null)})))};import{Box as Co,Text as ni}from"ink";import Tt,{useEffect as jf,useMemo as uc}from"react";var Vf="\u2029",mc=(e,t)=>`${e}::inline-line::${t}`,ri=new Map,pc=e=>{let t=ri.get(e)??[];ri.delete(e);for(let n of t)I.deleteNode(n)},Kf=(e,t)=>{pc(e);let n=[];t.forEach((r,o)=>{let s=$e(BigInt(o+1));if(!ne(s))return;let i=I.createNode(Z.text({id:mc(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));ne(i)&&n.push(i.value.id)}),ri.set(e,n)},oi=({id:e,label:t,text:n,height:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=H(),u=uc(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=uc(()=>u.join("\0"),[u]);jf(()=>(Kf(e,u),()=>{pc(e)}),[e,m]);let p=b=>String(b).replace(/\r?\n/g,""),f=u.map((b,C)=>{let N=c.id===e&&i===C;return Tt.createElement(Co,{key:mc(e,C)},Tt.createElement(ni,{color:N?y.primary:y.secondary2,dimColor:!N},`${C+1} `.padStart(5,"\xA0")),Tt.createElement(ni,{backgroundColor:N?"gray":void 0},p(b.length?rn(b,s-10):Vf)))});return Tt.createElement(Co,{flexDirection:"column",paddingTop:1},Tt.createElement(Co,null,Tt.createElement(Re,{isSelected:o}),Tt.createElement(ni,{color:o?y.accent:y.secondary2},t)),Tt.createElement(Co,{flexDirection:"row",borderStyle:"round",borderColor:y.secondary,paddingLeft:1,marginLeft:1},Tt.createElement(et,{scrollByOne:!0,height:r-3,selectedIndex:i,itemHeight:1},f)))};var Gf=e=>xe(e,"description"),zf=e=>xe(e,"comments"),qf=e=>xe(e,"history"),Yf=e=>xe(e,"attachments"),fc=({ticket:e,height:t})=>{let n=gr(()=>oc(e),[e]),{selectedIndex:r,contextNode:o}=H(),s=process.stdout.columns||120,i=gr(()=>Gf(e.id),[e.id]),c=gr(()=>zf(e.id),[e.id]),u=gr(()=>qf(e.id),[e.id]),m=gr(()=>Yf(e.id),[e.id]),p=I.getAttachmentsByIssue(e.id).length,f=o.id===e.id,b=o.id===c||o.parentNodeId===c,C=o.id===u||o.parentNodeId===u,N=o.id===m||o.parentNodeId===m,A=G(e.id);if(b){let O=t-3;return Ee.createElement(pn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ee.createElement(cc,{ticket:e,width:s,height:O}))}if(N){let O=t-3;return Ee.createElement(pn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ee.createElement(ac,{ticket:e,width:s,height:O}))}if(C){let P=I.getNode(u),O=P&&_e(P)?P.props.value??"":"",Ce=t-3;return Ee.createElement(pn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},P?Ee.createElement(oi,{id:P.id,label:"Event log",text:O,selected:!1,maxWidth:s,height:Ce}):null)}let M=A.reduce((P,O)=>Zn(O)||O.id===c||O.id===m||O.id===u?P+1:P,0),U=2,j=3,D=M,z=t-j-D-U,$=(P,O)=>P.id===i?Ee.createElement(oi,{key:P.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:O,maxWidth:s,height:z}):Zn(P)?Ee.createElement(lc,{key:P.id,parent:P,selected:O,selectedIndex:r}):P.id===c?Ee.createElement(pn,{key:P.id,paddingTop:1},Ee.createElement(Re,{isSelected:O}),Ee.createElement(si,{backgroundColor:y.secondary,color:O?y.accent:y.primary},` Comments (${n}) \u203A\u203A `)):P.id===m?Ee.createElement(pn,{key:P.id,paddingTop:1},Ee.createElement(Re,{isSelected:O}),Ee.createElement(si,{backgroundColor:y.secondary,color:O?y.accent:y.primary},` Attachments (${p}) \u203A\u203A `)):P.id===u?Ee.createElement(pn,{key:P.id,paddingTop:1},Ee.createElement(Re,{isSelected:O}),Ee.createElement(si,{backgroundColor:y.secondary,color:O?y.accent:y.primary}," History \u203A\u203A ")):null;return Ee.createElement(pn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},A.map((P,O)=>$(P,f&&r===O)))};var Jf=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:i,width:c})=>{let u=t.context,m=u===L.TICKET||u===L.FIELD_LIST||u===L.FIELD,p=u===L.BOARD||u===L.SWIMLANE,f=u===L.TICKET?t:r.find(M=>M.context===L.TICKET),b=Math.floor(c/3),C=Math.floor(c/Math.max(e.length,1)),N=Math.min(C,b),A=s==="dense";return No.createElement(Xf,{flexDirection:"row",height:i},p&&e.map((M,U)=>{let j=t.id===M.id,D=j?n:-1,z=t.context===L.BOARD&&n===U;return No.createElement(rc,{key:M.id,height:i,width:N,swimlane:M,isSelected:z,isDense:A,isFocused:j,listSelectedIndex:D,mode:o})}),m&&f&&No.createElement(fc,{height:i,ticket:f}))},Ao=No.memo(Jf);import{render as eg}from"ink";import{Writable as tg}from"node:stream";var vr=e=>String(e).padStart(2,"0"),ng=e=>{let t=e.getUTCFullYear(),n=vr(e.getUTCMonth()+1),r=vr(e.getUTCDate()),o=vr(e.getUTCHours()),s=vr(e.getUTCMinutes()),i=vr(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},rg=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",og=async(e,{width:t,height:n})=>{let r="",o=new tg({write(i,c,u){let m=sg(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=eg(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},sg=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),vc=async()=>{let{viewMode:e}=K(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=g(),i=r.find(U=>U.context==="BOARD");if(!i)return a("No board found to export");let c=120,u=40,m=await og(Zf.createElement(Ao,{height:u,width:c,swimlanes:(s[i.id]??[]).filter(U=>U!==void 0&&Dt(U)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:u});if(!m)return a("Failed to render board export");let p=kr(process.cwd());if(d(p))return a("Unable to export, epiq root not found");let f=new Date,b=ng(f),C=`board_${rg(i.title)}_${b}.md`,N=Fi(p.value);gc.mkdirSync(N,{recursive:!0});let A=Qf.join(N,C),M=`# Board - ${i.title}
46
+ `)}`):(pf(),C({hasProjectDefinition:!0}),u("State booted successfully",null))}var fn=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),go=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}},J=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);var ht=null,vo=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!ht,currentStatus:v().syncStatus?.status,currentMessage:v().syncStatus?.msg}),ht)return logger.debug("[sync] syncAndReloadState joining existing promise"),ht;logger.debug("[sync] syncAndReloadState creating promise"),ht=gf();try{let e=await ht;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!d(e),message:(d(e),e.message),statusAfterResolve:v().syncStatus?.status,statusMessageAfterResolve:v().syncStatus?.msg}),d(e)&&v().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),C({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}),ht||a(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:v().syncStatus?.status,statusMessageBeforeClear:v().syncStatus?.msg}),ht=null}},gf=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:v().mode,syncStatus:v().syncStatus});let e=Pd();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:v().mode,message:e.message,syncStatus:v().syncStatus}),e;if(ht)return ht;logger.debug("[sync] syncAndReloadState:start");let t=J("resolveActorId",ie());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),a("Unable to resolve event log path");C({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:v().syncStatus});let n=un(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=J("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),C({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:v().syncStatus}),et(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let s=J("loadMergedEvents",je(o));if(logger.debug("[sync] loadMergedEvents:result",{success:!d(s),message:(d(s),s.message),count:d(s)?void 0:s.value.length}),d(s))return C({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:v().syncStatus}),a(`Unable to load events. ${s.message}`);logger.debug("[sync] loaded merged events after sync",{count:s.value.length});let i=Pd();if(i)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:v().mode,message:i.message,syncStatus:v().syncStatus}),i;let c=Ad(),l=v().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:c,selectedNodeId:v().selectedNode?.id,contextNodeId:v().contextNode?.id,selectedNodeIsVirtual:v().selectedNode?.isVirtual,contextNodeIsVirtual:v().contextNode?.isVirtual}),!v().selectedNode?.isVirtual&&!v().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:s.value.length});let p=J("bootStateFromEventLog",pn(s.value));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(p),message:(d(p),p.message)}),d(p))return C({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:v().syncStatus}),a(`Unable to boot synced state. ${p.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:v().selectedNode?.isVirtual,contextNodeIsVirtual:v().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),C({filters:l}),logger.debug("[sync] restoreNavigationAnchor:start");let m=J("restoreNavigationAnchor",wd(c));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(m),message:d(m)?m.message:"Navigation restored",selectedNodeId:v().selectedNode?.id,contextNodeId:v().contextNode?.id}),d(m)?(C({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:v().syncStatus}),m):(C({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:v().syncStatus}),u("Synced",!0))},Pd=()=>v().mode===y.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:v().mode,syncStatus:v().syncStatus}),C({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var Ln=3e3,Ld=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Ln?null:t},kd=0,ei,ti=!1,pr=!1,ni=()=>{if(ti)return!0;let e=We();return d(e)?!1:e.value.syncStatus.status==="syncing"},vf=()=>{let e=K().autoSyncIntervalMs??1e4,t=Date.now()-kd;return Math.max(0,e-t)},Dd=()=>{ei||(ei=setTimeout(async()=>{if(ei=void 0,!!Wt()){if(ni()){pr=!0;return}pr=!1,await yf()}},vf()))},yf=async()=>{if(v().readOnly||v().timeMode==="peek"||v().timeMode==="replay")return a("Cannot auto-sync while peeking");if(!Wt())return a("Cannot auto-sync before state is initialized");if(ni())return pr=!0,a("Sync already in progress");ti=!0,kd=Date.now(),C({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await vo()}finally{ti=!1,pr&&Dd()}},ho=()=>{Wt()&&(pr=!0,!ni()&&Dd())};var Vt=()=>{let e=K(),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}},Bd=()=>{let e=_e(process.cwd());if(d(e))return!1;let t=ut(e.value);return Q(t)},Fd=e=>e===!0?"on":e===!1?"off":null,Ud=e=>e==="on"?!0:e==="off"?!1:null;var hf=e=>e.props.tags??[],xf=e=>e.props.assignees??[],Gt=e=>hf(e).map(t=>E.getTag(t)).filter(t=>!!t),Kt=e=>xf(e).map(t=>E.getContributor(t)).filter(t=>!!t),xo=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!T(n)?a("Invalid untag target"):u("Retrieved tags from ticket in breadcrumb",Gt(n))},bo=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!T(n)?a("Invalid unassign target"):u("Retrieved assignees from ticket in breadcrumb",Kt(n))};var b={PALETTE:"?",EXIT:"exit",INIT:"init",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 bf=/^(\d+)(h|d|w|mo|y)$/,If=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Ef=({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},Sf=(e,t=new Date)=>{let n=e.match(bf);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let i=new Date(t);switch(o){case"h":return i.setHours(i.getHours()-s),i;case"d":return i.setDate(i.getDate()-s),i;case"w":return i.setDate(i.getDate()-s*7),i;case"mo":return i.setMonth(i.getMonth()-s),i;case"y":return i.setFullYear(i.getFullYear()-s),i;default:return null}},Cf=e=>{let t=e.match(If);if(!t)return null;let[,n,r,o,s,i]=t,c=Number(n),l=Number(r),m=Number(o),p=s?Number(s):0,f=i?Number(i):0;return Ef({year:c,month:l,day:m,hour:p,minute:f})?new Date(c,l-1,m,p,f):null},gn=e=>{let t=e.trim().toLowerCase();return Sf(t)??Cf(t)};var Od=/^(\d+)(s|m)?$/,Io=e=>{let t=e.trim().toLowerCase().match(Od);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},Eo=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&Od.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},_d=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Nf=[{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}],ri=(e=Nf)=>{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 Rf=["BOARD","TICKET","SWIMLANE","COMMENT"],re={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},Ke={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},ye={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},Af=[re.EDITOR,re.VIEW,re.USERNAME,re.AUTOSYNC,re.SYNC_DEBOUNCE_MS,re.ATTACHMENT_MAX_KB,re.LOG_LEVEL],Tf=(e=v().selectedNode?.context)=>{switch(e){case"TICKET":return[Ke.TITLE,Ke.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Ke.TITLE];case"COMMENT":return[Ke.COMMENT];default:return[]}},si=[String(Ln),"5000","15000","30000","60000"],ii=["250","500","1000"],jd=["10s","20s","30s","45s"],vn=[b.COFFEE,b.EXIT,b.SYNC,b.HELP,b.EXPORT,b.CONFIG,b.YANK],So=[b.NEW,b.EDIT,b.DELETE,b.MOVE],oi=[b.TAG,b.UNTAG,b.ASSIGN,b.UNASSIGN,b.CLOSE_ISSUE,b.RE_OPEN_ISSUE,b.EDIT,b.COMMENT],$d=[b.FILTER,b.PEEK,b.REPLAY],wf={WORKSPACE:[...vn,...So],BOARD:[...$d,...vn,...So],SWIMLANE:[...$d,...vn,...So],TICKET:[...vn,...So,...oi],FIELD:[...vn,...oi],FIELD_LIST:[...vn,...oi],TEXT:[...vn],COMMENT:[b.EDIT,b.DELETE,b.YANK]},Mf=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],fr=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&T(n)),Hd=e=>e.parentNodeId===ve,Pf=({selectedNode:e,breadCrumb:t})=>{let n=Tf(e?.context);return fr({breadCrumb:t,selectedNode:e})?n.includes(Ke.DESCRIPTION)?n:[...n,Ke.DESCRIPTION]:n},Lf=({selectedNode:e,breadCrumb:t})=>{let n=fr({breadCrumb:t,selectedNode:e});return n?[ye.REF,ye.TITLE,...n.props?.description?.trim()?[ye.DESCRIPTION]:[],...Gt(n).length>0?[ye.TAGS]:[],...Kt(n).length>0?[ye.ASSIGNEES]:[]]:e?[ye.REF,ye.TITLE]:[]},kf=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=Vt();if(!r)return[b.HELP,b.CONFIG];if(!Bd())return[b.HELP,b.INIT];if(t)return[b.HELP,b.PEEK,b.REPLAY,b.EXPORT,b.CONFIG,b.YANK];let o=e?.context,s=o&&Rf.includes(o),i=[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?wf[l]:[]))],c=fr({breadCrumb:n,selectedNode:e});return i.filter(l=>l===b.MOVE?!1:l===b.YANK?!!(c??e):l===b.EDIT?s||!!c:l===b.DELETE?s:l===b.UNTAG?!!(c&&Gt(c).length>0):l===b.UNASSIGN?!!(c&&Kt(c).length>0):l===b.RE_OPEN_ISSUE?!!(c&&Hd(c)):l===b.CLOSE_ISSUE?!!(c&&!Hd(c)):!0)},ae=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=v())=>{let s=t.context??"WORKSPACE";return{[b.NONE]:kf({breadCrumb:o,readOnly:r,selectedNode:n}),[b.EXIT]:["confirm"],[b.EXPORT]:[],[b.SYNC]:[],[b.INIT]:[],[b.HELP]:[],[b.PEEK]:[...ri(),"now","prev","next"],[b.REPLAY]:[...ri()],[b.EDIT]:Pf({selectedNode:n,breadCrumb:o}),[b.YANK]:Lf({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(Tn),...E.getExistingTags()])],[b.UNTAG]:[...xo()?.value?.map(({name:c})=>c)??[]],[b.UNASSIGN]:[...bo()?.value?.map(({name:c})=>c)??[]],[b.ASSIGN]:E.getExistingAssignees(),[b.NEW]:Mf(s),[b.CONFIG]:[...Af],[b.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import ec from"chalk";var Wd=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as Vd}from"ulid";var Co=e=>{try{return u("Decoded date",new Date(Vd(e)))}catch(t){return a("Decoding failed + "+t.message)}},zt=e=>{if(!e?.id)return null;try{return Vd(e.id)}catch{return null}};import Of from"zod";import Df from"node:crypto";import gr from"node:fs";import Gd from"node:path";var xt=500,Bf=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,kn=(e,t)=>`${e}.${t}`,Ff=e=>Bf.test(e),Kd=e=>e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?u("Sniffed image type","png"):e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?u("Sniffed image type","jpg"):e.length>=6&&(e.subarray(0,6).equals(Buffer.from("GIF87a","ascii"))||e.subarray(0,6).equals(Buffer.from("GIF89a","ascii")))?u("Sniffed image type","gif"):e.length>=12&&e.subarray(0,4).equals(Buffer.from("RIFF","ascii"))&&e.subarray(8,12).equals(Buffer.from("WEBP","ascii"))?u("Sniffed image type","webp"):a(`Unsupported image format. Allowed: ${Qa.join(", ")}`),zd=e=>Df.createHash("sha256").update(e).digest("hex"),Uf=(e,t=xt)=>{if(e.length===0)return a("Attachment is empty");if(e.length>t*1024)return a(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=Kd(e);return d(n)?n:u("Validated attachment data",{hash:zd(e),ext:n.value,bytes:e.length})},qd=(e,t,n=xt)=>{let r=Uf(t,n);if(d(r))return r;let o=nr(e),s=Gd.join(o,kn(r.value.hash,r.value.ext));try{gr.existsSync(s)||(gr.mkdirSync(o,{recursive:!0}),gr.writeFileSync(s,t))}catch(i){return a(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return u("Wrote attachment blob",r.value)},Yd=(e,t,n=xt)=>{if(!Ff(t))return a("Invalid attachment file name");let r=Gd.join(nr(e),t);if(!gr.existsSync(r))return a("Attachment blob not found");let o;try{o=gr.readFileSync(r)}catch(l){return a(`Unable to read attachment blob: ${l instanceof Error?l.message:String(l)}`)}if(o.length>n*1024)return a(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(zd(o)!==s)return a("Attachment blob does not match its content hash");let c=Kd(o);return d(c)?c:c.value!==i?a("Attachment blob content does not match its extension"):u("Resolved attachment blob",{filePath:r,ext:i,bytes:o.length})};var vr=50,yr=5e3,Xd=()=>{let e=X().commandMeta.inputString,t=Of.coerce.number().int().min(vr).max(yr).safeParse(e);if(!t.success)return a(`Attachment size cap must be ${vr}-${yr} KB (default ${xt})`);let n=Qe({attachmentMaxKb:t.data});return d(n)?n:(Me({attachmentMaxKb:t.data}),C({mode:y.DEFAULT}),u(`Attachment size cap set to ${t.data} KB`,null))};import Jd from"chalk";var te=e=>Jd.dim(e),Ee=e=>Jd.hex(h.primary)(e),Se=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let i=o.trim();if(i.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(i))].sort((f,g)=>ro(f)-ro(g)).slice(0,r).map(f=>oo(f)).join(" ");return p?`${te(e)}${p}${te(n)}`:""};var bt={None:"none",Invalid:"invalid",Valid:"valid"};var Dn=140,_f=["BOARD","TICKET","SWIMLANE"],Qd=()=>{let e=v().selectedNode;if(!e?.context)return O({message:te("Missing target context")});if(_f.includes(e.context))return G();if(e.parentNodeId){let t=v().nodes[e.parentNodeId];if(t?.id===Ie(t?.parentNodeId??"","comments"))return G()}return O({message:te("Command not available in this context")})},oe="<ENTER> to confirm",G=(e="",t=[])=>({message:te(e),validity:bt.Valid,completionWordList:t}),O=({message:e,completionWordList:t=[]})=>({validity:bt.Invalid,message:e,completionWordList:t}),Ro=e=>e.length===0,Zd=(e,t)=>{let n=Ue(v().breadCrumb,"BOARD");if(d(n))return O({message:Ee("Command is not applicable in this context")});let r=Co(n.value.id);return d(r)?O({message:Ee(`Unable to ${t}: board id is not a valid ULID`)}):_d({date:e,horizonDate:r.value})?null:O({message:Ee(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},No=e=>` ${ec.hex("#000").bgHex(ue(e))(` ${e} `)} `,ai=({modifier:e})=>{let t="confirm";return e===t?G(oe):O({message:Ro(e)?te("if you are certain, enter ")+oo(t):"",completionWordList:[t]})},$f=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?O({message:te(n)}):G():O({message:Ro(r)?t:"",completionWordList:[...e]}),yn=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>Ro(n)&&Ro(r)?O({message:e,completionWordList:[]}):G(t??oe),Hf=({modifier:e,inputString:t})=>{let n=ae(b.CONFIG);if(!n.includes(e))return O({message:Se({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case re.EDITOR:{let r=[...Wd];return t.trim()?r.includes(t.trim())?G(oe):O({message:Se({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):O({message:Se({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case re.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?G(oe):O({message:Se({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case re.USERNAME:return t.trim()?G(oe):O({message:Ee("Enter a user name. Saved in ")+ec.bgBlack("~/.epiq-global/config.json")});case re.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?G(oe):O({message:Se({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case re.AUTOSYNC:{let r=["on","off"],o=K().autoSync;if(!r.includes(t.trim())){let s=Fd(o);return O({message:Se({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return G(oe)}case re.ATTACHMENT_MAX_KB:{let r=K().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<vr||o>yr){let s=Se({prefix:" examples: ",wordList:ii,minLengthForHints:0,inputString:t});return O({message:Ee(`provide a size cap in KB (${vr}-${yr}). current: ${r??xt} KB.`)+s,completionWordList:ii})}return G(oe)}case re.SYNC_DEBOUNCE_MS:{let r=K().autoSyncIntervalMs,o=Ld(t);if(!t.trim()||o===null||o<Ln){let s=Se({prefix:" examples: ",wordList:si,minLengthForHints:0,inputString:t});return O({message:Ee(`provide duration above ${Ln}ms. current duration: ${r}ms.`)+s,completionWordList:si})}return G(oe)}default:return O({message:Ee("Unknown config option"),completionWordList:n})}},jf=({modifier:e,inputString:t})=>{let n=ae(b.EDIT);if(!n.length)return O({message:Ee("Command not available in this context")});if(!n.includes(e)){let r=Se({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return O({message:r||Ee("Unknown edit option"),completionWordList:n})}switch(e){case Ke.COMMENT:return t.trim()?G(oe):O({message:te("write a comment...")});case Ke.TITLE:return G(oe);case Ke.DESCRIPTION:{let{preferredEditor:r}=K();return r?G(te("<ENTER> to edit in ")+r):O({message:"No editor selected"})}default:return O({message:Ee("Unknown edit option"),completionWordList:n})}},Wf=({modifier:e})=>{let t=ae(b.YANK);return t.length?t.includes(e)?G(oe+te(" and copy to clipboard")):O({message:Se({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):O({message:Ee("Nothing selected to copy from")})},Vf={[b.EXPORT]:()=>G(oe+te(", and create export markdown file")),[b.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return G(oe);let n={message:te("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=gn(r);if(!r||!o)return O(n);let s=Zd(o,"peek");return s||G(oe)},[b.REPLAY]:e=>{let{dateInput:t,durationInput:n}=Eo(e.modifier,e.inputString),r={message:te("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=gn(t);if(!t||!o)return O(r);let s=Zd(o,"replay");return s||(n&&Io(n)===null?O({message:Ee("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):G("<ENTER> to replay board history",n?jd:[]))},[b.EXIT]:()=>G(oe+te(" and exit the application")),[b.INIT]:()=>G(oe),[b.PALETTE]:()=>G(oe),[b.FILTER]:e=>{if(e.modifier==="clear")return G(oe);let t=s=>ae(b.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return O({message:Se({wordList:ae(b.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ae(b.FILTER)});let n=Object.values(v().tags).map(s=>s.name),r=Object.values(v().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?O({message:Se({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):G():O({message:Se({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[b.NONE]:e=>{let t=ae(b.NONE);return O({message:Se({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[b.NEW]:e=>$f({list:ae(b.NEW),hint:Se({wordList:ae(b.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[b.HELP]:()=>G(oe),[b.EDIT]:jf,[b.COMMENT]:e=>{let t=yn({hint:te(`write a comment (max ${Dn} char)...`),onOk:te(`(${e.inputString.length}/${Dn})`)})(e);return t.validity===bt.Invalid?t:e.inputString.length>Dn?G(Ee("max input exceeded")):t},[b.CONFIG]:Hf,[b.YANK]:Wf,[b.DELETE]:e=>{let t=Qd();return t.validity==="invalid"?t:ai(e)},[b.CLOSE_ISSUE]:e=>ai(e),[b.RE_OPEN_ISSUE]:e=>ai(e),[b.MOVE]:e=>{let t=Qd();return t.validity==="invalid"?t:yn({hint:Se({prefix:"hey hacker! These commands are blocked for you... ",wordList:ae(b.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[b.TAG]:e=>{let n=E.getExistingTags().slice(0,10).map(No).join("");return yn({hint:n.length?te("create tag or reuse:")+n+te(""):te("create tag ...")})(e)},[b.UNTAG]:e=>{let t=xo();if(d(t))return O({message:Ee("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(No).slice(0,10);return n.length?yn({hint:te(" ... ")+n.join("")})(e):O({message:Ee("Issue has no tags"),completionWordList:[]})},[b.ASSIGN]:e=>{let t=E.getExistingAssignees().map(No).slice(0,10);return yn({hint:te("assignees... ")+t.join("")})(e)},[b.UNASSIGN]:e=>{let t=bo();if(d(t))return O({message:Ee("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(No).slice(0,10);return n.length?yn({hint:te("remove assignee... ")+n.join("")})(e):O({message:Ee("Issue has no assignees"),completionWordList:[]})},[b.SYNC]:()=>G(oe),[b.COFFEE]:e=>{let{modifier:t}=e,n=ae(b.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?O({message:te("enter an amount ... "),completionWordList:n.filter(r=>r.startsWith(t))}):yn({hint:Se({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},tc=Object.fromEntries(Object.entries(Vf).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Ao=["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 Gf=3,Kf=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"]),zf=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},qf=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=Gf&&!Kf.has(t)&&!/^\d+$/.test(t)),Yf=e=>{let t=new Map;for(let s of zf(e))for(let i of qf(s))t.set(i,(t.get(i)??0)+1);let n=[...t.entries()].sort((s,i)=>i[1]-s[1]||s[0].localeCompare(i[0])).map(([s])=>s),r=new Set(n),o=Ao.filter(s=>!r.has(s));return[...n,...o]},nc=Ao,rc=-1,oc=()=>{let e=We();if(d(e))return Ao;let t=e.value,n=t.eventLog.length;return n!==rc&&(nc=Yf(t),rc=n),nc};var sc=e=>Object.values(b).includes(e),ic=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:c,completionWordList:l}=tc[n].validate(n,r,s),m=n!==b.PEEK&&n!==b.REPLAY,p=o==="command"||o==="modifier"?ae(n):m?oc():[],{mode:f}=v(),g=f===y.COMMAND_LINE?i??"":"",I=[...l,...p];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?Ya(e,I):{hint:"",hints:[],remainder:"",overlap:0}}};var ac=e=>{let t=e.trimStart(),n=Jf(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=Qf(e),c=sc(r)?r:null,l=c!==null,m=r!=="",p=c?ae(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?"":i,S=Xf(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:c,isCommandKeyword:l,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:I,inputString:S}},Xf=(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},Jf=e=>e.trim()?e.trim().split(/\s+/):[],Qf=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Zf}from"react";var Bn=e=>e===di||e===":",di=" ",Le={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:bt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},ci=new Set,dc=()=>{for(let e of ci)e()},li=e=>(ci.add(e),()=>ci.delete(e)),It=e=>{let n=e(Le),r=ac(n.value),o=n.cursorPosition===n.value.length;Le={...n,commandMeta:ic(r,o)},dc()},hr=({message:e,status:t})=>{let n=structuredClone(Le);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Le=n,dc(),u(e,null)},ui=e=>{It(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},mi=e=>{It(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Bn(n[o-1]);)o--;for(;o>0&&!Bn(n[o-1]);)o--}else{for(;o<n.length&&!Bn(n[o]);)o++;for(;o<n.length&&Bn(n[o]);)o++}return{...t,cursorPosition:o}})},cc=()=>{It(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}})},lc=()=>{It(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Bn(t[r-1]);)r--;for(;r>0&&!Bn(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},To=e=>{It(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),s=e(r,t.commandMeta.autoCompletion),i=s+o,c=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:c,commandIsPending:!1}})},uc=()=>{It(e=>({...e,commandIsPending:!0}))},V=e=>{It(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},mc=({addToHistory:e=!0})=>{It(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},pc=()=>{It(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}})},fc=()=>{It(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},X=()=>Le,gc=()=>Zf(li,X,X),vc=()=>{let[e,...t]=Le.value.split(di);return t.join(di).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 eg(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function tg(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function ng(e,t,n){let r=v().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 yc(e,t){let n=X();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 ja(e,n.value);if(t===y.PALETTE)return Wa(e,n.value);let r=eg(e)||tg(e);if(r)return rg(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 K().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;default:return null}}function rg(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 ng(v().contextNode.childRenderAxis,e,n)}var wo=e=>{let{context:t}=v().contextNode;if(!t)return k.None;switch(e){case b.EXIT:return k.Exit;case b.EXPORT:return k.Export;case b.COFFEE:return k.Coffee;case b.INIT:return k.Init;case b.DELETE:return k.Delete;case b.EDIT:return k.Edit;case b.COMMENT:return k.Comment;case b.HELP:return k.ViewHelp;case b.RE_OPEN_ISSUE:return k.ReopenIssue;case b.CLOSE_ISSUE:return k.CloseIssue;case b.TAG:return k.TagTicket;case b.UNTAG:return k.UntagTicket;case b.ASSIGN:return k.AssignUserToTicket;case b.UNASSIGN:return k.UnassignUserFromTicket;case b.NEW:return k.NewItem;case b.FILTER:return k.Filter;case b.MOVE:return k.Move;case b.PEEK:return k.Peek;case b.REPLAY:return k.Replay;case b.CONFIG:return k.Config;case b.YANK:return k.Yank;case b.SYNC:return k.Sync;default:return k.None}},k={Exit:"exit",Init:"init",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 Be}from"ulid";import $c from"node:fs";import zg from"node:path";import qg from"react";import{Box as Gg}from"ink";import Fo from"react";import xg from"chalk";import{Box as fi,Text as bg}from"ink";import Et from"react";import{Text as hc}from"ink";import xc,{useEffect as bc,useState as og}from"react";var Ic={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},ke=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=j(),r=Ic[n]??Ic.default,[o,s]=og(0);if(bc(()=>{s(0)},[r]),bc(()=>{if(!e)return;let c=setInterval(()=>{s(l=>(l+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return xc.createElement(hc,null,t);let i=r[o]??r[0]??t;return xc.createElement(hc,{color:h.accent,dimColor:o===1},i)};import{Box as pi,Text as sg}from"ink";import Mo from"react";var tt=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let s=Math.max(1,Math.floor(t)),i=Math.max(1,Math.ceil(r)),c=Math.max(1,Math.floor(s/i)),l=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-c),p=o?Math.min(m,Math.max(0,l-c+1)):Math.min(m,Math.floor(l/c)*c),f=p+c,g=e.slice(p,f),I=e.length>c,S=s,R=I?Math.max(1,Math.floor(c/e.length*S)):S,A=Math.max(0,S-R),P=Math.max(1,e.length-c),_=I?Math.floor(p/P*A):0;return Mo.createElement(pi,{flexDirection:"row",height:s,width:"100%"},Mo.createElement(pi,{flexDirection:"column",flexGrow:1,height:s},g),Mo.createElement(pi,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((w,W)=>Mo.createElement(sg,{key:W,color:I&&W>=_&&W<_+R?h.accent:h.secondary},I?"\u2502":" "))))};import{Box as _n,Text as ko}from"ink";import nt from"react";import{Text as ig}from"ink";import ag from"react";var Fn=(e,t)=>t?e&&lr(e)===t?e:t:e,Ec,Po,Sc=()=>{let{eventLog:e=[]}=v();if(Po&&Ec===e)return Po;let t=new Map,n=new Set;for(let r of e)r?.userId&&(n.add(r.userId),r.userName&&t.set(r.userId,r.userName));return Ec=e,Po={latestNames:t,authors:n},Po},qt=(e,t)=>{let{contributors:n={}}=v();return n[e]?.tombstoned?t:Fn(t,Sc().latestNames.get(e))??t},Cc=e=>Sc().authors.has(e);var dg=e=>e.toLowerCase().trim(),cg=(e,t=Tn)=>{let n=dg(e);return t[n]?t[n]:dr(n)},Yt=({id:e,isSelected:t})=>{let n=E.getContributor(e);if(!n)return;let r=qt(e,n.name);return ag.createElement(ig,{underline:t,color:cg(r)},"@"+r,Cc(e)?"":"\u2197")};import{Text as lg}from"ink";import ug from"react";var Un=({id:e,isSelected:t})=>{let n=E.getTag(e);if(n)return ug.createElement(lg,{underline:t,backgroundColor:ue(n.name),color:h.secondary}," "+n.name+" ")};import{useEffect as mg,useState as pg}from"react";var fg=80,Nc=1400,Lo=new Set,xr=null,gg=e=>(Lo.add(e),xr||(xr=setInterval(()=>{for(let t of Lo)t()},fg)),()=>{Lo.delete(e),Lo.size===0&&xr&&(clearInterval(xr),xr=null)}),vg=()=>{let e=Date.now()%Nc/Nc;return e<.5?e*2:(1-e)*2},On=e=>{let[,t]=pg(0);return mg(()=>{if(e)return gg(()=>t(n=>n+1))},[e]),no(vg())};var yg=(e,t)=>{if(e.length<=t)return[e,null];let n=e.lastIndexOf(" ",t),r=n>0?n:t;return[e.slice(0,r),ln(e.slice(r).trim(),t)]},Rc=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=On(r),s=e-4,[i,c]=yg(Ze(t.title),s),l=c?null:ln(Ze(t.props.description),s)||null,m=Gt(t),p=Kt(t);return nt.createElement(_n,{borderStyle:"round",height:5,flexDirection:"column",borderDimColor:!n,borderColor:r?o:n?h.accent:h.secondary,justifyContent:"space-between"},nt.createElement(_n,{paddingLeft:1,flexDirection:"column"},nt.createElement(ko,{color:h.primary},i),c&&nt.createElement(ko,{color:h.primary},c),l&&nt.createElement(ko,{color:h.secondary2,dimColor:!0},l)),nt.createElement(_n,{flexDirection:"row",justifyContent:"space-between",paddingLeft:1,paddingRight:1},nt.createElement(_n,{flexDirection:"row"},m.map(f=>nt.createElement(_n,{paddingRight:1,key:f.id},nt.createElement(Un,{key:f.id,id:f.id}))),p.map(f=>nt.createElement(_n,{paddingRight:1,key:f.id},nt.createElement(Yt,{key:f.id,id:f.id})))),nt.createElement(ko,{wrap:"truncate",color:h.secondary2,dimColor:!0},He(t.id))))};import{Box as hn,Text as br}from"ink";import ze from"react";var hg=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ac=({width:e,ticket:t,isSelected:n,isFlashing:r=!1,index:o,mode:s})=>{let i=On(r),c=(t.props.tags??[]).map(w=>E.getTag(w)).filter(w=>!!w),l=(t.props.assignees??[]).map(w=>E.getContributor(w)).map(w=>w&&{...w,name:qt(w.id,w.name)}).filter(w=>!!w),m=1,p=c.length*(1+m),f=l.length*(2+m),g=c.map(w=>ze.createElement(hn,{key:w.id,paddingRight:m},ze.createElement(br,{color:ue(w.name)},"\u25A0"))),I=l.map(w=>ze.createElement(hn,{key:w.id,paddingRight:m},ze.createElement(br,{color:dr(w.name)},"@"+w.name.at(0)))),S=r?i:n?h.accent:s===y.MOVE?h.secondary:h.primary,R=4,A=E.getCommentsByIssue(t.id),P=A.length?String(A.length).length+2+m:0,_=A.length?ze.createElement(hn,{paddingRight:m},ze.createElement(br,{color:h.accent},"[",A.length,"]")):null;return ze.createElement(hn,{borderBottom:!0,justifyContent:"space-between"},ze.createElement(hn,null,ze.createElement(hn,{width:R},n?ze.createElement(ke,{isSelected:n}):ze.createElement(br,{color:"gray",dimColor:!0},o+1)),ze.createElement(br,{wrap:"truncate",color:S},hg(t.title,e-p-f-P-18))),ze.createElement(hn,null,g,I,_))};var Ig=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:l,replay:m}=j(),p=l[e.id]??[],f=m?new Set(m.flashNodeIds):null,g=f?.has(e.id)??!1,I=On(g),S=`${e.title} ${xg.hex(h.secondary2).dim("("+p.length+")")}`,R=3,A=o?1:5,P=s&&i===-1,_=n-(P?7:5),w=r-R-(o?2:1),W=Et.createElement(fi,{borderStyle:"round",borderColor:h.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Et.createElement(ke,{isSelected:t}),Et.createElement(bg,{bold:!0,color:g?I:t?h.accent:h.primary},S," ",e.readonly?"\u{1F512}":"")),H=(D,$)=>{let Ye=s&&i===$;if(!T(D))return null;let we=f?.has(D.id)??!1;return o?Et.createElement(Ac,{key:D.id,index:$,width:n,ticket:D,isSelected:Ye,isFlashing:we,mode:c}):Et.createElement(Rc,{key:D.id,width:_,ticket:D,isSelected:Ye,isFlashing:we})};return Et.createElement(fi,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?h.accent:h.secondary,paddingRight:1,paddingLeft:1,height:r},W,Et.createElement(fi,{padding:o?1:0},p.length>0&&Et.createElement(tt,{selectedIndex:i,height:w,itemHeight:A},p.map(H)),P&&Et.createElement(ke,{isSelected:!0})))},Tc=Et.memo(Ig);import{Box as xn,Text as bi}from"ink";import Ce,{useMemo as Ir}from"react";var wc=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},Mc=(e,t,n)=>ee.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 $n,Text as wt}from"ink";import De,{useEffect as Eg,useMemo as Sg,useRef as Cg}from"react";import{decodeTime as gi}from"ulid";var Ng=e=>Ie(e,"attachments"),Rg=e=>E.getAttachmentsByIssue(e.id).sort((t,n)=>gi(t.id)-gi(n.id)),Pc=e=>{for(let t of e)E.deleteNode(t.id)},Ag=(e,t,n)=>ee.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),Tg=(e,t)=>{let n=E.getNode(Ng(e.id));if(!n||!Ve(n))return[];let r=t.map((o,s)=>Ag(o,s,n.id)).map(o=>E.createNode(o)).filter(Q).map(({value:o})=>o).filter(Ve);return t.length>0&&v().selectedIndex<0&&M.navigate({contextNode:n,selectedIndex:0}),r},wg=e=>`${Math.max(1,Math.round(e/1024))} KB`;function Lc({ticket:e,width:t,height:n}){let r=Sg(()=>Rg(e),[e]),o=Cg([]);Eg(()=>(Pc(o.current),o.current=Tg(e,r),()=>{Pc(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=j(),c=Math.max(1,n-4),l=Math.max(12,t-32);return r.length===0?De.createElement($n,{flexDirection:"column",width:t,height:n,padding:1},De.createElement(wt,{color:h.primary},"No attachments yet."),De.createElement($n,{paddingTop:1},De.createElement(wt,{color:h.primary},"Attach images from the browser GUI"),De.createElement(wt,{color:h.accent}," epiq gui "),De.createElement(wt,{color:h.primary},"by dropping or pasting them."))):De.createElement($n,{flexDirection:"column",width:t,height:n},De.createElement($n,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:h.secondary,borderStyle:"single",paddingBottom:1},De.createElement(wt,{color:h.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),De.createElement(tt,{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 De.createElement($n,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},De.createElement(wt,{color:h.accent},f?"\u276F ":" "),De.createElement($n,{paddingLeft:1},De.createElement(wt,{color:h.secondary2},`#${p+1} `),De.createElement(wt,{color:f?h.accent:h.primary},g),De.createElement(wt,{color:h.secondary2}," "+wg(m.bytes)+" "+Mn(gi(m.id)))))})))}import{Box as Xt,Text as Mt}from"ink";import he,{useEffect as Mg,useMemo as Pg,useRef as Lg}from"react";import{decodeTime as vi}from"ulid";var kg=e=>Ie(e,"comments"),Dg=e=>E.getCommentsByIssue(e.id).sort((t,n)=>vi(t.id)-vi(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),kc=e=>{for(let t of e)E.deleteNode(t.id)},Bg=(e,t)=>{let n=E.getNode(kg(e.id));if(!n||!Ve(n))return[];let r=t.map((o,s)=>Mc(o,s,n.id)).map(E.createNode).filter(Q).map(({value:o})=>o).filter(ar);return t.length>0&&v().selectedIndex<0&&M.navigate({contextNode:n,selectedIndex:0}),r},Fg=(e,t)=>{let n=e.replace(/\s+/g," ").trim();return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}\u2026`};function Dc({ticket:e,width:t,height:n}){let r=Pg(()=>Dg(e),[e]),o=Lg([]);Mg(()=>(kc(o.current),o.current=Bg(e,r),()=>{kc(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=j(),c=Math.max(1,n-4),l=Math.max(20,t-8);return r.length===0?he.createElement(Xt,{flexDirection:"column",width:t,height:n,padding:1},he.createElement(Mt,{color:h.primary},"No comments yet."),he.createElement(Xt,{paddingTop:1},he.createElement(Mt,{color:h.primary},"Use"),he.createElement(Mt,{color:h.accent}," :comment "),he.createElement(Mt,{color:h.primary},"to add the first one."))):he.createElement(Xt,{flexDirection:"column",width:t,height:n},he.createElement(Xt,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:h.secondary,borderStyle:"single",paddingBottom:1},he.createElement(Mt,{color:h.secondary2},"Comments (",r.length,") ")),he.createElement(tt,{height:c,itemHeight:4,selectedIndex:s},r.map((m,p)=>{let f=p===s;return he.createElement(Xt,{key:m.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:h.secondary,borderStyle:"single"},he.createElement(Xt,{flexDirection:"row",paddingBottom:1},he.createElement(Mt,{color:h.accent},f?"\u276F ":" "),he.createElement(Xt,{paddingLeft:1},he.createElement(Mt,{color:h.secondary2},`#${p+1} `),he.createElement(Yt,{id:m.authorId}),he.createElement(Mt,{color:h.secondary2}," "+Mn(vi(m.id))))),he.createElement(Xt,{paddingLeft:3,paddingBottom:1},he.createElement(Mt,{color:h.primary},Fg(m.md,l))))})))}import{Box as Do,Text as Ug}from"ink";import Pt from"react";var Bc=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=j(),{title:o}=t,s=t.parentNodeId?E.getNode(t.parentNodeId):void 0,i=s&&T(s)?o===Z.ASSIGNEES?s.props.assignees??[]:o===Z.TAGS?s.props.tags??[]:[]:[];return Pt.createElement(Do,{alignItems:"center",paddingTop:1},Pt.createElement(Do,{minWidth:12},Pt.createElement(ke,{isSelected:n}),Pt.createElement(Ug,{color:n?h.accent:h.secondary2},o,":")),Pt.createElement(Do,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,l)=>{let m=r.id===t.id&&l===e;return Pt.createElement(Do,{key:`${o}-${c}`,paddingRight:2,minHeight:1},Pt.createElement(ke,{isSelected:m}),o===Z.ASSIGNEES?Pt.createElement(Yt,{isSelected:m,id:c}):o===Z.TAGS?Pt.createElement(Un,{isSelected:m,id:c}):null)})))};import{Box as Bo,Text as yi}from"ink";import Lt,{useEffect as Og,useMemo as Fc}from"react";var _g="\u2029",Uc=(e,t)=>`${e}::inline-line::${t}`,hi=new Map,Oc=e=>{let t=hi.get(e)??[];hi.delete(e);for(let n of t)E.deleteNode(n)},$g=(e,t)=>{Oc(e);let n=[];t.forEach((r,o)=>{let s=Ge(BigInt(o+1));if(!Q(s))return;let i=E.createNode(ee.text({id:Uc(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));Q(i)&&n.push(i.value.id)}),hi.set(e,n)},xi=({id:e,label:t,text:n,height:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=j(),l=Fc(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=Fc(()=>l.join("\0"),[l]);Og(()=>($g(e,l),()=>{Oc(e)}),[e,m]);let p=g=>String(g).replace(/\r?\n/g,""),f=l.map((g,I)=>{let S=c.id===e&&i===I;return Lt.createElement(Bo,{key:Uc(e,I)},Lt.createElement(yi,{color:S?h.primary:h.secondary2,dimColor:!S},`${I+1} `.padStart(5,"\xA0")),Lt.createElement(yi,{backgroundColor:S?"gray":void 0},p(g.length?ln(g,s-10):_g)))});return Lt.createElement(Bo,{flexDirection:"column",paddingTop:1},Lt.createElement(Bo,null,Lt.createElement(ke,{isSelected:o}),Lt.createElement(yi,{color:o?h.accent:h.secondary2},t)),Lt.createElement(Bo,{flexDirection:"row",borderStyle:"round",borderColor:h.secondary,paddingLeft:1,marginLeft:1},Lt.createElement(tt,{scrollByOne:!0,height:r-3,selectedIndex:i,itemHeight:1},f)))};var Hg=e=>Ie(e,"description"),jg=e=>Ie(e,"comments"),Wg=e=>Ie(e,"history"),Vg=e=>Ie(e,"attachments"),_c=({ticket:e,height:t})=>{let n=Ir(()=>wc(e),[e]),{selectedIndex:r,contextNode:o}=j(),s=process.stdout.columns||120,i=Ir(()=>Hg(e.id),[e.id]),c=Ir(()=>jg(e.id),[e.id]),l=Ir(()=>Wg(e.id),[e.id]),m=Ir(()=>Vg(e.id),[e.id]),p=E.getAttachmentsByIssue(e.id).length,f=o.id===e.id,g=o.id===c||o.parentNodeId===c,I=o.id===l||o.parentNodeId===l,S=o.id===m||o.parentNodeId===m,R=z(e.id);if(g){let $=t-3;return Ce.createElement(xn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ce.createElement(Dc,{ticket:e,width:s,height:$}))}if(S){let $=t-3;return Ce.createElement(xn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ce.createElement(Lc,{ticket:e,width:s,height:$}))}if(I){let D=E.getNode(l),$=D&&Ve(D)?D.props.value??"":"",we=t-3;return Ce.createElement(xn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},D?Ce.createElement(xi,{id:D.id,label:"Event log",text:$,selected:!1,maxWidth:s,height:we}):null)}let A=R.reduce((D,$)=>ir($)||$.id===c||$.id===m||$.id===l?D+1:D,0),P=2,_=3,w=A,W=t-_-w-P,H=(D,$)=>D.id===i?Ce.createElement(xi,{key:D.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:$,maxWidth:s,height:W}):ir(D)?Ce.createElement(Bc,{key:D.id,parent:D,selected:$,selectedIndex:r}):D.id===c?Ce.createElement(xn,{key:D.id,paddingTop:1},Ce.createElement(ke,{isSelected:$}),Ce.createElement(bi,{backgroundColor:h.secondary,color:$?h.accent:h.primary},` Comments (${n}) \u203A\u203A `)):D.id===m?Ce.createElement(xn,{key:D.id,paddingTop:1},Ce.createElement(ke,{isSelected:$}),Ce.createElement(bi,{backgroundColor:h.secondary,color:$?h.accent:h.primary},` Attachments (${p}) \u203A\u203A `)):D.id===l?Ce.createElement(xn,{key:D.id,paddingTop:1},Ce.createElement(ke,{isSelected:$}),Ce.createElement(bi,{backgroundColor:h.secondary,color:$?h.accent:h.primary}," History \u203A\u203A ")):null;return Ce.createElement(xn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},R.map((D,$)=>H(D,f&&r===$)))};var Kg=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:i,width:c})=>{let l=t.context,m=l===B.TICKET||l===B.FIELD_LIST||l===B.FIELD,p=l===B.BOARD||l===B.SWIMLANE,f=l===B.TICKET?t:r.find(A=>A.context===B.TICKET),g=Math.floor(c/3),I=Math.floor(c/Math.max(e.length,1)),S=Math.min(I,g),R=s==="dense";return Fo.createElement(Gg,{flexDirection:"row",height:i},p&&e.map((A,P)=>{let _=t.id===A.id,w=_?n:-1,W=t.context===B.BOARD&&n===P;return Fo.createElement(Tc,{key:A.id,height:i,width:S,swimlane:A,isSelected:W,isDense:R,isFocused:_,listSelectedIndex:w,mode:o})}),m&&f&&Fo.createElement(_c,{height:i,ticket:f}))},Uo=Fo.memo(Kg);import{render as Yg}from"ink";import{Writable as Xg}from"node:stream";var Er=e=>String(e).padStart(2,"0"),Jg=e=>{let t=e.getUTCFullYear(),n=Er(e.getUTCMonth()+1),r=Er(e.getUTCDate()),o=Er(e.getUTCHours()),s=Er(e.getUTCMinutes()),i=Er(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},Qg=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Zg=async(e,{width:t,height:n})=>{let r="",o=new Xg({write(i,c,l){let m=ev(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),l()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=Yg(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},ev=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Hc=async()=>{let{viewMode:e}=K(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=v(),i=r.find(P=>P.context==="BOARD");if(!i)return a("No board found to export");let c=120,l=40,m=await Zg(qg.createElement(Uo,{height:l,width:c,swimlanes:(s[i.id]??[]).filter(P=>P!==void 0&&_t(P)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:l});if(!m)return a("Failed to render board export");let p=$r(process.cwd());if(d(p))return a("Unable to export, epiq root not found");let f=new Date,g=Jg(f),I=`board_${Qg(i.title)}_${g}.md`,S=Sa(p.value);$c.mkdirSync(S,{recursive:!0});let R=zg.join(S,I),A=`# Board - ${i.title}
47
47
  Date: ${f.toISOString()}
48
48
 
49
49
  \`\`\`text
50
50
  ${m}
51
51
  \`\`\`
52
- `;return gc.writeFileSync(A,M,"utf8"),l("Exported board layout",A)};var Ro=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 oR}from"react";var To,ig=new Set,yc=()=>{for(let e of ig)e()};var Vt=()=>{if(!To)throw new Error("Ui state not initialized. Call initUiState() first.");return To};var hc=(e={})=>(To=e,yc(),l("UX state initialized",null)),ag=e=>{let t=Vt();return To=e(t),yc(),l("UX state updated",null)},Kt=e=>ag(t=>({...t,...e}));import{spawn as dg}from"node:child_process";function yr(e){let t=process.platform,o=dg(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 ii}from"ulid";import{spawnSync as cg}from"node:child_process";import lg from"node:os";import xc from"node:path";import{ulid as ug}from"ulid";function mg(){let{preferredEditor:e}=K(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function pg(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function bc(e){let t=xc.join(lg.tmpdir(),"epiq");We.mkDir(t);let n=xc.join(t,ug());We.writeToFile(n,e??"");let r=mg();for(let o of r){let s=pg(o,n),i=cg(s,{stdio:"inherit",shell:!0});if(!i.error&&i.status===0){let c=We.readFile(n);if(c==null)return a("Unable to read edited file");let u=c.replace(/\r?\n$/,"");return l("Successfully edited",u)}}return a("Unable to open editor")}var Ic=async e=>{let{contextNode:t,selectedIndex:n}=g(),r=G(t.id)[n];if(e.modifier===He.DESCRIPTION)return gg();if(r&&er(r))return fg(e);if(e.modifier===He.TITLE){let o=ie();if(d(o))return a("Unable to resolve user ID");let s=r;if(!s)return a("Missing node");if(s.readonly)return a("Cannot rename readonly node");let i=e.inputString.trim();if(!i)return a("Provide a title");let c=await at();return d(c)?c:B([{id:ii(),action:"edit.title",payload:{id:s.id,name:i},...o.value}],c.value)}return a("Unknown edit command")},fg=async e=>{let t=ie();if(d(t))return a("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=g(),o=G(n.id)[r];if(!o||!er(o))return a("Select a comment first");if(o.readonly)return a("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return a("Unable to resolve comment issue");let i=g().nodes[s];if(!i||!R(i))return a("Unable to resolve comment issue");if(i.readonly)return a("Cannot edit readonly issue");let c=o.id.split(":").at(0)??"",u=I.getComment(c);if(!u||u.deleted)return a("Unable to resolve comment");if(u.issue!==i.id)return a("Comment does not belong to selected issue");if(u.authorId!==t.value.userId)return a("You can only edit your own comments"+u.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return a("Provide a comment");let p=await at();if(d(p))return p;let f=p.value;return B([{id:ii(),action:"edit.issue.comment",payload:{id:u.id,issue:i.id,md:m},...t.value}],f)},gg=async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let t=await at();if(d(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=g(),s=Le([...r,o],"TICKET");if(d(s))return a("Edit target must be an issue");let i=s.value;if(!R(i))return a("Edit target must be an issue");if(i.readonly)return a("Cannot edit readonly issue");let c=G(i.id).find(f=>f.title===Q.DESCRIPTION);if(!c)return a("No target found");if(c.readonly)return a("Cannot edit readonly field");let u=i.props.description??"";if(typeof u!="string")return a("Selected field is not editable text");let m=bc(u);if(d(m))return a("Failed to edit field");let p=m.value;return p===u?l("No changes made",null):B([{id:ii(),action:"edit.description",payload:{id:i.id,md:p},...e.value}],n)};import yg from"node:fs";import Sc from"node:path";import ai from"node:fs";import vg from"node:path";var Ec=async e=>{let t=vg.join(e,".gitignore"),n=ai.existsSync(t)?ai.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
53
- `).map(u=>u.trim()),s=r.filter(u=>!o.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(s.length===0)return l("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...s].join(`
52
+ `;return $c.writeFileSync(R,A,"utf8"),u("Exported board layout",R)};var Oo=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 RT}from"react";var _o,tv=new Set,jc=()=>{for(let e of tv)e()};var Jt=()=>{if(!_o)throw new Error("Ui state not initialized. Call initUiState() first.");return _o};var Wc=(e={})=>(_o=e,jc(),u("UX state initialized",null)),nv=e=>{let t=Jt();return _o=e(t),jc(),u("UX state updated",null)},Qt=e=>nv(t=>({...t,...e}));import{spawn as rv}from"node:child_process";function Sr(e){let t=process.platform,o=rv(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 Ci}from"ulid";import{spawn as ov,spawnSync as sv}from"node:child_process";import iv from"node:os";import Vc from"node:path";import{ulid as av}from"ulid";function Ii(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 dv(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function $o(){let{preferredEditor:e}=K(),t=[e?dv(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Ei(e){let[t=""]=Ii(e);return/(^|\/)code(-insiders)?$/.test(t)}function Gc(e,t){let[n="",...r]=Ii(e);return{command:n,args:[...r,...t]}}function Kc(e,t){return Gc(e,Ei(e)?["--wait",t]:[t])}function cv(e,t,n,r="new"){return Gc(e,[r==="new"?"--new-window":"--reuse-window","--diff",t,n])}function zc(e){let t=Vc.join(iv.tmpdir(),"epiq");be.mkDir(t);let n=Vc.join(t,av());be.writeToFile(n,e??"");let r=$o();for(let o of r){let{command:s,args:i}=Kc(o,n);if(!s)continue;let c=sv(s,i,{stdio:"inherit"});if(!c.error&&c.status===0){let l=be.readFile(n);if(l==null)return a("Unable to read edited file");let m=l.replace(/\r?\n$/,"");return u("Successfully edited",m)}}return a("Unable to open editor")}var lv=new Set(["vim","vi","nvim","nano","pico","ed"]);function uv(e){let[t=""]=Ii(e),n=t.split("/").pop()??t;return lv.has(n)}var mv=600;function qc({command:e,args:t},n){return new Promise(r=>{if(!e){r(a(`"${n}" is not a usable editor command`));return}let o=ov(e,t,{stdio:"ignore",detached:!0}),s=!1,i=l=>{s||(s=!0,clearTimeout(c),r(l))};o.on("error",l=>i(a(l.message))),o.on("exit",l=>{i(l===0?u("Opened editor",!0):a(`"${n}" exited with code ${l}`))});let c=setTimeout(()=>{o.unref(),i(u("Opened editor",!0))},mv)})}function pv(e,t){return uv(e)?Promise.resolve(a(`"${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}`)):qc(Kc(e,t),e)}function Si(e,t,n,r="new"){return qc(cv(e,t,n,r),e)}async function Yc(e){let t=$o();if(t.length===0)return a("No editor configured (preferredEditor, VISUAL, or EDITOR)");let n=a("Unable to open editor");for(let r of t){let o=await pv(r,e);if(!d(o))return o;n=o,logger.error(`Failed to open editor "${r}" for ${e}: ${o.message}`)}return n}var Xc=async e=>{let{contextNode:t,selectedIndex:n}=v(),r=z(t.id)[n];if(e.modifier===Ke.DESCRIPTION)return gv();if(r&&ar(r))return fv(e);if(e.modifier===Ke.TITLE){let o=ie();if(d(o))return a("Unable to resolve user ID");let s=r;if(!s)return a("Missing node");if(s.readonly)return a("Cannot rename readonly node");let i=e.inputString.trim();if(!i)return a("Provide a title");let c=await yt();return d(c)?c:U([{id:Ci(),action:"edit.title",payload:{id:s.id,name:i},...o.value}],c.value)}return a("Unknown edit command")},fv=async e=>{let t=ie();if(d(t))return a("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=v(),o=z(n.id)[r];if(!o||!ar(o))return a("Select a comment first");if(o.readonly)return a("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return a("Unable to resolve comment issue");let i=v().nodes[s];if(!i||!T(i))return a("Unable to resolve comment issue");if(i.readonly)return a("Cannot edit readonly issue");let c=o.id.split(":").at(0)??"",l=E.getComment(c);if(!l||l.deleted)return a("Unable to resolve comment");if(l.issue!==i.id)return a("Comment does not belong to selected issue");if(l.authorId!==t.value.userId)return a("You can only edit your own comments"+l.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return a("Provide a comment");let p=await yt();if(d(p))return p;let f=p.value;return U([{id:Ci(),action:"edit.issue.comment",payload:{id:l.id,issue:i.id,md:m},...t.value}],f)},gv=async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let t=await yt();if(d(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=v(),s=Ue([...r,o],"TICKET");if(d(s))return a("Edit target must be an issue");let i=s.value;if(!T(i))return a("Edit target must be an issue");if(i.readonly)return a("Cannot edit readonly issue");let c=z(i.id).find(f=>f.title===Z.DESCRIPTION);if(!c)return a("No target found");if(c.readonly)return a("Cannot edit readonly field");let l=i.props.description??"";if(typeof l!="string")return a("Selected field is not editable text");let m=zc(l);if(d(m))return a("Failed to edit field");let p=m.value;return p===l?u("No changes made",null):U([{id:Ci(),action:"edit.description",payload:{id:i.id,md:p},...e.value}],n)};import yv from"node:fs";import Qc from"node:path";import Ni from"node:fs";import vv from"node:path";var Jc=async e=>{let t=vv.join(e,".gitignore"),n=Ni.existsSync(t)?Ni.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
53
+ `).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(`
54
54
  `);return n=n.trimEnd()+`
55
55
 
56
56
  ${c}
57
- `,ai.writeFileSync(t,n,"utf8"),se.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var hg=async e=>{let t=await _({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},te=(e,t)=>a(`[${e}] ${t}`),Cc=async()=>{W("");let e=yn(),t=await dt(process.cwd());if(d(t))return te(1,t.message);let n=t.value,r=await Br(n);if(d(r))return te(2,r.message);if(r.value)return te(2,`Cannot initialize Epiq while a git operation is in progress: ${r.value}`);let o=await hg(n);if(d(o))return te(2.5,o.message);if(o.value)return te(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(us(n))return te(4,"Epiq project already initialized");let s=_t();if(!s.isSetupDone||!s.userName)return te(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let i=K(),c=i.userName,u=i.userId;if(!u||!c)return te(5,"Missing Epiq user id");let m=e.stateBranch,p=await Or({repoRoot:n,branch:m});if(d(p))return te(6,p.message);if(p.value)return te(6,`State branch already exists: ${m}`);let f=await Es({repoRoot:n,stateBranchName:m});if(d(f))return te(6,f.message);let b=Hr();if(d(b))return te(7,b.message);let C=Sc.join($r(),e.projectId),N=await tn({repoRoot:n,stateBranchRoot:C,stateBranchName:m});if(d(N))return te(8,N.message);let A=Sc.join(C,".epiq");yg.mkdirSync(A,{recursive:!0});let M=nd({userId:u,userName:c});if(d(M))return te(9,M.message);for(let ds of M.value){let ki=to({event:ds,rootDir:C});if(d(ki))return te(9,ki.message)}let U=await jr({stateBranchRoot:C,eventFileName:on({userId:u,userName:c})});if(d(U))return te(10,U.message);let j=await xn({cwd:C,message:"[epiq:init]"});if(d(j))return te(10,j.message);let D=await Ec(n);if(d(D))return te(11,D.message);let z=Oi({repoRoot:n,fileContents:e});if(d(z))return te(12,z.message);let $=await ce.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d($))return te(13,$.message);let P=await ce.commit({cwd:n,message:"[epiq:init-project]"});if(d(P))return te(13,P.message);let O="Project initialized!",Ge=await _({cwd:n,args:["push","-u","origin","HEAD"]});d(Ge)&&(O+=` Warn: [init:14] ${Ge.message}`);let Ce=await Qn({repoRoot:n,stateBranchRoot:C});d(Ce)&&(O+=` Warn: [init:15] ${Ce.message}`);let me=Ot(M.value).filter(d);if(me.length>0)return te(16,me.map(ds=>ds.message).join(`
58
- `));let le=Je();if(d(le))return te(16,le.message);let{rootNodeId:$n,nodes:Hn}=le.value,Li=Hn[$n];return Li?(T.navigate({contextNode:Li,selectedIndex:0}),E({hasProjectDefinition:!0,mode:v.DEFAULT}),l(O,null)):te(16,"Unable to resolve initialized root node")};import{ulid as bg}from"ulid";import{ulid as xg}from"ulid";var Nc=null,Gt=()=>structuredClone(Nc),hr=e=>{Nc=e},Ac=()=>{let{contextNode:e,selectedIndex:t}=g(),r=q(e.id)[t];return r?l("Resolved selected child",r):a("Target node not found")},di=({id:e,parentId:t,position:n={at:"end"}})=>{let r=q(t).filter(o=>o.id!==e);return no(r,n)},Rc=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ie();if(d(r))return a("Unable to resolve user ID");let o=di({parentId:t,id:e,position:n});return d(o)?o:l("Created pending move state",{id:xg(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Tc=e=>{hr(e);let t=Ut(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function ci(e){let t=Ac();if(d(t))return t;let{contextNode:n,nodes:r}=g();if(!n.parentNodeId)return a("Missing parent node id");let o=r[n.parentNodeId];if(!o)return a("Missing parent node");let s=q(o.id),i=s.findIndex(({id:m})=>m===n.id);if(i<0)return a("Current node not found among siblings");let c=s[i+e];if(!c)return a("Missing sibling node");let u=Rc({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:Tc(u.value)}function li(e){let t=Ac();if(d(t))return t;let{contextNode:n,selectedIndex:r}=g(),s=q(n.id)[r+e];if(!s)return a("Missing sibling node");let i=Rc({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(i)?i:Tc(i.value)}var wc=()=>{let e=Gt();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,r=g().nodes[n];if(!r)return a("Move parent not found");let o=q(n).findIndex(s=>s.id===t);return o===-1?a("Moved node not found among rendered children"):(T.navigate({contextNode:r,selectedIndex:o}),l("Synchronized navigation to moved node",null))},wo=(e,t="Moved preview")=>{if(d(e))return e;let n=wc();return d(n)?n:(E({mode:v.MOVE}),l(t,null))},Mc=async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=Y().commandMeta,{contextNode:n,selectedIndex:r}=g(),o=q(n.id)[r];if(!o)return E({mode:v.DEFAULT}),a("No move target");if(t==="start"){if(o.readonly)return a("Target node is read-only");if(r===-1)return a("No item selected");if(!o.parentNodeId)return a("Target has no parent");let s=q(o.parentNodeId),i=s.findIndex(({id:f})=>f===o.id);if(i===-1)return a("Target not found among siblings");let c=s[i-1],u=s[i+1],m=u!=null?{at:"before",sibling:u.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=di({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(hr({id:bg(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),E({mode:v.MOVE}),l("Move initialized",null))}if(t==="next")return wo(li(1));if(t==="previous")return wo(li(-1));if(t==="to-next")return wo(ci(1));if(t==="to-previous")return wo(ci(-1));if(t==="confirm"){let s=Gt();if(!s)return a("No pending move to confirm");let i=await at();if(d(i))return i;let c=B([s],i.value);if(d(c))return c;let u=wc();return d(u)?u:(hr(null),E({mode:v.DEFAULT}),l("Moved item",null))}return t==="cancel"?(hr(null),E({mode:v.DEFAULT}),l("Cancelling move",null)):a("Invalid move modifier")};import{ulid as Po}from"ulid";import{monotonicFactory as Ig,ulid as Eg}from"ulid";var Sg=Ig(),Mo=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=Sg();return l("Created issue events",[{id:Eg(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var Pc=async(e,t)=>{let n=ie();if(d(n))return a("Unable to resolve user ID");let r=await at();if(d(r))return r;let o=r.value;if(!t.inputString)return a(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:c}=g(),u=m=>{let p=B([m],o);if(d(p))return p;let f=I.getNode(p.value[0].result.id);if(!f)return a("Created node not found");if(!f.parentNodeId)return p;let b=I.getNode(f.parentNodeId);return b?(T.navigate({contextNode:b,selectedIndex:I.getSiblings(f.parentNodeId).findIndex(({id:C})=>C===f.id)}),p):a("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=g(),p=I.getNode(m);if(!p)return a("Workspace not found");let f=Nn(p.id,n.value,o);return d(f)?f:u({id:Po(),action:"add.board",payload:{id:Po(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=Le(s,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=Nn(m.value.id,n.value,o);return d(p)?p:u({id:Po(),action:"add.swimlane",payload:{id:Po(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=G(i.id)[c],p=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let j=Le(s,"SWIMLANE");return d(j)?null:j.value})();if(!p)return a("Unable to add issue in this context");let f=Nn(p.id,n.value,o);if(d(f))return f;let b=Mo({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(d(b))return b;let C=b.value,N=B([...C],o);if(d(N))return N;if(!N.value[0])return a("Issue creation failed");let U=C.find(j=>j.action==="add.issue")?.payload.id;return U?(T.navigate({contextNode:p,selectedIndex:I.getSiblings(p.id).findIndex(({id:j})=>j===U)}),l("Issue created",null)):a("Unable to determine ticket id")}return l("Success",null)};var Lo=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=g(),s=$a(n,t);if(d(s))return a(s.message);let{appliedEvents:i,unappliedEvents:c}=s.value,u=zt();if(d(u))return u;let p=Ot(i).filter(d);if(p.length>0)return zt(),E(o),a(p.map(b=>b.message).join(", "));let f=g().nodes[e];return f?(T.navigate({contextNode:f,selectedIndex:r}),l("",{unappliedEvents:c})):(zt(),E(o),a("Board did not exist at that date"))};var Cg=20,Ng=16,Ag=150,ko=null,Do=null;var fn=()=>{ko!==null&&(clearInterval(ko),ko=null),Do!==null&&(clearTimeout(Do),Do=null)},Lc=()=>{fn(),E({mode:v.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Rg=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)},kc=({events:e,startTime:t,durationMs:n})=>{fn();let r=e.length,o=e.map(f=>Cn(f)??t),s=o[r-1]??Date.now(),i=Rg(o),c=Math.max(1,Math.round(n*Cg/1e3)),u=Math.max(Math.round(n/c),Ng),m=0,p=0;E({mode:v.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),ko=setInterval(()=>{m++;let f=m/c,b=[],C;for(;p<r&&i[p]<=f;){let A=e[p],M=Ut(A);if(d(M)){Lc();return}b.push(...Ms(A)),C=A,p++}if(p>=r||m>=c){for(;p<r;p++){let M=Ut(e[p]);if(d(M))break}let A=g().replay;E({unappliedEvents:[],replay:A&&{...A,progress:1,appliedCount:r}}),fn(),Do=setTimeout(Lc,Ag);return}let N=g().replay;E({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:C?Cn(C)??N?.currentTime??t:N?.currentTime??t,currentLabel:C?ka(C):N?.currentLabel??"",flashNodeIds:C?[...new Set(b)]:N?.flashNodeIds??[]}})},u)};var Dc=async()=>{let e=Le(g().breadCrumb,"BOARD");if(d(e))return e;let t=await dt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Pe({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=Y().commandMeta;if(fn(),r==="now"){let c=Et(n.value);if(d(c))return a(c.message);let u=zt();if(d(u))return u;let p=Ot(c.value).filter(d);return p.length>0?a(p.map(f=>f.message).join(", ")):(E({mode:v.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[],replay:null}),l("Peeking now",!0))}let s;if(r==="prev"){let c=g().eventLog.at(-1),u=Cn(c);if(u===null)return a("No previous event to peek");s=u}else if(r==="next"){let c=g().unappliedEvents.at(0),u=Cn(c);if(u===null)return a("No next event to peek");s=u+1}else{let c=cn(r||o.trim());if(!c)return a("Invalid peek date");s=c.getTime()}let i=Lo({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return d(i)?i:(E({mode:v.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),l("Peeking",!0))};var Fc=async()=>{let e=Le(g().breadCrumb,"BOARD");if(d(e))return e;let t=await dt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Pe({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=Y().commandMeta,{dateInput:s,durationInput:i}=mo(r,o);if(fn(),g().syncStatus.status==="syncing")return a("Cannot replay while syncing, try again in a moment");let c=cn(s);if(!c)return a("Invalid replay date");let u=i?uo(i):15e3;if(u===null)return a("Invalid replay duration (try e.g. 30s or 2m)");let m=c.getTime(),p=g(),f=Lo({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(d(f))return f;let{unappliedEvents:b}=f.value;return b.length===0?(zt(),E(p),l("Nothing to replay from that point",!0)):(kc({events:b,startTime:m,durationMs:u}),l("Replaying board history",!0))};import wg from"zod";var Bc=()=>{let e=Y().commandMeta.inputString,t=wg.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return a("Auto sync duration must be a number of at least 3000 ms");let n=Ze({autoSyncDebounceMs:t.data});return d(n)?n:(Fe({autoSyncIntervalMs:t.data}),E({mode:v.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var Uc=()=>{let e=Y().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=cd(e),n=Ze({autoSync:t});return d(n)?n:(Fe({autoSync:t}),E({mode:v.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Oc=()=>{let e=Y().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=Ze({logLevel:e});return d(n)?n:(Fe({logLevel:e}),E({mode:v.DEFAULT}),l(`Auto sync set to "${e}"`,null))};import{spawn as Mg}from"node:child_process";var Pg=()=>{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"]}}},_c=async e=>new Promise(t=>{let{command:n,args:r}=Pg();try{let o=Mg(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(a(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?l("Copied to clipboard",null):a(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(a(`Clipboard tool not available (${n})`))}});var xr=async(e,t)=>{if(!e.trim())return a(`Nothing to copy: ${t} is empty`);let n=await _c(e);return d(n)?n:l(`Copied ${t} to clipboard`,null)},$c=async e=>{let{breadCrumb:t,selectedNode:n}=g(),r=ar({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return a("Nothing selected to copy from");switch(e.modifier){case fe.REF:return xr(Ue(o.id),"ref");case fe.TITLE:return xr(o.title,"title");case fe.DESCRIPTION:return r?xr(r.props?.description??"","description"):a("No issue in scope");case fe.TAGS:{if(!r)return a("No issue in scope");let s=$t(r).map(({name:i})=>i);return xr(s.join(", "),"tags")}case fe.ASSIGNEES:{if(!r)return a("No issue in scope");let s=Ht(r).map(({name:i})=>i);return xr(s.join(", "),"assignees")}default:return a("Yank one of: ref, title, description, tags, assignees")}};var Hc=async()=>{W(""),E({mode:v.DEFAULT});let e=Je();if(d(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");E({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await so();return d(t)?(E({syncStatus:{msg:t.message,status:"failed"}}),t):(E({mode:v.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var Lg=e=>e.action==="add.issue.comment",Wc=e=>Object.values(g().tags).find(t=>t.name===e),jc=e=>Object.values(g().contributors).find(t=>t.name===e),wt=async()=>{let e=await at();return d(e)?e:l("Resolved persist root",e.value)},Fo=[{systemOnly:!0,intent:w.Move,description:"Internal move-state command",mode:v.COMMAND_LINE,action:Mc},{intent:w.Delete,description:"Delete the currently selected node",mode:v.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=G(t.id)[n];if(!r)return a("Unable to resolve child to delete");let o=await wt();if(d(o))return o;if(r.context==="COMMENT"){let s=r.id,i=R(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let c=g().nodes[i];if(!c||!R(c))return a("Unable to resolve comment issue");let u=c.log?.filter(Lg).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?a("You can only delete your own comments"):B([{id:we(),action:"delete.issue.comment",payload:{id:s,issue:i},...e.value}],o.value):a("Unable to resolve comment")}return B([{id:we(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:v.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=Y().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(i=>ae(x.FILTER).map(c=>c.split(n)[0]).includes(i))(r))return a("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return he(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:v.DEFAULT})),l("Filter updated",null)}},{intent:w.ViewHelp,description:"Open the help screen",mode:v.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=g();return Kt({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),E({mode:v.HELP}),l("Viewing help",null)}},{intent:w.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:v.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=G(t.id)[n];if(!r)return a("Unable to close issue, no target found");if(!R(r))return a("Cannot close in this context");let o=g().nodes[pe];if(!o)return a("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return a("Issue is already closed");let s=await wt();if(d(s))return s;let i=s.value,c=sn(o.id,r.id,{at:"end"},e.value,i);if(d(c))return c;let u=B([{id:we(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value}],i);return d(u)?u:l("Issue closed",null)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:v.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=G(t.id)[n];if(!r)return a("Unable to reopen issue, no target found");let o=r.context==="TICKET"?l("Resolved ticket",r):It(r.id,"TICKET");if(d(o))return a("Cannot reopen in this context");let s=o.value,i=g().nodes[pe];if(!i)return a("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return a("Issue is not closed");if(!R(s))return a("Target node is not issue");let c=Ro(s);if(!c)return a("Unable to resolve previous parent from issue history");if(c===i.id)return a("Previous parent resolves to closed swimlane");let u=g().nodes[c];if(!u)return a("Previous parent no longer exists");let m=await wt();if(d(m))return m;let p=m.value,f=sn(u.id,s.id,{at:"end"},e.value,p);if(d(f))return f;let b=B([{id:we(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:f.value},...e.value}],p);return d(b)?b:l("Issue reopened",null)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.Init,description:"Initialize Epiq in the current git repository",mode:v.COMMAND_LINE,action:Cc},{intent:w.NewItem,description:"Create a new board, swimlane, or issue",mode:v.COMMAND_LINE,action:Pc,onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.Rename,description:"Rename the currently selected node",mode:v.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=G(t.id)[n];if(!r)return a("Missing node");if(r.readonly)return a("Cannot rename readonly node");let o=qd();if(!o)return a("Provide a title");let s=await wt();return d(s)?s:B([{id:we(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.UntagTicket,description:"Remove a tag from the selected issue",mode:v.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=Y().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let o=Wc(r);if(!o)return a(`Tag "${r}" does not exist`);let{selectedNode:s}=g();if(!s)return a("Invalid untag target");let i=It(s.id,"TICKET");if(d(i))return a("Unable to untag issue in this context");let c=i.value;if(!R(c))return a("Target node is not issue");if(!(c.props.tags??[]).includes(o.id))return a("Issue is not tagged with that tag");let m=await wt();return d(m)?m:B([{id:we(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}],m.value)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.TagTicket,description:"Add or create a tag on the selected issue",mode:v.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=Y().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let{selectedNode:o}=g();if(!o)return a("Invalid tag target");let s=It(o.id,"TICKET");if(d(s))return a("Unable to tag issue in this context");let i=s.value;if(!R(i))return a("Target node is not issue");let c=await wt();if(d(c))return c;let u=Wc(r),m=u?.id??we();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):B([...u?[]:[{id:we(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:we(),action:"add.issue.tag",payload:{id:i.id,tag:m},...e.value}],c.value)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.AssignUserToTicket,description:"Assign a user to the selected issue",mode:v.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=Y().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee");let{selectedIndex:o,contextNode:s}=g(),i=G(s.id)[o];if(!i)return a("Invalid assign target");let c=It(i.id,"TICKET");if(d(c))return a("Unable to assign issue in this context");let u=c.value;if(!R(u))return a("Target node is not issue");let m=await wt();if(d(m))return m;let p=jc(r),f=p?.id??we();return(u.props.assignees??[]).includes(f)?a("Assignee already assigned"):B([...p?[]:[{id:we(),action:"create.contributor",payload:{id:f,name:r},...e.value}],{id:we(),action:"add.issue.assignee",payload:{id:u.id,assignee:f},...e.value}],m.value)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:v.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=Y().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee to remove");let o=jc(r);if(!o)return a(`Assignee "${r}" does not exist`);let{selectedNode:s}=g();if(!s)return a("Invalid unassign target");let i=It(s.id,"TICKET");if(d(i))return a("Unable to unassign in this context");let c=i.value;if(!R(c))return a("Target node is not issue");if(!(c.props.assignees??[]).includes(o.id))return a(`Issue is not assigned to "${r}"`);let m=await wt();return d(m)?m:B([{id:we(),action:"remove.issue.assignee",payload:{id:c.id,assignee:o.id},...e.value}],m.value)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.Comment,description:"Add a comment to the selected issue",mode:v.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return a("Provide a comment");if(n.length>Pn)return a(`Cannot exceed ${Pn} characters`);let r=ie();if(d(r))return a("Unable to resolve user ID");let{breadCrumb:o,selectedNode:s}=g(),i=Le([...o,s],"TICKET");if(d(i))return a("Edit target must be an issue");let c=i.value;if(!c)return a("Invalid comment target");let u=c.context==="TICKET"?l("Resolved ticket",c):It(c.id,"TICKET");if(d(u))return a("Unable to comment on issue in this context");let m=u.value;if(!R(m))return a("Target node is not issue");let p=await wt();return d(p)?p:B([{id:we(),action:"add.issue.comment",payload:{id:we(),issue:m.id,author:r.value.userId,md:n},...r.value}],p.value)},onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.Sync,description:"Pull, commit, and push Epiq state",mode:v.COMMAND_LINE,action:Hc},{intent:w.Peek,description:"View board state at another point in time",mode:v.COMMAND_LINE,action:Dc},{intent:w.Replay,description:"Replay board history forward from a point in time",mode:v.COMMAND_LINE,action:Fc},{intent:w.Export,description:"Export the current board layout to markdown",mode:v.COMMAND_LINE,action:async()=>{let e=await vc();return d(e)?e:(E({mode:v.DEFAULT}),l("Export successful",!0))}},{intent:w.Exit,description:"Exit the application",mode:v.COMMAND_LINE,action:async()=>(T.exit(),l("Exit successful",!0))},{intent:w.Edit,description:"Edit title or description",mode:v.COMMAND_LINE,action:async(e,t)=>Ic(t),onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:v.COMMAND_LINE,action:async(e,t)=>$c(t),onSuccess:()=>E({mode:v.DEFAULT})},{intent:w.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:v.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case re.USERNAME:{let{userId:r,preferredEditor:o,userName:s}=K(),i=n||s,c=r??we();if(!i||!c)return a("Unable to resolve user name or id");let u=Ze({userName:i,userId:c,preferredEditor:o??""});return d(u)?u:(Fe({userName:i,userId:c}),E({mode:v.DEFAULT}),l(`Username set to "${i}"`,null))}case re.EDITOR:{if(!n)return a("No editor provided");let r=Ze({preferredEditor:n});return d(r)?r:(Fe({preferredEditor:n}),E({mode:v.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case re.VIEW:{if(n!=="wide"&&n!=="dense")return a("Invalid view mode");let r=Ze({viewMode:n});return d(r)?r:(Fe({viewMode:n}),E({mode:v.DEFAULT}),l(`View set to "${n}"`,null))}case re.AUTOSYNC:return Uc();case re.LOG_LEVEL:return Oc();case re.SYNC_DEBOUNCE_MS:return Bc();case re.ATTACHMENT_MAX_KB:return Td();default:return a("Unknown config command")}}},{intent:w.Coffee,description:"Sponsor the development of Epiq!",mode:v.COMMAND_LINE,action:()=>{let e=Y().commandMeta.modifier;return e==="custom"?yr("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):yr(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),W(""),l("Thanks you!",null)}}];var kg=new Set(["peek","replay","filter","view-help","yank"]),vt=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=Y();if(!t)return a("No command to confirm");if(!e&&n===pt.Invalid)return a("Invalid command");let s=xo(t);jd();let{readOnly:i}=g();if(i&&!kg.has(s))return mr({status:Pt.Fail,message:"Command not available in readonly state",value:null});let c=Fo.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return mr({status:Pt.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return mr({status:Pt.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?mr(u):(Vd({addToHistory:!e}),c.onSuccess?.(),K().autoSync&&ao(),u)};var Bo=[{intent:h.Exit,mode:v.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(E({mode:v.COMMAND_LINE}),W("move cancel"),vt({isForceExecutedBySystem:!0}))},{intent:h.InitMove,mode:v.DEFAULT,description:"[m] move (init/confirm)",action:()=>(E({mode:v.COMMAND_LINE}),W("move start"),vt({isForceExecutedBySystem:!0}))},{intent:h.ConfirmMove,mode:v.MOVE,action:()=>(E({mode:v.COMMAND_LINE}),W("move confirm"),vt({isForceExecutedBySystem:!0}))}],Uo=[{intent:h.MovePreviousItem,mode:v.MOVE,action:()=>Gt()?(E({mode:v.COMMAND_LINE}),W("move previous"),vt({isForceExecutedBySystem:!0})):a("No pending move")},{intent:h.MoveNextItem,mode:v.MOVE,action:()=>Gt()?(E({mode:v.COMMAND_LINE}),W("move next"),vt({isForceExecutedBySystem:!0})):a("No pending move")}],Vc=[{intent:h.MoveToNextContainer,mode:v.MOVE,action:()=>Gt()?(E({mode:v.COMMAND_LINE}),W("move to-next"),vt({isForceExecutedBySystem:!0})):a("No pending move")},{intent:h.MoveToPreviousContainer,mode:v.MOVE,action:()=>Gt()?(E({mode:v.COMMAND_LINE}),W("move to-previous"),vt({isForceExecutedBySystem:!0})):a("No pending move")}];var Kc={[L.WORKSPACE]:[...Bo,...Uo],[L.BOARD]:[...Bo,...Uo],[L.SWIMLANE]:[...Bo,...Uo,...Vc],[L.TICKET]:[],[L.FIELD]:[],[L.FIELD_LIST]:[],[L.TEXT]:[],[L.COMMENT]:[]};import Dg from"node:fs";import Fg from"node:path";var Gc=e=>{let t=qe(process.cwd());if(d(t))return a("Unable to resolve project root");let n=Pe({repoRoot:t.value});if(d(n))return a(n.message);let r=Mn(e.hash,e.ext),o=Fg.join(Gn(n.value),r);return Dg.existsSync(o)?(yr(o),l(`Opened ${e.name}`,null)):a("Attachment file not found \u2014 run :sync to fetch it")};var zc=()=>{W("");let{pendingNavTarget:e}=Vt();E({mode:v.DEFAULT}),e&&T.navigate(e),Kt({pendingNavTarget:void 0})},qc=[{intent:h.ExitCommandLine,mode:v.HELP,action:()=>(zc(),l("Exiting help",null))},{intent:h.Exit,mode:v.HELP,action:()=>(zc(),l("Closed help",null))},{intent:h.NavPreviousItem,mode:v.HELP,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:h.NavNextItem,mode:v.HELP,action:()=>(T.navigateToNextItem(),l("Navigating to next help item",null))},{intent:h.NavToPreviousContainer,mode:v.HELP,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:h.NavToNextContainer,mode:v.HELP,action:()=>(T.navigateToNextContainer(),l("Navigating to next help container",null))}];var Bg=e=>{E({mode:v.COMMAND_LINE});let{pendingNavTarget:t}=Vt();t&&T.navigate(t),Kt({pendingNavTarget:void 0}),W(`${e} `)},Yc=()=>{W("");let{pendingNavTarget:e}=Vt();e&&T.navigate(e),Kt({pendingNavTarget:void 0}),E({mode:v.DEFAULT})},Xc=[{intent:h.InitCommandPalette,mode:v.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{W("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=g();return Kt({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),E({mode:v.PALETTE}),l("Opening command palette",null)}},{intent:h.Confirm,mode:v.PALETTE,action:()=>{let{selectedNode:e}=g();if(!e||!kt(e))return a("Command only applicable on text nodes");if(e.props.disabled)return a("Command is not available in this context");let t=e.title;return t?(Bg(t),l("Selected command",t)):l("No command selected",null)}},{intent:h.ExitCommandLine,mode:v.PALETTE,action:()=>(Yc(),l("Exiting palette",null))},{intent:h.Exit,mode:v.PALETTE,action:()=>(Yc(),l("Closed command palette",null))},{intent:h.NavPreviousItem,mode:v.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:h.NavNextItem,mode:v.PALETTE,action:()=>(T.navigateToNextItem(),l("Navigating to next item",null))},{intent:h.NavToPreviousContainer,mode:v.PALETTE,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:h.NavToNextContainer,mode:v.PALETTE,action:()=>(T.navigateToNextContainer(),l("Navigating to next container",null))}];var Jc=[...qc,...Xc,{intent:h.AddItem,mode:v.DEFAULT,description:"[n] new...",action:()=>(E({mode:v.COMMAND_LINE}),W(`${x.NEW} `),l("Adding new item",null))},{intent:h.Delete,mode:v.DEFAULT,description:"[d] delete",action:()=>(E({mode:v.COMMAND_LINE}),W(`${x.DELETE} `),l("Deleting item",null))},{intent:h.InitCommandLine,mode:v.DEFAULT,description:"[:] focus command line",action:()=>(E({mode:v.COMMAND_LINE}),W(""),l("Entering command line mode",null))},{intent:h.Confirm,mode:v.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=g();if(!q(e?.id??"")?.length){let r=e?I.getAttachment(e.id):void 0;if(r)return Gc(r);if(e?.title===Q.DESCRIPTION)return E({mode:v.COMMAND_LINE}),W(`${x.EDIT} description `),l("Propose command",!0);if(e?.title===Q.ASSIGNEES)return E({mode:v.COMMAND_LINE}),W(`${x.ASSIGN} `),l("Propose command",!0);if(e?.title===Q.TAGS)return E({mode:v.COMMAND_LINE}),W(`${x.TAG} `),l("Propose command",!0);if(t.title===Q.DESCRIPTION&&e?.context==="TEXT")return E({mode:v.COMMAND_LINE}),W(`${x.EDIT} description `),l("Propose command",!0)}return T.enterChildNode(),l("Entering context",null)}},{intent:h.Yank,mode:v.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=g(),t=e?.title===Q.DESCRIPTION?fe.DESCRIPTION:e?.title===Q.TAGS?fe.TAGS:e?.title===Q.ASSIGNEES?fe.ASSIGNEES:fe.REF,r=ae(x.YANK).includes(t)?t:fe.REF;return E({mode:v.COMMAND_LINE}),W(`${x.YANK} ${r}`),l("Propose command",!0)}},{intent:h.EditTitle,mode:v.DEFAULT,description:"[r] rename title",action:()=>(E({mode:v.COMMAND_LINE}),W(`${x.EDIT} title ${g().selectedNode?.title}`),l("Exiting context",null))},{intent:h.EditDescription,mode:v.DEFAULT,description:"[e] edit description",action:()=>(E({mode:v.COMMAND_LINE}),W(`${x.EDIT} description `),l("Exiting context",null))},{intent:h.Exit,mode:v.DEFAULT,description:"[q] exit context",action:()=>(T.enterParentNode(),l("Exiting context",null))},{intent:h.NavPreviousItem,mode:v.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:h.NavNextItem,mode:v.DEFAULT,action:()=>(T.navigateToNextItem(),l("Navigating to next item",null))},{intent:h.NavToPreviousContainer,mode:v.DEFAULT,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:h.NavToNextContainer,mode:v.DEFAULT,action:()=>(T.navigateToNextContainer(),l("Navigating to next container",null))}];var Ug=500,Og=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Qc=e=>{let t=Og(e);t&&ho(n=>(n+t).slice(0,Ug))};var _g=[v.COMMAND_LINE,v.PALETTE],$g=e=>[{intent:h.MoveCursorLeft,mode:e,action:()=>(Xs(-1),l("Moving cursor left",null))},{intent:h.MoveCursorRight,mode:e,action:()=>(Xs(1),l("Moving cursor right",null))},{intent:h.MoveCursorLeftOfWord,mode:e,action:()=>(Js("left"),l("Moving cursor left of word",null))},{intent:h.MoveCursorRightOfWord,mode:e,action:()=>(Js("right"),l("Moving cursor right of word",null))},{intent:h.AutoCompleteCommand,mode:e,action:()=>(ho((t,{remainder:n})=>{let r=n?t+n:t,o="";return r==="edit title "&&(o=g().selectedNode?.title??""),r+o}),l("Auto-completing command",null))},{intent:h.CaptureInput,mode:e,action:(t,{sequence:n})=>(Qc(n??""),l("Capturing input",null))},{intent:h.EraseInput,mode:e,action:()=>(Hd(),l("Erasing input",null))},{intent:h.EraseInputWord,mode:e,action:()=>(Wd(),l("Erasing input word",null))}],Zc=[{intent:h.Confirm,mode:v.COMMAND_LINE,action:()=>(vt(),l("Executing command",null))},{intent:h.ViewHelp,mode:v.DEFAULT,action:()=>(E({mode:v.HELP}),l("Viewing help",null))},..._g.flatMap($g),{intent:h.ExitCommandLine,mode:v.COMMAND_LINE,action:()=>(E({mode:v.DEFAULT}),l("Exiting command line",null))},{intent:h.GetLastCommandFromHistory,mode:v.COMMAND_LINE,action:()=>(Kd(),l("Getting last command from history",null))},{intent:h.GetNextCommandFromHistory,mode:v.COMMAND_LINE,action:()=>(Gd(),l("Getting next command from history",null))}];import nl from"chalk";var Oo=nl.dim.hex(y.secondary2)(": for command line"),el="q to exit",tl=`${nl.hex(y.accent)("m")} to confirm`,ui={[L.WORKSPACE]:[Oo],[L.BOARD]:[Oo],[L.BOARD+v.COMMAND_LINE]:[Oo],[L.SWIMLANE]:[Oo],[L.TICKET+v.HELP]:[el],[L.SWIMLANE+v.HELP]:[el],[L.TICKET]:[],[L.FIELD]:[],[L.SWIMLANE+v.MOVE]:[tl],[L.TICKET+v.MOVE]:[tl]};var br=e=>e.trim().toLocaleLowerCase(),Hg=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},Wg=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},rl=(e,t)=>{let n=br(t.value);if(!n)return!0;switch(t.target){case"title":return br(e.title??"").includes(n);case"description":return br(e.props.description??"").includes(n);case"tag":return Hg(e).map(br).some(o=>o.includes(n));case"assignee":return Wg(e).map(br).some(o=>o.includes(n));case"ref":return Ea(e.id,t.value);default:return!0}};function ol(e,t,n){let r=t[e];if(!r)return a("buildBreadCrumb(): current node not found");let o=[],s=r;for(;s&&(o.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let i=o[o.length-1];return!i||i.id!==n?a("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var sl=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 gn,mi,pi=new Set,il=()=>{for(let e of pi)e()},Vg=e=>(pi.add(e),()=>pi.delete(e));function al(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return a("derive(): contextNodeId is missing");if(!r)return a("derive(): rootNode is missing");if(!o[r])return a("derive(): unable to find root node");let c=o[t];if(!c)return a("Unable to derive state, contextNode not found");let u=ol(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,f=ui[p+n]??ui[p]??[],b=[...Jc,...Kc[p]??[],...Zc],C=sl(b),N=Kg(o,s),A=N[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:f,availableActions:b,actionIndex:C,selectedNode:A,renderedChildrenIndex:N})}var g=()=>{if(!gn)throw new Error("State not initialized. Call initWorkspaceState() first.");return gn},Je=()=>gn?l("Retrieved state",gn):a("State not initialized. Call initWorkspaceState() first.");function rr(e){mi=e;let t=qe(process.cwd()),n=!1;if(!d(t)){let s=Lt(t.value);if(d(s))return a(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:v.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=al(r);return d(o)?o:(gn=o.value,il(),l("State initialized",null))}function he(e){let t=g(),n=e(t),r=al(n);return d(r)?a(r.message??"Unable to update state"):(gn=r.value,il(),l("State updated",null))}var E=e=>he(t=>({...t,...e}));var H=()=>jg(Vg,g,g),Kg=(e,t)=>{let n={};for(let r of Object.values(e))R(r)&&t.length>0&&!t.every(o=>rl(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 i=e[o.id],c=e[s.id];return!i||!c?0:i.rank.localeCompare(c.rank)});return n},G=e=>g()?.renderedChildrenIndex[e]??[],zt=()=>mi?rr(mi):a("Cannot reset state: no initial workspace found"),Rn=()=>gn!==void 0;var fi=e=>{Rn()&&(E({syncStatus:e}),nn({type:"sync-status",payload:e}))},_o=(e="Syncing...")=>{fi({status:"syncing",msg:e})},$o=(e="Synced")=>{fi({status:"synced",msg:e})},gi=e=>{fi({status:"failed",msg:e})},Qe=e=>(gi(e),a(e));import{decodeTime as rk}from"ulid";var Gg=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=X("getRepoRootDir",await dt(e));if(d(n))return a(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=X("getStateBranchRoot",Pe({repoRoot:r}));if(d(o))return a(o.message);let s=o.value;logger.debug("[sync] state branch root",s);let i=X("ensureInitialCommit",await ra(r));if(d(i))return a(i.message);logger.debug("[sync] initial commit result",{created:i.value}),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:s,ensureUpstream:t});let c=X("bootstrapStateBranchStorage",await ia({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(d(c))return a(c.message);logger.debug("[sync] bootstrap result",{bootstrapped:c.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let u=X("hasInProgressGitOperation(stateBranchRoot)",await Br(s));if(d(u))return a(u.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:u.value}),u.value)return logger.info("[sync] state branch git operation in progress"),a("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:s});let m=X("ensureStateBranchLayout",ea(r,s));return d(m)?a(m.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:c.value}),l("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:c.value}))},zg=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=X("stageStateBranchOwnEventFile",await jr({stateBranchRoot:t,eventFileName:n}));if(d(r))return a(r.message);let o=X("stageStateBranchMediaFiles",await oa({stateBranchRoot:t}));if(d(o))return a(o.message);let s=X("hasStagedChanges(after stage)",await zi(t));if(d(s))return a(s.message);if(logger.debug("[sync] state branch change check after stage result",{changed:s.value}),!s.value)return logger.info("[sync] no own event file changes to commit"),l("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let i=X("createStateBranchSyncCommit",await sa({repoRoot:e,stateBranchRoot:t}));return d(i)?a(i.message):(logger.debug("[sync] created sync commit",i.value),l("Committed own event file",{createdCommit:!0,commitSha:i.value}))},io=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.debug("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.error("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),a("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),a("Own event file must end with .jsonl");_o();let n=X("ensureSyncReady",await Gg({cwd:e,ensureUpstream:!0}));if(d(n))return Qe(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,i=X("isDetachedHead(stateBranchRoot)",await qi(o));if(d(i))return Qe(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return Qe("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,f=X("getStateBranch",hn(r));if(d(f))return Qe(f.message);let b=f.value;logger.debug("[sync] resolved state branch",{stateBranch:b,stateBranchRoot:o});let C=X("commitOwnEventFileToStateBranch",await zg({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(C))return Qe(C.message);c=C.value.createdCommit,u=C.value.commitSha;let N=X("pullBranchRebaseIfPresent",await xs({cwd:o,branch:b}));if(d(N))return Qe(N.message);if(m=N.value,c||s){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:o});let A=X("pushStateBranch",await Qn({stateBranchRoot:o,repoRoot:r}));if(d(A)&&Gi(A.message)){let M=X("pullBranchRebaseIfPresent(retry)",await xs({cwd:o,branch:b}));if(d(M))return Qe(M.message);m=m||M.value,A=X("pushStateBranch(retry)",await Qn({stateBranchRoot:o,repoRoot:r}))}if(d(A))return Qe(A.message);p=A.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let A=X("git rev-parse HEAD",await _({args:["rev-parse","HEAD"],cwd:o}));if(d(A))return Qe(A.message);u=A.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return $o(p?"Synced and pushed":m||c?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),l("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,pulled:m,pushed:p,bootstrapped:s})};var vi=()=>{let e=wn();return d(e)?mt:e.value.attachmentMaxKb??mt},yi=e=>{let t=qe(e??process.cwd());return d(t)?a(t.message):l("Resolved Epiq repo root",t.value)},Me=async(e,t)=>{let n=yi(e);if(d(n))return n;let r=Pe({repoRoot:n.value});if(d(r))return a(r.message);let o=yn(),s=await tn({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.stateBranch});if(d(s))return a(s.message);if(t?.pull??!1){let u=await _({cwd:r.value,args:["pull","--ff-only"]});d(u)&&se.info(3,u.message)}let i=Et(r.value);if(d(i))return a(i.message);let c=an(i.value);return d(c)?a(c.message):l("Booted Epiq state",{repoRoot:n.value,stateBranchRoot:r.value})},ke=()=>{let e=wn();return d(e)?a(e.message):e.value.userId?e.value.userName?l("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):a("Unable to retrieve user name"):a("Unable to retrieve user id")},Oe=()=>{let e=Je();return d(e)?a(e.message):e},cl=e=>(e.props.tags??[]).map(t=>I.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:ue(t.name)})),ll=e=>(e.props.assignees??[]).map(t=>I.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:ue(t.name)}));var ul=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=Oe();if(d(n))return n;let r=n.value.nodes,o=Object.values(r).filter(R).filter(s=>!s.isDeleted).filter(s=>e.includeClosed||s.parentNodeId!==pe).filter(s=>e.boardId?(s.parentNodeId?r[s.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(s=>({id:s.id,ref:Ue(s.id),title:Xe(s.title),description:s.props.description??"",parentNodeId:s.parentNodeId,isClosed:s.parentNodeId===pe,readonly:!!s.readonly,tags:cl(s),assignees:ll(s)}));return l("Listed issues",o)},ml=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=Nn(e.parentId,n.value,t.value.stateBranchRoot);if(d(o))return o;let s=Mo({name:e.title,parent:e.parentId,user:n.value,rank:o.value});if(d(s))return s;let i=[...s.value],c=i.find(f=>f.action==="add.issue")?.payload.id;if(!c)return a("Unable to determine created issue id");e.description&&i.push({id:J(),...n.value,action:"edit.description",payload:{id:c,md:e.description}});let u=[];for(let f of e.tagNames??[]){let b=Xe(f).trim();if(!b||u.some(A=>A.name===b))continue;let C=Object.values(r.value.tags).find(A=>A.name===b),N=C?.id??J();C||i.push({id:J(),...n.value,action:"create.tag",payload:{id:N,name:b}}),i.push({id:J(),...n.value,action:"add.issue.tag",payload:{id:c,tag:N}}),u.push({id:N,name:b})}let m=[];for(let f of e.assigneeNames??[]){let b=Xe(f).trim();if(!b||m.some(A=>A.name===b))continue;let C=Object.values(r.value.contributors).find(A=>A.name===b),N=C?.id??J();C||i.push({id:J(),...n.value,action:"create.contributor",payload:{id:N,name:b}}),i.push({id:J(),...n.value,action:"add.issue.assignee",payload:{id:c,assignee:N}}),m.push({id:N,name:b})}let p=B(i,t.value.stateBranchRoot);return d(p)?a(p.message):l("Created issue",{id:c,title:e.title,parentId:e.parentId,description:e.description??"",tags:u,assignees:m})},pl=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=sn(pe,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(r))return r;let o={id:J(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:pe,rank:r.value}},s=B([o],t.value.stateBranchRoot);return d(s)?a(s.message):l("Closed issue",{id:e.issueId})},fl=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Target node is not issue");if(o.parentNodeId!==pe)return a("Issue is not closed");let s=Ro(o);if(!s)return a("Unable to resolve previous parent from issue history");if(s===pe)return a("Previous parent resolves to closed swimlane");let i=r.value.nodes[s];if(!i)return a("Previous parent no longer exists");let c=sn(i.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let u={id:J(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:i.id,rank:c.value}},m=B([u],t.value.stateBranchRoot);return d(m)?a(m.message):l("Reopened issue",{id:o.id,parentId:i.id})},gl=async e=>{let t=yi(e.repoRoot);if(d(t))return t;let n=ke();if(d(n))return n;let r=Pe({repoRoot:t.value});if(d(r))return r;let o=Et(r.value);if(d(o))return o;let s=an(o.value);if(d(s))return s;let i=sn(e.parentId,e.issueId,e.position??{at:"end"},n.value,r.value);if(d(i))return i;let c={id:J(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:i.value}},u=B([c],r.value);return d(u)?a(u.message):l("Moved issue",{id:e.issueId,parentId:e.parentId})};var Ho=async(e={})=>{_o();let t=yi(e.repoRoot);if(d(t))return a("Sync failed");let n=ke();if(d(n))return n;let r=await io({cwd:t.value,ownEventFileName:on(n.value)});return d(r)?(gi(r.message),r):($o(),l("Synced",r.value))};var yt=async(e={})=>{let t=await Me(e.repoRoot,{pull:!0});if(d(t))return t;let n=Oe();if(d(n))return n;let r=Object.values(n.value.nodes),o=r.filter(f=>Kr(f)&&!f.isDeleted),s=new Map,i=new Map;for(let f of r)if(!f.isDeleted){if(Dt(f)&&f.parentNodeId){let b=s.get(f.parentNodeId)??[];b.push(f),s.set(f.parentNodeId,b)}if(R(f)&&f.parentNodeId){let b=i.get(f.parentNodeId)??[];b.push(f),i.set(f.parentNodeId,b)}}let c=wn();if(d(c))return c;let u={};for(let f of r.filter(R))f.isDeleted||(u[f.id]=I.getCommentsByIssue(f.id).map(b=>{let C=I.getContributor(b.authorId);return{id:b.id,issueId:b.issue,body:b.md,author:{id:b.authorId,name:C?.name??"Unknown",color:ue(C?.name??b.authorId)},createdAt:dl(b.id)}}));let m=new Map;for(let f of n.value.eventLog)f.action==="add.issue.attachment"&&m.set(f.payload.id,f.payload.author);let p={};for(let f of r.filter(R))f.isDeleted||(p[f.id]=I.getAttachmentsByIssue(f.id).map(b=>({id:b.id,issueId:b.issue,name:b.name,fileName:Mn(b.hash,b.ext),bytes:b.bytes,createdAt:dl(b.id),canDelete:m.get(b.id)===c.value.userId})));return l("Retrieved Epiq GUI state",{boards:o.sort((f,b)=>f.rank.localeCompare(b.rank)).map(f=>({id:f.id,ref:Ue(f.id),title:f.title,swimlanes:(s.get(f.id)??[]).sort((b,C)=>b.rank.localeCompare(C.rank)).map(b=>({id:b.id,title:b.title,readonly:!!b.readonly,issues:(i.get(b.id)??[]).sort((C,N)=>C.rank.localeCompare(N.rank)).map(C=>({id:C.id,ref:Ue(C.id),title:Xe(C.title),description:C.props.description??"",readonly:!!C.readonly,tags:cl(C),assignees:ll(C),parentNodeId:C.parentNodeId,isClosed:C.parentNodeId===pe})),parentNodeId:b.parentNodeId}))})),tags:Object.values(n.value.tags).map(f=>({...f,color:ue(f.name)})),contributors:Object.values(n.value.contributors).map(f=>({...f,color:ue(f.name)})),user:{name:c.value.userName??"",id:c.value.userId??"",color:ue(c.value.userName??"")},commentsByIssueId:u,attachmentsByIssueId:p,attachmentMaxKb:vi()})},vl=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Edit target must be an issue");if(o.readonly)return a("Cannot edit readonly issue");let s=o.props.description??"";if(s===e.description)return l("No changes made",{id:e.issueId,description:s});let i={id:J(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},c=B([i],t.value.stateBranchRoot);return d(c)?a(c.message):l("Edited issue description",{id:e.issueId,description:e.description})},yl=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Edit target must be an issue");if(o.readonly)return a("Cannot edit readonly issue");let s=Xe(e.title);if(!s.trim())return a("Issue title cannot be empty");if(o.title===s)return l("No changes made",{id:e.issueId,title:s});let i={id:J(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},c=B([i],t.value.stateBranchRoot);return d(c)?a(c.message):l("Edited issue title",{id:e.issueId,title:s})},hl=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Tag target must be an issue");if(o.readonly)return a("Cannot tag readonly issue");let s=Xe(e.tagName).trim();if(!s)return a("Tag name cannot be empty");let i=Object.values(r.value.tags).find(p=>p.name===s),c=i?.id??J(),u=[...i?[]:[{id:J(),...n.value,action:"create.tag",payload:{id:c,name:s}}],{id:J(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:c}}],m=B(u,t.value.stateBranchRoot);return d(m)?a(m.message):l("Added issue tag",{id:e.issueId,tag:{id:c,name:s}})},xl=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Untag target must be an issue");if(o.readonly)return a("Cannot untag readonly issue");if(!r.value.tags[e.tagId])return a("Tag not found");let s={id:J(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},i=B([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue tag",{id:e.issueId,tagId:e.tagId})},bl=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Assign target must be an issue");if(o.readonly)return a("Cannot assign readonly issue");let s=Xe(e.assigneeName).trim();if(!s)return a("Assignee name cannot be empty");let i=Object.values(r.value.contributors).find(p=>p.name===s),c=i?.id??J(),u=[...i?[]:[{id:J(),...n.value,action:"create.contributor",payload:{id:c,name:s}}],{id:J(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:c}}],m=B(u,t.value.stateBranchRoot);return d(m)?a(m.message):l("Added issue assignee",{id:e.issueId,assignee:{id:c,name:s}})},Il=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Unassign target must be an issue");if(o.readonly)return a("Cannot unassign readonly issue");if(!r.value.contributors[e.assigneeId])return a("Assignee not found");let s={id:J(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},i=B([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue assignee",{id:e.issueId,assigneeId:e.assigneeId})},Wo=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Comment target must be an issue");if(o.readonly)return a("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return a("Comment cannot be empty");let i=J(),c={id:J(),...n.value,action:"add.issue.comment",payload:{id:i,issue:e.issueId,md:s,author:n.value.userId}},u=B([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Added issue comment",{id:i,issueId:e.issueId,body:s})},jo=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!o)return a("Unable to resolve comment");if(o.payload.author!==n.value.userId)return a("You can only delete your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!R(s))return a("Comment target must be an issue");if(s.readonly)return a("Cannot delete comment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return l("Comment already deleted",{id:e.commentId,issueId:o.payload.issue});let c={id:J(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},u=B([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},El=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!R(o))return a("Attachment target must be an issue");if(o.readonly)return a("Cannot attach to readonly issue");let s=Buffer.from(e.dataBase64??"","base64"),i=Ad(t.value.stateBranchRoot,s,vi());if(d(i))return i;let c=Xe(e.name??"").trim()||"image",u=J(),m={id:J(),...n.value,action:"add.issue.attachment",payload:{id:u,issue:e.issueId,author:n.value.userId,hash:i.value.hash,ext:i.value.ext,name:c,bytes:i.value.bytes}},p=B([m],t.value.stateBranchRoot);return d(p)?a(p.message):l("Added issue attachment",{id:u,issueId:e.issueId,fileName:Mn(i.value.hash,i.value.ext),bytes:i.value.bytes})},Sl=async e=>{let t=await Me(e.repoRoot,{pull:!1});if(d(t))return t;let n=ke();if(d(n))return n;let r=Oe();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.attachment"&&m.payload.id===e.attachmentId);if(!o)return a("Unable to resolve attachment");if(o.payload.author!==n.value.userId)return a("You can only delete your own attachments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!R(s))return a("Attachment target must be an issue");if(s.readonly)return a("Cannot delete attachment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.attachment"&&m.payload.id===e.attachmentId))return l("Attachment already deleted",{id:e.attachmentId,issueId:o.payload.issue});let c={id:J(),...n.value,action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},u=B([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},Cl=async e=>{let t=await Me(e.repoRoot,{pull:!1});return d(t)?t:Rd(t.value.stateBranchRoot,e.fileName,vi())};var Nl=e=>{let t,n,r=!1,o=!1,s=!1,i=()=>{let p=dr();if(d(p))return se.error(p.message);let{autoSync:f,userName:b,preferredEditor:C}=p.value;return!!(f&&b&&C)},c=async()=>{if(!r){if(o){s=!0;return}o=!0;try{await Ho({repoRoot:e.repoRoot}),nn({type:"state",payload:await yt({repoRoot:e.repoRoot})})}finally{o=!1,s&&(s=!1,c())}}},u=(p=750)=>{r||(n&&clearTimeout(n),n=setTimeout(()=>{c()},p))},m=()=>{if(r)return;let p=dr();if(d(p))return se.error(p.message);let{autoSyncDebounceMs:f}=p.value;i()&&(t=setTimeout(()=>{c(),m()},f??15e3))};return m(),{scheduleSync:u,dispose:()=>{r=!0,t&&clearTimeout(t),n&&clearTimeout(n)}}};import{WebSocketServer as qg}from"ws";var Ve=(e,t)=>{e.send(JSON.stringify(t))},Ir=async(e,t)=>Ve(e,{type:"state",payload:await yt({repoRoot:t})}),ht=async(e,t,n,r,o)=>{if(Ve(e,{type:r,payload:o}),d(o))return Ve(e,{type:"failed",payload:o.message});n(),Ir(e,t)},Al=(e,t,{onStateChanged:n})=>{new qg({server:e,path:"/ws"}).on("connection",o=>{aa(o),o.on("message",async s=>{try{let i=JSON.parse(s.toString()),{type:c}=i;if(c==="state:get")return Ir(o,t);if(c==="sync"){let u=await Ho({repoRoot:t});return Ve(o,{type:"sync:result",payload:u}),n(),Ir(o,t)}if(c==="issue:comment:add"){let u=await Wo({repoRoot:t,...i.payload});return ht(o,t,n,"issue:comment:add:result",u)}if(c==="issue:comment:delete"){let u=await jo({repoRoot:t,...i.payload});return Ve(o,{type:"issue:comment:delete:result",payload:u}),d(u)?Ve(o,{type:"failed",payload:u.message}):(n(),Ir(o,t))}if(c==="issue:edit:description"){let u=await vl({repoRoot:t,...i.payload});return ht(o,t,n,"issue:edit:description:result",u)}if(c==="issue:edit:title"){let u=await yl({repoRoot:t,...i.payload});return ht(o,t,n,"issue:edit:title:result",u)}if(c==="issue:tag:add"){let u=await hl({repoRoot:t,...i.payload});return ht(o,t,n,"issue:tag:add:result",u)}if(c==="issue:tag:remove"){let u=await xl({repoRoot:t,...i.payload});return ht(o,t,n,"issue:tag:remove:result",u)}if(c==="issue:assignee:add"){let u=await bl({repoRoot:t,...i.payload});return ht(o,t,n,"issue:assignee:add:result",u)}if(c==="issue:assignee:remove"){let u=await Il({repoRoot:t,...i.payload});return ht(o,t,n,"issue:assignee:remove:result",u)}if(c==="issues:list")return Ve(o,{type:"issues",payload:await ul({repoRoot:t})});if(c==="issues:create"){let u=await ml({...i.payload,repoRoot:t});return Ve(o,{type:"issues:create:result",payload:u}),d(u)?nn({type:"failed",payload:u.message}):(nn({type:"issue:created",payload:u.value}),n(),Ir(o,t))}if(c==="issues:move"){if(!i.payload.position)return Ve(o,{type:"error",message:"Missing move position"});let u=await gl({...i.payload,repoRoot:t});return ht(o,t,n,"issues:move:result",u)}if(c==="issue:close"){if(!i.payload.issueId)return Ve(o,{type:"error",message:"Missing issueId"});let u=await pl({repoRoot:t,issueId:i.payload.issueId});return ht(o,t,n,"issue:close:result",u)}if(c==="issue:reopen"){if(!i.payload.issueId)return Ve(o,{type:"error",message:"Missing issueId"});let u=await fl({repoRoot:t,issueId:i.payload.issueId});return ht(o,t,n,"issue:reopen:result",u)}return Ve(o,{type:"error",message:"Unknown message type"})}catch(i){return Ve(o,{type:"error",message:i instanceof Error?i.message:String(i)})}})})};var Jg=vn.dirname(Xg(import.meta.url)),Qg=process.env.IS_LOCAL==="true"?vn.resolve(process.cwd(),"dist/gui"):vn.join(Jg,"gui"),Vo,Zg=async()=>(Vo===void 0&&(Vo=await import("node:sea").catch(()=>null)),Vo?.isSea()?Vo:null),ve=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},Rl=async(e,t=1024*1024)=>new Promise((n,r)=>{let o="",s=0;e.on("data",i=>{if(s+=i.length,s>t){e.destroy(),r(new Error("Request body too large"));return}o+=i}),e.on("end",()=>{try{n(o?JSON.parse(o):{})}catch{r(new Error("Invalid JSON body"))}}),e.on("error",r)}),ev=2*1024*1024,tv={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},nv=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",Tl=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),r=vn.resolve(Qg),o=vn.resolve(r,n),s=vn.relative(r,o);if(s.startsWith("..")||vn.isAbsolute(s))return ve(t,403,{isError:!0,message:"Forbidden"});let i=await Zg();try{let c=i?Buffer.from(i.getAsset(`gui/${s}`)):await wl(o);return t.writeHead(200,{"content-type":nv(o)}),t.end(c)}catch{return ve(t,404,{isError:!0,message:`Not found: ${n}`})}},rv=async(e,t=3710)=>new Promise((n,r)=>{let o=s=>{let i=u=>{if(e.off("listening",c),u.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),o(0);return}r(u)},c=()=>{e.off("error",i);let u=e.address();if(!u||typeof u=="string"){r(new Error("Unable to resolve address"));return}n(u.port)};e.once("error",i),e.once("listening",c),e.listen(s,"127.0.0.1")};o(t)}),Ml=async e=>{let t=Yg.createServer(async(o,s)=>{let i=new URL(o.url??"/","http://127.0.0.1");if(i.pathname==="/api/state")return ve(s,200,await yt({repoRoot:e.repoRoot}));if(o.method==="POST"&&i.pathname==="/api/comments")try{let c=await Rl(o);if(!c.issueId||!c.body?.trim())return ve(s,400,{isError:!0,message:"Missing issueId or body"});let u=await Wo({repoRoot:e.repoRoot,issueId:c.issueId,body:c.body});return"isError"in u&&u.isError?ve(s,400,u):ve(s,200,await yt({repoRoot:e.repoRoot}))}catch(c){return ve(s,400,{isError:!0,message:c instanceof Error?c.message:"Unable to add comment"})}if(o.method==="POST"&&i.pathname==="/api/attachments")try{let c=await Rl(o,ev);if(!c.issueId||!c.dataBase64)return ve(s,400,{isError:!0,message:"Missing issueId or dataBase64"});let u=await El({repoRoot:e.repoRoot,issueId:c.issueId,name:c.name??"",dataBase64:c.dataBase64});return d(u)?ve(s,400,{isError:!0,message:u.message}):ve(s,200,await yt({repoRoot:e.repoRoot}))}catch(c){return ve(s,400,{isError:!0,message:c instanceof Error?c.message:"Unable to add attachment"})}if(o.method==="DELETE"&&i.pathname.startsWith("/api/attachments/")){let c=decodeURIComponent(i.pathname.replace("/api/attachments/",""));if(!c)return ve(s,400,{isError:!0,message:"Missing attachment id"});let u=await Sl({repoRoot:e.repoRoot,attachmentId:c});return d(u)?ve(s,400,{isError:!0,message:u.message}):ve(s,200,await yt({repoRoot:e.repoRoot}))}if(o.method==="GET"&&i.pathname.startsWith("/media/")){let c=decodeURIComponent(i.pathname.replace("/media/","")),u=await Cl({repoRoot:e.repoRoot,fileName:c});if(d(u))return ve(s,404,{isError:!0,message:u.message});try{let m=await wl(u.value.filePath);return s.writeHead(200,{"content-type":tv[u.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),s.end(m)}catch{return ve(s,404,{isError:!0,message:"Attachment blob not found"})}}if(o.method==="DELETE"&&i.pathname.startsWith("/api/comments/")){let c=decodeURIComponent(i.pathname.replace("/api/comments/",""));if(!c)return ve(s,400,{isError:!0,message:"Missing comment id"});let u=await jo({repoRoot:e.repoRoot,commentId:c});return"isError"in u&&u.isError?ve(s,400,u):ve(s,200,await yt({repoRoot:e.repoRoot}))}return i.pathname.startsWith("/board/")?Tl("/",s):Tl(i.pathname,s)});try{await rv(t)}catch(o){return a(o instanceof Error?`Unable to start GUI server: ${o.message}`:`Unable to start GUI server: ${String(o)}`)}let n=Nl({repoRoot:e.repoRoot});Al(t,e.repoRoot,{onStateChanged:()=>n.scheduleSync()}),t.on("close",n.dispose);let r=t.address();return!r||typeof r=="string"?(t.close(),a("Unable to resolve GUI server address")):l("Started GUI server",{url:`http://epiq.localhost:${r.port}${e.boardId?`/board/${e.boardId}`:""}`,server:t})};var Pl=async e=>{let t=await Ml({...e,boardId:""});if(d(t))return t;let{url:n}=t.value;return console.log(`Epiq GUI running at ${ov.cyan(n)}`),Di(n),l("Started GUI",{url:n})};import{Box as Qt}from"ink";import de from"react";import{Box as hi,Text as Er}from"ink";import ot,{useEffect as sv,useMemo as iv}from"react";import{ulid as av}from"ulid";var Ll=({text:e,match:t,color:n,highlightColor:r=y.secondary,dimColor:o=!1})=>{if(!t)return ot.createElement(Er,{color:n,dimColor:o},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?ot.createElement(Er,{color:n,dimColor:o},e):ot.createElement(Er,{color:n,dimColor:o},e.slice(0,c),ot.createElement(Er,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},kl=av(),dv=e=>`${e}`,cv=e=>{let{pendingNavTarget:t}=Vt();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(ae(x.NONE,{breadCrumb:n,contextNode:r,readOnly:g().readOnly,selectedNode:o}));return[...new Set(Object.values(x))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==x.PALETTE).map(i=>{let c=xo(i),u=Fo.find(m=>m.intent===c);return{command:i,description:u?.description??`[${i}] Run command`,isAvailable:s.has(i)}}).filter(i=>i.command.toLowerCase().startsWith(e)||e.length>=2&&i.description.toLowerCase().includes(e)).sort((i,c)=>i.isAvailable!==c.isAvailable?i.isAvailable?-1:1:i.command.localeCompare(c.command))},lv=e=>Z.text({id:kl,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),uv=(e,t,n)=>Z.text({id:dv(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),xi=[],mv=e=>{Dl();let t=I.createNode(lv(g().rootNodeId));d(t)||!kt(t.value)||(xi=[t.value,...e.map((n,r)=>uv(n,r,kl)).map(I.createNode).filter(ne).map(({value:n})=>n).filter(kt)],T.navigate({contextNode:t.value,selectedIndex:0}))},Dl=()=>{let e=xi.map(t=>t.id);xi=[];for(let t of e)I.deleteNode(t)};function Fl({width:e,height:t}){let r=zd().value.trim().toLowerCase(),o=iv(()=>cv(r),[r]);sv(()=>(mv(o),()=>{Dl()}),[o]);let s=g().selectedIndex;return ot.createElement(hi,{flexDirection:"column",width:e,height:t-2},ot.createElement(et,{height:t-4,itemHeight:3,selectedIndex:s},o.map((i,c)=>{let u=c===s,m=i.isAvailable?y.accent:y.secondary2,p=i.isAvailable?"":"[unavailable] ";return ot.createElement(hi,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},ot.createElement(Er,{color:m,dimColor:!i.isAvailable},u?"\u276F ":" ",ot.createElement(Ll,{text:pa(i.command),match:r,color:m,dimColor:!i.isAvailable})),ot.createElement(hi,{paddingLeft:2},ot.createElement(Ll,{text:p+i.description,match:r.length>=2?r:"",color:u&&i.isAvailable?y.primary:y.secondary2,dimColor:!i.isAvailable})))})))}import{Box as wv}from"ink";import zo from"react";import Cr from"chalk";import{Box as bi,Text as Bl}from"ink";import Sr,{useEffect as pv,useMemo as fv,useState as gv}from"react";var Ul=Cr.hex(y.secondary),vv=Cr.inverse,yv=Cr.inverse.hex(y.secondary2),hv={hint:"",hints:[],overlap:0,remainder:""},_l=({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}},xv=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ue(t);return{bg:r=>Cr.bgHex(n).black(r),bgCursor:r=>Cr.bgHex(n).inverse.black(r)}}return ws(t)},bv=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=_l({value:e,command:t});if(!r)return null;let s=e.slice(r.end).match(/^\s*/)?.[0].length??0,i=r.end+s;return e.slice(i,i+n.length)!==n?null:{start:i,end:i+n.length}},Ol=()=>({value:Ae.value,cursorPosition:Ae.cursorPosition,commandIsPending:Ae.commandIsPending,autoCompletion:Ae.commandMeta.autoCompletion??hv,infoMessage:Ae.commandMeta.infoMessage,validationStatus:Ae.commandMeta.validity,command:Ae.commandMeta.command,inputString:Ae.commandMeta.inputString,modifier:Ae.commandMeta.modifier}),Iv=(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,$l=({width:e,mode:t})=>{let[n,r]=gv(Ol());pv(()=>{let N=()=>{let M=Ol();r(U=>Iv(U,M)?U:M)},A=Ys(N);return N(),()=>{A()}},[]);let{value:o,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:u,command:m,modifier:p,validationStatus:f}=n,b=c&&f===pt.Invalid,C=fv(()=>{let N=Math.max(0,Math.min(s,o.length)),A=_l({value:o,command:m}),M=bv({value:o,command:m,modifier:p}),U=m?ws(m):null,j=xv({command:m,modifier:p}),D=(me,le)=>{let $n=A&&le>=A.start&&le<A.end,Hn=M&&le>=M.start&&le<M.end;return $n&&U?U.fg(me):Hn&&j?j.bg(me):me},z=(me,le)=>{let $n=A&&le>=A.start&&le<A.end,Hn=M&&le>=M.start&&le<M.end;return $n&&U?U.fgCursor(me):Hn&&j?j.bgCursor(me):vv(me)},$=o.slice(0,N),P=o[N]??" ",O=N<o.length?o.slice(N+1):"",Ge=Array.from($).map((me,le)=>D(me,le)).join(""),Ce=z(P,N),ze=Array.from(O).map((me,le)=>D(me,N+1+le)).join("");if(u.hint){let me=u.hint[u.overlap]??P;Ce=yv(me),ze=Ul(u.remainder.slice(1)+O)}return Ul(t===v.PALETTE?"?":":")+Ge+Ce+ze},[o,s,u,m,p]);return Sr.createElement(bi,{flexDirection:"column",justifyContent:"flex-start"},Sr.createElement(bi,{flexDirection:"column",paddingX:1,borderColor:y.secondary,borderStyle:"round",width:e},Sr.createElement(bi,null,Sr.createElement(Bl,null,C),i&&Sr.createElement(Bl,{wrap:"truncate",color:b?y.red:y.secondary2},` ${i} `))))};import{Box as Ev,Text as Sv}from"ink";import Hl from"react";var Cv=(e,t)=>{let n=[],r=0;for(let o of e){let i=(n.length>0?" | ":"").length+o.length;if(r+i>t-4)break;n.push(o),r+=i}return n},Wl=({width:e,availableHints:t})=>{let n=Cv(t,e).join(" | ");return Hl.createElement(Ev,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},Hl.createElement(Sv,{color:y.secondary2},n.length?n:"\xA0"))};import{Box as Nv,Text as Ko}from"ink";import Nr,{useEffect as Av,useRef as Un,useState as Rv}from"react";var Tv=40,Go=.3,Ii="\u2500",jl=1,Vl=16,Kl=({width:e})=>{let{replay:t}=H(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),i=s*jl,[c,u]=Rv(0),m=Un(r);m.current=r;let p=Un(0),f=Un(0),b=Un(0),C=Un(0),N=Un(0);if(Av(()=>{if(!n){p.current=0,b.current=0,C.current=0,N.current=0,u(0);return}p.current=m.current,f.current=Date.now(),b.current=m.current;let D=setInterval(()=>{let z=Date.now(),$=m.current;if($!==b.current){let ze=$-b.current,me=z-f.current;if(ze<0)C.current=0,N.current=0;else if(ze>0&&me>0){let le=ze/me;C.current=C.current===0?le:C.current*(1-Go)+le*Go,N.current=N.current===0?ze:N.current*(1-Go)+ze*Go}p.current=$,f.current=z,b.current=$}let P=z-f.current,O=Math.min(N.current,C.current*P),Ge=Math.min(1,p.current+O),Ce=Math.round(Ge*i);u(ze=>ze===Ce?ze:Ce)},Tv);return()=>clearInterval(D)},[n,i]),!t)return null;let A=D=>{let z=s>1?D/(s-1):0,$=Math.round(z*(Vl-1))/(Vl-1);return zr($)},M=Math.min(s,Math.floor(c/jl)),U=[];for(let D=0;D<M;D++){let z=A(D),$=U[U.length-1];$&&$.color===z?$.text+=Ii:U.push({text:Ii,color:z})}let j=Ii.repeat(Math.max(0,s-M));return Nr.createElement(Nv,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1,columnGap:1},Nr.createElement(Ko,{color:y.secondary2},"\u25B6"),Nr.createElement(Ko,null,U.map((D,z)=>Nr.createElement(Ko,{key:z,color:D.color},D.text)),Nr.createElement(Ko,{color:y.secondary,dimColor:!0},j)))};var Ar=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=H(),o=t===v.COMMAND_LINE||t===v.PALETTE;return zo.createElement(wv,null,o?zo.createElement($l,{width:e,mode:t}):r==="replay"?zo.createElement(Kl,{width:e}):zo.createElement(Wl,{width:e,mode:t,availableHints:n}))};import{Box as qt,Text as On}from"ink";import De,{useEffect as Mv,useMemo as Pv}from"react";import{ulid as Gl}from"ulid";var Yo=Gl(),Lv=()=>[...new Set([...g().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})),kv=e=>Z.text({id:Yo,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),Dv=(e,t,n)=>Z.text({id:Gl(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),qo=[],zl=()=>{let e=qo.filter(n=>n.id!==Yo).map(n=>n.id),t=qo.filter(n=>n.id===Yo).map(n=>n.id);qo=[];for(let n of[...e,...t])I.deleteNode(n)},Fv=e=>{zl();let t=I.createNode(kv(g().rootNodeId));if(d(t)||!kt(t.value))return logger.error("Could not attach help nodes");qo=[t.value,...e.map((n,r)=>Dv(n,r,Yo)).map(I.createNode).filter(ne).map(({value:n})=>n).filter(kt)],T.navigate({contextNode:t.value,selectedIndex:0})},ql=({width:e,height:t})=>{let n=Pv(()=>Lv(),[]);Mv(()=>(Fv(n),()=>{zl()}),[n]);let r=g().selectedIndex;return De.createElement(qt,{flexDirection:"column",marginTop:3,borderColor:y.secondary,borderStyle:"round",width:e,height:t-2},De.createElement(qt,{paddingX:1,justifyContent:"center"},De.createElement(On,{color:y.accent},"Help"),De.createElement(On,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),De.createElement(qt,{paddingX:1,marginTop:1},De.createElement(qt,{width:20,justifyContent:"flex-end"},De.createElement(On,{color:y.secondary},"Key(s)")),De.createElement(qt,{flexGrow:1,width:40,paddingLeft:2},De.createElement(On,{color:y.secondary},"Action"))),De.createElement(et,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},i)=>{let c=i===r;return De.createElement(qt,{paddingX:1,key:`${o}-${s}-${i}`,flexDirection:"row"},De.createElement(qt,{width:20,justifyContent:"flex-end"},De.createElement(On,{color:y.accent},o)),De.createElement(qt,{flexGrow:1,width:40,paddingLeft:2},De.createElement(On,{color:c?y.primary:y.secondary2},s)))})))};import Bv from"chalk";import{Box as Xo,Text as Mt}from"ink";import Ke from"react";var Yl=({width:e,height:t})=>Ke.createElement(Xo,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Ke.createElement(Mt,{color:y.accent,bold:!0},"Initialize project"),Ke.createElement(Mt,null,`This folder is not an ${Bv.hex(y.accent)("epiq")} project yet.`),Ke.createElement(Mt,{color:y.primary},"To start tracking issues here, we need to initialize a new",Ke.createElement(Mt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),Ke.createElement(Xo,{marginTop:1,flexDirection:"column"},Ke.createElement(Xo,null,Ke.createElement(Mt,{color:y.accent}," "),Ke.createElement(Mt,{color:y.primary},"Type "),Ke.createElement(Mt,{backgroundColor:y.secondary}," :init "))),Ke.createElement(Xo,{marginTop:1},Ke.createElement(Mt,{color:y.secondary2},"This will create, commit and push "),Ke.createElement(Mt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json ")));import{Box as Jo,Text as xt}from"ink";import Se from"react";var Uv=({isDone:e,command:t,value:n})=>Se.createElement(Jo,null,Se.createElement(xt,{color:y.accent,dimColor:e},e?" \u2714 ":" "),Se.createElement(xt,{dimColor:e},"Type "),Se.createElement(xt,{backgroundColor:y.secondary,dimColor:e}," "+t+" "),n!==void 0&&Se.createElement(Se.Fragment,null,Se.createElement(xt,{dimColor:e}," "),Se.createElement(xt,{color:y.secondary,dimColor:e},"<"+n+">"))),Ov=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function Ei({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:i,isSetAutoSync:c}=_t(),u=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:s,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:i,message:"Almost there. Configure auto sync."}],m=u.findIndex(f=>!f.done),p=m===-1?void 0:u[m];return Se.createElement(Jo,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Se.createElement(xt,{color:y.accent,bold:!0},"Welcome! \u{1F539}"),Se.createElement(xt,null,"Let's get you started - it's a breeze."),Se.createElement(xt,{color:y.secondary2},"Remember - you can always search available commands by typing:",Se.createElement(xt,{color:y.accent}," ? ")),p&&Se.createElement(xt,{color:y.secondary2},p.message),Se.createElement(Jo,{flexDirection:"column"},u.map((f,b)=>m===-1||b<=m?Se.createElement(Jo,{key:f.key,marginBottom:1},Se.createElement(Uv,{isDone:f.done,command:f.command,value:f.done?Ov(f.value):void 0})):null)))}import ns from"chalk";import{Box as Tr,Text as _n}from"ink";import ye from"react";import{Box as Qo,Text as Xl}from"ink";import Yt from"react";import _v from"chalk";var $v=e=>(I.getTag(e)?.name??"").length+3,Hv=e=>(I.getContributor(e)?.name??"").length+3,Jl=({width:e})=>{let{viewMode:t}=K(),n=H(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[o.id]?.[s],u=It(c?.id??o.id,"TICKET"),m=ne(u)?u.value:void 0,p=m?.props.tags??[],f=m?.props.assignees??[],b=m?.parentNodeId?!As(o.id,m.parentNodeId)&&t==="dense":!1,C=r.map(($,P)=>{let O=P===r.length-1,Ge=q($.id),Ce=O?Ge?.[s]?.title:void 0;return`${P?" / ":""}${$.title??""}${Ce?` \u25B8 ${Ce}`:""}`}).join(""),N=m?I.getCommentsByIssue(m.id):[],A=N.length?String(N.length).length+11:0,M=b?p.reduce(($,P)=>$+$v(P),0)+f.reduce(($,P)=>$+Hv(P),0)+A:0,U=c?.id!=null&&!(t==="wide"&&R(c)),j=Math.max(0,e-M),D=C.substring(0,j)+(U?_v.hex(y.secondary2).dim(` ${Ue(c.id)}`):""),z=b?[...p.map($=>Yt.createElement(Qo,{key:`tag-${$}`,paddingLeft:1},Yt.createElement(kn,{id:$}))),...f.map($=>Yt.createElement(Qo,{key:`assignee-${$}`,paddingLeft:1},Yt.createElement(Wt,{id:$}))),N.length?Yt.createElement(Qo,{key:"comments",paddingLeft:1},Yt.createElement(Xl,{color:y.accent},"[",N.length," comment",N.length===1?"":"s","]")):null]:[];return Yt.createElement(Qo,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Yt.createElement(Xl,{color:y.secondary2},D),z)};import{Box as Wv,Text as Ql}from"ink";import Zo from"react";var jv=({filters:e})=>Zo.createElement(Wv,{columnGap:1},Zo.createElement(Ql,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Zo.createElement(Ql,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Zl=Zo.memo(jv);import{Box as Vv,Text as es}from"ink";import Rr from"react";function eu(){let{eventLog:e,unappliedEvents:t}=H(),n=e.at(-1)?.id,r=Jr(n??""),o=ne(r)?Xr(r.value):"INVALID DATE";return Rr.createElement(Vv,{paddingLeft:1},Rr.createElement(es,{backgroundColor:y.accent,color:y.secondary}," Readonly "),Rr.createElement(es,{color:y.accent}," "+t.length+" edits ago at "+o+"."),Rr.createElement(es,{color:y.accent}," Resume with "),Rr.createElement(es,{backgroundColor:y.accent,color:y.secondary}," ",":peek now"," "))}import{Box as Kv,Text as Si}from"ink";import ts from"react";function tu(){let{replay:e}=H();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return ts.createElement(Kv,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},ts.createElement(Si,{backgroundColor:y.accent,color:y.secondary}," \u25B6 REPLAY "),ts.createElement(Si,{color:y.secondary2},Xr(new Date(r))),ts.createElement(Si,{color:y.accent},`${t}/${n} edits`))}import Ci from"chalk";import{Box as Gv,Text as nu}from"ink";import Ni,{useEffect as zv,useState as qv}from"react";var Yv=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Xv=150,ru=12,Jv=.36,ou=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)}},Qv=({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)}`},Zv=(e,t,n)=>{let r=ou(e),o=ou(t);return Qv({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},ey=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,s=e[r],i=e[Math.min(r+1,e.length-1)];return Zv(s,i,o)};function su({syncStatus:e,autoSync:t}){let[n,r]=qv(0);zv(()=>{if(e.status!=="syncing"){r(0);return}let c=0,u=setInterval(()=>{c+=1;let m=(Math.sin(c*Jv)+1)/2,p=Math.round(m*(ru-1));r(f=>f===p?f:p)},Xv);return()=>clearInterval(u)},[e.status]);let o={synced:" ",failed:"---",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,pending:y.secondary2,syncing:ey(Yv,n/(ru-1))??""}[e.status];return Ni.createElement(Gv,null,Ni.createElement(nu,null,Ci.hex(y.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Ni.createElement(nu,null,Ci.hex(i)("\u25CF")+Ci.hex(y.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import lu from"chalk";import{Text as uu}from"ink";import mu,{useEffect as oy,useState as sy}from"react";var Xt="1.3.4";import Ai from"chalk";var ty="https://registry.npmjs.org/epiq/latest",Ri=null,iu=0,ny=1e3*60*60*24,au=e=>e.replace(/^v/,""),ry=(e,t)=>{let n=au(e).split(".").map(Number),r=au(t).split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let s=n[o]??0,i=r[o]??0;if(s>i)return 1;if(s<i)return-1}return 0},du=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Ri&&Date.now()-iu<ny)return Ri;try{let t=await fetch(ty);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?ry(r,e)>0:!1};return Ri=o,iu=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},cu=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,i)=>s!=n[i]);return r.map((s,i)=>i>=o?Ai.hex(y.accent).dim(s):Ai.hex(y.secondary).dim(s)).join(Ai.hex(y.secondary2).dim("."))};function pu(){let[e,t]=sy({current:Xt,latest:null,updateAvailable:!1});return oy(()=>{let n=!0;return du(Xt).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?mu.createElement(uu,{dimColor:!0,color:y.secondary2},Xt+" "):mu.createElement(uu,null,lu.hex(y.secondary2).dim(Xt),lu.hex(y.accent).dim(" \u2197 "),cu(Xt,e.latest))}function wr({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=H(),{userName:i,preferredEditor:c,autoSync:u}=K(),m=64,p=process.stdout.columns-m-8,f=t||n==="replay",b=s?rn(s.currentLabel,Math.max(0,p)):"";return ye.createElement(Tr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?ye.createElement(Tr,{paddingLeft:1},ye.createElement(_n,{color:y.secondary2},b)):f?ye.createElement(_n,null," "):o===v.PALETTE?ye.createElement(Tr,null,ye.createElement(_n,{color:y.accent},"Command Palette"),ye.createElement(_n,{dimColor:!0,color:y.secondary2}," ","- search, select and press enter")):ye.createElement(Tr,{paddingLeft:1},e.length>0?ye.createElement(Zl,{filters:e}):ye.createElement(Jl,{width:p})),n==="live"?ye.createElement(Tr,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},ye.createElement(su,{autoSync:!!u,syncStatus:r}),ye.createElement(_n,null,ns.hex(y.secondary2).dim("Mode: ")+ns.hex(y.secondary2).dim(o.padEnd(8," "))," "),ye.createElement(fu,{icon:"@",value:i}),ye.createElement(fu,{icon:"\u276F",value:c}),ye.createElement(pu,null)):"",n==="peek"?ye.createElement(eu,null):"",n==="replay"?ye.createElement(tu,null):"")}function fu({icon:e,value:t}){return ye.createElement(_n,null,ns.dim(e)+ns.hex(y.accent)(` ${t??"-"} `))}import{Box as iy,Text as ay}from"ink";import Mr from"react";import{Box as rs,Text as Ti}from"ink";import Jt from"react";function wi(){let e=H(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?G(t?.id):[];return Jt.createElement(rs,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},Jt.createElement(rs,{padding:1,paddingTop:0,paddingBottom:0},Jt.createElement(Ti,null,"Select a board:")),Jt.createElement(rs,{padding:1,flexDirection:"column"},i.map((c,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,f=G(c.id).flatMap(({id:b})=>q(b)).length;return Jt.createElement(rs,{key:c.id??u},Jt.createElement(Ti,{color:m?y.accent:y.secondary2},Jt.createElement(Re,{isSelected:m})),Jt.createElement(Ti,{color:m?y.accent:y.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var dy=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:i})=>{let{renderedChildrenIndex:c}=H(),u=n.find(({context:b})=>b==="BOARD"),f=s-1-3;return Mr.createElement(iy,{flexDirection:"row"},e.context==="WORKSPACE"?Mr.createElement(wi,null):u?Mr.createElement(Ao,{height:f,width:i,swimlanes:(c[u.id]??[]).filter(b=>b!==void 0&&Dt(b)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Mr.createElement(ay,null))},gu=Mr.memo(dy);import{useEffect as cy}from"react";var ly=e=>{cy(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:i}=K();i&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:u}=g();u==="default"&&!c&&ao(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},vu=({autoSync:e})=>(ly(e),null);function Mi({width:e,height:t}){let n=H(),{autoSync:r,viewMode:o}=xa(),s=n.filters;if(n.mode===v.HELP)return de.createElement(Qt,{flexDirection:"column"},de.createElement(ql,{width:e,height:t}));if(n.mode===v.PALETTE)return de.createElement(Qt,{flexDirection:"column"},de.createElement(wr,{filters:s}),de.createElement(Fl,{width:e,height:t-2}),de.createElement(Ar,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=_t(),c=!i,u=i&&!n.hasProjectDefinition;if(c)return de.createElement(Qt,{flexDirection:"column"},de.createElement(Qt,{flexDirection:"column"},de.createElement(wr,{hideBreadCrumb:!0,filters:s}),de.createElement(Ei,{height:t,width:e})),de.createElement(Ar,{width:e,mode:n.mode,availableHints:n.availableHints}));if(u)return de.createElement(Qt,{flexDirection:"column"},de.createElement(Qt,{flexDirection:"column"},de.createElement(wr,{hideBreadCrumb:!0,filters:s}),de.createElement(Yl,{height:t,width:e})),de.createElement(Ar,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=Le(n.breadCrumb??[],"BOARD");if(ne(m)){let p=m.value.id,f=G(p).length,b=3,C=Math.floor(e/b),N=Math.floor(e/Math.max(f,1));e=Math.min(N,C)*Math.max(f,b)}return de.createElement(Qt,{flexDirection:"column"},de.createElement(vu,{autoSync:r}),de.createElement(Qt,{flexDirection:"column"},de.createElement(wr,{filters:s}),de.createElement(gu,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),de.createElement(Ar,{width:e,mode:n.mode,availableHints:n.availableHints}))}import uy from"readline";var os,ss,bt,my=new Set([h.MoveCursorLeft,h.EraseInputWord,h.MoveCursorLeftOfWord,h.MoveCursorRight,h.MoveCursorRightOfWord,h.NavToPreviousContainer,h.NavToNextContainer,h.NavPreviousItem,h.NavNextItem,h.SetViewDense,h.SetViewWide,h.Confirm,h.Exit,h.Yank,h.InitCommandLine,h.InitCommandPalette,h.ExitCommandLine,h.CaptureInput,h.EraseInput,h.EraseInputWord,h.HideHelp,h.ViewHelp,h.SetViewDense,h.SetViewWide,h.GetLastCommandFromHistory,h.GetNextCommandFromHistory,h.AutoCompleteCommand]),py=new Set([h.NavPreviousItem,h.NavNextItem,h.NavToPreviousContainer,h.NavToNextContainer,h.Confirm,h.Exit,h.InitCommandPalette,h.InitMove,h.MoveNextItem,h.MovePreviousItem,h.MoveToNextContainer,h.MoveToPreviousContainer,h.Delete,h.AddItem,h.EditTitle,h.EditDescription,h.ConfirmMove,h.Edit,h.ViewHelp,h.Yank]),yu=async e=>{if(e.ctrl&&e.name==="c")return T.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=g(),s=Yd(e,n);if(!s||r&&!my.has(s)||o==="replay"&&n===v.DEFAULT&&py.has(s))return;let i=t[n]?.[s];if(i?.action)try{await i.action(i,e)}catch(c){logger.error(c)}},fy=()=>async function(t,n){n.name!=="escape"&&(bt&&(clearTimeout(bt),bt=void 0),await yu(n))},gy=()=>async function(t){if(t.length===1&&t[0]===27){bt&&clearTimeout(bt),bt=setTimeout(()=>{yu({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),bt=void 0},25);return}bt&&(clearTimeout(bt),bt=void 0)};function hu(){os&&process.stdin.removeListener("keypress",os),ss&&process.stdin.removeListener("data",ss),os=fy(),ss=gy(),uy.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",ss),process.stdin.on("keypress",os)}async function xu(){try{let e=wn();ne(e)&&Fe(e.value);let t=qe(process.cwd()),n=[];if(ne(t)){let s=Pe({repoRoot:t.value});if(d(s))return dn(3,s.message);let i=yn(),c=await tn({repoRoot:t.value,stateBranchRoot:s.value,stateBranchName:i.stateBranch});if(d(c))return dn(3,c.message);let u=await _({cwd:s.value,args:["pull","--ff-only"]});d(u)&&logger.info(3,u.message);let m=Et(s.value);if(d(m))return dn(3,m.message);n=m.value}let r=an(n);if(d(r))return dn(4,r.message);E({hasProjectDefinition:ne(t),hasInitializingEvents:!!n.length});let o=Pi();return d(o)?dn(6,o.message):(hu(),l("Booted Epiq",void 0))}catch(e){return dn(0,oo(e))}}hc();var xy=`${Zt.bold("Epiq CLI")}
57
+ `,Ni.writeFileSync(t,n,"utf8"),se.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),u("Local epiq paths ignored",!0)};var hv=async e=>{let t=await F({cwd:e,args:["status","--porcelain"]});return d(t)?t:u("Checked git diff",t.value.stdout.trim().length>0)},ne=(e,t)=>a(`[${e}] ${t}`),Zc=async()=>{V("");let e=Sn(),t=await gt(process.cwd());if(d(t))return ne(1,t.message);let n=t.value,r=await jr(n);if(d(r))return ne(2,r.message);if(r.value)return ne(2,`Cannot initialize Epiq while a git operation is in progress: ${r.value}`);let o=await hv(n);if(d(o))return ne(2.5,o.message);if(o.value)return ne(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Bs(n))return ne(4,"Epiq project already initialized");let s=Vt();if(!s.isSetupDone||!s.userName)return ne(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let i=K(),c=i.userName,l=i.userId;if(!l||!c)return ne(5,"Missing Epiq user id");let m=e.stateBranch,p=await Vr({repoRoot:n,branch:m});if(d(p))return ne(6,p.message);if(p.value)return ne(6,`State branch already exists: ${m}`);let f=await Hs({repoRoot:n,stateBranchName:m});if(d(f))return ne(6,f.message);let g=zr();if(d(g))return ne(7,g.message);let I=Qc.join(Kr(),e.projectId),S=await cn({repoRoot:n,stateBranchRoot:I,stateBranchName:m});if(d(S))return ne(8,S.message);let R=Qc.join(I,".epiq");yv.mkdirSync(R,{recursive:!0});let A=Md({userId:l,userName:c});if(d(A))return ne(9,A.message);for(let Ss of A.value){let ra=mo({event:Ss,rootDir:I});if(d(ra))return ne(9,ra.message)}let P=await Jr({stateBranchRoot:I,eventFileName:un({userId:l,userName:c})});if(d(P))return ne(10,P.message);let _=await Nn({cwd:I,message:"[epiq:init]"});if(d(_))return ne(10,_.message);let w=await Jc(n);if(d(w))return ne(11,w.message);let W=sa({repoRoot:n,fileContents:e});if(d(W))return ne(12,W.message);let H=await le.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(H))return ne(13,H.message);let D=await le.commit({cwd:n,message:"[epiq:init-project]"});if(d(D))return ne(13,D.message);let $="Project initialized!",Ye=await F({cwd:n,args:["push","-u","origin","HEAD"]});d(Ye)&&($+=` Warn: [init:14] ${Ye.message}`);let we=await sr({repoRoot:n,stateBranchRoot:I});d(we)&&($+=` Warn: [init:15] ${we.message}`);let ge=st(A.value).filter(d);if(ge.length>0)return ne(16,ge.map(Ss=>Ss.message).join(`
58
+ `));let me=We();if(d(me))return ne(16,me.message);let{rootNodeId:Gn,nodes:Kn}=me.value,na=Kn[Gn];return na?(M.navigate({contextNode:na,selectedIndex:0}),C({hasProjectDefinition:!0,mode:y.DEFAULT}),u($,null)):ne(16,"Unable to resolve initialized root node")};import{ulid as bv}from"ulid";import{ulid as xv}from"ulid";var el=null,Zt=()=>structuredClone(el),Cr=e=>{el=e},tl=()=>{let{contextNode:e,selectedIndex:t}=v(),r=Y(e.id)[t];return r?u("Resolved selected child",r):a("Target node not found")},Ri=({id:e,parentId:t,position:n={at:"end"}})=>{let r=Y(t).filter(o=>o.id!==e);return po(r,n)},nl=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ie();if(d(r))return a("Unable to resolve user ID");let o=Ri({parentId:t,id:e,position:n});return d(o)?o:u("Created pending move state",{id:xv(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},rl=e=>{Cr(e);let t=jt(e,!0);return d(t)?t:u("Node moved successfully",t.value)};function Ai(e){let t=tl();if(d(t))return t;let{contextNode:n,nodes:r}=v();if(!n.parentNodeId)return a("Missing parent node id");let o=r[n.parentNodeId];if(!o)return a("Missing parent node");let s=Y(o.id),i=s.findIndex(({id:m})=>m===n.id);if(i<0)return a("Current node not found among siblings");let c=s[i+e];if(!c)return a("Missing sibling node");let l=nl({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(l)?l:rl(l.value)}function Ti(e){let t=tl();if(d(t))return t;let{contextNode:n,selectedIndex:r}=v(),s=Y(n.id)[r+e];if(!s)return a("Missing sibling node");let i=nl({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(i)?i:rl(i.value)}var ol=()=>{let e=Zt();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,r=v().nodes[n];if(!r)return a("Move parent not found");let o=Y(n).findIndex(s=>s.id===t);return o===-1?a("Moved node not found among rendered children"):(M.navigate({contextNode:r,selectedIndex:o}),u("Synchronized navigation to moved node",null))},Ho=(e,t="Moved preview")=>{if(d(e))return e;let n=ol();return d(n)?n:(C({mode:y.MOVE}),u(t,null))},sl=async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=X().commandMeta,{contextNode:n,selectedIndex:r}=v(),o=Y(n.id)[r];if(!o)return C({mode:y.DEFAULT}),a("No move target");if(t==="start"){if(o.readonly)return a("Target node is read-only");if(r===-1)return a("No item selected");if(!o.parentNodeId)return a("Target has no parent");let s=Y(o.parentNodeId),i=s.findIndex(({id:f})=>f===o.id);if(i===-1)return a("Target not found among siblings");let c=s[i-1],l=s[i+1],m=l!=null?{at:"before",sibling:l.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=Ri({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(Cr({id:bv(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),C({mode:y.MOVE}),u("Move initialized",null))}if(t==="next")return Ho(Ti(1));if(t==="previous")return Ho(Ti(-1));if(t==="to-next")return Ho(Ai(1));if(t==="to-previous")return Ho(Ai(-1));if(t==="confirm"){let s=Zt();if(!s)return a("No pending move to confirm");let i=await yt();if(d(i))return i;let c=U([s],i.value);if(d(c))return c;let l=ol();return d(l)?l:(Cr(null),C({mode:y.DEFAULT}),u("Moved item",null))}return t==="cancel"?(Cr(null),C({mode:y.DEFAULT}),u("Cancelling move",null)):a("Invalid move modifier")};import{ulid as Wo}from"ulid";import{monotonicFactory as Iv,ulid as Ev}from"ulid";var Sv=Iv(),jo=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=Sv();return u("Created issue events",[{id:Ev(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var il=async(e,t)=>{let n=ie();if(d(n))return a("Unable to resolve user ID");let r=await yt();if(d(r))return r;let o=r.value;if(!t.inputString)return a(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:c}=v(),l=m=>{let p=U([m],o);if(d(p))return p;let f=E.getNode(p.value[0].result.id);if(!f)return a("Created node not found");if(!f.parentNodeId)return p;let g=E.getNode(f.parentNodeId);return g?(M.navigate({contextNode:g,selectedIndex:E.getSiblings(f.parentNodeId).findIndex(({id:I})=>I===f.id)}),p):a("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=v(),p=E.getNode(m);if(!p)return a("Workspace not found");let f=Pn(p.id,n.value,o);return d(f)?f:l({id:Wo(),action:"add.board",payload:{id:Wo(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=Ue(s,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=Pn(m.value.id,n.value,o);return d(p)?p:l({id:Wo(),action:"add.swimlane",payload:{id:Wo(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=z(i.id)[c],p=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let _=Ue(s,"SWIMLANE");return d(_)?null:_.value})();if(!p)return a("Unable to add issue in this context");let f=Pn(p.id,n.value,o);if(d(f))return f;let g=jo({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(d(g))return g;let I=g.value,S=U([...I],o);if(d(S))return S;if(!S.value[0])return a("Issue creation failed");let P=I.find(_=>_.action==="add.issue")?.payload.id;return P?(M.navigate({contextNode:p,selectedIndex:E.getSiblings(p.id).findIndex(({id:_})=>_===P)}),u("Issue created",null)):a("Unable to determine ticket id")}return u("Success",null)};var Vo=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=v(),s=uo(n,t);if(d(s))return a(s.message);let{appliedEvents:i,unappliedEvents:c}=s.value,l=it();if(d(l))return l;let p=st(i).filter(d);if(p.length>0)return it(),C(o),a(p.map(g=>g.message).join(", "));let f=v().nodes[e];return f?(M.navigate({contextNode:f,selectedIndex:r}),u("",{unappliedEvents:c})):(it(),C(o),a("Board did not exist at that date"))};var Cv=20,Nv=16,Rv=150,Go=null,Ko=null;var bn=()=>{Go!==null&&(clearInterval(Go),Go=null),Ko!==null&&(clearTimeout(Ko),Ko=null)},al=()=>{bn(),C({mode:y.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Av=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)},dl=({events:e,startTime:t,durationMs:n})=>{bn();let r=e.length,o=e.map(f=>zt(f)??t),s=o[r-1]??Date.now(),i=Av(o),c=Math.max(1,Math.round(n*Cv/1e3)),l=Math.max(Math.round(n/c),Nv),m=0,p=0;C({mode:y.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Go=setInterval(()=>{m++;let f=m/c,g=[],I;for(;p<r&&i[p]<=f;){let R=e[p],A=jt(R);if(d(A)){al();return}g.push(...qs(R)),I=R,p++}if(p>=r||m>=c){for(;p<r;p++){let A=jt(e[p]);if(d(A))break}let R=v().replay;C({unappliedEvents:[],replay:R&&{...R,progress:1,appliedCount:r}}),bn(),Ko=setTimeout(al,Rv);return}let S=v().replay;C({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:I?zt(I)??S?.currentTime??t:S?.currentTime??t,currentLabel:I?cd(I):S?.currentLabel??"",flashNodeIds:I?[...new Set(g)]:S?.flashNodeIds??[]}})},l)};var cl=async()=>{let e=Ue(v().breadCrumb,"BOARD");if(d(e))return e;let t=await gt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Re({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=X().commandMeta;if(bn(),r==="now"){let c=je(n.value);if(d(c))return a(c.message);let l=it();if(d(l))return l;let p=st(c.value).filter(d);return p.length>0?a(p.map(f=>f.message).join(", ")):(C({mode:y.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[],replay:null}),u("Peeking now",!0))}let s;if(r==="prev"){let c=v().eventLog.at(-1),l=zt(c);if(l===null)return a("No previous event to peek");s=l}else if(r==="next"){let c=v().unappliedEvents.at(0),l=zt(c);if(l===null)return a("No next event to peek");s=l+1}else{let c=gn(r||o.trim());if(!c)return a("Invalid peek date");s=c.getTime()}let i=Vo({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return d(i)?i:(C({mode:y.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),u("Peeking",!0))};var ll=async()=>{let e=Ue(v().breadCrumb,"BOARD");if(d(e))return e;let t=await gt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Re({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=X().commandMeta,{dateInput:s,durationInput:i}=Eo(r,o);if(bn(),v().syncStatus.status==="syncing")return a("Cannot replay while syncing, try again in a moment");let c=gn(s);if(!c)return a("Invalid replay date");let l=i?Io(i):15e3;if(l===null)return a("Invalid replay duration (try e.g. 30s or 2m)");let m=c.getTime(),p=v(),f=Vo({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(),C(p),u("Nothing to replay from that point",!0)):(dl({events:g,startTime:m,durationMs:l}),u("Replaying board history",!0))};import wv from"zod";var ul=()=>{let e=X().commandMeta.inputString,t=wv.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return a("Auto sync duration must be a number of at least 3000 ms");let n=Qe({autoSyncDebounceMs:t.data});return d(n)?n:(Me({autoSyncIntervalMs:t.data}),C({mode:y.DEFAULT}),u(`Auto sync interval set to ${t.data}ms`,null))};var ml=()=>{let e=X().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=Ud(e),n=Qe({autoSync:t});return d(n)?n:(Me({autoSync:t}),C({mode:y.DEFAULT}),u(`Auto sync set to "${e}"`,null))};var pl=()=>{let e=X().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=Qe({logLevel:e});return d(n)?n:(Me({logLevel:e}),C({mode:y.DEFAULT}),u(`Auto sync set to "${e}"`,null))};import{spawn as Mv}from"node:child_process";var Pv=()=>{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"]}}},fl=async e=>new Promise(t=>{let{command:n,args:r}=Pv();try{let o=Mv(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(a(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?u("Copied to clipboard",null):a(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(a(`Clipboard tool not available (${n})`))}});var Nr=async(e,t)=>{if(!e.trim())return a(`Nothing to copy: ${t} is empty`);let n=await fl(e);return d(n)?n:u(`Copied ${t} to clipboard`,null)},gl=async e=>{let{breadCrumb:t,selectedNode:n}=v(),r=fr({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return a("Nothing selected to copy from");switch(e.modifier){case ye.REF:return Nr(He(o.id),"ref");case ye.TITLE:return Nr(o.title,"title");case ye.DESCRIPTION:return r?Nr(r.props?.description??"","description"):a("No issue in scope");case ye.TAGS:{if(!r)return a("No issue in scope");let s=Gt(r).map(({name:i})=>i);return Nr(s.join(", "),"tags")}case ye.ASSIGNEES:{if(!r)return a("No issue in scope");let s=Kt(r).map(({name:i})=>i);return Nr(s.join(", "),"assignees")}default:return a("Yank one of: ref, title, description, tags, assignees")}};var vl=async()=>{V(""),C({mode:y.DEFAULT});let e=We();if(d(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");C({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await vo();return d(t)?(C({syncStatus:{msg:t.message,status:"failed"}}),t):(C({mode:y.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var Lv=e=>e.action==="add.issue.comment",yl=e=>Object.values(v().tags).find(t=>t.name===e),hl=()=>{let{eventLog:e=[],contributors:t}=v(),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)){if(o.tombstoned){n.set(o.id,o.name);continue}n.set(o.id,Fn(o.name,n.get(o.id))??o.name)}return[...n.entries()].map(([o,s])=>({id:o,name:s,isExternal:!r.has(o)}))},kt=async()=>{let e=await yt();return d(e)?e:u("Resolved persist root",e.value)},zo=[{systemOnly:!0,intent:k.Move,description:"Internal move-state command",mode:y.COMMAND_LINE,action:sl},{intent:k.Delete,description:"Delete the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=z(t.id)[n];if(!r)return a("Unable to resolve child to delete");let o=await kt();if(d(o))return o;if(r.context==="COMMENT"){let s=r.id,i=T(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let c=v().nodes[i];if(!c||!T(c))return a("Unable to resolve comment issue");let l=c.log?.filter(Lv).find(m=>m.payload.id===s);return l?l.payload.author!==e.value.userId?a("You can only delete your own comments"):U([{id:Be(),action:"delete.issue.comment",payload:{id:s,issue:i},...e.value}],o.value):a("Unable to resolve comment")}return U([{id:Be(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)},onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:y.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=X().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(i=>ae(b.FILTER).map(c=>c.split(n)[0]).includes(i))(r))return a("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return pe(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:y.DEFAULT})),u("Filter updated",null)}},{intent:k.ViewHelp,description:"Open the help screen",mode:y.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return Qt({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),C({mode:y.HELP}),u("Viewing help",null)}},{intent:k.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=z(t.id)[n];if(!r)return a("Unable to close issue, no target found");if(!T(r))return a("Cannot close in this context");let o=v().nodes[ve];if(!o)return a("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return a("Issue is already closed");let s=await kt();if(d(s))return s;let i=s.value,c=mn(o.id,r.id,{at:"end"},e.value,i);if(d(c))return c;let l=U([{id:Be(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value}],i);return d(l)?l:u("Issue closed",null)},onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=z(t.id)[n];if(!r)return a("Unable to reopen issue, no target found");let o=r.context==="TICKET"?u("Resolved ticket",r):At(r.id,"TICKET");if(d(o))return a("Cannot reopen in this context");let s=o.value,i=v().nodes[ve];if(!i)return a("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return a("Issue is not closed");if(!T(s))return a("Target node is not issue");let c=Oo(s);if(!c)return a("Unable to resolve previous parent from issue history");if(c===i.id)return a("Previous parent resolves to closed swimlane");let l=v().nodes[c];if(!l)return a("Previous parent no longer exists");let m=await kt();if(d(m))return m;let p=m.value,f=mn(l.id,s.id,{at:"end"},e.value,p);if(d(f))return f;let g=U([{id:Be(),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:()=>C({mode:y.DEFAULT})},{intent:k.Init,description:"Initialize Epiq in the current git repository",mode:y.COMMAND_LINE,action:Zc},{intent:k.NewItem,description:"Create a new board, swimlane, or issue",mode:y.COMMAND_LINE,action:il,onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.Rename,description:"Rename the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=z(t.id)[n];if(!r)return a("Missing node");if(r.readonly)return a("Cannot rename readonly node");let o=vc();if(!o)return a("Provide a title");let s=await kt();return d(s)?s:U([{id:Be(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)},onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.UntagTicket,description:"Remove a tag from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=X().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let o=yl(r);if(!o)return a(`Tag "${r}" does not exist`);let{selectedNode:s}=v();if(!s)return a("Invalid untag target");let i=At(s.id,"TICKET");if(d(i))return a("Unable to untag issue in this context");let c=i.value;if(!T(c))return a("Target node is not issue");if(!(c.props.tags??[]).includes(o.id))return a("Issue is not tagged with that tag");let m=await kt();return d(m)?m:U([{id:Be(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}],m.value)},onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.TagTicket,description:"Add or create a tag on the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=X().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let{selectedNode:o}=v();if(!o)return a("Invalid tag target");let s=At(o.id,"TICKET");if(d(s))return a("Unable to tag issue in this context");let i=s.value;if(!T(i))return a("Target node is not issue");let c=await kt();if(d(c))return c;let l=yl(r),m=l?.id??Be();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):U([...l?[]:[{id:Be(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:Be(),action:"add.issue.tag",payload:{id:i.id,tag:m},...e.value}],c.value)},onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.AssignUserToTicket,description:"Assign a user to the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=X().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return a("Provide an assignee");let{selectedIndex:i,contextNode:c}=v(),l=z(c.id)[i];if(!l)return a("Invalid assign target");let m=At(l.id,"TICKET");if(d(m))return a("Unable to assign issue in this context");let p=m.value;if(!T(p))return a("Target node is not issue");let f=await kt();if(d(f))return f;let g=hl(),I=!o&&s.toLowerCase()==="me",S,R;if(I)S=e.value.userId,R=g.find(_=>_.id===S)?.name??e.value.userName;else{let _=g.filter(W=>W.name===s);if(_.length>1)return a(`"${s}" matches ${_.length} contributors (${_.map(W=>W.id).join(", ")}). Assign from the GUI to choose by id.`);let w=_[0];if(!w&&!o)return a(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);S=w?.id??Be(),R=w?.name??s}if((p.props.assignees??[]).includes(S))return a("Assignee already assigned");let P=!!v().contributors[S];return U([...P?[]:[{id:Be(),action:"create.contributor",payload:{id:S,name:R},...e.value}],{id:Be(),action:"add.issue.assignee",payload:{id:p.id,assignee:S},...e.value}],f.value)},onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=ie();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=X().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee to remove");let{selectedNode:o}=v();if(!o)return a("Invalid unassign target");let s=At(o.id,"TICKET");if(d(s))return a("Unable to unassign in this context");let i=s.value;if(!T(i))return a("Target node is not issue");let c=i.props.assignees??[],l=r.toLowerCase()==="me",m=l?c.filter(g=>g===e.value.userId):hl().filter(g=>g.name===r&&c.includes(g.id)).map(g=>g.id);if(m.length>1)return a(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return a(l?"Issue is not assigned to you":`Issue is not assigned to "${r}"`);let f=await kt();return d(f)?f:U([{id:Be(),action:"remove.issue.assignee",payload:{id:i.id,assignee:p},...e.value}],f.value)},onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.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 a("Provide a comment");if(n.length>Dn)return a(`Cannot exceed ${Dn} characters`);let r=ie();if(d(r))return a("Unable to resolve user ID");let{breadCrumb:o,selectedNode:s}=v(),i=Ue([...o,s],"TICKET");if(d(i))return a("Edit target must be an issue");let c=i.value;if(!c)return a("Invalid comment target");let l=c.context==="TICKET"?u("Resolved ticket",c):At(c.id,"TICKET");if(d(l))return a("Unable to comment on issue in this context");let m=l.value;if(!T(m))return a("Target node is not issue");let p=await kt();return d(p)?p:U([{id:Be(),action:"add.issue.comment",payload:{id:Be(),issue:m.id,author:r.value.userId,md:n},...r.value}],p.value)},onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.Sync,description:"Pull, commit, and push Epiq state",mode:y.COMMAND_LINE,action:vl},{intent:k.Peek,description:"View board state at another point in time",mode:y.COMMAND_LINE,action:cl},{intent:k.Replay,description:"Replay board history forward from a point in time",mode:y.COMMAND_LINE,action:ll},{intent:k.Export,description:"Export the current board layout to markdown",mode:y.COMMAND_LINE,action:async()=>{let e=await Hc();return d(e)?e:(C({mode:y.DEFAULT}),u("Export successful",!0))}},{intent:k.Exit,description:"Exit the application",mode:y.COMMAND_LINE,action:async()=>(M.exit(),u("Exit successful",!0))},{intent:k.Edit,description:"Edit title or description",mode:y.COMMAND_LINE,action:async(e,t)=>Xc(t),onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:y.COMMAND_LINE,action:async(e,t)=>gl(t),onSuccess:()=>C({mode:y.DEFAULT})},{intent:k.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 re.USERNAME:{let{userId:r,preferredEditor:o,userName:s}=K(),i=n||s,c=r??Be();if(!i||!c)return a("Unable to resolve user name or id");let l=Qe({userName:i,userId:c,preferredEditor:o??""});return d(l)?l:(Me({userName:i,userId:c}),C({mode:y.DEFAULT}),u(`Username set to "${i}"`,null))}case re.EDITOR:{if(!n)return a("No editor provided");let r=Qe({preferredEditor:n});return d(r)?r:(Me({preferredEditor:n}),C({mode:y.DEFAULT}),u(`Editor configuration set to "${n}"`,null))}case re.VIEW:{if(n!=="wide"&&n!=="dense")return a("Invalid view mode");let r=Qe({viewMode:n});return d(r)?r:(Me({viewMode:n}),C({mode:y.DEFAULT}),u(`View set to "${n}"`,null))}case re.AUTOSYNC:return ml();case re.LOG_LEVEL:return pl();case re.SYNC_DEBOUNCE_MS:return ul();case re.ATTACHMENT_MAX_KB:return Xd();default:return a("Unknown config command")}}},{intent:k.Coffee,description:"Sponsor the development of Epiq!",mode:y.COMMAND_LINE,action:()=>{let e=X().commandMeta.modifier;return e==="custom"?Sr("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):Sr(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),V(""),u("Thanks you!",null)}}];var kv=new Set(["peek","replay","filter","view-help","yank"]),St=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=X();if(!t)return a("No command to confirm");if(!e&&n===bt.Invalid)return a("Invalid command");let s=wo(t);uc();let{readOnly:i}=v();if(i&&!kv.has(s))return hr({status:Bt.Fail,message:"Command not available in readonly state",value:null});let c=zo.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return hr({status:Bt.Fail,message:"Command not found",value:null});let l;try{l=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return hr({status:Bt.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(l)?hr(l):(mc({addToHistory:!e}),c.onSuccess?.(),K().autoSync&&ho(),l)};var qo=[{intent:x.Exit,mode:y.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(C({mode:y.COMMAND_LINE}),V("move cancel"),St({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:y.DEFAULT,description:"[m] move (init/confirm)",action:()=>(C({mode:y.COMMAND_LINE}),V("move start"),St({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:y.MOVE,action:()=>(C({mode:y.COMMAND_LINE}),V("move confirm"),St({isForceExecutedBySystem:!0}))}],Yo=[{intent:x.MovePreviousItem,mode:y.MOVE,action:()=>Zt()?(C({mode:y.COMMAND_LINE}),V("move previous"),St({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveNextItem,mode:y.MOVE,action:()=>Zt()?(C({mode:y.COMMAND_LINE}),V("move next"),St({isForceExecutedBySystem:!0})):a("No pending move")}],xl=[{intent:x.MoveToNextContainer,mode:y.MOVE,action:()=>Zt()?(C({mode:y.COMMAND_LINE}),V("move to-next"),St({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveToPreviousContainer,mode:y.MOVE,action:()=>Zt()?(C({mode:y.COMMAND_LINE}),V("move to-previous"),St({isForceExecutedBySystem:!0})):a("No pending move")}];var bl={[B.WORKSPACE]:[...qo,...Yo],[B.BOARD]:[...qo,...Yo],[B.SWIMLANE]:[...qo,...Yo,...xl],[B.TICKET]:[],[B.FIELD]:[],[B.FIELD_LIST]:[],[B.TEXT]:[],[B.COMMENT]:[]};import Dv from"node:fs";import Bv from"node:path";var Il=e=>{let t=_e(process.cwd());if(d(t))return a("Unable to resolve project root");let n=Re({repoRoot:t.value});if(d(n))return a(n.message);let r=kn(e.hash,e.ext),o=Bv.join(nr(n.value),r);return Dv.existsSync(o)?(Sr(o),u(`Opened ${e.name}`,null)):a("Attachment file not found \u2014 run :sync to fetch it")};var El=()=>{V("");let{pendingNavTarget:e}=Jt();C({mode:y.DEFAULT}),e&&M.navigate(e),Qt({pendingNavTarget:void 0})},Sl=[{intent:x.ExitCommandLine,mode:y.HELP,action:()=>(El(),u("Exiting help",null))},{intent:x.Exit,mode:y.HELP,action:()=>(El(),u("Closed help",null))},{intent:x.NavPreviousItem,mode:y.HELP,description:"[arrows/hjkl] navigate",action:()=>(M.navigateToPreviousItem(),u("Navigating to previous help item",null))},{intent:x.NavNextItem,mode:y.HELP,action:()=>(M.navigateToNextItem(),u("Navigating to next help item",null))},{intent:x.NavToPreviousContainer,mode:y.HELP,action:()=>(M.navigateToPreviousContainer(),u("Navigating to previous help container",null))},{intent:x.NavToNextContainer,mode:y.HELP,action:()=>(M.navigateToNextContainer(),u("Navigating to next help container",null))}];var Fv=e=>{C({mode:y.COMMAND_LINE});let{pendingNavTarget:t}=Jt();t&&M.navigate(t),Qt({pendingNavTarget:void 0}),V(`${e} `)},Cl=()=>{V("");let{pendingNavTarget:e}=Jt();e&&M.navigate(e),Qt({pendingNavTarget:void 0}),C({mode:y.DEFAULT})},Nl=[{intent:x.InitCommandPalette,mode:y.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{V("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return Qt({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),C({mode:y.PALETTE}),u("Opening command palette",null)}},{intent:x.Confirm,mode:y.PALETTE,action:()=>{let{selectedNode:e}=v();if(!e||!Ot(e))return a("Command only applicable on text nodes");if(e.props.disabled)return a("Command is not available in this context");let t=e.title;return t?(Fv(t),u("Selected command",t)):u("No command selected",null)}},{intent:x.ExitCommandLine,mode:y.PALETTE,action:()=>(Cl(),u("Exiting palette",null))},{intent:x.Exit,mode:y.PALETTE,action:()=>(Cl(),u("Closed command palette",null))},{intent:x.NavPreviousItem,mode:y.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(M.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:x.NavNextItem,mode:y.PALETTE,action:()=>(M.navigateToNextItem(),u("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:y.PALETTE,action:()=>(M.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:y.PALETTE,action:()=>(M.navigateToNextContainer(),u("Navigating to next container",null))}];var Rl=[...Sl,...Nl,{intent:x.AddItem,mode:y.DEFAULT,description:"[n] new...",action:()=>(C({mode:y.COMMAND_LINE}),V(`${b.NEW} `),u("Adding new item",null))},{intent:x.Delete,mode:y.DEFAULT,description:"[d] delete",action:()=>(C({mode:y.COMMAND_LINE}),V(`${b.DELETE} `),u("Deleting item",null))},{intent:x.InitCommandLine,mode:y.DEFAULT,description:"[:] focus command line",action:()=>(C({mode:y.COMMAND_LINE}),V(""),u("Entering command line mode",null))},{intent:x.Confirm,mode:y.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!Y(e?.id??"")?.length){let r=e?E.getAttachment(e.id):void 0;if(r)return Il(r);if(e?.title===Z.DESCRIPTION)return C({mode:y.COMMAND_LINE}),V(`${b.EDIT} description `),u("Propose command",!0);if(e?.title===Z.ASSIGNEES)return C({mode:y.COMMAND_LINE}),V(`${b.ASSIGN} `),u("Propose command",!0);if(e?.title===Z.TAGS)return C({mode:y.COMMAND_LINE}),V(`${b.TAG} `),u("Propose command",!0);if(t.title===Z.DESCRIPTION&&e?.context==="TEXT")return C({mode:y.COMMAND_LINE}),V(`${b.EDIT} description `),u("Propose command",!0)}return M.enterChildNode(),u("Entering context",null)}},{intent:x.Yank,mode:y.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=v(),t=e?.title===Z.DESCRIPTION?ye.DESCRIPTION:e?.title===Z.TAGS?ye.TAGS:e?.title===Z.ASSIGNEES?ye.ASSIGNEES:ye.REF,r=ae(b.YANK).includes(t)?t:ye.REF;return C({mode:y.COMMAND_LINE}),V(`${b.YANK} ${r}`),u("Propose command",!0)}},{intent:x.EditTitle,mode:y.DEFAULT,description:"[r] rename title",action:()=>(C({mode:y.COMMAND_LINE}),V(`${b.EDIT} title ${v().selectedNode?.title}`),u("Exiting context",null))},{intent:x.EditDescription,mode:y.DEFAULT,description:"[e] edit description",action:()=>(C({mode:y.COMMAND_LINE}),V(`${b.EDIT} description `),u("Exiting context",null))},{intent:x.Exit,mode:y.DEFAULT,description:"[q] exit context",action:()=>(M.enterParentNode(),u("Exiting context",null))},{intent:x.NavPreviousItem,mode:y.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(M.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:x.NavNextItem,mode:y.DEFAULT,action:()=>(M.navigateToNextItem(),u("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:y.DEFAULT,action:()=>(M.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:y.DEFAULT,action:()=>(M.navigateToNextContainer(),u("Navigating to next container",null))}];var Uv=500,Ov=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Al=e=>{let t=Ov(e);t&&To(n=>(n+t).slice(0,Uv))};var _v=[y.COMMAND_LINE,y.PALETTE],$v=e=>[{intent:x.MoveCursorLeft,mode:e,action:()=>(ui(-1),u("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:e,action:()=>(ui(1),u("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:e,action:()=>(mi("left"),u("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:e,action:()=>(mi("right"),u("Moving cursor right of word",null))},{intent:x.AutoCompleteCommand,mode:e,action:()=>(To((t,{remainder:n})=>{let r=n?t+n:t,o="";return r==="edit title "&&(o=v().selectedNode?.title??""),r+o}),u("Auto-completing command",null))},{intent:x.CaptureInput,mode:e,action:(t,{sequence:n})=>(Al(n??""),u("Capturing input",null))},{intent:x.EraseInput,mode:e,action:()=>(cc(),u("Erasing input",null))},{intent:x.EraseInputWord,mode:e,action:()=>(lc(),u("Erasing input word",null))}],Tl=[{intent:x.Confirm,mode:y.COMMAND_LINE,action:()=>(St(),u("Executing command",null))},{intent:x.ViewHelp,mode:y.DEFAULT,action:()=>(C({mode:y.HELP}),u("Viewing help",null))},..._v.flatMap($v),{intent:x.ExitCommandLine,mode:y.COMMAND_LINE,action:()=>(C({mode:y.DEFAULT}),u("Exiting command line",null))},{intent:x.GetLastCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(pc(),u("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(fc(),u("Getting next command from history",null))}];import Pl from"chalk";var Xo=Pl.dim.hex(h.secondary2)(": for command line"),wl="q to exit",Ml=`${Pl.hex(h.accent)("m")} to confirm`,wi={[B.WORKSPACE]:[Xo],[B.BOARD]:[Xo],[B.BOARD+y.COMMAND_LINE]:[Xo],[B.SWIMLANE]:[Xo],[B.TICKET+y.HELP]:[wl],[B.SWIMLANE+y.HELP]:[wl],[B.TICKET]:[],[B.FIELD]:[],[B.SWIMLANE+y.MOVE]:[Ml],[B.TICKET+y.MOVE]:[Ml]};var Rr=e=>e.trim().toLocaleLowerCase(),Hv=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},jv=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?qt(n,r.name):void 0}).filter(n=>!!n)},Ll=(e,t)=>{let n=Rr(t.value);if(!n)return!0;switch(t.target){case"title":return Rr(e.title??"").includes(n);case"description":return Rr(e.props.description??"").includes(n);case"tag":return Hv(e).map(Rr).some(o=>o.includes(n));case"assignee":return jv(e).map(Rr).some(o=>o.includes(n));case"ref":return Za(e.id,t.value);default:return!0}};function kl(e,t,n){let r=t[e];if(!r)return a("buildBreadCrumb(): current node not found");let o=[],s=r;for(;s&&(o.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let i=o[o.length-1];return!i||i.id!==n?a("buildBreadCrumb(): node is not connected to root"):(o.reverse(),u("Breadcrumb built",o))}var Dl=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 In,Mi,Pi=new Set,Bl=()=>{for(let e of Pi)e()},Vv=e=>(Pi.add(e),()=>Pi.delete(e));function Fl(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return a("derive(): contextNodeId is missing");if(!r)return a("derive(): rootNode is missing");if(!o[r])return a("derive(): unable to find root node");let c=o[t];if(!c)return a("Unable to derive state, contextNode not found");let l=kl(t,o,r);if(d(l))return logger.error(l.message),l;let m=l.value,{context:p}=c,f=wi[p+n]??wi[p]??[],g=[...Rl,...bl[p]??[],...Tl],I=Dl(g),S=Gv(o,s),R=S[t]?.[e.selectedIndex]??null;return u("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:f,availableActions:g,actionIndex:I,selectedNode:R,renderedChildrenIndex:S})}var v=()=>{if(!In)throw new Error("State not initialized. Call initWorkspaceState() first.");return In},We=()=>In?u("Retrieved state",In):a("State not initialized. Call initWorkspaceState() first.");function cr(e){Mi=e;let t=_e(process.cwd()),n=!1;if(!d(t)){let s=ut(t.value);if(d(s))return a(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=Fl(r);return d(o)?o:(In=o.value,Bl(),u("State initialized",null))}function pe(e){let t=v(),n=e(t),r=Fl(n);return d(r)?a(r.message??"Unable to update state"):(In=r.value,Bl(),u("State updated",null))}var C=e=>pe(t=>({...t,...e}));var j=()=>Wv(Vv,v,v),Gv=(e,t)=>{let n={};for(let r of Object.values(e))T(r)&&t.length>0&&!t.every(o=>Ll(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 i=e[o.id],c=e[s.id];return!i||!c?0:i.rank.localeCompare(c.rank)});return n},z=e=>v()?.renderedChildrenIndex[e]??[],it=()=>Mi?cr(Mi):a("Cannot reset state: no initial workspace found"),Wt=()=>In!==void 0;var Li=e=>{Wt()&&(C({syncStatus:e}),Ut({type:"sync-status",payload:e}))},Jo=(e="Syncing...")=>{Li({status:"syncing",msg:e})},Qo=(e="Synced")=>{Li({status:"synced",msg:e})},ki=e=>{Li({status:"failed",msg:e})},et=e=>(ki(e),a(e));import{decodeTime as AD}from"ulid";var Kv=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=J("getRepoRootDir",await gt(e));if(d(n))return a(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=J("getStateBranchRoot",Re({repoRoot:r}));if(d(o))return a(o.message);let s=o.value;logger.debug("[sync] state branch root",s);let i=J("ensureInitialCommit",await Da(r));if(d(i))return a(i.message);logger.debug("[sync] initial commit result",{created:i.value}),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:s,ensureUpstream:t});let c=J("bootstrapStateBranchStorage",await Ua({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(d(c))return a(c.message);logger.debug("[sync] bootstrap result",{bootstrapped:c.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let l=J("hasInProgressGitOperation(stateBranchRoot)",await jr(s));if(d(l))return a(l.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:l.value}),l.value)return logger.info("[sync] state branch git operation in progress"),a("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:s});let m=J("ensureStateBranchLayout",Ia(r,s));return d(m)?a(m.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:c.value}),u("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:c.value}))},zv=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=J("stageStateBranchOwnEventFile",await Jr({stateBranchRoot:t,eventFileName:n}));if(d(r))return a(r.message);let o=J("stageStateBranchMediaFiles",await Ba({stateBranchRoot:t}));if(d(o))return a(o.message);let s=J("hasStagedChanges(after stage)",await fa(t));if(d(s))return a(s.message);if(logger.debug("[sync] state branch change check after stage result",{changed:s.value}),!s.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 i=J("createStateBranchSyncCommit",await Fa({repoRoot:e,stateBranchRoot:t}));return d(i)?a(i.message):(logger.debug("[sync] created sync commit",i.value),u("Committed own event file",{createdCommit:!0,commitSha:i.value}))},yo=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.debug("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.error("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),a("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),a("Own event file must end with .jsonl");Jo();let n=J("ensureSyncReady",await Kv({cwd:e,ensureUpstream:!0}));if(d(n))return et(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,i=J("isDetachedHead(stateBranchRoot)",await ga(o));if(d(i))return et(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return et("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,l,m=!1,p=!1,f=J("getStateBranch",Cn(r));if(d(f))return et(f.message);let g=f.value;logger.debug("[sync] resolved state branch",{stateBranch:g,stateBranchRoot:o});let I=J("commitOwnEventFileToStateBranch",await zv({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(I))return et(I.message);c=I.value.createdCommit,l=I.value.commitSha;let S=J("pullBranchRebaseIfPresent",await Ps({cwd:o,branch:g}));if(d(S))return et(S.message);if(m=S.value,c||s){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:o});let R=J("pushStateBranch",await sr({stateBranchRoot:o,repoRoot:r}));if(d(R)&&pa(R.message)){let A=J("pullBranchRebaseIfPresent(retry)",await Ps({cwd:o,branch:g}));if(d(A))return et(A.message);m=m||A.value,R=J("pushStateBranch(retry)",await sr({stateBranchRoot:o,repoRoot:r}))}if(d(R))return et(R.message);p=R.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let R=J("git rev-parse HEAD",await F({args:["rev-parse","HEAD"],cwd:o}));if(d(R))return et(R.message);l=R.value.stdout.trim(),logger.debug("[sync] final sync commit sha",l)}return Qo(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})};import{existsSync as Di}from"node:fs";import{chmod as Bi}from"node:fs/promises";import jl from"node:os";import Hn from"node:path";var Ul=(e,t)=>e.reduce((n,r)=>r<n?r:n,t);var Ol=1e5,Zo=null,_l=Promise.resolve(),en=e=>{let t=_l.then(e,e);return _l=t.then(()=>{},()=>{}),t},Fi=e=>{let t=_e(e??process.cwd());return d(t)?a(t.message):u("Resolved Epiq repo root",t.value)},Ui=e=>{let t=Fi(e);return d(t)?t:Re({repoRoot:t.value})},at=()=>{if(!Wt())return{mode:"live",asOfTime:null};let{timeMode:e}=v();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:Zo}},Oi=(e,t)=>{let n=new Map,r=new Set,o=i=>{let c=new Set,l=i;for(;l&&!c.has(l);){if(r.has(l))return l;c.add(l),l=n.get(l)}return null},s=[];for(let i of e){let c=i.payload,l=c?.id;l&&(i.action==="add.board"&&r.add(l),c.parent&&n.set(l,c.parent),(l===t||o(l)===t)&&s.push(i))}return s},Wl=async(e={})=>{let t=Ui(e.repoRoot);if(d(t))return a(t.message);let n=je(t.value);if(d(n))return a(n.message);let o=(e.boardId?Oi(n.value,e.boardId):n.value).map(zt).filter(g=>g!==null),s=Date.now(),i=e.end??s,c=e.start??Ul(o,i);if(i<=c)return u("Empty time window",{bucketMs:0,buckets:[],earliest:c,latest:i});let l=o.filter(g=>g>=c&&g<i).sort((g,I)=>g-I),m=Math.max(1,Math.ceil((i-c)/Ol)),p=new Map;for(let g of l){let I=Math.min(Ol-1,Math.floor((g-c)/m)),S=c+I*m;p.set(S,(p.get(S)??0)+1)}let f=[...p.entries()].sort(([g],[I])=>g-I).map(([g,I])=>({t:g,count:I}));return u("Computed event timeline",{bucketMs:m,buckets:f,earliest:c,latest:i})},Ar="",$l="",Vl=async(e={})=>{let t=Fi(e.repoRoot);if(d(t))return a(t.message);let n=ut(t.value);if(d(n))return a(n.message);let r=await F({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=${$l}%H${Ar}%at${Ar}%an${Ar}%s`]});if(d(r))return a(r.message);let o=r.value.stdout.split($l).filter(s=>s.trim().length>0).map(s=>{let[i,...c]=s.split(`
59
+ `),[l,m,p,...f]=(i??"").split(Ar);if(!l||!m)return null;let g=c.join(" "),I=Number(/(\d+) insertion/.exec(g)?.[1]??0),S=Number(/(\d+) deletion/.exec(g)?.[1]??0);return{sha:l,time:Number(m)*1e3,author:p??"unknown",subject:f.join(Ar),linesChanged:I+S}}).filter(s=>s!==null);return u("Computed commit timeline",o)},qv=e=>/^[0-9a-f]{7,40}$/i.test(e),Yv=async(e,t)=>{let n=await F({cwd:e,args:["show",t]});if(d(n))return a(n.message);let r=Hn.join(jl.tmpdir(),"epiq","commit-diffs");be.mkDir(r);let o=Hn.join(r,`${t}.diff`);return Di(o)||(be.writeToFile(o,n.value.stdout),await Bi(o,292)),Yc(o)},Xv=12,Jv=800,Hl=async(e,t,n)=>{let r=await F({cwd:e,args:["show",`${t}:${n}`]});return d(r)?"":r.value.stdout},Qv=async(e,t,n)=>{let r=await F({cwd:e,args:["diff-tree","--no-commit-id","--name-only","-r",t]});if(d(r))return a(r.message);let o=r.value.stdout.split(`
60
+ `).map(f=>f.trim()).filter(Boolean);if(o.length===0)return a("No changed files found for this commit");if(o.length>Xv)return a(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=Hn.join(jl.tmpdir(),"epiq","commit-diffs",t),i=await Promise.all(o.map(async(f,g)=>{let[I,S]=await Promise.all([Hl(e,`${t}~1`,f),Hl(e,t,f)]),R=Hn.basename(f),A=Hn.join(s,String(g),"before",R),P=Hn.join(s,String(g),"after",R);return Di(A)||(be.writeToFile(A,I),await Bi(A,292)),Di(P)||(be.writeToFile(P,S),await Bi(P,292)),{beforePath:A,afterPath:P}})),[c,...l]=i;if(!c)return a("No changed files found for this commit");let m=await Si(n,c.beforePath,c.afterPath,"new");if(d(m)||l.length===0)return m;await new Promise(f=>setTimeout(f,Jv));let p=await Promise.all(l.map(({beforePath:f,afterPath:g})=>Si(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},Gl=async e=>{if(!qv(e.sha))return a("Invalid commit sha");let t=Fi(e.repoRoot);if(d(t))return a(t.message);let n=t.value,r=$o()[0];if(r&&Ei(r)){let o=await Qv(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 Yv(n,e.sha)},Kl=e=>{let t=je(e);if(d(t))return a(t.message);let n=it();if(d(n))return a(n.message);Zo=null;let o=st(t.value).filter(d);return o.length>0?a(o.map(s=>s.message).join(", ")):(C({readOnly:!1,timeMode:"live",unappliedEvents:[],replay:null}),u("Restored live state",!0))},Zv=(e,t)=>{Zo=null;let n=Kl(e);return d(n)?a(`${t} (recovery to live also failed: ${n.message})`):a(t)},zl=e=>en(async()=>{let t=Ui(e.repoRoot);if(d(t))return a(t.message);let n=uo(t.value,e.targetTime);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=n.value,s=it();if(d(s))return s;let c=st(r).filter(d);return c.length>0?Zv(t.value,c.map(l=>l.message).join(", ")):(C({readOnly:!0,timeMode:"peek",unappliedEvents:o,replay:null}),Zo=e.targetTime,u("Checked out historical state",{asOfTime:e.targetTime}))}),ql=(e={})=>en(async()=>{let t=Ui(e.repoRoot);if(d(t))return a(t.message);let n=Kl(t.value);return d(n)?a(n.message):u("Returned to live state",!0)});var _i=()=>{let e=Ft();return d(e)?xt:e.value.attachmentMaxKb??xt},$i=e=>{let t=_e(e??process.cwd());return d(t)?a(t.message):u("Resolved Epiq repo root",t.value)},Ne=async(e,t)=>{let n=$i(e);if(d(n))return n;let r=Re({repoRoot:n.value});if(d(r))return a(r.message);let o=Sn(),s=await cn({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.stateBranch});if(d(s))return a(s.message);if(t?.pull??!1){let l=await F({cwd:r.value,args:["pull","--ff-only"]});d(l)&&se.info(3,l.message)}let i=je(r.value);if(d(i))return a(i.message);let c=pn(i.value);return d(c)?a(c.message):u("Booted Epiq state",{repoRoot:n.value,stateBranchRoot:r.value})},Ae=()=>{let e=Ft();return d(e)?a(e.message):e.value.userId?e.value.userName?u("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):a("Unable to retrieve user name"):a("Unable to retrieve user id")},Fe=()=>{let e=We();return d(e)?a(e.message):e},Xl=e=>(e.props.tags??[]).map(t=>E.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:ue(t.name)})),Hi=()=>{let e=We(),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},Jl=(e,t)=>{let n=new Map(e);for(let r of Object.values(t)){if(r.tombstoned){n.set(r.id,r.name);continue}n.set(r.id,Fn(r.name,n.get(r.id))??r.name)}return n},Ql=(e,t=new Map)=>(e.props.assignees??[]).map(n=>E.getContributor(n)).filter(n=>n!=null).map(n=>{let r=n.tombstoned?n.name:Fn(n.name,t.get(n.id))??n.name;return{id:n.id,name:r,color:ue(r)}});var Zl=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Fe();if(d(n))return n;let r=n.value.nodes,o=Hi(),s=Object.values(r).filter(T).filter(i=>!i.isDeleted).filter(i=>e.includeClosed||i.parentNodeId!==ve).filter(i=>e.boardId?(i.parentNodeId?r[i.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(i=>({id:i.id,ref:He(i.id),title:Ze(i.title),description:i.props.description??"",parentNodeId:i.parentNodeId,isClosed:i.parentNodeId===ve,readonly:!!i.readonly,tags:Xl(i),assignees:Ql(i,o)}));return u("Listed issues",s)},eu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=Pn(e.parentId,n.value,t.value.stateBranchRoot);if(d(o))return o;let s=jo({name:e.title,parent:e.parentId,user:n.value,rank:o.value});if(d(s))return s;let i=[...s.value],c=i.find(f=>f.action==="add.issue")?.payload.id;if(!c)return a("Unable to determine created issue id");e.description&&i.push({id:q(),...n.value,action:"edit.description",payload:{id:c,md:e.description}});let l=[];for(let f of e.tagNames??[]){let g=Ze(f).trim();if(!g||l.some(R=>R.name===g))continue;let I=Object.values(r.value.tags).find(R=>R.name===g),S=I?.id??q();I||i.push({id:q(),...n.value,action:"create.tag",payload:{id:S,name:g}}),i.push({id:q(),...n.value,action:"add.issue.tag",payload:{id:c,tag:S}}),l.push({id:S,name:g})}let m=[];for(let f of e.assigneeNames??[]){let g=Ze(f).trim();if(!g||m.some(R=>R.name===g))continue;let I=Object.values(r.value.contributors).find(R=>R.name===g),S=I?.id??q();I||i.push({id:q(),...n.value,action:"create.contributor",payload:{id:S,name:g}}),i.push({id:q(),...n.value,action:"add.issue.assignee",payload:{id:c,assignee:S}}),m.push({id:S,name:g})}let p=U(i,t.value.stateBranchRoot);return d(p)?a(p.message):u("Created issue",{id:c,title:e.title,parentId:e.parentId,description:e.description??"",tags:l,assignees:m})},tu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=mn(ve,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(r))return r;let o={id:q(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:ve,rank:r.value}},s=U([o],t.value.stateBranchRoot);return d(s)?a(s.message):u("Closed issue",{id:e.issueId})},nu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Target node is not issue");if(o.parentNodeId!==ve)return a("Issue is not closed");let s=Oo(o);if(!s)return a("Unable to resolve previous parent from issue history");if(s===ve)return a("Previous parent resolves to closed swimlane");let i=r.value.nodes[s];if(!i)return a("Previous parent no longer exists");let c=mn(i.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let l={id:q(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:i.id,rank:c.value}},m=U([l],t.value.stateBranchRoot);return d(m)?a(m.message):u("Reopened issue",{id:o.id,parentId:i.id})},ru=async e=>{let t=$i(e.repoRoot);if(d(t))return t;let n=Ae();if(d(n))return n;let r=Re({repoRoot:t.value});if(d(r))return r;let o=je(r.value);if(d(o))return o;let s=pn(o.value);if(d(s))return s;let i=mn(e.parentId,e.issueId,e.position??{at:"end"},n.value,r.value);if(d(i))return i;let c={id:q(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:i.value}},l=U([c],r.value);return d(l)?a(l.message):u("Moved issue",{id:e.issueId,parentId:e.parentId})};var es=async(e={})=>{Jo();let t=$i(e.repoRoot);if(d(t))return a("Sync failed");let n=Ae();if(d(n))return n;let r=await yo({cwd:t.value,ownEventFileName:un(n.value)});return d(r)?(ki(r.message),r):(Qo(),u("Synced",r.value))};var Tr=()=>{let e=Fe();if(d(e))return e;let t=at(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(g=>Zr(g)&&!g.isDeleted),s=Hi(),i=new Map,c=new Map;for(let g of r)if(!g.isDeleted){if(_t(g)&&g.parentNodeId){let I=i.get(g.parentNodeId)??[];I.push(g),i.set(g.parentNodeId,I)}if(T(g)&&g.parentNodeId){let I=c.get(g.parentNodeId)??[];I.push(g),c.set(g.parentNodeId,I)}}let l=Ft();if(d(l))return l;let m={};for(let g of r.filter(T))g.isDeleted||(m[g.id]=E.getCommentsByIssue(g.id).map(I=>{let S=E.getContributor(I.authorId);return{id:I.id,issueId:I.issue,body:I.md,author:{id:I.authorId,name:S?.name??"Unknown",color:ue(S?.name??I.authorId)},createdAt:Yl(I.id)}}));let p=new Map;for(let g of e.value.eventLog)g.action==="add.issue.attachment"&&p.set(g.payload.id,g.payload.author);let f={};for(let g of r.filter(T))g.isDeleted||(f[g.id]=E.getAttachmentsByIssue(g.id).map(I=>({id:I.id,issueId:I.issue,name:I.name,fileName:kn(I.hash,I.ext),bytes:I.bytes,createdAt:Yl(I.id),canDelete:p.get(I.id)===l.value.userId})));return u("Retrieved Epiq GUI state",{boards:o.sort((g,I)=>g.rank.localeCompare(I.rank)).map(g=>({id:g.id,ref:He(g.id),title:g.title,swimlanes:(i.get(g.id)??[]).sort((I,S)=>I.rank.localeCompare(S.rank)).map(I=>({id:I.id,title:I.title,readonly:!!I.readonly||n,issues:(c.get(I.id)??[]).sort((S,R)=>S.rank.localeCompare(R.rank)).map(S=>({id:S.id,ref:He(S.id),title:Ze(S.title),description:S.props.description??"",readonly:!!S.readonly||n,tags:Xl(S),assignees:Ql(S,s),parentNodeId:S.parentNodeId,isClosed:S.parentNodeId===ve})),parentNodeId:I.parentNodeId}))})),tags:Object.values(e.value.tags).map(g=>({...g,color:ue(g.name)})),contributors:Object.values(e.value.contributors).map(g=>({...g,color:ue(g.name)})),user:{name:l.value.userName??"",id:l.value.userId??"",color:ue(l.value.userName??"")},commentsByIssueId:m,attachmentsByIssueId:f,attachmentMaxKb:_i(),timeTravel:t})},dt=async(e={})=>{if(at().mode!=="live")return Tr();let t=await Ne(e.repoRoot,{pull:!1});return d(t)?t:Tr()},ou=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Edit target must be an issue");if(o.readonly)return a("Cannot edit readonly issue");let s=o.props.description??"";if(s===e.description)return u("No changes made",{id:e.issueId,description:s});let i={id:q(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},c=U([i],t.value.stateBranchRoot);return d(c)?a(c.message):u("Edited issue description",{id:e.issueId,description:e.description})},su=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Edit target must be an issue");if(o.readonly)return a("Cannot edit readonly issue");let s=Ze(e.title);if(!s.trim())return a("Issue title cannot be empty");if(o.title===s)return u("No changes made",{id:e.issueId,title:s});let i={id:q(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},c=U([i],t.value.stateBranchRoot);return d(c)?a(c.message):u("Edited issue title",{id:e.issueId,title:s})},iu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Tag target must be an issue");if(o.readonly)return a("Cannot tag readonly issue");let s=Ze(e.tagName).trim();if(!s)return a("Tag name cannot be empty");let i=Object.values(r.value.tags).find(p=>p.name===s),c=i?.id??q(),l=[...i?[]:[{id:q(),...n.value,action:"create.tag",payload:{id:c,name:s}}],{id:q(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:c}}],m=U(l,t.value.stateBranchRoot);return d(m)?a(m.message):u("Added issue tag",{id:e.issueId,tag:{id:c,name:s}})},au=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Untag target must be an issue");if(o.readonly)return a("Cannot untag readonly issue");if(!r.value.tags[e.tagId])return a("Tag not found");let s={id:q(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},i=U([s],t.value.stateBranchRoot);return d(i)?a(i.message):u("Removed issue tag",{id:e.issueId,tagId:e.tagId})},du=async(e,t)=>{let n=je(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}},cu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Assign target must be an issue");if(o.readonly)return a("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let R=r.value.contributors[s],A=R?void 0:await du(t.value.stateBranchRoot,s);if(!R&&!A)return a("Unknown assignee id");let P=R??A,_=[...R?[]:[{id:q(),...n.value,action:"create.contributor",payload:{id:P.id,name:P.name}}],{id:q(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:P.id}}],w=U(_,t.value.stateBranchRoot);return d(w)?a(w.message):u("Added issue assignee",{id:e.issueId,assignee:{id:P.id,name:P.name}})}let i=Ze(e.assigneeName??"").trim();if(!i)return a("Provide assigneeId, self or assigneeName");let l=[...Jl(Hi(),r.value.contributors).entries()].filter(([,R])=>R===i);if(l.length>1)return a(`"${i}" matches ${l.length} contributors (${l.map(([R])=>R).join(", ")}). Assign by assigneeId to choose.`);let m=l[0];if(!m&&!e.createUnlinked)return a(`No contributor named "${i}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[p=q(),f=i]=m??[],I=[...!!r.value.contributors[p]?[]:[{id:q(),...n.value,action:"create.contributor",payload:{id:p,name:f}}],{id:q(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:p}}],S=U(I,t.value.stateBranchRoot);return d(S)?a(S.message):u("Added issue assignee",{id:e.issueId,assignee:{id:p,name:f}})},lu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;if(!r.value.contributors[e.contributorId])return a("Contributor not found");if(await du(t.value.stateBranchRoot,e.contributorId))return a("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let i=[{id:q(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],c=U(i,t.value.stateBranchRoot);return d(c)?a(c.message):u("Tombstoned contributor",{id:e.contributorId,name:to})};var uu=async(e={})=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=je(t.value.stateBranchRoot);if(d(o))return a(o.message);let s=e.boardId?Oi(o.value,e.boardId):o.value,i=new Map,c=new Set,l=new Set;for(let g of o.value)g.userId&&l.add(g.userId);for(let g of s)g.userId&&(i.set(g.userId,g.userName??""),c.add(g.userId));let m=r.value.contributors,f=[...Jl(i,m).entries()].map(([g,I])=>({id:g,name:I,color:ue(I),isSelf:g===n.value.userId,isExternal:!c.has(g),isRemoved:m[g]?.tombstoned===!0,hasAuthoredAnywhere:l.has(g)}));return u("Listed board contributors",f)},mu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Unassign target must be an issue");if(o.readonly)return a("Cannot unassign readonly issue");if(!r.value.contributors[e.assigneeId])return a("Assignee not found");let s={id:q(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},i=U([s],t.value.stateBranchRoot);return d(i)?a(i.message):u("Removed issue assignee",{id:e.issueId,assigneeId:e.assigneeId})},ts=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Comment target must be an issue");if(o.readonly)return a("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return a("Comment cannot be empty");let i=q(),c={id:q(),...n.value,action:"add.issue.comment",payload:{id:i,issue:e.issueId,md:s,author:n.value.userId}},l=U([c],t.value.stateBranchRoot);return d(l)?a(l.message):u("Added issue comment",{id:i,issueId:e.issueId,body:s})},ns=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!o)return a("Unable to resolve comment");if(o.payload.author!==n.value.userId)return a("You can only delete your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!T(s))return a("Comment target must be an issue");if(s.readonly)return a("Cannot delete comment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return u("Comment already deleted",{id:e.commentId,issueId:o.payload.issue});let c={id:q(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},l=U([c],t.value.stateBranchRoot);return d(l)?a(l.message):u("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},pu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!T(o))return a("Attachment target must be an issue");if(o.readonly)return a("Cannot attach to readonly issue");let s=Buffer.from(e.dataBase64??"","base64"),i=qd(t.value.stateBranchRoot,s,_i());if(d(i))return i;let c=Ze(e.name??"").trim()||"image",l=q(),m={id:q(),...n.value,action:"add.issue.attachment",payload:{id:l,issue:e.issueId,author:n.value.userId,hash:i.value.hash,ext:i.value.ext,name:c,bytes:i.value.bytes}},p=U([m],t.value.stateBranchRoot);return d(p)?a(p.message):u("Added issue attachment",{id:l,issueId:e.issueId,fileName:kn(i.value.hash,i.value.ext),bytes:i.value.bytes})},fu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});if(d(t))return t;let n=Ae();if(d(n))return n;let r=Fe();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.attachment"&&m.payload.id===e.attachmentId);if(!o)return a("Unable to resolve attachment");if(o.payload.author!==n.value.userId)return a("You can only delete your own attachments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!T(s))return a("Attachment target must be an issue");if(s.readonly)return a("Cannot delete attachment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.attachment"&&m.payload.id===e.attachmentId))return u("Attachment already deleted",{id:e.attachmentId,issueId:o.payload.issue});let c={id:q(),...n.value,action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},l=U([c],t.value.stateBranchRoot);return d(l)?a(l.message):u("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},gu=async e=>{let t=await Ne(e.repoRoot,{pull:!1});return d(t)?t:Yd(t.value.stateBranchRoot,e.fileName,_i())};var vu=e=>{let t,n,r=!1,o=!1,s=!1,i=()=>{let p=rr();if(d(p))return se.error(p.message);let{autoSync:f,userName:g,preferredEditor:I}=p.value;return!!(f&&g&&I)},c=async()=>{if(!r){if(o){s=!0;return}o=!0;try{await en(async()=>{at().mode==="live"&&(await es({repoRoot:e.repoRoot}),Ut({type:"state",payload:await dt({repoRoot:e.repoRoot})}))})}finally{o=!1,s&&(s=!1,c())}}},l=(p=750)=>{r||(n&&clearTimeout(n),n=setTimeout(()=>{c()},p))},m=()=>{if(r)return;let p=rr();if(d(p))return se.error(p.message);let{autoSyncDebounceMs:f}=p.value;i()&&(t=setTimeout(()=>{c(),m()},f??15e3))};return m(),{scheduleSync:l,dispose:()=>{r=!0,t&&clearTimeout(t),n&&clearTimeout(n)}}};import{WebSocketServer as ey}from"ws";var ty=new Set(["sync","issues:create","issues:move","issue:close","issue:reopen","issue:edit:title","issue:edit:description","issue:tag:add","issue:tag:remove","contributor:remove","issue:assignee:add","issue:assignee:remove","issue:comment:add","issue:comment:delete"]),yu=()=>{let e=Tr();Ut({type:"state",payload:e})},de=(e,t)=>{e.send(JSON.stringify(t))},rs=async(e,t)=>de(e,{type:"state",payload:await dt({repoRoot:t})}),ny=async(e,t)=>{let n=()=>de(e,{type:"state",payload:Tr()});if(at().mode!=="live")return n();let r=await dt({repoRoot:t});return at().mode!=="live"?n():de(e,{type:"state",payload:r})},ct=async(e,t,n,r,o)=>{if(de(e,{type:r,payload:o}),d(o))return de(e,{type:"failed",payload:o.message});n(),ny(e,t)},hu=(e,t,{onStateChanged:n})=>{new ey({server:e,path:"/ws"}).on("connection",o=>{Oa(o),o.on("message",async s=>{let i=async c=>{let{type:l}=c;if(l==="timeline:get"){let{requestId:m,...p}=c.payload??{};return de(o,{type:"timeline",requestId:m,payload:await Wl({repoRoot:t,...p})})}if(l==="commits:get"){let{requestId:m,...p}=c.payload??{};return de(o,{type:"commits",requestId:m,payload:await Vl({repoRoot:t,...p})})}if(l==="commit:inspect")return de(o,{type:"commit:inspect:result",payload:await Gl({repoRoot:t,sha:c.payload.sha})});if(l==="time-travel:scrub"){let m=await zl({repoRoot:t,targetTime:c.payload.targetTime});return de(o,{type:"time-travel:result",payload:m}),d(m)?void 0:yu()}if(l==="time-travel:live"){let m=await ql({repoRoot:t});return de(o,{type:"time-travel:result",payload:m}),d(m)?void 0:yu()}if(l==="state:get")return rs(o,t);if(l==="sync"){let m=await es({repoRoot:t});return de(o,{type:"sync:result",payload:m}),n(),rs(o,t)}if(l==="issue:comment:add"){let m=await ts({repoRoot:t,...c.payload});return ct(o,t,n,"issue:comment:add:result",m)}if(l==="issue:comment:delete"){let m=await ns({repoRoot:t,...c.payload});return de(o,{type:"issue:comment:delete:result",payload:m}),d(m)?de(o,{type:"failed",payload:m.message}):(n(),rs(o,t))}if(l==="issue:edit:description"){let m=await ou({repoRoot:t,...c.payload});return ct(o,t,n,"issue:edit:description:result",m)}if(l==="issue:edit:title"){let m=await su({repoRoot:t,...c.payload});return ct(o,t,n,"issue:edit:title:result",m)}if(l==="issue:tag:add"){let m=await iu({repoRoot:t,...c.payload});return ct(o,t,n,"issue:tag:add:result",m)}if(l==="issue:tag:remove"){let m=await au({repoRoot:t,...c.payload});return ct(o,t,n,"issue:tag:remove:result",m)}if(l==="contributor:remove"){let m=await lu({repoRoot:t,...c.payload});return ct(o,t,n,"contributor:remove:result",m)}if(l==="contributors:get")return de(o,{type:"contributors",payload:await uu({repoRoot:t,...c.payload})});if(l==="issue:assignee:add"){let m=await cu({repoRoot:t,...c.payload});return ct(o,t,n,"issue:assignee:add:result",m)}if(l==="issue:assignee:remove"){let m=await mu({repoRoot:t,...c.payload});return ct(o,t,n,"issue:assignee:remove:result",m)}if(l==="issues:list")return de(o,{type:"issues",payload:await Zl({repoRoot:t})});if(l==="issues:create"){let m=await eu({...c.payload,repoRoot:t});return de(o,{type:"issues:create:result",payload:m}),d(m)?Ut({type:"failed",payload:m.message}):(Ut({type:"issue:created",payload:m.value}),n(),rs(o,t))}if(l==="issues:move"){if(!c.payload.position)return de(o,{type:"error",message:"Missing move position"});let m=await ru({...c.payload,repoRoot:t});return ct(o,t,n,"issues:move:result",m)}if(l==="issue:close"){if(!c.payload.issueId)return de(o,{type:"error",message:"Missing issueId"});let m=await tu({repoRoot:t,issueId:c.payload.issueId});return ct(o,t,n,"issue:close:result",m)}if(l==="issue:reopen"){if(!c.payload.issueId)return de(o,{type:"error",message:"Missing issueId"});let m=await nu({repoRoot:t,issueId:c.payload.issueId});return ct(o,t,n,"issue:reopen:result",m)}return de(o,{type:"error",message:"Unknown message type"})};try{let c=JSON.parse(s.toString());return ty.has(c.type)?await en(async()=>at().mode!=="live"?de(o,{type:"failed",payload:"Read-only while viewing history"}):i(c)):await i(c)}catch(c){return de(o,{type:"error",message:c instanceof Error?c.message:String(c)})}})})};var sy=En.dirname(oy(import.meta.url)),iy=process.env.IS_LOCAL==="true"?En.resolve(process.cwd(),"dist/gui"):En.join(sy,"gui"),os,ay=async()=>(os===void 0&&(os=await import("node:sea").catch(()=>null)),os?.isSea()?os:null),fe=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},dy=e=>fe(e,409,{isError:!0,message:"Read-only while viewing history"}),ss=(e,t)=>en(async()=>at().mode!=="live"?dy(e):t()),xu=async(e,t=1024*1024)=>new Promise((n,r)=>{let o="",s=0;e.on("data",i=>{if(s+=i.length,s>t){e.destroy(),r(new Error("Request body too large"));return}o+=i}),e.on("end",()=>{try{n(o?JSON.parse(o):{})}catch{r(new Error("Invalid JSON body"))}}),e.on("error",r)}),cy=2*1024*1024,ly={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},uy=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",bu=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),r=En.resolve(iy),o=En.resolve(r,n),s=En.relative(r,o);if(s.startsWith("..")||En.isAbsolute(s))return fe(t,403,{isError:!0,message:"Forbidden"});let i=await ay();try{let c=i?Buffer.from(i.getAsset(`gui/${s}`)):await Iu(o);return t.writeHead(200,{"content-type":uy(o)}),t.end(c)}catch{return fe(t,404,{isError:!0,message:`Not found: ${n}`})}},my=async(e,t=3710)=>new Promise((n,r)=>{let o=s=>{let i=l=>{if(e.off("listening",c),l.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),o(0);return}r(l)},c=()=>{e.off("error",i);let l=e.address();if(!l||typeof l=="string"){r(new Error("Unable to resolve address"));return}n(l.port)};e.once("error",i),e.once("listening",c),e.listen(s,"127.0.0.1")};o(t)}),Eu=async e=>{let t=ry.createServer(async(o,s)=>{let i=new URL(o.url??"/","http://127.0.0.1");if(i.pathname==="/api/state")return fe(s,200,await dt({repoRoot:e.repoRoot}));if(o.method==="POST"&&i.pathname==="/api/comments")try{let c=await xu(o);if(!c.issueId||!c.body?.trim())return fe(s,400,{isError:!0,message:"Missing issueId or body"});let l=c.issueId,m=c.body;return await ss(s,async()=>{let p=await ts({repoRoot:e.repoRoot,issueId:l,body:m});return d(p)?fe(s,400,{isError:!0,message:p.message}):fe(s,200,await dt({repoRoot:e.repoRoot}))})}catch(c){return fe(s,400,{isError:!0,message:c instanceof Error?c.message:"Unable to add comment"})}if(o.method==="POST"&&i.pathname==="/api/attachments")try{let c=await xu(o,cy);if(!c.issueId||!c.dataBase64)return fe(s,400,{isError:!0,message:"Missing issueId or dataBase64"});let l=c.issueId,m=c.dataBase64,p=c.name??"";return await ss(s,async()=>{let f=await pu({repoRoot:e.repoRoot,issueId:l,name:p,dataBase64:m});return d(f)?fe(s,400,{isError:!0,message:f.message}):fe(s,200,await dt({repoRoot:e.repoRoot}))})}catch(c){return fe(s,400,{isError:!0,message:c instanceof Error?c.message:"Unable to add attachment"})}if(o.method==="DELETE"&&i.pathname.startsWith("/api/attachments/")){let c=decodeURIComponent(i.pathname.replace("/api/attachments/",""));return c?ss(s,async()=>{let l=await fu({repoRoot:e.repoRoot,attachmentId:c});return d(l)?fe(s,400,{isError:!0,message:l.message}):fe(s,200,await dt({repoRoot:e.repoRoot}))}):fe(s,400,{isError:!0,message:"Missing attachment id"})}if(o.method==="GET"&&i.pathname.startsWith("/media/")){let c=decodeURIComponent(i.pathname.replace("/media/","")),l=await gu({repoRoot:e.repoRoot,fileName:c});if(d(l))return fe(s,404,{isError:!0,message:l.message});try{let m=await Iu(l.value.filePath);return s.writeHead(200,{"content-type":ly[l.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),s.end(m)}catch{return fe(s,404,{isError:!0,message:"Attachment blob not found"})}}if(o.method==="DELETE"&&i.pathname.startsWith("/api/comments/")){let c=decodeURIComponent(i.pathname.replace("/api/comments/",""));return c?ss(s,async()=>{let l=await ns({repoRoot:e.repoRoot,commentId:c});return d(l)?fe(s,400,{isError:!0,message:l.message}):fe(s,200,await dt({repoRoot:e.repoRoot}))}):fe(s,400,{isError:!0,message:"Missing comment id"})}return i.pathname.startsWith("/board/")?bu("/",s):bu(i.pathname,s)});try{await my(t)}catch(o){return a(o instanceof Error?`Unable to start GUI server: ${o.message}`:`Unable to start GUI server: ${String(o)}`)}let n=vu({repoRoot:e.repoRoot});hu(t,e.repoRoot,{onStateChanged:()=>n.scheduleSync()}),t.on("close",n.dispose);let r=t.address();return!r||typeof r=="string"?(t.close(),a("Unable to resolve GUI server address")):u("Started GUI server",{url:`http://epiq.localhost:${r.port}${e.boardId?`/board/${e.boardId}`:""}`,server:t})};var Su=async e=>{let t=Ft();Q(t)&&Me(t.value);let n=await Eu({...e,boardId:""});if(d(n))return n;let{url:r}=n.value;return console.log(`Epiq GUI running at ${py.cyan(r)}`),La(r),u("Started GUI",{url:r})};import{Box as sn}from"ink";import ce from"react";import{Box as ji,Text as wr}from"ink";import lt,{useEffect as fy,useMemo as gy}from"react";import{ulid as vy}from"ulid";var Cu=({text:e,match:t,color:n,highlightColor:r=h.secondary,dimColor:o=!1})=>{if(!t)return lt.createElement(wr,{color:n,dimColor:o},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?lt.createElement(wr,{color:n,dimColor:o},e):lt.createElement(wr,{color:n,dimColor:o},e.slice(0,c),lt.createElement(wr,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},Nu=vy(),yy=e=>`${e}`,hy=e=>{let{pendingNavTarget:t}=Jt();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(ae(b.NONE,{breadCrumb:n,contextNode:r,readOnly:v().readOnly,selectedNode:o}));return[...new Set(Object.values(b))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==b.PALETTE).map(i=>{let c=wo(i),l=zo.find(m=>m.intent===c);return{command:i,description:l?.description??`[${i}] Run command`,isAvailable:s.has(i)}}).filter(i=>i.command.toLowerCase().startsWith(e)||e.length>=2&&i.description.toLowerCase().includes(e)).sort((i,c)=>i.isAvailable!==c.isAvailable?i.isAvailable?-1:1:i.command.localeCompare(c.command))},xy=e=>ee.text({id:Nu,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),by=(e,t,n)=>ee.text({id:yy(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),Wi=[],Iy=e=>{Ru();let t=E.createNode(xy(v().rootNodeId));d(t)||!Ot(t.value)||(Wi=[t.value,...e.map((n,r)=>by(n,r,Nu)).map(E.createNode).filter(Q).map(({value:n})=>n).filter(Ot)],M.navigate({contextNode:t.value,selectedIndex:0}))},Ru=()=>{let e=Wi.map(t=>t.id);Wi=[];for(let t of e)E.deleteNode(t)};function Au({width:e,height:t}){let r=gc().value.trim().toLowerCase(),o=gy(()=>hy(r),[r]);fy(()=>(Iy(o),()=>{Ru()}),[o]);let s=v().selectedIndex;return lt.createElement(ji,{flexDirection:"column",width:e,height:t-2},lt.createElement(tt,{height:t-4,itemHeight:3,selectedIndex:s},o.map((i,c)=>{let l=c===s,m=i.isAvailable?h.accent:h.secondary2,p=i.isAvailable?"":"[unavailable] ";return lt.createElement(ji,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:h.secondary,borderStyle:"single"},lt.createElement(wr,{color:m,dimColor:!i.isAvailable},l?"\u276F ":" ",lt.createElement(Cu,{text:Va(i.command),match:r,color:m,dimColor:!i.isAvailable})),lt.createElement(ji,{paddingLeft:2},lt.createElement(Cu,{text:p+i.description,match:r.length>=2?r:"",color:l&&i.isAvailable?h.primary:h.secondary2,dimColor:!i.isAvailable})))})))}import{Box as Oy}from"ink";import ds from"react";import Pr from"chalk";import{Box as Vi,Text as Tu}from"ink";import Mr,{useEffect as Ey,useMemo as Sy,useState as Cy}from"react";var wu=Pr.hex(h.secondary),Ny=Pr.inverse,Ry=Pr.inverse.hex(h.secondary2),Ay={hint:"",hints:[],overlap:0,remainder:""},Pu=({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}},Ty=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ue(t);return{bg:r=>Pr.bgHex(n).black(r),bgCursor:r=>Pr.bgHex(n).inverse.black(r)}}return zs(t)},wy=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Pu({value:e,command:t});if(!r)return null;let s=e.slice(r.end).match(/^\s*/)?.[0].length??0,i=r.end+s;return e.slice(i,i+n.length)!==n?null:{start:i,end:i+n.length}},Mu=()=>({value:Le.value,cursorPosition:Le.cursorPosition,commandIsPending:Le.commandIsPending,autoCompletion:Le.commandMeta.autoCompletion??Ay,infoMessage:Le.commandMeta.infoMessage,validationStatus:Le.commandMeta.validity,command:Le.commandMeta.command,inputString:Le.commandMeta.inputString,modifier:Le.commandMeta.modifier}),My=(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,Lu=({width:e,mode:t})=>{let[n,r]=Cy(Mu());Ey(()=>{let S=()=>{let A=Mu();r(P=>My(P,A)?P:A)},R=li(S);return S(),()=>{R()}},[]);let{value:o,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:l,command:m,modifier:p,validationStatus:f}=n,g=c&&f===bt.Invalid,I=Sy(()=>{let S=Math.max(0,Math.min(s,o.length)),R=Pu({value:o,command:m}),A=wy({value:o,command:m,modifier:p}),P=m?zs(m):null,_=Ty({command:m,modifier:p}),w=(ge,me)=>{let Gn=R&&me>=R.start&&me<R.end,Kn=A&&me>=A.start&&me<A.end;return Gn&&P?P.fg(ge):Kn&&_?_.bg(ge):ge},W=(ge,me)=>{let Gn=R&&me>=R.start&&me<R.end,Kn=A&&me>=A.start&&me<A.end;return Gn&&P?P.fgCursor(ge):Kn&&_?_.bgCursor(ge):Ny(ge)},H=o.slice(0,S),D=o[S]??" ",$=S<o.length?o.slice(S+1):"",Ye=Array.from(H).map((ge,me)=>w(ge,me)).join(""),we=W(D,S),Xe=Array.from($).map((ge,me)=>w(ge,S+1+me)).join("");if(l.hint){let ge=l.hint[l.overlap]??D;we=Ry(ge),Xe=wu(l.remainder.slice(1)+$)}return wu(t===y.PALETTE?"?":":")+Ye+we+Xe},[o,s,l,m,p]);return Mr.createElement(Vi,{flexDirection:"column",justifyContent:"flex-start"},Mr.createElement(Vi,{flexDirection:"column",paddingX:1,borderColor:h.secondary,borderStyle:"round",width:e},Mr.createElement(Vi,null,Mr.createElement(Tu,null,I),i&&Mr.createElement(Tu,{wrap:"truncate",color:g?h.red:h.secondary2},` ${i} `))))};import{Box as Py,Text as Ly}from"ink";import ku from"react";var ky=(e,t)=>{let n=[],r=0;for(let o of e){let i=(n.length>0?" | ":"").length+o.length;if(r+i>t-4)break;n.push(o),r+=i}return n},Du=({width:e,availableHints:t})=>{let n=ky(t,e).join(" | ");return ku.createElement(Py,{width:e,borderStyle:"round",borderColor:h.secondary,paddingX:1},ku.createElement(Ly,{color:h.secondary2},n.length?n:"\xA0"))};import{Box as Dy,Text as is}from"ink";import Lr,{useEffect as By,useRef as jn,useState as Fy}from"react";var Uy=40,as=.3,Gi="\u2500",Bu=1,Fu=16,Uu=({width:e})=>{let{replay:t}=j(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),i=s*Bu,[c,l]=Fy(0),m=jn(r);m.current=r;let p=jn(0),f=jn(0),g=jn(0),I=jn(0),S=jn(0);if(By(()=>{if(!n){p.current=0,g.current=0,I.current=0,S.current=0,l(0);return}p.current=m.current,f.current=Date.now(),g.current=m.current;let w=setInterval(()=>{let W=Date.now(),H=m.current;if(H!==g.current){let Xe=H-g.current,ge=W-f.current;if(Xe<0)I.current=0,S.current=0;else if(Xe>0&&ge>0){let me=Xe/ge;I.current=I.current===0?me:I.current*(1-as)+me*as,S.current=S.current===0?Xe:S.current*(1-as)+Xe*as}p.current=H,f.current=W,g.current=H}let D=W-f.current,$=Math.min(S.current,I.current*D),Ye=Math.min(1,p.current+$),we=Math.round(Ye*i);l(Xe=>Xe===we?Xe:we)},Uy);return()=>clearInterval(w)},[n,i]),!t)return null;let R=w=>{let W=s>1?w/(s-1):0,H=Math.round(W*(Fu-1))/(Fu-1);return no(H)},A=Math.min(s,Math.floor(c/Bu)),P=[];for(let w=0;w<A;w++){let W=R(w),H=P[P.length-1];H&&H.color===W?H.text+=Gi:P.push({text:Gi,color:W})}let _=Gi.repeat(Math.max(0,s-A));return Lr.createElement(Dy,{width:e,borderStyle:"round",borderColor:h.secondary,paddingX:1,columnGap:1},Lr.createElement(is,{color:h.secondary2},"\u25B6"),Lr.createElement(is,null,P.map((w,W)=>Lr.createElement(is,{key:W,color:w.color},w.text)),Lr.createElement(is,{color:h.secondary,dimColor:!0},_)))};var kr=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=j(),o=t===y.COMMAND_LINE||t===y.PALETTE;return ds.createElement(Oy,null,o?ds.createElement(Lu,{width:e,mode:t}):r==="replay"?ds.createElement(Uu,{width:e}):ds.createElement(Du,{width:e,mode:t,availableHints:n}))};import{Box as tn,Text as Wn}from"ink";import Oe,{useEffect as _y,useMemo as $y}from"react";import{ulid as Ou}from"ulid";var ls=Ou(),Hy=()=>[...new Set([...v().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})),jy=e=>ee.text({id:ls,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),Wy=(e,t,n)=>ee.text({id:Ou(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),cs=[],_u=()=>{let e=cs.filter(n=>n.id!==ls).map(n=>n.id),t=cs.filter(n=>n.id===ls).map(n=>n.id);cs=[];for(let n of[...e,...t])E.deleteNode(n)},Vy=e=>{_u();let t=E.createNode(jy(v().rootNodeId));if(d(t)||!Ot(t.value))return logger.error("Could not attach help nodes");cs=[t.value,...e.map((n,r)=>Wy(n,r,ls)).map(E.createNode).filter(Q).map(({value:n})=>n).filter(Ot)],M.navigate({contextNode:t.value,selectedIndex:0})},$u=({width:e,height:t})=>{let n=$y(()=>Hy(),[]);_y(()=>(Vy(n),()=>{_u()}),[n]);let r=v().selectedIndex;return Oe.createElement(tn,{flexDirection:"column",marginTop:3,borderColor:h.secondary,borderStyle:"round",width:e,height:t-2},Oe.createElement(tn,{paddingX:1,justifyContent:"center"},Oe.createElement(Wn,{color:h.accent},"Help"),Oe.createElement(Wn,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Oe.createElement(tn,{paddingX:1,marginTop:1},Oe.createElement(tn,{width:20,justifyContent:"flex-end"},Oe.createElement(Wn,{color:h.secondary},"Key(s)")),Oe.createElement(tn,{flexGrow:1,width:40,paddingLeft:2},Oe.createElement(Wn,{color:h.secondary},"Action"))),Oe.createElement(tt,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},i)=>{let c=i===r;return Oe.createElement(tn,{paddingX:1,key:`${o}-${s}-${i}`,flexDirection:"row"},Oe.createElement(tn,{width:20,justifyContent:"flex-end"},Oe.createElement(Wn,{color:h.accent},o)),Oe.createElement(tn,{flexGrow:1,width:40,paddingLeft:2},Oe.createElement(Wn,{color:c?h.primary:h.secondary2},s)))})))};import Gy from"chalk";import{Box as us,Text as Dt}from"ink";import qe from"react";var Hu=({width:e,height:t})=>qe.createElement(us,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},qe.createElement(Dt,{color:h.accent,bold:!0},"Initialize project"),qe.createElement(Dt,null,`This folder is not an ${Gy.hex(h.accent)("epiq")} project yet.`),qe.createElement(Dt,{color:h.primary},"To start tracking issues here, we need to initialize a new",qe.createElement(Dt,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json "),"file in this repository."),qe.createElement(us,{marginTop:1,flexDirection:"column"},qe.createElement(us,null,qe.createElement(Dt,{color:h.accent}," "),qe.createElement(Dt,{color:h.primary},"Type "),qe.createElement(Dt,{backgroundColor:h.secondary}," :init "))),qe.createElement(us,{marginTop:1},qe.createElement(Dt,{color:h.secondary2},"This will create, commit and push "),qe.createElement(Dt,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json ")));import{Box as ms,Text as Ct}from"ink";import Te from"react";var Ky=({isDone:e,command:t,value:n})=>Te.createElement(ms,null,Te.createElement(Ct,{color:h.accent,dimColor:e},e?" \u2714 ":" "),Te.createElement(Ct,{dimColor:e},"Type "),Te.createElement(Ct,{backgroundColor:h.secondary,dimColor:e}," "+t+" "),n!==void 0&&Te.createElement(Te.Fragment,null,Te.createElement(Ct,{dimColor:e}," "),Te.createElement(Ct,{color:h.secondary,dimColor:e},"<"+n+">"))),zy=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function Ki({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:i,isSetAutoSync:c}=Vt(),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:i,message:"Almost there. Configure auto sync."}],m=l.findIndex(f=>!f.done),p=m===-1?void 0:l[m];return Te.createElement(ms,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},Te.createElement(Ct,{color:h.accent,bold:!0},"Welcome! \u{1F539}"),Te.createElement(Ct,null,"Let's get you started - it's a breeze."),Te.createElement(Ct,{color:h.secondary2},"Remember - you can always search available commands by typing:",Te.createElement(Ct,{color:h.accent}," ? ")),p&&Te.createElement(Ct,{color:h.secondary2},p.message),Te.createElement(ms,{flexDirection:"column"},l.map((f,g)=>m===-1||g<=m?Te.createElement(ms,{key:f.key,marginBottom:1},Te.createElement(Ky,{isDone:f.done,command:f.command,value:f.done?zy(f.value):void 0})):null)))}import ys from"chalk";import{Box as Br,Text as Vn}from"ink";import xe from"react";import{Box as ps,Text as ju}from"ink";import nn from"react";import qy from"chalk";var Yy=e=>(E.getTag(e)?.name??"").length+3,Xy=e=>{let t=E.getContributor(e);return(t?qt(e,t.name):"").length+3},Wu=({width:e})=>{let{viewMode:t}=K(),n=j(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[o.id]?.[s],l=At(c?.id??o.id,"TICKET"),m=Q(l)?l.value:void 0,p=m?.props.tags??[],f=m?.props.assignees??[],g=m?.parentNodeId?!Vs(o.id,m.parentNodeId)&&t==="dense":!1,I=r.map((H,D)=>{let $=D===r.length-1,Ye=Y(H.id),we=$?Ye?.[s]?.title:void 0;return`${D?" / ":""}${H.title??""}${we?` \u25B8 ${we}`:""}`}).join(""),S=m?E.getCommentsByIssue(m.id):[],R=S.length?String(S.length).length+11:0,A=g?p.reduce((H,D)=>H+Yy(D),0)+f.reduce((H,D)=>H+Xy(D),0)+R:0,P=c?.id!=null&&!(t==="wide"&&T(c)),_=Math.max(0,e-A),w=I.substring(0,_)+(P?qy.hex(h.secondary2).dim(` ${He(c.id)}`):""),W=g?[...p.map(H=>nn.createElement(ps,{key:`tag-${H}`,paddingLeft:1},nn.createElement(Un,{id:H}))),...f.map(H=>nn.createElement(ps,{key:`assignee-${H}`,paddingLeft:1},nn.createElement(Yt,{id:H}))),S.length?nn.createElement(ps,{key:"comments",paddingLeft:1},nn.createElement(ju,{color:h.accent},"[",S.length," comment",S.length===1?"":"s","]")):null]:[];return nn.createElement(ps,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},nn.createElement(ju,{color:h.secondary2},w),W)};import{Box as Jy,Text as Vu}from"ink";import fs from"react";var Qy=({filters:e})=>fs.createElement(Jy,{columnGap:1},fs.createElement(Vu,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>fs.createElement(Vu,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Gu=fs.memo(Qy);import{Box as Zy,Text as gs}from"ink";import Dr from"react";function Ku(){let{eventLog:e,unappliedEvents:t}=j(),n=e.at(-1)?.id,r=Co(n??""),o=Q(r)?io(r.value):"INVALID DATE";return Dr.createElement(Zy,{paddingLeft:1},Dr.createElement(gs,{backgroundColor:h.accent,color:h.secondary}," Readonly "),Dr.createElement(gs,{color:h.accent}," "+t.length+" edits ago at "+o+"."),Dr.createElement(gs,{color:h.accent}," Resume with "),Dr.createElement(gs,{backgroundColor:h.accent,color:h.secondary}," ",":peek now"," "))}import{Box as eh,Text as zi}from"ink";import vs from"react";function zu(){let{replay:e}=j();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return vs.createElement(eh,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},vs.createElement(zi,{backgroundColor:h.accent,color:h.secondary}," \u25B6 REPLAY "),vs.createElement(zi,{color:h.secondary2},io(new Date(r))),vs.createElement(zi,{color:h.accent},`${t}/${n} edits`))}import qi from"chalk";import{Box as th,Text as qu}from"ink";import Yi,{useEffect as nh,useState as rh}from"react";var oh=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],sh=150,Yu=12,ih=.36,Xu=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)}},ah=({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)}`},dh=(e,t,n)=>{let r=Xu(e),o=Xu(t);return ah({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},ch=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,s=e[r],i=e[Math.min(r+1,e.length-1)];return dh(s,i,o)};function Ju({syncStatus:e,autoSync:t}){let[n,r]=rh(0);nh(()=>{if(e.status!=="syncing"){r(0);return}let c=0,l=setInterval(()=>{c+=1;let m=(Math.sin(c*ih)+1)/2,p=Math.round(m*(Yu-1));r(f=>f===p?f:p)},sh);return()=>clearInterval(l)},[e.status]);let o={synced:" ",failed:"---",syncing:"...",pending:"idle"},i={synced:h.secondary2,failed:h.yellow,pending:h.secondary2,syncing:ch(oh,n/(Yu-1))??""}[e.status];return Yi.createElement(th,null,Yi.createElement(qu,null,qi.hex(h.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Yi.createElement(qu,null,qi.hex(i)("\u25CF")+qi.hex(h.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import nm from"chalk";import{Text as rm}from"ink";import om,{useEffect as ph,useState as fh}from"react";var rn="1.4.0";import Xi from"chalk";var lh="https://registry.npmjs.org/epiq/latest",Ji=null,Qu=0,uh=1e3*60*60*24,Zu=e=>e.replace(/^v/,""),mh=(e,t)=>{let n=Zu(e).split(".").map(Number),r=Zu(t).split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let s=n[o]??0,i=r[o]??0;if(s>i)return 1;if(s<i)return-1}return 0},em=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Ji&&Date.now()-Qu<uh)return Ji;try{let t=await fetch(lh);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?mh(r,e)>0:!1};return Ji=o,Qu=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},tm=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,i)=>s!=n[i]);return r.map((s,i)=>i>=o?Xi.hex(h.accent).dim(s):Xi.hex(h.secondary).dim(s)).join(Xi.hex(h.secondary2).dim("."))};function sm(){let[e,t]=fh({current:rn,latest:null,updateAvailable:!1});return ph(()=>{let n=!0;return em(rn).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?om.createElement(rm,{dimColor:!0,color:h.secondary2},rn+" "):om.createElement(rm,null,nm.hex(h.secondary2).dim(rn),nm.hex(h.accent).dim(" \u2197 "),tm(rn,e.latest))}function Fr({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=j(),{userName:i,preferredEditor:c,autoSync:l}=K(),m=64,p=process.stdout.columns-m-8,f=t||n==="replay",g=s?ln(s.currentLabel,Math.max(0,p)):"";return xe.createElement(Br,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?xe.createElement(Br,{paddingLeft:1},xe.createElement(Vn,{color:h.secondary2},g)):f?xe.createElement(Vn,null," "):o===y.PALETTE?xe.createElement(Br,null,xe.createElement(Vn,{color:h.accent},"Command Palette"),xe.createElement(Vn,{dimColor:!0,color:h.secondary2}," ","- search, select and press enter")):xe.createElement(Br,{paddingLeft:1},e.length>0?xe.createElement(Gu,{filters:e}):xe.createElement(Wu,{width:p})),n==="live"?xe.createElement(Br,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},xe.createElement(Ju,{autoSync:!!l,syncStatus:r}),xe.createElement(Vn,null,ys.hex(h.secondary2).dim("Mode: ")+ys.hex(h.secondary2).dim(o.padEnd(8," "))," "),xe.createElement(im,{icon:"@",value:i}),xe.createElement(im,{icon:"\u276F",value:c}),xe.createElement(sm,null)):"",n==="peek"?xe.createElement(Ku,null):"",n==="replay"?xe.createElement(zu,null):"")}function im({icon:e,value:t}){return xe.createElement(Vn,null,ys.dim(e)+ys.hex(h.accent)(` ${t??"-"} `))}import{Box as gh,Text as vh}from"ink";import Ur from"react";import{Box as hs,Text as Qi}from"ink";import on from"react";function Zi(){let e=j(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?z(t?.id):[];return on.createElement(hs,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:h.secondary,width:s},on.createElement(hs,{padding:1,paddingTop:0,paddingBottom:0},on.createElement(Qi,null,"Select a board:")),on.createElement(hs,{padding:1,flexDirection:"column"},i.map((c,l)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===l,f=z(c.id).flatMap(({id:g})=>Y(g)).length;return on.createElement(hs,{key:c.id??l},on.createElement(Qi,{color:m?h.accent:h.secondary2},on.createElement(ke,{isSelected:m})),on.createElement(Qi,{color:m?h.accent:h.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var yh=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:i})=>{let{renderedChildrenIndex:c}=j(),l=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return Ur.createElement(gh,{flexDirection:"row"},e.context==="WORKSPACE"?Ur.createElement(Zi,null):l?Ur.createElement(Uo,{height:f,width:i,swimlanes:(c[l.id]??[]).filter(g=>g!==void 0&&_t(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Ur.createElement(vh,null))},am=Ur.memo(yh);import{useEffect as hh}from"react";var xh=e=>{hh(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:i}=K();i&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:l}=v();l==="default"&&!c&&ho(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},dm=({autoSync:e})=>(xh(e),null);function ea({width:e,height:t}){let n=j(),{autoSync:r,viewMode:o}=Pa(),s=n.filters;if(n.mode===y.HELP)return ce.createElement(sn,{flexDirection:"column"},ce.createElement($u,{width:e,height:t}));if(n.mode===y.PALETTE)return ce.createElement(sn,{flexDirection:"column"},ce.createElement(Fr,{filters:s}),ce.createElement(Au,{width:e,height:t-2}),ce.createElement(kr,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=Vt(),c=!i,l=i&&!n.hasProjectDefinition;if(c)return ce.createElement(sn,{flexDirection:"column"},ce.createElement(sn,{flexDirection:"column"},ce.createElement(Fr,{hideBreadCrumb:!0,filters:s}),ce.createElement(Ki,{height:t,width:e})),ce.createElement(kr,{width:e,mode:n.mode,availableHints:n.availableHints}));if(l)return ce.createElement(sn,{flexDirection:"column"},ce.createElement(sn,{flexDirection:"column"},ce.createElement(Fr,{hideBreadCrumb:!0,filters:s}),ce.createElement(Hu,{height:t,width:e})),ce.createElement(kr,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=Ue(n.breadCrumb??[],"BOARD");if(Q(m)){let p=m.value.id,f=z(p).length,g=3,I=Math.floor(e/g),S=Math.floor(e/Math.max(f,1));e=Math.min(S,I)*Math.max(f,g)}return ce.createElement(sn,{flexDirection:"column"},ce.createElement(dm,{autoSync:r}),ce.createElement(sn,{flexDirection:"column"},ce.createElement(Fr,{filters:s}),ce.createElement(am,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),ce.createElement(kr,{width:e,mode:n.mode,availableHints:n.availableHints}))}import bh from"readline";var xs,bs,Nt,Ih=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]),Eh=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]),cm=async e=>{if(e.ctrl&&e.name==="c")return M.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=v(),s=yc(e,n);if(!s||r&&!Ih.has(s)||o==="replay"&&n===y.DEFAULT&&Eh.has(s))return;let i=t[n]?.[s];if(i?.action)try{await i.action(i,e)}catch(c){logger.error(c)}},Sh=()=>async function(t,n){n.name!=="escape"&&(Nt&&(clearTimeout(Nt),Nt=void 0),await cm(n))},Ch=()=>async function(t){if(t.length===1&&t[0]===27){Nt&&clearTimeout(Nt),Nt=setTimeout(()=>{cm({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Nt=void 0},25);return}Nt&&(clearTimeout(Nt),Nt=void 0)};function lm(){xs&&process.stdin.removeListener("keypress",xs),bs&&process.stdin.removeListener("data",bs),xs=Sh(),bs=Ch(),bh.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",bs),process.stdin.on("keypress",xs)}async function um(){try{let e=Ft();Q(e)&&Me(e.value);let t=_e(process.cwd()),n=[];if(Q(t)){let s=Re({repoRoot:t.value});if(d(s))return fn(3,s.message);let i=Sn(),c=await cn({repoRoot:t.value,stateBranchRoot:s.value,stateBranchName:i.stateBranch});if(d(c))return fn(3,c.message);let l=await F({cwd:s.value,args:["pull","--ff-only"]});d(l)&&logger.info(3,l.message);let m=je(s.value);if(d(m))return fn(3,m.message);n=m.value}let r=pn(n);if(d(r))return fn(4,r.message);C({hasProjectDefinition:Q(t),hasInitializingEvents:!!n.length});let o=ta();return d(o)?fn(6,o.message):(lm(),u("Booted Epiq",void 0))}catch(e){return fn(0,go(e))}}Wc();var Th=`${an.bold("Epiq CLI")}
59
61
 
60
- ${Zt.dim("Boot in directory:")}
61
- ${Zt.cyan("$ epiq")}
62
+ ${an.dim("Boot in directory:")}
63
+ ${an.cyan("$ epiq")}
62
64
 
63
- ${Zt.dim("Launch GUI:")}
64
- ${Zt.cyan("$ epiq gui")}
65
- `,by=yy(xy,{importMeta:import.meta,version:Xt,flags:{init:{type:"boolean",default:!1}}}),is=by.input[0];is&&is!=="gui"&&(console.error(Zt.red(`Unknown command: ${is}`)),process.exit(1));var bu=process.stdout.columns||120,Iu=process.stdout.rows||20,as=null,Iy=e=>{try{return as?(as.rerender(e),l("Rerendered app",void 0)):(as=vy(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${oo(t)}`)}},Pi=()=>Iy(hy.createElement(Mi,{width:bu,height:Iu}));process.stdout.on("resize",()=>{if(bu=process.stdout.columns||120,Iu=process.stdout.rows||20,!as)return;let e=Pi();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(is==="gui"){let e=await Pl({repoRoot:process.cwd()});d(e)&&(console.error(Zt.red(`Failed to start Epiq GUI:
66
- ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await xu();d(e)&&(logger.info(e.message),console.error(Zt.red(`Failed to boot Epiq:
67
- ${e.message}`)),process.exitCode=1)}export{Pi as renderApp};
65
+ ${an.dim("Launch GUI:")}
66
+ ${an.cyan("$ epiq gui")}
67
+ `,wh=Rh(Th,{importMeta:import.meta,version:rn,flags:{init:{type:"boolean",default:!1}}}),Is=wh.input[0];Is&&Is!=="gui"&&(console.error(an.red(`Unknown command: ${Is}`)),process.exit(1));var mm=process.stdout.columns||120,pm=process.stdout.rows||20,Es=null,Mh=e=>{try{return Es?(Es.rerender(e),u("Rerendered app",void 0)):(Es=Nh(e),u("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${go(t)}`)}},ta=()=>Mh(Ah.createElement(ea,{width:mm,height:pm}));process.stdout.on("resize",()=>{if(mm=process.stdout.columns||120,pm=process.stdout.rows||20,!Es)return;let e=ta();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(Is==="gui"){let e=await Su({repoRoot:process.cwd()});d(e)&&(console.error(an.red(`Failed to start Epiq GUI:
68
+ ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await um();d(e)&&(logger.info(e.message),console.error(an.red(`Failed to boot Epiq:
69
+ ${e.message}`)),process.exitCode=1)}export{ta as renderApp};