epiq 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,66 +1,66 @@
1
1
  #!/usr/bin/env node
2
- import Ot from"chalk";import{render as lf}from"ink";import uf from"meow";import mf from"react";import rg 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 el}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];el(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as Xp}from"node:fs/promises";import Jp from"node:http";import en from"node:path";import{fileURLToPath as Qp}from"node:url";import{decodeTime as qp,ulid as ve}from"ulid";import Dr from"node:fs";import gl from"node:os";import ze from"node:path";import In from"node:fs";import{ulid as ol}from"ulid";import{z as so}from"zod";import hn from"node:fs";import rt from"node:path";var Ef=process.env.IS_LOCAL==="true",st=".epiq",ke=".epiq-global",to="events",tl="project.json",no=e=>rt.join(e,st),oo=e=>rt.join(no(e),tl),xn=e=>rt.join(no(e),to),Gs=e=>rt.join(e,st),nl=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(nl(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 rl="__epiq_state__",sl=so.object({projectId:so.string().min(1),stateBranch:so.string().min(1),createdAt:so.iso.datetime()}),nn=()=>({projectId:ol(),stateBranch:rl,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=sl.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 il from"util";var Ys=1e3,al=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 dl(){let e=Js();if(!e||!bn.existsSync(e))return;let n=bn.readFileSync(e,"utf8").split(`
2
+ import Ot from"chalk";import{render as uf}from"ink";import mf from"meow";import pf from"react";import sg 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 tl}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];tl(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as Jp}from"node:fs/promises";import Qp from"node:http";import en from"node:path";import{fileURLToPath as Zp}from"node:url";import{decodeTime as Yp,ulid as ve}from"ulid";import Dr from"node:fs";import fl from"node:os";import ze from"node:path";import In from"node:fs";import{ulid as rl}from"ulid";import{z as so}from"zod";import hn from"node:fs";import rt from"node:path";var Rf=process.env.IS_LOCAL==="true",st=".epiq",De=".epiq-global",to="events",nl="project.json",no=e=>rt.join(e,st),oo=e=>rt.join(no(e),nl),xn=e=>rt.join(no(e),to),Gs=e=>rt.join(e,st),ol=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(ol(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=$e({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};var sl="__epiq_state__",il=so.object({projectId:so.string().min(1),stateBranch:so.string().min(1),createdAt:so.iso.datetime()}),nn=()=>({projectId:rl(),stateBranch:sl,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=il.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 al from"util";var Ys=1e3,dl=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 cl(){let e=Js();if(!e||!bn.existsSync(e))return;let n=bn.readFileSync(e,"utf8").split(`
4
4
  `);if(n[n.length-1]===""&&n.pop(),n.length<=Ys)return;let o=n.slice(-Ys).join(`
5
5
  `)+`
6
- `;bn.writeFileSync(e,o,"utf8")}function Ar(e,t,n=!1){let o=Js();if(!o)return;let r=il.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>=al&&(Tr=0,dl())}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 cl}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 on=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,ll={...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=cl("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:ll}),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(`
6
+ `;bn.writeFileSync(e,o,"utf8")}function Ar(e,t,n=!1){let o=Js();if(!o)return;let r=al.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>=dl&&(Tr=0,cl())}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 ll}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 on=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)},Fe="origin";var Qs=1e4,ul={...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=ll("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:ul}),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
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
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}),rn=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())},ul=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))},ml=async e=>{let t=await ul(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 ml(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"),pl=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 pl(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(gl.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))},fl=e=>ze.join(e,st),ii=e=>ze.join(fl(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.
12
+ ${o.message}`):l("Created commit and resolved SHA",o.value.stdout.trim())},ml=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))},pl=async e=>{let t=await ml(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 pl(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",Fe],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},co=async({repoRoot:e,branch:t})=>{let n=await Ge({args:["ls-remote","--heads",Fe,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${Fe}/${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"),gl=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 gl(e);if(d(o))return a(o.message);let r=await ne.fetch({cwd:e,remote:Fe,branch:t});if(d(r))return a(`Failed to fetch ${t}
14
+ ${r.message}`);let s=await ne.pullRebase({cwd:e,remote:Fe,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(fl.homedir(),De),mo=()=>ze.join(di(),"worktrees"),$e=({repoRoot:e})=>{let t=Ks(e);return d(t)?a(t.message):l("Resolved state branch root",ze.join(mo(),t.value))},vl=e=>ze.join(e,st),ii=e=>ze.join(vl(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
16
  `+e.message);let t=Sn(mo());return d(t)?a(`Ensure worktrees dir failed.
17
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 rn({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)),gv=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 sn 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",vl=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
20
+ ${r.message}`);let s=await rn({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)),fv=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 sn 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",yl=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)},yl=async({repoRoot:e,stateBranchName:t})=>{let n=await Pr({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
22
+ ${r.message}`):l("Created state branch",!0)},hl=async({repoRoot:e,stateBranchName:t})=>{let n=await Pr({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
23
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
24
+ `+r.message);let s=r.value;if(o&&s){let c=await ne.fetch({cwd:e,remote:Fe,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
25
25
  ${c.message}`)}let i=await lo({repoRoot:e,branch:t});if(d(i))return a(`Ensure local state branch failed
26
- `+i.message);if(i.value)return l("Local state branch already exists",!1);if(s){let c=await 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 Br({repoRoot:e,stateBranchName:t})},hl=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)},xl=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=Sn(Nn.dirname(t));if(d(o))return a(`Failed to create state branch worktree
26
+ `+i.message);if(i.value)return l("Local state branch already exists",!1);if(s){let c=await B({args:["branch","--track",t,`${Fe}/${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 Br({repoRoot:e,stateBranchName:t})},xl=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)},Il=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
29
  `+o.message);sn.existsSync(t)&&!sn.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)},$t=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await hl({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&&sn.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
30
+ ${r.message}`):l("Created state branch worktree",!0)},$t=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await xl({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&&sn.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
31
  ${u.message}`)}if(s&&!sn.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
32
  ${u.message}`)}let i=await ti({repoRoot:e,worktreeRoot:t});if(d(i))return a(i.message);let c=sn.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 xl({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Il=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)},bl=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=on(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
33
+ ${u.message}`)}return Il({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},bl=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)},Cl=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=on(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:Fe,branch:s});if(d(c))return a(`Failed to fetch ${s}
35
+ ${c.message}`);let u=await ne.setUpstream({cwd:t,branch:s,upstream:`${Fe}/${s}`});return d(u)?a(`Failed to set state branch upstream
36
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(!sn.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 vl(e);return d(n)?a(`Create state branch sync commit failed
38
- `+n.message):rn({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=on(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=on(e);if(d(r))return r;let s=r.value,i=[po(),await yl({repoRoot:e,stateBranchName:s}),await $t({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await Il({stateBranchRoot:t,stateBranchName:s}),await ui(t),n?await bl({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 Cl}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===Cl.OPEN&&n.send(t)};import{useSyncExternalStore as Hp}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,Sl=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(Sl(e),o).filter(s=>yo(o,s)>=n)};var Nl={hint:"",hints:[],overlap:0,remainder:""},Ti=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},o)=>{if(n||e==="")return Nl;let r=Ri({wordList:o,inputToMatch:e,overlapThreshold:1});return El(t,r)},El=(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 Rl}from"react";var An={logLevel:"info",autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Or=new Set,Tl=()=>{for(let e of Or)e()},_=()=>An,Ai=()=>Rl(e=>(Or.add(e),()=>{Or.delete(e)}),()=>An),Fe=e=>(An={...An,...e},Tl(),An);import{ulid as Ml}from"ulid";var an=24n,Al=an*4n,qe=(1n<<Al)-1n,wl=/^[0-9a-f]+$/;function wi(e){return!e||!wl.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function Be(e,t=an){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,an);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,an);let i=(r+s)/2n;return i===r||i===s?a("No rank space available between neighbors"):Be(i,an)}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,an);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:Ml(),action:"rebalance.children",payload:{parent:e,ranks:r},...t})};import{ulid as Lu}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},jt=(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=jt(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=jt(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=jt(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=jt(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=jt(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=jt(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=jt(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 Ht from"chalk";import Bi from"string-width";import{decodeTime as Ol}from"ulid";import cn 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},dn={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},Pl=e=>e.toLowerCase().trim(),Ll=(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)]},kl=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var Dl=(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 Fl=(e,t,n)=>Dl(e,t,n),wn=e=>{let n=Li(e)%360,o=Ll(n,jr.stringColor.saturation,jr.stringColor.lightness);return kl(o)},re=(e,t=dn)=>{let n=Pl(e);return n&&t[n]?t[n]:wn(n)};var Bl=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 Fl(t[s],t[s+1],i)},xo=e=>Li(e.toLowerCase().trim())/4294967295,ki=e=>{let t=xo(e);return Bl(t)},Ul=e=>{let[t,n,o]=ki(e);return{normal:r=>cn.bgRgb(t,n,o).black(r),cursor:r=>cn.bgRgb(t,n,o).white.bold(r)}},Hr=e=>{let[t,n,o]=ki(e);return{fg:r=>cn.rgb(t,n,o)(r),fgCursor:r=>cn.rgb(t,n,o).inverse(r),bg:r=>cn.bgRgb(t,n,o).black(r),bgCursor:r=>cn.bgRgb(t,n,o).white.bold(r)}},Io=e=>Ul(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 Wl=(e,t)=>e+" ".repeat(Math.max(0,t-Bi(e))),$l=(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`),jl=(e,t)=>t?e<t?"up":e>t?"down":null:null,Hl=(e,t)=>{let n=I.getNode(e.payload.parent),o=n?Ht.dim.bgBlack(` ${n.title} `):"unknown",r=t.at(-1);if(r&&"parent"in r&&"rank"in r&&r.parent===e.payload.parent){let s=jl(e.payload.rank,r.rank);if(s)return`Moved ${s} in ${o}`}return`Moved issue to ${o}`},Vl=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?Ht.bgHex(re(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?Ht.bgHex(re(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?Ht.hex(re(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?Ht.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""}},Gl=e=>{let t=bo(Ol(e));return Ht.gray($l(t,8))},zl=12,Kl=e=>Wl(`${e}`,zl),Ui=(e,t)=>{let n=Gl(e.id),o=Kl(e.userName),r=Ht.dim("\u203A"),s=e.action==="move.node"?Hl(e,t):[_l(e.action),Vl(e)].filter(Boolean).join(" ");return`${o} ${n} ${r} ${s}`};import{createHash as ql}from"node:crypto";var Yl="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Xl=e=>{let t=ql("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+=Yl[Number(n>>s&31n)]}return o},Se=(e,t)=>Xl(`${e}:virtual:${t}`);var Jl=e=>Se(e,"comments"),Ql=e=>Se(e,"description"),Zl=e=>Se(e,"assignees"),eu=e=>Se(e,"tags"),tu=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:Ql(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:Zl(e.id),name:oe.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(c))return c;let u=Oi({id:eu(e.id),name:oe.TAGS,parentNodeId:e.id,rank:o.value,readonly:!0});if(d(u))return u;let m=Gr({id:Jl(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:tu(e.id),name:oe.HISTORY,parentNodeId:e.id,rank:s.value,value:nu(e),readonly:!0,childRenderAxis:"vertical"});return d(p)?p:l("Ticket virtual nodes materialized",void 0)},nu=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 ou=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ie,So]=ou;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},ru=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},su=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},iu=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},au=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 iu(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[]}},du=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},cu=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?L("Invalid user ID format",e):l("Valid user",null)},lu=(e,t)=>{let n=cu(e);if(d(n))return n;let o=[...new Set(au(e))];t||(o.forEach(s=>su(s,e)),du(e));let r=ru(o);return r||null},uu={"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=uu[e.action](e);if(d(n))return n;let o=lu(e,t);return o||n}var Vt=e=>e.map(t=>Mn(t));import Cu from"node:fs";import Su from"node:path";import{decodeTime as Nu,monotonicFactory as Eu}from"ulid";import{z as Ln}from"zod";import No from"node:fs";import Kr from"node:path";import{decodeTime as mu}from"ulid";import{z as zr}from"zod";var pu=zr.object({userId:zr.string().min(1).default("unknown"),userName:zr.string().min(1).default("unknown")}),gu=e=>{let[t,n]=Kr.basename(e,".jsonl").split("."),o=pu.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(", ")}`)},fu=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])},vu=(e,t)=>t in e,yu=({id:e,action:t,payload:n,userId:o,userName:r})=>({id:e,action:t,payload:n,userId:o,userName:r}),hu=e=>{let{userId:t,userName:n,...o}=e,r=fu(o);if(d(r))return a(r.message);let s=r.value,i=e.id?.[0];return i?vu(o,s)?l("Decoded persisted event",yu({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=hu(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)},xu=e=>{if(!No.existsSync(e))return l("Event file missing",[]);let t=gu(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=xu(r);if(d(s))return a(s.message);o.push(...s.value)}return l("All events loaded",Iu(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}=bu(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 Iu=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},bu=(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=mu(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=Eu(),Ru=Ln.tuple([Ln.string().min(1),Ln.string().min(1).nullable()]),Tu=Ln.looseObject({v:Ln.literal(zi),id:Ru}),Xr=e=>{let t=Tu.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",Au=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),wu=e=>e.trim().length>0&&e.length<=80,X=()=>{let{userName:e,userId:t}=_();return e?t?Au(t)?wu(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")},Gt=({userId:e,userName:t})=>`${Gi(e)}.${Gi(t)}.jsonl`,Mu=(e,{userId:t,userName:n})=>{let o=Gt({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(o))return a(`Invalid event log file name: ${o}`);let s=Su.join(xn(e),o);return l("Successfully resolved event log path",s)},Pu=(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=Mu(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(),Nu(r.value)+1)):Vi(),i=Pu(Hi(e),[s,r.value]);return d(i)?a(i.message):(Cu.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=ku(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 ku=(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:Lu(),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),zt=(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)},ln=(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}},Du=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},Fu=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},oa=e=>{let{nodes:t,rootNodeId:n}=g();if(Du(e.contextNodeId)&&To(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Fu(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 Bu,ulid as dt}from"ulid";var kn=Bu();function Uu(){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 Ou(){let e=Uu();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 Kt(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=Vt(e).filter(d);return n.length>0?a(`Materializing failed:
37
+ ${r.message}`):l("Staged state branch event file",void 0)},gi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await yl(e);return d(n)?a(`Create state branch sync commit failed
38
+ `+n.message):rn({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=on(e);if(d(o))return o;let r=o.value,s=n.value?await ne.push({cwd:t}):await ne.push({cwd:t,remote:Fe,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=on(e);if(d(r))return r;let s=r.value,i=[po(),await hl({repoRoot:e,stateBranchName:s}),await $t({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await bl({stateBranchRoot:t,stateBranchName:s}),await ui(t),n?await Cl({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 Sl}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===Sl.OPEN&&n.send(t)};import{useSyncExternalStore as Vp}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,Nl=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(Nl(e),o).filter(s=>yo(o,s)>=n)};var El={hint:"",hints:[],overlap:0,remainder:""},Ti=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},o)=>{if(n||e==="")return El;let r=Ri({wordList:o,inputToMatch:e,overlapThreshold:1});return Rl(t,r)},Rl=(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 Tl}from"react";var An={logLevel:"info",autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Or=new Set,Al=()=>{for(let e of Or)e()},_=()=>An,Ai=()=>Tl(e=>(Or.add(e),()=>{Or.delete(e)}),()=>An),Be=e=>(An={...An,...e},Al(),An);import{ulid as Pl}from"ulid";var an=24n,wl=an*4n,qe=(1n<<wl)-1n,Ml=/^[0-9a-f]+$/;function wi(e){return!e||!Ml.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function Ue(e,t=an){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 Ue(qe/2n,an);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 Ue(qe/2n,an);let i=(r+s)/2n;return i===r||i===s?a("No rank space available between neighbors"):Ue(i,an)}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=Ue(r,an);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:Pl(),action:"rebalance.children",payload:{parent:e,ranks:r},...t})};import{ulid as ku}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},jt=(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=jt(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=jt(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=jt(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=jt(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=jt(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=jt(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=jt(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 Ht from"chalk";import Bi from"string-width";import{decodeTime as Wl}from"ulid";import cn 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},dn={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},Ll=e=>e.toLowerCase().trim(),kl=(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)]},Dl=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var Fl=(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 Bl=(e,t,n)=>Fl(e,t,n),wn=e=>{let n=Li(e)%360,o=kl(n,jr.stringColor.saturation,jr.stringColor.lightness);return Dl(o)},re=(e,t=dn)=>{let n=Ll(e);return n&&t[n]?t[n]:wn(n)};var Ul=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 Bl(t[s],t[s+1],i)},xo=e=>Li(e.toLowerCase().trim())/4294967295,ki=e=>{let t=xo(e);return Ul(t)},Ol=e=>{let[t,n,o]=ki(e);return{normal:r=>cn.bgRgb(t,n,o).black(r),cursor:r=>cn.bgRgb(t,n,o).white.bold(r)}},Hr=e=>{let[t,n,o]=ki(e);return{fg:r=>cn.rgb(t,n,o)(r),fgCursor:r=>cn.rgb(t,n,o).inverse(r),bg:r=>cn.bgRgb(t,n,o).black(r),bgCursor:r=>cn.bgRgb(t,n,o).white.bold(r)}},Io=e=>Ol(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 $l=(e,t)=>e+" ".repeat(Math.max(0,t-Bi(e))),_l=(e,t)=>" ".repeat(Math.max(0,t-Bi(e)))+e,jl=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`),Hl=(e,t)=>t?e<t?"up":e>t?"down":null:null,Vl=(e,t)=>{let n=I.getNode(e.payload.parent),o=n?Ht.dim.bgBlack(` ${n.title} `):"unknown",r=t.at(-1);if(r&&"parent"in r&&"rank"in r&&r.parent===e.payload.parent){let s=Hl(e.payload.rank,r.rank);if(s)return`Moved ${s} in ${o}`}return`Moved issue to ${o}`},Gl=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?Ht.bgHex(re(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?Ht.bgHex(re(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?Ht.hex(re(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?Ht.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""}},zl=e=>{let t=bo(Wl(e));return Ht.gray(_l(t,8))},Kl=12,ql=e=>$l(`${e}`,Kl),Ui=(e,t)=>{let n=zl(e.id),o=ql(e.userName),r=Ht.dim("\u203A"),s=e.action==="move.node"?Vl(e,t):[jl(e.action),Gl(e)].filter(Boolean).join(" ");return`${o} ${n} ${r} ${s}`};import{createHash as Yl}from"node:crypto";var Xl="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Jl=e=>{let t=Yl("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+=Xl[Number(n>>s&31n)]}return o},Se=(e,t)=>Jl(`${e}:virtual:${t}`);var Ql=e=>Se(e,"comments"),Zl=e=>Se(e,"description"),eu=e=>Se(e,"assignees"),tu=e=>Se(e,"tags"),nu=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=Ue(qe/4n),n=Ue(qe/2n),o=Ue(qe*3n/4n),r=Ue(qe*7n/8n),s=Ue(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:Zl(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:eu(e.id),name:oe.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(c))return c;let u=Oi({id:tu(e.id),name:oe.TAGS,parentNodeId:e.id,rank:o.value,readonly:!0});if(d(u))return u;let m=Gr({id:Ql(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:nu(e.id),name:oe.HISTORY,parentNodeId:e.id,rank:s.value,value:ou(e),readonly:!0,childRenderAxis:"vertical"});return d(p)?p:l("Ticket virtual nodes materialized",void 0)},ou=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 ru=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ie,So]=ru;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},su=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},iu=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},au=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},du=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":return[e.payload.issue];case"delete.node":case"edit.description":return au(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[]}},cu=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},lu=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?L("Invalid user ID format",e):l("Valid user",null)},uu=(e,t)=>{let n=lu(e);if(d(n))return n;let o=[...new Set(du(e))];t||(o.forEach(s=>iu(s,e)),cu(e));let r=su(o);return r||null},mu={"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=mu[e.action](e);if(d(n))return n;let o=uu(e,t);return o||n}var Vt=e=>e.map(t=>Mn(t));import Su from"node:fs";import Nu from"node:path";import{decodeTime as Eu,monotonicFactory as Ru}from"ulid";import{z as Ln}from"zod";import No from"node:fs";import Kr from"node:path";import{decodeTime as pu}from"ulid";import{z as zr}from"zod";var gu=zr.object({userId:zr.string().min(1).default("unknown"),userName:zr.string().min(1).default("unknown")}),fu=e=>{let[t,n]=Kr.basename(e,".jsonl").split("."),o=gu.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(", ")}`)},vu=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])},yu=(e,t)=>t in e,hu=({id:e,action:t,payload:n,userId:o,userName:r})=>({id:e,action:t,payload:n,userId:o,userName:r}),xu=e=>{let{userId:t,userName:n,...o}=e,r=vu(o);if(d(r))return a(r.message);let s=r.value,i=e.id?.[0];return i?yu(o,s)?l("Decoded persisted event",hu({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=xu(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)},Iu=e=>{if(!No.existsSync(e))return l("Event file missing",[]);let t=fu(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=Iu(r);if(d(s))return a(s.message);o.push(...s.value)}return l("All events loaded",bu(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}=Cu(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 bu=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},Cu=(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=pu(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=Ru(),Tu=Ln.tuple([Ln.string().min(1),Ln.string().min(1).nullable()]),Au=Ln.looseObject({v:Ln.literal(zi),id:Tu}),Xr=e=>{let t=Au.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",wu=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Mu=e=>e.trim().length>0&&e.length<=80,X=()=>{let{userName:e,userId:t}=_();return e?t?wu(t)?Mu(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")},Gt=({userId:e,userName:t})=>`${Gi(e)}.${Gi(t)}.jsonl`,Pu=(e,{userId:t,userName:n})=>{let o=Gt({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(o))return a(`Invalid event log file name: ${o}`);let s=Nu.join(xn(e),o);return l("Successfully resolved event log path",s)},Lu=(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=Pu(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(),Eu(r.value)+1)):Vi(),i=Lu(Hi(e),[s,r.value]);return d(i)?a(i.message):(Su.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=Du(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 Du=(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:ku(),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),zt=(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)},ln=(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}},Fu=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},Bu=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},oa=e=>{let{nodes:t,rootNodeId:n}=g();if(Fu(e.contextNodeId)&&To(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Bu(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 Uu,ulid as dt}from"ulid";var kn=Uu();function Ou(){let e=Oe();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 Wu(){let e=Ou();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 Kt(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=Vt(e).filter(d);return n.length>0?a(`Materializing failed:
43
43
  ${n.map(o=>o.message).join(`
44
- `)}`):(Ou(),C({hasProjectDefinition:!0}),l("State booted successfully",null))}var qt=(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=Wu();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}},Wu=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=Gt(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",Kt(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 un=3e3,ia=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<un?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"},$u=()=>{let e=_().autoSyncIntervalMs??1e4,t=Date.now()-aa;return Math.max(0,e-t)},da=()=>{Jr||(Jr=setTimeout(async()=>{if(Jr=void 0,!!mn()){if(Zr()){Dn=!0;return}Dn=!1,await _u()}},$u()))},_u=async()=>{if(g().readOnly||g().timeMode==="peek")return a("Cannot auto-sync while peeking");if(!mn())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=()=>{mn()&&(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 ju=e=>e.props.tags??[],Hu=e=>e.props.assignees??[],Fn=e=>ju(e).map(t=>I.getTag(t)).filter(t=>!!t),Bn=e=>Hu(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 Vu=/^(\d+)(h|d|w|mo|y)$/,Gu=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,zu=({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},Ku=(e,t=new Date)=>{let n=e.match(Vu);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}},qu=e=>{let t=e.match(Gu);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 zu({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 Ku(t)??qu(t)},ma=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Yu=[{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=Yu)=>{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 Xu=["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"},Ju=[se.EDITOR,se.VIEW,se.USERNAME,se.AUTOSYNC,se.SYNC_DEBOUNCE_MS,se.LOG_LEVEL],Qu=(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(un),"5000","15000","30000","60000"],Yt=[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],Zu={WORKSPACE:[...Yt,...Fo],BOARD:[...ga,...Yt,...Fo],SWIMLANE:[...ga,...Yt,...Fo],TICKET:[...Yt,...Fo,...es],FIELD:[...Yt,...es],FIELD_LIST:[...Yt,...es],TEXT:[...Yt],COMMENT:[h.EDIT,h.DELETE]},em=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],tm=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&T(n)),fa=e=>e.parentNodeId===ie,nm=({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&&Xu.includes(r),i=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?Zu[u]:[]))],c=tm({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]:nm({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]:Qu(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(dn),...I.getExistingTags()])],[h.UNTAG]:[...Lo()?.value?.map(({name:c})=>c)??[]],[h.UNASSIGN]:[...ko()?.value?.map(({name:c})=>c)??[]],[h.ASSIGN]:I.getExistingAssignees(),[h.NEW]:em(s),[h.CONFIG]:[...Ju],[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 pn=140,om=["BOARD","TICKET","SWIMLANE"],ha=()=>{let e=g().selectedNode;if(!e?.context)return U({message:J("Missing target context")});if(om.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]})},rm=({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]}),Xt=({hint:e,onOk:t})=>({modifier:n,inputString:o})=>Uo(n)&&Uo(o)?U({message:e,completionWordList:[]}):V(t??ee),sm=({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<un){let s=pe({prefix:" examples: ",wordList:ts,minLengthForHints:0,inputString:t});return U({message:he(`provide duration above ${un}ms. current duration: ${o}ms.`)+s,completionWordList:ts})}return V(ee)}default:return U({message:he("Unknown config option"),completionWordList:n})}},im=({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})}},am={[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=>rm({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]:im,[h.COMMENT]:e=>{let t=Xt({hint:J(`write a comment (max ${pn} char)...`),onOk:J(`(${e.inputString.length}/${pn})`)})(e);return t.validity===Et.Invalid?t:e.inputString.length>pn?V(he("max input exceeded")):t},[h.CONFIG]:sm,[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:Xt({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 Xt({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?Xt({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 Xt({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?Xt({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))}):Xt({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(am).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 dm=3,cm=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"]),lm=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},um=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=dm&&!cm.has(t)&&!/^\d+$/.test(t)),mm=e=>{let t=new Map;for(let s of lm(e))for(let i of um(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=mm(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=gm(t),o=n[0]??"",r=n[1]??"",s=/\s$/.test(e),i=fm(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=pm(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}},pm=(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},gm=e=>e.trim()?e.trim().split(/\s+/):[],fm=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as vm}from"react";var gn=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&&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}})},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&&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}})},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=()=>vm(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 ym(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function hm(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function xm(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=ym(e)||hm(e);if(o)return Im(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 Im(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 xm(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 Xm from"node:path";import Jm from"react";import{Box as qm}from"ink";import zo from"react";import Pm from"chalk";import{Box as cs,Text as Lm}from"ink";import Qe from"react";import{Text as Ua}from"ink";import Oa,{useEffect as Wa,useState as bm}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]=bm(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 Cm}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(Cm,{key:k,color:N&&k>=j&&k<j+R?y.accent:y.secondary},N?"\u2502":" "))))};import{Box as jo,Text as wm}from"ink";import Jt from"react";import{Text as Sm}from"ink";import Nm from"react";var Em=e=>e.toLowerCase().trim(),Rm=(e,t=dn)=>{let n=Em(e);return t[n]?t[n]:wn(n)},Rt=({id:e,isSelected:t})=>{let n=I.getContributor(e);if(n)return Nm.createElement(Sm,{underline:t,color:Rm(n.name)},"@"+n.name)};import{Text as Tm}from"ink";import Am from"react";var fn=({id:e,isSelected:t})=>{let n=I.getTag(e);if(n)return Am.createElement(Tm,{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 Jt.createElement(jo,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?y.accent:y.secondary,justifyContent:"space-between"},Jt.createElement(jo,{borderBottom:!0},Jt.createElement(jo,{paddingLeft:1,flexDirection:"column"},Jt.createElement(wm,{color:y.primary},r))),Jt.createElement(jo,{flexDirection:"row",paddingLeft:1},s.map(c=>Jt.createElement(fn,{key:c.id,id:c.id})),i.map(c=>Jt.createElement(Rt,{key:c.id,id:c.id}))))};import{Box as Qt,Text as On}from"ink";import Re from"react";var Mm=(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(Qt,{key:D.id,paddingRight:c},Re.createElement(On,{color:re(D.name)},"\u25A0"))),v=i.map(D=>Re.createElement(Qt,{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(Qt,{paddingRight:c},Re.createElement(On,{color:y.accent},"[",E.length,"]")):null;return Re.createElement(Qt,{borderBottom:!0,justifyContent:"space-between"},Re.createElement(Qt,null,Re.createElement(Qt,{width:N},n?Re.createElement(xe,{isSelected:n}):Re.createElement(On,{color:"gray",dimColor:!0},o+1)),Re.createElement(On,{wrap:"truncate",color:S},Mm(t.title,e-u-m-R-18))),Re.createElement(Qt,null,p,v,M))};var km=({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} ${Pm.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(Lm,{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(km);import{Box as Wn,Text as Qa}from"ink";import Te,{useMemo as Go}from"react";import{Box as Ho,Text as Dm}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(Dm,{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(fn,{isSelected:m,id:c}):null)})))};import{Box as Vo,Text as ls}from"ink";import lt,{useEffect as Fm,useMemo as Ga}from"react";var Bm="\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)},Um=(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]);Fm(()=>(Um(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):Bm)))});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 Om,useMemo as Wm,useRef as $m}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"),jm=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)},Hm=(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},Vm=(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=Wm(()=>jm(e),[e]),r=$m([]);Om(()=>(Xa(r.current),r.current=Hm(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},Vm(m.md,u))))})))}var Gm=e=>Se(e,"description"),zm=e=>Se(e,"comments"),Km=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(()=>Gm(e.id),[e.id]),c=Go(()=>zm(e.id),[e.id]),u=Go(()=>Km(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 Ym=({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(qm,{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(Ym);import{render as Qm}from"ink";import{Writable as Zm}from"node:stream";var $n=e=>String(e).padStart(2,"0"),ep=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}`},tp=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",np=async(e,{width:t,height:n})=>{let o="",r=new Zm({write(i,c,u){let m=op(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(o=m),u()}});r.columns=t,r.rows=n,r.isTTY=!0;let s=Qm(e,{stdout:r,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),o},op=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 np(Jm.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=ep(v),N=`board_${tp(i.title)}_${S}.md`,E=Gs(p.value);ed.mkdirSync(E,{recursive:!0});let R=Xm.join(E,N),M=`# Board - ${i.title}
44
+ `)}`):(Wu(),C({hasProjectDefinition:!0}),l("State booted successfully",null))}var qt=(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=$u();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}},$u=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=Gt(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}),We(`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",Kt(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 un=3e3,ia=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<un?null:t},aa=0,Jr,Qr=!1,Dn=!1,Zr=()=>{if(Qr)return!0;let e=Oe();return d(e)?!1:e.value.syncStatus.status==="syncing"},_u=()=>{let e=_().autoSyncIntervalMs??1e4,t=Date.now()-aa;return Math.max(0,e-t)},da=()=>{Jr||(Jr=setTimeout(async()=>{if(Jr=void 0,!!mn()){if(Zr()){Dn=!0;return}Dn=!1,await ju()}},_u()))},ju=async()=>{if(g().readOnly||g().timeMode==="peek")return a("Cannot auto-sync while peeking");if(!mn())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=()=>{mn()&&(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 Hu=e=>e.props.tags??[],Vu=e=>e.props.assignees??[],Fn=e=>Hu(e).map(t=>I.getTag(t)).filter(t=>!!t),Bn=e=>Vu(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 Gu=/^(\d+)(h|d|w|mo|y)$/,zu=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Ku=({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},qu=(e,t=new Date)=>{let n=e.match(Gu);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}},Yu=e=>{let t=e.match(zu);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 Ku({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 qu(t)??Yu(t)},ma=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Xu=[{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=Xu)=>{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 Ju=["BOARD","TICKET","SWIMLANE","COMMENT"],se={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",LOG_LEVEL:"logLevel"},Ee={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Qu=[se.EDITOR,se.VIEW,se.USERNAME,se.AUTOSYNC,se.SYNC_DEBOUNCE_MS,se.LOG_LEVEL],Zu=(e=g().selectedNode?.context)=>{switch(e){case"TICKET":return[Ee.TITLE,Ee.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Ee.TITLE];case"COMMENT":return[Ee.COMMENT];default:return[]}},ts=[String(un),"5000","15000","30000","60000"],Yt=[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],em={WORKSPACE:[...Yt,...Fo],BOARD:[...ga,...Yt,...Fo],SWIMLANE:[...ga,...Yt,...Fo],TICKET:[...Yt,...Fo,...es],FIELD:[...Yt,...es],FIELD_LIST:[...Yt,...es],TEXT:[...Yt],COMMENT:[h.EDIT,h.DELETE]},tm=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],va=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&T(n)),fa=e=>e.parentNodeId===ie,nm=({selectedNode:e,breadCrumb:t})=>{let n=Zu(e?.context);return va({breadCrumb:t,selectedNode:e})?n.includes(Ee.DESCRIPTION)?n:[...n,Ee.DESCRIPTION]:n},om=({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&&Ju.includes(r),i=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?em[u]:[]))],c=va({breadCrumb:n,selectedNode:e});return i.filter(u=>u===h.MOVE?!1:u===h.EDIT?s||!!c: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]:om({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]:nm({selectedNode:n,breadCrumb:r}),[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(dn),...I.getExistingTags()])],[h.UNTAG]:[...Lo()?.value?.map(({name:c})=>c)??[]],[h.UNASSIGN]:[...ko()?.value?.map(({name:c})=>c)??[]],[h.ASSIGN]:I.getExistingAssignees(),[h.NEW]:tm(s),[h.CONFIG]:[...Qu],[h.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import Ia from"chalk";var ya=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Re=(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 ha from"chalk";var J=e=>ha.dim(e),he=e=>ha.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 pn=140,rm=["BOARD","TICKET","SWIMLANE"],xa=()=>{let e=g().selectedNode;if(!e?.context)return U({message:J("Missing target context")});if(rm.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=>` ${Ia.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]})},sm=({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]}),Xt=({hint:e,onOk:t})=>({modifier:n,inputString:o})=>Uo(n)&&Uo(o)?U({message:e,completionWordList:[]}):V(t??ee),im=({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=[...ya];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 ")+Ia.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<un){let s=pe({prefix:" examples: ",wordList:ts,minLengthForHints:0,inputString:t});return U({message:he(`provide duration above ${un}ms. current duration: ${o}ms.`)+s,completionWordList:ts})}return V(ee)}default:return U({message:he("Unknown config option"),completionWordList:n})}},am=({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 Ee.COMMENT:return t.trim()?V(ee):U({message:J("write a comment...")});case Ee.TITLE:return V(ee);case Ee.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})}},dm={[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=Re(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=>sm({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]:am,[h.COMMENT]:e=>{let t=Xt({hint:J(`write a comment (max ${pn} char)...`),onOk:J(`(${e.inputString.length}/${pn})`)})(e);return t.validity===Et.Invalid?t:e.inputString.length>pn?V(he("max input exceeded")):t},[h.CONFIG]:im,[h.DELETE]:e=>{let t=xa();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=xa();return t.validity==="invalid"?t:Xt({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 Xt({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?Xt({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 Xt({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?Xt({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))}):Xt({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)}},ba=Object.fromEntries(Object.entries(dm).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 cm=3,lm=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"]),um=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},mm=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=cm&&!lm.has(t)&&!/^\d+$/.test(t)),pm=e=>{let t=new Map;for(let s of um(e))for(let i of mm(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]},Ca=Oo,Sa=-1,Na=()=>{let e=Oe();if(d(e))return Oo;let t=e.value,n=t.eventLog.length;return n!==Sa&&(Ca=pm(t),Sa=n),Ca};var Ea=e=>Object.values(h).includes(e),Ra=(e,t)=>{let n=e.command??"",{modifier:o,target:r,inputString:s}=e,{message:i,validity:c,completionWordList:u}=ba[n].validate(n,o,s),m=r==="command"||r==="modifier"?ae(n):Na(),{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 Ta=e=>{let t=e.trimStart(),n=fm(t),o=n[0]??"",r=n[1]??"",s=/\s$/.test(e),i=vm(e),c=Ea(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=gm(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}},gm=(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},fm=e=>e.trim()?e.trim().split(/\s+/):[],vm=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as ym}from"react";var gn=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,Aa=()=>{for(let e of rs)e()},ss=e=>(rs.add(e),()=>rs.delete(e)),Xe=e=>{let n=e(ge),o=Ta(n.value),r=n.cursorPosition===n.value.length;ge={...n,commandMeta:Ra(o,r)},Aa()},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,Aa(),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&&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}})},wa=()=>{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}})},Ma=()=>{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}})},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}})},Pa=()=>{Xe(e=>({...e,commandIsPending:!0}))},W=e=>{Xe(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},La=({addToHistory:e=!0})=>{Xe(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},ka=()=>{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}})},Da=()=>{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,Fa=()=>ym(ss,q,q),Ba=()=>{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 hm(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function xm(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function Im(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 Ua(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=hm(e)||xm(e);if(o)return bm(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 bm(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 Im(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 td from"node:fs";import Jm from"node:path";import Qm from"react";import{Box as Ym}from"ink";import zo from"react";import Lm from"chalk";import{Box as cs,Text as km}from"ink";import Qe from"react";import{Text as Oa}from"ink";import Wa,{useEffect as $a,useState as Cm}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]=Cm(0);if($a(()=>{s(0)},[o]),$a(()=>{if(!e)return;let c=setInterval(()=>{s(u=>(u+1)%o.length)},500);return()=>clearInterval(c)},[e,o]),!e)return Wa.createElement(Oa,null,t);let i=o[r]??o[0]??t;return Wa.createElement(Oa,{color:y.accent,dimColor:r===1},i)};import{Box as ds,Text as Sm}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(Sm,{key:k,color:N&&k>=j&&k<j+R?y.accent:y.secondary},N?"\u2502":" "))))};import{Box as jo,Text as Mm}from"ink";import Jt from"react";import{Text as Nm}from"ink";import Em from"react";var Rm=e=>e.toLowerCase().trim(),Tm=(e,t=dn)=>{let n=Rm(e);return t[n]?t[n]:wn(n)},Rt=({id:e,isSelected:t})=>{let n=I.getContributor(e);if(n)return Em.createElement(Nm,{underline:t,color:Tm(n.name)},"@"+n.name)};import{Text as Am}from"ink";import wm from"react";var fn=({id:e,isSelected:t})=>{let n=I.getTag(e);if(n)return wm.createElement(Am,{underline:t,backgroundColor:re(n.name),color:y.secondary}," "+n.name+" ")};var ja=({width:e,ticket:t,isSelected:n})=>{let o=e-14,r=ho(St(t.title),o),s=Fn(t),i=Bn(t);return Jt.createElement(jo,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?y.accent:y.secondary,justifyContent:"space-between"},Jt.createElement(jo,{borderBottom:!0},Jt.createElement(jo,{paddingLeft:1,flexDirection:"column"},Jt.createElement(Mm,{color:y.primary},r))),Jt.createElement(jo,{flexDirection:"row",paddingLeft:1},s.map(c=>Jt.createElement(fn,{key:c.id,id:c.id})),i.map(c=>Jt.createElement(Rt,{key:c.id,id:c.id}))))};import{Box as Qt,Text as On}from"ink";import Te from"react";var Pm=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ha=({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=>Te.createElement(Qt,{key:D.id,paddingRight:c},Te.createElement(On,{color:re(D.name)},"\u25A0"))),v=i.map(D=>Te.createElement(Qt,{key:D.id,paddingRight:c},Te.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?Te.createElement(Qt,{paddingRight:c},Te.createElement(On,{color:y.accent},"[",E.length,"]")):null;return Te.createElement(Qt,{borderBottom:!0,justifyContent:"space-between"},Te.createElement(Qt,null,Te.createElement(Qt,{width:N},n?Te.createElement(xe,{isSelected:n}):Te.createElement(On,{color:"gray",dimColor:!0},o+1)),Te.createElement(On,{wrap:"truncate",color:S},Pm(t.title,e-u-m-R-18))),Te.createElement(Qt,null,p,v,M))};var Dm=({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} ${Lm.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(km,{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(Ha,{key:M.id,index:D,width:n,ticket:M,isSelected:j,mode:c}):Qe.createElement(ja,{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})))},Va=Qe.memo(Dm);import{Box as Wn,Text as Za}from"ink";import Ae,{useMemo as Go}from"react";import{Box as Ho,Text as Fm}from"ink";import ct from"react";var Ga=({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(Fm,{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(fn,{isSelected:m,id:c}):null)})))};import{Box as Vo,Text as ls}from"ink";import lt,{useEffect as Bm,useMemo as za}from"react";var Um="\u2029",Ka=(e,t)=>`${e}::inline-line::${t}`,us=new Map,qa=e=>{let t=us.get(e)??[];us.delete(e);for(let n of t)I.deleteNode(n)},Om=(e,t)=>{qa(e);let n=[];t.forEach((o,r)=>{let s=Ue(BigInt(r+1));if(!Z(s))return;let i=I.createNode(Y.text({id:Ka(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=za(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=za(()=>u.join("\0"),[u]);Bm(()=>(Om(e,u),()=>{qa(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:Ka(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):Um)))});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 Wm,useMemo as $m,useRef as _m}from"react";import{decodeTime as ps}from"ulid";var Ya=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},Xa=(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 jm=e=>Se(e,"comments"),Hm=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})),Ja=e=>{for(let t of e)I.deleteNode(t.id)},Vm=(e,t)=>{let n=I.getNode(jm(e.id));if(!n||!Ke(n))return[];let o=t.map((r,s)=>Xa(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},Gm=(e,t)=>{let n=e.replace(/\s+/g," ").trim();return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}\u2026`};function Qa({ticket:e,width:t,height:n}){let o=$m(()=>Hm(e),[e]),r=_m([]);Wm(()=>(Ja(r.current),r.current=Vm(e,o),()=>{Ja(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},Gm(m.md,u))))})))}var zm=e=>Se(e,"description"),Km=e=>Se(e,"comments"),qm=e=>Se(e,"history"),ed=({ticket:e,height:t})=>{let n=Go(()=>Ya(e),[e]),{selectedIndex:o,contextNode:r}=z(),s=process.stdout.columns||120,i=Go(()=>zm(e.id),[e.id]),c=Go(()=>Km(e.id),[e.id]),u=Go(()=>qm(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 Ae.createElement(Wn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ae.createElement(Qa,{ticket:e,width:s,height:k}))}if(v){let O=I.getNode(u),k=O&&Ke(O)?O.props.value??"":"",ft=t-3;return Ae.createElement(Wn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},O?Ae.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?Ae.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)?Ae.createElement(Ga,{key:O.id,parent:O,selected:k,selectedIndex:o}):O.id===c?Ae.createElement(Wn,{key:O.id,paddingTop:1},Ae.createElement(xe,{isSelected:k}),Ae.createElement(Za,{backgroundColor:y.secondary,color:k?y.accent:y.primary},` Comments (${n}) \u203A\u203A `)):O.id===u?Ae.createElement(Wn,{key:O.id,paddingTop:1},Ae.createElement(xe,{isSelected:k}),Ae.createElement(Za,{backgroundColor:y.secondary,color:k?y.accent:y.primary}," History \u203A\u203A ")):null;return Ae.createElement(Wn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S.map((O,k)=>j(O,m&&o===k)))};var Xm=({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(Ym,{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(Va,{key:M.id,height:i,width:E,swimlane:M,isSelected:k,isDense:R,isFocused:j,listSelectedIndex:O,mode:r})}),m&&v&&zo.createElement(ed,{height:i,ticket:v}))},Ko=zo.memo(Xm);import{render as Zm}from"ink";import{Writable as ep}from"node:stream";var $n=e=>String(e).padStart(2,"0"),tp=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}`},np=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",op=async(e,{width:t,height:n})=>{let o="",r=new ep({write(i,c,u){let m=rp(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(o=m),u()}});r.columns=t,r.rows=n,r.isTTY=!0;let s=Zm(e,{stdout:r,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),o},rp=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),nd=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 op(Qm.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=tp(v),N=`board_${np(i.title)}_${S}.md`,E=Gs(p.value);td.mkdirSync(E,{recursive:!0});let R=Jm.join(E,N),M=`# Board - ${i.title}
45
45
  Date: ${v.toISOString()}
46
46
 
47
47
  \`\`\`text
48
48
  ${m}
49
49
  \`\`\`
50
- `;return ed.writeFileSync(R,M,"utf8"),l("Exported board layout",R)};import up from"node:os";import sd from"node:path";import{z as At}from"zod";import{accessSync as rp,copyFileSync as sp,existsSync as qo,mkdirSync as nd,readdirSync as od,readFileSync as ip,renameSync as ap,rmSync as dp,statSync as rd,unlinkSync as cp,writeFileSync as lp}from"node:fs";import vn 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=vn.dirname(e);qo(n)||nd(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);lp(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return ip(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 rp(e),!0}catch{return!1}},mkDir:e=>nd(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=vn.parse(t);for(;;){let o=vn.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=vn.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=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)?od(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{cp(e)}catch(t){(!gs(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{dp(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(vn.dirname(t)),!n?.overwrite&&qo(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{ap(e,t)}catch(o){if(gs(o)&&o.code==="EXDEV"){sp(e,t),this.rmFile(e);return}throw o}}};var mp={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(),pp="config.json",ad=()=>sd.join(up.homedir(),ke),fs=()=>sd.join(ad(),pp),vs=()=>{try{return Ae.mkDir(ad()),l(`Ensured ~/${ke} exists`,null)}catch{return a(`Unable to create ~/${ke}`)}},gp=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}):gp(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(mp);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 eN}from"react";var Xo,fp=new Set,cd=()=>{for(let e of fp)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)),vp=e=>{let t=wt();return Xo=e(t),cd(),l("UX state updated",null)},Mt=e=>vp(t=>({...t,...e}));import{spawn as yp}from"node:child_process";function ys(e){let t=process.platform,r=yp(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 hp}from"node:child_process";import xp from"node:os";import ud from"node:path";import{ulid as Ip}from"ulid";function bp(){let{preferredEditor:e}=_(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Cp(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function md(e){let t=ud.join(xp.tmpdir(),"epiq");Ae.mkDir(t);let n=ud.join(t,Ip());Ae.writeToFile(n,e??"");let o=bp();for(let r of o){let s=Cp(r,n),i=hp(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 Sp(e);if(e.modifier===$e.DESCRIPTION)return Np();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")},Sp=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)},Np=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 Rp from"node:fs";import fd from"node:path";import xs from"node:fs";import Ep from"node:path";var gd=async e=>{let t=Ep.join(e,".gitignore"),n=xs.existsSync(t)?xs.readFileSync(t,"utf8"):"",o=[".epiq/events/",".epiq/log/"],r=n.split(`
50
+ `;return td.writeFileSync(R,M,"utf8"),l("Exported board layout",R)};import mp from"node:os";import id from"node:path";import{z as At}from"zod";import{accessSync as sp,copyFileSync as ip,existsSync as qo,mkdirSync as od,readdirSync as rd,readFileSync as ap,renameSync as dp,rmSync as cp,statSync as sd,unlinkSync as lp,writeFileSync as up}from"node:fs";import vn from"node:path";var gs=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",we={writeToFile:(e,t)=>{try{let n=vn.dirname(e);qo(n)||od(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);up(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return ap(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=we.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return qo(e)&&sd(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await sp(e),!0}catch{return!1}},mkDir:e=>od(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=vn.parse(t);for(;;){let o=vn.join(t,e);try{if(qo(o)&&sd(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(!we.dirExists(e))return null;let t=rd(e).filter(o=>o.endsWith(".json")).sort()[0];if(!t)return null;let n=vn.join(e,t);return we.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return we.dirExists(e)?rd(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{lp(e)}catch(t){(!gs(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{cp(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(vn.dirname(t)),!n?.overwrite&&qo(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{dp(e,t)}catch(o){if(gs(o)&&o.code==="EXDEV"){ip(e,t),this.rmFile(e);return}throw o}}};var pp={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},ad=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(),gp="config.json",dd=()=>id.join(mp.homedir(),De),fs=()=>id.join(dd(),gp),vs=()=>{try{return we.mkDir(dd()),l(`Ensured ~/${De} exists`,null)}catch{return a(`Unable to create ~/${De}`)}},fp=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${De}/config.json JSON`)}let n=ad.safeParse(t??{});return n.success?l("Parsed config",n.data):a(`Invalid ~/${De}/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=we.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):fp(n)},cd=e=>{let t=vs();if(d(t))return a(t.message);let n=ad.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 we.writeToFile(o,JSON.stringify(n.data,null,2)+`
51
+ `),l("Config written",null)}catch{return a(`Unable to write ~/${De}/config.json`)}},mt=e=>{let t=_n();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return cd(n)},jn=()=>{let e=fs(),t=vs();if(d(t))return a(`Unable to create ~/${De}`);if(!(we.readFile(e)!==null)){let p=cd(pp);if(d(p))throw new Error(`Unable to create ~/${De}/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 ~/${De}/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 tN}from"react";var Xo,vp=new Set,ld=()=>{for(let e of vp)e()};var wt=()=>{if(!Xo)throw new Error("Ui state not initialized. Call initUiState() first.");return Xo};var ud=(e={})=>(Xo=e,ld(),l("UX state initialized",null)),yp=e=>{let t=wt();return Xo=e(t),ld(),l("UX state updated",null)},Mt=e=>yp(t=>({...t,...e}));import{spawn as hp}from"node:child_process";function ys(e){let t=process.platform,r=hp(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 xp}from"node:child_process";import Ip from"node:os";import md from"node:path";import{ulid as bp}from"ulid";function Cp(){let{preferredEditor:e}=_(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Sp(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function pd(e){let t=md.join(Ip.tmpdir(),"epiq");we.mkDir(t);let n=md.join(t,bp());we.writeToFile(n,e??"");let o=Cp();for(let r of o){let s=Sp(r,n),i=xp(s,{stdio:"inherit",shell:!0});if(!i.error&&i.status===0){let c=we.readFile(n);if(c==null)return a("Unable to read edited file");let u=c.replace(/\r?\n$/,"");return l("Successfully edited",u)}}return a("Unable to open editor")}var gd=async e=>{let{contextNode:t,selectedIndex:n}=g(),o=$(t.id)[n];if(e.modifier===Ee.DESCRIPTION)return Ep();if(o&&Tn(o))return Np(e);if(e.modifier===Ee.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")},Np=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)},Ep=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=Re([...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=pd(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 Tp from"node:fs";import vd from"node:path";import xs from"node:fs";import Rp from"node:path";var fd=async e=>{let t=Rp.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"),te.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var Tp=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=nn(),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 Tp(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 $t({repoRoot:n,stateBranchRoot:N,stateBranchName:m});if(d(E))return K(8,E.message);let R=fd.join(N,".epiq");Rp.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:Gt({userId:u,userName:c})});if(d(D))return K(10,D.message);let j=await rn({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 tn=Vt(M.value).filter(d);if(tn.length>0)return K(16,tn.map(Sr=>Sr.message).join(`
57
- `));let Wt=Ue();if(d(Wt))return K(16,Wt.message);let{rootNodeId:Qc,nodes:Zc}=Wt.value,js=Zc[Qc];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 wp}from"ulid";import{ulid as Ap}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:Ap(),...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:wp(),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 Mp,ulid as Pp}from"ulid";var Lp=Mp(),Qo=({name:e,parent:t,rank:n,user:{userId:o,userName:r}})=>{let s=Lp();return l("Created issue events",[{id:Pp(),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=ln(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=ln(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=ln(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=Vt(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=Vt(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 kp from"zod";var Ed=()=>{let e=q().commandMeta.inputString,t=kp.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 Dp=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(Dp).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=zt(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=zt(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>pn)return a(`Cannot exceed ${pn} 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 Fp=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&&!Fp.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 Bp=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?(Bp(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 Up=500,Op=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Od=e=>{let t=Op(e);t&&Wo(n=>(n+t).slice(0,Up))};var Wp=[f.COMMAND_LINE,f.PALETTE],$p=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))},...Wp.flatMap($p),{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)},jp=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 jp(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 Zt,Ns,Es=new Set,zd=()=>{for(let e of Es)e()},Vp=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=Gp(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(!Zt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Zt},Ue=()=>Zt?l("Retrieved state",Zt):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:(Zt=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"):(Zt=o.value,zd(),l("State updated",null))}var C=e=>ue(t=>({...t,...e}));var z=()=>Hp(Vp,g,g),Gp=(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"),mn=()=>Zt!==void 0;var Rs=e=>{mn()&&(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 tw}from"ulid";var zp=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}))},Kp=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 zp({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",on(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 Kp({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=nn(),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)&&te.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=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=ln(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=zt(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=zt(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=Kt(r.value);if(d(s))return s;let i=zt(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:Gt(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:qp(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 Yp}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 Yp({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 Zp=en.dirname(Qp(import.meta.url)),eg=process.env.IS_LOCAL==="true"?en.resolve(process.cwd(),"dist/gui"):en.join(Zp,"gui"),tt=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},tg=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)}),ng=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=en.resolve(eg),r=en.resolve(o,n),s=en.relative(o,r);if(s.startsWith("..")||en.isAbsolute(s))return tt(t,403,{isError:!0,message:"Forbidden"});try{let i=await Xp(r);return t.writeHead(200,{"content-type":ng(r)}),t.end(i)}catch{return tt(t,404,{isError:!0,message:`Not found: ${n}`})}},og=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=Jp.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 tg(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 og(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 ${rg.cyan(n)}`),Vs(n),l("Started GUI",{url:n})};import{Box as Ut}from"ink";import Q from"react";import{Box as ws,Text as Kn}from"ink";import je,{useEffect as sg,useMemo as ig}from"react";import{ulid as ag}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=ag(),dg=e=>`${e}`,cg=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))},lg=e=>Y.text({id:pc,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),ug=(e,t,n)=>Y.text({id:dg(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=[],mg=e=>{gc();let t=I.createNode(lg(g().rootNodeId));d(t)||!bt(t.value)||(Ms=[t.value,...e.map((n,o)=>ug(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=ig(()=>cg(o),[o]);sg(()=>(mg(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 Eg}from"ink";import Ls from"react";import Yn from"chalk";import{Box as Ps,Text as vc}from"ink";import qn,{useEffect as pg,useMemo as gg,useState as fg}from"react";var yc=Yn.hex(y.secondary),vg=Yn.inverse,yg=Yn.inverse.hex(y.secondary2),hg={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}},xg=({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)},Ig=({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??hg,infoMessage:ge.commandMeta.infoMessage,validationStatus:ge.commandMeta.validity,command:ge.commandMeta.command,inputString:ge.commandMeta.inputString,modifier:ge.commandMeta.modifier}),bg=(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]=fg(hc());pg(()=>{let S=()=>{let E=hc();o(R=>bg(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=gg(()=>{let S=Math.max(0,Math.min(s,r.length)),N=xc({value:r,command:m}),E=Ig({value:r,command:m,modifier:p}),R=m?Hr(m):null,M=xg({command:m,modifier:p}),D=(le,be)=>{let tn=N&&be>=N.start&&be<N.end,Wt=E&&be>=E.start&&be<E.end;return tn&&R?R.fg(le):Wt&&M?M.bg(le):le},j=(le,be)=>{let tn=N&&be>=N.start&&be<N.end,Wt=E&&be>=E.start&&be<E.end;return tn&&R?R.fgCursor(le):Wt&&M?M.bgCursor(le):vg(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=yg(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 Cg,Text as Sg}from"ink";import bc from"react";var Ng=(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=Ng(t,e).join(" | ");return bc.createElement(Cg,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},bc.createElement(Sg,{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(Eg,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 yn}from"ink";import Ie,{useEffect as Rg,useMemo as Tg}from"react";import{ulid as Sc}from"ulid";var lr=Sc(),Ag=()=>[...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})),wg=e=>Y.text({id:lr,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),Mg=(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)},Pg=e=>{Nc();let t=I.createNode(wg(g().rootNodeId));if(d(t)||!bt(t.value))return logger.error("Could not attach help nodes");cr=[t.value,...e.map((n,o)=>Mg(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=Tg(()=>Ag(),[]);Rg(()=>(Pg(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(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 Lg 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 ${Lg.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 kg=({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+">"))),Dg=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(kg,{isDone:v.done,command:v.command,value:v.done?Dg(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 Fg=e=>(I.getTag(e)?.name??"").length+3,Bg=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+Fg(Ne),0)+v.reduce((k,Ne)=>k+Bg(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(fn,{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 Ug,Text as wc}from"ink";import gr from"react";var Og=({filters:e})=>gr.createElement(Ug,{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(Og);import{Box as Wg,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(Wg,{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 $g,Text as Lc}from"ink";import Fs,{useEffect as _g,useState as jg}from"react";var Hg=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Vg=150,kc=12,Gg=.36,Dc=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)}},zg=({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)}`},Kg=(e,t,n)=>{let o=Dc(e),r=Dc(t);return zg({r:o.r+(r.r-o.r)*n,g:o.g+(r.g-o.g)*n,b:o.b+(r.b-o.b)*n})},qg=(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 Kg(s,i,r)};function Fc({syncStatus:e,autoSync:t}){let[n,o]=jg(0);_g(()=>{if(e.status!=="syncing"){o(0);return}let c=0,u=setInterval(()=>{c+=1;let m=(Math.sin(c*Gg)+1)/2,p=Math.round(m*(kc-1));o(v=>v===p?v:p)},Vg);return()=>clearInterval(u)},[e.status]);let r={synced:" ",failed:"---",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,pending:y.secondary2,syncing:qg(Hg,n/(kc-1))??""}[e.status];return Fs.createElement($g,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 $c from"chalk";import{Text as _c}from"ink";import jc,{useEffect as Qg,useState as Zg}from"react";var Ft="1.0.0";import Bs from"chalk";var Yg="https://registry.npmjs.org/epiq/latest",Us=null,Bc=0,Xg=1e3*60*60*24,Uc=e=>e.replace(/^v/,""),Jg=(e,t)=>{let n=Uc(e).split(".").map(Number),o=Uc(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},Oc=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Us&&Date.now()-Bc<Xg)return Us;try{let t=await fetch(Yg);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?Jg(o,e)>0:!1};return Us=r,Bc=Date.now(),r}catch{return{current:e,latest:null,updateAvailable:!1}}},Wc=(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 Hc(){let[e,t]=Zg({current:Ft,latest:null,updateAvailable:!1});return Qg(()=>{let n=!0;return Oc(Ft).then(o=>{n&&t(o)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?jc.createElement(_c,{dimColor:!0,color:y.secondary2},Ft+" "):jc.createElement(_c,null,$c.hex(y.secondary2).dim(Ft),$c.hex(y.accent).dim(" \u2197 "),Wc(Ft,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(Fc,{autoSync:!!c,syncStatus:o}),ye.createElement(Qn,null,yr.hex(y.secondary2).dim("Mode: ")+yr.hex(y.secondary2).dim(r.padEnd(8," "))," "),ye.createElement(Vc,{icon:"@",value:s}),ye.createElement(Vc,{icon:"\u276F",value:i}),ye.createElement(Hc,null)):"",n==="peek"?ye.createElement(Pc,null):"")}function Vc({icon:e,value:t}){return ye.createElement(Qn,null,yr.dim(e)+yr.hex(y.accent)(` ${t??"-"} `))}import{Box as ef,Text as tf}from"ink";import eo from"react";import{Box as hr,Text as Os}from"ink";import Bt 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 Bt.createElement(hr,{flexDirection:"column",height:r,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},Bt.createElement(hr,{padding:1,paddingTop:0,paddingBottom:0},Bt.createElement(Os,null,"Select a board:")),Bt.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 Bt.createElement(hr,{key:c.id??u},Bt.createElement(Os,{color:m?y.accent:y.secondary2},Bt.createElement(xe,{isSelected:m})),Bt.createElement(Os,{color:m?y.accent:y.secondary2},c.title," (",v," issues)",c.readonly?" \u{1F512}":""))})))}var nf=({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(ef,{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(tf,null))},Gc=eo.memo(nf);import{useEffect as of}from"react";var rf=e=>{of(()=>{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])},zc=({autoSync:e})=>(rf(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(Ut,{flexDirection:"column"},Q.createElement(Ec,{width:e,height:t}));if(n.mode===f.PALETTE)return Q.createElement(Ut,{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(Ut,{flexDirection:"column"},Q.createElement(Ut,{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(Ut,{flexDirection:"column"},Q.createElement(Ut,{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(Ut,{flexDirection:"column"},Q.createElement(zc,{autoSync:o}),Q.createElement(Ut,{flexDirection:"column"},Q.createElement(Zn,{filters:s}),Q.createElement(Gc,{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 sf from"readline";var xr,Ir,ot,af=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]),Kc=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&&!af.has(r))return;let s=t[n]?.[r];if(s?.action)try{await s.action(s,e)}catch(i){logger.error(i)}},df=()=>async function(t,n){n.name!=="escape"&&(ot&&(clearTimeout(ot),ot=void 0),await Kc(n))},cf=()=>async function(t){if(t.length===1&&t[0]===27){ot&&clearTimeout(ot),ot=setTimeout(()=>{Kc({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),ot=void 0},25);return}ot&&(clearTimeout(ot),ot=void 0)};function qc(){xr&&process.stdin.removeListener("keypress",xr),Ir&&process.stdin.removeListener("data",Ir),xr=df(),Ir=cf(),sf.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Ir),process.stdin.on("keypress",xr)}async function Yc(){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 qt(3,s.message);let i=nn(),c=await $t({repoRoot:t.value,stateBranchRoot:s.value,stateBranchName:i.stateBranch});if(d(c))return qt(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 qt(3,m.message);n=m.value}let o=Kt(n);if(d(o))return qt(4,o.message);C({hasProjectDefinition:Z(t),hasInitializingEvents:!!n.length});let r=_s();return d(r)?qt(6,r.message):(qc(),l("Booted Epiq",void 0))}catch(e){return qt(0,Ao(e))}}ld();var pf=`${Ot.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 Ap=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}`),yd=async()=>{W("");let e=nn(),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 Ap(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=vd.join(mo(),e.projectId),E=await $t({repoRoot:n,stateBranchRoot:N,stateBranchName:m});if(d(E))return K(8,E.message);let R=vd.join(N,".epiq");Tp.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:Gt({userId:u,userName:c})});if(d(D))return K(10,D.message);let j=await rn({cwd:N,message:"[epiq:init]"});if(d(j))return K(10,j.message);let O=await fd(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 tn=Vt(M.value).filter(d);if(tn.length>0)return K(16,tn.map(Sr=>Sr.message).join(`
57
+ `));let Wt=Oe();if(d(Wt))return K(16,Wt.message);let{rootNodeId:Zc,nodes:el}=Wt.value,js=el[Zc];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 Mp}from"ulid";import{ulid as wp}from"ulid";var hd=null,Pt=()=>structuredClone(hd),Hn=e=>{hd=e},xd=()=>{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)},Id=({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:wp(),...o.value,action:"move.node",payload:{id:e,parent:t,rank:r.value.rank}})},bd=e=>{Hn(e);let t=Mn(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function bs(e){let t=xd();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=Id({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:bd(u.value)}function Cs(e){let t=xd();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=Id({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(i)?i:bd(i.value)}var Cd=()=>{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=Cd();return d(n)?n:(C({mode:f.MOVE}),l(t,null))},Sd=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:Mp(),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=Cd();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 Pp,ulid as Lp}from"ulid";var kp=Pp(),Qo=({name:e,parent:t,rank:n,user:{userId:o,userName:r}})=>{let s=kp();return l("Created issue events",[{id:Lp(),userId:o,userName:r,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var Nd=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=ln(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=Re(s,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=ln(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=Re(s,"SWIMLANE");return d(j)?null:j.value})();if(!p)return a("Unable to add issue in this context");let v=ln(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 Ed=async()=>{let e=Re(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=$e({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=Vt(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=Vt(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 Dp from"zod";var Rd=()=>{let e=q().commandMeta.inputString,t=Dp.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:(Be({autoSyncIntervalMs:t.data}),C({mode:f.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var Td=()=>{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:(Be({autoSync:t}),C({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Ad=()=>{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:(Be({logLevel:e}),C({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var wd=async()=>{W(""),C({mode:f.DEFAULT});let e=Oe();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 Fp=e=>e.action==="add.issue.comment",Md=e=>Object.values(g().tags).find(t=>t.name===e),Pd=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:Sd},{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(Fp).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=zt(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=zt(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:yd},{intent:P.NewItem,description:"Create a new board, swimlane, or issue",mode:f.COMMAND_LINE,action:Nd,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=Ba();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=Md(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=Md(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=Pd(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=Pd(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>pn)return a(`Cannot exceed ${pn} characters`);let o=X();if(d(o))return a("Unable to resolve user ID");let{breadCrumb:r,selectedNode:s}=g(),i=Re([...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:wd},{intent:P.Peek,description:"View board state at another point in time",mode:f.COMMAND_LINE,action:Ed},{intent:P.Export,description:"Export the current board layout to markdown",mode:f.COMMAND_LINE,action:async()=>{let e=await nd();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)=>gd(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:(Be({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:(Be({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"):(Be({viewMode:n}),l(`View set to "${n}"`,null));case se.AUTOSYNC:return Td();case se.LOG_LEVEL:return Ad();case se.SYNC_DEBOUNCE_MS:return Rd();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 Bp=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);Pa();let{readOnly:i}=g();if(i&&!Bp.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):(La({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")}],Ld=[{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 kd={[w.WORKSPACE]:[...tr,...nr],[w.BOARD]:[...tr,...nr],[w.SWIMLANE]:[...tr,...nr,...Ld],[w.TICKET]:[],[w.FIELD]:[],[w.FIELD_LIST]:[],[w.TEXT]:[],[w.COMMENT]:[]};var Dd=()=>{W("");let{pendingNavTarget:e}=wt();C({mode:f.DEFAULT}),e&&A.navigate(e),Mt({pendingNavTarget:void 0})},Fd=[{intent:x.ExitCommandLine,mode:f.HELP,action:()=>(Dd(),l("Exiting help",null))},{intent:x.Exit,mode:f.HELP,action:()=>(Dd(),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 Up=e=>{C({mode:f.COMMAND_LINE});let{pendingNavTarget:t}=wt();t&&A.navigate(t),Mt({pendingNavTarget:void 0}),W(`${e} `)},Bd=()=>{W("");let{pendingNavTarget:e}=wt();e&&A.navigate(e),Mt({pendingNavTarget:void 0}),C({mode:f.DEFAULT})},Ud=[{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?(Up(t),l("Selected command",t)):l("No command selected",null)}},{intent:x.ExitCommandLine,mode:f.PALETTE,action:()=>(Bd(),l("Exiting palette",null))},{intent:x.Exit,mode:f.PALETTE,action:()=>(Bd(),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 Od=[...Fd,...Ud,{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 Op=500,Wp=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Wd=e=>{let t=Wp(e);t&&Wo(n=>(n+t).slice(0,Op))};var $p=[f.COMMAND_LINE,f.PALETTE],_p=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})=>(Wd(n??""),l("Capturing input",null))},{intent:x.EraseInput,mode:e,action:()=>(wa(),l("Erasing input",null))},{intent:x.EraseInputWord,mode:e,action:()=>(Ma(),l("Erasing input word",null))}],$d=[{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))},...$p.flatMap(_p),{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:()=>(ka(),l("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(Da(),l("Getting next command from history",null))}];import Hd from"chalk";var or=Hd.dim.hex(y.secondary2)(": for command line"),_d="q to exit",jd=`${Hd.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]:[jd],[w.TICKET+f.MOVE]:[jd]};var Gn=e=>e.trim().toLocaleLowerCase(),jp=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},Hp=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},Vd=(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 jp(e).map(Gn).some(r=>r.includes(n));case"assignee":return Hp(e).map(Gn).some(r=>r.includes(n));default:return!0}};function Gd(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 zd=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 Zt,Ns,Es=new Set,Kd=()=>{for(let e of Es)e()},Gp=e=>(Es.add(e),()=>Es.delete(e));function qd(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=Gd(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=[...Od,...kd[p]??[],...$d],N=zd(S),E=zp(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(!Zt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Zt},Oe=()=>Zt?l("Retrieved state",Zt):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=qd(o);return d(r)?r:(Zt=r.value,Kd(),l("State initialized",null))}function ue(e){let t=g(),n=e(t),o=qd(n);return d(o)?a(o.message??"Unable to update state"):(Zt=o.value,Kd(),l("State updated",null))}var C=e=>ue(t=>({...t,...e}));var z=()=>Vp(Gp,g,g),zp=(e,t)=>{let n={};for(let o of Object.values(e))T(o)&&t.length>0&&!t.every(r=>Vd(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"),mn=()=>Zt!==void 0;var Rs=e=>{mn()&&(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})},We=e=>(Ts(e),a(e));import{decodeTime as nw}from"ulid";var Kp=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",$e({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}))},qp=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 Kp({cwd:e,ensureUpstream:!0}));if(d(n))return We(n.message);let{repoRoot:o,stateBranchRoot:r,bootstrapped:s}=n.value,i=G("isDetachedHead(stateBranchRoot)",await si(r));if(d(i))return We(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return We("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,v=G("getStateBranch",on(o));if(d(v))return We(v.message);let S=v.value;logger.debug("[sync] resolved state branch",{stateBranch:S,stateBranchRoot:r});let N=G("commitOwnEventFileToStateBranch",await qp({repoRoot:o,stateBranchRoot:r,ownEventFileName:t}));if(d(N))return We(N.message);c=N.value.createdCommit,u=N.value.commitSha;let E=G("pullBranchRebaseIfPresent",await kr({cwd:r,branch:S}));if(d(E))return We(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 We(M.message);m=m||M.value,R=G("pushStateBranch(retry)",await En({stateBranchRoot:r,repoRoot:o}))}if(d(R))return We(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 We(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)},Me=async e=>{let t=As(e);if(d(t))return t;let n=$e({repoRoot:t.value});if(d(n))return a(n.message);let o=nn(),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)&&te.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})},Pe=()=>{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=Oe();return d(e)?a(e.message):e},Yd=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)})),Xd=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 Jd=async e=>{let t=await Me(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:Yd(r),assignees:Xd(r)}));return l("Listed issues",o)},Qd=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();if(d(n))return n;let o=ln(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")},Zd=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();if(d(n))return n;let o=zt(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})},ec=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();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=zt(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})},tc=async e=>{let t=As(e.repoRoot);if(d(t))return t;let n=Pe();if(d(n))return n;let o=$e({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=zt(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=Pe();if(d(n))return n;let o=await Mo({cwd:t.value,ownEventFileName:Gt(n.value)});return d(o)?(Ts(o.message),o):(sr(),l("Synced",o.value))};var Lt=async(e={})=>{let t=await Me(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:Yp(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:Yd(v),assignees:Xd(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})},nc=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();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})},oc=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();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})},rc=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();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}})},sc=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();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})},ic=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();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}})},ac=async e=>{let t=await Me(e.repoRoot);if(d(t))return t;let n=Pe();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 Me(e.repoRoot);if(d(t))return t;let n=Pe();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 Me(e.repoRoot);if(d(t))return t;let n=Pe();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 dc=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 Xp}from"ws";var Le=(e,t)=>{e.send(JSON.stringify(t))},zn=async(e,t)=>Le(e,{type:"state",payload:await Lt({repoRoot:t})}),et=async(e,t,n,o,r)=>{if(Le(e,{type:o,payload:r}),d(r))return Le(e,{type:"failed",payload:r.message});n(),zn(e,t)},cc=(e,t,{onStateChanged:n})=>{new Xp({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 Le(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 Le(r,{type:"issue:comment:delete:result",payload:u}),d(u)?Le(r,{type:"failed",payload:u.message}):(n(),zn(r,t))}if(c==="issue:edit:description"){let u=await nc({repoRoot:t,...i.payload});return et(r,t,n,"issue:edit:description:result",u)}if(c==="issue:edit:title"){let u=await oc({repoRoot:t,...i.payload});return et(r,t,n,"issue:edit:title:result",u)}if(c==="issue:tag:add"){let u=await rc({repoRoot:t,...i.payload});return et(r,t,n,"issue:tag:add:result",u)}if(c==="issue:tag:remove"){let u=await sc({repoRoot:t,...i.payload});return et(r,t,n,"issue:tag:remove:result",u)}if(c==="issue:assignee:add"){let u=await ic({repoRoot:t,...i.payload});return et(r,t,n,"issue:assignee:add:result",u)}if(c==="issue:assignee:remove"){let u=await ac({repoRoot:t,...i.payload});return et(r,t,n,"issue:assignee:remove:result",u)}if(c==="issues:list")return Le(r,{type:"issues",payload:await Jd({repoRoot:t})});if(c==="issues:create"){let u=await Qd({...i.payload,repoRoot:t});return Le(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 Le(r,{type:"error",message:"Missing move position"});let u=await tc({...i.payload,repoRoot:t});return et(r,t,n,"issues:move:result",u)}if(c==="issue:close"){if(!i.payload.issueId)return Le(r,{type:"error",message:"Missing issueId"});let u=await Zd({repoRoot:t,issueId:i.payload.issueId});return et(r,t,n,"issue:close:result",u)}if(c==="issue:reopen"){if(!i.payload.issueId)return Le(r,{type:"error",message:"Missing issueId"});let u=await ec({repoRoot:t,issueId:i.payload.issueId});return et(r,t,n,"issue:reopen:result",u)}return Le(r,{type:"error",message:"Unknown message type"})}catch(i){return Le(r,{type:"error",message:i instanceof Error?i.message:String(i)})}})})};var eg=en.dirname(Zp(import.meta.url)),tg=process.env.IS_LOCAL==="true"?en.resolve(process.cwd(),"dist/gui"):en.join(eg,"gui"),tt=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},ng=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)}),og=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",lc=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),o=en.resolve(tg),r=en.resolve(o,n),s=en.relative(o,r);if(s.startsWith("..")||en.isAbsolute(s))return tt(t,403,{isError:!0,message:"Forbidden"});try{let i=await Jp(r);return t.writeHead(200,{"content-type":og(r)}),t.end(i)}catch{return tt(t,404,{isError:!0,message:`Not found: ${n}`})}},rg=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)}),uc=async e=>{let t=Qp.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 ng(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/")?lc("/",s):lc(i.pathname,s)});try{await rg(t)}catch(r){return a(r instanceof Error?`Unable to start GUI server: ${r.message}`:`Unable to start GUI server: ${String(r)}`)}let n=dc({repoRoot:e.repoRoot});cc(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 mc=async e=>{let t=await uc({...e,boardId:""});if(d(t))return t;let{url:n}=t.value;return console.log(`Epiq GUI running at ${sg.cyan(n)}`),Vs(n),l("Started GUI",{url:n})};import{Box as Ut}from"ink";import Q from"react";import{Box as ws,Text as Kn}from"ink";import je,{useEffect as ig,useMemo as ag}from"react";import{ulid as dg}from"ulid";var pc=({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))},gc=dg(),cg=e=>`${e}`,lg=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))},ug=e=>Y.text({id:gc,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),mg=(e,t,n)=>Y.text({id:cg(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=[],pg=e=>{fc();let t=I.createNode(ug(g().rootNodeId));d(t)||!bt(t.value)||(Ms=[t.value,...e.map((n,o)=>mg(n,o,gc)).map(I.createNode).filter(Z).map(({value:n})=>n).filter(bt)],A.navigate({contextNode:t.value,selectedIndex:0}))},fc=()=>{let e=Ms.map(t=>t.id);Ms=[];for(let t of e)I.deleteNode(t)};function vc({width:e,height:t}){let o=Fa().value.trim().toLowerCase(),r=ag(()=>lg(o),[o]);ig(()=>(pg(r),()=>{fc()}),[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(pc,{text:Ci(i.command),match:o,color:m,dimColor:!i.isAvailable})),je.createElement(ws,{paddingLeft:2},je.createElement(pc,{text:p+i.description,match:o.length>=2?o:"",color:u&&i.isAvailable?y.primary:y.secondary2,dimColor:!i.isAvailable})))})))}import{Box as Rg}from"ink";import Ls from"react";import Yn from"chalk";import{Box as Ps,Text as yc}from"ink";import qn,{useEffect as gg,useMemo as fg,useState as vg}from"react";var hc=Yn.hex(y.secondary),yg=Yn.inverse,hg=Yn.inverse.hex(y.secondary2),xg={hint:"",hints:[],overlap:0,remainder:""},Ic=({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}},Ig=({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)},bg=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let o=Ic({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}},xc=()=>({value:ge.value,cursorPosition:ge.cursorPosition,commandIsPending:ge.commandIsPending,autoCompletion:ge.commandMeta.autoCompletion??xg,infoMessage:ge.commandMeta.infoMessage,validationStatus:ge.commandMeta.validity,command:ge.commandMeta.command,inputString:ge.commandMeta.inputString,modifier:ge.commandMeta.modifier}),Cg=(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,bc=({width:e,mode:t})=>{let[n,o]=vg(xc());gg(()=>{let S=()=>{let E=xc();o(R=>Cg(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=fg(()=>{let S=Math.max(0,Math.min(s,r.length)),N=Ic({value:r,command:m}),E=bg({value:r,command:m,modifier:p}),R=m?Hr(m):null,M=Ig({command:m,modifier:p}),D=(le,be)=>{let tn=N&&be>=N.start&&be<N.end,Wt=E&&be>=E.start&&be<E.end;return tn&&R?R.fg(le):Wt&&M?M.bg(le):le},j=(le,be)=>{let tn=N&&be>=N.start&&be<N.end,Wt=E&&be>=E.start&&be<E.end;return tn&&R?R.fgCursor(le):Wt&&M?M.bgCursor(le):yg(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=hg(le),yt=hc(u.remainder.slice(1)+Ne)}return hc(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(yc,null,v),i&&qn.createElement(yc,{wrap:"truncate",color:c?y.red:y.secondary2},` ${i} `))))};import{Box as Sg,Text as Ng}from"ink";import Cc from"react";var Eg=(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},Sc=({width:e,availableHints:t})=>{let n=Eg(t,e).join(" | ");return Cc.createElement(Sg,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},Cc.createElement(Ng,{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(Rg,null,t===f.COMMAND_LINE||t===f.PALETTE?Ls.createElement(bc,{width:e,mode:t}):Ls.createElement(Sc,{width:e,mode:t,availableHints:n}))};import{Box as kt,Text as yn}from"ink";import Ie,{useEffect as Tg,useMemo as Ag}from"react";import{ulid as Nc}from"ulid";var lr=Nc(),wg=()=>[...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})),Mg=e=>Y.text({id:lr,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),Pg=(e,t,n)=>Y.text({id:Nc(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),cr=[],Ec=()=>{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)},Lg=e=>{Ec();let t=I.createNode(Mg(g().rootNodeId));if(d(t)||!bt(t.value))return logger.error("Could not attach help nodes");cr=[t.value,...e.map((n,o)=>Pg(n,o,lr)).map(I.createNode).filter(Z).map(({value:n})=>n).filter(bt)],A.navigate({contextNode:t.value,selectedIndex:0})},Rc=({width:e,height:t})=>{let n=Ag(()=>wg(),[]);Tg(()=>(Lg(n),()=>{Ec()}),[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 kg from"chalk";import{Box as ur,Text as gt}from"ink";import ke from"react";var Tc=({width:e,height:t})=>ke.createElement(ur,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},ke.createElement(gt,{color:y.accent,bold:!0},"Initialize project"),ke.createElement(gt,null,`This folder is not an ${kg.hex(y.accent)("epiq")} project yet.`),ke.createElement(gt,{color:y.primary},"To start tracking issues here, we need to initialize a new",ke.createElement(gt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),ke.createElement(ur,{marginTop:1,flexDirection:"column"},ke.createElement(ur,null,ke.createElement(gt,{color:y.accent}," "),ke.createElement(gt,{color:y.primary},"Type "),ke.createElement(gt,{backgroundColor:y.secondary}," :init "))),ke.createElement(ur,{marginTop:1},ke.createElement(gt,{color:y.secondary2},"This will create, commit and push "),ke.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 Dg=({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+">"))),Fg=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(Dg,{isDone:v.done,command:v.command,value:v.done?Fg(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 Ac}from"ink";import Dt from"react";var Bg=e=>(I.getTag(e)?.name??"").length+3,Ug=e=>(I.getContributor(e)?.name??"").length+3,wc=({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+Bg(Ne),0)+v.reduce((k,Ne)=>k+Ug(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(fn,{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(Ac,{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(Ac,{color:y.secondary2},j),O)};import{Box as Og,Text as Mc}from"ink";import gr from"react";var Wg=({filters:e})=>gr.createElement(Og,{columnGap:1},gr.createElement(Mc,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:o})=>gr.createElement(Mc,{backgroundColor:"black",color:"white"},` ${n}${o}"${t}" `))),Pc=gr.memo(Wg);import{Box as $g,Text as fr}from"ink";import Jn from"react";function Lc(){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($g,{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 _g,Text as kc}from"ink";import Fs,{useEffect as jg,useState as Hg}from"react";var Vg=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Gg=150,Dc=12,zg=.36,Fc=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)}`},qg=(e,t,n)=>{let o=Fc(e),r=Fc(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})},Yg=(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 qg(s,i,r)};function Bc({syncStatus:e,autoSync:t}){let[n,o]=Hg(0);jg(()=>{if(e.status!=="syncing"){o(0);return}let c=0,u=setInterval(()=>{c+=1;let m=(Math.sin(c*zg)+1)/2,p=Math.round(m*(Dc-1));o(v=>v===p?v:p)},Gg);return()=>clearInterval(u)},[e.status]);let r={synced:" ",failed:"---",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,pending:y.secondary2,syncing:Yg(Vg,n/(Dc-1))??""}[e.status];return Fs.createElement(_g,null,Fs.createElement(kc,null,Ds.hex(y.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Fs.createElement(kc,null,Ds.hex(i)("\u25CF")+Ds.hex(y.secondary2).dim(` ${r[e.status].padEnd(4)} `)))}import _c from"chalk";import{Text as jc}from"ink";import Hc,{useEffect as Zg,useState as ef}from"react";var Ft="1.0.1";import Bs from"chalk";var Xg="https://registry.npmjs.org/epiq/latest",Us=null,Uc=0,Jg=1e3*60*60*24,Oc=e=>e.replace(/^v/,""),Qg=(e,t)=>{let n=Oc(e).split(".").map(Number),o=Oc(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},Wc=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Us&&Date.now()-Uc<Jg)return Us;try{let t=await fetch(Xg);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,Uc=Date.now(),r}catch{return{current:e,latest:null,updateAvailable:!1}}},$c=(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 Vc(){let[e,t]=ef({current:Ft,latest:null,updateAvailable:!1});return Zg(()=>{let n=!0;return Wc(Ft).then(o=>{n&&t(o)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?Hc.createElement(jc,{dimColor:!0,color:y.secondary2},Ft+" "):Hc.createElement(jc,null,_c.hex(y.secondary2).dim(Ft),_c.hex(y.accent).dim(" \u2197 "),$c(Ft,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(Pc,{filters:e}):ye.createElement(wc,{width:m})),n==="live"?ye.createElement(vr,{columnGap:1,paddingRight:2,"max-width":u,overflow:"hidden",justifyContent:"flex-end"},ye.createElement(Bc,{autoSync:!!c,syncStatus:o}),ye.createElement(Qn,null,yr.hex(y.secondary2).dim("Mode: ")+yr.hex(y.secondary2).dim(r.padEnd(8," "))," "),ye.createElement(Gc,{icon:"@",value:s}),ye.createElement(Gc,{icon:"\u276F",value:i}),ye.createElement(Vc,null)):"",n==="peek"?ye.createElement(Lc,null):"")}function Gc({icon:e,value:t}){return ye.createElement(Qn,null,yr.dim(e)+yr.hex(y.accent)(` ${t??"-"} `))}import{Box as tf,Text as nf}from"ink";import eo from"react";import{Box as hr,Text as Os}from"ink";import Bt 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 Bt.createElement(hr,{flexDirection:"column",height:r,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},Bt.createElement(hr,{padding:1,paddingTop:0,paddingBottom:0},Bt.createElement(Os,null,"Select a board:")),Bt.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 Bt.createElement(hr,{key:c.id??u},Bt.createElement(Os,{color:m?y.accent:y.secondary2},Bt.createElement(xe,{isSelected:m})),Bt.createElement(Os,{color:m?y.accent:y.secondary2},c.title," (",v," issues)",c.readonly?" \u{1F512}":""))})))}var of=({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(tf,{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(nf,null))},zc=eo.memo(of);import{useEffect as rf}from"react";var sf=e=>{rf(()=>{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])},Kc=({autoSync:e})=>(sf(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(Ut,{flexDirection:"column"},Q.createElement(Rc,{width:e,height:t}));if(n.mode===f.PALETTE)return Q.createElement(Ut,{flexDirection:"column"},Q.createElement(Zn,{filters:s}),Q.createElement(vc,{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(Ut,{flexDirection:"column"},Q.createElement(Ut,{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(Ut,{flexDirection:"column"},Q.createElement(Ut,{flexDirection:"column"},Q.createElement(Zn,{hideBreadCrumb:!0,filters:s}),Q.createElement(Tc,{height:t,width:e})),Q.createElement(Xn,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=Re(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(Ut,{flexDirection:"column"},Q.createElement(Kc,{autoSync:o}),Q.createElement(Ut,{flexDirection:"column"},Q.createElement(Zn,{filters:s}),Q.createElement(zc,{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 af from"readline";var xr,Ir,ot,df=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]),qc=async e=>{if(e.ctrl&&e.name==="c")return A.exit();let{actionIndex:t,mode:n,readOnly:o}=g(),r=Ua(e,n);if(!r||o&&!df.has(r))return;let s=t[n]?.[r];if(s?.action)try{await s.action(s,e)}catch(i){logger.error(i)}},cf=()=>async function(t,n){n.name!=="escape"&&(ot&&(clearTimeout(ot),ot=void 0),await qc(n))},lf=()=>async function(t){if(t.length===1&&t[0]===27){ot&&clearTimeout(ot),ot=setTimeout(()=>{qc({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),ot=void 0},25);return}ot&&(clearTimeout(ot),ot=void 0)};function Yc(){xr&&process.stdin.removeListener("keypress",xr),Ir&&process.stdin.removeListener("data",Ir),xr=cf(),Ir=lf(),af.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Ir),process.stdin.on("keypress",xr)}async function Xc(){try{let e=jn();Z(e)&&Be(e.value);let t=He(process.cwd()),n=[];if(Z(t)){let s=$e({repoRoot:t.value});if(d(s))return qt(3,s.message);let i=nn(),c=await $t({repoRoot:t.value,stateBranchRoot:s.value,stateBranchName:i.stateBranch});if(d(c))return qt(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 qt(3,m.message);n=m.value}let o=Kt(n);if(d(o))return qt(4,o.message);C({hasProjectDefinition:Z(t),hasInitializingEvents:!!n.length});let r=_s();return d(r)?qt(6,r.message):(Yc(),l("Booted Epiq",void 0))}catch(e){return qt(0,Ao(e))}}ud();var gf=`${Ot.bold("Epiq CLI")}
58
58
 
59
59
  ${Ot.dim("Boot in directory:")}
60
60
  ${Ot.cyan("$ epiq")}
61
61
 
62
62
  ${Ot.dim("Launch GUI:")}
63
63
  ${Ot.cyan("$ epiq gui")}
64
- `,gf=uf(pf,{importMeta:import.meta,version:Ft,flags:{init:{type:"boolean",default:!1}}}),br=gf.input[0];br&&br!=="gui"&&(console.error(Ot.red(`Unknown command: ${br}`)),process.exit(1));var Xc=process.stdout.columns||120,Jc=process.stdout.rows||20,Cr=null,ff=e=>{try{return Cr?(Cr.rerender(e),l("Rerendered app",void 0)):(Cr=lf(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${Ao(t)}`)}},_s=()=>ff(mf.createElement($s,{width:Xc,height:Jc}));process.stdout.on("resize",()=>{if(Xc=process.stdout.columns||120,Jc=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(Ot.red(`Failed to start Epiq GUI:
65
- ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await Yc();d(e)&&(logger.info(e.message),console.error(Ot.red(`Failed to boot Epiq:
64
+ `,ff=mf(gf,{importMeta:import.meta,version:Ft,flags:{init:{type:"boolean",default:!1}}}),br=ff.input[0];br&&br!=="gui"&&(console.error(Ot.red(`Unknown command: ${br}`)),process.exit(1));var Jc=process.stdout.columns||120,Qc=process.stdout.rows||20,Cr=null,vf=e=>{try{return Cr?(Cr.rerender(e),l("Rerendered app",void 0)):(Cr=uf(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${Ao(t)}`)}},_s=()=>vf(pf.createElement($s,{width:Jc,height:Qc}));process.stdout.on("resize",()=>{if(Jc=process.stdout.columns||120,Qc=process.stdout.rows||20,!Cr)return;let e=_s();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(br==="gui"){let e=await mc({repoRoot:process.cwd()});d(e)&&(console.error(Ot.red(`Failed to start Epiq GUI:
65
+ ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await Xc();d(e)&&(logger.info(e.message),console.error(Ot.red(`Failed to boot Epiq:
66
66
  ${e.message}`)),process.exitCode=1)}export{_s as renderApp};