epiq 0.7.3 → 0.7.5

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,66 +1,66 @@
1
1
  #!/usr/bin/env node
2
- import Ut from"chalk";import{render as Xg}from"ink";import Jg from"meow";import Qg from"react";import zp from"chalk";var xt={None:"none",Success:"success",Fail:"fail"},a=e=>({status:xt.Fail,message:e,value:null}),l=(e,t)=>({status:xt.Success,message:e,value:t}),d=e=>e.status==="fail",Q=e=>e.status==="success";import{spawn as Yc}from"node:child_process";import br from"node:process";var Hs=e=>{let t=br.platform==="darwin"?"open":br.platform==="win32"?"cmd":"xdg-open",n=br.platform==="win32"?["/c","start","",e]:[e];Yc(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as $p}from"node:fs/promises";import Wp from"node:http";import Zt from"node:path";import{fileURLToPath as _p}from"node:url";import{decodeTime as Up,ulid as ve}from"ulid";import Pr from"node:fs";import cl from"node:os";import Ve from"node:path";import bn from"node:fs";import{ulid as Qc}from"ulid";import{z as ro}from"zod";import hn from"node:fs";import rt from"node:path";var mf=process.env.IS_LOCAL==="true",st=".epiq",ke=".epiq-global",eo="events",Xc="project.json",to=e=>rt.join(e,st),no=e=>rt.join(to(e),Xc),In=e=>rt.join(to(e),eo),Vs=e=>rt.join(e,st),Jc=e=>{let t=rt.join(e,st);return hn.existsSync(t)&&hn.statSync(t).isDirectory()},Cr=e=>{let t=no(e);return hn.existsSync(t)&&hn.statSync(t).isFile()},oo=e=>{let t=rt.resolve(e);for(;;){if(Jc(t))return l("Resolved closest .epiq root",t);let n=rt.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},_e=e=>{let t=rt.resolve(e);for(;;){if(Cr(t))return l("Resolved closest epiq project root",t);let n=rt.dirname(t);if(n===t)return a("No .epiq/project.json found in any parent");t=n}},Gs=e=>{let t=In(e);try{return hn.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")}},je=async()=>{let e=await ht(process.cwd());if(d(e))return e;let t=Oe({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};var Zc="__epiq_state__",el=ro.object({projectId:ro.string().min(1),stateBranch:ro.string().min(1),createdAt:ro.iso.datetime()}),tn=()=>({projectId:Qc(),stateBranch:Zc,createdAt:new Date().toISOString()}),It=e=>{let t=no(e);if(!bn.existsSync(t))return a("Missing .epiq/project.json");try{let n=bn.readFileSync(t,"utf8"),o=JSON.parse(n),r=el.safeParse(o);return r.success?l("Read project.json",r.data):a(`Invalid .epiq/project.json: ${r.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")}},Ks=e=>{let t=It(e);return d(t)?a(t.message):l("Read projectId",t.value.projectId)},zs=({repoRoot:e,fileContents:t})=>{let n=to(e),o=no(e);try{if(bn.mkdirSync(n,{recursive:!0}),bn.existsSync(o)){let r=It(e);return d(r)?a(r.message):l("Project already initialized",null)}return bn.writeFileSync(o,JSON.stringify(t,null,2)+`
3
- `,"utf8"),l("Created project.json",null)}catch(r){return a(r instanceof Error?`Failed to initialize project: ${r.message}`:"Failed to initialize project")}};var Nr=(e,t)=>{let n=new Map,o=t??((...s)=>JSON.stringify(s)),r=((...s)=>{let i=o(...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 r.clear=()=>n.clear(),r};import Cn from"fs";import Tr from"path";import tl from"util";var qs=1e3,nl=50,Sr=0,Ys=()=>process.env.EPIQ_MCP==="true",Xs=()=>{let e=process.cwd(),t=oo(e);return d(t)?Ys()?Tr.join(process.cwd(),".epiq-mcp.log"):void 0:Tr.join(t.value,st,"log","epiq.log")};function ol(){let e=Xs();if(!e||!Cn.existsSync(e))return;let n=Cn.readFileSync(e,"utf8").split(`
4
- `);if(n[n.length-1]===""&&n.pop(),n.length<=qs)return;let o=n.slice(-qs).join(`
2
+ import Ut from"chalk";import{render as af}from"ink";import df from"meow";import cf from"react";import og from"chalk";var ht={None:"none",Success:"success",Fail:"fail"},a=e=>({status:ht.Fail,message:e,value:null}),l=(e,t)=>({status:ht.Success,message:e,value:t}),d=e=>e.status==="fail",Z=e=>e.status==="success";import{spawn as Zc}from"node:child_process";import Nr from"node:process";var Vs=e=>{let t=Nr.platform==="darwin"?"open":Nr.platform==="win32"?"cmd":"xdg-open",n=Nr.platform==="win32"?["/c","start","",e]:[e];Zc(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as Yp}from"node:fs/promises";import Xp from"node:http";import Zt from"node:path";import{fileURLToPath as Jp}from"node:url";import{decodeTime as Kp,ulid as ve}from"ulid";import Dr from"node:fs";import pl from"node:os";import ze from"node:path";import In from"node:fs";import{ulid as nl}from"ulid";import{z as so}from"zod";import hn from"node:fs";import rt from"node:path";var Cf=process.env.IS_LOCAL==="true",st=".epiq",ke=".epiq-global",to="events",el="project.json",no=e=>rt.join(e,st),oo=e=>rt.join(no(e),el),xn=e=>rt.join(no(e),to),Gs=e=>rt.join(e,st),tl=e=>{let t=rt.join(e,st);return hn.existsSync(t)&&hn.statSync(t).isDirectory()},Er=e=>{let t=oo(e);return hn.existsSync(t)&&hn.statSync(t).isFile()},ro=e=>{let t=rt.resolve(e);for(;;){if(tl(t))return l("Resolved closest .epiq root",t);let n=rt.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},He=e=>{let t=rt.resolve(e);for(;;){if(Er(t))return l("Resolved closest epiq project root",t);let n=rt.dirname(t);if(n===t)return a("No .epiq/project.json found in any parent");t=n}},zs=e=>{let t=xn(e);try{return hn.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")}},Ve=async()=>{let e=await xt(process.cwd());if(d(e))return e;let t=We({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};var ol="__epiq_state__",rl=so.object({projectId:so.string().min(1),stateBranch:so.string().min(1),createdAt:so.iso.datetime()}),tn=()=>({projectId:nl(),stateBranch:ol,createdAt:new Date().toISOString()}),It=e=>{let t=oo(e);if(!In.existsSync(t))return a("Missing .epiq/project.json");try{let n=In.readFileSync(t,"utf8"),o=JSON.parse(n),r=rl.safeParse(o);return r.success?l("Read project.json",r.data):a(`Invalid .epiq/project.json: ${r.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")}},Ks=e=>{let t=It(e);return d(t)?a(t.message):l("Read projectId",t.value.projectId)},qs=({repoRoot:e,fileContents:t})=>{let n=no(e),o=oo(e);try{if(In.mkdirSync(n,{recursive:!0}),In.existsSync(o)){let r=It(e);return d(r)?a(r.message):l("Project already initialized",null)}return In.writeFileSync(o,JSON.stringify(t,null,2)+`
3
+ `,"utf8"),l("Created project.json",null)}catch(r){return a(r instanceof Error?`Failed to initialize project: ${r.message}`:"Failed to initialize project")}};var Rr=(e,t)=>{let n=new Map,o=t??((...s)=>JSON.stringify(s)),r=((...s)=>{let i=o(...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 r.clear=()=>n.clear(),r};import bn from"fs";import Mr from"path";import sl from"util";var Ys=1e3,il=50,Tr=0,Xs=()=>process.env.EPIQ_MCP==="true",Js=()=>{let e=process.cwd(),t=ro(e);return d(t)?Xs()?Mr.join(process.cwd(),".epiq-mcp.log"):void 0:Mr.join(t.value,st,"log","epiq.log")};function al(){let e=Js();if(!e||!bn.existsSync(e))return;let n=bn.readFileSync(e,"utf8").split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=Ys)return;let o=n.slice(-Ys).join(`
5
5
  `)+`
6
- `;Cn.writeFileSync(e,o,"utf8")}function Er(e,t,n=!1){let o=Xs();if(!o)return;let r=tl.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${r}
7
- `;Cn.mkdirSync(Tr.dirname(o),{recursive:!0}),Cn.appendFileSync(o,c,"utf8"),Sr++,Sr>=nl&&(Sr=0,ol())}var Rr=()=>Ys()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",ee={info(...e){let t=Rr();(t==="info"||t==="debug")&&Er("[Info]",e,!1)},debug(...e){Rr()==="debug"&&Er("[Debug]",e,!0)},error(...e){let t=Rr();if(t==="error"||t==="info"||t==="debug"){let o=e.some(r=>r instanceof Error)?void 0:new Error().stack;Er("[Error]",[...e,o].filter(Boolean),!1)}}};globalThis.logger=ee;import{spawn as rl}from"node:child_process";import so from"node:fs";import Nn from"node:path";var te={stage:({cwd:e,pathspec:t})=>B({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>B({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>B({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>B({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>B({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:o=!1})=>{let r=t&&n?["push",...o?["-u"]:[],t,n]:["push"];return B({args:r,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>B({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>B({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>B({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>B({args:["worktree","prune"],cwd:e})};var nn=e=>{let t=_e(e);if(d(t))return a("Unable to resolve epiq project root");let n=It(t.value);return d(n)?a("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},De="origin";var Js=1e4,sl={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Zs=({args:e,cwd:t,allowFail:n})=>new Promise(o=>{if(!so.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){o({stdout:"",stderr:p,exitCode:1});return}o(a(p));return}let r=rl("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:sl}),s=!1,i="",c="",u=p=>{s||(s=!0,clearTimeout(m),o(p))},m=setTimeout(()=>{r.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Js}ms`].join(`
8
- `);u(n?{stdout:i,stderr:p,exitCode:124}:a(p))},Js);r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",p=>{i+=p}),r.stderr.on("data",p=>{c+=p}),r.on("error",p=>{if(n){u({stdout:i,stderr:p.message,exitCode:1});return}u(a([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
6
+ `;bn.writeFileSync(e,o,"utf8")}function Ar(e,t,n=!1){let o=Js();if(!o)return;let r=sl.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${r}
7
+ `;bn.mkdirSync(Mr.dirname(o),{recursive:!0}),bn.appendFileSync(o,c,"utf8"),Tr++,Tr>=il&&(Tr=0,al())}var wr=()=>Xs()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",te={info(...e){let t=wr();(t==="info"||t==="debug")&&Ar("[Info]",e,!1)},debug(...e){wr()==="debug"&&Ar("[Debug]",e,!0)},error(...e){let t=wr();if(t==="error"||t==="info"||t==="debug"){let o=e.some(r=>r instanceof Error)?void 0:new Error().stack;Ar("[Error]",[...e,o].filter(Boolean),!1)}}};globalThis.logger=te;import{spawn as dl}from"node:child_process";import io from"node:fs";import Cn from"node:path";var ne={stage:({cwd:e,pathspec:t})=>B({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>B({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>B({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>B({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>B({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:o=!1})=>{let r=t&&n?["push",...o?["-u"]:[],t,n]:["push"];return B({args:r,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>B({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>B({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>B({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>B({args:["worktree","prune"],cwd:e})};var nn=e=>{let t=He(e);if(d(t))return a("Unable to resolve epiq project root");let n=It(t.value);return d(n)?a("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},De="origin";var Qs=1e4,cl={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},ei=({args:e,cwd:t,allowFail:n})=>new Promise(o=>{if(!io.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){o({stdout:"",stderr:p,exitCode:1});return}o(a(p));return}let r=dl("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:cl}),s=!1,i="",c="",u=p=>{s||(s=!0,clearTimeout(m),o(p))},m=setTimeout(()=>{r.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Qs}ms`].join(`
8
+ `);u(n?{stdout:i,stderr:p,exitCode:124}:a(p))},Qs);r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",p=>{i+=p}),r.stderr.on("data",p=>{c+=p}),r.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
9
  `)))}),r.on("close",p=>{let v=p??1;if(n){u({stdout:i,stderr:c,exitCode:v});return}if(v!==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:v}))})}),B=({args:e,cwd:t})=>Zs({args:e,cwd:t,allowFail:!1}),He=({args:e,cwd:t})=>Zs({args:e,cwd:t,allowFail:!0}),on=async({cwd:e,message:t})=>{let n=await te.commit({cwd:e,message:t});if(d(n))return a(`Failed to create commit
10
+ `)));return}u(l("Git command succeeded",{stdout:i,stderr:c,exitCode:v}))})}),B=({args:e,cwd:t})=>ei({args:e,cwd:t,allowFail:!1}),Ge=({args:e,cwd:t})=>ei({args:e,cwd:t,allowFail:!0}),on=async({cwd:e,message:t})=>{let n=await ne.commit({cwd:e,message:t});if(d(n))return a(`Failed to create commit
11
11
  ${n.message}`);let o=await B({args:["rev-parse","HEAD"],cwd:e});return d(o)?a(`Commit created, but failed to read HEAD SHA
12
- ${o.message}`):l("Created commit and resolved SHA",o.value.stdout.trim())},il=async e=>{let t=await B({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",Nn.isAbsolute(n)?n:Nn.resolve(e,n))},al=async e=>{let t=await il(e);if(d(t))return a(t.message);let n=t.value,o={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(o))if(so.existsSync(Nn.join(n,s)))return l("Checked for in-progress Git operation",i);let r={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(r))if(so.existsSync(Nn.join(n,s)))return l("Checked for in-progress Git operation",i);return l("Checked for in-progress Git operation",null)},io=async e=>{let t=await al(e);return d(t)?a(t.message):l("Checked for in-progress Git operation",t.value!==null)},Ar=async({repoRoot:e})=>{let n=(await He({args:["remote","get-url",De],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},ao=async({repoRoot:e,branch:t})=>{let n=await He({args:["ls-remote","--heads",De,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${De}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},co=async({repoRoot:e,branch:t})=>{let n=await He({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}`)},Qs=e=>{try{return so.realpathSync.native(e)}catch{return Nn.resolve(e)}},ei=async({repoRoot:e,worktreeRoot:t})=>{let n=await B({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let o=Qs(t),r=n.value.stdout.split(`
13
- `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Qs).includes(o);return l("Checked worktree registration",r)},wr=async e=>{let t=await He({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},lo=async e=>{let t=await B({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved current branch",t.value.stdout.trim())},ti=async e=>{let t=await B({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},ni=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),dl=async e=>(await He({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1);var Mr=async({cwd:e,branch:t})=>{let n=await ao({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return l("Remote branch missing, skipped pull",!1);let o=await dl(e);if(d(o))return a(o.message);let r=await te.fetch({cwd:e,remote:De,branch:t});if(d(r))return a(`Failed to fetch ${t}
14
- ${r.message}`);let s=await te.pullRebase({cwd:e,remote:De,branch:t});return d(s)?a(`Failed during pull --rebase
15
- ${s.message}`):l("Pulled with rebase",!0)},oi=async e=>{let t=await He({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 ri=async e=>{let t=await lo(e);return d(t)?a(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var ii="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Lr=e=>Ve.join(st,eo,e),ai=()=>Ve.join(cl.homedir(),ke),uo=()=>Ve.join(ai(),"worktrees"),Oe=({repoRoot:e})=>{let t=Ks(e);return d(t)?a(t.message):l("Resolved state branch root",Ve.join(uo(),t.value))},ll=e=>Ve.join(e,st),si=e=>Ve.join(ll(e),eo);var Sn=e=>{try{return Pr.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},mo=()=>{let e=Sn(ai());if(d(e))return a(`Ensure epiq home failed.
16
- `+e.message);let t=Sn(uo());return d(t)?a(`Ensure worktrees dir failed.
17
- `+t.message):l("Ensured epiq storage",!0)},di=e=>{Pr.existsSync(e)&&(ee.debug("[sync] remove path",e),Pr.rmSync(e,{recursive:!0,force:!0}))};var ci=(e,t)=>{for(let n of[si(e),si(t)]){let o=Sn(n);if(d(o))return a(o.message)}return l("Ensured state branch",void 0)},li=async e=>{let t=await B({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return a(`ensure state branch is storage only failed
12
+ ${o.message}`):l("Created commit and resolved SHA",o.value.stdout.trim())},ll=async e=>{let t=await B({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",Cn.isAbsolute(n)?n:Cn.resolve(e,n))},ul=async e=>{let t=await ll(e);if(d(t))return a(t.message);let n=t.value,o={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(o))if(io.existsSync(Cn.join(n,s)))return l("Checked for in-progress Git operation",i);let r={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(r))if(io.existsSync(Cn.join(n,s)))return l("Checked for in-progress Git operation",i);return l("Checked for in-progress Git operation",null)},ao=async e=>{let t=await ul(e);return d(t)?a(t.message):l("Checked for in-progress Git operation",t.value!==null)},Pr=async({repoRoot:e})=>{let n=(await Ge({args:["remote","get-url",De],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},co=async({repoRoot:e,branch:t})=>{let n=await Ge({args:["ls-remote","--heads",De,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${De}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},lo=async({repoRoot:e,branch:t})=>{let n=await Ge({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}`)},Zs=e=>{try{return io.realpathSync.native(e)}catch{return Cn.resolve(e)}},ti=async({repoRoot:e,worktreeRoot:t})=>{let n=await B({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let o=Zs(t),r=n.value.stdout.split(`
13
+ `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Zs).includes(o);return l("Checked worktree registration",r)},Lr=async e=>{let t=await Ge({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},uo=async e=>{let t=await B({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved current branch",t.value.stdout.trim())},ni=async e=>{let t=await B({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},oi=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),ml=async e=>(await Ge({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1);var kr=async({cwd:e,branch:t})=>{let n=await co({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return l("Remote branch missing, skipped pull",!1);let o=await ml(e);if(d(o))return a(o.message);let r=await ne.fetch({cwd:e,remote:De,branch:t});if(d(r))return a(`Failed to fetch ${t}
14
+ ${r.message}`);let s=await ne.pullRebase({cwd:e,remote:De,branch:t});return d(s)?a(`Failed during pull --rebase
15
+ ${s.message}`):l("Pulled with rebase",!0)},ri=async e=>{let t=await Ge({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 si=async e=>{let t=await uo(e);return d(t)?a(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var ai="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Fr=e=>ze.join(st,to,e),di=()=>ze.join(pl.homedir(),ke),mo=()=>ze.join(di(),"worktrees"),We=({repoRoot:e})=>{let t=Ks(e);return d(t)?a(t.message):l("Resolved state branch root",ze.join(mo(),t.value))},gl=e=>ze.join(e,st),ii=e=>ze.join(gl(e),to);var Sn=e=>{try{return Dr.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},po=()=>{let e=Sn(di());if(d(e))return a(`Ensure epiq home failed.
16
+ `+e.message);let t=Sn(mo());return d(t)?a(`Ensure worktrees dir failed.
17
+ `+t.message):l("Ensured epiq storage",!0)},ci=e=>{Dr.existsSync(e)&&(te.debug("[sync] remove path",e),Dr.rmSync(e,{recursive:!0,force:!0}))};var li=(e,t)=>{for(let n of[ii(e),ii(t)]){let o=Sn(n);if(d(o))return a(o.message)}return l("Ensured state branch",void 0)},ui=async e=>{let t=await B({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 o=t.value.stdout.trim().split(`
19
19
  `).filter(Boolean).filter(i=>i!==st);if(o.length===0)return l("State branch is storage-only",!1);let r=await B({args:["rm","-r","--ignore-unmatch","--",...o],cwd:e});if(d(r))return a(`Failed to clean storage branch
20
- ${r.message}`);let s=await on({cwd:e,message:"[epiq:repair-storage-branch]"});return d(s)?a(s.message):l("Cleaned storage branch",!0)},ht=Nr(async(e=process.cwd())=>{let t=await B({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=>Ve.resolve(e)),tv=Nr(async e=>{let t=await B({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return a(t.message);let n=t.value.stdout.trim(),o=Ve.isAbsolute(n)?n:Ve.join(e,n);return l("Resolved git dir",o)},e=>Ve.resolve(e));import rn from"node:fs";import En from"node:path";var mi=async e=>{if((await He({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return l("Initial commit already exists",!1);ee.info("Creating initial commit");let n=await te.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?a(n.message):l("Created initial commit",!0)},ui=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",ul=async e=>{let t=await lo(e);if(d(t))return a(t.message);let n=await ti(e);return d(n)?a(n.message):l("Built sync commit message",`[sync|branch:${ui(t.value)}:sha:${ui(n.value)}]`)},kr=async({repoRoot:e,stateBranchName:t})=>{ee.info(`Creating ${t}`);let n=await B({args:["commit-tree",ii,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return a(`Failed to create state branch commit
20
+ ${r.message}`);let s=await on({cwd:e,message:"[epiq:repair-storage-branch]"});return d(s)?a(s.message):l("Cleaned storage branch",!0)},xt=Rr(async(e=process.cwd())=>{let t=await B({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=>ze.resolve(e)),uv=Rr(async e=>{let t=await B({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return a(t.message);let n=t.value.stdout.trim(),o=ze.isAbsolute(n)?n:ze.join(e,n);return l("Resolved git dir",o)},e=>ze.resolve(e));import rn from"node:fs";import Nn from"node:path";var pi=async e=>{if((await Ge({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return l("Initial commit already exists",!1);te.info("Creating initial commit");let n=await ne.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?a(n.message):l("Created initial commit",!0)},mi=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",fl=async e=>{let t=await uo(e);if(d(t))return a(t.message);let n=await ni(e);return d(n)?a(n.message):l("Built sync commit message",`[sync|branch:${mi(t.value)}:sha:${mi(n.value)}]`)},Br=async({repoRoot:e,stateBranchName:t})=>{te.info(`Creating ${t}`);let n=await B({args:["commit-tree",ai,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return a(`Failed to create state branch commit
21
21
  ${n.message}`);let o=n.value.stdout.trim(),r=await B({args:["update-ref",`refs/heads/${t}`,o],cwd:e});return d(r)?a(`Failed to create ${t}
22
- ${r.message}`):l("Created state branch",!0)},ml=async({repoRoot:e,stateBranchName:t})=>{let n=await Ar({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
23
- `+n.message);let o=n.value,r=o?await ao({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(d(r))return a(`Ensure local state branch failed
24
- `+r.message);let s=r.value;if(o&&s){let c=await te.fetch({cwd:e,remote:De,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
25
- ${c.message}`)}let i=await co({repoRoot:e,branch:t});if(d(i))return a(`Ensure local state branch failed
22
+ ${r.message}`):l("Created state branch",!0)},vl=async({repoRoot:e,stateBranchName:t})=>{let n=await Pr({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
23
+ `+n.message);let o=n.value,r=o?await co({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(d(r))return a(`Ensure local state branch failed
24
+ `+r.message);let s=r.value;if(o&&s){let c=await ne.fetch({cwd:e,remote:De,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
25
+ ${c.message}`)}let i=await lo({repoRoot:e,branch:t});if(d(i))return a(`Ensure local state branch failed
26
26
  `+i.message);if(i.value)return l("Local state branch already exists",!1);if(s){let c=await B({args:["branch","--track",t,`${De}/${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 kr({repoRoot:e,stateBranchName:t})},pl=async({repoRoot:e,branch:t})=>{let n=await B({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let o=n.value.stdout.split(`
28
- `),r=null;for(let s of o){if(s.startsWith("worktree ")){r=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&r)return l("Found worktree for branch",r)}return l("No worktree found for branch",null)},gl=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=Sn(En.dirname(t));if(d(o))return a(`Failed to create state branch worktree
29
- `+o.message);rn.existsSync(t)&&!rn.existsSync(En.join(t,".git"))&&(ee.info("Removing broken state branch worktree path"),di(t)),ee.info("Creating state branch worktree");let r=await te.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(r)?a(`Failed to create state branch worktree
30
- ${r.message}`):l("Created state branch worktree",!0)},$t=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await pl({repoRoot:e,branch:n});if(d(o))return a(o.message);let r=En.resolve(t),s=o.value?En.resolve(o.value):null;if(s&&s===r&&rn.existsSync(s))return l("State branch already checked out in expected worktree",!1);if(s&&s!==r){ee.info("Moving state branch worktree to expected location");let u=await te.worktreeRemove({cwd:e,worktreeRoot:s});if(d(u))return a(`Failed to remove existing state branch worktree
31
- ${u.message}`)}if(s&&!rn.existsSync(s)){ee.info("Pruning stale state branch worktree");let u=await te.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
32
- ${u.message}`)}let i=await ei({repoRoot:e,worktreeRoot:t});if(d(i))return a(i.message);let c=rn.existsSync(t);if(i.value&&c)return l("State branch worktree already exists",!1);if(i.value&&!c){ee.info("Pruning missing registered state branch worktree");let u=await te.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
33
- ${u.message}`)}return gl({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},fl=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await lo(e);if(d(n))return a(n.message);if(n.value===t)return l("State branch already checked out",!1);(await He({cwd:e,args:["rebase","--abort"]})).exitCode===0&&ee.info("Aborted stale state branch rebase");let r=await te.checkout({cwd:e,branch:t});return d(r)?a(`Failed to checkout ${t}
34
- ${r.message}`):l("Checked out state branch",!0)},vl=async({repoRoot:e,stateBranchRoot:t})=>{let n=await wr(t);if(d(n))return a(n.message);if(n.value)return l("State branch upstream already configured",!1);let o=await Ar({repoRoot:t});if(d(o))return a(o.message);if(!o.value)return l("No remote available for state branch upstream",!1);let r=nn(e);if(d(r))return r;let s=r.value,i=await ao({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);ee.info(`Configuring ${s} upstream`);let c=await te.fetch({cwd:t,remote:De,branch:s});if(d(c))return a(`Failed to fetch ${s}
35
- ${c.message}`);let u=await te.setUpstream({cwd:t,branch:s,upstream:`${De}/${s}`});return d(u)?a(`Failed to set state branch upstream
36
- ${u.message}`):l("Configured state branch upstream",!0)},po=async({stateBranchRoot:e,eventFileName:t})=>{let n=Lr(t),o=En.join(e,n);if(!rn.existsSync(o))return l("No event file to stage",void 0);let r=await te.stage({cwd:e,pathspec:[n]});return d(r)?a(`Failed to stage state branch event file
37
- ${r.message}`):l("Staged state branch event file",void 0)},pi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await ul(e);return d(n)?a(`Create state branch sync commit failed
38
- `+n.message):on({cwd:t,message:n.value})},Rn=async({repoRoot:e,stateBranchRoot:t})=>{let n=await wr(t);if(d(n))return a(n.message);let o=nn(e);if(d(o))return o;let r=o.value,s=n.value?await te.push({cwd:t}):await te.push({cwd:t,remote:De,branch:r,setUpstream:!0});return d(s)?a(`Failed during state branch push
39
- ${s.message}`):l("Pushed state branch",!0)},gi=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let o=!1,r=nn(e);if(d(r))return r;let s=r.value,i=[mo(),await ml({repoRoot:e,stateBranchName:s}),await $t({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await fl({stateBranchRoot:t,stateBranchName:s}),await li(t),n?await vl({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(d(c))return a(c.message);o=o||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",o)};import{WebSocket as yl}from"ws";var go=new Set,fi=e=>{go.add(e),e.on("close",()=>{go.delete(e)}),e.on("error",()=>{go.delete(e)})},Wt=e=>{let t=JSON.stringify(e);for(let n of go)n.readyState===yl.OPEN&&n.send(t)};import{useSyncExternalStore as Lp}from"react";var w={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Dr(e){return e.context===w.WORKSPACE}function A(e){return e.context===w.TICKET}function bt(e){return e.context===w.TEXT}function Ge(e){return e.context===w.FIELD}function Tn(e){return e.context===w.FIELD_LIST}var Ct=e=>e.context===w.SWIMLANE,fo=e=>e.context===w.BOARD,An=e=>e.context===w.COMMENT;var f={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var vi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",yi=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",xi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",hi=(e,t)=>{if(yi(e,e.sequence))return x.MoveCursorLeftOfWord;if(xi(e,e.sequence))return x.MoveCursorRightOfWord;if(vi(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}},Ii=(e,t)=>{if(yi(e,e.sequence))return x.MoveCursorLeftOfWord;if(xi(e,e.sequence))return x.MoveCursorRightOfWord;if(vi(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 vo(e,t){let n=Math.min(e.length,t.length),o=0;for(;o<n&&e[o]===t[o];)o++;return o}var yo=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Nt=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),bi=e=>e.charAt(0).toUpperCase()+e.slice(1);var Ci=e=>{let t=new Map;for(let n of e)for(let o=1;o<=n.length;o++){let r=n.slice(0,o),s=t.get(r);s?s.push(n):t.set(r,[n])}return t},Ni=(e,t)=>t?e.get(t)??[]:[];var Si=new WeakMap,xl=e=>{let t=Si.get(e);return t||(t=Ci(e),Si.set(e,t)),t};var Ei=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let o=t.toLowerCase();return Ni(xl(e),o).filter(s=>vo(o,s)>=n)};var hl={hint:"",hints:[],overlap:0,remainder:""},Ri=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},o)=>{if(n||e==="")return hl;let r=Ei({wordList:o,inputToMatch:e,overlapThreshold:1});return Il(t,r)},Il=(e,t)=>{let n=t[0]??"",o=vo(e.toLowerCase(),n.toLowerCase()),[r,s]=n.split(":"),i=o<(r??"").length,c=!!s,p=(c&&i?r:n)+(c&&i?":":" "),v=p.slice(o);return{hint:p,hints:t,overlap:o,remainder:v}};import{useSyncExternalStore as bl}from"react";var wn={logLevel:"info",autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Fr=new Set,Cl=()=>{for(let e of Fr)e()},_=()=>wn,Ti=()=>bl(e=>(Fr.add(e),()=>{Fr.delete(e)}),()=>wn),Fe=e=>(wn={...wn,...e},Cl(),wn);import{ulid as El}from"ulid";var sn=24n,Nl=sn*4n,Ke=(1n<<Nl)-1n,Sl=/^[0-9a-f]+$/;function Ai(e){return!e||!Sl.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function Be(e,t=sn){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 Ce(e,t){if(!e&&!t)return Be(Ke/2n,sn);let n=e?Ai(e):l("Resolved lower bound",0n);if(d(n))return n;let o=t?Ai(t):l("Resolved upper bound",Ke);if(d(o))return o;let r=n.value,s=o.value;if(s<=r)return Be(Ke/2n,sn);let i=(r+s)/2n;return i===r||i===s?a("No rank space available between neighbors"):Be(i,sn)}function wi(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let o=0;o<e;o++){let r=Ke*BigInt(o+1)/(t+1n),s=Be(r,sn);if(d(s))return s;n.push(s.value)}return l("Resolved evenly spaced ranks",n)}var Br=(e,t)=>{let n=j(e),o=wi(n.length);if(d(o))return o;let r={};for(let s=0;s<n.length;s++){let i=n[s],c=o.value[s];if(!i||!c)return a("Unable to assign rebalance rank");r[i.id]=c}return l("Created rebalance event",{id:El(),action:"rebalance.children",payload:{parent:e,ranks:r},...t})};import{ulid as Tu}from"ulid";var it=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o)return a("Node not found");if(o.context===t)return l("Resolved ancestor node",o);let r=o.parentNodeId?n[o.parentNodeId]:void 0;for(;r;){if(r.context===t)return l("Resolved ancestor node",r);r=r.parentNodeId?n[r.parentNodeId]:void 0}return a(`No ancestor found for context: ${t}`)},Ur=(e,t)=>{let{nodes:n}=g(),o=n[e];for(;o?.parentNodeId;){if(o.parentNodeId===t)return!0;o=n[o.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"}[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 o={...n,userId:t},r=ue(s=>({...s,contributors:{...s.contributors,[e]:o}}));return d(r)?a("Unable to link contributor to user"):l("Linked contributor to user",o)},deleteNode(e){ue(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create comment, missing issue");if(!A(t))return a("Can only comment on issues");let n=ue(o=>({...o,comments:{...o.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 o=this.getNode(n.issue);if(!o)return a("Unable to edit comment, missing issue");if(!A(o))return a("Can only edit issue comments");let r={...n,md:t,deleted:!1},s=ue(i=>({...i,comments:{...i.comments??{},[e]:r}}));return d(s)?a("Unable to edit comment"):l("Edited comment",r)},deleteComment(e){let t=this.getComment(e);if(!t)return a("Unable to delete comment, missing comment");let n={...t,deleted:!0},o=ue(r=>({...r,comments:{...r.comments??{},[e]:n}}));return d(o)?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)},editValue(e,t){let{nodes:n}=g(),o=n[e];if(!o)return a("Edit target node not found");let r=_t(o,"edit");if(r)return r;let s={...o,props:{...o.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 o=_t(n,"rename");if(o)return o;let r={...n,title:t};return this.updateNode(r),l("Renamed node",r)},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 j(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:o}=g(),r=this.getNode(e),s=this.getNode(t);if(!r)return a("Node not found");if(!s)return a("Target parent not found");if(o===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let i=_t(r,"move");if(i)return i;if(Ur(t,e))return a("Cannot move node into its own descendant");let c={...r,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:o}=g(),r=this.getNode(e);if(!r)return a("Node not found");if(o===e)return a("Cannot delete root node");let s=new Set,i=u=>{let m=t[u];if(!(!m||s.has(u))){s.add(u);for(let p of j(m.id))i(p.id)}};i(e);let c={...structuredClone(t)};for(let u of s){if(!c[u])return a("Unable to locate node to delete");c[u]={...c[u],isDeleted:!0}}return n?(N({nodes:c}),l("Successfully tomb stoned",r)):a("Unable to delete undefined")},createContributor(e){let t=ue(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),o=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!o)return a("Unable to assign contributor, missing target");let r=_t(o,"edit");if(r)return r;if(!A(o))return a("Target is not an issue");let s=o.props.assignees??[];if(s.includes(t))return a("Contributor already assigned");let i={...o,props:{...o.props,assignees:[...s,t]}};return this.updateNode(i),l("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!o)return a("Unable to unassign, missing target");let r=_t(o,"edit");if(r)return r;if(!A(o))return a("Target is not an issue");let s=o.props.assignees??[];if(!s.includes(t))return l("Issue is not assigned to that contributor",{assignee:t});let i={...o,props:{...o.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(i),l("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!o)return a("Unable to add tag, missing target");let r=_t(o,"edit");if(r)return r;if(!A(o))return a("Target is not an issue");let s=o.props.tags??[];if(s.includes(t))return a("Tag already assigned");let i={...o,props:{...o.props,tags:[...s,t]}};return this.updateNode(i),l("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!o)return a("Unable to remove tag, missing target");let r=_t(o,"edit");if(r)return r;if(!A(o))return a("Target is not an issue");let s=o.props.tags??[];if(!s.includes(t))return l("Issue is not tagged with that tag",{tag:t});let i={...o,props:{...o.props,tags:s.filter(c=>c!==t)}};return this.updateNode(i),l("Tag removed",{tag:t})},createTag(e){let t=ue(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):l("Tag created",e)},createNode(e){let t=ue(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},o=ue(r=>({...r,nodes:{...r.nodes,[e]:n}}));return d(o)?a(o.message):l("Locked node",n)},updateNode(e){let t=ue(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 j(e)}};var ne={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments"};var Y={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:w.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,o,r=!1)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:o,props:r={},childRenderAxis:s="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:w.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),fieldList:({id:e,name:t,parentNodeId:n,rank:o,childRenderAxis:r="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.FIELD_LIST,childRenderAxis:r,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!0,isVirtual:s=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:r,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:o,props:r={},readonly:s=!0,isVirtual:i=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:w.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};import jt from"chalk";import Fi from"string-width";import{decodeTime as kl}from"ulid";import dn from"chalk";var me={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:me.cyan,accent2:me.magenta,primary:me.white,secondary:me.grayDark,secondary2:me.grayLight,gray:me.gray,green:me.green,yellow:me.yellow,red:me.red};var b={red:me.red,yellow:me.yellow,green:me.green,blue:me.blue,magenta:me.magenta,cyan:me.cyan},an={urgent:b.red,critical:b.red,important:b.red,blocker:b.red,asap:b.red,immediate:b.red,fail:b.red,failure:b.red,broken:b.red,bug:b.red,error:b.red,incident:b.red,outage:b.red,production:b.red,crash:b.red,security:b.red,warning:b.yellow,warn:b.yellow,risky:b.yellow,risk:b.yellow,attention:b.yellow,pending:b.yellow,review:b.yellow,"needs-review":b.yellow,qa:b.yellow,testing:b.yellow,test:b.yellow,validate:b.yellow,verification:b.yellow,staging:b.yellow,check:b.yellow,"follow-up":b.yellow,followup:b.yellow,waiting:b.yellow,blocked:b.yellow,hold:b.yellow,done:b.green,complete:b.green,completed:b.green,success:b.green,ok:b.green,stable:b.green,resolved:b.green,fixed:b.green,closed:b.green,merged:b.green,released:b.green,deployed:b.green,approved:b.green,verified:b.green,working:b.green,healthy:b.green,pass:b.green,passing:b.green,info:b.blue,information:b.blue,note:b.blue,docs:b.blue,documentation:b.blue,doc:b.blue,guide:b.blue,help:b.blue,explanation:b.blue,detail:b.blue,details:b.blue,context:b.blue,design:b.blue,discussion:b.blue,proposal:b.blue,idea:b.blue,feature:b.magenta,enhancement:b.magenta,improvement:b.magenta,refactor:b.magenta,refactoring:b.magenta,cleanup:b.magenta,optimize:b.magenta,optimization:b.magenta,perf:b.magenta,performance:b.magenta,upgrade:b.magenta,migration:b.magenta,modernize:b.magenta,debt:b.magenta,todo:b.cyan,next:b.cyan,planned:b.cyan,plan:b.cyan,future:b.cyan,backlog:b.cyan,investigate:b.cyan,explore:b.cyan,prototype:b.cyan};var $r={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Mi=(e,t,n)=>Math.max(t,Math.min(n,e)),Or=(e,t,n)=>e+(t-e)*n,Pi=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Rl=e=>e.toLowerCase().trim(),Tl=(e,t,n)=>{let o=t/100,r=n/100,s=(1-Math.abs(2*r-1))*o,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 v=r-s/2;return[Math.round((u+v)*255),Math.round((m+v)*255),Math.round((p+v)*255)]},Al=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var wl=(e,t,n)=>{let o=Mi(n,0,1);return[Math.round(Or(e[0],t[0],o)),Math.round(Or(e[1],t[1],o)),Math.round(Or(e[2],t[2],o))]};var Ml=(e,t,n)=>wl(e,t,n),Mn=e=>{let n=Pi(e)%360,o=Tl(n,$r.stringColor.saturation,$r.stringColor.lightness);return Al(o)},oe=(e,t=an)=>{let n=Rl(e);return n&&t[n]?t[n]:Mn(n)};var Pl=e=>{let t=$r.gradient.stops,n=Mi(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let o=t.length-1,r=n*o,s=Math.min(Math.floor(r),o-1),i=r-s;return Ml(t[s],t[s+1],i)},xo=e=>Pi(e.toLowerCase().trim())/4294967295,Li=e=>{let t=xo(e);return Pl(t)},Ll=e=>{let[t,n,o]=Li(e);return{normal:r=>dn.bgRgb(t,n,o).black(r),cursor:r=>dn.bgRgb(t,n,o).white.bold(r)}},Wr=e=>{let[t,n,o]=Li(e);return{fg:r=>dn.rgb(t,n,o)(r),fgCursor:r=>dn.rgb(t,n,o).inverse(r),bg:r=>dn.bgRgb(t,n,o).black(r),bgCursor:r=>dn.bgRgb(t,n,o).white.bold(r)}},ho=e=>Ll(e).normal(` ${e} `);import{decodeTime as ki}from"ulid";var Io=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:o,ms:r}of n){let s=Math.floor(t/r);if(s>=1)return`${s}${o} ago`}return"just now"},Di=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())}`},bo=e=>{try{return l("Decoded date",new Date(ki(e)))}catch(t){return a("Decoding failed + "+t.message)}},_r=e=>{if(!e?.id)return null;try{return ki(e.id)}catch{return null}};var Dl=(e,t)=>e+" ".repeat(Math.max(0,t-Fi(e))),Fl=(e,t)=>" ".repeat(Math.max(0,t-Fi(e)))+e,Bl=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"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),Ul=(e,t)=>t?e<t?"up":e>t?"down":null:null,Ol=(e,t)=>{let n=I.getNode(e.payload.parent),o=n?jt.dim.bgBlack(` ${n.title} `):"unknown",r=t.at(-1);if(r&&"parent"in r&&"rank"in r&&r.parent===e.payload.parent){let s=Ul(e.payload.rank,r.rank);if(s)return`Moved ${s} in ${o}`}return`Moved issue to ${o}`},$l=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?jt.bgHex(oe(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?jt.bgHex(oe(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?jt.hex(oe(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?jt.hex(oe(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:""}"`;default:return""}},Wl=e=>{let t=Io(kl(e));return jt.gray(Fl(t,8))},_l=12,jl=e=>Dl(`${e}`,_l),Bi=(e,t)=>{let n=Wl(e.id),o=jl(e.userName),r=jt.dim("\u203A"),s=e.action==="move.node"?Ol(e,t):[Bl(e.action),$l(e)].filter(Boolean).join(" ");return`${o} ${n} ${r} ${s}`};import{createHash as Hl}from"node:crypto";var Vl="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Gl=e=>{let t=Hl("sha256").update(e).digest(),n=0n;for(let r=0;r<16;r++)n=n<<8n|BigInt(t[r]);let o="";for(let r=0;r<26;r++){let s=BigInt((25-r)*5);o+=Vl[Number(n>>s&31n)]}return o},Ne=(e,t)=>Gl(`${e}:virtual:${t}`);var Kl=e=>Ne(e,"comments"),zl=e=>Ne(e,"description"),ql=e=>Ne(e,"assignees"),Yl=e=>Ne(e,"tags"),Xl=e=>Ne(e,"history"),jr=({id:e,name:t,parentNodeId:n,rank:o,value:r,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=I.getNode(e);if(!c){let p=I.createNode({...Y.field({id:e,name:t,parentNodeId:n,rank:o,props:{value:r},isVirtual:!0}),readonly:s,childRenderAxis:i});return d(p)?p:l("Virtual field created",void 0)}if(!Ge(c))return a(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==o||c.props.value!==r||c.readonly!==s||c.childRenderAxis!==i))return l("Virtual field unchanged",void 0);let m=I.updateNode({...c,title:t,parentNodeId:n,rank:o,props:{...c.props,value:r},readonly:s,childRenderAxis:i});return d(m)?m:l("Virtual field updated",void 0)},Ui=({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!1,childRenderAxis:s="horizontal"})=>{let i=I.getNode(e);if(!i){let m=I.createNode({...Y.fieldList({id:e,name:t,parentNodeId:n,rank:o,isVirtual:!0}),readonly:r,childRenderAxis:s});return d(m)?m:l("Virtual field list created",void 0)}if(!Tn(i))return a(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==o||i.readonly!==r||i.childRenderAxis!==s))return l("Virtual field list unchanged",void 0);let u=I.updateNode({...i,title:t,parentNodeId:n,rank:o,readonly:r,childRenderAxis:s});return d(u)?u:l("Virtual field list updated",void 0)},Oi=e=>{let t=Be(Ke/4n),n=Be(Ke/2n),o=Be(Ke*3n/4n),r=Be(Ke*7n/8n),s=Be(Ke*13n/16n);if(d(t))return t;if(d(n))return n;if(d(o))return o;if(d(r))return r;if(d(s))return s;let i=jr({id:zl(e.id),name:ne.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(i))return i;let c=Ui({id:ql(e.id),name:ne.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(c))return c;let u=Ui({id:Yl(e.id),name:ne.TAGS,parentNodeId:e.id,rank:o.value,readonly:!0});if(d(u))return u;let m=jr({id:Kl(e.id),name:ne.COMMENTS,parentNodeId:e.id,rank:r.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(m))return m;let p=jr({id:Xl(e.id),name:ne.HISTORY,parentNodeId:e.id,rank:s.value,value:Jl(e),readonly:!0,childRenderAxis:"vertical"});return d(p)?p:l("Ticket virtual nodes materialized",void 0)},Jl=e=>{let t=[...e.log].reverse(),n=new Map;for(let o of t){let r=n.get(o.action)??[];r.push(o.payload),n.set(o.action,r)}return t.map(o=>Bi(o,n.get(o.action)??[])).join(`
40
- `)};var Ql=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[de,Co]=Ql;var L=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),$i=e=>{let t=I.getNode(e);if(!t||!A(t)||t.isDeleted)return null;let n=Oi(t);return d(n)?n:null},Zl=e=>{for(let t of e){let n=$i(t);if(n)return n;let o=g().nodes[t]?.parentNodeId;if(!o)continue;let r=$i(o);if(r)return r}return null},eu=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},tu=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},nu=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":return[e.payload.issue];case"delete.node":case"edit.description":return tu(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[]}},ou=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},ru=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?L("Invalid user ID format",e):l("Valid user",null)},su=(e,t)=>{let n=ru(e);if(d(n))return n;let o=[...new Set(nu(e))];t||(o.forEach(s=>eu(s,e)),ou(e));let r=Zl(o);return r||null},iu={"init.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=Y.workspace(t,n,o),s=Ln(r);if(d(s))return L(s.message,e);let i=I.createNode(r);return d(i)?L(i.message??"Failed to initialize workspace",e):Dr(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:o}=e.payload,r=I.createNode(Y.workspace(t,n,o));return d(r)?L(r.message??"Failed to add workspace",e):Dr(r.value)?l("Added workspace",{action:e.action,result:r.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=I.createNode(Y.board(t,n,o,r));return d(s)?L(s.message??"Unable to create board",e):fo(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:o,rank:r}=e.payload,s=I.createNode(Y.swimlane(t,n,o,r));return d(s)?L(s.message??"Unable to create swimlane",e):Ct(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:o,rank:r}=e.payload,s=I.createNode(Y.ticket(t,n,o,r));return d(s)?L(s.message??"Unable to create issue",e):A(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:o,val:r,rank:s}=e.payload,i=I.createNode(Y.field({id:t,name:n,parentNodeId:o,rank:s,props:{value:r},childRenderAxis:n.includes(ne.DESCRIPTION)?"vertical":"horizontal"}));return d(i)?L(i.message??`Unable to create field: ${n}`,e):Ge(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 L(`Unable to locate node with id ${t}`,e);let r=I.renameNode(t,n);return d(r)?L(r.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:r.value})},"delete.node":e=>{let{id:t}=e.payload,n=I.tombstoneNode(t);return d(n)?L(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,o=I.createTag({id:t,name:n});return d(o)?L(o.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:o.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,o=I.createContributor({id:t,name:n});return d(o)?L(o.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:o.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=I.tag(t,n);return d(o)?L(o.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,o=I.untag(t,n);return d(o)?L(o.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,o=I.assign(t,n);return d(o)?L(o.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,o=I.unassign(t,n);return d(o)?L(o.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(r)?L(r.message??"Failed to move node",e):l("Moved node",{action:e.action,result:r.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,o=I.editValue(t,n);return d(o)?L(o.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:o.value})},"close.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.getNode(t);if(!r)return L("Unable to locate issue",e);if(!A(r))return L("Can only close issues",e);let s=I.getNode(de);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=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(i)?L(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:o}=e.payload,r=I.getNode(t);if(!r)return L("Unable to locate issue",e);if(!A(r))return L("Can only reopen issues",e);let s=I.getNode(de);if(!s)return L("Unable to locate closed swimlane",e);if(n===s.id)return L("Cannot reopen issue into closed swimlane",e);if(!I.getNode(n))return L("Reopen parent no longer exists",e);let c=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(c)?L(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)?L(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[o,r]of Object.entries(n)){let s=I.getNode(o);if(!s)return L(`Unable to locate node ${o}`,e);if(s.parentNodeId!==t)return L(`Node ${o} is not child of ${t}`,e);let i=I.updateNode({...s,rank:r});if(d(i))return L(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:o,md:r}=e.payload,s=I.createComment({id:t,issue:n,authorId:o,authorName:I.getContributor(o)?.name??"Unknown",md:r,deleted:!1});return d(s)?L(s.message??"Unable to add comment",e):l("Comment added",{action:e.action,result:{id:t,issue:n,author:o,md:r}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:o}=e.payload,r=I.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 s=I.editComment(t,o);return d(s)?L(s.message??"Unable to edit comment",e):l("Comment edited",{action:e.action,result:{id:t,issue:n,md:o}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,o=I.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 r=I.deleteComment(t);return d(r)?L(r.message??"Unable to delete comment",e):l("Comment 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)?L(n.message??"Unable to link contributor",e):l("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function Pn(e,t=!1){let n=iu[e.action](e);if(d(n))return n;let o=su(e,t);return o||n}var Ht=e=>e.map(t=>Pn(t));import yu from"node:fs";import xu from"node:path";import{decodeTime as hu,monotonicFactory as Iu}from"ulid";import{z as kn}from"zod";import No from"node:fs";import Vr from"node:path";import{decodeTime as au}from"ulid";import{z as Hr}from"zod";var du=Hr.object({userId:Hr.string().min(1).default("unknown"),userName:Hr.string().min(1).default("unknown")}),cu=e=>{let[t,n]=Vr.basename(e,".jsonl").split("."),o=du.safeParse({userId:t,userName:n});return o.success?l("Parsed event file actor",o.data):a(`Invalid event file name ${Vr.basename(e)}: ${o.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},lu=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])},uu=(e,t)=>t in e,mu=({id:e,action:t,payload:n,userId:o,userName:r})=>({id:e,action:t,payload:n,userId:o,userName:r}),pu=e=>{let{userId:t,userName:n,...o}=e,r=lu(o);if(d(r))return a(r.message);let s=r.value,i=e.id?.[0];return i?uu(o,s)?l("Decoded persisted event",mu({id:i,action:s,payload:o[s],userId:t,userName:n})):a(`Persisted event is missing payload for action: ${s}`):a("Persisted event is missing id")},Gr=e=>{let t=[];for(let n of e){let o=pu(n);if(d(o))return a(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${o.message}`);t.push(o.value)}return l("Decoded reconstructed events",t)},gu=e=>{if(!No.existsSync(e))return l("Event file missing",[]);let t=cu(e);if(d(t))return a(t.message);let n=No.readFileSync(e,"utf8"),o=[];for(let r of n.split(`
41
- `)){let s=r.trim();if(!s)continue;let i;try{i=JSON.parse(s)}catch{return a(`Failed to parse event JSON from ${e}: ${s}`)}let c=zr(i);if(d(c))return a(`${c.message} in ${e}: ${s}`);o.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return l("Parsed persisted events file",o)};function Kr(e){let t=In(e);if(!No.existsSync(t))return l("No events found",[]);let n=No.readdirSync(t).filter(r=>r.endsWith(".jsonl")).map(r=>Vr.join(t,r)),o=[];for(let r of n){let s=gu(r);if(d(s))return a(s.message);o.push(...s.value)}return l("All events loaded",fu(o))}function at(e){let t=Kr(e);return d(t)?a(t.message):Gr(t.value)}function Wi(e,t){let n=Kr(e);if(d(n))return a(n.message);let{appliedEvents:o,unappliedEvents:r}=vu(n.value,t),s=Gr(o);if(d(s))return a(s.message);let i=Gr(r);return d(i)?a(i.message):l("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:i.value})}function _i(e=process.cwd()){let t=Kr(e);return d(t)?a(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var fu=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],v=m.id[1]??null;t.set(p,m);let C=n.get(v)??[];C.push(m),n.set(v,C)}for(let m of n.values())m.sort((p,v)=>p.id[0].localeCompare(v.id[0]));let o=[],r=new Set,s=m=>{let p=m.id[0];if(r.has(p))return;o.push(m),r.add(p);let v=n.get(p)??[];for(let C of v)s(C)},i=n.get(null)??[];for(let m of i)s(m);let c=e.filter(m=>{let p=m.id[0],v=m.id[1]??null;return!r.has(p)&&v!==null&&!t.has(v)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of c)s(m);let u=e.filter(m=>!r.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)s(m);return o},vu=(e,t)=>{let n=new Set,o=[],r=[];for(let s of e){let i=s.id[0],c=s.id[1],u=!1;try{u=au(i)<t}catch{u=!1}!u||c&&n.has(c)?(n.add(i),r.push(s)):o.push(s)}return{appliedEvents:o,unappliedEvents:r}};var ji=e=>({action:e.action,payload:e.payload});var Gi=1,Hi=Iu(),bu=kn.tuple([kn.string().min(1),kn.string().min(1).nullable()]),Cu=kn.looseObject({v:kn.literal(Gi),id:bu}),zr=e=>{let t=Cu.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(", ")}`)},Vi=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Nu=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Su=e=>e.trim().length>0&&e.length<=80,X=()=>{let{userName:e,userId:t}=_();return e?t?Nu(t)?Su(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")},Vt=({userId:e,userName:t})=>`${Vi(e)}.${Vi(t)}.jsonl`,Eu=(e,{userId:t,userName:n})=>{let o=Vt({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(o))return a(`Invalid event log file name: ${o}`);let s=xu.join(In(e),o);return l("Successfully resolved event log path",s)},Ru=(e,t)=>{let n={[e.action]:e.payload,v:Gi,id:t};return zr(n)};function So({event:e,rootDir:t}){try{let n=Gs(t);if(d(n))return n;let o=Eu(t,{userId:e.userId,userName:e.userName});if(d(o))return o;let r=_i(t);if(d(r))return a(r.message);let s=r.value?Hi(Math.max(Date.now(),hu(r.value)+1)):Hi(),i=Ru(ji(e),[s,r.value]);return d(i)?a(i.message):(yu.appendFileSync(o.value,`${JSON.stringify(i.value)}
42
- `,"utf8"),l("Event persisted",{path:o.value,entry:i.value}))}catch(n){let o=n instanceof Error?n.message:"Unknown persist error";return a(`Failed to persist event: ${o}`)}}function Ki(e,t){let n=Pn(e);if(n.status!==xt.Success)return n;let o=So({event:e,rootDir:t});return d(o)?o:n}function F(e,t){if(e.length===0||!e[0])return a("No events provided");let n=Au(e[0],t);if(d(n))return n;let o=e.map(s=>Ki(s,t)),r=o.filter(d);return r.length>0?a("Materialize and persist failed: "+r.map(s=>s.message).join(", ")):l("Materialization succeeded",o.map(s=>s.value))}var Au=(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:Tu(),action:"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName},o=Ki(n,t);return d(o)?a(o.message):l("Contributor created",void 0)};var zi=e=>Eo(j(e),{at:"end"}),Eo=(e,t={at:"end"})=>{let n=o=>d(o)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(Ce(void 0,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Ce(void 0,o.rank)):a("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Ce(o.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let o=qi(e,t.sibling);if(o<0)return a("Sibling not found");let r=o>0?e[o-1]:void 0,s=e[o];return s?n(Ce(r?.rank,s.rank)):a("Sibling not found")}case"after":{let o=qi(e,t.sibling);if(o<0)return a("Sibling not found");let r=e[o],s=o<e.length-1?e[o+1]:void 0;return r?n(Ce(r.rank,s?.rank)):a("Sibling not found")}}},j=e=>Object.values(g().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),qi=(e,t)=>e.findIndex(n=>n.id===t),Yi=(e,t,n={at:"end"})=>Eo(j(t).filter(o=>o.id!==e),n),Gt=(e,t,n,o,r)=>{let s=Yi(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return l("Resolved rank",s.value.rank);let i=Br(e,o);if(d(i))return i;let c=F([i.value],r);if(d(c))return c;let u=Yi(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)},cn=(e,t,n)=>{let o=zi(e);if(d(o))return o;if(!o.value.needsRebalance)return l("Resolved rank",o.value.rank);let r=Br(e,t);if(d(r))return r;let s=F([r.value],n);if(d(s))return s;let i=zi(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),o=W(t.id),r=o[n];r&&(t.context==="FIELD"&&o.length===0||r.context==="COMMENT"||r.context==="TEXT"||T.navigate({contextNode:r,selectedIndex:W(r.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 o=W(n.id),r=o.findIndex(({id:i})=>i===e.id),s=o.length===0?-1:r>=0?r:0;T.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Xi(1),navigateToPreviousItem:()=>Xi(-1),navigateToNextContainer:()=>Ji(1),navigateToPreviousContainer:()=>Ji(-1),navigate:({contextNode:e,selectedIndex:t})=>{N({contextNodeId:e.id,selectedIndex:t})}},Xi=e=>{let{selectedIndex:t,contextNode:n}=g(),o=W(n.id).length;if(o===0)return;let s=(Math.max(0,t)+e+o)%o;T.navigate({selectedIndex:s,contextNode:n})},Ji=e=>{let{contextNode:t,nodes:n,selectedIndex:o}=g();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let r=n[t.parentNodeId];if(!r)return;let s=W(r.id),i=s.findIndex(C=>C.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let u=W(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,o),m),v=u.length?p:-1;T.navigate({contextNode:c,selectedIndex:v})};var Zi=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),ea=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=g();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},wu=e=>{let t=g().nodes[e];return!!t&&!t.isDeleted&&Ge(t)&&t.childRenderAxis==="vertical"},Ro=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o||o.isDeleted)return!1;let r=j(o.id);return T.navigate({contextNode:o,selectedIndex:Zi(t,r.length)}),!0},ta=e=>{let{nodes:t}=g(),n=t[e];if(!n||n.isDeleted)return!1;let o=n.parentNodeId;if(!o)return Ro(n.id,0);let r=t[o];if(!r||r.isDeleted)return!1;let i=j(r.id).findIndex(c=>c.id===n.id);return i>=0?(T.navigate({contextNode:r,selectedIndex:i}),!0):ta(r.id)},Qi=e=>{let{nodes:t}=g(),n=e,o=new Set;for(;n&&!o.has(n);){if(o.add(n),ta(n))return!0;n=t[n]?.parentNodeId}return!1},Mu=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},na=e=>{let{nodes:t,rootNodeId:n}=g();if(wu(e.contextNodeId)&&Ro(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Mu(e.selectedNodeId)&&e.selectedNodeId&&Qi(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(Qi(e.contextNodeId))return l("Restored navigation to previous container or ancestor",null);let o=t[n];if(!o||o.isDeleted)return a("Unable to restore navigation");let r=j(o.id);return T.navigate({contextNode:o,selectedIndex:Zi(e.selectedIndex,r.length)}),l("Restored navigation to root",null)};import{monotonicFactory as Pu,ulid as dt}from"ulid";var Dn=Pu();function Lu(){let e=ze();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[o]=W(n.id),[r]=o?W(o.id):[];if(r){let s=t.renderedChildrenIndex?.[r.id]??[];return l("Resolved boot nav target",{contextNode:r,selectedIndex:s.length>0?0:-1})}else return o?l("Resolved boot nav target",{contextNode:o,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 ku(){let e=Lu();return d(e)?e:T.navigate(e.value)}function oa({userId:e,userName:t}){let n=Dn(),o=Dn(),r=Dn(),s=Dn(),i=Dn(),c=Ce(void 0,void 0);if(d(c))return c;let u=Ce(void 0,void 0);if(d(u))return u;let m=Ce(u.value,void 0);if(d(m))return m;let p=Ce(void 0,void 0);if(d(p))return p;let v=Ce(p.value,void 0);if(d(v))return v;let C=Ce(v.value,void 0);if(d(C))return C;let E=Ce(void 0,void 0);return d(E)?E:l("Created default events",[{id:dt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:dt(),userId:e,userName:t,action:"add.board",payload:{id:o,name:"Default",parent:n,rank:u.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:r,name:"Todo",parent:o,rank:p.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:o,rank:v.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"Done",parent:o,rank:C.value}},{id:dt(),userId:e,userName:t,action:"add.board",payload:{id:Co,name:"Closed",parent:n,rank:m.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:de,name:"Closed",parent:Co,rank:E.value}},{id:dt(),userId:e,userName:t,action:"lock.node",payload:{id:Co}},{id:dt(),userId:e,userName:t,action:"lock.node",payload:{id:de}}])}function Kt(e){if(!e.length){let o=Y.workspace("temporary-uninitialized-workspace","Workspace","a0"),r=Ln(o);return d(r)?r:(N({hasProjectDefinition:!1,mode:f.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!e.some(o=>o.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=Ht(e).filter(d);return n.length>0?a(`Materializing failed:
27
+ ${c.message}`):l("Created local state branch from remote",!0)}return Br({repoRoot:e,stateBranchName:t})},yl=async({repoRoot:e,branch:t})=>{let n=await B({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let o=n.value.stdout.split(`
28
+ `),r=null;for(let s of o){if(s.startsWith("worktree ")){r=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&r)return l("Found worktree for branch",r)}return l("No worktree found for branch",null)},hl=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=Sn(Nn.dirname(t));if(d(o))return a(`Failed to create state branch worktree
29
+ `+o.message);rn.existsSync(t)&&!rn.existsSync(Nn.join(t,".git"))&&(te.info("Removing broken state branch worktree path"),ci(t)),te.info("Creating state branch worktree");let r=await ne.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(r)?a(`Failed to create state branch worktree
30
+ ${r.message}`):l("Created state branch worktree",!0)},Wt=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await yl({repoRoot:e,branch:n});if(d(o))return a(o.message);let r=Nn.resolve(t),s=o.value?Nn.resolve(o.value):null;if(s&&s===r&&rn.existsSync(s))return l("State branch already checked out in expected worktree",!1);if(s&&s!==r){te.info("Moving state branch worktree to expected location");let u=await ne.worktreeRemove({cwd:e,worktreeRoot:s});if(d(u))return a(`Failed to remove existing state branch worktree
31
+ ${u.message}`)}if(s&&!rn.existsSync(s)){te.info("Pruning stale state branch worktree");let u=await ne.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
32
+ ${u.message}`)}let i=await ti({repoRoot:e,worktreeRoot:t});if(d(i))return a(i.message);let c=rn.existsSync(t);if(i.value&&c)return l("State branch worktree already exists",!1);if(i.value&&!c){te.info("Pruning missing registered state branch worktree");let u=await ne.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
33
+ ${u.message}`)}return hl({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},xl=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await uo(e);if(d(n))return a(n.message);if(n.value===t)return l("State branch already checked out",!1);(await Ge({cwd:e,args:["rebase","--abort"]})).exitCode===0&&te.info("Aborted stale state branch rebase");let r=await ne.checkout({cwd:e,branch:t});return d(r)?a(`Failed to checkout ${t}
34
+ ${r.message}`):l("Checked out state branch",!0)},Il=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Lr(t);if(d(n))return a(n.message);if(n.value)return l("State branch upstream already configured",!1);let o=await Pr({repoRoot:t});if(d(o))return a(o.message);if(!o.value)return l("No remote available for state branch upstream",!1);let r=nn(e);if(d(r))return r;let s=r.value,i=await co({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);te.info(`Configuring ${s} upstream`);let c=await ne.fetch({cwd:t,remote:De,branch:s});if(d(c))return a(`Failed to fetch ${s}
35
+ ${c.message}`);let u=await ne.setUpstream({cwd:t,branch:s,upstream:`${De}/${s}`});return d(u)?a(`Failed to set state branch upstream
36
+ ${u.message}`):l("Configured state branch upstream",!0)},go=async({stateBranchRoot:e,eventFileName:t})=>{let n=Fr(t),o=Nn.join(e,n);if(!rn.existsSync(o))return l("No event file to stage",void 0);let r=await ne.stage({cwd:e,pathspec:[n]});return d(r)?a(`Failed to stage state branch event file
37
+ ${r.message}`):l("Staged state branch event file",void 0)},gi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await fl(e);return d(n)?a(`Create state branch sync commit failed
38
+ `+n.message):on({cwd:t,message:n.value})},En=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Lr(t);if(d(n))return a(n.message);let o=nn(e);if(d(o))return o;let r=o.value,s=n.value?await ne.push({cwd:t}):await ne.push({cwd:t,remote:De,branch:r,setUpstream:!0});return d(s)?a(`Failed during state branch push
39
+ ${s.message}`):l("Pushed state branch",!0)},fi=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let o=!1,r=nn(e);if(d(r))return r;let s=r.value,i=[po(),await vl({repoRoot:e,stateBranchName:s}),await Wt({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await xl({stateBranchRoot:t,stateBranchName:s}),await ui(t),n?await Il({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(d(c))return a(c.message);o=o||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",o)};import{WebSocket as bl}from"ws";var fo=new Set,vi=e=>{fo.add(e),e.on("close",()=>{fo.delete(e)}),e.on("error",()=>{fo.delete(e)})},$t=e=>{let t=JSON.stringify(e);for(let n of fo)n.readyState===bl.OPEN&&n.send(t)};import{useSyncExternalStore as jp}from"react";var w={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Ur(e){return e.context===w.WORKSPACE}function T(e){return e.context===w.TICKET}function bt(e){return e.context===w.TEXT}function Ke(e){return e.context===w.FIELD}function Rn(e){return e.context===w.FIELD_LIST}var Ct=e=>e.context===w.SWIMLANE,vo=e=>e.context===w.BOARD,Tn=e=>e.context===w.COMMENT;var f={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var yi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",hi=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",xi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Ii=(e,t)=>{if(hi(e,e.sequence))return x.MoveCursorLeftOfWord;if(xi(e,e.sequence))return x.MoveCursorRightOfWord;if(yi(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}},bi=(e,t)=>{if(hi(e,e.sequence))return x.MoveCursorLeftOfWord;if(xi(e,e.sequence))return x.MoveCursorRightOfWord;if(yi(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 yo(e,t){let n=Math.min(e.length,t.length),o=0;for(;o<n&&e[o]===t[o];)o++;return o}var ho=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",St=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),Ci=e=>e.charAt(0).toUpperCase()+e.slice(1);var Si=e=>{let t=new Map;for(let n of e)for(let o=1;o<=n.length;o++){let r=n.slice(0,o),s=t.get(r);s?s.push(n):t.set(r,[n])}return t},Ni=(e,t)=>t?e.get(t)??[]:[];var Ei=new WeakMap,Cl=e=>{let t=Ei.get(e);return t||(t=Si(e),Ei.set(e,t)),t};var Ri=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let o=t.toLowerCase();return Ni(Cl(e),o).filter(s=>yo(o,s)>=n)};var Sl={hint:"",hints:[],overlap:0,remainder:""},Ti=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},o)=>{if(n||e==="")return Sl;let r=Ri({wordList:o,inputToMatch:e,overlapThreshold:1});return Nl(t,r)},Nl=(e,t)=>{let n=t[0]??"",o=yo(e.toLowerCase(),n.toLowerCase()),[r,s]=n.split(":"),i=o<(r??"").length,c=!!s,p=(c&&i?r:n)+(c&&i?":":" "),v=p.slice(o);return{hint:p,hints:t,overlap:o,remainder:v}};import{useSyncExternalStore as El}from"react";var An={logLevel:"info",autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Or=new Set,Rl=()=>{for(let e of Or)e()},_=()=>An,Ai=()=>El(e=>(Or.add(e),()=>{Or.delete(e)}),()=>An),Fe=e=>(An={...An,...e},Rl(),An);import{ulid as wl}from"ulid";var sn=24n,Tl=sn*4n,qe=(1n<<Tl)-1n,Al=/^[0-9a-f]+$/;function wi(e){return!e||!Al.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function Be(e,t=sn){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 Ce(e,t){if(!e&&!t)return Be(qe/2n,sn);let n=e?wi(e):l("Resolved lower bound",0n);if(d(n))return n;let o=t?wi(t):l("Resolved upper bound",qe);if(d(o))return o;let r=n.value,s=o.value;if(s<=r)return Be(qe/2n,sn);let i=(r+s)/2n;return i===r||i===s?a("No rank space available between neighbors"):Be(i,sn)}function Mi(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let o=0;o<e;o++){let r=qe*BigInt(o+1)/(t+1n),s=Be(r,sn);if(d(s))return s;n.push(s.value)}return l("Resolved evenly spaced ranks",n)}var Wr=(e,t)=>{let n=H(e),o=Mi(n.length);if(d(o))return o;let r={};for(let s=0;s<n.length;s++){let i=n[s],c=o.value[s];if(!i||!c)return a("Unable to assign rebalance rank");r[i.id]=c}return l("Created rebalance event",{id:wl(),action:"rebalance.children",payload:{parent:e,ranks:r},...t})};import{ulid as Pu}from"ulid";var it=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o)return a("Node not found");if(o.context===t)return l("Resolved ancestor node",o);let r=o.parentNodeId?n[o.parentNodeId]:void 0;for(;r;){if(r.context===t)return l("Resolved ancestor node",r);r=r.parentNodeId?n[r.parentNodeId]:void 0}return a(`No ancestor found for context: ${t}`)},$r=(e,t)=>{let{nodes:n}=g(),o=n[e];for(;o?.parentNodeId;){if(o.parentNodeId===t)return!0;o=n[o.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"}[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 o={...n,userId:t},r=ue(s=>({...s,contributors:{...s.contributors,[e]:o}}));return d(r)?a("Unable to link contributor to user"):l("Linked contributor to user",o)},deleteNode(e){ue(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create comment, missing issue");if(!T(t))return a("Can only comment on issues");let n=ue(o=>({...o,comments:{...o.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 o=this.getNode(n.issue);if(!o)return a("Unable to edit comment, missing issue");if(!T(o))return a("Can only edit issue comments");let r={...n,md:t,deleted:!1},s=ue(i=>({...i,comments:{...i.comments??{},[e]:r}}));return d(s)?a("Unable to edit comment"):l("Edited comment",r)},deleteComment(e){let t=this.getComment(e);if(!t)return a("Unable to delete comment, missing comment");let n={...t,deleted:!0},o=ue(r=>({...r,comments:{...r.comments??{},[e]:n}}));return d(o)?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)},editValue(e,t){let{nodes:n}=g(),o=n[e];if(!o)return a("Edit target node not found");let r=_t(o,"edit");if(r)return r;let s={...o,props:{...o.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 o=_t(n,"rename");if(o)return o;let r={...n,title:t};return this.updateNode(r),l("Renamed node",r)},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 H(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:o}=g(),r=this.getNode(e),s=this.getNode(t);if(!r)return a("Node not found");if(!s)return a("Target parent not found");if(o===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let i=_t(r,"move");if(i)return i;if($r(t,e))return a("Cannot move node into its own descendant");let c={...r,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:o}=g(),r=this.getNode(e);if(!r)return a("Node not found");if(o===e)return a("Cannot delete root node");let s=new Set,i=u=>{let m=t[u];if(!(!m||s.has(u))){s.add(u);for(let p of H(m.id))i(p.id)}};i(e);let c={...structuredClone(t)};for(let u of s){if(!c[u])return a("Unable to locate node to delete");c[u]={...c[u],isDeleted:!0}}return n?(C({nodes:c}),l("Successfully tomb stoned",r)):a("Unable to delete undefined")},createContributor(e){let t=ue(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),o=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!o)return a("Unable to assign contributor, missing target");let r=_t(o,"edit");if(r)return r;if(!T(o))return a("Target is not an issue");let s=o.props.assignees??[];if(s.includes(t))return a("Contributor already assigned");let i={...o,props:{...o.props,assignees:[...s,t]}};return this.updateNode(i),l("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!o)return a("Unable to unassign, missing target");let r=_t(o,"edit");if(r)return r;if(!T(o))return a("Target is not an issue");let s=o.props.assignees??[];if(!s.includes(t))return l("Issue is not assigned to that contributor",{assignee:t});let i={...o,props:{...o.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(i),l("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!o)return a("Unable to add tag, missing target");let r=_t(o,"edit");if(r)return r;if(!T(o))return a("Target is not an issue");let s=o.props.tags??[];if(s.includes(t))return a("Tag already assigned");let i={...o,props:{...o.props,tags:[...s,t]}};return this.updateNode(i),l("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!o)return a("Unable to remove tag, missing target");let r=_t(o,"edit");if(r)return r;if(!T(o))return a("Target is not an issue");let s=o.props.tags??[];if(!s.includes(t))return l("Issue is not tagged with that tag",{tag:t});let i={...o,props:{...o.props,tags:s.filter(c=>c!==t)}};return this.updateNode(i),l("Tag removed",{tag:t})},createTag(e){let t=ue(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):l("Tag created",e)},createNode(e){let t=ue(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},o=ue(r=>({...r,nodes:{...r.nodes,[e]:n}}));return d(o)?a(o.message):l("Locked node",n)},updateNode(e){let t=ue(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 H(e)}};var oe={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments"};var Y={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:w.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,o,r=!1)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:o,props:r={},childRenderAxis:s="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:w.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),fieldList:({id:e,name:t,parentNodeId:n,rank:o,childRenderAxis:r="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.FIELD_LIST,childRenderAxis:r,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!0,isVirtual:s=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:r,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:o,props:r={},readonly:s=!0,isVirtual:i=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:w.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};import jt from"chalk";import Bi from"string-width";import{decodeTime as Ul}from"ulid";import dn from"chalk";var me={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:me.cyan,accent2:me.magenta,primary:me.white,secondary:me.grayDark,secondary2:me.grayLight,gray:me.gray,green:me.green,yellow:me.yellow,red:me.red};var b={red:me.red,yellow:me.yellow,green:me.green,blue:me.blue,magenta:me.magenta,cyan:me.cyan},an={urgent:b.red,critical:b.red,important:b.red,blocker:b.red,asap:b.red,immediate:b.red,fail:b.red,failure:b.red,broken:b.red,bug:b.red,error:b.red,incident:b.red,outage:b.red,production:b.red,crash:b.red,security:b.red,warning:b.yellow,warn:b.yellow,risky:b.yellow,risk:b.yellow,attention:b.yellow,pending:b.yellow,review:b.yellow,"needs-review":b.yellow,qa:b.yellow,testing:b.yellow,test:b.yellow,validate:b.yellow,verification:b.yellow,staging:b.yellow,check:b.yellow,"follow-up":b.yellow,followup:b.yellow,waiting:b.yellow,blocked:b.yellow,hold:b.yellow,done:b.green,complete:b.green,completed:b.green,success:b.green,ok:b.green,stable:b.green,resolved:b.green,fixed:b.green,closed:b.green,merged:b.green,released:b.green,deployed:b.green,approved:b.green,verified:b.green,working:b.green,healthy:b.green,pass:b.green,passing:b.green,info:b.blue,information:b.blue,note:b.blue,docs:b.blue,documentation:b.blue,doc:b.blue,guide:b.blue,help:b.blue,explanation:b.blue,detail:b.blue,details:b.blue,context:b.blue,design:b.blue,discussion:b.blue,proposal:b.blue,idea:b.blue,feature:b.magenta,enhancement:b.magenta,improvement:b.magenta,refactor:b.magenta,refactoring:b.magenta,cleanup:b.magenta,optimize:b.magenta,optimization:b.magenta,perf:b.magenta,performance:b.magenta,upgrade:b.magenta,migration:b.magenta,modernize:b.magenta,debt:b.magenta,todo:b.cyan,next:b.cyan,planned:b.cyan,plan:b.cyan,future:b.cyan,backlog:b.cyan,investigate:b.cyan,explore:b.cyan,prototype:b.cyan};var jr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Pi=(e,t,n)=>Math.max(t,Math.min(n,e)),_r=(e,t,n)=>e+(t-e)*n,Li=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Ml=e=>e.toLowerCase().trim(),Pl=(e,t,n)=>{let o=t/100,r=n/100,s=(1-Math.abs(2*r-1))*o,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 v=r-s/2;return[Math.round((u+v)*255),Math.round((m+v)*255),Math.round((p+v)*255)]},Ll=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var kl=(e,t,n)=>{let o=Pi(n,0,1);return[Math.round(_r(e[0],t[0],o)),Math.round(_r(e[1],t[1],o)),Math.round(_r(e[2],t[2],o))]};var Dl=(e,t,n)=>kl(e,t,n),wn=e=>{let n=Li(e)%360,o=Pl(n,jr.stringColor.saturation,jr.stringColor.lightness);return Ll(o)},re=(e,t=an)=>{let n=Ml(e);return n&&t[n]?t[n]:wn(n)};var Fl=e=>{let t=jr.gradient.stops,n=Pi(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let o=t.length-1,r=n*o,s=Math.min(Math.floor(r),o-1),i=r-s;return Dl(t[s],t[s+1],i)},xo=e=>Li(e.toLowerCase().trim())/4294967295,ki=e=>{let t=xo(e);return Fl(t)},Bl=e=>{let[t,n,o]=ki(e);return{normal:r=>dn.bgRgb(t,n,o).black(r),cursor:r=>dn.bgRgb(t,n,o).white.bold(r)}},Hr=e=>{let[t,n,o]=ki(e);return{fg:r=>dn.rgb(t,n,o)(r),fgCursor:r=>dn.rgb(t,n,o).inverse(r),bg:r=>dn.bgRgb(t,n,o).black(r),bgCursor:r=>dn.bgRgb(t,n,o).white.bold(r)}},Io=e=>Bl(e).normal(` ${e} `);import{decodeTime as Di}from"ulid";var bo=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:o,ms:r}of n){let s=Math.floor(t/r);if(s>=1)return`${s}${o} ago`}return"just now"},Fi=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())}`},Co=e=>{try{return l("Decoded date",new Date(Di(e)))}catch(t){return a("Decoding failed + "+t.message)}},Vr=e=>{if(!e?.id)return null;try{return Di(e.id)}catch{return null}};var Ol=(e,t)=>e+" ".repeat(Math.max(0,t-Bi(e))),Wl=(e,t)=>" ".repeat(Math.max(0,t-Bi(e)))+e,$l=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"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),_l=(e,t)=>t?e<t?"up":e>t?"down":null:null,jl=(e,t)=>{let n=I.getNode(e.payload.parent),o=n?jt.dim.bgBlack(` ${n.title} `):"unknown",r=t.at(-1);if(r&&"parent"in r&&"rank"in r&&r.parent===e.payload.parent){let s=_l(e.payload.rank,r.rank);if(s)return`Moved ${s} in ${o}`}return`Moved issue to ${o}`},Hl=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?jt.bgHex(re(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?jt.bgHex(re(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?jt.hex(re(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?jt.hex(re(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:""}"`;default:return""}},Vl=e=>{let t=bo(Ul(e));return jt.gray(Wl(t,8))},Gl=12,zl=e=>Ol(`${e}`,Gl),Ui=(e,t)=>{let n=Vl(e.id),o=zl(e.userName),r=jt.dim("\u203A"),s=e.action==="move.node"?jl(e,t):[$l(e.action),Hl(e)].filter(Boolean).join(" ");return`${o} ${n} ${r} ${s}`};import{createHash as Kl}from"node:crypto";var ql="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Yl=e=>{let t=Kl("sha256").update(e).digest(),n=0n;for(let r=0;r<16;r++)n=n<<8n|BigInt(t[r]);let o="";for(let r=0;r<26;r++){let s=BigInt((25-r)*5);o+=ql[Number(n>>s&31n)]}return o},Se=(e,t)=>Yl(`${e}:virtual:${t}`);var Xl=e=>Se(e,"comments"),Jl=e=>Se(e,"description"),Ql=e=>Se(e,"assignees"),Zl=e=>Se(e,"tags"),eu=e=>Se(e,"history"),Gr=({id:e,name:t,parentNodeId:n,rank:o,value:r,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=I.getNode(e);if(!c){let p=I.createNode({...Y.field({id:e,name:t,parentNodeId:n,rank:o,props:{value:r},isVirtual:!0}),readonly:s,childRenderAxis:i});return d(p)?p:l("Virtual field created",void 0)}if(!Ke(c))return a(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==o||c.props.value!==r||c.readonly!==s||c.childRenderAxis!==i))return l("Virtual field unchanged",void 0);let m=I.updateNode({...c,title:t,parentNodeId:n,rank:o,props:{...c.props,value:r},readonly:s,childRenderAxis:i});return d(m)?m:l("Virtual field updated",void 0)},Oi=({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!1,childRenderAxis:s="horizontal"})=>{let i=I.getNode(e);if(!i){let m=I.createNode({...Y.fieldList({id:e,name:t,parentNodeId:n,rank:o,isVirtual:!0}),readonly:r,childRenderAxis:s});return d(m)?m:l("Virtual field list created",void 0)}if(!Rn(i))return a(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==o||i.readonly!==r||i.childRenderAxis!==s))return l("Virtual field list unchanged",void 0);let u=I.updateNode({...i,title:t,parentNodeId:n,rank:o,readonly:r,childRenderAxis:s});return d(u)?u:l("Virtual field list updated",void 0)},Wi=e=>{let t=Be(qe/4n),n=Be(qe/2n),o=Be(qe*3n/4n),r=Be(qe*7n/8n),s=Be(qe*13n/16n);if(d(t))return t;if(d(n))return n;if(d(o))return o;if(d(r))return r;if(d(s))return s;let i=Gr({id:Jl(e.id),name:oe.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(i))return i;let c=Oi({id:Ql(e.id),name:oe.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(c))return c;let u=Oi({id:Zl(e.id),name:oe.TAGS,parentNodeId:e.id,rank:o.value,readonly:!0});if(d(u))return u;let m=Gr({id:Xl(e.id),name:oe.COMMENTS,parentNodeId:e.id,rank:r.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(m))return m;let p=Gr({id:eu(e.id),name:oe.HISTORY,parentNodeId:e.id,rank:s.value,value:tu(e),readonly:!0,childRenderAxis:"vertical"});return d(p)?p:l("Ticket virtual nodes materialized",void 0)},tu=e=>{let t=[...e.log].reverse(),n=new Map;for(let o of t){let r=n.get(o.action)??[];r.push(o.payload),n.set(o.action,r)}return t.map(o=>Ui(o,n.get(o.action)??[])).join(`
40
+ `)};var nu=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ie,So]=nu;var L=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),$i=e=>{let t=I.getNode(e);if(!t||!T(t)||t.isDeleted)return null;let n=Wi(t);return d(n)?n:null},ou=e=>{for(let t of e){let n=$i(t);if(n)return n;let o=g().nodes[t]?.parentNodeId;if(!o)continue;let r=$i(o);if(r)return r}return null},ru=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},su=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},iu=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":return[e.payload.issue];case"delete.node":case"edit.description":return su(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[]}},au=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},du=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?L("Invalid user ID format",e):l("Valid user",null)},cu=(e,t)=>{let n=du(e);if(d(n))return n;let o=[...new Set(iu(e))];t||(o.forEach(s=>ru(s,e)),au(e));let r=ou(o);return r||null},lu={"init.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=Y.workspace(t,n,o),s=Pn(r);if(d(s))return L(s.message,e);let i=I.createNode(r);return d(i)?L(i.message??"Failed to initialize workspace",e):Ur(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:o}=e.payload,r=I.createNode(Y.workspace(t,n,o));return d(r)?L(r.message??"Failed to add workspace",e):Ur(r.value)?l("Added workspace",{action:e.action,result:r.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=I.createNode(Y.board(t,n,o,r));return d(s)?L(s.message??"Unable to create board",e):vo(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:o,rank:r}=e.payload,s=I.createNode(Y.swimlane(t,n,o,r));return d(s)?L(s.message??"Unable to create swimlane",e):Ct(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:o,rank:r}=e.payload,s=I.createNode(Y.ticket(t,n,o,r));return d(s)?L(s.message??"Unable to create issue",e):T(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:o,val:r,rank:s}=e.payload,i=I.createNode(Y.field({id:t,name:n,parentNodeId:o,rank:s,props:{value:r},childRenderAxis:n.includes(oe.DESCRIPTION)?"vertical":"horizontal"}));return d(i)?L(i.message??`Unable to create field: ${n}`,e):Ke(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 L(`Unable to locate node with id ${t}`,e);let r=I.renameNode(t,n);return d(r)?L(r.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:r.value})},"delete.node":e=>{let{id:t}=e.payload,n=I.tombstoneNode(t);return d(n)?L(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,o=I.createTag({id:t,name:n});return d(o)?L(o.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:o.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,o=I.createContributor({id:t,name:n});return d(o)?L(o.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:o.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=I.tag(t,n);return d(o)?L(o.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,o=I.untag(t,n);return d(o)?L(o.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,o=I.assign(t,n);return d(o)?L(o.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,o=I.unassign(t,n);return d(o)?L(o.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(r)?L(r.message??"Failed to move node",e):l("Moved node",{action:e.action,result:r.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,o=I.editValue(t,n);return d(o)?L(o.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:o.value})},"close.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.getNode(t);if(!r)return L("Unable to locate issue",e);if(!T(r))return L("Can only close issues",e);let s=I.getNode(ie);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=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(i)?L(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:o}=e.payload,r=I.getNode(t);if(!r)return L("Unable to locate issue",e);if(!T(r))return L("Can only reopen issues",e);let s=I.getNode(ie);if(!s)return L("Unable to locate closed swimlane",e);if(n===s.id)return L("Cannot reopen issue into closed swimlane",e);if(!I.getNode(n))return L("Reopen parent no longer exists",e);let c=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(c)?L(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)?L(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[o,r]of Object.entries(n)){let s=I.getNode(o);if(!s)return L(`Unable to locate node ${o}`,e);if(s.parentNodeId!==t)return L(`Node ${o} is not child of ${t}`,e);let i=I.updateNode({...s,rank:r});if(d(i))return L(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:o,md:r}=e.payload,s=I.createComment({id:t,issue:n,authorId:o,authorName:I.getContributor(o)?.name??"Unknown",md:r,deleted:!1});return d(s)?L(s.message??"Unable to add comment",e):l("Comment added",{action:e.action,result:{id:t,issue:n,author:o,md:r}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:o}=e.payload,r=I.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 s=I.editComment(t,o);return d(s)?L(s.message??"Unable to edit comment",e):l("Comment edited",{action:e.action,result:{id:t,issue:n,md:o}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,o=I.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 r=I.deleteComment(t);return d(r)?L(r.message??"Unable to delete comment",e):l("Comment 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)?L(n.message??"Unable to link contributor",e):l("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function Mn(e,t=!1){let n=lu[e.action](e);if(d(n))return n;let o=cu(e,t);return o||n}var Ht=e=>e.map(t=>Mn(t));import bu from"node:fs";import Cu from"node:path";import{decodeTime as Su,monotonicFactory as Nu}from"ulid";import{z as Ln}from"zod";import No from"node:fs";import Kr from"node:path";import{decodeTime as uu}from"ulid";import{z as zr}from"zod";var mu=zr.object({userId:zr.string().min(1).default("unknown"),userName:zr.string().min(1).default("unknown")}),pu=e=>{let[t,n]=Kr.basename(e,".jsonl").split("."),o=mu.safeParse({userId:t,userName:n});return o.success?l("Parsed event file actor",o.data):a(`Invalid event file name ${Kr.basename(e)}: ${o.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},gu=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])},fu=(e,t)=>t in e,vu=({id:e,action:t,payload:n,userId:o,userName:r})=>({id:e,action:t,payload:n,userId:o,userName:r}),yu=e=>{let{userId:t,userName:n,...o}=e,r=gu(o);if(d(r))return a(r.message);let s=r.value,i=e.id?.[0];return i?fu(o,s)?l("Decoded persisted event",vu({id:i,action:s,payload:o[s],userId:t,userName:n})):a(`Persisted event is missing payload for action: ${s}`):a("Persisted event is missing id")},qr=e=>{let t=[];for(let n of e){let o=yu(n);if(d(o))return a(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${o.message}`);t.push(o.value)}return l("Decoded reconstructed events",t)},hu=e=>{if(!No.existsSync(e))return l("Event file missing",[]);let t=pu(e);if(d(t))return a(t.message);let n=No.readFileSync(e,"utf8"),o=[];for(let r of n.split(`
41
+ `)){let s=r.trim();if(!s)continue;let i;try{i=JSON.parse(s)}catch{return a(`Failed to parse event JSON from ${e}: ${s}`)}let c=Xr(i);if(d(c))return a(`${c.message} in ${e}: ${s}`);o.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return l("Parsed persisted events file",o)};function Yr(e){let t=xn(e);if(!No.existsSync(t))return l("No events found",[]);let n=No.readdirSync(t).filter(r=>r.endsWith(".jsonl")).map(r=>Kr.join(t,r)),o=[];for(let r of n){let s=hu(r);if(d(s))return a(s.message);o.push(...s.value)}return l("All events loaded",xu(o))}function at(e){let t=Yr(e);return d(t)?a(t.message):qr(t.value)}function _i(e,t){let n=Yr(e);if(d(n))return a(n.message);let{appliedEvents:o,unappliedEvents:r}=Iu(n.value,t),s=qr(o);if(d(s))return a(s.message);let i=qr(r);return d(i)?a(i.message):l("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:i.value})}function ji(e=process.cwd()){let t=Yr(e);return d(t)?a(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var xu=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],v=m.id[1]??null;t.set(p,m);let S=n.get(v)??[];S.push(m),n.set(v,S)}for(let m of n.values())m.sort((p,v)=>p.id[0].localeCompare(v.id[0]));let o=[],r=new Set,s=m=>{let p=m.id[0];if(r.has(p))return;o.push(m),r.add(p);let v=n.get(p)??[];for(let S of v)s(S)},i=n.get(null)??[];for(let m of i)s(m);let c=e.filter(m=>{let p=m.id[0],v=m.id[1]??null;return!r.has(p)&&v!==null&&!t.has(v)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of c)s(m);let u=e.filter(m=>!r.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)s(m);return o},Iu=(e,t)=>{let n=new Set,o=[],r=[];for(let s of e){let i=s.id[0],c=s.id[1],u=!1;try{u=uu(i)<t}catch{u=!1}!u||c&&n.has(c)?(n.add(i),r.push(s)):o.push(s)}return{appliedEvents:o,unappliedEvents:r}};var Hi=e=>({action:e.action,payload:e.payload});var zi=1,Vi=Nu(),Eu=Ln.tuple([Ln.string().min(1),Ln.string().min(1).nullable()]),Ru=Ln.looseObject({v:Ln.literal(zi),id:Eu}),Xr=e=>{let t=Ru.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(", ")}`)},Gi=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Tu=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Au=e=>e.trim().length>0&&e.length<=80,X=()=>{let{userName:e,userId:t}=_();return e?t?Tu(t)?Au(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")},Vt=({userId:e,userName:t})=>`${Gi(e)}.${Gi(t)}.jsonl`,wu=(e,{userId:t,userName:n})=>{let o=Vt({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(o))return a(`Invalid event log file name: ${o}`);let s=Cu.join(xn(e),o);return l("Successfully resolved event log path",s)},Mu=(e,t)=>{let n={[e.action]:e.payload,v:zi,id:t};return Xr(n)};function Eo({event:e,rootDir:t}){try{let n=zs(t);if(d(n))return n;let o=wu(t,{userId:e.userId,userName:e.userName});if(d(o))return o;let r=ji(t);if(d(r))return a(r.message);let s=r.value?Vi(Math.max(Date.now(),Su(r.value)+1)):Vi(),i=Mu(Hi(e),[s,r.value]);return d(i)?a(i.message):(bu.appendFileSync(o.value,`${JSON.stringify(i.value)}
42
+ `,"utf8"),l("Event persisted",{path:o.value,entry:i.value}))}catch(n){let o=n instanceof Error?n.message:"Unknown persist error";return a(`Failed to persist event: ${o}`)}}function Ki(e,t){let n=Mn(e);if(n.status!==ht.Success)return n;let o=Eo({event:e,rootDir:t});return d(o)?o:n}function F(e,t){if(e.length===0||!e[0])return a("No events provided");let n=Lu(e[0],t);if(d(n))return n;let o=e.map(s=>Ki(s,t)),r=o.filter(d);return r.length>0?a("Materialize and persist failed: "+r.map(s=>s.message).join(", ")):l("Materialization succeeded",o.map(s=>s.value))}var Lu=(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:Pu(),action:"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName},o=Ki(n,t);return d(o)?a(o.message):l("Contributor created",void 0)};var qi=e=>Ro(H(e),{at:"end"}),Ro=(e,t={at:"end"})=>{let n=o=>d(o)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(Ce(void 0,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Ce(void 0,o.rank)):a("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Ce(o.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let o=Yi(e,t.sibling);if(o<0)return a("Sibling not found");let r=o>0?e[o-1]:void 0,s=e[o];return s?n(Ce(r?.rank,s.rank)):a("Sibling not found")}case"after":{let o=Yi(e,t.sibling);if(o<0)return a("Sibling not found");let r=e[o],s=o<e.length-1?e[o+1]:void 0;return r?n(Ce(r.rank,s?.rank)):a("Sibling not found")}}},H=e=>Object.values(g().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Yi=(e,t)=>e.findIndex(n=>n.id===t),Xi=(e,t,n={at:"end"})=>Ro(H(t).filter(o=>o.id!==e),n),Gt=(e,t,n,o,r)=>{let s=Xi(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return l("Resolved rank",s.value.rank);let i=Wr(e,o);if(d(i))return i;let c=F([i.value],r);if(d(c))return c;let u=Xi(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)},cn=(e,t,n)=>{let o=qi(e);if(d(o))return o;if(!o.value.needsRebalance)return l("Resolved rank",o.value.rank);let r=Wr(e,t);if(d(r))return r;let s=F([r.value],n);if(d(s))return s;let i=qi(e);return d(i)?i:i.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",i.value.rank)};var A={exit(){process.exit(0)},enterChildNode(){let e=g(),t=e.contextNode,n=Math.max(0,e.selectedIndex),o=$(t.id),r=o[n];r&&(t.context==="FIELD"&&o.length===0||r.context==="COMMENT"||r.context==="TEXT"||A.navigate({contextNode:r,selectedIndex:$(r.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 o=$(n.id),r=o.findIndex(({id:i})=>i===e.id),s=o.length===0?-1:r>=0?r:0;A.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Ji(1),navigateToPreviousItem:()=>Ji(-1),navigateToNextContainer:()=>Qi(1),navigateToPreviousContainer:()=>Qi(-1),navigate:({contextNode:e,selectedIndex:t})=>{C({contextNodeId:e.id,selectedIndex:t})}},Ji=e=>{let{selectedIndex:t,contextNode:n}=g(),o=$(n.id).length;if(o===0)return;let s=(Math.max(0,t)+e+o)%o;A.navigate({selectedIndex:s,contextNode:n})},Qi=e=>{let{contextNode:t,nodes:n,selectedIndex:o}=g();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let r=n[t.parentNodeId];if(!r)return;let s=$(r.id),i=s.findIndex(S=>S.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let u=$(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,o),m),v=u.length?p:-1;A.navigate({contextNode:c,selectedIndex:v})};var ea=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),ta=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=g();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},ku=e=>{let t=g().nodes[e];return!!t&&!t.isDeleted&&Ke(t)&&t.childRenderAxis==="vertical"},To=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o||o.isDeleted)return!1;let r=H(o.id);return A.navigate({contextNode:o,selectedIndex:ea(t,r.length)}),!0},na=e=>{let{nodes:t}=g(),n=t[e];if(!n||n.isDeleted)return!1;let o=n.parentNodeId;if(!o)return To(n.id,0);let r=t[o];if(!r||r.isDeleted)return!1;let i=H(r.id).findIndex(c=>c.id===n.id);return i>=0?(A.navigate({contextNode:r,selectedIndex:i}),!0):na(r.id)},Zi=e=>{let{nodes:t}=g(),n=e,o=new Set;for(;n&&!o.has(n);){if(o.add(n),na(n))return!0;n=t[n]?.parentNodeId}return!1},Du=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},oa=e=>{let{nodes:t,rootNodeId:n}=g();if(ku(e.contextNodeId)&&To(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Du(e.selectedNodeId)&&e.selectedNodeId&&Zi(e.selectedNodeId))return l("Restored navigation to selected node or ancestor",null);if(To(e.contextNodeId,e.selectedIndex))return l("Restored navigation to previous container",null);if(e.parentNodeId&&To(e.parentNodeId,e.selectedIndex))return l("Restored navigation to previous parent",null);if(Zi(e.contextNodeId))return l("Restored navigation to previous container or ancestor",null);let o=t[n];if(!o||o.isDeleted)return a("Unable to restore navigation");let r=H(o.id);return A.navigate({contextNode:o,selectedIndex:ea(e.selectedIndex,r.length)}),l("Restored navigation to root",null)};import{monotonicFactory as Fu,ulid as dt}from"ulid";var kn=Fu();function Bu(){let e=Ue();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[o]=$(n.id),[r]=o?$(o.id):[];if(r){let s=t.renderedChildrenIndex?.[r.id]??[];return l("Resolved boot nav target",{contextNode:r,selectedIndex:s.length>0?0:-1})}else return o?l("Resolved boot nav target",{contextNode:o,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 Uu(){let e=Bu();return d(e)?e:A.navigate(e.value)}function ra({userId:e,userName:t}){let n=kn(),o=kn(),r=kn(),s=kn(),i=kn(),c=Ce(void 0,void 0);if(d(c))return c;let u=Ce(void 0,void 0);if(d(u))return u;let m=Ce(u.value,void 0);if(d(m))return m;let p=Ce(void 0,void 0);if(d(p))return p;let v=Ce(p.value,void 0);if(d(v))return v;let S=Ce(v.value,void 0);if(d(S))return S;let N=Ce(void 0,void 0);return d(N)?N:l("Created default events",[{id:dt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:dt(),userId:e,userName:t,action:"add.board",payload:{id:o,name:"Default",parent:n,rank:u.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:r,name:"Todo",parent:o,rank:p.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:o,rank:v.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"Done",parent:o,rank:S.value}},{id:dt(),userId:e,userName:t,action:"add.board",payload:{id:So,name:"Closed",parent:n,rank:m.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:ie,name:"Closed",parent:So,rank:N.value}},{id:dt(),userId:e,userName:t,action:"lock.node",payload:{id:So}},{id:dt(),userId:e,userName:t,action:"lock.node",payload:{id:ie}}])}function zt(e){if(!e.length){let o=Y.workspace("temporary-uninitialized-workspace","Workspace","a0"),r=Pn(o);return d(r)?r:(C({hasProjectDefinition:!1,mode:f.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!e.some(o=>o.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=Ht(e).filter(d);return n.length>0?a(`Materializing failed:
43
43
  ${n.map(o=>o.message).join(`
44
- `)}`):(ku(),N({hasProjectDefinition:!0}),l("State booted successfully",null))}var zt=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),To=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)}},G=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);var qe=null,Ao=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!qe,currentStatus:g().syncStatus?.status,currentMessage:g().syncStatus?.msg}),qe)return logger.debug("[sync] syncAndReloadState joining existing promise"),qe;logger.debug("[sync] syncAndReloadState creating promise"),qe=Du();try{let e=await qe;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"),N({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),qe||a(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:g().syncStatus?.status,statusMessageBeforeClear:g().syncStatus?.msg}),qe=null}},Du=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:g().mode,syncStatus:g().syncStatus});let e=ra();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:g().mode,message:e.message,syncStatus:g().syncStatus}),e;if(qe)return qe;logger.debug("[sync] syncAndReloadState:start");let t=G("resolveActorId",X());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),a("Unable to resolve event log path");N({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:g().syncStatus});let n=Vt(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let o=G("syncEpiqWithRemote",await wo({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!d(o),message:(d(o),o.message)}),d(o))return logger.error("[sync] syncAndReloadState:sync failed",o.message),N({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:g().syncStatus}),Ue(`Unable to sync state. ${o.message}`);let{stateBranchRoot:r}=o.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:r});let s=G("loadMergedEvents",at(r));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 N({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=ra();if(i)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:g().mode,message:i.message,syncStatus:g().syncStatus}),i;let c=ea();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 m=G("bootStateFromEventLog",Kt(s.value));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(m),message:(d(m),m.message)}),d(m))return N({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. ${m.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"),logger.debug("[sync] restoreNavigationAnchor:start");let u=G("restoreNavigationAnchor",na(c));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(u),message:d(u)?u.message:"Navigation restored",selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id}),d(u)?(N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:g().syncStatus}),u):(N({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:g().syncStatus}),l("Synced",!0))},ra=()=>g().mode===f.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:g().mode,syncStatus:g().syncStatus}),N({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var ln=3e3,sa=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<ln?null:t},ia=0,qr,Yr=!1,Fn=!1,Xr=()=>{if(Yr)return!0;let e=ze();return d(e)?!1:e.value.syncStatus.status==="syncing"},Fu=()=>{let e=_().autoSyncIntervalMs??1e4,t=Date.now()-ia;return Math.max(0,e-t)},aa=()=>{qr||(qr=setTimeout(async()=>{if(qr=void 0,!!un()){if(Xr()){Fn=!0;return}Fn=!1,await Bu()}},Fu()))},Bu=async()=>{if(g().readOnly||g().timeMode==="peek")return a("Cannot auto-sync while peeking");if(!un())return a("Cannot auto-sync before state is initialized");if(Xr())return Fn=!0,a("Sync already in progress");Yr=!0,ia=Date.now(),N({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Ao()}finally{Yr=!1,Fn&&aa()}},Mo=()=>{un()&&(Fn=!0,!Xr()&&aa())};var St=()=>{let e=_(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),o=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&o,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:o}},da=()=>{let e=_e(process.cwd());if(d(e))return!1;let t=It(e.value);return Q(t)},ca=e=>e===!0?"on":e===!1?"off":null,la=e=>e==="on"?!0:e==="off"?!1:null;var Uu=e=>e.props.tags??[],Ou=e=>e.props.assignees??[],Jr=e=>Uu(e).map(t=>I.getTag(t)).filter(t=>!!t),Qr=e=>Ou(e).map(t=>I.getContributor(t)).filter(t=>!!t),Po=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!A(n)?a("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",Jr(n))},Lo=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!A(n)?a("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",Qr(n))};var h={PALETTE:"?",EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",COFFEE:"coffee",NONE:""};var $u=/^(\d+)(h|d|w|mo|y)$/,Wu=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,_u=({year:e,month:t,day:n,hour:o=0,minute:r=0})=>{let s=new Date(e,t-1,n,o,r);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===o&&s.getMinutes()===r},ju=(e,t=new Date)=>{let n=e.match($u);if(!n)return null;let[,o,r]=n,s=Number(o);if(!Number.isInteger(s)||s<=0)return null;let i=new Date(t);switch(r){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}},Hu=e=>{let t=e.match(Wu);if(!t)return null;let[,n,o,r,s,i]=t,c=Number(n),u=Number(o),m=Number(r),p=s?Number(s):0,v=i?Number(i):0;return _u({year:c,month:u,day:m,hour:p,minute:v})?new Date(c,u-1,m,p,v):null},ko=e=>{let t=e.trim().toLowerCase();return ju(t)??Hu(t)},ua=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Vu=[{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}],ma=(e=Vu)=>{let t=[];for(let{unit:n,from:o,to:r}of e)for(let s=o;s<=r;s++)t.push(`${s}${n}`);return t};var Gu=["BOARD","TICKET","SWIMLANE","COMMENT"],re={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",LOG_LEVEL:"logLevel"},Ye={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Ku=[re.EDITOR,re.VIEW,re.USERNAME,re.AUTOSYNC,re.SYNC_DEBOUNCE_MS,re.LOG_LEVEL],zu=[Ye.TITLE,Ye.DESCRIPTION,Ye.COMMENT],es=[String(ln),"5000","15000","30000","60000"],qt=[h.COFFEE,h.EXIT,h.SYNC,h.HELP,h.EXPORT,h.CONFIG],Do=[h.NEW,h.EDIT,h.DELETE,h.MOVE],Zr=[h.TAG,h.UNTAG,h.ASSIGN,h.UNASSIGN,h.CLOSE_ISSUE,h.RE_OPEN_ISSUE,h.EDIT,h.COMMENT],pa=[h.FILTER,h.PEEK],qu={WORKSPACE:[...qt,...Do],BOARD:[...pa,...qt,...Do],SWIMLANE:[...pa,...qt,...Do],TICKET:[...qt,...Do,...Zr],FIELD:[...qt,...Zr],FIELD_LIST:[...qt,...Zr],TEXT:[...qt],COMMENT:[h.EDIT,h.DELETE]},Yu=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Xu=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:o}=St();if(!o)return[h.HELP,h.CONFIG];if(!da())return[h.HELP,h.INIT];if(t)return[h.HELP,h.PEEK,h.EXPORT,h.CONFIG];let r=e?.context,s=r&&Gu.includes(r);return[...new Set([...n,e].map(c=>c?.context).flatMap(c=>c?qu[c]:[]))].filter(c=>c===h.MOVE?!1:c===h.EDIT||c===h.DELETE?s:!0)},ie=(e,{contextNode:t,selectedNode:n,readOnly:o,breadCrumb:r}=g())=>{let s=t.context??"WORKSPACE";return{[h.NONE]:Xu({breadCrumb:r,readOnly:o,selectedNode:n}),[h.EXIT]:["confirm"],[h.EXPORT]:[],[h.SYNC]:[],[h.INIT]:[],[h.HELP]:[],[h.PEEK]:[...ma(),"now","prev","next"],[h.EDIT]:[...zu],[h.COMMENT]:[],[h.DELETE]:["confirm"],[h.RE_OPEN_ISSUE]:["confirm"],[h.CLOSE_ISSUE]:["confirm"],[h.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[h.FILTER]:["tag","assignee","description","title","clear"],[h.TAG]:[...new Set([...Object.keys(an),...I.getExistingTags()])],[h.UNTAG]:[...Po()?.value?.map(({name:c})=>c)??[]],[h.UNASSIGN]:[...Lo()?.value?.map(({name:c})=>c)??[]],[h.ASSIGN]:I.getExistingAssignees(),[h.NEW]:Yu(s),[h.CONFIG]:[...Ku],[h.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import ya from"chalk";var ga=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Se=(e,t)=>{let n=e.find(o=>o.context===t);return n!==void 0?l("Found node",n):a("Unable to find node in breadcrumb")};import fa from"chalk";var Z=e=>fa.dim(e),xe=e=>fa.hex(y.primary)(e),pe=({prefix:e="",wordList:t,postfix:n="",noOfHints:o=100,inputString:r,minLengthForHints:s=1})=>{let i=r.trim();if(i.length<s)return"";let p=[...t.filter(Boolean).filter(v=>v.startsWith(i))].sort((v,C)=>xo(v)-xo(C)).slice(0,o).map(v=>ho(v)).join(" ");return p?`${Z(e)}${p}${Z(n)}`:""};var Et={None:"none",Invalid:"invalid",Valid:"valid"};var mn=140,Ju=["BOARD","TICKET","SWIMLANE"],va=()=>{let e=g().selectedNode;if(!e?.context)return U({message:Z("Missing target context")});if(Ju.includes(e.context))return H();if(e.parentNodeId){let t=g().nodes[e.parentNodeId];if(t?.id===Ne(t?.parentNodeId??"","comments"))return H()}return U({message:Z("Command not available in this context")})},se="<ENTER> to confirm",H=(e="",t=[])=>({message:Z(e),validity:Et.Valid,completionWordList:t}),U=({message:e,completionWordList:t=[]})=>({validity:Et.Invalid,message:e,completionWordList:t}),Bo=e=>e.length===0,Fo=e=>` ${ya.hex("#000").bgHex(oe(e))(` ${e} `)} `,ts=({modifier:e})=>{let t="confirm";return e===t?H(se):U({message:Bo(e)?Z("if you are certain, enter ")+ho(t):"",completionWordList:[t]})},Qu=({list:e,hint:t,onValue:n})=>({modifier:o,inputString:r})=>e.includes(o)?r.trim().length<1?U({message:Z(n)}):H():U({message:Bo(o)?t:"",completionWordList:[...e]}),Yt=({hint:e,onOk:t})=>({modifier:n,inputString:o})=>Bo(n)&&Bo(o)?U({message:e,completionWordList:[]}):H(t??se),Zu=({modifier:e,inputString:t})=>{let n=ie(h.CONFIG);if(!n.includes(e))return U({message:pe({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case re.EDITOR:{let o=[...ga];return t.trim()?o.includes(t.trim())?H(se):U({message:pe({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o}):U({message:pe({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case re.VIEW:{let o=["dense","wide"];return o.includes(t.trim())?H(se):U({message:pe({prefix:"view... ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case re.USERNAME:return t.trim()?H(se):U({message:xe("Enter a user name. Saved in ")+ya.bgBlack("~/.epiq-global/config.json")});case re.LOG_LEVEL:{let o=["debug","error","info"],r=t.trim();return o.includes(r)?H(se):U({message:pe({prefix:"one of: ",wordList:[...o],inputString:r,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...o]})}case re.AUTOSYNC:{let o=["on","off"],r=_().autoSync;if(!o.includes(t.trim())){let s=ca(r);return U({message:pe({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:o,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:o})}return H(se)}case re.SYNC_DEBOUNCE_MS:{let o=_().autoSyncIntervalMs,r=sa(t);if(!t.trim()||r===null||r<ln){let s=pe({prefix:" examples: ",wordList:es,minLengthForHints:0,inputString:t});return U({message:xe(`provide duration above ${ln}ms. current duration: ${o}ms.`)+s,completionWordList:es})}return H(se)}default:return U({message:xe("Unknown config option"),completionWordList:n})}},em=({modifier:e,inputString:t})=>{let n=ie(h.EDIT);if(!n.includes(e)){let i=pe({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return U({message:i||xe("Unknown edit option"),completionWordList:n})}let{breadCrumb:o,selectedNode:r}=g(),s=Se([...o,r],"TICKET");if(d(s))return U({message:xe("Command not available in this context")});switch(e){case Ye.COMMENT:return t||pn(()=>"hahah"),H(se);case Ye.TITLE:return H(se);case Ye.DESCRIPTION:{let{preferredEditor:i}=_();return i?H(Z("<ENTER> to edit in ")+i):U({message:"No editor selected"})}default:return U({message:xe("Unknown edit option"),completionWordList:n})}},tm={[h.EXPORT]:()=>H(se+Z(", and create export markdown file")),[h.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(se);let n={message:Z("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return H(se);let o=ko(t);if(!t||!o)return U(n);let r=Se(g().breadCrumb,"BOARD");if(d(r))return U({message:xe("Command is not applicable in this context")});let s=bo(r.value.id);return d(s)?U({message:xe("Unable to peek: board id is not a valid ULID")}):ua({date:o,horizonDate:s.value})?H(se):U({message:xe(`nothing to peek before ${s.value.toISOString().slice(0,16).replace("T"," ")}`)})},[h.EXIT]:()=>H(se+Z(" and exit the application")),[h.INIT]:()=>H(se),[h.PALETTE]:()=>H(se),[h.FILTER]:e=>{if(e.modifier==="clear")return H();let t=s=>ie(h.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return U({message:pe({wordList:ie(h.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ie(h.FILTER)});let n=Object.values(g().tags).map(s=>s.name),o=Object.values(g().contributors).map(s=>s.name),r=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?r.length&&!r.includes(e.inputString.trim())?U({message:pe({prefix:`existing ${e.modifier}s... `,wordList:r,noOfHints:10,inputString:e.inputString}),completionWordList:r}):H():U({message:pe({prefix:"one of... ",wordList:r,noOfHints:10,inputString:e.inputString}),completionWordList:r})},[h.NONE]:e=>{let t=ie(h.NONE);return U({message:pe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[h.NEW]:e=>Qu({list:ie(h.NEW),hint:pe({wordList:ie(h.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[h.HELP]:()=>H(se),[h.EDIT]:em,[h.COMMENT]:e=>{let t=Yt({hint:Z(`write a comment (max ${mn} char)...`),onOk:Z(`(${e.inputString.length}/${mn})`)})(e);return t.validity===Et.Invalid?t:e.inputString.length>mn?H(xe("max input exceeded")):t},[h.CONFIG]:Zu,[h.DELETE]:e=>{let t=va();return t.validity==="invalid"?t:ts(e)},[h.CLOSE_ISSUE]:e=>ts(e),[h.RE_OPEN_ISSUE]:e=>ts(e),[h.MOVE]:e=>{let t=va();return t.validity==="invalid"?t:Yt({hint:pe({prefix:"hey hacker! These commands are blocked for you... ",wordList:ie(h.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[h.TAG]:e=>{let n=I.getExistingTags().slice(0,10).map(Fo).join("");return Yt({hint:n.length?Z("create tag or reuse:")+n+Z(""):Z("create tag ...")})(e)},[h.UNTAG]:e=>{let t=Po();if(d(t))return U({message:xe("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(Fo).slice(0,10);return n.length?Yt({hint:Z(" ... ")+n.join("")})(e):U({message:xe("Issue has no tags"),completionWordList:[]})},[h.ASSIGN]:e=>{let t=I.getExistingAssignees().map(Fo).slice(0,10);return Yt({hint:Z("assignees... ")+t.join("")})(e)},[h.UNASSIGN]:e=>{let t=Lo();if(d(t))return U({message:xe("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(Fo).slice(0,10);return n.length?Yt({hint:Z("remove assignee... ")+n.join("")})(e):U({message:xe("Issue has no assignees"),completionWordList:[]})},[h.SYNC]:()=>H(se),[h.COFFEE]:e=>{let{modifier:t}=e,n=ie(h.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?U({message:Z("enter an amount ... "),completionWordList:n.filter(o=>o.startsWith(t))}):Yt({hint:pe({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},xa=Object.fromEntries(Object.entries(tm).map(([e,t])=>[e,{validate:(n,o,r)=>t({modifier:o,command:n,inputString:r})}]));var ha=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var Ia=e=>Object.values(h).includes(e),ba=(e,t)=>{let n=e.command??"",{modifier:o,target:r,inputString:s}=e,{message:i,validity:c,completionWordList:u}=xa[n].validate(n,o,s),m=r==="command"||r==="modifier"?ie(n):ha,{mode:p}=g(),v=p===f.COMMAND_LINE?i??"":"",C=[...u,...m];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:v,autoCompletion:t?Ri(e,C):{hint:"",hints:[],remainder:"",overlap:0}}};var Ca=e=>{let t=e.trimStart(),n=om(t),o=n[0]??"",r=n[1]??"",s=/\s$/.test(e),i=rm(e),c=Ia(o)?o:null,u=c!==null,m=o!=="",p=c?ie(c)??[]:[],v=c&&p.includes(r)?r:"",C="word";n.length===0||n.length===1&&!s?C="command":(n.length===1&&s||n.length===2&&!s)&&(C="modifier");let E=s?"":i,S=nm(t,c,v);return{raw:e,trimmedStart:t,words:n,firstWord:o,lastWord:i,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:s,modifier:v,target:C,inputToMatch:E,inputString:S}},nm=(e,t,n)=>{let o=e;return t&&o.startsWith(t)&&(o=o.slice(t.length)),o=o.replace(/^\s+/,""),n&&o.startsWith(n)&&(o=o.slice(n.length),o=o.replace(/^\s+/,"")),o},om=e=>e.trim()?e.trim().split(/\s+/):[],rm=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as sm}from"react";var gn=e=>e===ns||e===":",ns=" ",ge={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Et.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},os=new Set,Na=()=>{for(let e of os)e()},rs=e=>(os.add(e),()=>os.delete(e)),Xe=e=>{let n=e(ge),o=Ca(n.value),r=n.cursorPosition===n.value.length;ge={...n,commandMeta:ba(o,r)},Na()},Bn=({message:e,status:t})=>{let n=structuredClone(ge);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,ge=n,Na(),l(e,null)},ss=e=>{Xe(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},is=e=>{Xe(t=>{let{value:n,cursorPosition:o}=t,r=o;if(e==="left"){for(;r>0&&gn(n[r-1]);)r--;for(;r>0&&!gn(n[r-1]);)r--}else{for(;r<n.length&&!gn(n[r]);)r++;for(;r<n.length&&gn(n[r]);)r++}return{...t,cursorPosition:r}})},Sa=()=>{Xe(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}})},Ea=()=>{Xe(e=>{let{value:t,cursorPosition:n}=e,o=n;for(;o>0&&gn(t[o-1]);)o--;for(;o>0&&!gn(t[o-1]);)o--;let r=t.slice(n);return{...e,value:t.slice(0,o)+r,cursorPosition:o,commandIsPending:!1}})},pn=e=>{Xe(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),o=t.value.slice(0,n),r=t.value.slice(n),s=e(o,t.commandMeta.autoCompletion),i=s+r,c=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:c,commandIsPending:!1}})},Ra=()=>{Xe(e=>({...e,commandIsPending:!0}))},$=e=>{Xe(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Ta=({addToHistory:e=!0})=>{Xe(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},Aa=()=>{Xe(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}})},wa=()=>{Xe(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},q=()=>ge,Ma=()=>sm(rs,q,q),Pa=()=>{let[e,...t]=ge.value.split(ns);return t.join(ns).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",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function im(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function am(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function dm(e,t,n){let o=g().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:o?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:o?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:o?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:o?n.nextContainer:null}}function La(e,t){let n=q();if(e.sequence==="?"&&t!==f.PALETTE)return x.InitCommandPalette;if(e.sequence===":"&&t!==f.COMMAND_LINE)return x.InitCommandLine;if(t===f.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===f.COMMAND_LINE)return hi(e,n.value);if(t===f.PALETTE)return Ii(e,n.value);let o=im(e)||am(e);if(o)return cm(o,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"return":return x.Confirm;case"space":return x.Confirm;case"v":return _().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;default:return null}}function cm(e,t){let n=t===f.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 dm(g().contextNode.childRenderAxis,e,n)}var Uo=e=>{let{context:t}=g().contextNode;if(!t)return M.None;switch(e){case h.EXIT:return M.Exit;case h.EXPORT:return M.Export;case h.COFFEE:return M.Coffee;case h.INIT:return M.Init;case h.DELETE:return M.Delete;case h.EDIT:return M.Edit;case h.COMMENT:return M.Comment;case h.HELP:return M.ViewHelp;case h.RE_OPEN_ISSUE:return M.ReopenIssue;case h.CLOSE_ISSUE:return M.CloseIssue;case h.TAG:return M.TagTicket;case h.UNTAG:return M.UntagTicket;case h.ASSIGN:return M.AssignUserToTicket;case h.UNASSIGN:return M.UnassignUserFromTicket;case h.NEW:return M.NewItem;case h.FILTER:return M.Filter;case h.MOVE:return M.Move;case h.PEEK:return M.Peek;case h.CONFIG:return M.Config;case h.SYNC:return M.Sync;default:return M.None}},M={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",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 fe}from"ulid";import Xa from"node:fs";import $m from"node:path";import Wm from"react";import{Box as Um}from"ink";import Ho from"react";import Im from"chalk";import{Box as ds,Text as bm}from"ink";import Qe from"react";import{Text as ka}from"ink";import Da,{useEffect as Fa,useState as lm}from"react";var Ba={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},he=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=K(),o=Ba[n]??Ba.default,[r,s]=lm(0);if(Fa(()=>{s(0)},[o]),Fa(()=>{if(!e)return;let c=setInterval(()=>{s(u=>(u+1)%o.length)},500);return()=>clearInterval(c)},[e,o]),!e)return Da.createElement(ka,null,t);let i=o[r]??o[0]??t;return Da.createElement(ka,{color:y.accent,dimColor:r===1},i)};import{Box as as,Text as um}from"ink";import Oo from"react";var Je=({children:e=[],height:t,selectedIndex:n,itemHeight:o=1,scrollByOne:r=!1})=>{if(e.length===0)return null;let s=Math.max(1,Math.floor(t)),i=Math.max(1,Math.ceil(o)),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=r?Math.min(m,Math.max(0,u-c+1)):Math.min(m,Math.floor(u/c)*c),v=p+c,C=e.slice(p,v),E=e.length>c,S=s,R=E?Math.max(1,Math.floor(c/e.length*S)):S,D=Math.max(0,S-R),P=Math.max(1,e.length-c),V=E?Math.floor(p/P*D):0;return Oo.createElement(as,{flexDirection:"row",height:s,width:"100%"},Oo.createElement(as,{flexDirection:"column",flexGrow:1,height:s},C),Oo.createElement(as,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((O,k)=>Oo.createElement(um,{key:k,color:E&&k>=V&&k<V+R?y.accent:y.secondary},E?"\u2502":" "))))};import{Box as $o,Text as xm}from"ink";import Xt from"react";import{Text as mm}from"ink";import pm from"react";var gm=e=>e.toLowerCase().trim(),fm=(e,t=an)=>{let n=gm(e);return t[n]?t[n]:Mn(n)},Rt=({id:e,isSelected:t})=>{let n=I.getContributor(e);if(n)return pm.createElement(mm,{underline:t,color:fm(n.name)},"@"+n.name)};import{Text as vm}from"ink";import ym from"react";var fn=({id:e,isSelected:t})=>{let n=I.getTag(e);if(n)return ym.createElement(vm,{underline:t,backgroundColor:oe(n.name),color:y.secondary}," "+n.name+" ")};var Ua=({width:e,ticket:t,isSelected:n})=>{let o=e-14,r=yo(Nt(t.title),o),s=Jr(t),i=Qr(t);return Xt.createElement($o,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?y.accent:y.secondary,justifyContent:"space-between"},Xt.createElement($o,{borderBottom:!0},Xt.createElement($o,{paddingLeft:1,flexDirection:"column"},Xt.createElement(xm,{color:y.primary},r))),Xt.createElement($o,{flexDirection:"row",paddingLeft:1},s.map(c=>Xt.createElement(fn,{key:c.id,id:c.id})),i.map(c=>Xt.createElement(Rt,{key:c.id,id:c.id}))))};import{Box as Jt,Text as Un}from"ink";import Re from"react";var hm=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Oa=({width:e,ticket:t,isSelected:n,index:o,mode:r})=>{let s=(t.props.tags??[]).map(P=>I.getTag(P)).filter(P=>!!P),i=(t.props.assignees??[]).map(P=>I.getContributor(P)).filter(P=>!!P),c=1,u=s.length*(1+c),m=i.length*(2+c),p=s.map(P=>Re.createElement(Jt,{key:P.id,paddingRight:c},Re.createElement(Un,{color:oe(P.name)},"\u25A0"))),v=i.map(P=>Re.createElement(Jt,{key:P.id,paddingRight:c},Re.createElement(Un,{color:Mn(P.name)},"@"+P.name.at(0)))),C=n?y.accent:r===f.MOVE?y.secondary:y.primary,E=4,S=I.getCommentsByIssue(t.id),R=S.length?String(S.length).length+2+c:0,D=S.length?Re.createElement(Jt,{paddingRight:c},Re.createElement(Un,{color:y.accent},"[",S.length,"]")):null;return Re.createElement(Jt,{borderBottom:!0,justifyContent:"space-between"},Re.createElement(Jt,null,Re.createElement(Jt,{width:E},n?Re.createElement(he,{isSelected:n}):Re.createElement(Un,{color:"gray",dimColor:!0},o+1)),Re.createElement(Un,{wrap:"truncate",color:C},hm(t.title,e-u-m-R-18))),Re.createElement(Jt,null,p,v,D))};var Cm=({swimlane:e,isSelected:t,width:n,height:o,isDense:r,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:u}=K(),m=u[e.id]??[],p=`${e.title} ${Im.hex(y.secondary2).dim("("+m.length+")")}`,v=3,C=r?1:4,E=o-v-(r?2:1),S=Qe.createElement(ds,{borderStyle:"round",borderColor:y.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Qe.createElement(he,{isSelected:t}),Qe.createElement(bm,{bold:!0,color:t?y.accent:y.primary},p," ",e.readonly?"\u{1F512}":"")),R=(D,P)=>{let V=s&&i===P;return A(D)?r?Qe.createElement(Oa,{key:D.id,index:P,width:n,ticket:D,isSelected:V,mode:c}):Qe.createElement(Ua,{key:D.id,width:n,ticket:D,isSelected:V}):null};return Qe.createElement(ds,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?y.accent:y.secondary,paddingRight:1,paddingLeft:1,height:o},S,Qe.createElement(ds,{padding:r?1:0},m.length>0&&Qe.createElement(Je,{selectedIndex:i,height:E,itemHeight:C},m.map(R)),Qe.createElement(he,{isSelected:s&&i===-1})))},$a=Qe.memo(Cm);import{Box as On,Text as qa}from"ink";import Te,{useMemo as jo}from"react";import{Box as Wo,Text as Nm}from"ink";import ct from"react";var Wa=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:o}=K(),{title:r}=t,s=t.parentNodeId?I.getNode(t.parentNodeId):void 0,i=s&&A(s)?r===ne.ASSIGNEES?s.props.assignees??[]:r===ne.TAGS?s.props.tags??[]:[]:[];return ct.createElement(Wo,{alignItems:"center",paddingTop:1},ct.createElement(Wo,{minWidth:12},ct.createElement(he,{isSelected:n}),ct.createElement(Nm,{color:n?y.accent:y.secondary2},r,":")),ct.createElement(Wo,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,u)=>{let m=o.id===t.id&&u===e;return ct.createElement(Wo,{key:`${r}-${c}`,paddingRight:2,minHeight:1},ct.createElement(he,{isSelected:m}),r===ne.ASSIGNEES?ct.createElement(Rt,{isSelected:m,id:c}):r===ne.TAGS?ct.createElement(fn,{isSelected:m,id:c}):null)})))};import{Box as _o,Text as cs}from"ink";import lt,{useEffect as Sm,useMemo as _a}from"react";var Em="\u2029",ja=(e,t)=>`${e}::inline-line::${t}`,ls=new Map,Ha=e=>{let t=ls.get(e)??[];ls.delete(e);for(let n of t)I.deleteNode(n)},Rm=(e,t)=>{Ha(e);let n=[];t.forEach((o,r)=>{let s=Be(BigInt(r+1));if(!Q(s))return;let i=I.createNode(Y.text({id:ja(e,r),name:`Line ${r+1}`,parentNodeId:e,rank:s.value,props:{value:o},readonly:!0,isVirtual:!0}));Q(i)&&n.push(i.value.id)}),ls.set(e,n)},us=({id:e,label:t,text:n,height:o,selected:r,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=K(),u=_a(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=_a(()=>u.join("\0"),[u]);Sm(()=>(Rm(e,u),()=>{Ha(e)}),[e,m]);let p=C=>String(C).replace(/\r?\n/g,""),v=u.map((C,E)=>{let S=c.id===e&&i===E;return lt.createElement(_o,{key:ja(e,E)},lt.createElement(cs,{color:S?y.primary:y.secondary2,dimColor:!S},`${E+1} `.padStart(5,"\xA0")),lt.createElement(cs,{backgroundColor:S?"gray":void 0},p(C.length?yo(C,s-10):Em)))});return lt.createElement(_o,{flexDirection:"column",paddingTop:1},lt.createElement(_o,null,lt.createElement(he,{isSelected:r}),lt.createElement(cs,{color:r?y.accent:y.secondary2},t)),lt.createElement(_o,{flexDirection:"row",borderStyle:"round",borderColor:y.secondary,paddingLeft:1,marginLeft:1},lt.createElement(Je,{scrollByOne:!0,height:o-3,selectedIndex:i,itemHeight:1},v)))};import{Box as Tt,Text as ut}from"ink";import ae,{useEffect as Tm,useMemo as Am,useRef as wm}from"react";import{decodeTime as ms}from"ulid";var Va=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},Ga=(e,t,n)=>Y.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});var Mm=e=>Ne(e,"comments"),Pm=e=>I.getCommentsByIssue(e.id).sort((t,n)=>ms(t.id)-ms(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Ka=e=>{for(let t of e)I.deleteNode(t.id)},Lm=(e,t)=>{let n=I.getNode(Mm(e.id));if(!n||!Ge(n))return[];let o=t.map((r,s)=>Ga(r,s,n.id)).map(I.createNode).filter(Q).map(({value:r})=>r).filter(An);return t.length>0&&g().selectedIndex<0&&T.navigate({contextNode:n,selectedIndex:0}),o},km=(e,t)=>{let n=e.replace(/\s+/g," ").trim();return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}\u2026`};function za({ticket:e,width:t,height:n}){let o=Am(()=>Pm(e),[e]),r=wm([]);Tm(()=>(Ka(r.current),r.current=Lm(e,o),()=>{Ka(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=K(),c=Math.max(1,n-4),u=Math.max(20,t-8);return o.length===0?ae.createElement(Tt,{flexDirection:"column",width:t,height:n,padding:1},ae.createElement(ut,{color:y.primary},"No comments yet."),ae.createElement(Tt,{paddingTop:1},ae.createElement(ut,{color:y.primary},"Use"),ae.createElement(ut,{color:y.accent}," :comment "),ae.createElement(ut,{color:y.primary},"to add the first one."))):ae.createElement(Tt,{flexDirection:"column",width:t,height:n},ae.createElement(Tt,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},ae.createElement(ut,{color:y.secondary2},"Comments (",o.length,") ")),ae.createElement(Je,{height:c,itemHeight:4,selectedIndex:s},o.map((m,p)=>{let v=p===s;return ae.createElement(Tt,{key:m.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},ae.createElement(Tt,{flexDirection:"row",paddingBottom:1},ae.createElement(ut,{color:y.accent},v?"\u276F ":" "),ae.createElement(Tt,{paddingLeft:1},ae.createElement(ut,{color:y.secondary2},`#${p+1} `),ae.createElement(Rt,{id:m.authorId}),ae.createElement(ut,{color:y.secondary2}," "+Io(ms(m.id))))),ae.createElement(Tt,{paddingLeft:3,paddingBottom:1},ae.createElement(ut,{color:y.primary},km(m.md,u))))})))}var Dm=e=>Ne(e,"description"),Fm=e=>Ne(e,"comments"),Bm=e=>Ne(e,"history"),Ya=({ticket:e,height:t})=>{let n=jo(()=>Va(e),[e]),{selectedIndex:o,contextNode:r}=K(),s=process.stdout.columns||120,i=jo(()=>Dm(e.id),[e.id]),c=jo(()=>Fm(e.id),[e.id]),u=jo(()=>Bm(e.id),[e.id]),m=r.id===e.id,p=r.id===c||r.parentNodeId===c,v=r.id===u||r.parentNodeId===u,C=W(e.id);if(p){let k=t-3;return Te.createElement(On,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Te.createElement(za,{ticket:e,width:s,height:k}))}if(v){let O=I.getNode(u),k=O&&Ge(O)?O.props.value??"":"",ft=t-3;return Te.createElement(On,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},O?Te.createElement(us,{id:O.id,label:"Event log",text:k,selected:!1,maxWidth:s,height:ft}):null)}let E=C.reduce((O,k)=>Tn(k)||k.id===c||k.id===u?O+1:O,0),S=2,R=3,D=E,P=t-R-D-S,V=(O,k)=>O.id===i?Te.createElement(us,{key:O.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:k,maxWidth:s,height:P}):Tn(O)?Te.createElement(Wa,{key:O.id,parent:O,selected:k,selectedIndex:o}):O.id===c?Te.createElement(On,{key:O.id,paddingTop:1},Te.createElement(he,{isSelected:k}),Te.createElement(qa,{backgroundColor:y.secondary,color:k?y.accent:y.primary},` Comments (${n}) \u203A\u203A `)):O.id===u?Te.createElement(On,{key:O.id,paddingTop:1},Te.createElement(he,{isSelected:k}),Te.createElement(qa,{backgroundColor:y.secondary,color:k?y.accent:y.primary}," History \u203A\u203A ")):null;return Te.createElement(On,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},C.map((O,k)=>V(O,m&&o===k)))};var Om=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,viewMode:s,height:i,width:c})=>{let u=t.context,m=u===w.TICKET||u===w.FIELD_LIST||u===w.FIELD,p=u===w.BOARD||u===w.SWIMLANE,v=u===w.TICKET?t:o.find(D=>D.context===w.TICKET),C=Math.floor(c/3),E=Math.floor(c/Math.max(e.length,1)),S=Math.min(E,C),R=s==="dense";return Ho.createElement(Um,{flexDirection:"row",height:i},p&&e.map((D,P)=>{let V=t.id===D.id,O=V?n:-1,k=t.context===w.BOARD&&n===P;return Ho.createElement($a,{key:D.id,height:i,width:S,swimlane:D,isSelected:k,isDense:R,isFocused:V,listSelectedIndex:O,mode:r})}),m&&v&&Ho.createElement(Ya,{height:i,ticket:v}))},Vo=Ho.memo(Om);import{render as _m}from"ink";import{Writable as jm}from"node:stream";var $n=e=>String(e).padStart(2,"0"),Hm=e=>{let t=e.getUTCFullYear(),n=$n(e.getUTCMonth()+1),o=$n(e.getUTCDate()),r=$n(e.getUTCHours()),s=$n(e.getUTCMinutes()),i=$n(e.getUTCSeconds());return`${t}-${n}-${o}_${r}-${s}-${i}`},Vm=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Gm=async(e,{width:t,height:n})=>{let o="",r=new jm({write(i,c,u){let m=Km(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(o=m),u()}});r.columns=t,r.rows=n,r.isTTY=!0;let s=_m(e,{stdout:r,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),o},Km=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Ja=async()=>{let{viewMode:e}=_(),{contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,renderedChildrenIndex:s}=g(),i=o.find(P=>P.context==="BOARD");if(!i)return a("No board found to export");let c=120,u=40,m=await Gm(Wm.createElement(Vo,{height:u,width:c,swimlanes:(s[i.id]??[]).filter(P=>P!==void 0&&Ct(P)),contextNode:t,selectedIndex:n,breadCrumb:o,viewMode:e??"dense",mode:r}),{width:c,height:u});if(!m)return a("Failed to render board export");let p=oo(process.cwd());if(d(p))return a("Unable to export, epiq root not found");let v=new Date,C=Hm(v),E=`board_${Vm(i.title)}_${C}.md`,S=Vs(p.value);Xa.mkdirSync(S,{recursive:!0});let R=$m.join(S,E),D=`# Board - ${i.title}
44
+ `)}`):(Uu(),C({hasProjectDefinition:!0}),l("State booted successfully",null))}var Kt=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),Ao=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)}},G=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);var Ye=null,wo=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Ye,currentStatus:g().syncStatus?.status,currentMessage:g().syncStatus?.msg}),Ye)return logger.debug("[sync] syncAndReloadState joining existing promise"),Ye;logger.debug("[sync] syncAndReloadState creating promise"),Ye=Ou();try{let e=await Ye;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"),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}),Ye||a(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:g().syncStatus?.status,statusMessageBeforeClear:g().syncStatus?.msg}),Ye=null}},Ou=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:g().mode,syncStatus:g().syncStatus});let e=sa();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:g().mode,message:e.message,syncStatus:g().syncStatus}),e;if(Ye)return Ye;logger.debug("[sync] syncAndReloadState:start");let t=G("resolveActorId",X());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:g().syncStatus});let n=Vt(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let o=G("syncEpiqWithRemote",await Mo({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!d(o),message:(d(o),o.message)}),d(o))return logger.error("[sync] syncAndReloadState:sync failed",o.message),C({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:g().syncStatus}),Oe(`Unable to sync state. ${o.message}`);let{stateBranchRoot:r}=o.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:r});let s=G("loadMergedEvents",at(r));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:g().syncStatus}),a(`Unable to load events. ${s.message}`);logger.debug("[sync] loaded merged events after sync",{count:s.value.length});let i=sa();if(i)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:g().mode,message:i.message,syncStatus:g().syncStatus}),i;let c=ta(),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=G("bootStateFromEventLog",zt(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: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"),C({filters:u}),logger.debug("[sync] restoreNavigationAnchor:start");let m=G("restoreNavigationAnchor",oa(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)?(C({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:g().syncStatus}),m):(C({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:g().syncStatus}),l("Synced",!0))},sa=()=>g().mode===f.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:g().mode,syncStatus:g().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,ia=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<ln?null:t},aa=0,Jr,Qr=!1,Dn=!1,Zr=()=>{if(Qr)return!0;let e=Ue();return d(e)?!1:e.value.syncStatus.status==="syncing"},Wu=()=>{let e=_().autoSyncIntervalMs??1e4,t=Date.now()-aa;return Math.max(0,e-t)},da=()=>{Jr||(Jr=setTimeout(async()=>{if(Jr=void 0,!!un()){if(Zr()){Dn=!0;return}Dn=!1,await $u()}},Wu()))},$u=async()=>{if(g().readOnly||g().timeMode==="peek")return a("Cannot auto-sync while peeking");if(!un())return a("Cannot auto-sync before state is initialized");if(Zr())return Dn=!0,a("Sync already in progress");Qr=!0,aa=Date.now(),C({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await wo()}finally{Qr=!1,Dn&&da()}},Po=()=>{un()&&(Dn=!0,!Zr()&&da())};var Nt=()=>{let e=_(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),o=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&o,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:o}},ca=()=>{let e=He(process.cwd());if(d(e))return!1;let t=It(e.value);return Z(t)},la=e=>e===!0?"on":e===!1?"off":null,ua=e=>e==="on"?!0:e==="off"?!1:null;var _u=e=>e.props.tags??[],ju=e=>e.props.assignees??[],Fn=e=>_u(e).map(t=>I.getTag(t)).filter(t=>!!t),Bn=e=>ju(e).map(t=>I.getContributor(t)).filter(t=>!!t),Lo=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!T(n)?a("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",Fn(n))},ko=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!T(n)?a("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",Bn(n))};var h={PALETTE:"?",EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",COFFEE:"coffee",NONE:""};var Hu=/^(\d+)(h|d|w|mo|y)$/,Vu=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Gu=({year:e,month:t,day:n,hour:o=0,minute:r=0})=>{let s=new Date(e,t-1,n,o,r);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===o&&s.getMinutes()===r},zu=(e,t=new Date)=>{let n=e.match(Hu);if(!n)return null;let[,o,r]=n,s=Number(o);if(!Number.isInteger(s)||s<=0)return null;let i=new Date(t);switch(r){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}},Ku=e=>{let t=e.match(Vu);if(!t)return null;let[,n,o,r,s,i]=t,c=Number(n),u=Number(o),m=Number(r),p=s?Number(s):0,v=i?Number(i):0;return Gu({year:c,month:u,day:m,hour:p,minute:v})?new Date(c,u-1,m,p,v):null},Do=e=>{let t=e.trim().toLowerCase();return zu(t)??Ku(t)},ma=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,qu=[{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}],pa=(e=qu)=>{let t=[];for(let{unit:n,from:o,to:r}of e)for(let s=o;s<=r;s++)t.push(`${s}${n}`);return t};var Yu=["BOARD","TICKET","SWIMLANE","COMMENT"],se={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",LOG_LEVEL:"logLevel"},$e={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Xu=[se.EDITOR,se.VIEW,se.USERNAME,se.AUTOSYNC,se.SYNC_DEBOUNCE_MS,se.LOG_LEVEL],Ju=(e=g().selectedNode?.context)=>{switch(e){case"TICKET":return[$e.TITLE,$e.DESCRIPTION];case"BOARD":case"SWIMLANE":return[$e.TITLE];case"COMMENT":return[$e.COMMENT];default:return[]}},ts=[String(ln),"5000","15000","30000","60000"],qt=[h.COFFEE,h.EXIT,h.SYNC,h.HELP,h.EXPORT,h.CONFIG],Fo=[h.NEW,h.EDIT,h.DELETE,h.MOVE],es=[h.TAG,h.UNTAG,h.ASSIGN,h.UNASSIGN,h.CLOSE_ISSUE,h.RE_OPEN_ISSUE,h.EDIT,h.COMMENT],ga=[h.FILTER,h.PEEK],Qu={WORKSPACE:[...qt,...Fo],BOARD:[...ga,...qt,...Fo],SWIMLANE:[...ga,...qt,...Fo],TICKET:[...qt,...Fo,...es],FIELD:[...qt,...es],FIELD_LIST:[...qt,...es],TEXT:[...qt],COMMENT:[h.EDIT,h.DELETE]},Zu=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],em=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&T(n)),fa=e=>e.parentNodeId===ie,tm=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:o}=Nt();if(!o)return[h.HELP,h.CONFIG];if(!ca())return[h.HELP,h.INIT];if(t)return[h.HELP,h.PEEK,h.EXPORT,h.CONFIG];let r=e?.context,s=r&&Yu.includes(r),i=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?Qu[u]:[]))],c=em({breadCrumb:n,selectedNode:e});return i.filter(u=>u===h.MOVE?!1:u===h.EDIT||u===h.DELETE?s:u===h.UNTAG?!!(c&&Fn(c).length>0):u===h.UNASSIGN?!!(c&&Bn(c).length>0):u===h.RE_OPEN_ISSUE?!!(c&&fa(c)):u===h.CLOSE_ISSUE?!!(c&&!fa(c)):!0)},ae=(e,{contextNode:t,selectedNode:n,readOnly:o,breadCrumb:r}=g())=>{let s=t.context??"WORKSPACE";return{[h.NONE]:tm({breadCrumb:r,readOnly:o,selectedNode:n}),[h.EXIT]:["confirm"],[h.EXPORT]:[],[h.SYNC]:[],[h.INIT]:[],[h.HELP]:[],[h.PEEK]:[...pa(),"now","prev","next"],[h.EDIT]:Ju(n?.context),[h.COMMENT]:[],[h.DELETE]:["confirm"],[h.RE_OPEN_ISSUE]:["confirm"],[h.CLOSE_ISSUE]:["confirm"],[h.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[h.FILTER]:["tag","assignee","description","title","clear"],[h.TAG]:[...new Set([...Object.keys(an),...I.getExistingTags()])],[h.UNTAG]:[...Lo()?.value?.map(({name:c})=>c)??[]],[h.UNASSIGN]:[...ko()?.value?.map(({name:c})=>c)??[]],[h.ASSIGN]:I.getExistingAssignees(),[h.NEW]:Zu(s),[h.CONFIG]:[...Xu],[h.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import xa from"chalk";var va=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Ee=(e,t)=>{let n=e.find(o=>o.context===t);return n!==void 0?l("Found node",n):a("Unable to find node in breadcrumb")};import ya from"chalk";var J=e=>ya.dim(e),he=e=>ya.hex(y.primary)(e),pe=({prefix:e="",wordList:t,postfix:n="",noOfHints:o=100,inputString:r,minLengthForHints:s=1})=>{let i=r.trim();if(i.length<s)return"";let p=[...t.filter(Boolean).filter(v=>v.startsWith(i))].sort((v,S)=>xo(v)-xo(S)).slice(0,o).map(v=>Io(v)).join(" ");return p?`${J(e)}${p}${J(n)}`:""};var Et={None:"none",Invalid:"invalid",Valid:"valid"};var mn=140,nm=["BOARD","TICKET","SWIMLANE"],ha=()=>{let e=g().selectedNode;if(!e?.context)return U({message:J("Missing target context")});if(nm.includes(e.context))return V();if(e.parentNodeId){let t=g().nodes[e.parentNodeId];if(t?.id===Se(t?.parentNodeId??"","comments"))return V()}return U({message:J("Command not available in this context")})},ee="<ENTER> to confirm",V=(e="",t=[])=>({message:J(e),validity:Et.Valid,completionWordList:t}),U=({message:e,completionWordList:t=[]})=>({validity:Et.Invalid,message:e,completionWordList:t}),Uo=e=>e.length===0,Bo=e=>` ${xa.hex("#000").bgHex(re(e))(` ${e} `)} `,ns=({modifier:e})=>{let t="confirm";return e===t?V(ee):U({message:Uo(e)?J("if you are certain, enter ")+Io(t):"",completionWordList:[t]})},om=({list:e,hint:t,onValue:n})=>({modifier:o,inputString:r})=>e.includes(o)?r.trim().length<1?U({message:J(n)}):V():U({message:Uo(o)?t:"",completionWordList:[...e]}),Yt=({hint:e,onOk:t})=>({modifier:n,inputString:o})=>Uo(n)&&Uo(o)?U({message:e,completionWordList:[]}):V(t??ee),rm=({modifier:e,inputString:t})=>{let n=ae(h.CONFIG);if(!n.includes(e))return U({message:pe({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case se.EDITOR:{let o=[...va];return t.trim()?o.includes(t.trim())?V(ee):U({message:pe({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o}):U({message:pe({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case se.VIEW:{let o=["dense","wide"];return o.includes(t.trim())?V(ee):U({message:pe({prefix:"view... ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case se.USERNAME:return t.trim()?V(ee):U({message:he("Enter a user name. Saved in ")+xa.bgBlack("~/.epiq-global/config.json")});case se.LOG_LEVEL:{let o=["debug","error","info"],r=t.trim();return o.includes(r)?V(ee):U({message:pe({prefix:"one of: ",wordList:[...o],inputString:r,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...o]})}case se.AUTOSYNC:{let o=["on","off"],r=_().autoSync;if(!o.includes(t.trim())){let s=la(r);return U({message:pe({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:o,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:o})}return V(ee)}case se.SYNC_DEBOUNCE_MS:{let o=_().autoSyncIntervalMs,r=ia(t);if(!t.trim()||r===null||r<ln){let s=pe({prefix:" examples: ",wordList:ts,minLengthForHints:0,inputString:t});return U({message:he(`provide duration above ${ln}ms. current duration: ${o}ms.`)+s,completionWordList:ts})}return V(ee)}default:return U({message:he("Unknown config option"),completionWordList:n})}},sm=({modifier:e,inputString:t})=>{let n=ae(h.EDIT);if(!n.length)return U({message:he("Command not available in this context")});if(!n.includes(e)){let o=pe({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return U({message:o||he("Unknown edit option"),completionWordList:n})}switch(e){case $e.COMMENT:return t.trim()?V(ee):U({message:J("write a comment...")});case $e.TITLE:return V(ee);case $e.DESCRIPTION:{let{preferredEditor:o}=_();return o?V(J("<ENTER> to edit in ")+o):U({message:"No editor selected"})}default:return U({message:he("Unknown edit option"),completionWordList:n})}},im={[h.EXPORT]:()=>V(ee+J(", and create export markdown file")),[h.PEEK]:e=>{let t=e.modifier;if(t==="now")return V(ee);let n={message:J("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return V(ee);let o=t||e.inputString,r=Do(o);if(!o||!r)return U(n);let s=Ee(g().breadCrumb,"BOARD");if(d(s))return U({message:he("Command is not applicable in this context")});let i=Co(s.value.id);return d(i)?U({message:he("Unable to peek: board id is not a valid ULID")}):ma({date:r,horizonDate:i.value})?V(ee):U({message:he(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[h.EXIT]:()=>V(ee+J(" and exit the application")),[h.INIT]:()=>V(ee),[h.PALETTE]:()=>V(ee),[h.FILTER]:e=>{if(e.modifier==="clear")return V(ee);let t=s=>ae(h.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return U({message:pe({wordList:ae(h.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ae(h.FILTER)});let n=Object.values(g().tags).map(s=>s.name),o=Object.values(g().contributors).map(s=>s.name),r=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?r.length&&!r.includes(e.inputString.trim())?U({message:pe({prefix:`existing ${e.modifier}s... `,wordList:r,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:r}):V():U({message:pe({prefix:"one of... ",wordList:r,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:r})},[h.NONE]:e=>{let t=ae(h.NONE);return U({message:pe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[h.NEW]:e=>om({list:ae(h.NEW),hint:pe({wordList:ae(h.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[h.HELP]:()=>V(ee),[h.EDIT]:sm,[h.COMMENT]:e=>{let t=Yt({hint:J(`write a comment (max ${mn} char)...`),onOk:J(`(${e.inputString.length}/${mn})`)})(e);return t.validity===Et.Invalid?t:e.inputString.length>mn?V(he("max input exceeded")):t},[h.CONFIG]:rm,[h.DELETE]:e=>{let t=ha();return t.validity==="invalid"?t:ns(e)},[h.CLOSE_ISSUE]:e=>ns(e),[h.RE_OPEN_ISSUE]:e=>ns(e),[h.MOVE]:e=>{let t=ha();return t.validity==="invalid"?t:Yt({hint:pe({prefix:"hey hacker! These commands are blocked for you... ",wordList:ae(h.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[h.TAG]:e=>{let n=I.getExistingTags().slice(0,10).map(Bo).join("");return Yt({hint:n.length?J("create tag or reuse:")+n+J(""):J("create tag ...")})(e)},[h.UNTAG]:e=>{let t=Lo();if(d(t))return U({message:he("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(Bo).slice(0,10);return n.length?Yt({hint:J(" ... ")+n.join("")})(e):U({message:he("Issue has no tags"),completionWordList:[]})},[h.ASSIGN]:e=>{let t=I.getExistingAssignees().map(Bo).slice(0,10);return Yt({hint:J("assignees... ")+t.join("")})(e)},[h.UNASSIGN]:e=>{let t=ko();if(d(t))return U({message:he("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(Bo).slice(0,10);return n.length?Yt({hint:J("remove assignee... ")+n.join("")})(e):U({message:he("Issue has no assignees"),completionWordList:[]})},[h.SYNC]:()=>V(ee),[h.COFFEE]:e=>{let{modifier:t}=e,n=ae(h.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?U({message:J("enter an amount ... "),completionWordList:n.filter(o=>o.startsWith(t))}):Yt({hint:pe({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},Ia=Object.fromEntries(Object.entries(im).map(([e,t])=>[e,{validate:(n,o,r)=>t({modifier:o,command:n,inputString:r})}]));var Oo=["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 am=3,dm=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"]),cm=e=>{let t=[];for(let n of Object.values(e.nodes)){n.title&&t.push(n.title);let o=n.props;typeof o.description=="string"&&t.push(o.description),typeof o.value=="string"&&t.push(o.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},lm=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=am&&!dm.has(t)&&!/^\d+$/.test(t)),um=e=>{let t=new Map;for(let s of cm(e))for(let i of lm(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),o=new Set(n),r=Oo.filter(s=>!o.has(s));return[...n,...r]},ba=Oo,Ca=-1,Sa=()=>{let e=Ue();if(d(e))return Oo;let t=e.value,n=t.eventLog.length;return n!==Ca&&(ba=um(t),Ca=n),ba};var Na=e=>Object.values(h).includes(e),Ea=(e,t)=>{let n=e.command??"",{modifier:o,target:r,inputString:s}=e,{message:i,validity:c,completionWordList:u}=Ia[n].validate(n,o,s),m=r==="command"||r==="modifier"?ae(n):Sa(),{mode:p}=g(),v=p===f.COMMAND_LINE?i??"":"",S=[...u,...m];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:v,autoCompletion:t?Ti(e,S):{hint:"",hints:[],remainder:"",overlap:0}}};var Ra=e=>{let t=e.trimStart(),n=pm(t),o=n[0]??"",r=n[1]??"",s=/\s$/.test(e),i=gm(e),c=Na(o)?o:null,u=c!==null,m=o!=="",p=c?ae(c)??[]:[],v=c&&p.includes(r)?r:"",S="word";n.length===0||n.length===1&&!s?S="command":(n.length===1&&s||n.length===2&&!s)&&(S="modifier");let N=s?"":i,E=mm(t,c,v);return{raw:e,trimmedStart:t,words:n,firstWord:o,lastWord:i,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:s,modifier:v,target:S,inputToMatch:N,inputString:E}},mm=(e,t,n)=>{let o=e;return t&&o.startsWith(t)&&(o=o.slice(t.length)),o=o.replace(/^\s+/,""),n&&o.startsWith(n)&&(o=o.slice(n.length),o=o.replace(/^\s+/,"")),o},pm=e=>e.trim()?e.trim().split(/\s+/):[],gm=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as fm}from"react";var pn=e=>e===os||e===":",os=" ",ge={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Et.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},rs=new Set,Ta=()=>{for(let e of rs)e()},ss=e=>(rs.add(e),()=>rs.delete(e)),Xe=e=>{let n=e(ge),o=Ra(n.value),r=n.cursorPosition===n.value.length;ge={...n,commandMeta:Ea(o,r)},Ta()},Un=({message:e,status:t})=>{let n=structuredClone(ge);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,ge=n,Ta(),l(e,null)},is=e=>{Xe(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},as=e=>{Xe(t=>{let{value:n,cursorPosition:o}=t,r=o;if(e==="left"){for(;r>0&&pn(n[r-1]);)r--;for(;r>0&&!pn(n[r-1]);)r--}else{for(;r<n.length&&!pn(n[r]);)r++;for(;r<n.length&&pn(n[r]);)r++}return{...t,cursorPosition:r}})},Aa=()=>{Xe(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}})},wa=()=>{Xe(e=>{let{value:t,cursorPosition:n}=e,o=n;for(;o>0&&pn(t[o-1]);)o--;for(;o>0&&!pn(t[o-1]);)o--;let r=t.slice(n);return{...e,value:t.slice(0,o)+r,cursorPosition:o,commandIsPending:!1}})},Wo=e=>{Xe(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),o=t.value.slice(0,n),r=t.value.slice(n),s=e(o,t.commandMeta.autoCompletion),i=s+r,c=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:c,commandIsPending:!1}})},Ma=()=>{Xe(e=>({...e,commandIsPending:!0}))},W=e=>{Xe(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Pa=({addToHistory:e=!0})=>{Xe(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},La=()=>{Xe(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}})},ka=()=>{Xe(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},q=()=>ge,Da=()=>fm(ss,q,q),Fa=()=>{let[e,...t]=ge.value.split(os);return t.join(os).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",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function vm(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function ym(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function hm(e,t,n){let o=g().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:o?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:o?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:o?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:o?n.nextContainer:null}}function Ba(e,t){let n=q();if(e.sequence==="?"&&t!==f.PALETTE)return x.InitCommandPalette;if(e.sequence===":"&&t!==f.COMMAND_LINE)return x.InitCommandLine;if(t===f.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===f.COMMAND_LINE)return Ii(e,n.value);if(t===f.PALETTE)return bi(e,n.value);let o=vm(e)||ym(e);if(o)return xm(o,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"return":return x.Confirm;case"space":return x.Confirm;case"v":return _().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;default:return null}}function xm(e,t){let n=t===f.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 hm(g().contextNode.childRenderAxis,e,n)}var $o=e=>{let{context:t}=g().contextNode;if(!t)return P.None;switch(e){case h.EXIT:return P.Exit;case h.EXPORT:return P.Export;case h.COFFEE:return P.Coffee;case h.INIT:return P.Init;case h.DELETE:return P.Delete;case h.EDIT:return P.Edit;case h.COMMENT:return P.Comment;case h.HELP:return P.ViewHelp;case h.RE_OPEN_ISSUE:return P.ReopenIssue;case h.CLOSE_ISSUE:return P.CloseIssue;case h.TAG:return P.TagTicket;case h.UNTAG:return P.UntagTicket;case h.ASSIGN:return P.AssignUserToTicket;case h.UNASSIGN:return P.UnassignUserFromTicket;case h.NEW:return P.NewItem;case h.FILTER:return P.Filter;case h.MOVE:return P.Move;case h.PEEK:return P.Peek;case h.CONFIG:return P.Config;case h.SYNC:return P.Sync;default:return P.None}},P={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",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 fe}from"ulid";import ed from"node:fs";import Ym from"node:path";import Xm from"react";import{Box as Km}from"ink";import zo from"react";import Mm from"chalk";import{Box as cs,Text as Pm}from"ink";import Qe from"react";import{Text as Ua}from"ink";import Oa,{useEffect as Wa,useState as Im}from"react";var $a={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},xe=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=z(),o=$a[n]??$a.default,[r,s]=Im(0);if(Wa(()=>{s(0)},[o]),Wa(()=>{if(!e)return;let c=setInterval(()=>{s(u=>(u+1)%o.length)},500);return()=>clearInterval(c)},[e,o]),!e)return Oa.createElement(Ua,null,t);let i=o[r]??o[0]??t;return Oa.createElement(Ua,{color:y.accent,dimColor:r===1},i)};import{Box as ds,Text as bm}from"ink";import _o from"react";var Je=({children:e=[],height:t,selectedIndex:n,itemHeight:o=1,scrollByOne:r=!1})=>{if(e.length===0)return null;let s=Math.max(1,Math.floor(t)),i=Math.max(1,Math.ceil(o)),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=r?Math.min(m,Math.max(0,u-c+1)):Math.min(m,Math.floor(u/c)*c),v=p+c,S=e.slice(p,v),N=e.length>c,E=s,R=N?Math.max(1,Math.floor(c/e.length*E)):E,M=Math.max(0,E-R),D=Math.max(1,e.length-c),j=N?Math.floor(p/D*M):0;return _o.createElement(ds,{flexDirection:"row",height:s,width:"100%"},_o.createElement(ds,{flexDirection:"column",flexGrow:1,height:s},S),_o.createElement(ds,{flexDirection:"column",width:1,height:E},Array.from({length:E}).map((O,k)=>_o.createElement(bm,{key:k,color:N&&k>=j&&k<j+R?y.accent:y.secondary},N?"\u2502":" "))))};import{Box as jo,Text as Am}from"ink";import Xt from"react";import{Text as Cm}from"ink";import Sm from"react";var Nm=e=>e.toLowerCase().trim(),Em=(e,t=an)=>{let n=Nm(e);return t[n]?t[n]:wn(n)},Rt=({id:e,isSelected:t})=>{let n=I.getContributor(e);if(n)return Sm.createElement(Cm,{underline:t,color:Em(n.name)},"@"+n.name)};import{Text as Rm}from"ink";import Tm from"react";var gn=({id:e,isSelected:t})=>{let n=I.getTag(e);if(n)return Tm.createElement(Rm,{underline:t,backgroundColor:re(n.name),color:y.secondary}," "+n.name+" ")};var _a=({width:e,ticket:t,isSelected:n})=>{let o=e-14,r=ho(St(t.title),o),s=Fn(t),i=Bn(t);return Xt.createElement(jo,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?y.accent:y.secondary,justifyContent:"space-between"},Xt.createElement(jo,{borderBottom:!0},Xt.createElement(jo,{paddingLeft:1,flexDirection:"column"},Xt.createElement(Am,{color:y.primary},r))),Xt.createElement(jo,{flexDirection:"row",paddingLeft:1},s.map(c=>Xt.createElement(gn,{key:c.id,id:c.id})),i.map(c=>Xt.createElement(Rt,{key:c.id,id:c.id}))))};import{Box as Jt,Text as On}from"ink";import Re from"react";var wm=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,ja=({width:e,ticket:t,isSelected:n,index:o,mode:r})=>{let s=(t.props.tags??[]).map(D=>I.getTag(D)).filter(D=>!!D),i=(t.props.assignees??[]).map(D=>I.getContributor(D)).filter(D=>!!D),c=1,u=s.length*(1+c),m=i.length*(2+c),p=s.map(D=>Re.createElement(Jt,{key:D.id,paddingRight:c},Re.createElement(On,{color:re(D.name)},"\u25A0"))),v=i.map(D=>Re.createElement(Jt,{key:D.id,paddingRight:c},Re.createElement(On,{color:wn(D.name)},"@"+D.name.at(0)))),S=n?y.accent:r===f.MOVE?y.secondary:y.primary,N=4,E=I.getCommentsByIssue(t.id),R=E.length?String(E.length).length+2+c:0,M=E.length?Re.createElement(Jt,{paddingRight:c},Re.createElement(On,{color:y.accent},"[",E.length,"]")):null;return Re.createElement(Jt,{borderBottom:!0,justifyContent:"space-between"},Re.createElement(Jt,null,Re.createElement(Jt,{width:N},n?Re.createElement(xe,{isSelected:n}):Re.createElement(On,{color:"gray",dimColor:!0},o+1)),Re.createElement(On,{wrap:"truncate",color:S},wm(t.title,e-u-m-R-18))),Re.createElement(Jt,null,p,v,M))};var Lm=({swimlane:e,isSelected:t,width:n,height:o,isDense:r,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:u}=z(),m=u[e.id]??[],p=`${e.title} ${Mm.hex(y.secondary2).dim("("+m.length+")")}`,v=3,S=r?1:4,N=o-v-(r?2:1),E=Qe.createElement(cs,{borderStyle:"round",borderColor:y.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Qe.createElement(xe,{isSelected:t}),Qe.createElement(Pm,{bold:!0,color:t?y.accent:y.primary},p," ",e.readonly?"\u{1F512}":"")),R=(M,D)=>{let j=s&&i===D;return T(M)?r?Qe.createElement(ja,{key:M.id,index:D,width:n,ticket:M,isSelected:j,mode:c}):Qe.createElement(_a,{key:M.id,width:n,ticket:M,isSelected:j}):null};return Qe.createElement(cs,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?y.accent:y.secondary,paddingRight:1,paddingLeft:1,height:o},E,Qe.createElement(cs,{padding:r?1:0},m.length>0&&Qe.createElement(Je,{selectedIndex:i,height:N,itemHeight:S},m.map(R)),Qe.createElement(xe,{isSelected:s&&i===-1})))},Ha=Qe.memo(Lm);import{Box as Wn,Text as Qa}from"ink";import Te,{useMemo as Go}from"react";import{Box as Ho,Text as km}from"ink";import ct from"react";var Va=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:o}=z(),{title:r}=t,s=t.parentNodeId?I.getNode(t.parentNodeId):void 0,i=s&&T(s)?r===oe.ASSIGNEES?s.props.assignees??[]:r===oe.TAGS?s.props.tags??[]:[]:[];return ct.createElement(Ho,{alignItems:"center",paddingTop:1},ct.createElement(Ho,{minWidth:12},ct.createElement(xe,{isSelected:n}),ct.createElement(km,{color:n?y.accent:y.secondary2},r,":")),ct.createElement(Ho,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,u)=>{let m=o.id===t.id&&u===e;return ct.createElement(Ho,{key:`${r}-${c}`,paddingRight:2,minHeight:1},ct.createElement(xe,{isSelected:m}),r===oe.ASSIGNEES?ct.createElement(Rt,{isSelected:m,id:c}):r===oe.TAGS?ct.createElement(gn,{isSelected:m,id:c}):null)})))};import{Box as Vo,Text as ls}from"ink";import lt,{useEffect as Dm,useMemo as Ga}from"react";var Fm="\u2029",za=(e,t)=>`${e}::inline-line::${t}`,us=new Map,Ka=e=>{let t=us.get(e)??[];us.delete(e);for(let n of t)I.deleteNode(n)},Bm=(e,t)=>{Ka(e);let n=[];t.forEach((o,r)=>{let s=Be(BigInt(r+1));if(!Z(s))return;let i=I.createNode(Y.text({id:za(e,r),name:`Line ${r+1}`,parentNodeId:e,rank:s.value,props:{value:o},readonly:!0,isVirtual:!0}));Z(i)&&n.push(i.value.id)}),us.set(e,n)},ms=({id:e,label:t,text:n,height:o,selected:r,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=z(),u=Ga(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=Ga(()=>u.join("\0"),[u]);Dm(()=>(Bm(e,u),()=>{Ka(e)}),[e,m]);let p=S=>String(S).replace(/\r?\n/g,""),v=u.map((S,N)=>{let E=c.id===e&&i===N;return lt.createElement(Vo,{key:za(e,N)},lt.createElement(ls,{color:E?y.primary:y.secondary2,dimColor:!E},`${N+1} `.padStart(5,"\xA0")),lt.createElement(ls,{backgroundColor:E?"gray":void 0},p(S.length?ho(S,s-10):Fm)))});return lt.createElement(Vo,{flexDirection:"column",paddingTop:1},lt.createElement(Vo,null,lt.createElement(xe,{isSelected:r}),lt.createElement(ls,{color:r?y.accent:y.secondary2},t)),lt.createElement(Vo,{flexDirection:"row",borderStyle:"round",borderColor:y.secondary,paddingLeft:1,marginLeft:1},lt.createElement(Je,{scrollByOne:!0,height:o-3,selectedIndex:i,itemHeight:1},v)))};import{Box as Tt,Text as ut}from"ink";import de,{useEffect as Um,useMemo as Om,useRef as Wm}from"react";import{decodeTime as ps}from"ulid";var qa=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},Ya=(e,t,n)=>Y.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});var $m=e=>Se(e,"comments"),_m=e=>I.getCommentsByIssue(e.id).sort((t,n)=>ps(t.id)-ps(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Xa=e=>{for(let t of e)I.deleteNode(t.id)},jm=(e,t)=>{let n=I.getNode($m(e.id));if(!n||!Ke(n))return[];let o=t.map((r,s)=>Ya(r,s,n.id)).map(I.createNode).filter(Z).map(({value:r})=>r).filter(Tn);return t.length>0&&g().selectedIndex<0&&A.navigate({contextNode:n,selectedIndex:0}),o},Hm=(e,t)=>{let n=e.replace(/\s+/g," ").trim();return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}\u2026`};function Ja({ticket:e,width:t,height:n}){let o=Om(()=>_m(e),[e]),r=Wm([]);Um(()=>(Xa(r.current),r.current=jm(e,o),()=>{Xa(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=z(),c=Math.max(1,n-4),u=Math.max(20,t-8);return o.length===0?de.createElement(Tt,{flexDirection:"column",width:t,height:n,padding:1},de.createElement(ut,{color:y.primary},"No comments yet."),de.createElement(Tt,{paddingTop:1},de.createElement(ut,{color:y.primary},"Use"),de.createElement(ut,{color:y.accent}," :comment "),de.createElement(ut,{color:y.primary},"to add the first one."))):de.createElement(Tt,{flexDirection:"column",width:t,height:n},de.createElement(Tt,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},de.createElement(ut,{color:y.secondary2},"Comments (",o.length,") ")),de.createElement(Je,{height:c,itemHeight:4,selectedIndex:s},o.map((m,p)=>{let v=p===s;return de.createElement(Tt,{key:m.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},de.createElement(Tt,{flexDirection:"row",paddingBottom:1},de.createElement(ut,{color:y.accent},v?"\u276F ":" "),de.createElement(Tt,{paddingLeft:1},de.createElement(ut,{color:y.secondary2},`#${p+1} `),de.createElement(Rt,{id:m.authorId}),de.createElement(ut,{color:y.secondary2}," "+bo(ps(m.id))))),de.createElement(Tt,{paddingLeft:3,paddingBottom:1},de.createElement(ut,{color:y.primary},Hm(m.md,u))))})))}var Vm=e=>Se(e,"description"),Gm=e=>Se(e,"comments"),zm=e=>Se(e,"history"),Za=({ticket:e,height:t})=>{let n=Go(()=>qa(e),[e]),{selectedIndex:o,contextNode:r}=z(),s=process.stdout.columns||120,i=Go(()=>Vm(e.id),[e.id]),c=Go(()=>Gm(e.id),[e.id]),u=Go(()=>zm(e.id),[e.id]),m=r.id===e.id,p=r.id===c||r.parentNodeId===c,v=r.id===u||r.parentNodeId===u,S=$(e.id);if(p){let k=t-3;return Te.createElement(Wn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Te.createElement(Ja,{ticket:e,width:s,height:k}))}if(v){let O=I.getNode(u),k=O&&Ke(O)?O.props.value??"":"",ft=t-3;return Te.createElement(Wn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},O?Te.createElement(ms,{id:O.id,label:"Event log",text:k,selected:!1,maxWidth:s,height:ft}):null)}let N=S.reduce((O,k)=>Rn(k)||k.id===c||k.id===u?O+1:O,0),E=2,R=3,M=N,D=t-R-M-E,j=(O,k)=>O.id===i?Te.createElement(ms,{key:O.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:k,maxWidth:s,height:D}):Rn(O)?Te.createElement(Va,{key:O.id,parent:O,selected:k,selectedIndex:o}):O.id===c?Te.createElement(Wn,{key:O.id,paddingTop:1},Te.createElement(xe,{isSelected:k}),Te.createElement(Qa,{backgroundColor:y.secondary,color:k?y.accent:y.primary},` Comments (${n}) \u203A\u203A `)):O.id===u?Te.createElement(Wn,{key:O.id,paddingTop:1},Te.createElement(xe,{isSelected:k}),Te.createElement(Qa,{backgroundColor:y.secondary,color:k?y.accent:y.primary}," History \u203A\u203A ")):null;return Te.createElement(Wn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S.map((O,k)=>j(O,m&&o===k)))};var qm=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,viewMode:s,height:i,width:c})=>{let u=t.context,m=u===w.TICKET||u===w.FIELD_LIST||u===w.FIELD,p=u===w.BOARD||u===w.SWIMLANE,v=u===w.TICKET?t:o.find(M=>M.context===w.TICKET),S=Math.floor(c/3),N=Math.floor(c/Math.max(e.length,1)),E=Math.min(N,S),R=s==="dense";return zo.createElement(Km,{flexDirection:"row",height:i},p&&e.map((M,D)=>{let j=t.id===M.id,O=j?n:-1,k=t.context===w.BOARD&&n===D;return zo.createElement(Ha,{key:M.id,height:i,width:E,swimlane:M,isSelected:k,isDense:R,isFocused:j,listSelectedIndex:O,mode:r})}),m&&v&&zo.createElement(Za,{height:i,ticket:v}))},Ko=zo.memo(qm);import{render as Jm}from"ink";import{Writable as Qm}from"node:stream";var $n=e=>String(e).padStart(2,"0"),Zm=e=>{let t=e.getUTCFullYear(),n=$n(e.getUTCMonth()+1),o=$n(e.getUTCDate()),r=$n(e.getUTCHours()),s=$n(e.getUTCMinutes()),i=$n(e.getUTCSeconds());return`${t}-${n}-${o}_${r}-${s}-${i}`},ep=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",tp=async(e,{width:t,height:n})=>{let o="",r=new Qm({write(i,c,u){let m=np(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(o=m),u()}});r.columns=t,r.rows=n,r.isTTY=!0;let s=Jm(e,{stdout:r,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),o},np=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),td=async()=>{let{viewMode:e}=_(),{contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,renderedChildrenIndex:s}=g(),i=o.find(D=>D.context==="BOARD");if(!i)return a("No board found to export");let c=120,u=40,m=await tp(Xm.createElement(Ko,{height:u,width:c,swimlanes:(s[i.id]??[]).filter(D=>D!==void 0&&Ct(D)),contextNode:t,selectedIndex:n,breadCrumb:o,viewMode:e??"dense",mode:r}),{width:c,height:u});if(!m)return a("Failed to render board export");let p=ro(process.cwd());if(d(p))return a("Unable to export, epiq root not found");let v=new Date,S=Zm(v),N=`board_${ep(i.title)}_${S}.md`,E=Gs(p.value);ed.mkdirSync(E,{recursive:!0});let R=Ym.join(E,N),M=`# Board - ${i.title}
45
45
  Date: ${v.toISOString()}
46
46
 
47
47
  \`\`\`text
48
48
  ${m}
49
49
  \`\`\`
50
- `;return Xa.writeFileSync(R,D,"utf8"),l("Exported board layout",R)};import ep from"node:os";import td from"node:path";import{z as At}from"zod";import{accessSync as zm,copyFileSync as qm,existsSync as Go,mkdirSync as Qa,readdirSync as Za,readFileSync as Ym,renameSync as Xm,rmSync as Jm,statSync as ed,unlinkSync as Qm,writeFileSync as Zm}from"node:fs";import vn from"node:path";var ps=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",Ae={writeToFile:(e,t)=>{try{let n=vn.dirname(e);Go(n)||Qa(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);Zm(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Ym(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Ae.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 Go(e)&&ed(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await zm(e),!0}catch{return!1}},mkDir:e=>Qa(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=vn.parse(t);for(;;){let o=vn.join(t,e);try{if(Go(o)&&ed(o).isDirectory())return o}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=vn.dirname(t)}return null},readFirstJSON(e){try{if(!Ae.dirExists(e))return null;let t=Za(e).filter(o=>o.endsWith(".json")).sort()[0];if(!t)return null;let n=vn.join(e,t);return Ae.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Ae.dirExists(e)?Za(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Qm(e)}catch(t){(!ps(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Jm(e,{recursive:!0,force:!0})}catch(t){(!ps(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(vn.dirname(t)),!n?.overwrite&&Go(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Xm(e,t)}catch(o){if(ps(o)&&o.code==="EXDEV"){qm(e,t),this.rmFile(e);return}throw o}}};var tp={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},nd=At.object({logLevel:At.enum(["info","error","debug"]),preferredEditor:At.string().optional(),userName:At.string().optional(),userId:At.string().optional(),autoSync:At.boolean().nullable().optional(),autoSyncDebounceMs:At.number().optional(),viewMode:At.enum(["dense","wide"]).optional()}).partial(),np="config.json",od=()=>td.join(ep.homedir(),ke),gs=()=>td.join(od(),np),fs=()=>{try{return Ae.mkDir(od()),l(`Ensured ~/${ke} exists`,null)}catch{return a(`Unable to create ~/${ke}`)}},op=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${ke}/config.json JSON`)}let n=nd.safeParse(t??{});return n.success?l("Parsed config",n.data):a(`Invalid ~/${ke}/config.json shape: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Wn=()=>{let e=fs();if(d(e))return a(e.message);let t=gs(),n=Ae.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):op(n)},rd=e=>{let t=fs();if(d(t))return a(t.message);let n=nd.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`);let o=gs();try{return Ae.writeToFile(o,JSON.stringify(n.data,null,2)+`
51
- `),l("Config written",null)}catch{return a(`Unable to write ~/${ke}/config.json`)}},mt=e=>{let t=Wn();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return rd(n)},_n=()=>{let e=gs(),t=fs();if(d(t))return a(`Unable to create ~/${ke}`);if(!(Ae.readFile(e)!==null)){let p=rd(tp);if(d(p))throw new Error(`Unable to create ~/${ke}/config.json`)}let o=Wn();if(d(o))throw new Error(o.message||"Unable to load settings");let{preferredEditor:r,userName:s,userId:i,autoSync:c,autoSyncDebounceMs:u,logLevel:m}=o.value;return!s||!i?a(`User name or ID not configured in ~/${ke}/config.json`):(process.env.EPIQ_LOG_LEVEL=m,l("successfully loaded settings",{logLevel:m??"debug",preferredEditor:r??"",userName:s,userId:i,autoSync:c??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"}))};var Ko=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o&&o.action==="close.issue"&&o.payload.id===e.id){for(let r=n-1;r>=0;r--){let s=t[r];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 DN}from"react";var zo,rp=new Set,sd=()=>{for(let e of rp)e()};var wt=()=>{if(!zo)throw new Error("Ui state not initialized. Call initUiState() first.");return zo};var id=(e={})=>(zo=e,sd(),l("UX state initialized",null)),sp=e=>{let t=wt();return zo=e(t),sd(),l("UX state updated",null)},Mt=e=>sp(t=>({...t,...e}));import{spawn as ip}from"node:child_process";function vs(e){let t=process.platform,r=ip(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return r.unref(),r.on("error",()=>{}),!0}import{ulid as ys}from"ulid";import{spawnSync as ap}from"node:child_process";import dp from"node:os";import ad from"node:path";import{ulid as cp}from"ulid";function lp(){let{preferredEditor:e}=_(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function up(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function dd(e){let t=ad.join(dp.tmpdir(),"epiq");Ae.mkDir(t);let n=ad.join(t,cp());Ae.writeToFile(n,e??"");let o=lp();for(let r of o){let s=up(r,n),i=ap(s,{stdio:"inherit",shell:!0});if(!i.error&&i.status===0){let c=Ae.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 cd=async e=>{let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(o&&An(o))return mp(e);if(e.modifier===Ye.DESCRIPTION)return pp();if(e.modifier===Ye.TITLE){let r=X();if(d(r))return a("Unable to resolve user ID");let s=o;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 je();return d(c)?c:F([{id:ys(),action:"edit.title",payload:{id:s.id,name:i},...r.value}],c.value)}return a("Unknown edit command")},mp=async e=>{let t=X();if(d(t))return a("Unable to resolve user ID");let{contextNode:n,selectedIndex:o}=g(),r=W(n.id)[o];if(!r||!An(r))return a("Select a comment first");if(r.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||!A(i))return a("Unable to resolve comment issue");if(i.readonly)return a("Cannot edit readonly issue");let c=r.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 je();if(d(p))return p;let v=p.value;return F([{id:ys(),action:"edit.issue.comment",payload:{id:u.id,issue:i.id,md:m},...t.value}],v)},pp=async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let t=await je();if(d(t))return t;let n=t.value,{breadCrumb:o,selectedNode:r}=g(),s=Se([...o,r],"TICKET");if(d(s))return a("Edit target must be an issue");let i=s.value;if(!A(i))return a("Edit target must be an issue");if(i.readonly)return a("Cannot edit readonly issue");let c=W(i.id).find(v=>v.title===ne.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=dd(u);if(d(m))return a("Failed to edit field");let p=m.value;return p===u?l("No changes made",null):F([{id:ys(),action:"edit.description",payload:{id:i.id,md:p},...e.value}],n)};import fp from"node:fs";import ud from"node:path";import xs from"node:fs";import gp from"node:path";var ld=async e=>{let t=gp.join(e,".gitignore"),n=xs.existsSync(t)?xs.readFileSync(t,"utf8"):"",o=[".epiq/events/",".epiq/log/"],r=n.split(`
50
+ `;return ed.writeFileSync(R,M,"utf8"),l("Exported board layout",R)};import lp from"node:os";import sd from"node:path";import{z as At}from"zod";import{accessSync as op,copyFileSync as rp,existsSync as qo,mkdirSync as nd,readdirSync as od,readFileSync as sp,renameSync as ip,rmSync as ap,statSync as rd,unlinkSync as dp,writeFileSync as cp}from"node:fs";import fn from"node:path";var gs=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",Ae={writeToFile:(e,t)=>{try{let n=fn.dirname(e);qo(n)||nd(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);cp(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return sp(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Ae.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 qo(e)&&rd(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await op(e),!0}catch{return!1}},mkDir:e=>nd(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=fn.parse(t);for(;;){let o=fn.join(t,e);try{if(qo(o)&&rd(o).isDirectory())return o}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=fn.dirname(t)}return null},readFirstJSON(e){try{if(!Ae.dirExists(e))return null;let t=od(e).filter(o=>o.endsWith(".json")).sort()[0];if(!t)return null;let n=fn.join(e,t);return Ae.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Ae.dirExists(e)?od(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{dp(e)}catch(t){(!gs(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{ap(e,{recursive:!0,force:!0})}catch(t){(!gs(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(fn.dirname(t)),!n?.overwrite&&qo(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{ip(e,t)}catch(o){if(gs(o)&&o.code==="EXDEV"){rp(e,t),this.rmFile(e);return}throw o}}};var up={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},id=At.object({logLevel:At.enum(["info","error","debug"]),preferredEditor:At.string().optional(),userName:At.string().optional(),userId:At.string().optional(),autoSync:At.boolean().nullable().optional(),autoSyncDebounceMs:At.number().optional(),viewMode:At.enum(["dense","wide"]).optional()}).partial(),mp="config.json",ad=()=>sd.join(lp.homedir(),ke),fs=()=>sd.join(ad(),mp),vs=()=>{try{return Ae.mkDir(ad()),l(`Ensured ~/${ke} exists`,null)}catch{return a(`Unable to create ~/${ke}`)}},pp=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${ke}/config.json JSON`)}let n=id.safeParse(t??{});return n.success?l("Parsed config",n.data):a(`Invalid ~/${ke}/config.json shape: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},_n=()=>{let e=vs();if(d(e))return a(e.message);let t=fs(),n=Ae.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):pp(n)},dd=e=>{let t=vs();if(d(t))return a(t.message);let n=id.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`);let o=fs();try{return Ae.writeToFile(o,JSON.stringify(n.data,null,2)+`
51
+ `),l("Config written",null)}catch{return a(`Unable to write ~/${ke}/config.json`)}},mt=e=>{let t=_n();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return dd(n)},jn=()=>{let e=fs(),t=vs();if(d(t))return a(`Unable to create ~/${ke}`);if(!(Ae.readFile(e)!==null)){let p=dd(up);if(d(p))throw new Error(`Unable to create ~/${ke}/config.json`)}let o=_n();if(d(o))throw new Error(o.message||"Unable to load settings");let{preferredEditor:r,userName:s,userId:i,autoSync:c,autoSyncDebounceMs:u,logLevel:m}=o.value;return!s||!i?a(`User name or ID not configured in ~/${ke}/config.json`):(process.env.EPIQ_LOG_LEVEL=m,l("successfully loaded settings",{logLevel:m??"debug",preferredEditor:r??"",userName:s,userId:i,autoSync:c??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"}))};var Yo=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o&&o.action==="close.issue"&&o.payload.id===e.id){for(let r=n-1;r>=0;r--){let s=t[r];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 JS}from"react";var Xo,gp=new Set,cd=()=>{for(let e of gp)e()};var wt=()=>{if(!Xo)throw new Error("Ui state not initialized. Call initUiState() first.");return Xo};var ld=(e={})=>(Xo=e,cd(),l("UX state initialized",null)),fp=e=>{let t=wt();return Xo=e(t),cd(),l("UX state updated",null)},Mt=e=>fp(t=>({...t,...e}));import{spawn as vp}from"node:child_process";function ys(e){let t=process.platform,r=vp(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return r.unref(),r.on("error",()=>{}),!0}import{ulid as hs}from"ulid";import{spawnSync as yp}from"node:child_process";import hp from"node:os";import ud from"node:path";import{ulid as xp}from"ulid";function Ip(){let{preferredEditor:e}=_(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function bp(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function md(e){let t=ud.join(hp.tmpdir(),"epiq");Ae.mkDir(t);let n=ud.join(t,xp());Ae.writeToFile(n,e??"");let o=Ip();for(let r of o){let s=bp(r,n),i=yp(s,{stdio:"inherit",shell:!0});if(!i.error&&i.status===0){let c=Ae.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 pd=async e=>{let{contextNode:t,selectedIndex:n}=g(),o=$(t.id)[n];if(o&&Tn(o))return Cp(e);if(e.modifier===$e.DESCRIPTION)return Sp();if(e.modifier===$e.TITLE){let r=X();if(d(r))return a("Unable to resolve user ID");let s=o;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 Ve();return d(c)?c:F([{id:hs(),action:"edit.title",payload:{id:s.id,name:i},...r.value}],c.value)}return a("Unknown edit command")},Cp=async e=>{let t=X();if(d(t))return a("Unable to resolve user ID");let{contextNode:n,selectedIndex:o}=g(),r=$(n.id)[o];if(!r||!Tn(r))return a("Select a comment first");if(r.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||!T(i))return a("Unable to resolve comment issue");if(i.readonly)return a("Cannot edit readonly issue");let c=r.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 Ve();if(d(p))return p;let v=p.value;return F([{id:hs(),action:"edit.issue.comment",payload:{id:u.id,issue:i.id,md:m},...t.value}],v)},Sp=async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let t=await Ve();if(d(t))return t;let n=t.value,{breadCrumb:o,selectedNode:r}=g(),s=Ee([...o,r],"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=$(i.id).find(v=>v.title===oe.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=md(u);if(d(m))return a("Failed to edit field");let p=m.value;return p===u?l("No changes made",null):F([{id:hs(),action:"edit.description",payload:{id:i.id,md:p},...e.value}],n)};import Ep from"node:fs";import fd from"node:path";import xs from"node:fs";import Np from"node:path";var gd=async e=>{let t=Np.join(e,".gitignore"),n=xs.existsSync(t)?xs.readFileSync(t,"utf8"):"",o=[".epiq/events/",".epiq/log/"],r=n.split(`
52
52
  `).map(u=>u.trim()),s=o.filter(u=>!r.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(`
53
53
  `);return n=n.trimEnd()+`
54
54
 
55
55
  ${c}
56
- `,xs.writeFileSync(t,n,"utf8"),ee.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var vp=async e=>{let t=await B({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},z=(e,t)=>a(`[${e}] ${t}`),md=async()=>{$("");let e=tn(),t=await ht(process.cwd());if(d(t))return z(1,t.message);let n=t.value,o=await io(n);if(d(o))return z(2,o.message);if(o.value)return z(2,`Cannot initialize Epiq while a git operation is in progress: ${o.value}`);let r=await vp(n);if(d(r))return z(2.5,r.message);if(r.value)return z(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Cr(n))return z(4,"Epiq project already initialized");let s=St();if(!s.isSetupDone||!s.userName)return z(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let i=_(),c=i.userName,u=i.userId;if(!u||!c)return z(5,"Missing Epiq user id");let m=e.stateBranch,p=await co({repoRoot:n,branch:m});if(d(p))return z(6,p.message);if(p.value)return z(6,`State branch already exists: ${m}`);let v=await kr({repoRoot:n,stateBranchName:m});if(d(v))return z(6,v.message);let C=mo();if(d(C))return z(7,C.message);let E=ud.join(uo(),e.projectId),S=await $t({repoRoot:n,stateBranchRoot:E,stateBranchName:m});if(d(S))return z(8,S.message);let R=ud.join(E,".epiq");fp.mkdirSync(R,{recursive:!0});let D=oa({userId:u,userName:c});if(d(D))return z(9,D.message);for(let Ir of D.value){let js=So({event:Ir,rootDir:E});if(d(js))return z(9,js.message)}let P=await po({stateBranchRoot:E,eventFileName:Vt({userId:u,userName:c})});if(d(P))return z(10,P.message);let V=await on({cwd:E,message:"[epiq:init]"});if(d(V))return z(10,V.message);let O=await ld(n);if(d(O))return z(11,O.message);let k=zs({repoRoot:n,fileContents:e});if(d(k))return z(12,k.message);let Ee=await te.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(Ee))return z(13,Ee.message);let ft=await te.commit({cwd:n,message:"[epiq:init-project]"});if(d(ft))return z(13,ft.message);let vt="Project initialized!",yt=await B({cwd:n,args:["push","-u","origin","HEAD"]});d(yt)&&(vt+=` Warn: [init:14] ${yt.message}`);let le=await Rn({repoRoot:n,stateBranchRoot:E});d(le)&&(vt+=` Warn: [init:15] ${le.message}`);let en=Ht(D.value).filter(d);if(en.length>0)return z(16,en.map(Ir=>Ir.message).join(`
57
- `));let Ot=ze();if(d(Ot))return z(16,Ot.message);let{rootNodeId:zc,nodes:qc}=Ot.value,_s=qc[zc];return _s?(T.navigate({contextNode:_s,selectedIndex:0}),N({hasProjectDefinition:!0,mode:f.DEFAULT}),l(vt,null)):z(16,"Unable to resolve initialized root node")};import{ulid as xp}from"ulid";import{ulid as yp}from"ulid";var pd=null,Pt=()=>structuredClone(pd),jn=e=>{pd=e},gd=()=>{let{contextNode:e,selectedIndex:t}=g(),o=j(e.id)[t];return o?l("Resolved selected child",o):a("Target node not found")},hs=({id:e,parentId:t,position:n={at:"end"}})=>{let o=j(t).filter(r=>r.id!==e);return Eo(o,n)},fd=({id:e,parentId:t,position:n={at:"end"}})=>{let o=X();if(d(o))return a("Unable to resolve user ID");let r=hs({parentId:t,id:e,position:n});return d(r)?r:l("Created pending move state",{id:yp(),...o.value,action:"move.node",payload:{id:e,parent:t,rank:r.value.rank}})},vd=e=>{jn(e);let t=Pn(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function Is(e){let t=gd();if(d(t))return t;let{contextNode:n,nodes:o}=g();if(!n.parentNodeId)return a("Missing parent node id");let r=o[n.parentNodeId];if(!r)return a("Missing parent node");let s=j(r.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=fd({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:vd(u.value)}function bs(e){let t=gd();if(d(t))return t;let{contextNode:n,selectedIndex:o}=g(),s=j(n.id)[o+e];if(!s)return a("Missing sibling node");let i=fd({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(i)?i:vd(i.value)}var yd=()=>{let e=Pt();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,o=g().nodes[n];if(!o)return a("Move parent not found");let r=j(n).findIndex(s=>s.id===t);return r===-1?a("Moved node not found among rendered children"):(T.navigate({contextNode:o,selectedIndex:r}),l("Synchronized navigation to moved node",null))},qo=(e,t="Moved preview")=>{if(d(e))return e;let n=yd();return d(n)?n:(N({mode:f.MOVE}),l(t,null))},xd=async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=q().commandMeta,{contextNode:n,selectedIndex:o}=g(),r=j(n.id)[o];if(!r)return N({mode:f.DEFAULT}),a("No move target");if(t==="start"){if(r.readonly)return a("Target node is read-only");if(o===-1)return a("No item selected");if(!r.parentNodeId)return a("Target has no parent");let s=j(r.parentNodeId),i=s.findIndex(({id:v})=>v===r.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=hs({parentId:r.parentNodeId,id:r.id,position:m});return d(p)?p:(jn({id:xp(),action:"move.node",payload:{id:r.id,parent:r.parentNodeId,rank:p.value.rank},...e.value}),N({mode:f.MOVE}),l("Move initialized",null))}if(t==="next")return qo(bs(1));if(t==="previous")return qo(bs(-1));if(t==="to-next")return qo(Is(1));if(t==="to-previous")return qo(Is(-1));if(t==="confirm"){let s=Pt();if(!s)return a("No pending move to confirm");let i=await je();if(d(i))return i;let c=F([s],i.value);if(d(c))return c;let u=yd();return d(u)?u:(jn(null),N({mode:f.DEFAULT}),l("Moved item",null))}return t==="cancel"?(jn(null),N({mode:f.DEFAULT}),l("Cancelling move",null)):a("Invalid move modifier")};import{ulid as Xo}from"ulid";import{monotonicFactory as hp,ulid as Ip}from"ulid";var bp=hp(),Yo=({name:e,parent:t,rank:n,user:{userId:o,userName:r}})=>{let s=bp();return l("Created issue events",[{id:Ip(),userId:o,userName:r,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var hd=async(e,t)=>{let n=X();if(d(n))return a("Unable to resolve user ID");let o=await je();if(d(o))return o;let r=o.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=F([m],r);if(d(p))return p;let v=I.getNode(p.value[0].result.id);if(!v)return a("Created node not found");if(!v.parentNodeId)return p;let C=I.getNode(v.parentNodeId);return C?(T.navigate({contextNode:C,selectedIndex:I.getSiblings(v.parentNodeId).findIndex(({id:E})=>E===v.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 v=cn(p.id,n.value,r);return d(v)?v:u({id:Xo(),action:"add.board",payload:{id:Xo(),name:t.inputString,parent:p.id,rank:v.value},...n.value})}if(t.modifier==="swimlane"){let m=Se(s,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=cn(m.value.id,n.value,r);return d(p)?p:u({id:Xo(),action:"add.swimlane",payload:{id:Xo(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=W(i.id)[c],p=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let V=Se(s,"SWIMLANE");return d(V)?null:V.value})();if(!p)return a("Unable to add issue in this context");let v=cn(p.id,n.value,r);if(d(v))return v;let C=Yo({name:t.inputString,parent:p.id,rank:v.value,user:n.value});if(d(C))return C;let E=C.value,S=F([...E],r);if(d(S))return S;if(!S.value[0])return a("Issue creation failed");let P=E.find(V=>V.action==="add.issue")?.payload.id;return P?(T.navigate({contextNode:p,selectedIndex:I.getSiblings(p.id).findIndex(({id:V})=>V===P)}),l("Issue created",null)):a("Unable to determine ticket id")}return l("Success",null)};var Id=async()=>{let e=Se(g().breadCrumb,"BOARD");if(d(e))return e;let t=await ht(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Oe({repoRoot:t.value});if(d(n))throw new Error(n.message);let{modifier:o}=q().commandMeta;if(o==="now"){let S=at(n.value);if(d(S))return a(S.message);let R=Hn();if(d(R))return R;let P=Ht(S.value).filter(d);return P.length>0?a(P.map(V=>V.message).join(", ")):(N({mode:f.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),l("Peeking now",!0))}let r;if(o==="prev"){let S=g().eventLog.at(-1),R=_r(S);if(R===null)return a("No previous event to peek");r=R}else if(o==="next"){let S=g().unappliedEvents.at(0),R=_r(S);if(R===null)return a("No next event to peek");r=R+1}else{let S=ko(o);if(!S)return a("Invalid peek date");r=S.getTime()}let s=g(),i=e.value.id,c=Wi(n.value,r);if(d(c))return a(c.message);let{appliedEvents:u,unappliedEvents:m}=c.value,p=Hn();if(d(p))return p;let C=Ht(u).filter(d);if(C.length>0)return Hn(),N(s),a(C.map(S=>S.message).join(", "));let E=g().nodes[i];return E?(T.navigate({contextNode:E,selectedIndex:0}),N({mode:f.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),l("Peeking",!0)):(Hn(),N(s),a("Board did not exist at peek date"))};import Cp from"zod";var bd=()=>{let e=q().commandMeta.inputString,t=Cp.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=mt({autoSyncDebounceMs:t.data});return d(n)?n:(Fe({autoSyncIntervalMs:t.data}),N({mode:f.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var Cd=()=>{let e=q().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=la(e),n=mt({autoSync:t});return d(n)?n:(Fe({autoSync:t}),N({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Nd=()=>{let e=q().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=mt({logLevel:e});return d(n)?n:(Fe({logLevel:e}),N({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Sd=async()=>{$(""),N({mode:f.DEFAULT});let e=ze();if(d(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");N({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Ao();return d(t)?(N({syncStatus:{msg:t.message,status:"failed"}}),t):(N({mode:f.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var Np=e=>e.action==="add.issue.comment",Ed=e=>Object.values(g().tags).find(t=>t.name===e),Rd=e=>Object.values(g().contributors).find(t=>t.name===e),pt=async()=>{let e=await je();return d(e)?e:l("Resolved persist root",e.value)},Jo=[{systemOnly:!0,intent:M.Move,description:"Internal move-state command",mode:f.COMMAND_LINE,action:xd},{intent:M.Delete,description:"Delete the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(!o)return a("Unable to resolve child to delete");let r=await pt();if(d(r))return r;if(o.context==="COMMENT"){let s=o.id,i=A(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let c=g().nodes[i];if(!c||!A(c))return a("Unable to resolve comment issue");let u=c.log?.filter(Np).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?a("You can only delete your own comments"):F([{id:fe(),action:"delete.issue.comment",payload:{id:s,issue:i},...e.value}],r.value):a("Unable to resolve comment")}return F([{id:fe(),action:"delete.node",payload:{id:o.id},...e.value}],r.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:f.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=q().commandMeta,n=/(!=|=)/,[o]=e.split(n);if(!o||!(i=>ie(h.FILTER).map(c=>c.split(n)[0]).includes(i))(o))return a("Invalid filter modifier");let s={target:o,operator:"=",value:t.trim()};return ue(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:f.DEFAULT})),l("Filter updated",null)}},{intent:M.ViewHelp,description:"Open the help screen",mode:f.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return Mt({pendingNavTarget:{contextNode:e,breadCrumb:o,selectedIndex:t,selectedNode:n}}),N({mode:f.HELP}),l("Viewing help",null)}},{intent:M.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(!o)return a("Unable to close issue, no target found");if(!A(o))return a("Cannot close in this context");let r=g().nodes[de];if(!r)return a("Unable to locate closed swimlane");if(o.parentNodeId===r.id)return a("Issue is already closed");let s=await pt();if(d(s))return s;let i=s.value,c=Gt(r.id,o.id,{at:"end"},e.value,i);if(d(c))return c;let u=F([{id:fe(),action:"close.issue",payload:{id:o.id,parent:r.id,rank:c.value},...e.value}],i);return d(u)?u:l("Issue closed",null)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(!o)return a("Unable to reopen issue, no target found");let r=o.context==="TICKET"?l("Resolved ticket",o):it(o.id,"TICKET");if(d(r))return a("Cannot reopen in this context");let s=r.value,i=g().nodes[de];if(!i)return a("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return a("Issue is not closed");if(!A(s))return a("Target node is not issue");let c=Ko(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 pt();if(d(m))return m;let p=m.value,v=Gt(u.id,s.id,{at:"end"},e.value,p);if(d(v))return v;let C=F([{id:fe(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:v.value},...e.value}],p);return d(C)?C:l("Issue reopened",null)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Init,description:"Initialize Epiq in the current git repository",mode:f.COMMAND_LINE,action:md},{intent:M.NewItem,description:"Create a new board, swimlane, or issue",mode:f.COMMAND_LINE,action:hd,onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Rename,description:"itle] Rename the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(!o)return a("Missing node");if(o.readonly)return a("Cannot rename readonly node");let r=Pa();if(!r)return a("Provide a title");let s=await pt();return d(s)?s:F([{id:fe(),action:"edit.title",payload:{id:o.id,name:r},...e.value}],s.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.UntagTicket,description:"Remove a tag from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide a tag");let r=Ed(o);if(!r)return a(`Tag "${o}" 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(!A(c))return a("Target node is not issue");if(!(c.props.tags??[]).includes(r.id))return a("Issue is not tagged with that tag");let m=await pt();return d(m)?m:F([{id:fe(),action:"remove.issue.tag",payload:{id:c.id,tag:r.id},...e.value}],m.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.TagTicket,description:"Add or create a tag on the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide a tag");let{selectedNode:r}=g();if(!r)return a("Invalid tag target");let s=it(r.id,"TICKET");if(d(s))return a("Unable to tag issue in this context");let i=s.value;if(!A(i))return a("Target node is not issue");let c=await pt();if(d(c))return c;let u=Ed(o),m=u?.id??fe();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):F([...u?[]:[{id:fe(),action:"create.tag",payload:{id:m,name:o},...e.value}],{id:fe(),action:"add.issue.tag",payload:{id:i.id,tag:m},...e.value}],c.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.AssignUserToTicket,description:"Assign a user to the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide an assignee");let{selectedIndex:r,contextNode:s}=g(),i=W(s.id)[r];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(!A(u))return a("Target node is not issue");let m=await pt();if(d(m))return m;let p=Rd(o),v=p?.id??fe();return(u.props.assignees??[]).includes(v)?a("Assignee already assigned"):F([...p?[]:[{id:fe(),action:"create.contributor",payload:{id:v,name:o},...e.value}],{id:fe(),action:"add.issue.assignee",payload:{id:u.id,assignee:v},...e.value}],m.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide an assignee to remove");let r=Rd(o);if(!r)return a(`Assignee "${o}" 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(!A(c))return a("Target node is not issue");if(!(c.props.assignees??[]).includes(r.id))return a(`Issue is not assigned to "${o}"`);let m=await pt();return d(m)?m:F([{id:fe(),action:"remove.issue.assignee",payload:{id:c.id,assignee:r.id},...e.value}],m.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Comment,description:"Add a comment to the selected issue",mode:f.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return a("Provide a comment");if(n.length>mn)return a(`Cannot exceed ${mn} characters`);let o=X();if(d(o))return a("Unable to resolve user ID");let{breadCrumb:r,selectedNode:s}=g(),i=Se([...r,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(!A(m))return a("Target node is not issue");let p=await pt();return d(p)?p:F([{id:fe(),action:"add.issue.comment",payload:{id:fe(),issue:m.id,author:o.value.userId,md:n},...o.value}],p.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Sync,description:"Pull, commit, and push Epiq state",mode:f.COMMAND_LINE,action:Sd},{intent:M.Peek,description:"View board state at another point in time",mode:f.COMMAND_LINE,action:Id},{intent:M.Export,description:"Export the current board layout to markdown",mode:f.COMMAND_LINE,action:async()=>{let e=await Ja();return d(e)?e:(N({mode:f.DEFAULT}),l("Export successful",!0))}},{intent:M.Exit,description:"Exit the application",mode:f.COMMAND_LINE,action:async()=>(T.exit(),l("Exit successful",!0))},{intent:M.Edit,description:"Edit title or description",mode:f.COMMAND_LINE,action:async(e,t)=>cd(t),onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:f.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case re.USERNAME:{let{userId:o,preferredEditor:r,userName:s}=_(),i=n||s,c=o??fe();if(!i||!c)return a("Unable to resolve user name or id");let u=mt({userName:i,userId:c,preferredEditor:r??""});return d(u)?u:(Fe({userName:i,userId:c}),N({mode:f.DEFAULT}),l(`Username set to "${i}"`,null))}case re.EDITOR:{if(!n)return a("No editor provided");let o=mt({preferredEditor:n});return d(o)?o:(Fe({preferredEditor:n}),N({mode:f.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case re.VIEW:return n!=="wide"&&n!=="dense"?a("Invalid view mode"):(Fe({viewMode:n}),l(`View set to "${n}"`,null));case re.AUTOSYNC:return Cd();case re.LOG_LEVEL:return Nd();case re.SYNC_DEBOUNCE_MS:return bd();default:return a("Unknown config command")}}},{intent:M.Coffee,description:"Sponsor the development of Epiq!",mode:f.COMMAND_LINE,action:()=>{let e=q().commandMeta.modifier;return e==="custom"?vs("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):vs(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),$(""),l("Thanks you!",null)}}];var Sp=new Set(["peek","filter","view-help"]),Ze=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:o,inputString:r}}=q();if(!t)return a("No command to confirm");if(!e&&n===Et.Invalid)return a("Invalid command");let s=Uo(t);Ra();let{readOnly:i}=g();if(i&&!Sp.has(s))return Bn({status:xt.Fail,message:"Command not available in readonly state",value:null});let c=Jo.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return Bn({status:xt.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:r,modifier:o})}catch(m){return Bn({status:xt.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?Bn(u):(Ta({addToHistory:!e}),c.onSuccess?.(),_().autoSync&&Mo(),u)};var Qo=[{intent:x.Exit,mode:f.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(N({mode:f.COMMAND_LINE}),$("move cancel"),Ze({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:f.DEFAULT,description:"[m] move (init/confirm)",action:()=>(N({mode:f.COMMAND_LINE}),$("move start"),Ze({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:f.MOVE,action:()=>(N({mode:f.COMMAND_LINE}),$("move confirm"),Ze({isForceExecutedBySystem:!0}))}],Zo=[{intent:x.MovePreviousItem,mode:f.MOVE,action:()=>Pt()?(N({mode:f.COMMAND_LINE}),$("move previous"),Ze({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveNextItem,mode:f.MOVE,action:()=>Pt()?(N({mode:f.COMMAND_LINE}),$("move next"),Ze({isForceExecutedBySystem:!0})):a("No pending move")}],Td=[{intent:x.MoveToNextContainer,mode:f.MOVE,action:()=>Pt()?(N({mode:f.COMMAND_LINE}),$("move to-next"),Ze({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveToPreviousContainer,mode:f.MOVE,action:()=>Pt()?(N({mode:f.COMMAND_LINE}),$("move to-previous"),Ze({isForceExecutedBySystem:!0})):a("No pending move")}];var Ad={[w.WORKSPACE]:[...Qo,...Zo],[w.BOARD]:[...Qo,...Zo],[w.SWIMLANE]:[...Qo,...Zo,...Td],[w.TICKET]:[],[w.FIELD]:[],[w.FIELD_LIST]:[],[w.TEXT]:[],[w.COMMENT]:[]};var wd=()=>{$("");let{pendingNavTarget:e}=wt();N({mode:f.DEFAULT}),e&&T.navigate(e),Mt({pendingNavTarget:void 0})},Md=[{intent:x.ExitCommandLine,mode:f.HELP,action:()=>(wd(),l("Exiting help",null))},{intent:x.Exit,mode:f.HELP,action:()=>(wd(),l("Closed help",null))},{intent:x.NavPreviousItem,mode:f.HELP,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:x.NavNextItem,mode:f.HELP,action:()=>(T.navigateToNextItem(),l("Navigating to next help item",null))},{intent:x.NavToPreviousContainer,mode:f.HELP,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:x.NavToNextContainer,mode:f.HELP,action:()=>(T.navigateToNextContainer(),l("Navigating to next help container",null))}];var Ep=e=>{N({mode:f.COMMAND_LINE});let{pendingNavTarget:t}=wt();t&&T.navigate(t),Mt({pendingNavTarget:void 0}),$(`${e} `)},Pd=()=>{$("");let{pendingNavTarget:e}=wt();e&&T.navigate(e),Mt({pendingNavTarget:void 0}),N({mode:f.DEFAULT})},Ld=[{intent:x.InitCommandPalette,mode:f.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{$("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return Mt({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}}),N({mode:f.PALETTE}),l("Opening command palette",null)}},{intent:x.Confirm,mode:f.PALETTE,action:()=>{let{selectedNode:e}=g();if(!e||!bt(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?(Ep(t),l("Selected command",t)):l("No command selected",null)}},{intent:x.ExitCommandLine,mode:f.PALETTE,action:()=>(Pd(),l("Exiting palette",null))},{intent:x.Exit,mode:f.PALETTE,action:()=>(Pd(),l("Closed command palette",null))},{intent:x.NavPreviousItem,mode:f.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:x.NavNextItem,mode:f.PALETTE,action:()=>(T.navigateToNextItem(),l("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:f.PALETTE,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:f.PALETTE,action:()=>(T.navigateToNextContainer(),l("Navigating to next container",null))}];var kd=[...Md,...Ld,{intent:x.AddItem,mode:f.DEFAULT,description:"[n] new...",action:()=>(N({mode:f.COMMAND_LINE}),$(`${h.NEW} `),l("Adding new item",null))},{intent:x.Delete,mode:f.DEFAULT,description:"[d] delete",action:()=>(N({mode:f.COMMAND_LINE}),$(`${h.DELETE} `),l("Deleting item",null))},{intent:x.InitCommandLine,mode:f.DEFAULT,description:"[:] focus command line",action:()=>(N({mode:f.COMMAND_LINE}),$(""),l("Entering command line mode",null))},{intent:x.Confirm,mode:f.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=g();if(!j(e?.id??"")?.length){if(e?.title===ne.DESCRIPTION)return N({mode:f.COMMAND_LINE}),$(`${h.EDIT} description `),l("Propose command",!0);if(e?.title===ne.ASSIGNEES)return N({mode:f.COMMAND_LINE}),$(`${h.ASSIGN} `),l("Propose command",!0);if(e?.title===ne.TAGS)return N({mode:f.COMMAND_LINE}),$(`${h.TAG} `),l("Propose command",!0);if(t.title===ne.DESCRIPTION&&e?.context==="TEXT")return N({mode:f.COMMAND_LINE}),$(`${h.EDIT} description `),l("Propose command",!0)}return T.enterChildNode(),l("Entering context",null)}},{intent:x.EditTitle,mode:f.DEFAULT,description:"[r] rename title",action:()=>(N({mode:f.COMMAND_LINE}),$(`${h.EDIT} title ${g().selectedNode?.title}`),l("Exiting context",null))},{intent:x.EditDescription,mode:f.DEFAULT,description:"[e] edit description",action:()=>(N({mode:f.COMMAND_LINE}),$(`${h.EDIT} description `),l("Exiting context",null))},{intent:x.Exit,mode:f.DEFAULT,description:"[q] exit context",action:()=>(T.enterParentNode(),l("Exiting context",null))},{intent:x.NavPreviousItem,mode:f.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:x.NavNextItem,mode:f.DEFAULT,action:()=>(T.navigateToNextItem(),l("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:f.DEFAULT,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:f.DEFAULT,action:()=>(T.navigateToNextContainer(),l("Navigating to next container",null))}];var Rp=500,Tp=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Dd=e=>{let t=Tp(e);t&&pn(n=>(n+t).slice(0,Rp))};var Ap=[f.COMMAND_LINE,f.PALETTE],wp=e=>[{intent:x.MoveCursorLeft,mode:e,action:()=>(ss(-1),l("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:e,action:()=>(ss(1),l("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:e,action:()=>(is("left"),l("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:e,action:()=>(is("right"),l("Moving cursor right of word",null))},{intent:x.AutoCompleteCommand,mode:e,action:()=>(pn((t,{remainder:n})=>{let o=n?t+n:t,r="";return o==="edit title "&&(r=g().selectedNode?.title??""),o+r}),l("Auto-completing command",null))},{intent:x.CaptureInput,mode:e,action:(t,{sequence:n})=>(Dd(n??""),l("Capturing input",null))},{intent:x.EraseInput,mode:e,action:()=>(Sa(),l("Erasing input",null))},{intent:x.EraseInputWord,mode:e,action:()=>(Ea(),l("Erasing input word",null))}],Fd=[{intent:x.Confirm,mode:f.COMMAND_LINE,action:()=>(Ze(),l("Executing command",null))},{intent:x.ViewHelp,mode:f.DEFAULT,action:()=>(N({mode:f.HELP}),l("Viewing help",null))},...Ap.flatMap(wp),{intent:x.ExitCommandLine,mode:f.COMMAND_LINE,action:()=>(N({mode:f.DEFAULT}),l("Exiting command line",null))},{intent:x.GetLastCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(Aa(),l("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(wa(),l("Getting next command from history",null))}];import Od from"chalk";var er=Od.dim.hex(y.secondary2)(": for command line"),Bd="q to exit",Ud=`${Od.hex(y.accent)("m")} to confirm`,Cs={[w.WORKSPACE]:[er],[w.BOARD]:[er],[w.BOARD+f.COMMAND_LINE]:[er],[w.SWIMLANE]:[er],[w.TICKET+f.HELP]:[Bd],[w.SWIMLANE+f.HELP]:[Bd],[w.TICKET]:[],[w.FIELD]:[],[w.SWIMLANE+f.MOVE]:[Ud],[w.TICKET+f.MOVE]:[Ud]};var Vn=e=>e.trim().toLocaleLowerCase(),Mp=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},Pp=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},$d=(e,t)=>{let n=Vn(t.value);if(!n)return!0;switch(t.target){case"title":return Vn(e.title??"").includes(n);case"description":return Vn(e.props.description??"").includes(n);case"tag":return Mp(e).map(Vn).some(r=>r.includes(n));case"assignee":return Pp(e).map(Vn).some(r=>r.includes(n));default:return!0}};function Wd(e,t,n){let o=t[e];if(!o)return a("buildBreadCrumb(): current node not found");let r=[],s=o;for(;s&&(r.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let i=r[r.length-1];return!i||i.id!==n?a("buildBreadCrumb(): node is not connected to root"):(r.reverse(),l("Breadcrumb built",r))}var _d=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 Qt,Ns,Ss=new Set,jd=()=>{for(let e of Ss)e()},kp=e=>(Ss.add(e),()=>Ss.delete(e));function Hd(e){let{contextNodeId:t,mode:n,rootNodeId:o,nodes:r,filters:s}=e;if(!t)return a("derive(): contextNodeId is missing");if(!o)return a("derive(): rootNode is missing");if(!r[o])return a("derive(): unable to find root node");let c=r[t];if(!c)return a("Unable to derive state, contextNode not found");let u=Wd(t,r,o);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,v=Cs[p+n]??Cs[p]??[],C=[...kd,...Ad[p]??[],...Fd],E=_d(C),S=Dp(r,s),R=S[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:v,availableActions:C,actionIndex:E,selectedNode:R,renderedChildrenIndex:S})}var g=()=>{if(!Qt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Qt},ze=()=>Qt?l("Retrieved state",Qt):a("State not initialized. Call initWorkspaceState() first.");function Ln(e){Ns=e;let t=_e(process.cwd()),n=!1;if(!d(t)){let s=It(t.value);if(d(s))return a(s.message);n=!0}let o={readOnly:!1,filters:[],tags:{},contributors:{},mode:f.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{}},r=Hd(o);return d(r)?r:(Qt=r.value,jd(),l("State initialized",null))}function ue(e){let t=g(),n=e(t),o=Hd(n);return d(o)?a(o.message??"Unable to update state"):(Qt=o.value,jd(),l("State updated",null))}var N=e=>ue(t=>({...t,...e}));var K=()=>Lp(kp,g,g),Dp=(e,t)=>{let n={};for(let o of Object.values(e))A(o)&&t.length>0&&!t.every(r=>$d(o,r))||!o.parentNodeId||o.isDeleted||((!o.parentNodeId||!n[o.parentNodeId])&&(n[o.parentNodeId]=[]),n[o.parentNodeId].push(o));for(let o of Object.keys(n))n[o].sort((r,s)=>{let i=e[r.id],c=e[s.id];return!i||!c?0:i.rank.localeCompare(c.rank)});return n},W=e=>g()?.renderedChildrenIndex[e]??[],Hn=()=>Ns?Ln(Ns):a("Cannot reset state: no initial workspace found"),un=()=>Qt!==void 0;var Es=e=>{un()&&(N({syncStatus:e}),Wt({type:"sync-status",payload:e}))},tr=(e="Syncing...")=>{Es({status:"syncing",msg:e})},nr=(e="Synced")=>{Es({status:"synced",msg:e})},Rs=e=>{Es({status:"failed",msg:e})},Ue=e=>(Rs(e),a(e));import{decodeTime as FA}from"ulid";var Fp=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=G("getRepoRootDir",await ht(e));if(d(n))return a(n.message);let o=n.value;logger.debug("[sync] repo root",o);let r=G("getStateBranchRoot",Oe({repoRoot:o}));if(d(r))return a(r.message);let s=r.value;logger.debug("[sync] state branch root",s);let i=G("ensureInitialCommit",await mi(o));if(d(i))return a(i.message);logger.debug("[sync] initial commit result",{created:i.value}),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:o,stateBranchRoot:s,ensureUpstream:t});let c=G("bootstrapStateBranchStorage",await gi({repoRoot:o,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=G("hasInProgressGitOperation(stateBranchRoot)",await io(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:o,stateBranchRoot:s});let m=G("ensureStateBranchLayout",ci(o,s));return d(m)?a(m.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:o,stateBranchRoot:s,bootstrapped:c.value}),l("Sync preconditions satisfied",{repoRoot:o,stateBranchRoot:s,bootstrapped:c.value}))},Bp=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 o=G("stageStateBranchOwnEventFile",await po({stateBranchRoot:t,eventFileName:n}));if(d(o))return a(o.message);let r=G("hasStagedChanges(after stage)",await oi(t));if(d(r))return a(r.message);if(logger.debug("[sync] state branch change check after stage result",{changed:r.value}),!r.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 s=G("createStateBranchSyncCommit",await pi({repoRoot:e,stateBranchRoot:t}));return d(s)?a(s.message):(logger.debug("[sync] created sync commit",s.value),l("Committed own event file",{createdCommit:!0,commitSha:s.value}))},wo=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");tr();let n=G("ensureSyncReady",await Fp({cwd:e,ensureUpstream:!0}));if(d(n))return Ue(n.message);let{repoRoot:o,stateBranchRoot:r,bootstrapped:s}=n.value,i=G("isDetachedHead(stateBranchRoot)",await ri(r));if(d(i))return Ue(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return Ue("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,v=G("getStateBranch",nn(o));if(d(v))return Ue(v.message);let C=v.value;logger.debug("[sync] resolved state branch",{stateBranch:C,stateBranchRoot:r});let E=G("commitOwnEventFileToStateBranch",await Bp({repoRoot:o,stateBranchRoot:r,ownEventFileName:t}));if(d(E))return Ue(E.message);c=E.value.createdCommit,u=E.value.commitSha;let S=G("pullBranchRebaseIfPresent",await Mr({cwd:r,branch:C}));if(d(S))return Ue(S.message);if(m=S.value,c||s){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:r});let R=G("pushStateBranch",await Rn({stateBranchRoot:r,repoRoot:o}));if(d(R)&&ni(R.message)){let D=G("pullBranchRebaseIfPresent(retry)",await Mr({cwd:r,branch:C}));if(d(D))return Ue(D.message);m=m||D.value,R=G("pushStateBranch(retry)",await Rn({stateBranchRoot:r,repoRoot:o}))}if(d(R))return Ue(R.message);p=R.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:r});let R=G("git rev-parse HEAD",await B({args:["rev-parse","HEAD"],cwd:r}));if(d(R))return Ue(R.message);u=R.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return nr(p?"Synced and pushed":m||c?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),l("Synced event logs with state branch",{repoRoot:o,stateBranchRoot:r,createdCommit:c,commitSha:u,pulled:m,pushed:p,bootstrapped:s})};var Ts=e=>{let t=_e(e??process.cwd());return d(t)?a(t.message):l("Resolved Epiq repo root",t.value)},we=async e=>{let t=Ts(e);if(d(t))return t;let n=Oe({repoRoot:t.value});if(d(n))return a(n.message);let o=tn(),r=await $t({repoRoot:t.value,stateBranchRoot:n.value,stateBranchName:o.stateBranch});if(d(r))return a(r.message);let s=await B({cwd:n.value,args:["pull","--ff-only"]});d(s)&&ee.info(3,s.message);let i=at(n.value);if(d(i))return a(i.message);let c=Kt(i.value);return d(c)?a(c.message):l("Booted Epiq state",{repoRoot:t.value,stateBranchRoot:n.value})},Me=()=>{let e=_n();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")},$e=()=>{let e=ze();return d(e)?a(e.message):e},Vd=e=>(e.props.tags??[]).map(t=>I.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:oe(t.name)})),Gd=e=>(e.props.assignees??[]).map(t=>I.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:oe(t.name)}));var Kd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=$e();if(d(n))return n;let o=Object.values(n.value.nodes).filter(A).filter(r=>e.includeClosed||r.parentNodeId!==de).map(r=>({id:r.id,title:Nt(r.title),description:r.props.description??"",parentNodeId:r.parentNodeId,isClosed:r.parentNodeId===de,readonly:!!r.readonly,tags:Vd(r),assignees:Gd(r)}));return l("Listed issues",o)},zd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=cn(e.parentId,n.value,t.value.stateBranchRoot);if(d(o))return o;let r=Yo({name:e.title,parent:e.parentId,user:n.value,rank:o.value});if(d(r))return r;let s=r.value,i=F([...s],t.value.stateBranchRoot);if(d(i))return a(i.message);let c=s.find(u=>u.action==="add.issue")?.payload.id;return c?l("Created issue",{id:c,title:e.title,parentId:e.parentId}):a("Unable to determine created issue id")},qd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=Gt(de,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(o))return o;let r={id:ve(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:de,rank:o.value}},s=F([r],t.value.stateBranchRoot);return d(s)?a(s.message):l("Closed issue",{id:e.issueId})},Yd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Target node is not issue");if(r.parentNodeId!==de)return a("Issue is not closed");let s=Ko(r);if(!s)return a("Unable to resolve previous parent from issue history");if(s===de)return a("Previous parent resolves to closed swimlane");let i=o.value.nodes[s];if(!i)return a("Previous parent no longer exists");let c=Gt(i.id,r.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let u={id:ve(),...n.value,action:"reopen.issue",payload:{id:r.id,parent:i.id,rank:c.value}},m=F([u],t.value.stateBranchRoot);return d(m)?a(m.message):l("Reopened issue",{id:r.id,parentId:i.id})},Xd=async e=>{let t=Ts(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=Oe({repoRoot:t.value});if(d(o))return o;let r=at(o.value);if(d(r))return r;let s=Kt(r.value);if(d(s))return s;let i=Gt(e.parentId,e.issueId,e.position??{at:"end"},n.value,o.value);if(d(i))return i;let c={id:ve(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:i.value}},u=F([c],o.value);return d(u)?a(u.message):l("Moved issue",{id:e.issueId,parentId:e.parentId})},or=async(e={})=>{tr();let t=Ts(e.repoRoot);if(d(t))return a("Sync failed");let n=Me();if(d(n))return n;let o=await wo({cwd:t.value,ownEventFileName:Vt(n.value)});return d(o)?(Rs(o.message),o):(nr(),l("Synced",o.value))};var Lt=async(e={})=>{let t=await we(e.repoRoot);if(d(t))return t;let n=$e();if(d(n))return n;let o=Object.values(n.value.nodes),r=o.filter(m=>fo(m)&&!m.isDeleted),s=new Map,i=new Map;for(let m of o)if(!m.isDeleted){if(Ct(m)&&m.parentNodeId){let p=s.get(m.parentNodeId)??[];p.push(m),s.set(m.parentNodeId,p)}if(A(m)&&m.parentNodeId){let p=i.get(m.parentNodeId)??[];p.push(m),i.set(m.parentNodeId,p)}}let c=_n();if(d(c))return c;let u={};for(let m of o.filter(A))m.isDeleted||(u[m.id]=I.getCommentsByIssue(m.id).map(p=>{let v=I.getContributor(p.authorId);return{id:p.id,issueId:p.issue,body:p.md,author:{id:p.authorId,name:v?.name??"Unknown",color:oe(v?.name??p.authorId)},createdAt:Up(p.id)}}));return l("Retrieved Epiq GUI state",{boards:r.sort((m,p)=>m.rank.localeCompare(p.rank)).map(m=>({id:m.id,title:m.title,swimlanes:(s.get(m.id)??[]).sort((p,v)=>p.rank.localeCompare(v.rank)).map(p=>({id:p.id,title:p.title,readonly:!!p.readonly,issues:(i.get(p.id)??[]).sort((v,C)=>v.rank.localeCompare(C.rank)).map(v=>({id:v.id,title:Nt(v.title),description:v.props.description??"",readonly:!!v.readonly,tags:Vd(v),assignees:Gd(v),parentNodeId:v.parentNodeId,isClosed:v.parentNodeId===de})),parentNodeId:p.parentNodeId}))})),tags:Object.values(n.value.tags).map(m=>({...m,color:oe(m.name)})),contributors:Object.values(n.value.contributors).map(m=>({...m,color:oe(m.name)})),user:{name:c.value.userName??"",id:c.value.userId??"",color:oe(c.value.userName??"")},commentsByIssueId:u})},Jd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Edit target must be an issue");if(r.readonly)return a("Cannot edit readonly issue");let s=r.props.description??"";if(s===e.description)return l("No changes made",{id:e.issueId,description:s});let i={id:ve(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},c=F([i],t.value.stateBranchRoot);return d(c)?a(c.message):l("Edited issue description",{id:e.issueId,description:e.description})},Qd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Edit target must be an issue");if(r.readonly)return a("Cannot edit readonly issue");let s=Nt(e.title);if(!s.trim())return a("Issue title cannot be empty");if(r.title===s)return l("No changes made",{id:e.issueId,title:s});let i={id:ve(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},c=F([i],t.value.stateBranchRoot);return d(c)?a(c.message):l("Edited issue title",{id:e.issueId,title:s})},Zd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Tag target must be an issue");if(r.readonly)return a("Cannot tag readonly issue");let s=Nt(e.tagName).trim();if(!s)return a("Tag name cannot be empty");let i=Object.values(o.value.tags).find(p=>p.name===s),c=i?.id??ve(),u=[...i?[]:[{id:ve(),...n.value,action:"create.tag",payload:{id:c,name:s}}],{id:ve(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:c}}],m=F(u,t.value.stateBranchRoot);return d(m)?a(m.message):l("Added issue tag",{id:e.issueId,tag:{id:c,name:s}})},ec=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Untag target must be an issue");if(r.readonly)return a("Cannot untag readonly issue");if(!o.value.tags[e.tagId])return a("Tag not found");let s={id:ve(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},i=F([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue tag",{id:e.issueId,tagId:e.tagId})},tc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Assign target must be an issue");if(r.readonly)return a("Cannot assign readonly issue");let s=Nt(e.assigneeName).trim();if(!s)return a("Assignee name cannot be empty");let i=Object.values(o.value.contributors).find(p=>p.name===s),c=i?.id??ve(),u=[...i?[]:[{id:ve(),...n.value,action:"create.contributor",payload:{id:c,name:s}}],{id:ve(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:c}}],m=F(u,t.value.stateBranchRoot);return d(m)?a(m.message):l("Added issue assignee",{id:e.issueId,assignee:{id:c,name:s}})},nc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Unassign target must be an issue");if(r.readonly)return a("Cannot unassign readonly issue");if(!o.value.contributors[e.assigneeId])return a("Assignee not found");let s={id:ve(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},i=F([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue assignee",{id:e.issueId,assigneeId:e.assigneeId})},rr=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Comment target must be an issue");if(r.readonly)return a("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return a("Comment cannot be empty");let i=ve(),c={id:ve(),...n.value,action:"add.issue.comment",payload:{id:i,issue:e.issueId,md:s,author:n.value.userId}},u=F([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Added issue comment",{id:i,issueId:e.issueId,body:s})},sr=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!r)return a("Unable to resolve comment");if(r.payload.author!==n.value.userId)return a("You can only delete your own comments");let s=o.value.nodes[r.payload.issue];if(!s)return a("Issue not found");if(!A(s))return a("Comment target must be an issue");if(s.readonly)return a("Cannot delete comment on readonly issue");if(o.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return l("Comment already deleted",{id:e.commentId,issueId:r.payload.issue});let c={id:ve(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:r.payload.issue}},u=F([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Deleted issue comment",{id:e.commentId,issueId:r.payload.issue})};var oc=e=>{let t,n,o=!1,r=!1,s=!1,i=()=>{let p=Wn();if(d(p))return ee.error(p.message);let{autoSync:v,userName:C,preferredEditor:E}=p.value;return!!(v&&C&&E)},c=async()=>{if(!o){if(r){s=!0;return}r=!0;try{await or({repoRoot:e.repoRoot}),Wt({type:"state",payload:await Lt({repoRoot:e.repoRoot})})}finally{r=!1,s&&(s=!1,c())}}},u=(p=750)=>{o||(n&&clearTimeout(n),n=setTimeout(()=>{c()},p))},m=()=>{if(o)return;let p=Wn();if(d(p))return ee.error(p.message);let{autoSyncDebounceMs:v}=p.value;i()&&(t=setTimeout(()=>{c(),m()},v??15e3))};return m(),{scheduleSync:u,dispose:()=>{o=!0,t&&clearTimeout(t),n&&clearTimeout(n)}}};import{WebSocketServer as Op}from"ws";var Pe=(e,t)=>{e.send(JSON.stringify(t))},Gn=async(e,t)=>Pe(e,{type:"state",payload:await Lt({repoRoot:t})}),et=async(e,t,n,o,r)=>{if(Pe(e,{type:o,payload:r}),d(r))return Pe(e,{type:"failed",payload:r.message});n(),Gn(e,t)},rc=(e,t,{onStateChanged:n})=>{new Op({server:e,path:"/ws"}).on("connection",r=>{fi(r),r.on("message",async s=>{try{let i=JSON.parse(s.toString()),{type:c}=i;if(c==="state:get")return Gn(r,t);if(c==="sync"){let u=await or({repoRoot:t});return Pe(r,{type:"sync:result",payload:u}),n(),Gn(r,t)}if(c==="issue:comment:add"){let u=await rr({repoRoot:t,...i.payload});return et(r,t,n,"issue:comment:add:result",u)}if(c==="issue:comment:delete"){let u=await sr({repoRoot:t,...i.payload});return Pe(r,{type:"issue:comment:delete:result",payload:u}),d(u)?Pe(r,{type:"failed",payload:u.message}):(n(),Gn(r,t))}if(c==="issue:edit:description"){let u=await Jd({repoRoot:t,...i.payload});return et(r,t,n,"issue:edit:description:result",u)}if(c==="issue:edit:title"){let u=await Qd({repoRoot:t,...i.payload});return et(r,t,n,"issue:edit:title:result",u)}if(c==="issue:tag:add"){let u=await Zd({repoRoot:t,...i.payload});return et(r,t,n,"issue:tag:add:result",u)}if(c==="issue:tag:remove"){let u=await ec({repoRoot:t,...i.payload});return et(r,t,n,"issue:tag:remove:result",u)}if(c==="issue:assignee:add"){let u=await tc({repoRoot:t,...i.payload});return et(r,t,n,"issue:assignee:add:result",u)}if(c==="issue:assignee:remove"){let u=await nc({repoRoot:t,...i.payload});return et(r,t,n,"issue:assignee:remove:result",u)}if(c==="issues:list")return Pe(r,{type:"issues",payload:await Kd({repoRoot:t})});if(c==="issues:create"){let u=await zd({...i.payload,repoRoot:t});return Pe(r,{type:"issues:create:result",payload:u}),d(u)?Wt({type:"failed",payload:u.message}):(Wt({type:"issue:created",payload:u.value}),n(),Gn(r,t))}if(c==="issues:move"){if(!i.payload.position)return Pe(r,{type:"error",message:"Missing move position"});let u=await Xd({...i.payload,repoRoot:t});return et(r,t,n,"issues:move:result",u)}if(c==="issue:close"){if(!i.payload.issueId)return Pe(r,{type:"error",message:"Missing issueId"});let u=await qd({repoRoot:t,issueId:i.payload.issueId});return et(r,t,n,"issue:close:result",u)}if(c==="issue:reopen"){if(!i.payload.issueId)return Pe(r,{type:"error",message:"Missing issueId"});let u=await Yd({repoRoot:t,issueId:i.payload.issueId});return et(r,t,n,"issue:reopen:result",u)}return Pe(r,{type:"error",message:"Unknown message type"})}catch(i){return Pe(r,{type:"error",message:i instanceof Error?i.message:String(i)})}})})};var jp=Zt.dirname(_p(import.meta.url)),Hp=process.env.IS_LOCAL==="true"?Zt.resolve(process.cwd(),"dist/gui"):Zt.join(jp,"gui"),tt=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},Vp=async e=>new Promise((t,n)=>{let o="";e.on("data",r=>{o+=r}),e.on("end",()=>{try{t(o?JSON.parse(o):{})}catch{n(new Error("Invalid JSON body"))}}),e.on("error",n)}),Gp=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",sc=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),o=Zt.resolve(Hp),r=Zt.resolve(o,n),s=Zt.relative(o,r);if(s.startsWith("..")||Zt.isAbsolute(s))return tt(t,403,{isError:!0,message:"Forbidden"});try{let i=await $p(r);return t.writeHead(200,{"content-type":Gp(r)}),t.end(i)}catch{return tt(t,404,{isError:!0,message:`Not found: ${n}`})}},Kp=async(e,t=3710)=>new Promise((n,o)=>{let r=s=>{let i=u=>{if(e.off("listening",c),u.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),r(0);return}o(u)},c=()=>{e.off("error",i);let u=e.address();if(!u||typeof u=="string"){o(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")};r(t)}),ic=async e=>{let t=Wp.createServer(async(r,s)=>{let i=new URL(r.url??"/","http://127.0.0.1");if(i.pathname==="/api/state")return tt(s,200,await Lt({repoRoot:e.repoRoot}));if(r.method==="POST"&&i.pathname==="/api/comments")try{let c=await Vp(r);if(!c.issueId||!c.body?.trim())return tt(s,400,{isError:!0,message:"Missing issueId or body"});let u=await rr({repoRoot:e.repoRoot,issueId:c.issueId,body:c.body});return"isError"in u&&u.isError?tt(s,400,u):tt(s,200,await Lt({repoRoot:e.repoRoot}))}catch(c){return tt(s,400,{isError:!0,message:c instanceof Error?c.message:"Unable to add comment"})}if(r.method==="DELETE"&&i.pathname.startsWith("/api/comments/")){let c=decodeURIComponent(i.pathname.replace("/api/comments/",""));if(!c)return tt(s,400,{isError:!0,message:"Missing comment id"});let u=await sr({repoRoot:e.repoRoot,commentId:c});return"isError"in u&&u.isError?tt(s,400,u):tt(s,200,await Lt({repoRoot:e.repoRoot}))}return i.pathname.startsWith("/board/")?sc("/",s):sc(i.pathname,s)});try{await Kp(t)}catch(r){return a(r instanceof Error?`Unable to start GUI server: ${r.message}`:`Unable to start GUI server: ${String(r)}`)}let n=oc({repoRoot:e.repoRoot});rc(t,e.repoRoot,{onStateChanged:()=>n.scheduleSync()}),t.on("close",n.dispose);let o=t.address();return!o||typeof o=="string"?(t.close(),a("Unable to resolve GUI server address")):l("Started GUI server",{url:`http://epiq.localhost:${o.port}${e.boardId?`/board/${e.boardId}`:""}`,server:t})};var ac=async e=>{let t=await ic({...e,boardId:""});if(d(t))return t;let{url:n}=t.value;return console.log(`Epiq GUI running at ${zp.cyan(n)}`),Hs(n),l("Started GUI",{url:n})};import{Box as Bt}from"ink";import J from"react";import{Box as As,Text as Kn}from"ink";import We,{useEffect as qp,useMemo as Yp}from"react";import{ulid as Xp}from"ulid";var dc=({text:e,match:t,color:n,highlightColor:o=y.secondary,dimColor:r=!1})=>{if(!t)return We.createElement(Kn,{color:n,dimColor:r},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?We.createElement(Kn,{color:n,dimColor:r},e):We.createElement(Kn,{color:n,dimColor:r},e.slice(0,c),We.createElement(Kn,{backgroundColor:o,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},cc=Xp(),Jp=e=>`${e}`,Qp=e=>{let{pendingNavTarget:t}=wt();if(!t)return[];let{breadCrumb:n,contextNode:o,selectedNode:r}=t,s=new Set(ie(h.NONE,{breadCrumb:n,contextNode:o,readOnly:g().readOnly,selectedNode:r}));return[...new Set(Object.values(h))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==h.PALETTE).map(i=>{let c=Uo(i),u=Jo.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))},Zp=e=>Y.text({id:cc,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),eg=(e,t,n)=>Y.text({id:Jp(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),ws=[],tg=e=>{lc();let t=I.createNode(Zp(g().rootNodeId));d(t)||!bt(t.value)||(ws=[t.value,...e.map((n,o)=>eg(n,o,cc)).map(I.createNode).filter(Q).map(({value:n})=>n).filter(bt)],T.navigate({contextNode:t.value,selectedIndex:0}))},lc=()=>{let e=ws.map(t=>t.id);ws=[];for(let t of e)I.deleteNode(t)};function uc({width:e,height:t}){let o=Ma().value.trim().toLowerCase(),r=Yp(()=>Qp(o),[o]);qp(()=>(tg(r),()=>{lc()}),[r]);let s=g().selectedIndex;return We.createElement(As,{flexDirection:"column",width:e,height:t-2},We.createElement(Je,{height:t-4,itemHeight:3,selectedIndex:s},r.map((i,c)=>{let u=c===s,m=i.isAvailable?y.accent:y.secondary2,p=i.isAvailable?"":"[unavailable] ";return We.createElement(As,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},We.createElement(Kn,{color:m,dimColor:!i.isAvailable},u?"\u276F ":" ",We.createElement(dc,{text:bi(i.command),match:o,color:m,dimColor:!i.isAvailable})),We.createElement(As,{paddingLeft:2},We.createElement(dc,{text:p+i.description,match:o.length>=2?o:"",color:u&&i.isAvailable?y.primary:y.secondary2,dimColor:!i.isAvailable})))})))}import{Box as gg}from"ink";import Ps from"react";import qn from"chalk";import{Box as Ms,Text as mc}from"ink";import zn,{useEffect as ng,useMemo as og,useState as rg}from"react";var pc=qn.gray,sg=qn.inverse,ig=qn.inverse.gray,ag={hint:"",hints:[],overlap:0,remainder:""},fc=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),r=e.length-n.length;return e.slice(r,r+t.length)!==t?null:{start:r,end:r+t.length}},dg=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=oe(t);return{bg:o=>qn.bgHex(n).black(o),bgCursor:o=>qn.bgHex(n).inverse.black(o)}}return Wr(t)},cg=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let o=fc({value:e,command:t});if(!o)return null;let s=e.slice(o.end).match(/^\s*/)?.[0].length??0,i=o.end+s;return e.slice(i,i+n.length)!==n?null:{start:i,end:i+n.length}},gc=()=>({value:ge.value,cursorPosition:ge.cursorPosition,commandIsPending:ge.commandIsPending,autoCompletion:ge.commandMeta.autoCompletion??ag,infoMessage:ge.commandMeta.infoMessage,validationStatus:ge.commandMeta.validity,command:ge.commandMeta.command,inputString:ge.commandMeta.inputString,modifier:ge.commandMeta.modifier}),lg=(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,vc=({width:e,mode:t})=>{let[n,o]=rg(gc());ng(()=>{let C=()=>{let S=gc();o(R=>lg(R,S)?R:S)},E=rs(C);return C(),()=>{E()}},[]);let{value:r,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:u,command:m,modifier:p}=n,v=og(()=>{let C=Math.max(0,Math.min(s,r.length)),E=fc({value:r,command:m}),S=cg({value:r,command:m,modifier:p}),R=m?Wr(m):null,D=dg({command:m,modifier:p}),P=(le,be)=>{let en=E&&be>=E.start&&be<E.end,Ot=S&&be>=S.start&&be<S.end;return en&&R?R.fg(le):Ot&&D?D.bg(le):le},V=(le,be)=>{let en=E&&be>=E.start&&be<E.end,Ot=S&&be>=S.start&&be<S.end;return en&&R?R.fgCursor(le):Ot&&D?D.bgCursor(le):sg(le)},O=r.slice(0,C),k=r[C]??" ",Ee=C<r.length?r.slice(C+1):"",ft=Array.from(O).map((le,be)=>P(le,be)).join(""),vt=V(k,C),yt=Array.from(Ee).map((le,be)=>P(le,C+1+be)).join("");if(u.hint){let le=u.hint[u.overlap]??k;vt=ig(le),yt=pc(u.remainder.slice(1)+Ee)}return pc(t===f.PALETTE?"?":":")+ft+vt+yt},[r,s,u,m,p]);return zn.createElement(Ms,{flexDirection:"column",justifyContent:"flex-start"},zn.createElement(Ms,{flexDirection:"column",paddingX:1,borderColor:y.secondary,borderStyle:"round",width:e},zn.createElement(Ms,null,zn.createElement(mc,null,v),i&&zn.createElement(mc,{wrap:"truncate",color:c?y.red:y.secondary2},` ${i} `))))};import{Box as ug,Text as mg}from"ink";import yc from"react";var pg=(e,t)=>{let n=[],o=0;for(let r of e){let i=(n.length>0?" | ":"").length+r.length;if(o+i>t-4)break;n.push(r),o+=i}return n},xc=({width:e,availableHints:t})=>{let n=pg(t,e).join(" | ");return yc.createElement(ug,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},yc.createElement(mg,{color:y.secondary2},n.length?n:"\xA0"))};var Yn=({width:e,mode:t,availableHints:n})=>{let o=[],r=0;for(let s of n){let c=(o.length>0?" | ":"").length+s.length;if(r+c>e+2)break;o.push(s),r+=c}return Ps.createElement(gg,null,t===f.COMMAND_LINE||t===f.PALETTE?Ps.createElement(vc,{width:e,mode:t}):Ps.createElement(xc,{width:e,mode:t,availableHints:n}))};import{Box as kt,Text as yn}from"ink";import Ie,{useEffect as fg,useMemo as vg}from"react";import{ulid as hc}from"ulid";var ar=hc(),yg=()=>[...new Set([...g().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),o=t?.replace("[",""),r=n?.trim();return[o,r]}).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})),xg=e=>Y.text({id:ar,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),hg=(e,t,n)=>Y.text({id:hc(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),ir=[],Ic=()=>{let e=ir.filter(n=>n.id!==ar).map(n=>n.id),t=ir.filter(n=>n.id===ar).map(n=>n.id);ir=[];for(let n of[...e,...t])I.deleteNode(n)},Ig=e=>{Ic();let t=I.createNode(xg(g().rootNodeId));if(d(t)||!bt(t.value))return logger.error("Could not attach help nodes");ir=[t.value,...e.map((n,o)=>hg(n,o,ar)).map(I.createNode).filter(Q).map(({value:n})=>n).filter(bt)],T.navigate({contextNode:t.value,selectedIndex:0})},bc=({width:e,height:t})=>{let n=vg(()=>yg(),[]);fg(()=>(Ig(n),()=>{Ic()}),[n]);let o=g().selectedIndex;return Ie.createElement(kt,{flexDirection:"column",marginTop:3,borderColor:y.secondary,borderStyle:"round",width:e,height:t-2},Ie.createElement(kt,{paddingX:1,justifyContent:"center"},Ie.createElement(yn,{color:y.accent},"Help"),Ie.createElement(yn,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Ie.createElement(kt,{paddingX:1,marginTop:1},Ie.createElement(kt,{width:20,justifyContent:"flex-end"},Ie.createElement(yn,{color:y.secondary},"Key(s)")),Ie.createElement(kt,{flexGrow:1,width:40,paddingLeft:2},Ie.createElement(yn,{color:y.secondary},"Action"))),Ie.createElement(Je,{height:t-7,itemHeight:1,selectedIndex:o},n.map(({keys:r,action:s},i)=>{let c=i===o;return Ie.createElement(kt,{paddingX:1,key:`${r}-${s}-${i}`,flexDirection:"row"},Ie.createElement(kt,{width:20,justifyContent:"flex-end"},Ie.createElement(yn,{color:y.accent},r)),Ie.createElement(kt,{flexGrow:1,width:40,paddingLeft:2},Ie.createElement(yn,{color:c?y.primary:y.secondary2},s)))})))};import bg from"chalk";import{Box as dr,Text as gt}from"ink";import Le from"react";var Cc=({width:e,height:t})=>Le.createElement(dr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Le.createElement(gt,{color:y.accent,bold:!0},"Initialize project"),Le.createElement(gt,null,`This folder is not an ${bg.hex(y.accent)("epiq")} project yet.`),Le.createElement(gt,{color:y.primary},"To start tracking issues here, we need to initialize a new",Le.createElement(gt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),Le.createElement(dr,{marginTop:1,flexDirection:"column"},Le.createElement(dr,null,Le.createElement(gt,{color:y.accent}," "),Le.createElement(gt,{color:y.primary},"Type "),Le.createElement(gt,{backgroundColor:y.secondary}," :init "))),Le.createElement(dr,{marginTop:1},Le.createElement(gt,{color:y.secondary2},"This will create, commit and push "),Le.createElement(gt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json ")));import{Box as cr,Text as nt}from"ink";import ce from"react";var Cg=({isDone:e,command:t,value:n})=>ce.createElement(cr,null,ce.createElement(nt,{color:y.accent,dimColor:e},e?" \u2714 ":" "),ce.createElement(nt,{dimColor:e},"Type "),ce.createElement(nt,{backgroundColor:y.secondary,dimColor:e}," "+t+" "),n!==void 0&&ce.createElement(ce.Fragment,null,ce.createElement(nt,{dimColor:e}," "),ce.createElement(nt,{color:y.secondary,dimColor:e},"<"+n+">"))),Ng=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function Ls({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:o,userName:r,preferredEditor:s,autoSync:i,isSetAutoSync:c}=St(),u=[{key:"username",done:o,command:":config username",value:r,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(v=>!v.done),p=m===-1?void 0:u[m];return ce.createElement(cr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},ce.createElement(nt,{color:y.accent,bold:!0},"Welcome! \u{1F539}"),ce.createElement(nt,null,"Let's get you started - it's a breeze."),ce.createElement(nt,{color:y.secondary2},"Remember - you can always search available commands by typing:",ce.createElement(nt,{color:y.accent}," ? ")),p&&ce.createElement(nt,{color:y.secondary2},p.message),ce.createElement(cr,{flexDirection:"column"},u.map((v,C)=>m===-1||C<=m?ce.createElement(cr,{key:v.key,marginBottom:1},ce.createElement(Cg,{isDone:v.done,command:v.command,value:v.done?Ng(v.value):void 0})):null)))}import gr from"chalk";import{Box as pr,Text as Jn}from"ink";import ye from"react";import{Box as lr,Text as Nc}from"ink";import Dt from"react";var Sg=e=>(I.getTag(e)?.name??"").length+3,Eg=e=>(I.getContributor(e)?.name??"").length+3,Sc=({width:e})=>{let{viewMode:t}=_(),n=K(),{breadCrumb:o,contextNode:r,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[r.id]?.[s],u=it(c?.id??r.id,"TICKET"),m=Q(u)?u.value:void 0,p=m?.props.tags??[],v=m?.props.assignees??[],C=m?.parentNodeId?!Ur(r.id,m.parentNodeId)&&t==="dense":!1,E=o.map((k,Ee)=>{let ft=Ee===o.length-1,vt=j(k.id),yt=ft?vt?.[s]?.title:void 0;return`${Ee?" / ":""}${k.title??""}${yt?` \u25B8 ${yt}`:""}`}).join(""),S=m?I.getCommentsByIssue(m.id):[],R=S.length?String(S.length).length+11:0,D=C?p.reduce((k,Ee)=>k+Sg(Ee),0)+v.reduce((k,Ee)=>k+Eg(Ee),0)+R:0,P=Math.max(0,e-D),V=E.substring(0,P),O=C?[...p.map(k=>Dt.createElement(lr,{key:`tag-${k}`,paddingLeft:1},Dt.createElement(fn,{id:k}))),...v.map(k=>Dt.createElement(lr,{key:`assignee-${k}`,paddingLeft:1},Dt.createElement(Rt,{id:k}))),S.length?Dt.createElement(lr,{key:"comments",paddingLeft:1},Dt.createElement(Nc,{color:y.accent},"[",S.length," comment",S.length===1?"":"s","]")):null]:[];return Dt.createElement(lr,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Dt.createElement(Nc,{color:y.secondary2},V),O)};import{Box as Rg,Text as Ec}from"ink";import ur from"react";var Tg=({filters:e})=>ur.createElement(Rg,{columnGap:1},ur.createElement(Ec,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:o})=>ur.createElement(Ec,{backgroundColor:"black",color:"white"},` ${n}${o}"${t}" `))),Rc=ur.memo(Tg);import{Box as Ag,Text as mr}from"ink";import Xn from"react";function Tc(){let{eventLog:e,unappliedEvents:t}=K(),n=e.at(-1)?.id,o=bo(n??""),r=Q(o)?Di(o.value):"INVALID DATE";return Xn.createElement(Ag,{paddingLeft:1},Xn.createElement(mr,{backgroundColor:y.accent}," Readonly "),Xn.createElement(mr,{color:y.accent}," "+t.length+" edits ago at "+r+"."),Xn.createElement(mr,{color:y.accent}," Resume with "),Xn.createElement(mr,{backgroundColor:y.accent}," :peek now "))}import ks from"chalk";import{Box as wg,Text as Ac}from"ink";import Ds,{useEffect as Mg,useState as Pg}from"react";var Lg=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],wc=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)}},kg=({r:e,g:t,b:n})=>{let o=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(n)}`},Dg=(e,t,n)=>{let o=wc(e),r=wc(t);return kg({r:o.r+(r.r-o.r)*n,g:o.g+(r.g-o.g)*n,b:o.b+(r.b-o.b)*n})},Fg=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),o=Math.floor(n),r=n-o,s=e[o],i=e[Math.min(o+1,e.length-1)];return Dg(s,i,r)};function Mc({syncStatus:e,autoSync:t}){let[n,o]=Pg(0);Mg(()=>{if(e.status!=="syncing"){o(0);return}let c=setInterval(()=>{o(u=>u+1)},50);return()=>clearInterval(c)},[e.status]);let r={synced:" ",failed:"---",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,pending:y.secondary2,syncing:Fg(Lg,(Math.sin(n*.12)+1)/2)??""}[e.status];return Ds.createElement(wg,null,Ds.createElement(Ac,null,ks.hex(y.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Ds.createElement(Ac,null,ks.hex(i)("\u25CF")+ks.hex(y.secondary2).dim(` ${r[e.status].padEnd(4)} `)))}import Fc from"chalk";import{Text as Bc}from"ink";import Uc,{useEffect as $g,useState as Wg}from"react";var xn="0.7.3";import Fs from"chalk";var Bg="https://registry.npmjs.org/epiq/latest",Bs=null,Pc=0,Ug=1e3*60*60*24,Lc=e=>e.replace(/^v/,""),Og=(e,t)=>{let n=Lc(e).split(".").map(Number),o=Lc(t).split(".").map(Number);for(let r=0;r<Math.max(n.length,o.length);r++){let s=n[r]??0,i=o[r]??0;if(s>i)return 1;if(s<i)return-1}return 0},kc=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Bs&&Date.now()-Pc<Ug)return Bs;try{let t=await fetch(Bg);if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.status}`);let o=(await t.json()).version??null,r={current:e,latest:o,updateAvailable:o?Og(o,e)>0:!1};return Bs=r,Pc=Date.now(),r}catch{return{current:e,latest:null,updateAvailable:!1}}},Dc=(e,t)=>{let n=e.split("."),o=t.split("."),r=o.findIndex((s,i)=>s!=n[i]);return o.map((s,i)=>i>=r?Fs.hex(y.accent).dim(s):Fs.hex(y.secondary).dim(s)).join(Fs.hex(y.secondary2).dim("."))};function Oc(){let[e,t]=Wg({current:xn,latest:null,updateAvailable:!1});return $g(()=>{let n=!0;return kc(xn).then(o=>{n&&t(o)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?Uc.createElement(Bc,{dimColor:!0,color:y.secondary2},xn+" "):Uc.createElement(Bc,null,Fc.hex(y.secondary2).dim(xn),Fc.hex(y.accent).dim(" \u2197 "),Dc(xn,e.latest))}function Qn({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:o,mode:r}=K(),{userName:s,preferredEditor:i,autoSync:c}=_(),u=64,m=process.stdout.columns-u-8;return ye.createElement(pr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?ye.createElement(Jn,null," "):r===f.PALETTE?ye.createElement(pr,null,ye.createElement(Jn,{color:y.accent},"Command Palette"),ye.createElement(Jn,{dimColor:!0,color:y.secondary2}," ","- search, select and press enter")):ye.createElement(pr,{paddingLeft:1},e.length>0?ye.createElement(Rc,{filters:e}):ye.createElement(Sc,{width:m})),n==="live"?ye.createElement(pr,{columnGap:1,paddingRight:2,"max-width":u,overflow:"hidden",justifyContent:"flex-end"},ye.createElement(Mc,{autoSync:!!c,syncStatus:o}),ye.createElement(Jn,null,gr.hex(y.secondary2).dim("Mode: ")+gr.hex(y.secondary2).dim(r.padEnd(8," "))," "),ye.createElement($c,{icon:"@",value:s}),ye.createElement($c,{icon:"\u276F",value:i}),ye.createElement(Oc,null)):"",n==="peek"?ye.createElement(Tc,null):"")}function $c({icon:e,value:t}){return ye.createElement(Jn,null,gr.dim(e)+gr.hex(y.accent)(` ${t??"-"} `))}import{Box as _g,Text as jg}from"ink";import Zn from"react";import{Box as fr,Text as Us}from"ink";import Ft from"react";function Os(){let e=K(),t=e.nodes[e.rootNodeId],r=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?W(t?.id):[];return Ft.createElement(fr,{flexDirection:"column",height:r,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},Ft.createElement(fr,{padding:1,paddingTop:0,paddingBottom:0},Ft.createElement(Us,null,"Select a board:")),Ft.createElement(fr,{padding:1,flexDirection:"column"},i.map((c,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,v=W(c.id).flatMap(({id:C})=>j(C)).length;return Ft.createElement(fr,{key:c.id??u},Ft.createElement(Us,{color:m?y.accent:y.secondary2},Ft.createElement(he,{isSelected:m})),Ft.createElement(Us,{color:m?y.accent:y.secondary2},c.title," (",v," issues)",c.readonly?" \u{1F512}":""))})))}var Hg=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:o,viewMode:r,height:s,width:i})=>{let{renderedChildrenIndex:c}=K(),u=n.find(({context:C})=>C==="BOARD"),v=s-1-3;return Zn.createElement(_g,{flexDirection:"row"},e.context==="WORKSPACE"?Zn.createElement(Os,null):u?Zn.createElement(Vo,{height:v,width:i,swimlanes:(c[u.id]??[]).filter(C=>C!==void 0&&Ct(C)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o}):Zn.createElement(jg,null))},Wc=Zn.memo(Hg);import{useEffect as Vg}from"react";var Gg=e=>{Vg(()=>{if(!e)return;let t,n=!1,o=()=>{if(n)return;let{autoSyncIntervalMs:r,userName:s,preferredEditor:i}=_();i&&s&&r&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:u}=g();u==="default"&&!c&&Mo(),o()},r))};return o(),()=>{n=!0,t&&clearTimeout(t)}},[e])},_c=({autoSync:e})=>(Gg(e),null);function $s({width:e,height:t}){let n=K(),{autoSync:o,viewMode:r}=Ti(),s=n.filters;if(n.mode===f.HELP)return J.createElement(Bt,{flexDirection:"column"},J.createElement(bc,{width:e,height:t}));if(n.mode===f.PALETTE)return J.createElement(Bt,{flexDirection:"column"},J.createElement(Qn,{filters:s}),J.createElement(uc,{width:e,height:t-2}),J.createElement(Yn,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=St(),c=!i,u=i&&!n.hasProjectDefinition;if(c)return J.createElement(Bt,{flexDirection:"column"},J.createElement(Bt,{flexDirection:"column"},J.createElement(Qn,{hideBreadCrumb:!0,filters:s}),J.createElement(Ls,{height:t,width:e})),J.createElement(Yn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(u)return J.createElement(Bt,{flexDirection:"column"},J.createElement(Bt,{flexDirection:"column"},J.createElement(Qn,{hideBreadCrumb:!0,filters:s}),J.createElement(Cc,{height:t,width:e})),J.createElement(Yn,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=Se(n.breadCrumb??[],"BOARD");if(Q(m)){let p=m.value.id,v=W(p).length,C=3,E=Math.floor(e/C),S=Math.floor(e/Math.max(v,1));e=Math.min(S,E)*Math.max(v,C)}return J.createElement(Bt,{flexDirection:"column"},J.createElement(_c,{autoSync:o}),J.createElement(Bt,{flexDirection:"column"},J.createElement(Qn,{filters:s}),J.createElement(Wc,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:r??"dense",mode:n.mode})),J.createElement(Yn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import Kg from"readline";var vr,yr,ot,zg=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.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]),jc=async e=>{if(e.ctrl&&e.name==="c")return T.exit();let{actionIndex:t,mode:n,readOnly:o}=g(),r=La(e,n);if(!r||o&&!zg.has(r))return;let s=t[n]?.[r];if(s?.action)try{await s.action(s,e)}catch(i){logger.error(i)}},qg=()=>async function(t,n){n.name!=="escape"&&(ot&&(clearTimeout(ot),ot=void 0),await jc(n))},Yg=()=>async function(t){if(t.length===1&&t[0]===27){ot&&clearTimeout(ot),ot=setTimeout(()=>{jc({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),ot=void 0},25);return}ot&&(clearTimeout(ot),ot=void 0)};function Hc(){vr&&process.stdin.removeListener("keypress",vr),yr&&process.stdin.removeListener("data",yr),vr=qg(),yr=Yg(),Kg.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",yr),process.stdin.on("keypress",vr)}async function Vc(){try{let e=_n();Q(e)&&Fe(e.value);let t=_e(process.cwd()),n=[];if(Q(t)){let s=Oe({repoRoot:t.value});if(d(s))return zt(3,s.message);let i=tn(),c=await $t({repoRoot:t.value,stateBranchRoot:s.value,stateBranchName:i.stateBranch});if(d(c))return zt(3,c.message);let u=await B({cwd:s.value,args:["pull","--ff-only"]});d(u)&&logger.info(3,u.message);let m=at(s.value);if(d(m))return zt(3,m.message);n=m.value}let o=Kt(n);if(d(o))return zt(4,o.message);N({hasProjectDefinition:Q(t),hasInitializingEvents:!!n.length});let r=Ws();return d(r)?zt(6,r.message):(Hc(),l("Booted Epiq",void 0))}catch(e){return zt(0,To(e))}}id();var Zg=`${Ut.bold("Epiq CLI")}
56
+ `,xs.writeFileSync(t,n,"utf8"),te.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var Rp=async e=>{let t=await B({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},K=(e,t)=>a(`[${e}] ${t}`),vd=async()=>{W("");let e=tn(),t=await xt(process.cwd());if(d(t))return K(1,t.message);let n=t.value,o=await ao(n);if(d(o))return K(2,o.message);if(o.value)return K(2,`Cannot initialize Epiq while a git operation is in progress: ${o.value}`);let r=await Rp(n);if(d(r))return K(2.5,r.message);if(r.value)return K(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Er(n))return K(4,"Epiq project already initialized");let s=Nt();if(!s.isSetupDone||!s.userName)return K(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let i=_(),c=i.userName,u=i.userId;if(!u||!c)return K(5,"Missing Epiq user id");let m=e.stateBranch,p=await lo({repoRoot:n,branch:m});if(d(p))return K(6,p.message);if(p.value)return K(6,`State branch already exists: ${m}`);let v=await Br({repoRoot:n,stateBranchName:m});if(d(v))return K(6,v.message);let S=po();if(d(S))return K(7,S.message);let N=fd.join(mo(),e.projectId),E=await Wt({repoRoot:n,stateBranchRoot:N,stateBranchName:m});if(d(E))return K(8,E.message);let R=fd.join(N,".epiq");Ep.mkdirSync(R,{recursive:!0});let M=ra({userId:u,userName:c});if(d(M))return K(9,M.message);for(let Sr of M.value){let Hs=Eo({event:Sr,rootDir:N});if(d(Hs))return K(9,Hs.message)}let D=await go({stateBranchRoot:N,eventFileName:Vt({userId:u,userName:c})});if(d(D))return K(10,D.message);let j=await on({cwd:N,message:"[epiq:init]"});if(d(j))return K(10,j.message);let O=await gd(n);if(d(O))return K(11,O.message);let k=qs({repoRoot:n,fileContents:e});if(d(k))return K(12,k.message);let Ne=await ne.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(Ne))return K(13,Ne.message);let ft=await ne.commit({cwd:n,message:"[epiq:init-project]"});if(d(ft))return K(13,ft.message);let vt="Project initialized!",yt=await B({cwd:n,args:["push","-u","origin","HEAD"]});d(yt)&&(vt+=` Warn: [init:14] ${yt.message}`);let le=await En({repoRoot:n,stateBranchRoot:N});d(le)&&(vt+=` Warn: [init:15] ${le.message}`);let en=Ht(M.value).filter(d);if(en.length>0)return K(16,en.map(Sr=>Sr.message).join(`
57
+ `));let Ot=Ue();if(d(Ot))return K(16,Ot.message);let{rootNodeId:Jc,nodes:Qc}=Ot.value,js=Qc[Jc];return js?(A.navigate({contextNode:js,selectedIndex:0}),C({hasProjectDefinition:!0,mode:f.DEFAULT}),l(vt,null)):K(16,"Unable to resolve initialized root node")};import{ulid as Ap}from"ulid";import{ulid as Tp}from"ulid";var yd=null,Pt=()=>structuredClone(yd),Hn=e=>{yd=e},hd=()=>{let{contextNode:e,selectedIndex:t}=g(),o=H(e.id)[t];return o?l("Resolved selected child",o):a("Target node not found")},Is=({id:e,parentId:t,position:n={at:"end"}})=>{let o=H(t).filter(r=>r.id!==e);return Ro(o,n)},xd=({id:e,parentId:t,position:n={at:"end"}})=>{let o=X();if(d(o))return a("Unable to resolve user ID");let r=Is({parentId:t,id:e,position:n});return d(r)?r:l("Created pending move state",{id:Tp(),...o.value,action:"move.node",payload:{id:e,parent:t,rank:r.value.rank}})},Id=e=>{Hn(e);let t=Mn(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function bs(e){let t=hd();if(d(t))return t;let{contextNode:n,nodes:o}=g();if(!n.parentNodeId)return a("Missing parent node id");let r=o[n.parentNodeId];if(!r)return a("Missing parent node");let s=H(r.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=xd({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:Id(u.value)}function Cs(e){let t=hd();if(d(t))return t;let{contextNode:n,selectedIndex:o}=g(),s=H(n.id)[o+e];if(!s)return a("Missing sibling node");let i=xd({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(i)?i:Id(i.value)}var bd=()=>{let e=Pt();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,o=g().nodes[n];if(!o)return a("Move parent not found");let r=H(n).findIndex(s=>s.id===t);return r===-1?a("Moved node not found among rendered children"):(A.navigate({contextNode:o,selectedIndex:r}),l("Synchronized navigation to moved node",null))},Jo=(e,t="Moved preview")=>{if(d(e))return e;let n=bd();return d(n)?n:(C({mode:f.MOVE}),l(t,null))},Cd=async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=q().commandMeta,{contextNode:n,selectedIndex:o}=g(),r=H(n.id)[o];if(!r)return C({mode:f.DEFAULT}),a("No move target");if(t==="start"){if(r.readonly)return a("Target node is read-only");if(o===-1)return a("No item selected");if(!r.parentNodeId)return a("Target has no parent");let s=H(r.parentNodeId),i=s.findIndex(({id:v})=>v===r.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=Is({parentId:r.parentNodeId,id:r.id,position:m});return d(p)?p:(Hn({id:Ap(),action:"move.node",payload:{id:r.id,parent:r.parentNodeId,rank:p.value.rank},...e.value}),C({mode:f.MOVE}),l("Move initialized",null))}if(t==="next")return Jo(Cs(1));if(t==="previous")return Jo(Cs(-1));if(t==="to-next")return Jo(bs(1));if(t==="to-previous")return Jo(bs(-1));if(t==="confirm"){let s=Pt();if(!s)return a("No pending move to confirm");let i=await Ve();if(d(i))return i;let c=F([s],i.value);if(d(c))return c;let u=bd();return d(u)?u:(Hn(null),C({mode:f.DEFAULT}),l("Moved item",null))}return t==="cancel"?(Hn(null),C({mode:f.DEFAULT}),l("Cancelling move",null)):a("Invalid move modifier")};import{ulid as Zo}from"ulid";import{monotonicFactory as wp,ulid as Mp}from"ulid";var Pp=wp(),Qo=({name:e,parent:t,rank:n,user:{userId:o,userName:r}})=>{let s=Pp();return l("Created issue events",[{id:Mp(),userId:o,userName:r,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var Sd=async(e,t)=>{let n=X();if(d(n))return a("Unable to resolve user ID");let o=await Ve();if(d(o))return o;let r=o.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=F([m],r);if(d(p))return p;let v=I.getNode(p.value[0].result.id);if(!v)return a("Created node not found");if(!v.parentNodeId)return p;let S=I.getNode(v.parentNodeId);return S?(A.navigate({contextNode:S,selectedIndex:I.getSiblings(v.parentNodeId).findIndex(({id:N})=>N===v.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 v=cn(p.id,n.value,r);return d(v)?v:u({id:Zo(),action:"add.board",payload:{id:Zo(),name:t.inputString,parent:p.id,rank:v.value},...n.value})}if(t.modifier==="swimlane"){let m=Ee(s,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=cn(m.value.id,n.value,r);return d(p)?p:u({id:Zo(),action:"add.swimlane",payload:{id:Zo(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=$(i.id)[c],p=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let j=Ee(s,"SWIMLANE");return d(j)?null:j.value})();if(!p)return a("Unable to add issue in this context");let v=cn(p.id,n.value,r);if(d(v))return v;let S=Qo({name:t.inputString,parent:p.id,rank:v.value,user:n.value});if(d(S))return S;let N=S.value,E=F([...N],r);if(d(E))return E;if(!E.value[0])return a("Issue creation failed");let D=N.find(j=>j.action==="add.issue")?.payload.id;return D?(A.navigate({contextNode:p,selectedIndex:I.getSiblings(p.id).findIndex(({id:j})=>j===D)}),l("Issue created",null)):a("Unable to determine ticket id")}return l("Success",null)};var Nd=async()=>{let e=Ee(g().breadCrumb,"BOARD");if(d(e))return e;let t=await xt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=We({repoRoot:t.value});if(d(n))throw new Error(n.message);let{modifier:o,inputString:r}=q().commandMeta;if(o==="now"){let R=at(n.value);if(d(R))return a(R.message);let M=Vn();if(d(M))return M;let j=Ht(R.value).filter(d);return j.length>0?a(j.map(O=>O.message).join(", ")):(C({mode:f.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),l("Peeking now",!0))}let s;if(o==="prev"){let R=g().eventLog.at(-1),M=Vr(R);if(M===null)return a("No previous event to peek");s=M}else if(o==="next"){let R=g().unappliedEvents.at(0),M=Vr(R);if(M===null)return a("No next event to peek");s=M+1}else{let R=Do(o||r);if(!R)return a("Invalid peek date");s=R.getTime()}let i=g(),c=e.value.id,u=_i(n.value,s);if(d(u))return a(u.message);let{appliedEvents:m,unappliedEvents:p}=u.value,v=Vn();if(d(v))return v;let N=Ht(m).filter(d);if(N.length>0)return Vn(),C(i),a(N.map(R=>R.message).join(", "));let E=g().nodes[c];return E?(A.navigate({contextNode:E,selectedIndex:0}),C({mode:f.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:p}),l("Peeking",!0)):(Vn(),C(i),a("Board did not exist at peek date"))};import Lp from"zod";var Ed=()=>{let e=q().commandMeta.inputString,t=Lp.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=mt({autoSyncDebounceMs:t.data});return d(n)?n:(Fe({autoSyncIntervalMs:t.data}),C({mode:f.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var Rd=()=>{let e=q().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=ua(e),n=mt({autoSync:t});return d(n)?n:(Fe({autoSync:t}),C({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Td=()=>{let e=q().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=mt({logLevel:e});return d(n)?n:(Fe({logLevel:e}),C({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Ad=async()=>{W(""),C({mode:f.DEFAULT});let e=Ue();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 wo();return d(t)?(C({syncStatus:{msg:t.message,status:"failed"}}),t):(C({mode:f.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var kp=e=>e.action==="add.issue.comment",wd=e=>Object.values(g().tags).find(t=>t.name===e),Md=e=>Object.values(g().contributors).find(t=>t.name===e),pt=async()=>{let e=await Ve();return d(e)?e:l("Resolved persist root",e.value)},er=[{systemOnly:!0,intent:P.Move,description:"Internal move-state command",mode:f.COMMAND_LINE,action:Cd},{intent:P.Delete,description:"Delete the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=$(t.id)[n];if(!o)return a("Unable to resolve child to delete");let r=await pt();if(d(r))return r;if(o.context==="COMMENT"){let s=o.id,i=T(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let c=g().nodes[i];if(!c||!T(c))return a("Unable to resolve comment issue");let u=c.log?.filter(kp).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?a("You can only delete your own comments"):F([{id:fe(),action:"delete.issue.comment",payload:{id:s,issue:i},...e.value}],r.value):a("Unable to resolve comment")}return F([{id:fe(),action:"delete.node",payload:{id:o.id},...e.value}],r.value)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:f.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=q().commandMeta,n=/(!=|=)/,[o]=e.split(n);if(!o||!(i=>ae(h.FILTER).map(c=>c.split(n)[0]).includes(i))(o))return a("Invalid filter modifier");let s={target:o,operator:"=",value:t.trim()};return ue(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:f.DEFAULT})),l("Filter updated",null)}},{intent:P.ViewHelp,description:"Open the help screen",mode:f.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return Mt({pendingNavTarget:{contextNode:e,breadCrumb:o,selectedIndex:t,selectedNode:n}}),C({mode:f.HELP}),l("Viewing help",null)}},{intent:P.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=$(t.id)[n];if(!o)return a("Unable to close issue, no target found");if(!T(o))return a("Cannot close in this context");let r=g().nodes[ie];if(!r)return a("Unable to locate closed swimlane");if(o.parentNodeId===r.id)return a("Issue is already closed");let s=await pt();if(d(s))return s;let i=s.value,c=Gt(r.id,o.id,{at:"end"},e.value,i);if(d(c))return c;let u=F([{id:fe(),action:"close.issue",payload:{id:o.id,parent:r.id,rank:c.value},...e.value}],i);return d(u)?u:l("Issue closed",null)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=$(t.id)[n];if(!o)return a("Unable to reopen issue, no target found");let r=o.context==="TICKET"?l("Resolved ticket",o):it(o.id,"TICKET");if(d(r))return a("Cannot reopen in this context");let s=r.value,i=g().nodes[ie];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=Yo(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 pt();if(d(m))return m;let p=m.value,v=Gt(u.id,s.id,{at:"end"},e.value,p);if(d(v))return v;let S=F([{id:fe(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:v.value},...e.value}],p);return d(S)?S:l("Issue reopened",null)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.Init,description:"Initialize Epiq in the current git repository",mode:f.COMMAND_LINE,action:vd},{intent:P.NewItem,description:"Create a new board, swimlane, or issue",mode:f.COMMAND_LINE,action:Sd,onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.Rename,description:"itle] Rename the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=$(t.id)[n];if(!o)return a("Missing node");if(o.readonly)return a("Cannot rename readonly node");let r=Fa();if(!r)return a("Provide a title");let s=await pt();return d(s)?s:F([{id:fe(),action:"edit.title",payload:{id:o.id,name:r},...e.value}],s.value)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.UntagTicket,description:"Remove a tag from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide a tag");let r=wd(o);if(!r)return a(`Tag "${o}" 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(!T(c))return a("Target node is not issue");if(!(c.props.tags??[]).includes(r.id))return a("Issue is not tagged with that tag");let m=await pt();return d(m)?m:F([{id:fe(),action:"remove.issue.tag",payload:{id:c.id,tag:r.id},...e.value}],m.value)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.TagTicket,description:"Add or create a tag on the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide a tag");let{selectedNode:r}=g();if(!r)return a("Invalid tag target");let s=it(r.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 pt();if(d(c))return c;let u=wd(o),m=u?.id??fe();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):F([...u?[]:[{id:fe(),action:"create.tag",payload:{id:m,name:o},...e.value}],{id:fe(),action:"add.issue.tag",payload:{id:i.id,tag:m},...e.value}],c.value)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.AssignUserToTicket,description:"Assign a user to the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide an assignee");let{selectedIndex:r,contextNode:s}=g(),i=$(s.id)[r];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(!T(u))return a("Target node is not issue");let m=await pt();if(d(m))return m;let p=Md(o),v=p?.id??fe();return(u.props.assignees??[]).includes(v)?a("Assignee already assigned"):F([...p?[]:[{id:fe(),action:"create.contributor",payload:{id:v,name:o},...e.value}],{id:fe(),action:"add.issue.assignee",payload:{id:u.id,assignee:v},...e.value}],m.value)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide an assignee to remove");let r=Md(o);if(!r)return a(`Assignee "${o}" 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(!T(c))return a("Target node is not issue");if(!(c.props.assignees??[]).includes(r.id))return a(`Issue is not assigned to "${o}"`);let m=await pt();return d(m)?m:F([{id:fe(),action:"remove.issue.assignee",payload:{id:c.id,assignee:r.id},...e.value}],m.value)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.Comment,description:"Add a comment to the selected issue",mode:f.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return a("Provide a comment");if(n.length>mn)return a(`Cannot exceed ${mn} characters`);let o=X();if(d(o))return a("Unable to resolve user ID");let{breadCrumb:r,selectedNode:s}=g(),i=Ee([...r,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(!T(m))return a("Target node is not issue");let p=await pt();return d(p)?p:F([{id:fe(),action:"add.issue.comment",payload:{id:fe(),issue:m.id,author:o.value.userId,md:n},...o.value}],p.value)},onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.Sync,description:"Pull, commit, and push Epiq state",mode:f.COMMAND_LINE,action:Ad},{intent:P.Peek,description:"View board state at another point in time",mode:f.COMMAND_LINE,action:Nd},{intent:P.Export,description:"Export the current board layout to markdown",mode:f.COMMAND_LINE,action:async()=>{let e=await td();return d(e)?e:(C({mode:f.DEFAULT}),l("Export successful",!0))}},{intent:P.Exit,description:"Exit the application",mode:f.COMMAND_LINE,action:async()=>(A.exit(),l("Exit successful",!0))},{intent:P.Edit,description:"Edit title or description",mode:f.COMMAND_LINE,action:async(e,t)=>pd(t),onSuccess:()=>C({mode:f.DEFAULT})},{intent:P.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:f.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case se.USERNAME:{let{userId:o,preferredEditor:r,userName:s}=_(),i=n||s,c=o??fe();if(!i||!c)return a("Unable to resolve user name or id");let u=mt({userName:i,userId:c,preferredEditor:r??""});return d(u)?u:(Fe({userName:i,userId:c}),C({mode:f.DEFAULT}),l(`Username set to "${i}"`,null))}case se.EDITOR:{if(!n)return a("No editor provided");let o=mt({preferredEditor:n});return d(o)?o:(Fe({preferredEditor:n}),C({mode:f.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case se.VIEW:return n!=="wide"&&n!=="dense"?a("Invalid view mode"):(Fe({viewMode:n}),l(`View set to "${n}"`,null));case se.AUTOSYNC:return Rd();case se.LOG_LEVEL:return Td();case se.SYNC_DEBOUNCE_MS:return Ed();default:return a("Unknown config command")}}},{intent:P.Coffee,description:"Sponsor the development of Epiq!",mode:f.COMMAND_LINE,action:()=>{let e=q().commandMeta.modifier;return e==="custom"?ys("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):ys(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),W(""),l("Thanks you!",null)}}];var Dp=new Set(["peek","filter","view-help"]),Ze=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:o,inputString:r}}=q();if(!t)return a("No command to confirm");if(!e&&n===Et.Invalid)return a("Invalid command");let s=$o(t);Ma();let{readOnly:i}=g();if(i&&!Dp.has(s))return Un({status:ht.Fail,message:"Command not available in readonly state",value:null});let c=er.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return Un({status:ht.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:r,modifier:o})}catch(m){return Un({status:ht.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?Un(u):(Pa({addToHistory:!e}),c.onSuccess?.(),_().autoSync&&Po(),u)};var tr=[{intent:x.Exit,mode:f.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(C({mode:f.COMMAND_LINE}),W("move cancel"),Ze({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:f.DEFAULT,description:"[m] move (init/confirm)",action:()=>(C({mode:f.COMMAND_LINE}),W("move start"),Ze({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:f.MOVE,action:()=>(C({mode:f.COMMAND_LINE}),W("move confirm"),Ze({isForceExecutedBySystem:!0}))}],nr=[{intent:x.MovePreviousItem,mode:f.MOVE,action:()=>Pt()?(C({mode:f.COMMAND_LINE}),W("move previous"),Ze({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveNextItem,mode:f.MOVE,action:()=>Pt()?(C({mode:f.COMMAND_LINE}),W("move next"),Ze({isForceExecutedBySystem:!0})):a("No pending move")}],Pd=[{intent:x.MoveToNextContainer,mode:f.MOVE,action:()=>Pt()?(C({mode:f.COMMAND_LINE}),W("move to-next"),Ze({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveToPreviousContainer,mode:f.MOVE,action:()=>Pt()?(C({mode:f.COMMAND_LINE}),W("move to-previous"),Ze({isForceExecutedBySystem:!0})):a("No pending move")}];var Ld={[w.WORKSPACE]:[...tr,...nr],[w.BOARD]:[...tr,...nr],[w.SWIMLANE]:[...tr,...nr,...Pd],[w.TICKET]:[],[w.FIELD]:[],[w.FIELD_LIST]:[],[w.TEXT]:[],[w.COMMENT]:[]};var kd=()=>{W("");let{pendingNavTarget:e}=wt();C({mode:f.DEFAULT}),e&&A.navigate(e),Mt({pendingNavTarget:void 0})},Dd=[{intent:x.ExitCommandLine,mode:f.HELP,action:()=>(kd(),l("Exiting help",null))},{intent:x.Exit,mode:f.HELP,action:()=>(kd(),l("Closed help",null))},{intent:x.NavPreviousItem,mode:f.HELP,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:x.NavNextItem,mode:f.HELP,action:()=>(A.navigateToNextItem(),l("Navigating to next help item",null))},{intent:x.NavToPreviousContainer,mode:f.HELP,action:()=>(A.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:x.NavToNextContainer,mode:f.HELP,action:()=>(A.navigateToNextContainer(),l("Navigating to next help container",null))}];var Fp=e=>{C({mode:f.COMMAND_LINE});let{pendingNavTarget:t}=wt();t&&A.navigate(t),Mt({pendingNavTarget:void 0}),W(`${e} `)},Fd=()=>{W("");let{pendingNavTarget:e}=wt();e&&A.navigate(e),Mt({pendingNavTarget:void 0}),C({mode:f.DEFAULT})},Bd=[{intent:x.InitCommandPalette,mode:f.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{W("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return Mt({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}}),C({mode:f.PALETTE}),l("Opening command palette",null)}},{intent:x.Confirm,mode:f.PALETTE,action:()=>{let{selectedNode:e}=g();if(!e||!bt(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?(Fp(t),l("Selected command",t)):l("No command selected",null)}},{intent:x.ExitCommandLine,mode:f.PALETTE,action:()=>(Fd(),l("Exiting palette",null))},{intent:x.Exit,mode:f.PALETTE,action:()=>(Fd(),l("Closed command palette",null))},{intent:x.NavPreviousItem,mode:f.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:x.NavNextItem,mode:f.PALETTE,action:()=>(A.navigateToNextItem(),l("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:f.PALETTE,action:()=>(A.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:f.PALETTE,action:()=>(A.navigateToNextContainer(),l("Navigating to next container",null))}];var Ud=[...Dd,...Bd,{intent:x.AddItem,mode:f.DEFAULT,description:"[n] new...",action:()=>(C({mode:f.COMMAND_LINE}),W(`${h.NEW} `),l("Adding new item",null))},{intent:x.Delete,mode:f.DEFAULT,description:"[d] delete",action:()=>(C({mode:f.COMMAND_LINE}),W(`${h.DELETE} `),l("Deleting item",null))},{intent:x.InitCommandLine,mode:f.DEFAULT,description:"[:] focus command line",action:()=>(C({mode:f.COMMAND_LINE}),W(""),l("Entering command line mode",null))},{intent:x.Confirm,mode:f.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=g();if(!H(e?.id??"")?.length){if(e?.title===oe.DESCRIPTION)return C({mode:f.COMMAND_LINE}),W(`${h.EDIT} description `),l("Propose command",!0);if(e?.title===oe.ASSIGNEES)return C({mode:f.COMMAND_LINE}),W(`${h.ASSIGN} `),l("Propose command",!0);if(e?.title===oe.TAGS)return C({mode:f.COMMAND_LINE}),W(`${h.TAG} `),l("Propose command",!0);if(t.title===oe.DESCRIPTION&&e?.context==="TEXT")return C({mode:f.COMMAND_LINE}),W(`${h.EDIT} description `),l("Propose command",!0)}return A.enterChildNode(),l("Entering context",null)}},{intent:x.EditTitle,mode:f.DEFAULT,description:"[r] rename title",action:()=>(C({mode:f.COMMAND_LINE}),W(`${h.EDIT} title ${g().selectedNode?.title}`),l("Exiting context",null))},{intent:x.EditDescription,mode:f.DEFAULT,description:"[e] edit description",action:()=>(C({mode:f.COMMAND_LINE}),W(`${h.EDIT} description `),l("Exiting context",null))},{intent:x.Exit,mode:f.DEFAULT,description:"[q] exit context",action:()=>(A.enterParentNode(),l("Exiting context",null))},{intent:x.NavPreviousItem,mode:f.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:x.NavNextItem,mode:f.DEFAULT,action:()=>(A.navigateToNextItem(),l("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:f.DEFAULT,action:()=>(A.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:f.DEFAULT,action:()=>(A.navigateToNextContainer(),l("Navigating to next container",null))}];var Bp=500,Up=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Od=e=>{let t=Up(e);t&&Wo(n=>(n+t).slice(0,Bp))};var Op=[f.COMMAND_LINE,f.PALETTE],Wp=e=>[{intent:x.MoveCursorLeft,mode:e,action:()=>(is(-1),l("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:e,action:()=>(is(1),l("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:e,action:()=>(as("left"),l("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:e,action:()=>(as("right"),l("Moving cursor right of word",null))},{intent:x.AutoCompleteCommand,mode:e,action:()=>(Wo((t,{remainder:n})=>{let o=n?t+n:t,r="";return o==="edit title "&&(r=g().selectedNode?.title??""),o+r}),l("Auto-completing command",null))},{intent:x.CaptureInput,mode:e,action:(t,{sequence:n})=>(Od(n??""),l("Capturing input",null))},{intent:x.EraseInput,mode:e,action:()=>(Aa(),l("Erasing input",null))},{intent:x.EraseInputWord,mode:e,action:()=>(wa(),l("Erasing input word",null))}],Wd=[{intent:x.Confirm,mode:f.COMMAND_LINE,action:()=>(Ze(),l("Executing command",null))},{intent:x.ViewHelp,mode:f.DEFAULT,action:()=>(C({mode:f.HELP}),l("Viewing help",null))},...Op.flatMap(Wp),{intent:x.ExitCommandLine,mode:f.COMMAND_LINE,action:()=>(C({mode:f.DEFAULT}),l("Exiting command line",null))},{intent:x.GetLastCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(La(),l("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(ka(),l("Getting next command from history",null))}];import jd from"chalk";var or=jd.dim.hex(y.secondary2)(": for command line"),$d="q to exit",_d=`${jd.hex(y.accent)("m")} to confirm`,Ss={[w.WORKSPACE]:[or],[w.BOARD]:[or],[w.BOARD+f.COMMAND_LINE]:[or],[w.SWIMLANE]:[or],[w.TICKET+f.HELP]:[$d],[w.SWIMLANE+f.HELP]:[$d],[w.TICKET]:[],[w.FIELD]:[],[w.SWIMLANE+f.MOVE]:[_d],[w.TICKET+f.MOVE]:[_d]};var Gn=e=>e.trim().toLocaleLowerCase(),$p=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},_p=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},Hd=(e,t)=>{let n=Gn(t.value);if(!n)return!0;switch(t.target){case"title":return Gn(e.title??"").includes(n);case"description":return Gn(e.props.description??"").includes(n);case"tag":return $p(e).map(Gn).some(r=>r.includes(n));case"assignee":return _p(e).map(Gn).some(r=>r.includes(n));default:return!0}};function Vd(e,t,n){let o=t[e];if(!o)return a("buildBreadCrumb(): current node not found");let r=[],s=o;for(;s&&(r.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let i=r[r.length-1];return!i||i.id!==n?a("buildBreadCrumb(): node is not connected to root"):(r.reverse(),l("Breadcrumb built",r))}var Gd=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 Qt,Ns,Es=new Set,zd=()=>{for(let e of Es)e()},Hp=e=>(Es.add(e),()=>Es.delete(e));function Kd(e){let{contextNodeId:t,mode:n,rootNodeId:o,nodes:r,filters:s}=e;if(!t)return a("derive(): contextNodeId is missing");if(!o)return a("derive(): rootNode is missing");if(!r[o])return a("derive(): unable to find root node");let c=r[t];if(!c)return a("Unable to derive state, contextNode not found");let u=Vd(t,r,o);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,v=Ss[p+n]??Ss[p]??[],S=[...Ud,...Ld[p]??[],...Wd],N=Gd(S),E=Vp(r,s),R=E[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:v,availableActions:S,actionIndex:N,selectedNode:R,renderedChildrenIndex:E})}var g=()=>{if(!Qt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Qt},Ue=()=>Qt?l("Retrieved state",Qt):a("State not initialized. Call initWorkspaceState() first.");function Pn(e){Ns=e;let t=He(process.cwd()),n=!1;if(!d(t)){let s=It(t.value);if(d(s))return a(s.message);n=!0}let o={readOnly:!1,filters:[],tags:{},contributors:{},mode:f.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{}},r=Kd(o);return d(r)?r:(Qt=r.value,zd(),l("State initialized",null))}function ue(e){let t=g(),n=e(t),o=Kd(n);return d(o)?a(o.message??"Unable to update state"):(Qt=o.value,zd(),l("State updated",null))}var C=e=>ue(t=>({...t,...e}));var z=()=>jp(Hp,g,g),Vp=(e,t)=>{let n={};for(let o of Object.values(e))T(o)&&t.length>0&&!t.every(r=>Hd(o,r))||!o.parentNodeId||o.isDeleted||((!o.parentNodeId||!n[o.parentNodeId])&&(n[o.parentNodeId]=[]),n[o.parentNodeId].push(o));for(let o of Object.keys(n))n[o].sort((r,s)=>{let i=e[r.id],c=e[s.id];return!i||!c?0:i.rank.localeCompare(c.rank)});return n},$=e=>g()?.renderedChildrenIndex[e]??[],Vn=()=>Ns?Pn(Ns):a("Cannot reset state: no initial workspace found"),un=()=>Qt!==void 0;var Rs=e=>{un()&&(C({syncStatus:e}),$t({type:"sync-status",payload:e}))},rr=(e="Syncing...")=>{Rs({status:"syncing",msg:e})},sr=(e="Synced")=>{Rs({status:"synced",msg:e})},Ts=e=>{Rs({status:"failed",msg:e})},Oe=e=>(Ts(e),a(e));import{decodeTime as QA}from"ulid";var Gp=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=G("getRepoRootDir",await xt(e));if(d(n))return a(n.message);let o=n.value;logger.debug("[sync] repo root",o);let r=G("getStateBranchRoot",We({repoRoot:o}));if(d(r))return a(r.message);let s=r.value;logger.debug("[sync] state branch root",s);let i=G("ensureInitialCommit",await pi(o));if(d(i))return a(i.message);logger.debug("[sync] initial commit result",{created:i.value}),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:o,stateBranchRoot:s,ensureUpstream:t});let c=G("bootstrapStateBranchStorage",await fi({repoRoot:o,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=G("hasInProgressGitOperation(stateBranchRoot)",await ao(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:o,stateBranchRoot:s});let m=G("ensureStateBranchLayout",li(o,s));return d(m)?a(m.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:o,stateBranchRoot:s,bootstrapped:c.value}),l("Sync preconditions satisfied",{repoRoot:o,stateBranchRoot:s,bootstrapped:c.value}))},zp=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 o=G("stageStateBranchOwnEventFile",await go({stateBranchRoot:t,eventFileName:n}));if(d(o))return a(o.message);let r=G("hasStagedChanges(after stage)",await ri(t));if(d(r))return a(r.message);if(logger.debug("[sync] state branch change check after stage result",{changed:r.value}),!r.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 s=G("createStateBranchSyncCommit",await gi({repoRoot:e,stateBranchRoot:t}));return d(s)?a(s.message):(logger.debug("[sync] created sync commit",s.value),l("Committed own event file",{createdCommit:!0,commitSha:s.value}))},Mo=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");rr();let n=G("ensureSyncReady",await Gp({cwd:e,ensureUpstream:!0}));if(d(n))return Oe(n.message);let{repoRoot:o,stateBranchRoot:r,bootstrapped:s}=n.value,i=G("isDetachedHead(stateBranchRoot)",await si(r));if(d(i))return Oe(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return Oe("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,v=G("getStateBranch",nn(o));if(d(v))return Oe(v.message);let S=v.value;logger.debug("[sync] resolved state branch",{stateBranch:S,stateBranchRoot:r});let N=G("commitOwnEventFileToStateBranch",await zp({repoRoot:o,stateBranchRoot:r,ownEventFileName:t}));if(d(N))return Oe(N.message);c=N.value.createdCommit,u=N.value.commitSha;let E=G("pullBranchRebaseIfPresent",await kr({cwd:r,branch:S}));if(d(E))return Oe(E.message);if(m=E.value,c||s){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:r});let R=G("pushStateBranch",await En({stateBranchRoot:r,repoRoot:o}));if(d(R)&&oi(R.message)){let M=G("pullBranchRebaseIfPresent(retry)",await kr({cwd:r,branch:S}));if(d(M))return Oe(M.message);m=m||M.value,R=G("pushStateBranch(retry)",await En({stateBranchRoot:r,repoRoot:o}))}if(d(R))return Oe(R.message);p=R.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:r});let R=G("git rev-parse HEAD",await B({args:["rev-parse","HEAD"],cwd:r}));if(d(R))return Oe(R.message);u=R.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return sr(p?"Synced and pushed":m||c?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),l("Synced event logs with state branch",{repoRoot:o,stateBranchRoot:r,createdCommit:c,commitSha:u,pulled:m,pushed:p,bootstrapped:s})};var As=e=>{let t=He(e??process.cwd());return d(t)?a(t.message):l("Resolved Epiq repo root",t.value)},we=async e=>{let t=As(e);if(d(t))return t;let n=We({repoRoot:t.value});if(d(n))return a(n.message);let o=tn(),r=await Wt({repoRoot:t.value,stateBranchRoot:n.value,stateBranchName:o.stateBranch});if(d(r))return a(r.message);let s=await B({cwd:n.value,args:["pull","--ff-only"]});d(s)&&te.info(3,s.message);let i=at(n.value);if(d(i))return a(i.message);let c=zt(i.value);return d(c)?a(c.message):l("Booted Epiq state",{repoRoot:t.value,stateBranchRoot:n.value})},Me=()=>{let e=jn();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")},_e=()=>{let e=Ue();return d(e)?a(e.message):e},qd=e=>(e.props.tags??[]).map(t=>I.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:re(t.name)})),Yd=e=>(e.props.assignees??[]).map(t=>I.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:re(t.name)}));var Xd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=_e();if(d(n))return n;let o=Object.values(n.value.nodes).filter(T).filter(r=>e.includeClosed||r.parentNodeId!==ie).map(r=>({id:r.id,title:St(r.title),description:r.props.description??"",parentNodeId:r.parentNodeId,isClosed:r.parentNodeId===ie,readonly:!!r.readonly,tags:qd(r),assignees:Yd(r)}));return l("Listed issues",o)},Jd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=cn(e.parentId,n.value,t.value.stateBranchRoot);if(d(o))return o;let r=Qo({name:e.title,parent:e.parentId,user:n.value,rank:o.value});if(d(r))return r;let s=r.value,i=F([...s],t.value.stateBranchRoot);if(d(i))return a(i.message);let c=s.find(u=>u.action==="add.issue")?.payload.id;return c?l("Created issue",{id:c,title:e.title,parentId:e.parentId}):a("Unable to determine created issue id")},Qd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=Gt(ie,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(o))return o;let r={id:ve(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:ie,rank:o.value}},s=F([r],t.value.stateBranchRoot);return d(s)?a(s.message):l("Closed issue",{id:e.issueId})},Zd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!T(r))return a("Target node is not issue");if(r.parentNodeId!==ie)return a("Issue is not closed");let s=Yo(r);if(!s)return a("Unable to resolve previous parent from issue history");if(s===ie)return a("Previous parent resolves to closed swimlane");let i=o.value.nodes[s];if(!i)return a("Previous parent no longer exists");let c=Gt(i.id,r.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let u={id:ve(),...n.value,action:"reopen.issue",payload:{id:r.id,parent:i.id,rank:c.value}},m=F([u],t.value.stateBranchRoot);return d(m)?a(m.message):l("Reopened issue",{id:r.id,parentId:i.id})},ec=async e=>{let t=As(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=We({repoRoot:t.value});if(d(o))return o;let r=at(o.value);if(d(r))return r;let s=zt(r.value);if(d(s))return s;let i=Gt(e.parentId,e.issueId,e.position??{at:"end"},n.value,o.value);if(d(i))return i;let c={id:ve(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:i.value}},u=F([c],o.value);return d(u)?a(u.message):l("Moved issue",{id:e.issueId,parentId:e.parentId})},ir=async(e={})=>{rr();let t=As(e.repoRoot);if(d(t))return a("Sync failed");let n=Me();if(d(n))return n;let o=await Mo({cwd:t.value,ownEventFileName:Vt(n.value)});return d(o)?(Ts(o.message),o):(sr(),l("Synced",o.value))};var Lt=async(e={})=>{let t=await we(e.repoRoot);if(d(t))return t;let n=_e();if(d(n))return n;let o=Object.values(n.value.nodes),r=o.filter(m=>vo(m)&&!m.isDeleted),s=new Map,i=new Map;for(let m of o)if(!m.isDeleted){if(Ct(m)&&m.parentNodeId){let p=s.get(m.parentNodeId)??[];p.push(m),s.set(m.parentNodeId,p)}if(T(m)&&m.parentNodeId){let p=i.get(m.parentNodeId)??[];p.push(m),i.set(m.parentNodeId,p)}}let c=jn();if(d(c))return c;let u={};for(let m of o.filter(T))m.isDeleted||(u[m.id]=I.getCommentsByIssue(m.id).map(p=>{let v=I.getContributor(p.authorId);return{id:p.id,issueId:p.issue,body:p.md,author:{id:p.authorId,name:v?.name??"Unknown",color:re(v?.name??p.authorId)},createdAt:Kp(p.id)}}));return l("Retrieved Epiq GUI state",{boards:r.sort((m,p)=>m.rank.localeCompare(p.rank)).map(m=>({id:m.id,title:m.title,swimlanes:(s.get(m.id)??[]).sort((p,v)=>p.rank.localeCompare(v.rank)).map(p=>({id:p.id,title:p.title,readonly:!!p.readonly,issues:(i.get(p.id)??[]).sort((v,S)=>v.rank.localeCompare(S.rank)).map(v=>({id:v.id,title:St(v.title),description:v.props.description??"",readonly:!!v.readonly,tags:qd(v),assignees:Yd(v),parentNodeId:v.parentNodeId,isClosed:v.parentNodeId===ie})),parentNodeId:p.parentNodeId}))})),tags:Object.values(n.value.tags).map(m=>({...m,color:re(m.name)})),contributors:Object.values(n.value.contributors).map(m=>({...m,color:re(m.name)})),user:{name:c.value.userName??"",id:c.value.userId??"",color:re(c.value.userName??"")},commentsByIssueId:u})},tc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!T(r))return a("Edit target must be an issue");if(r.readonly)return a("Cannot edit readonly issue");let s=r.props.description??"";if(s===e.description)return l("No changes made",{id:e.issueId,description:s});let i={id:ve(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},c=F([i],t.value.stateBranchRoot);return d(c)?a(c.message):l("Edited issue description",{id:e.issueId,description:e.description})},nc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!T(r))return a("Edit target must be an issue");if(r.readonly)return a("Cannot edit readonly issue");let s=St(e.title);if(!s.trim())return a("Issue title cannot be empty");if(r.title===s)return l("No changes made",{id:e.issueId,title:s});let i={id:ve(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},c=F([i],t.value.stateBranchRoot);return d(c)?a(c.message):l("Edited issue title",{id:e.issueId,title:s})},oc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!T(r))return a("Tag target must be an issue");if(r.readonly)return a("Cannot tag readonly issue");let s=St(e.tagName).trim();if(!s)return a("Tag name cannot be empty");let i=Object.values(o.value.tags).find(p=>p.name===s),c=i?.id??ve(),u=[...i?[]:[{id:ve(),...n.value,action:"create.tag",payload:{id:c,name:s}}],{id:ve(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:c}}],m=F(u,t.value.stateBranchRoot);return d(m)?a(m.message):l("Added issue tag",{id:e.issueId,tag:{id:c,name:s}})},rc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!T(r))return a("Untag target must be an issue");if(r.readonly)return a("Cannot untag readonly issue");if(!o.value.tags[e.tagId])return a("Tag not found");let s={id:ve(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},i=F([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue tag",{id:e.issueId,tagId:e.tagId})},sc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!T(r))return a("Assign target must be an issue");if(r.readonly)return a("Cannot assign readonly issue");let s=St(e.assigneeName).trim();if(!s)return a("Assignee name cannot be empty");let i=Object.values(o.value.contributors).find(p=>p.name===s),c=i?.id??ve(),u=[...i?[]:[{id:ve(),...n.value,action:"create.contributor",payload:{id:c,name:s}}],{id:ve(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:c}}],m=F(u,t.value.stateBranchRoot);return d(m)?a(m.message):l("Added issue assignee",{id:e.issueId,assignee:{id:c,name:s}})},ic=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!T(r))return a("Unassign target must be an issue");if(r.readonly)return a("Cannot unassign readonly issue");if(!o.value.contributors[e.assigneeId])return a("Assignee not found");let s={id:ve(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},i=F([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue assignee",{id:e.issueId,assigneeId:e.assigneeId})},ar=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!T(r))return a("Comment target must be an issue");if(r.readonly)return a("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return a("Comment cannot be empty");let i=ve(),c={id:ve(),...n.value,action:"add.issue.comment",payload:{id:i,issue:e.issueId,md:s,author:n.value.userId}},u=F([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Added issue comment",{id:i,issueId:e.issueId,body:s})},dr=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=_e();if(d(o))return o;let r=o.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!r)return a("Unable to resolve comment");if(r.payload.author!==n.value.userId)return a("You can only delete your own comments");let s=o.value.nodes[r.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(o.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return l("Comment already deleted",{id:e.commentId,issueId:r.payload.issue});let c={id:ve(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:r.payload.issue}},u=F([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Deleted issue comment",{id:e.commentId,issueId:r.payload.issue})};var ac=e=>{let t,n,o=!1,r=!1,s=!1,i=()=>{let p=_n();if(d(p))return te.error(p.message);let{autoSync:v,userName:S,preferredEditor:N}=p.value;return!!(v&&S&&N)},c=async()=>{if(!o){if(r){s=!0;return}r=!0;try{await ir({repoRoot:e.repoRoot}),$t({type:"state",payload:await Lt({repoRoot:e.repoRoot})})}finally{r=!1,s&&(s=!1,c())}}},u=(p=750)=>{o||(n&&clearTimeout(n),n=setTimeout(()=>{c()},p))},m=()=>{if(o)return;let p=_n();if(d(p))return te.error(p.message);let{autoSyncDebounceMs:v}=p.value;i()&&(t=setTimeout(()=>{c(),m()},v??15e3))};return m(),{scheduleSync:u,dispose:()=>{o=!0,t&&clearTimeout(t),n&&clearTimeout(n)}}};import{WebSocketServer as qp}from"ws";var Pe=(e,t)=>{e.send(JSON.stringify(t))},zn=async(e,t)=>Pe(e,{type:"state",payload:await Lt({repoRoot:t})}),et=async(e,t,n,o,r)=>{if(Pe(e,{type:o,payload:r}),d(r))return Pe(e,{type:"failed",payload:r.message});n(),zn(e,t)},dc=(e,t,{onStateChanged:n})=>{new qp({server:e,path:"/ws"}).on("connection",r=>{vi(r),r.on("message",async s=>{try{let i=JSON.parse(s.toString()),{type:c}=i;if(c==="state:get")return zn(r,t);if(c==="sync"){let u=await ir({repoRoot:t});return Pe(r,{type:"sync:result",payload:u}),n(),zn(r,t)}if(c==="issue:comment:add"){let u=await ar({repoRoot:t,...i.payload});return et(r,t,n,"issue:comment:add:result",u)}if(c==="issue:comment:delete"){let u=await dr({repoRoot:t,...i.payload});return Pe(r,{type:"issue:comment:delete:result",payload:u}),d(u)?Pe(r,{type:"failed",payload:u.message}):(n(),zn(r,t))}if(c==="issue:edit:description"){let u=await tc({repoRoot:t,...i.payload});return et(r,t,n,"issue:edit:description:result",u)}if(c==="issue:edit:title"){let u=await nc({repoRoot:t,...i.payload});return et(r,t,n,"issue:edit:title:result",u)}if(c==="issue:tag:add"){let u=await oc({repoRoot:t,...i.payload});return et(r,t,n,"issue:tag:add:result",u)}if(c==="issue:tag:remove"){let u=await rc({repoRoot:t,...i.payload});return et(r,t,n,"issue:tag:remove:result",u)}if(c==="issue:assignee:add"){let u=await sc({repoRoot:t,...i.payload});return et(r,t,n,"issue:assignee:add:result",u)}if(c==="issue:assignee:remove"){let u=await ic({repoRoot:t,...i.payload});return et(r,t,n,"issue:assignee:remove:result",u)}if(c==="issues:list")return Pe(r,{type:"issues",payload:await Xd({repoRoot:t})});if(c==="issues:create"){let u=await Jd({...i.payload,repoRoot:t});return Pe(r,{type:"issues:create:result",payload:u}),d(u)?$t({type:"failed",payload:u.message}):($t({type:"issue:created",payload:u.value}),n(),zn(r,t))}if(c==="issues:move"){if(!i.payload.position)return Pe(r,{type:"error",message:"Missing move position"});let u=await ec({...i.payload,repoRoot:t});return et(r,t,n,"issues:move:result",u)}if(c==="issue:close"){if(!i.payload.issueId)return Pe(r,{type:"error",message:"Missing issueId"});let u=await Qd({repoRoot:t,issueId:i.payload.issueId});return et(r,t,n,"issue:close:result",u)}if(c==="issue:reopen"){if(!i.payload.issueId)return Pe(r,{type:"error",message:"Missing issueId"});let u=await Zd({repoRoot:t,issueId:i.payload.issueId});return et(r,t,n,"issue:reopen:result",u)}return Pe(r,{type:"error",message:"Unknown message type"})}catch(i){return Pe(r,{type:"error",message:i instanceof Error?i.message:String(i)})}})})};var Qp=Zt.dirname(Jp(import.meta.url)),Zp=process.env.IS_LOCAL==="true"?Zt.resolve(process.cwd(),"dist/gui"):Zt.join(Qp,"gui"),tt=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},eg=async e=>new Promise((t,n)=>{let o="";e.on("data",r=>{o+=r}),e.on("end",()=>{try{t(o?JSON.parse(o):{})}catch{n(new Error("Invalid JSON body"))}}),e.on("error",n)}),tg=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",cc=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),o=Zt.resolve(Zp),r=Zt.resolve(o,n),s=Zt.relative(o,r);if(s.startsWith("..")||Zt.isAbsolute(s))return tt(t,403,{isError:!0,message:"Forbidden"});try{let i=await Yp(r);return t.writeHead(200,{"content-type":tg(r)}),t.end(i)}catch{return tt(t,404,{isError:!0,message:`Not found: ${n}`})}},ng=async(e,t=3710)=>new Promise((n,o)=>{let r=s=>{let i=u=>{if(e.off("listening",c),u.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),r(0);return}o(u)},c=()=>{e.off("error",i);let u=e.address();if(!u||typeof u=="string"){o(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")};r(t)}),lc=async e=>{let t=Xp.createServer(async(r,s)=>{let i=new URL(r.url??"/","http://127.0.0.1");if(i.pathname==="/api/state")return tt(s,200,await Lt({repoRoot:e.repoRoot}));if(r.method==="POST"&&i.pathname==="/api/comments")try{let c=await eg(r);if(!c.issueId||!c.body?.trim())return tt(s,400,{isError:!0,message:"Missing issueId or body"});let u=await ar({repoRoot:e.repoRoot,issueId:c.issueId,body:c.body});return"isError"in u&&u.isError?tt(s,400,u):tt(s,200,await Lt({repoRoot:e.repoRoot}))}catch(c){return tt(s,400,{isError:!0,message:c instanceof Error?c.message:"Unable to add comment"})}if(r.method==="DELETE"&&i.pathname.startsWith("/api/comments/")){let c=decodeURIComponent(i.pathname.replace("/api/comments/",""));if(!c)return tt(s,400,{isError:!0,message:"Missing comment id"});let u=await dr({repoRoot:e.repoRoot,commentId:c});return"isError"in u&&u.isError?tt(s,400,u):tt(s,200,await Lt({repoRoot:e.repoRoot}))}return i.pathname.startsWith("/board/")?cc("/",s):cc(i.pathname,s)});try{await ng(t)}catch(r){return a(r instanceof Error?`Unable to start GUI server: ${r.message}`:`Unable to start GUI server: ${String(r)}`)}let n=ac({repoRoot:e.repoRoot});dc(t,e.repoRoot,{onStateChanged:()=>n.scheduleSync()}),t.on("close",n.dispose);let o=t.address();return!o||typeof o=="string"?(t.close(),a("Unable to resolve GUI server address")):l("Started GUI server",{url:`http://epiq.localhost:${o.port}${e.boardId?`/board/${e.boardId}`:""}`,server:t})};var uc=async e=>{let t=await lc({...e,boardId:""});if(d(t))return t;let{url:n}=t.value;return console.log(`Epiq GUI running at ${og.cyan(n)}`),Vs(n),l("Started GUI",{url:n})};import{Box as Bt}from"ink";import Q from"react";import{Box as ws,Text as Kn}from"ink";import je,{useEffect as rg,useMemo as sg}from"react";import{ulid as ig}from"ulid";var mc=({text:e,match:t,color:n,highlightColor:o=y.secondary,dimColor:r=!1})=>{if(!t)return je.createElement(Kn,{color:n,dimColor:r},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?je.createElement(Kn,{color:n,dimColor:r},e):je.createElement(Kn,{color:n,dimColor:r},e.slice(0,c),je.createElement(Kn,{backgroundColor:o,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},pc=ig(),ag=e=>`${e}`,dg=e=>{let{pendingNavTarget:t}=wt();if(!t)return[];let{breadCrumb:n,contextNode:o,selectedNode:r}=t,s=new Set(ae(h.NONE,{breadCrumb:n,contextNode:o,readOnly:g().readOnly,selectedNode:r}));return[...new Set(Object.values(h))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==h.PALETTE).map(i=>{let c=$o(i),u=er.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))},cg=e=>Y.text({id:pc,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),lg=(e,t,n)=>Y.text({id:ag(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),Ms=[],ug=e=>{gc();let t=I.createNode(cg(g().rootNodeId));d(t)||!bt(t.value)||(Ms=[t.value,...e.map((n,o)=>lg(n,o,pc)).map(I.createNode).filter(Z).map(({value:n})=>n).filter(bt)],A.navigate({contextNode:t.value,selectedIndex:0}))},gc=()=>{let e=Ms.map(t=>t.id);Ms=[];for(let t of e)I.deleteNode(t)};function fc({width:e,height:t}){let o=Da().value.trim().toLowerCase(),r=sg(()=>dg(o),[o]);rg(()=>(ug(r),()=>{gc()}),[r]);let s=g().selectedIndex;return je.createElement(ws,{flexDirection:"column",width:e,height:t-2},je.createElement(Je,{height:t-4,itemHeight:3,selectedIndex:s},r.map((i,c)=>{let u=c===s,m=i.isAvailable?y.accent:y.secondary2,p=i.isAvailable?"":"[unavailable] ";return je.createElement(ws,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},je.createElement(Kn,{color:m,dimColor:!i.isAvailable},u?"\u276F ":" ",je.createElement(mc,{text:Ci(i.command),match:o,color:m,dimColor:!i.isAvailable})),je.createElement(ws,{paddingLeft:2},je.createElement(mc,{text:p+i.description,match:o.length>=2?o:"",color:u&&i.isAvailable?y.primary:y.secondary2,dimColor:!i.isAvailable})))})))}import{Box as Ng}from"ink";import Ls from"react";import Yn from"chalk";import{Box as Ps,Text as vc}from"ink";import qn,{useEffect as mg,useMemo as pg,useState as gg}from"react";var yc=Yn.hex(y.secondary),fg=Yn.inverse,vg=Yn.inverse.hex(y.secondary2),yg={hint:"",hints:[],overlap:0,remainder:""},xc=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),r=e.length-n.length;return e.slice(r,r+t.length)!==t?null:{start:r,end:r+t.length}},hg=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=re(t);return{bg:o=>Yn.bgHex(n).black(o),bgCursor:o=>Yn.bgHex(n).inverse.black(o)}}return Hr(t)},xg=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let o=xc({value:e,command:t});if(!o)return null;let s=e.slice(o.end).match(/^\s*/)?.[0].length??0,i=o.end+s;return e.slice(i,i+n.length)!==n?null:{start:i,end:i+n.length}},hc=()=>({value:ge.value,cursorPosition:ge.cursorPosition,commandIsPending:ge.commandIsPending,autoCompletion:ge.commandMeta.autoCompletion??yg,infoMessage:ge.commandMeta.infoMessage,validationStatus:ge.commandMeta.validity,command:ge.commandMeta.command,inputString:ge.commandMeta.inputString,modifier:ge.commandMeta.modifier}),Ig=(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,Ic=({width:e,mode:t})=>{let[n,o]=gg(hc());mg(()=>{let S=()=>{let E=hc();o(R=>Ig(R,E)?R:E)},N=ss(S);return S(),()=>{N()}},[]);let{value:r,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:u,command:m,modifier:p}=n,v=pg(()=>{let S=Math.max(0,Math.min(s,r.length)),N=xc({value:r,command:m}),E=xg({value:r,command:m,modifier:p}),R=m?Hr(m):null,M=hg({command:m,modifier:p}),D=(le,be)=>{let en=N&&be>=N.start&&be<N.end,Ot=E&&be>=E.start&&be<E.end;return en&&R?R.fg(le):Ot&&M?M.bg(le):le},j=(le,be)=>{let en=N&&be>=N.start&&be<N.end,Ot=E&&be>=E.start&&be<E.end;return en&&R?R.fgCursor(le):Ot&&M?M.bgCursor(le):fg(le)},O=r.slice(0,S),k=r[S]??" ",Ne=S<r.length?r.slice(S+1):"",ft=Array.from(O).map((le,be)=>D(le,be)).join(""),vt=j(k,S),yt=Array.from(Ne).map((le,be)=>D(le,S+1+be)).join("");if(u.hint){let le=u.hint[u.overlap]??k;vt=vg(le),yt=yc(u.remainder.slice(1)+Ne)}return yc(t===f.PALETTE?"?":":")+ft+vt+yt},[r,s,u,m,p]);return qn.createElement(Ps,{flexDirection:"column",justifyContent:"flex-start"},qn.createElement(Ps,{flexDirection:"column",paddingX:1,borderColor:y.secondary,borderStyle:"round",width:e},qn.createElement(Ps,null,qn.createElement(vc,null,v),i&&qn.createElement(vc,{wrap:"truncate",color:c?y.red:y.secondary2},` ${i} `))))};import{Box as bg,Text as Cg}from"ink";import bc from"react";var Sg=(e,t)=>{let n=[],o=0;for(let r of e){let i=(n.length>0?" | ":"").length+r.length;if(o+i>t-4)break;n.push(r),o+=i}return n},Cc=({width:e,availableHints:t})=>{let n=Sg(t,e).join(" | ");return bc.createElement(bg,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},bc.createElement(Cg,{color:y.secondary2},n.length?n:"\xA0"))};var Xn=({width:e,mode:t,availableHints:n})=>{let o=[],r=0;for(let s of n){let c=(o.length>0?" | ":"").length+s.length;if(r+c>e+2)break;o.push(s),r+=c}return Ls.createElement(Ng,null,t===f.COMMAND_LINE||t===f.PALETTE?Ls.createElement(Ic,{width:e,mode:t}):Ls.createElement(Cc,{width:e,mode:t,availableHints:n}))};import{Box as kt,Text as vn}from"ink";import Ie,{useEffect as Eg,useMemo as Rg}from"react";import{ulid as Sc}from"ulid";var lr=Sc(),Tg=()=>[...new Set([...g().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),o=t?.replace("[",""),r=n?.trim();return[o,r]}).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})),Ag=e=>Y.text({id:lr,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),wg=(e,t,n)=>Y.text({id:Sc(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),cr=[],Nc=()=>{let e=cr.filter(n=>n.id!==lr).map(n=>n.id),t=cr.filter(n=>n.id===lr).map(n=>n.id);cr=[];for(let n of[...e,...t])I.deleteNode(n)},Mg=e=>{Nc();let t=I.createNode(Ag(g().rootNodeId));if(d(t)||!bt(t.value))return logger.error("Could not attach help nodes");cr=[t.value,...e.map((n,o)=>wg(n,o,lr)).map(I.createNode).filter(Z).map(({value:n})=>n).filter(bt)],A.navigate({contextNode:t.value,selectedIndex:0})},Ec=({width:e,height:t})=>{let n=Rg(()=>Tg(),[]);Eg(()=>(Mg(n),()=>{Nc()}),[n]);let o=g().selectedIndex;return Ie.createElement(kt,{flexDirection:"column",marginTop:3,borderColor:y.secondary,borderStyle:"round",width:e,height:t-2},Ie.createElement(kt,{paddingX:1,justifyContent:"center"},Ie.createElement(vn,{color:y.accent},"Help"),Ie.createElement(vn,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Ie.createElement(kt,{paddingX:1,marginTop:1},Ie.createElement(kt,{width:20,justifyContent:"flex-end"},Ie.createElement(vn,{color:y.secondary},"Key(s)")),Ie.createElement(kt,{flexGrow:1,width:40,paddingLeft:2},Ie.createElement(vn,{color:y.secondary},"Action"))),Ie.createElement(Je,{height:t-7,itemHeight:1,selectedIndex:o},n.map(({keys:r,action:s},i)=>{let c=i===o;return Ie.createElement(kt,{paddingX:1,key:`${r}-${s}-${i}`,flexDirection:"row"},Ie.createElement(kt,{width:20,justifyContent:"flex-end"},Ie.createElement(vn,{color:y.accent},r)),Ie.createElement(kt,{flexGrow:1,width:40,paddingLeft:2},Ie.createElement(vn,{color:c?y.primary:y.secondary2},s)))})))};import Pg from"chalk";import{Box as ur,Text as gt}from"ink";import Le from"react";var Rc=({width:e,height:t})=>Le.createElement(ur,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Le.createElement(gt,{color:y.accent,bold:!0},"Initialize project"),Le.createElement(gt,null,`This folder is not an ${Pg.hex(y.accent)("epiq")} project yet.`),Le.createElement(gt,{color:y.primary},"To start tracking issues here, we need to initialize a new",Le.createElement(gt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),Le.createElement(ur,{marginTop:1,flexDirection:"column"},Le.createElement(ur,null,Le.createElement(gt,{color:y.accent}," "),Le.createElement(gt,{color:y.primary},"Type "),Le.createElement(gt,{backgroundColor:y.secondary}," :init "))),Le.createElement(ur,{marginTop:1},Le.createElement(gt,{color:y.secondary2},"This will create, commit and push "),Le.createElement(gt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json ")));import{Box as mr,Text as nt}from"ink";import ce from"react";var Lg=({isDone:e,command:t,value:n})=>ce.createElement(mr,null,ce.createElement(nt,{color:y.accent,dimColor:e},e?" \u2714 ":" "),ce.createElement(nt,{dimColor:e},"Type "),ce.createElement(nt,{backgroundColor:y.secondary,dimColor:e}," "+t+" "),n!==void 0&&ce.createElement(ce.Fragment,null,ce.createElement(nt,{dimColor:e}," "),ce.createElement(nt,{color:y.secondary,dimColor:e},"<"+n+">"))),kg=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function ks({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:o,userName:r,preferredEditor:s,autoSync:i,isSetAutoSync:c}=Nt(),u=[{key:"username",done:o,command:":config username",value:r,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(v=>!v.done),p=m===-1?void 0:u[m];return ce.createElement(mr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},ce.createElement(nt,{color:y.accent,bold:!0},"Welcome! \u{1F539}"),ce.createElement(nt,null,"Let's get you started - it's a breeze."),ce.createElement(nt,{color:y.secondary2},"Remember - you can always search available commands by typing:",ce.createElement(nt,{color:y.accent}," ? ")),p&&ce.createElement(nt,{color:y.secondary2},p.message),ce.createElement(mr,{flexDirection:"column"},u.map((v,S)=>m===-1||S<=m?ce.createElement(mr,{key:v.key,marginBottom:1},ce.createElement(Lg,{isDone:v.done,command:v.command,value:v.done?kg(v.value):void 0})):null)))}import yr from"chalk";import{Box as vr,Text as Qn}from"ink";import ye from"react";import{Box as pr,Text as Tc}from"ink";import Dt from"react";var Dg=e=>(I.getTag(e)?.name??"").length+3,Fg=e=>(I.getContributor(e)?.name??"").length+3,Ac=({width:e})=>{let{viewMode:t}=_(),n=z(),{breadCrumb:o,contextNode:r,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[r.id]?.[s],u=it(c?.id??r.id,"TICKET"),m=Z(u)?u.value:void 0,p=m?.props.tags??[],v=m?.props.assignees??[],S=m?.parentNodeId?!$r(r.id,m.parentNodeId)&&t==="dense":!1,N=o.map((k,Ne)=>{let ft=Ne===o.length-1,vt=H(k.id),yt=ft?vt?.[s]?.title:void 0;return`${Ne?" / ":""}${k.title??""}${yt?` \u25B8 ${yt}`:""}`}).join(""),E=m?I.getCommentsByIssue(m.id):[],R=E.length?String(E.length).length+11:0,M=S?p.reduce((k,Ne)=>k+Dg(Ne),0)+v.reduce((k,Ne)=>k+Fg(Ne),0)+R:0,D=Math.max(0,e-M),j=N.substring(0,D),O=S?[...p.map(k=>Dt.createElement(pr,{key:`tag-${k}`,paddingLeft:1},Dt.createElement(gn,{id:k}))),...v.map(k=>Dt.createElement(pr,{key:`assignee-${k}`,paddingLeft:1},Dt.createElement(Rt,{id:k}))),E.length?Dt.createElement(pr,{key:"comments",paddingLeft:1},Dt.createElement(Tc,{color:y.accent},"[",E.length," comment",E.length===1?"":"s","]")):null]:[];return Dt.createElement(pr,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Dt.createElement(Tc,{color:y.secondary2},j),O)};import{Box as Bg,Text as wc}from"ink";import gr from"react";var Ug=({filters:e})=>gr.createElement(Bg,{columnGap:1},gr.createElement(wc,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:o})=>gr.createElement(wc,{backgroundColor:"black",color:"white"},` ${n}${o}"${t}" `))),Mc=gr.memo(Ug);import{Box as Og,Text as fr}from"ink";import Jn from"react";function Pc(){let{eventLog:e,unappliedEvents:t}=z(),n=e.at(-1)?.id,o=Co(n??""),r=Z(o)?Fi(o.value):"INVALID DATE";return Jn.createElement(Og,{paddingLeft:1},Jn.createElement(fr,{backgroundColor:y.accent,color:y.secondary}," Readonly "),Jn.createElement(fr,{color:y.accent}," "+t.length+" edits ago at "+r+"."),Jn.createElement(fr,{color:y.accent}," Resume with "),Jn.createElement(fr,{backgroundColor:y.accent,color:y.secondary}," ",":peek now"," "))}import Ds from"chalk";import{Box as Wg,Text as Lc}from"ink";import Fs,{useEffect as $g,useState as _g}from"react";var jg=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],kc=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)}},Hg=({r:e,g:t,b:n})=>{let o=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(n)}`},Vg=(e,t,n)=>{let o=kc(e),r=kc(t);return Hg({r:o.r+(r.r-o.r)*n,g:o.g+(r.g-o.g)*n,b:o.b+(r.b-o.b)*n})},Gg=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),o=Math.floor(n),r=n-o,s=e[o],i=e[Math.min(o+1,e.length-1)];return Vg(s,i,r)};function Dc({syncStatus:e,autoSync:t}){let[n,o]=_g(0);$g(()=>{if(e.status!=="syncing"){o(0);return}let c=setInterval(()=>{o(u=>u+1)},50);return()=>clearInterval(c)},[e.status]);let r={synced:" ",failed:"---",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,pending:y.secondary2,syncing:Gg(jg,(Math.sin(n*.12)+1)/2)??""}[e.status];return Fs.createElement(Wg,null,Fs.createElement(Lc,null,Ds.hex(y.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Fs.createElement(Lc,null,Ds.hex(i)("\u25CF")+Ds.hex(y.secondary2).dim(` ${r[e.status].padEnd(4)} `)))}import Wc from"chalk";import{Text as $c}from"ink";import _c,{useEffect as Yg,useState as Xg}from"react";var yn="0.7.5";import Bs from"chalk";var zg="https://registry.npmjs.org/epiq/latest",Us=null,Fc=0,Kg=1e3*60*60*24,Bc=e=>e.replace(/^v/,""),qg=(e,t)=>{let n=Bc(e).split(".").map(Number),o=Bc(t).split(".").map(Number);for(let r=0;r<Math.max(n.length,o.length);r++){let s=n[r]??0,i=o[r]??0;if(s>i)return 1;if(s<i)return-1}return 0},Uc=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Us&&Date.now()-Fc<Kg)return Us;try{let t=await fetch(zg);if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.status}`);let o=(await t.json()).version??null,r={current:e,latest:o,updateAvailable:o?qg(o,e)>0:!1};return Us=r,Fc=Date.now(),r}catch{return{current:e,latest:null,updateAvailable:!1}}},Oc=(e,t)=>{let n=e.split("."),o=t.split("."),r=o.findIndex((s,i)=>s!=n[i]);return o.map((s,i)=>i>=r?Bs.hex(y.accent).dim(s):Bs.hex(y.secondary).dim(s)).join(Bs.hex(y.secondary2).dim("."))};function jc(){let[e,t]=Xg({current:yn,latest:null,updateAvailable:!1});return Yg(()=>{let n=!0;return Uc(yn).then(o=>{n&&t(o)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?_c.createElement($c,{dimColor:!0,color:y.secondary2},yn+" "):_c.createElement($c,null,Wc.hex(y.secondary2).dim(yn),Wc.hex(y.accent).dim(" \u2197 "),Oc(yn,e.latest))}function Zn({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:o,mode:r}=z(),{userName:s,preferredEditor:i,autoSync:c}=_(),u=64,m=process.stdout.columns-u-8;return ye.createElement(vr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?ye.createElement(Qn,null," "):r===f.PALETTE?ye.createElement(vr,null,ye.createElement(Qn,{color:y.accent},"Command Palette"),ye.createElement(Qn,{dimColor:!0,color:y.secondary2}," ","- search, select and press enter")):ye.createElement(vr,{paddingLeft:1},e.length>0?ye.createElement(Mc,{filters:e}):ye.createElement(Ac,{width:m})),n==="live"?ye.createElement(vr,{columnGap:1,paddingRight:2,"max-width":u,overflow:"hidden",justifyContent:"flex-end"},ye.createElement(Dc,{autoSync:!!c,syncStatus:o}),ye.createElement(Qn,null,yr.hex(y.secondary2).dim("Mode: ")+yr.hex(y.secondary2).dim(r.padEnd(8," "))," "),ye.createElement(Hc,{icon:"@",value:s}),ye.createElement(Hc,{icon:"\u276F",value:i}),ye.createElement(jc,null)):"",n==="peek"?ye.createElement(Pc,null):"")}function Hc({icon:e,value:t}){return ye.createElement(Qn,null,yr.dim(e)+yr.hex(y.accent)(` ${t??"-"} `))}import{Box as Jg,Text as Qg}from"ink";import eo from"react";import{Box as hr,Text as Os}from"ink";import Ft from"react";function Ws(){let e=z(),t=e.nodes[e.rootNodeId],r=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?$(t?.id):[];return Ft.createElement(hr,{flexDirection:"column",height:r,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},Ft.createElement(hr,{padding:1,paddingTop:0,paddingBottom:0},Ft.createElement(Os,null,"Select a board:")),Ft.createElement(hr,{padding:1,flexDirection:"column"},i.map((c,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,v=$(c.id).flatMap(({id:S})=>H(S)).length;return Ft.createElement(hr,{key:c.id??u},Ft.createElement(Os,{color:m?y.accent:y.secondary2},Ft.createElement(xe,{isSelected:m})),Ft.createElement(Os,{color:m?y.accent:y.secondary2},c.title," (",v," issues)",c.readonly?" \u{1F512}":""))})))}var Zg=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:o,viewMode:r,height:s,width:i})=>{let{renderedChildrenIndex:c}=z(),u=n.find(({context:S})=>S==="BOARD"),v=s-1-3;return eo.createElement(Jg,{flexDirection:"row"},e.context==="WORKSPACE"?eo.createElement(Ws,null):u?eo.createElement(Ko,{height:v,width:i,swimlanes:(c[u.id]??[]).filter(S=>S!==void 0&&Ct(S)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o}):eo.createElement(Qg,null))},Vc=eo.memo(Zg);import{useEffect as ef}from"react";var tf=e=>{ef(()=>{if(!e)return;let t,n=!1,o=()=>{if(n)return;let{autoSyncIntervalMs:r,userName:s,preferredEditor:i}=_();i&&s&&r&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:u}=g();u==="default"&&!c&&Po(),o()},r))};return o(),()=>{n=!0,t&&clearTimeout(t)}},[e])},Gc=({autoSync:e})=>(tf(e),null);function $s({width:e,height:t}){let n=z(),{autoSync:o,viewMode:r}=Ai(),s=n.filters;if(n.mode===f.HELP)return Q.createElement(Bt,{flexDirection:"column"},Q.createElement(Ec,{width:e,height:t}));if(n.mode===f.PALETTE)return Q.createElement(Bt,{flexDirection:"column"},Q.createElement(Zn,{filters:s}),Q.createElement(fc,{width:e,height:t-2}),Q.createElement(Xn,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=Nt(),c=!i,u=i&&!n.hasProjectDefinition;if(c)return Q.createElement(Bt,{flexDirection:"column"},Q.createElement(Bt,{flexDirection:"column"},Q.createElement(Zn,{hideBreadCrumb:!0,filters:s}),Q.createElement(ks,{height:t,width:e})),Q.createElement(Xn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(u)return Q.createElement(Bt,{flexDirection:"column"},Q.createElement(Bt,{flexDirection:"column"},Q.createElement(Zn,{hideBreadCrumb:!0,filters:s}),Q.createElement(Rc,{height:t,width:e})),Q.createElement(Xn,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=Ee(n.breadCrumb??[],"BOARD");if(Z(m)){let p=m.value.id,v=$(p).length,S=3,N=Math.floor(e/S),E=Math.floor(e/Math.max(v,1));e=Math.min(E,N)*Math.max(v,S)}return Q.createElement(Bt,{flexDirection:"column"},Q.createElement(Gc,{autoSync:o}),Q.createElement(Bt,{flexDirection:"column"},Q.createElement(Zn,{filters:s}),Q.createElement(Vc,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:r??"dense",mode:n.mode})),Q.createElement(Xn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import nf from"readline";var xr,Ir,ot,of=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.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]),zc=async e=>{if(e.ctrl&&e.name==="c")return A.exit();let{actionIndex:t,mode:n,readOnly:o}=g(),r=Ba(e,n);if(!r||o&&!of.has(r))return;let s=t[n]?.[r];if(s?.action)try{await s.action(s,e)}catch(i){logger.error(i)}},rf=()=>async function(t,n){n.name!=="escape"&&(ot&&(clearTimeout(ot),ot=void 0),await zc(n))},sf=()=>async function(t){if(t.length===1&&t[0]===27){ot&&clearTimeout(ot),ot=setTimeout(()=>{zc({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),ot=void 0},25);return}ot&&(clearTimeout(ot),ot=void 0)};function Kc(){xr&&process.stdin.removeListener("keypress",xr),Ir&&process.stdin.removeListener("data",Ir),xr=rf(),Ir=sf(),nf.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Ir),process.stdin.on("keypress",xr)}async function qc(){try{let e=jn();Z(e)&&Fe(e.value);let t=He(process.cwd()),n=[];if(Z(t)){let s=We({repoRoot:t.value});if(d(s))return Kt(3,s.message);let i=tn(),c=await Wt({repoRoot:t.value,stateBranchRoot:s.value,stateBranchName:i.stateBranch});if(d(c))return Kt(3,c.message);let u=await B({cwd:s.value,args:["pull","--ff-only"]});d(u)&&logger.info(3,u.message);let m=at(s.value);if(d(m))return Kt(3,m.message);n=m.value}let o=zt(n);if(d(o))return Kt(4,o.message);C({hasProjectDefinition:Z(t),hasInitializingEvents:!!n.length});let r=_s();return d(r)?Kt(6,r.message):(Kc(),l("Booted Epiq",void 0))}catch(e){return Kt(0,Ao(e))}}ld();var lf=`${Ut.bold("Epiq CLI")}
58
58
 
59
59
  ${Ut.dim("Boot in directory:")}
60
60
  ${Ut.cyan("$ epiq")}
61
61
 
62
62
  ${Ut.dim("Launch GUI:")}
63
63
  ${Ut.cyan("$ epiq gui")}
64
- `,ef=Jg(Zg,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}}),xr=ef.input[0];xr&&xr!=="gui"&&(console.error(Ut.red(`Unknown command: ${xr}`)),process.exit(1));var Gc=process.stdout.columns||120,Kc=process.stdout.rows||20,hr=null,tf=e=>{try{return hr?(hr.rerender(e),l("Rerendered app",void 0)):(hr=Xg(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${To(t)}`)}},Ws=()=>tf(Qg.createElement($s,{width:Gc,height:Kc}));process.stdout.on("resize",()=>{if(Gc=process.stdout.columns||120,Kc=process.stdout.rows||20,!hr)return;let e=Ws();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(xr==="gui"){let e=await ac({repoRoot:process.cwd()});d(e)&&(console.error(Ut.red(`Failed to start Epiq GUI:
65
- ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await Vc();d(e)&&(logger.info(e.message),console.error(Ut.red(`Failed to boot Epiq:
66
- ${e.message}`)),process.exitCode=1)}export{Ws as renderApp};
64
+ `,uf=df(lf,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}}),br=uf.input[0];br&&br!=="gui"&&(console.error(Ut.red(`Unknown command: ${br}`)),process.exit(1));var Yc=process.stdout.columns||120,Xc=process.stdout.rows||20,Cr=null,mf=e=>{try{return Cr?(Cr.rerender(e),l("Rerendered app",void 0)):(Cr=af(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${Ao(t)}`)}},_s=()=>mf(cf.createElement($s,{width:Yc,height:Xc}));process.stdout.on("resize",()=>{if(Yc=process.stdout.columns||120,Xc=process.stdout.rows||20,!Cr)return;let e=_s();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(br==="gui"){let e=await uc({repoRoot:process.cwd()});d(e)&&(console.error(Ut.red(`Failed to start Epiq GUI:
65
+ ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await qc();d(e)&&(logger.info(e.message),console.error(Ut.red(`Failed to boot Epiq:
66
+ ${e.message}`)),process.exitCode=1)}export{_s as renderApp};