epiq 0.6.5 → 0.6.7

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,68 +1,63 @@
1
1
  #!/usr/bin/env node
2
- import Dr from"chalk";import{render as pp}from"ink";import gp from"meow";import fp from"react";import Kr from"node:fs";import tc from"node:os";import Le from"node:path";import Qt from"node:fs";import{ulid as Vd}from"ulid";import{z as Mn}from"zod";var Je={None:"none",Success:"success",Fail:"fail"},a=e=>({status:Je.Fail,message:e,value:null}),l=(e,t)=>({status:Je.Success,message:e,value:t}),d=e=>e.status==="fail",X=e=>e.status==="success";import Xt from"node:fs";import He from"node:path";var bp=process.env.IS_LOCAL==="true",We=".epiq",Se=".epiq-global",Rn="events",jd="project.json",An=e=>He.join(e,We),Tn=e=>He.join(An(e),jd),Jt=e=>He.join(An(e),Rn),ni=e=>He.join(e,We),Kd=e=>{let t=He.join(e,We);return Xt.existsSync(t)&&Xt.statSync(t).isDirectory()},Or=e=>{let t=Tn(e);return Xt.existsSync(t)&&Xt.statSync(t).isFile()},wn=e=>{let t=He.resolve(e);for(;;){if(Kd(t))return l("Resolved closest .epiq root",t);let n=He.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},Qe=e=>{let t=He.resolve(e);for(;;){if(Or(t))return l("Resolved closest epiq project root",t);let n=He.dirname(t);if(n===t)return a("No .epiq/project.json found in any parent");t=n}},ri=e=>{let t=Jt(e);try{return Xt.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")}},Me=async()=>{let e=await et(process.cwd());if(d(e))return e;let t=Ze({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};var zd="_epiq/_evt",Gd=Mn.object({projectId:Mn.string().min(1),stateBranch:Mn.string().min(1),createdAt:Mn.iso.datetime()}),oi=()=>({projectId:Vd(),stateBranch:zd,createdAt:new Date().toISOString()}),tt=e=>{let t=Tn(e);if(!Qt.existsSync(t))return a("Missing .epiq/project.json");try{let n=Qt.readFileSync(t,"utf8"),r=JSON.parse(n),o=Gd.safeParse(r);return o.success?l("Read project.json",o.data):a(`Invalid .epiq/project.json: ${o.error.issues.map(i=>`${i.path.join(".")}: ${i.message}`).join(", ")}`)}catch(n){return a(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},ii=e=>{let t=tt(e);return d(t)?a(t.message):l("Read projectId",t.value.projectId)},si=({repoRoot:e,fileContents:t})=>{let n=An(e),r=Tn(e);try{if(Qt.mkdirSync(n,{recursive:!0}),Qt.existsSync(r)){let o=tt(e);return d(o)?a(o.message):l("Project already initialized",null)}return Qt.writeFileSync(r,JSON.stringify(t,null,2)+`
3
- `,"utf8"),l("Created project.json",null)}catch(o){return a(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var Ur=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let s=r(...i);if(!n.has(s)){let c=e(...i).then(u=>(d(u)&&n.delete(s),u));n.set(s,c)}return n.get(s)});return o.clear=()=>n.clear(),o};import Zt from"fs";import di from"path";import qd from"util";var ai=1e3,Yd=50,$r=0,ci=()=>{let e=process.cwd(),t=wn(e);if(!d(t))return di.join(t.value,We,"log","epiq.log")};function Xd(){let e=ci();if(!e||!Zt.existsSync(e))return;let n=Zt.readFileSync(e,"utf8").split(`
4
- `);if(n[n.length-1]===""&&n.pop(),n.length<=ai)return;let r=n.slice(-ai).join(`
2
+ import wr from"chalk";import{render as Ym}from"ink";import Xm from"meow";import Jm from"react";import $r from"node:fs";import Wd from"node:os";import we from"node:path";import qt from"node:fs";import{ulid as Md}from"ulid";import{z as In}from"zod";var qe={None:"none",Success:"success",Fail:"fail"},a=e=>({status:qe.Fail,message:e,value:null}),l=(e,t)=>({status:qe.Success,message:e,value:t}),d=e=>e.status==="fail",Y=e=>e.status==="success";import zt from"node:fs";import Ue from"node:path";var sp=process.env.IS_LOCAL==="true",Oe=".epiq",ye=".epiq-global",Nn="events",Td="project.json",En=e=>Ue.join(e,Oe),Sn=e=>Ue.join(En(e),Td),Gt=e=>Ue.join(En(e),Nn),Go=e=>Ue.join(e,Oe),wd=e=>{let t=Ue.join(e,Oe);return zt.existsSync(t)&&zt.statSync(t).isDirectory()},kr=e=>{let t=Sn(e);return zt.existsSync(t)&&zt.statSync(t).isFile()},bn=e=>{let t=Ue.resolve(e);for(;;){if(wd(t))return l("Resolved closest .epiq root",t);let n=Ue.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},Ye=e=>{let t=Ue.resolve(e);for(;;){if(kr(t))return l("Resolved closest epiq project root",t);let n=Ue.dirname(t);if(n===t)return a("No .epiq/project.json found in any parent");t=n}},qo=e=>{let t=Gt(e);try{return zt.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")}},Ie=async()=>{let e=await Je(process.cwd());if(d(e))return e;let t=Xe({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};var Pd="_epiq/_evt",kd=In.object({projectId:In.string().min(1),stateBranch:In.string().min(1),createdAt:In.iso.datetime()}),Yo=()=>({projectId:Md(),stateBranch:Pd,createdAt:new Date().toISOString()}),Qe=e=>{let t=Sn(e);if(!qt.existsSync(t))return a("Missing .epiq/project.json");try{let n=qt.readFileSync(t,"utf8"),r=JSON.parse(n),o=kd.safeParse(r);return o.success?l("Read project.json",o.data):a(`Invalid .epiq/project.json: ${o.error.issues.map(i=>`${i.path.join(".")}: ${i.message}`).join(", ")}`)}catch(n){return a(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Xo=e=>{let t=Qe(e);return d(t)?a(t.message):l("Read projectId",t.value.projectId)},Jo=({repoRoot:e,fileContents:t})=>{let n=En(e),r=Sn(e);try{if(qt.mkdirSync(n,{recursive:!0}),qt.existsSync(r)){let o=Qe(e);return d(o)?a(o.message):l("Project already initialized",null)}return qt.writeFileSync(r,JSON.stringify(t,null,2)+`
3
+ `,"utf8"),l("Created project.json",null)}catch(o){return a(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var Lr=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let s=r(...i);if(!n.has(s)){let c=e(...i).then(u=>(d(u)&&n.delete(s),u));n.set(s,c)}return n.get(s)});return o.clear=()=>n.clear(),o};import Yt from"fs";import Zo from"path";import Ld from"util";var Qo=1e3,Dd=50,Dr=0,ei=()=>{let e=process.cwd(),t=bn(e);if(!d(t))return Zo.join(t.value,Oe,"log","epiq.log")};function Fd(){let e=ei();if(!e||!Yt.existsSync(e))return;let n=Yt.readFileSync(e,"utf8").split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=Qo)return;let r=n.slice(-Qo).join(`
5
5
  `)+`
6
- `;Zt.writeFileSync(e,r,"utf8")}function Hr(e,t,n=!1){let r=ci();if(!r)return;let o=qd.format(...t),i=new Date,c=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
7
- `;Zt.mkdirSync(di.dirname(r),{recursive:!0}),Zt.appendFileSync(r,c,"utf8"),$r++,$r>=Yd&&($r=0,Xd())}var le={info(...e){Hr("[Info]",e,!1)},debug(...e){Hr("[debug]",e,!0)},error(...e){let t=e.find(n=>n instanceof Error)instanceof Error?void 0:new Error().stack;Hr("[Error]",[...e,t].filter(Boolean),!1)}};globalThis.logger=le;import{spawn as Jd}from"node:child_process";import Pn from"node:fs";import en from"node:path";var K={stage:({cwd:e,pathspec:t})=>D({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>D({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>D({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>D({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>D({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push",...r?["-u"]:[],t,n]:["push"];return D({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>D({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>D({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>D({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>D({args:["worktree","prune"],cwd:e})};var ht=e=>{let t=Qe(e);if(d(t))return a("Unable to resolve epiq project root");let n=tt(t.value);return d(n)?a("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},pe="origin";var li=1e4,Qd={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},mi=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Pn.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(a(p));return}let o=Jd("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Qd}),i=!1,s="",c="",u=p=>{i||(i=!0,clearTimeout(m),r(p))},m=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${li}ms`].join(`
8
- `);u(n?{stdout:s,stderr:p,exitCode:124}:a(p))},li);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{s+=p}),o.stderr.on("data",p=>{c+=p}),o.on("error",p=>{if(n){u({stdout:s,stderr:p.message,exitCode:1});return}u(a([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
9
- `)))}),o.on("close",p=>{let y=p??1;if(n){u({stdout:s,stderr:c,exitCode:y});return}if(y!==0){u(a([`git ${e.join(" ")}`,c.trim()||s.trim()||"Git command failed"].filter(Boolean).join(`
10
- `)));return}u(l("Git command succeeded",{stdout:s,stderr:c,exitCode:y}))})}),D=({args:e,cwd:t})=>mi({args:e,cwd:t,allowFail:!1}),be=({args:e,cwd:t})=>mi({args:e,cwd:t,allowFail:!0}),Dt=async({cwd:e,message:t})=>{let n=await K.commit({cwd:e,message:t});if(d(n))return a(`Failed to create commit
11
- ${n.message}`);let r=await D({args:["rev-parse","HEAD"],cwd:e});return d(r)?a(`Commit created, but failed to read HEAD SHA
12
- ${r.message}`):l("Created commit and resolved SHA",r.value.stdout.trim())},Zd=async e=>{let t=await D({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",en.isAbsolute(n)?n:en.resolve(e,n))},ec=async e=>{let t=await Zd(e);if(d(t))return a(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress",REBASE_HEAD:"rebase in progress",CHERRY_PICK_HEAD:"cherry-pick in progress",REVERT_HEAD:"revert in progress",BISECT_LOG:"bisect in progress"};for(let[u,m]of Object.entries(r))if(Pn.existsSync(en.join(n,u)))return l("Checked for in-progress Git operation",m);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[u,m]of Object.entries(o))if(Pn.existsSync(en.join(n,u)))return l("Checked for in-progress Git operation",m);let i=await D({cwd:e,args:["status","--porcelain=v1","--branch"]});if(d(i))return a(i.message);let s=i.value.stdout.toLowerCase(),c=["rebase in progress","merge in progress","cherry-pick in progress","revert in progress","bisect in progress"].find(u=>s.includes(u));return l("Checked for in-progress Git operation",c??null)},kn=async e=>{let t=await ec(e);return d(t)?a(t.message):l("Checked for in-progress Git operation",t.value!==null)},Wr=async({repoRoot:e})=>{let n=(await be({args:["remote","get-url",pe],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},tn=async({repoRoot:e,branch:t})=>{let n=await be({args:["ls-remote","--heads",pe,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${pe}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},Ln=async({repoRoot:e,branch:t})=>{let n=await be({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}`)},ui=e=>{try{return Pn.realpathSync.native(e)}catch{return en.resolve(e)}},pi=async({repoRoot:e,worktreeRoot:t})=>{let n=await D({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=ui(t),o=n.value.stdout.split(`
13
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(ui).includes(r);return l("Checked worktree registration",o)},_r=async e=>{let t=await be({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Dn=async e=>{let t=await D({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved current branch",t.value.stdout.trim())},gi=async e=>{let t=await D({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},fi=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),vi=async e=>(await be({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1),xi=async({cwd:e,branch:t})=>{let n=await tn({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return l("Remote branch missing, skipped reset",!1);let r=await K.fetch({cwd:e,remote:pe,branch:t});if(d(r))return a(`Failed to fetch ${t}
14
- ${r.message}`);let o=await vi(e);if(d(o))return a(o.message);let i=await D({cwd:e,args:["reset","--hard",`${pe}/${t}`]});return d(i)?a(`Failed to reset ${t} from remote
15
- ${i.message}`):l("Reset branch from remote",!0)},jr=async({cwd:e,branch:t})=>{let n=await tn({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return l("Remote branch missing, skipped pull",!1);let r=await vi(e);if(d(r))return a(r.message);let o=await K.fetch({cwd:e,remote:pe,branch:t});if(d(o))return a(`Failed to fetch ${t}
16
- ${o.message}`);let i=await K.pullRebase({cwd:e,remote:pe,branch:t});return d(i)?a(`Failed during pull --rebase
17
- ${i.message}`):l("Pulled with rebase",!0)},yi=async e=>{let t=await be({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 hi=async e=>{let t=await Dn(e);return d(t)?a(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var Ni="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ct=e=>Le.join(We,Rn,e),Ei=()=>Le.join(tc.homedir(),Se),Fn=()=>Le.join(Ei(),"worktrees"),Ze=({repoRoot:e})=>{let t=ii(e);return d(t)?a(t.message):l("Resolved state branch root",Le.join(Fn(),t.value))},nc=e=>Le.join(e,We),Ci=e=>Le.join(nc(e),Rn);var nn=e=>{try{return Kr.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},Bn=()=>{let e=nn(Ei());if(d(e))return a(`Ensure epiq home failed.
18
- `+e.message);let t=nn(Fn());return d(t)?a(`Ensure worktrees dir failed.
19
- `+t.message):l("Ensured epiq storage",!0)},Si=e=>{Kr.existsSync(e)&&(le.debug("[sync] remove path",e),Kr.rmSync(e,{recursive:!0,force:!0}))};var bi=(e,t)=>{for(let n of[Ci(e),Ci(t)]){let r=nn(n);if(d(r))return a(r.message)}return l("Ensured state branch",void 0)},Ii=async e=>{let t=await D({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return a(`ensure state branch is storage only failed
6
+ `;Yt.writeFileSync(e,r,"utf8")}function Fr(e,t,n=!1){let r=ei();if(!r)return;let o=Ld.format(...t),i=new Date,c=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
7
+ `;Yt.mkdirSync(Zo.dirname(r),{recursive:!0}),Yt.appendFileSync(r,c,"utf8"),Dr++,Dr>=Dd&&(Dr=0,Fd())}var ae={info(...e){Fr("[Info]",e,!1)},debug(...e){Fr("[debug]",e,!0)},error(...e){let t=e.find(n=>n instanceof Error)instanceof Error?void 0:new Error().stack;Fr("[Error]",[...e,t].filter(Boolean),!1)}};globalThis.logger=ae;import{spawn as Bd}from"node:child_process";import Rn from"node:fs";import Xt from"node:path";var K={stage:({cwd:e,pathspec:t})=>L({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>L({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>L({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>L({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>L({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push",...r?["-u"]:[],t,n]:["push"];return L({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>L({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>L({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>L({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>L({args:["worktree","prune"],cwd:e})};var Tt=e=>{let t=Ye(e);if(d(t))return a("Unable to resolve epiq project root");let n=Qe(t.value);return d(n)?a("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},he="origin";var ti=1e4,Ud={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},ri=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Rn.existsSync(t)){let g=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:g,exitCode:1});return}r(a(g));return}let o=Bd("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Ud}),i=!1,s="",c="",u=g=>{i||(i=!0,clearTimeout(m),r(g))},m=setTimeout(()=>{o.kill("SIGTERM");let g=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${ti}ms`].join(`
8
+ `);u(n?{stdout:s,stderr:g,exitCode:124}:a(g))},ti);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",g=>{s+=g}),o.stderr.on("data",g=>{c+=g}),o.on("error",g=>{if(n){u({stdout:s,stderr:g.message,exitCode:1});return}u(a([`git ${e.join(" ")}`,`cwd=${t}`,g.message].join(`
9
+ `)))}),o.on("close",g=>{let y=g??1;if(n){u({stdout:s,stderr:c,exitCode:y});return}if(y!==0){u(a([`git ${e.join(" ")}`,c.trim()||s.trim()||"Git command failed"].filter(Boolean).join(`
10
+ `)));return}u(l("Git command succeeded",{stdout:s,stderr:c,exitCode:y}))})}),L=({args:e,cwd:t})=>ri({args:e,cwd:t,allowFail:!1}),Te=({args:e,cwd:t})=>ri({args:e,cwd:t,allowFail:!0}),wt=async({cwd:e,message:t})=>{let n=await K.commit({cwd:e,message:t});if(d(n))return a(`Failed to create commit
11
+ ${n.message}`);let r=await L({args:["rev-parse","HEAD"],cwd:e});return d(r)?a(`Commit created, but failed to read HEAD SHA
12
+ ${r.message}`):l("Created commit and resolved SHA",r.value.stdout.trim())},Od=async e=>{let t=await L({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",Xt.isAbsolute(n)?n:Xt.resolve(e,n))},$d=async e=>{let t=await Od(e);if(d(t))return a(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress",REBASE_HEAD:"rebase in progress",CHERRY_PICK_HEAD:"cherry-pick in progress",REVERT_HEAD:"revert in progress",BISECT_LOG:"bisect in progress"};for(let[u,m]of Object.entries(r))if(Rn.existsSync(Xt.join(n,u)))return l("Checked for in-progress Git operation",m);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[u,m]of Object.entries(o))if(Rn.existsSync(Xt.join(n,u)))return l("Checked for in-progress Git operation",m);let i=await L({cwd:e,args:["status","--porcelain=v1","--branch"]});if(d(i))return a(i.message);let s=i.value.stdout.toLowerCase(),c=["rebase in progress","merge in progress","cherry-pick in progress","revert in progress","bisect in progress"].find(u=>s.includes(u));return l("Checked for in-progress Git operation",c??null)},An=async e=>{let t=await $d(e);return d(t)?a(t.message):l("Checked for in-progress Git operation",t.value!==null)},Br=async({repoRoot:e})=>{let n=(await Te({args:["remote","get-url",he],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},Tn=async({repoRoot:e,branch:t})=>{let n=await Te({args:["ls-remote","--heads",he,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${he}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},wn=async({repoRoot:e,branch:t})=>{let n=await Te({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}`)},ni=e=>{try{return Rn.realpathSync.native(e)}catch{return Xt.resolve(e)}},oi=async({repoRoot:e,worktreeRoot:t})=>{let n=await L({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=ni(t),o=n.value.stdout.split(`
13
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(ni).includes(r);return l("Checked worktree registration",o)},Ur=async e=>{let t=await Te({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Mn=async e=>{let t=await L({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved current branch",t.value.stdout.trim())},ii=async e=>{let t=await L({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},si=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Hd=async e=>(await Te({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1);var Or=async({cwd:e,branch:t})=>{let n=await Tn({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return l("Remote branch missing, skipped pull",!1);let r=await Hd(e);if(d(r))return a(r.message);let o=await K.fetch({cwd:e,remote:he,branch:t});if(d(o))return a(`Failed to fetch ${t}
14
+ ${o.message}`);let i=await K.pullRebase({cwd:e,remote:he,branch:t});return d(i)?a(`Failed during pull --rebase
15
+ ${i.message}`):l("Pulled with rebase",!0)},ai=async e=>{let t=await Te({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 di=async e=>{let t=await Mn(e);return d(t)?a(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var li="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Hr=e=>we.join(Oe,Nn,e),ui=()=>we.join(Wd.homedir(),ye),Pn=()=>we.join(ui(),"worktrees"),Xe=({repoRoot:e})=>{let t=Xo(e);return d(t)?a(t.message):l("Resolved state branch root",we.join(Pn(),t.value))},_d=e=>we.join(e,Oe),ci=e=>we.join(_d(e),Nn);var Jt=e=>{try{return $r.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},kn=()=>{let e=Jt(ui());if(d(e))return a(`Ensure epiq home failed.
16
+ `+e.message);let t=Jt(Pn());return d(t)?a(`Ensure worktrees dir failed.
17
+ `+t.message):l("Ensured epiq storage",!0)},mi=e=>{$r.existsSync(e)&&(ae.debug("[sync] remove path",e),$r.rmSync(e,{recursive:!0,force:!0}))};var pi=(e,t)=>{for(let n of[ci(e),ci(t)]){let r=Jt(n);if(d(r))return a(r.message)}return l("Ensured state branch",void 0)},gi=async e=>{let t=await L({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return a(`ensure state branch is storage only failed
20
18
  `+t.message);let r=t.value.stdout.trim().split(`
21
- `).filter(Boolean).filter(s=>s!==We);if(r.length===0)return l("State branch is storage-only",!1);let o=await D({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return a(`Failed to clean storage branch
22
- ${o.message}`);let i=await Dt({cwd:e,message:"[epiq:repair-storage-branch]"});return d(i)?a(i.message):l("Cleaned storage branch",!0)},et=Ur(async(e=process.cwd())=>{let t=await D({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=>Le.resolve(e)),pg=Ur(async e=>{let t=await D({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return a(t.message);let n=t.value.stdout.trim(),r=Le.isAbsolute(n)?n:Le.join(e,n);return l("Resolved git dir",r)},e=>Le.resolve(e));import we from"node:fs";import Pt from"node:path";var M={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Vr(e){return e.context===M.WORKSPACE}function W(e){return e.context===M.TICKET}function nt(e){return e.context===M.TEXT}function rt(e){return e.context===M.FIELD}function rn(e){return e.context===M.FIELD_LIST}var Ft=e=>e.context===M.SWIMLANE,Ri=e=>e.context===M.BOARD;import{ulid as ic}from"ulid";var Bt=24n,rc=Bt*4n,_e=(1n<<rc)-1n,oc=/^[0-9a-f]+$/;function Ai(e){return!e||!oc.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function Pe(e,t=Bt){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 ge(e,t){if(!e&&!t)return Pe(_e/2n,Bt);let n=e?Ai(e):l("Resolved lower bound",0n);if(d(n))return n;let r=t?Ai(t):l("Resolved upper bound",_e);if(d(r))return r;let o=n.value,i=r.value;if(i<=o)return Pe(_e/2n,Bt);let s=(o+i)/2n;return s===o||s===i?a("No rank space available between neighbors"):Pe(s,Bt)}function Ti(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=_e*BigInt(r+1)/(t+1n),i=Pe(o,Bt);if(d(i))return i;n.push(i.value)}return l("Resolved evenly spaced ranks",n)}var zr=(e,t)=>{let n=$(e),r=Ti(n.length);if(d(r))return r;let o={};for(let i=0;i<n.length;i++){let s=n[i],c=r.value[i];if(!s||!c)return a("Unable to assign rebalance rank");o[s.id]=c}return l("Created rebalance event",{id:ic(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};var J={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};import{useSyncExternalStore as Ou}from"react";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};function On(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Un=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",wi=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),Mi=e=>e.charAt(0).toUpperCase()+e.slice(1);var Pi=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),i=t.get(o);i?i.push(n):t.set(o,[n])}return t},ki=(e,t)=>t?e.get(t)??[]:[];var Li=new WeakMap,sc=e=>{let t=Li.get(e);return t||(t=Pi(e),Li.set(e,t)),t};var Di=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return ki(sc(e),r).filter(i=>On(r,i)>=n)};var ac={hint:"",hints:[],overlap:0,remainder:""},Fi=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return ac;let o=Di({wordList:r,inputToMatch:e,overlapThreshold:1});return dc(t,o)},dc=(e,t)=>{let n=t[0]??"",r=On(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),s=r<(o??"").length,c=!!i,p=(c&&s?o:n)+(c&&s?":":" "),y=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:y}};var $n={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},H=()=>$n,De=e=>($n={...$n,...e},$n);var Ot=3e3,Bi=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Ot?null:t},Oi=0,Gr,qr=!1,on=!1,Yr=()=>{if(qr)return!0;let e=ot();return d(e)?!1:e.value.syncStatus.status==="syncing"},cc=()=>{let e=H().autoSyncIntervalMs??1e4,t=Date.now()-Oi;return Math.max(0,e-t)},Ui=()=>{Gr||(Gr=setTimeout(async()=>{if(Gr=void 0,!!Ut()){if(Yr()){on=!0;return}on=!1,await lc()}},cc()))},lc=async()=>{if(v().readOnly||v().timeMode==="peek")return a("Cannot auto-sync while peeking");if(!Ut())return a("Cannot auto-sync before state is initialized");if(Yr())return on=!0,a("Sync already in progress");qr=!0,Oi=Date.now(),S({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Hn()}finally{qr=!1,on&&Ui()}},$i=()=>{Ut()&&(on=!0,!Yr()&&Ui())};var it=()=>{let e=H(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&r,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r}},Hi=()=>{let e=Qe(process.cwd());if(d(e))return!1;let t=tt(e.value);return X(t)},Wi=e=>e===!0?"yes":e===!1?"no":null,_i=e=>e==="yes"?!0:e==="no"?!1:null;var de={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},h={accent:de.cyan,accent2:de.magenta,primary:de.white,secondary:de.grayDark,secondary2:de.grayLight,gray:de.gray,green:de.green,yellow:de.yellow,red:de.red};var C={red:de.red,yellow:de.yellow,green:de.green,blue:de.blue,magenta:de.magenta,cyan:de.cyan},Nt={urgent:C.red,critical:C.red,important:C.red,blocker:C.red,asap:C.red,immediate:C.red,fail:C.red,failure:C.red,broken:C.red,bug:C.red,error:C.red,incident:C.red,outage:C.red,production:C.red,crash:C.red,security:C.red,warning:C.yellow,warn:C.yellow,risky:C.yellow,risk:C.yellow,attention:C.yellow,pending:C.yellow,review:C.yellow,"needs-review":C.yellow,qa:C.yellow,testing:C.yellow,test:C.yellow,validate:C.yellow,verification:C.yellow,staging:C.yellow,check:C.yellow,"follow-up":C.yellow,followup:C.yellow,waiting:C.yellow,blocked:C.yellow,hold:C.yellow,done:C.green,complete:C.green,completed:C.green,success:C.green,ok:C.green,stable:C.green,resolved:C.green,fixed:C.green,closed:C.green,merged:C.green,released:C.green,deployed:C.green,approved:C.green,verified:C.green,working:C.green,healthy:C.green,pass:C.green,passing:C.green,info:C.blue,information:C.blue,note:C.blue,docs:C.blue,documentation:C.blue,doc:C.blue,guide:C.blue,help:C.blue,explanation:C.blue,detail:C.blue,details:C.blue,context:C.blue,design:C.blue,discussion:C.blue,proposal:C.blue,idea:C.blue,feature:C.magenta,enhancement:C.magenta,improvement:C.magenta,refactor:C.magenta,refactoring:C.magenta,cleanup:C.magenta,optimize:C.magenta,optimization:C.magenta,perf:C.magenta,performance:C.magenta,upgrade:C.magenta,migration:C.magenta,modernize:C.magenta,debt:C.magenta,todo:C.cyan,next:C.cyan,planned:C.cyan,plan:C.cyan,future:C.cyan,backlog:C.cyan,investigate:C.cyan,explore:C.cyan,prototype:C.cyan};var uc=e=>e.props.tags??[],mc=e=>e.props.assignees??[],Xr=e=>uc(e).map(t=>b.getTag(t)).filter(t=>!!t),Jr=e=>mc(e).map(t=>b.getContributor(t)).filter(t=>!!t),Wn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!W(n)?a("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",Xr(n))},_n=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!W(n)?a("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",Jr(n))};var x={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",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",NONE:""};var pc=/^(\d+)(h|d|w|mo|y)$/,gc=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,fc=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let i=new Date(e,t-1,n,r,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===n&&i.getHours()===r&&i.getMinutes()===o},vc=(e,t=new Date)=>{let n=e.match(pc);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let s=new Date(t);switch(o){case"h":return s.setHours(s.getHours()-i),s;case"d":return s.setDate(s.getDate()-i),s;case"w":return s.setDate(s.getDate()-i*7),s;case"mo":return s.setMonth(s.getMonth()-i),s;case"y":return s.setFullYear(s.getFullYear()-i),s;default:return null}},xc=e=>{let t=e.match(gc);if(!t)return null;let[,n,r,o,i,s]=t,c=Number(n),u=Number(r),m=Number(o),p=i?Number(i):0,y=s?Number(s):0;return fc({year:c,month:u,day:m,hour:p,minute:y})?new Date(c,u-1,m,p,y):null},jn=e=>{let t=e.trim().toLowerCase();return vc(t)??xc(t)},ji=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,yc=[{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}],Ki=(e=yc)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let i=r;i<=o;i++)t.push(`${i}${n}`);return t};var hc=["BOARD","TICKET","SWIMLANE"],oe={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},st={TITLE:"title",DESCRIPTION:"description"},Cc=[oe.EDITOR,oe.VIEW,oe.USERNAME,oe.AUTOSYNC,oe.SYNC_DEBOUNCE_MS],Nc=[st.TITLE,st.DESCRIPTION],Zr=[String(Ot),"5000","15000","30000","60000"],Et=[x.EXIT,x.SYNC,x.HELP,x.EXPORT,x.CONFIG],Kn=[x.NEW,x.EDIT,x.DELETE,x.MOVE],Qr=[x.TAG,x.UNTAG,x.ASSIGN,x.UNASSIGN,x.CLOSE_ISSUE,x.RE_OPEN_ISSUE,x.EDIT],Vi=[x.FILTER,x.PEEK],Ec={WORKSPACE:[...Et,...Kn],BOARD:[...Vi,...Et,...Kn],SWIMLANE:[...Vi,...Et,...Kn],TICKET:[...Et,...Kn,...Qr],FIELD:[...Et,...Qr],FIELD_LIST:[...Et,...Qr],TEXT:[...Et]},Sc=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],bc=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=it();if(!r)return[x.HELP,x.CONFIG];if(!Hi())return[x.HELP,x.INIT];if(t)return[x.HELP,x.PEEK,x.EXPORT,x.CONFIG];let o=e?.context,i=o&&hc.includes(o);return[...new Set([...n,e].map(c=>c?.context).flatMap(c=>c?Ec[c]:[]))].filter(c=>c===x.MOVE?!1:c===x.EDIT||c===x.DELETE?i:!0)},Q=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=v())=>{let i=t.context??"WORKSPACE";return{[x.NONE]:bc({breadCrumb:o,readOnly:r,selectedNode:n}),[x.EXIT]:["confirm"],[x.EXPORT]:[],[x.SYNC]:[],[x.INIT]:[],[x.HELP]:[],[x.PEEK]:[...Ki(),"now","prev","next"],[x.EDIT]:[...Nc],[x.DELETE]:["confirm"],[x.RE_OPEN_ISSUE]:["confirm"],[x.CLOSE_ISSUE]:["confirm"],[x.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[x.FILTER]:["tag","assignee","description","title","clear"],[x.TAG]:[...new Set([...Object.keys(Nt),...b.getExistingTags()])],[x.UNTAG]:[...Wn()?.value?.map(({name:c})=>c)??[]],[x.UNASSIGN]:[..._n()?.value?.map(({name:c})=>c)??[]],[x.ASSIGN]:b.getExistingAssignees(),[x.NEW]:Sc(i),[x.CONFIG]:[...Cc]}[e]??[]};import os from"chalk";var zi=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as Gi}from"ulid";var qi=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"},Yi=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())}`},Vn=e=>{try{return l("Decoded date",new Date(Gi(e)))}catch(t){return a("Decoding failed + "+t.message)}},eo=e=>{if(!e?.id)return null;try{return Gi(e.id)}catch{return null}};var Ie=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?l("Found node",n):a("Unable to find node in breadcrumb")};import $t from"chalk";var Ic=[0,0,0],ro=.2,no={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Xi=(e,t,n)=>Math.max(t,Math.min(n,e)),to=(e,t,n)=>e+(t-e)*n,Ji=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Rc=e=>e.toLowerCase().trim(),Ac=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,s=e/60,c=i*(1-Math.abs(s%2-1)),u=0,m=0,p=0;s>=0&&s<1?(u=i,m=c):s>=1&&s<2?(u=c,m=i):s>=2&&s<3?(m=i,p=c):s>=3&&s<4?(m=c,p=i):s>=4&&s<5?(u=c,p=i):(u=i,p=c);let y=o-i/2;return[Math.round((u+y)*255),Math.round((m+y)*255),Math.round((p+y)*255)]},Qi=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Tc=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},Zi=(e,t,n)=>{let r=Xi(n,0,1);return[Math.round(to(e[0],t[0],r)),Math.round(to(e[1],t[1],r)),Math.round(to(e[2],t[2],r))]},wc=(e,t=ro)=>Zi(e,Ic,t),Mc=(e,t=ro)=>Qi(wc(Tc(e),t)),Pc=(e,t,n)=>Zi(e,t,n),sn=e=>{let n=Ji(e)%360,r=Ac(n,no.stringColor.saturation,no.stringColor.lightness);return Qi(r)},Re=(e,t=Nt)=>{let n=Rc(e);return n&&t[n]?t[n]:sn(n)},es=(e,t=Nt,n=ro)=>Mc(Re(e,t),n),kc=e=>{let t=no.gradient.stops,n=Xi(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),s=o-i;return Pc(t[i],t[i+1],s)},zn=e=>Ji(e.toLowerCase().trim())/4294967295,ts=e=>{let t=zn(e);return kc(t)},Lc=e=>{let[t,n,r]=ts(e);return{normal:o=>$t.bgRgb(t,n,r).black(o),cursor:o=>$t.bgRgb(t,n,r).white.bold(o)}},oo=e=>{let[t,n,r]=ts(e);return{fg:o=>$t.rgb(t,n,r)(o),fgCursor:o=>$t.rgb(t,n,r).inverse(o),bg:o=>$t.bgRgb(t,n,r).black(o),bgCursor:o=>$t.bgRgb(t,n,r).white.bold(o)}},Gn=e=>Lc(e).normal(` ${e} `);import ns from"chalk";var Z=e=>ns.dim(e),fe=e=>ns.hex(h.primary)(e),ve=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let s=o.trim();if(s.length<i)return"";let p=[...t.filter(Boolean).filter(y=>y.startsWith(s))].sort((y,N)=>zn(y)-zn(N)).slice(0,r).map(y=>Gn(y)).join(" ");return p?`${Z(e)}${p}${Z(n)}`:""};var St={None:"none",Invalid:"invalid",Valid:"valid"};var Dc=["BOARD","TICKET","SWIMLANE"],rs=()=>{let e=v().selectedNode;return e?.context?Dc.includes(e.context)?j():B({message:Z("Command not available in this context")}):B({message:Z("Missing target context")})},ee="<ENTER> to confirm",j=(e="",t=[])=>({message:Z(e),validity:St.Valid,completionWordList:t}),B=({message:e,completionWordList:t=[]})=>({validity:St.Invalid,message:e,completionWordList:t}),Yn=e=>e.length===0,qn=e=>` ${os.dim.bgHex(es(e))(` ${e} `)} `,io=({modifier:e})=>{let t="confirm";return e===t?j(ee):B({message:Yn(e)?Z("if you are certain, enter ")+Gn(t):"",completionWordList:[t]})},Fc=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?B({message:Z(n)}):j():B({message:Yn(r)?t:"",completionWordList:[...e]}),an=({hint:e})=>({modifier:t,inputString:n})=>Yn(t)&&Yn(n)?B({message:e,completionWordList:[]}):j(ee),Bc=({modifier:e,inputString:t})=>{let n=Q(x.CONFIG);if(!n.includes(e))return B({message:ve({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case oe.EDITOR:{let r=[...zi];return t.trim()?r.includes(t.trim())?j(ee):B({message:ve({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):B({message:ve({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case oe.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?j(ee):B({message:ve({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case oe.USERNAME:return t.trim()?j(ee):B({message:fe("Enter a user name. Saved in ")+os.bgBlack("~/.epiq-global/config.json")});case oe.AUTOSYNC:{let r=["yes","no"],o=H().autoSync;if(!r.includes(t.trim())){let i=Wi(o);return B({message:ve({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return j(ee)}case oe.SYNC_DEBOUNCE_MS:{let r=H().autoSyncIntervalMs,o=Bi(t);if(!t.trim()||o===null||o<Ot){let i=ve({prefix:" examples: ",wordList:Zr,minLengthForHints:0,inputString:t});return B({message:fe(`provide duration above ${Ot}ms. current duration: ${r}ms.`)+i,completionWordList:Zr})}return j(ee)}default:return B({message:fe("Unknown config option"),completionWordList:n})}},Oc=({modifier:e})=>{let t=Q(x.EDIT);if(!t.includes(e)){let i=ve({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return B({message:i||fe("Unknown edit option"),completionWordList:t})}let{breadCrumb:n,selectedNode:r}=v();if(!Ie([...n,r],"TICKET"))return B({message:fe("Command not available in this context")});switch(e){case st.TITLE:return j(ee);case st.DESCRIPTION:let{preferredEditor:i}=H();return i?j(Z("<ENTER> to edit in ")+i):B({message:"No editor selected"});default:return B({message:fe("Unknown edit option"),completionWordList:t})}},Uc={[x.EXPORT]:()=>j(ee+Z(", and create export markdown file")),[x.PEEK]:e=>{let t=e.modifier;if(t==="now")return j(ee);let n={message:Z("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return j(ee);let r=jn(t);if(!t||!r)return B(n);let o=Ie(v().breadCrumb,"BOARD");if(d(o))return B({message:fe("Command is not applicable in this context")});let i=Vn(o.value.id);return d(i)?B({message:fe("Unable to peek: board id is not a valid ULID")}):ji({date:r,horizonDate:i.value})?j(ee):B({message:fe(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[x.EXIT]:()=>j(ee+Z(" and exit the application")),[x.INIT]:()=>j(ee),[x.PALETTE]:()=>j(ee),[x.FILTER]:e=>{if(e.modifier==="clear")return j();let t=i=>Q(x.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return B({message:ve({wordList:Q(x.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Q(x.FILTER)});let n=Object.values(v().tags).map(i=>i.name),r=Object.values(v().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?B({message:ve({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):j():B({message:ve({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[x.NONE]:e=>{let t=Q(x.NONE);return B({message:ve({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[x.NEW]:e=>Fc({list:Q(x.NEW),hint:ve({wordList:Q(x.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[x.HELP]:()=>j(ee),[x.EDIT]:Oc,[x.CONFIG]:Bc,[x.DELETE]:e=>{let t=rs();return t.validity==="invalid"?t:io(e)},[x.CLOSE_ISSUE]:e=>io(e),[x.RE_OPEN_ISSUE]:e=>io(e),[x.MOVE]:e=>{let t=rs();return t.validity==="invalid"?t:an({hint:ve({prefix:"hey hacker! These commands are blocked for you... ",wordList:Q(x.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[x.TAG]:e=>{let n=b.getExistingTags().slice(0,10).map(qn).join("");return an({hint:n.length?Z("create tag or reuse:")+n+Z(""):Z("create tag ...")})(e)},[x.UNTAG]:e=>{let t=Wn();if(d(t))return B({message:fe("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(qn).slice(0,10);return n.length?an({hint:Z(" ... ")+n.join("")})(e):B({message:fe("Issue has no tags"),completionWordList:[]})},[x.ASSIGN]:e=>{let t=b.getExistingAssignees().map(qn).slice(0,10);return an({hint:Z("assignees... ")+t.join("")})(e)},[x.UNASSIGN]:e=>{let t=_n();if(d(t))return B({message:fe("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(qn).slice(0,10);return n.length?an({hint:Z("remove assignee... ")+n.join("")})(e):B({message:fe("Issue has no assignees"),completionWordList:[]})},[x.SYNC]:()=>j(ee)},is=Object.fromEntries(Object.entries(Uc).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ss=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var as=e=>Object.values(x).includes(e),ds=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:s,validity:c,completionWordList:u}=is[n].validate(n,r,i),m=o==="command"||o==="modifier"?Q(n):ss,{mode:p}=v(),y=p===g.COMMAND_LINE?s??"":"",N=[...u,...m];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:y,autoCompletion:t?Fi(e,N):{hint:"",hints:[],remainder:"",overlap:0}}};var cs=e=>{let t=e.trimStart(),n=Hc(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),s=Wc(e),c=as(r)?r:null,u=c!==null,m=r!=="",p=c?Q(c)??[]:[],y=c&&p.includes(o)?o:"",N="word";n.length===0||n.length===1&&!i?N="command":(n.length===1&&i||n.length===2&&!i)&&(N="modifier");let E=i?"":s,I=$c(t,c,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:s,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:i,modifier:y,target:N,inputToMatch:E,inputString:I}},$c=(e,t,n)=>{let r=e;return t&&r.startsWith(t)&&(r=r.slice(t.length)),r=r.replace(/^\s+/,""),n&&r.startsWith(n)&&(r=r.slice(n.length),r=r.replace(/^\s+/,"")),r},Hc=e=>e.trim()?e.trim().split(/\s+/):[],Wc=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as _c}from"react";var Ht=e=>e===so||e===":",so=" ",ce={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:St.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},ao=new Set,ls=()=>{for(let e of ao)e()},co=e=>(ao.add(e),()=>ao.delete(e)),je=e=>{let n=e(ce),r=cs(n.value),o=n.cursorPosition===n.value.length;ce={...n,commandMeta:ds(r,o)},ls()},dn=({message:e,status:t})=>{let n=structuredClone(ce);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,ce=n,ls(),l(e,null)},lo=e=>{je(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},uo=e=>{je(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Ht(n[o-1]);)o--;for(;o>0&&!Ht(n[o-1]);)o--}else{for(;o<n.length&&!Ht(n[o]);)o++;for(;o<n.length&&Ht(n[o]);)o++}return{...t,cursorPosition:o}})},us=()=>{je(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}})},ms=()=>{je(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Ht(t[r-1]);)r--;for(;r>0&&!Ht(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},O=e=>{je(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),s=i+o,c=Math.max(0,Math.min(i.length,s.length));return{...t,value:s,cursorPosition:c,commandIsPending:!1}})},ps=()=>{je(e=>({...e,commandIsPending:!0}))},gs=({addToHistory:e=!0})=>{je(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),jc()},fs=()=>{je(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}})},vs=()=>{je(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},jc=()=>O(()=>""),V=()=>ce,xs=()=>_c(co,V,V),ys=()=>{let[e,...t]=ce.value.split(so);return t.join(so).trim()};var hs=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Cs=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Ns=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Es=(e,t)=>{if(Cs(e,e.sequence))return f.MoveCursorLeftOfWord;if(Ns(e,e.sequence))return f.MoveCursorRightOfWord;if(hs(e,e.sequence))return f.EraseInputWord;switch(e.name){case"tab":return f.AutoCompleteCommand;case"up":return f.GetLastCommandFromHistory;case"down":return f.GetNextCommandFromHistory;case"left":return f.MoveCursorLeft;case"right":return f.MoveCursorRight;case"return":return f.Confirm;case"backspace":return t?f.EraseInput:f.ExitCommandLine;case"escape":return f.ExitCommandLine;default:return f.CaptureInput}},Ss=(e,t)=>{if(Cs(e,e.sequence))return f.MoveCursorLeftOfWord;if(Ns(e,e.sequence))return f.MoveCursorRightOfWord;if(hs(e,e.sequence))return f.EraseInputWord;switch(e.name){case"tab":return f.AutoCompleteCommand;case"up":return f.NavPreviousItem;case"down":return f.NavNextItem;case"left":return f.MoveCursorLeft;case"right":return f.MoveCursorRight;case"return":return f.Confirm;case"backspace":return t?f.EraseInput:f.ExitCommandLine;case"escape":return f.ExitCommandLine;default:return f.CaptureInput}};var f={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 Kc(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function Vc(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function zc(e,t,n){let r=v().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function bs(e,t){let n=V();if(e.sequence==="?"&&n.value==="")return f.InitCommandPalette;if(e.sequence===":"&&n.value==="")return f.InitCommandLine;if(t===g.MOVE)switch(e.name){case"m":case"return":return f.ConfirmMove}if(t===g.COMMAND_LINE)return Es(e,n.value);if(t===g.PALETTE)return Ss(e,n.value);let r=Kc(e)||Vc(e);if(r)return Gc(r,t);if(e.ctrl&&e.name==="c")return f.Exit;switch(e.name){case"r":return f.EditTitle;case"e":return f.EditDescription;case"n":return f.AddItem;case"m":return f.InitMove;case"d":return f.Delete;case"return":return f.Confirm;case"space":return f.Confirm;case"v":return H().viewMode==="wide"?f.SetViewDense:f.SetViewWide;case"q":case"escape":return f.Exit;default:return null}}function Gc(e,t){let n=t===g.MOVE?{prevItem:f.MovePreviousItem,nextItem:f.MoveNextItem,prevContainer:f.MoveToPreviousContainer,nextContainer:f.MoveToNextContainer}:{prevItem:f.NavPreviousItem,nextItem:f.NavNextItem,prevContainer:f.NavToPreviousContainer,nextContainer:f.NavToNextContainer};return zc(v().contextNode.childRenderAxis,e,n)}var Xn=e=>{let{context:t}=v().contextNode;if(!t)return P.None;switch(e){case x.EXIT:return P.Exit;case x.EXPORT:return P.Export;case x.INIT:return P.Init;case x.DELETE:return P.Delete;case x.EDIT:return P.Edit;case x.HELP:return P.ViewHelp;case x.RE_OPEN_ISSUE:return P.ReopenIssue;case x.CLOSE_ISSUE:return P.CloseIssue;case x.TAG:return P.TagTicket;case x.UNTAG:return P.UntagTicket;case x.ASSIGN:return P.AssignUserToTicket;case x.UNASSIGN:return P.UnassignUserFromTicket;case x.NEW:return P.NewItem;case x.FILTER:return P.Filter;case x.MOVE:return P.Move;case x.PEEK:return P.Peek;case x.CONFIG:return P.Config;case x.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",Sync:"sync",Export:"export"};import{ulid as ye}from"ulid";import Fs from"node:fs";import hl from"node:path";import Cl from"react";import{Box as xl}from"ink";import tr from"react";import{Box as go,Text as il}from"ink";import Fe from"react";import{Text as Is}from"ink";import Rs,{useEffect as As,useState as qc}from"react";var Ts={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},xe=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=te(),r=Ts[n]??Ts.default,[o,i]=qc(0);if(As(()=>{i(0)},[r]),As(()=>{if(!e)return;let c=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return Rs.createElement(Is,null,t);let s=r[o]??r[0]??t;return Rs.createElement(Is,{color:h.accent,dimColor:o===1},s)};import{Box as mo,Text as Yc}from"ink";import Jn from"react";var at=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),s=Math.max(1,Math.ceil(r)),c=Math.max(1,Math.floor(i/s)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-c),p=o?Math.min(m,Math.max(0,u-c+1)):Math.min(m,Math.floor(u/c)*c),y=p+c,N=e.slice(p,y),E=e.length>c,I=i,w=E?Math.max(1,Math.floor(c/e.length*I)):I,R=Math.max(0,I-w),T=Math.max(1,e.length-c),F=E?Math.floor(p/T*R):0;return Jn.createElement(mo,{flexDirection:"row",height:i,width:"100%"},Jn.createElement(mo,{flexDirection:"column",flexGrow:1,height:i},N),Jn.createElement(mo,{flexDirection:"column",width:1,height:I},Array.from({length:I}).map((re,se)=>Jn.createElement(Yc,{key:se,color:E&&se>=F&&se<F+w?h.accent:h.secondary},E?"\u2502":" "))))};import{Box as Qn,Text as nl}from"ink";import bt from"react";import{Text as Xc}from"ink";import Jc from"react";var Qc=e=>e.toLowerCase().trim(),Zc=(e,t=Nt)=>{let n=Qc(e);return t[n]?t[n]:sn(n)},Wt=({id:e,isSelected:t})=>{let n=b.getContributor(e);if(n)return Jc.createElement(Xc,{underline:t,color:Zc(n.name)},"@"+n.name)};import{Text as el}from"ink";import tl from"react";var _t=({id:e,isSelected:t})=>{let n=b.getTag(e);if(n)return tl.createElement(el,{underline:t,backgroundColor:Re(n.name),color:h.primary}," "+n.name+" ")};var ws=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Un(wi(t.title),r),i=Xr(t),s=Jr(t);return bt.createElement(Qn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?h.accent:h.secondary,justifyContent:"space-between"},bt.createElement(Qn,{borderBottom:!0},bt.createElement(Qn,{paddingLeft:1,flexDirection:"column"},bt.createElement(nl,{color:h.primary},o))),bt.createElement(Qn,{flexDirection:"row",paddingLeft:1},i.map(c=>bt.createElement(_t,{key:c.id,id:c.id})),s.map(c=>bt.createElement(Wt,{key:c.id,id:c.id}))))};import rl from"chalk";import{Box as cn,Text as po}from"ink";import Ke from"react";var ol=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ms=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(E=>b.getTag(E)).filter(E=>!!E),s=(t.props.assignees??[]).map(E=>b.getContributor(E)).filter(E=>!!E),c=1,u=i.length*(1+c),m=s.length*(2+c),p=i.map(E=>Ke.createElement(cn,{key:E.id,paddingRight:c},Ke.createElement(po,{color:Re(E.name)},"\u25A0"))),y=s.map(E=>Ke.createElement(cn,{key:E.id,paddingRight:c},Ke.createElement(po,{color:sn(E.name)},"@"+E.name.at(0)))),N=n?h.accent:o===g.MOVE?h.secondary:h.primary;return Ke.createElement(cn,{borderBottom:!0,justifyContent:"space-between"},Ke.createElement(cn,null,Ke.createElement(xe,{isSelected:n,placeholder:rl.dim.gray(r+1+" ")}),Ke.createElement(po,{wrap:"truncate",color:N},ol(t.title,e-u-m-14))),Ke.createElement(cn,null,p,y))};import sl from"chalk";var al=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:s,mode:c})=>{let{renderedChildrenIndex:u}=te(),m=u[e.id]??[],p=`${e.title} ${sl.hex(h.secondary2).dim("("+m.length+")")}`,y=3,N=o?1:4,E=r-y-(o?2:1),I=Fe.createElement(go,{borderStyle:"round",borderColor:h.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Fe.createElement(xe,{isSelected:t}),Fe.createElement(il,{bold:!0,color:t?h.accent:h.primary},p," ",e.readonly?"\u{1F512}":"")),w=(R,T)=>{let F=i&&s===T;return o?Fe.createElement(Ms,{key:R.id,index:T,width:n,ticket:R,isSelected:F,mode:c}):Fe.createElement(ws,{key:R.id,width:n,ticket:R,isSelected:F})};return Fe.createElement(go,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?h.accent:h.secondary,paddingRight:1,paddingLeft:1,height:r},I,Fe.createElement(go,{padding:o?1:0},m.length>0&&Fe.createElement(at,{selectedIndex:s,height:E,itemHeight:N},m.map(w)),Fe.createElement(xe,{isSelected:i&&s===-1})))},Ps=Fe.memo(al);import{Box as xo,Text as gl}from"ink";import ct,{useMemo as Ls}from"react";import{decodeTime as dl,encodeTime as cl}from"ulid";var ll="0123456789ABCDEFGHJKMNPQRSTVWXYZ",ul=e=>{let t=2166136261;for(let o of e)t^=o.charCodeAt(0),t=Math.imul(t,16777619);let n=BigInt(t>>>0),r="";for(let o=0;o<16;o++)n=n*1103515245n+12345n&0xffffffffn,r+=ll[Number(n%32n)];return r},dt=(e,t)=>{let n=dl(e);return cl(n,10)+ul(`${e}:${t}`)};import{Box as Zn,Text as ml}from"ink";import Ve from"react";var ks=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=te(),{title:o}=t,i=t.parentNodeId?b.getNode(t.parentNodeId):void 0,s=i&&W(i)?o===J.ASSIGNEES?i.props.assignees??[]:o===J.TAGS?i.props.tags??[]:[]:[];return Ve.createElement(Zn,{alignItems:"center",paddingTop:1},Ve.createElement(Zn,{minWidth:12},Ve.createElement(xe,{isSelected:n}),Ve.createElement(ml,{color:n?h.accent:h.secondary2},o,":")),Ve.createElement(Zn,{flexDirection:"row",marginLeft:1,paddingRight:1},s.map((c,u)=>{let m=r.id===t.id&&u===e;return Ve.createElement(Zn,{key:`${o}-${c}`,paddingRight:2,minHeight:1},Ve.createElement(xe,{isSelected:m}),o===J.ASSIGNEES?Ve.createElement(Wt,{isSelected:m,id:c}):o===J.TAGS?Ve.createElement(_t,{isSelected:m,id:c}):null)})))};import{Box as er,Text as fo}from"ink";import ze,{useEffect as pl}from"react";var z={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:M.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:M.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:M.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:i="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:M.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:M.FIELD_LIST,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:M.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:i=!0,isVirtual:s=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:M.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:s})};var vo=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:s,contextNode:c}=te(),u=N=>String(N).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];pl(()=>{let N=[];return m.forEach((E,I)=>{let w=Pe(BigInt(I+1));if(!X(w))return;let R=z.text({id:`${e}-${I}`,name:`Line ${I+1}`,parentNodeId:e,rank:w.value,props:{value:E},readonly:!0,isVirtual:!0}),T=b.createNode(R);X(T)&&N.push(T.value.id)}),()=>N.forEach(b.deleteNode)},[e,n]);let p="\u2029",y=m.map((N,E)=>{let I=c.id===e&&s===E;return ze.createElement(er,{key:`${e}-${E}`},ze.createElement(fo,{color:I?h.primary:h.secondary2,dimColor:!I},`${E+1} `.padStart(5,"\xA0")),ze.createElement(fo,{backgroundColor:I?"gray":""},u(N.length?Un(N,i-10):p)))});return ze.createElement(er,{flexDirection:"column",paddingTop:1},ze.createElement(er,null,ze.createElement(xe,{isSelected:o}),ze.createElement(fo,{color:o?h.accent:h.secondary2},t)),ze.createElement(er,{flexDirection:"row",borderStyle:"round",borderColor:h.secondary,paddingLeft:1,marginLeft:1},ze.createElement(at,{scrollByOne:!0,children:y,height:r-2,selectedIndex:s,itemHeight:1})))};var fl=e=>dt(e,"description"),vl=e=>dt(e,"history"),Ds=({ticket:e,height:t})=>{let{selectedIndex:n,contextNode:r}=te(),o=process.stdout.columns||120,i=Ls(()=>fl(e.id),[e.id]),s=Ls(()=>vl(e.id),[e.id]),c=r.id===e.id,u=r.id===s||r.parentNodeId===s,m=U(e.id);if(u){let R=b.getNode(s),T=R&&rt(R)?R.props.value??"":"",re=t-3;return ct.createElement(xo,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},R?ct.createElement(vo,{id:R.id,label:"Event log",text:T,selected:!1,maxWidth:o,height:re}):null)}let p=m.reduce((R,T)=>rn(T)||T.id===s?R+1:R,0),y=2,N=3,E=p,I=t-N-E-y,w=(R,T)=>R.id===i?ct.createElement(vo,{key:R.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:T,maxWidth:o,height:I}):rn(R)?ct.createElement(ks,{key:R.id,parent:R,selected:T,selectedIndex:n}):R.id===s?ct.createElement(xo,{key:R.id,paddingTop:1},ct.createElement(xe,{isSelected:T}),ct.createElement(gl,{backgroundColor:h.secondary,color:T?h.accent:h.primary}," History \u203A\u203A ")):null;return ct.createElement(xo,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((R,T)=>w(R,c&&n===T)))};var yl=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:s,width:c})=>{let u=t.context,m=u===M.TICKET||u===M.FIELD_LIST||u===M.FIELD,p=u===M.BOARD||u===M.SWIMLANE,y=u===M.TICKET?t:r.find(R=>R.context===M.TICKET),N=Math.floor(c/3),E=Math.floor(c/Math.max(e.length,1)),I=Math.min(E,N),w=i==="dense";return tr.createElement(xl,{flexDirection:"row",height:s},p&&e.map((R,T)=>{let F=t.id===R.id,re=F?n:-1,se=t.context===M.BOARD&&n===T;return tr.createElement(Ps,{key:R.id,height:s,width:I,swimlane:R,isSelected:se,isDense:w,isFocused:F,listSelectedIndex:re,mode:o})}),m&&y&&tr.createElement(Ds,{height:s,ticket:y}))},nr=tr.memo(yl);import{render as Nl}from"ink";import{Writable as El}from"node:stream";var ln=e=>String(e).padStart(2,"0"),Sl=e=>{let t=e.getUTCFullYear(),n=ln(e.getUTCMonth()+1),r=ln(e.getUTCDate()),o=ln(e.getUTCHours()),i=ln(e.getUTCMinutes()),s=ln(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${s}`},bl=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Il=async(e,{width:t,height:n})=>{let r="",o=new El({write(s,c,u){let m=Rl(s.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=Nl(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(s=>setTimeout(s,0)),i.unmount(),r},Rl=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Bs=async()=>{let{viewMode:e}=H(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=v(),s=r.find(T=>T.context==="BOARD");if(!s)return a("No board found to export");let c=120,u=40,m=await Il(Cl.createElement(nr,{height:u,width:c,swimlanes:(i[s.id]??[]).filter(T=>T!==void 0&&Ft(T)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:u});if(!m)return a("Failed to render board export");let p=wn(process.cwd());if(d(p))return a("Unable to export, epiq root not found");let y=new Date,N=Sl(y),E=`board_${bl(s.title)}_${N}.md`,I=ni(p.value);Fs.mkdirSync(I,{recursive:!0});let w=hl.join(I,E),R=`# Board - ${s.title}
19
+ `).filter(Boolean).filter(s=>s!==Oe);if(r.length===0)return l("State branch is storage-only",!1);let o=await L({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return a(`Failed to clean storage branch
20
+ ${o.message}`);let i=await wt({cwd:e,message:"[epiq:repair-storage-branch]"});return d(i)?a(i.message):l("Cleaned storage branch",!0)},Je=Lr(async(e=process.cwd())=>{let t=await L({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=>we.resolve(e)),Yp=Lr(async e=>{let t=await L({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return a(t.message);let n=t.value.stdout.trim(),r=we.isAbsolute(n)?n:we.join(e,n);return l("Resolved git dir",r)},e=>we.resolve(e));import{Box as pt}from"ink";import q from"react";var Ln={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},U=()=>Ln,Me=e=>(Ln={...Ln,...e},Ln);var Ze=()=>{let e=U(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&r,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r}},fi=()=>{let e=Ye(process.cwd());if(d(e))return!1;let t=Qe(e.value);return Y(t)},vi=e=>e===!0?"yes":e===!1?"no":null,xi=e=>e==="yes"?!0:e==="no"?!1:null;var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var Ce=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?l("Found node",n):a("Unable to find node in breadcrumb")};import{useSyncExternalStore as Qu}from"react";var w={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Wr(e){return e.context===w.WORKSPACE}function H(e){return e.context===w.TICKET}function et(e){return e.context===w.TEXT}function tt(e){return e.context===w.FIELD}function Qt(e){return e.context===w.FIELD_LIST}var Mt=e=>e.context===w.SWIMLANE,yi=e=>e.context===w.BOARD;function Dn(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Fn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",hi=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 Ni=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),i=t.get(o);i?i.push(n):t.set(o,[n])}return t},Ei=(e,t)=>t?e.get(t)??[]:[];var Si=new WeakMap,jd=e=>{let t=Si.get(e);return t||(t=Ni(e),Si.set(e,t)),t};var bi=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Ei(jd(e),r).filter(i=>Dn(r,i)>=n)};var Kd={hint:"",hints:[],overlap:0,remainder:""},Ii=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Kd;let o=bi({wordList:r,inputToMatch:e,overlapThreshold:1});return Vd(t,o)},Vd=(e,t)=>{let n=t[0]??"",r=Dn(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),s=r<(o??"").length,c=!!i,g=(c&&s?o:n)+(c&&s?":":" "),y=g.slice(r);return{hint:g,hints:t,overlap:r,remainder:y}};import{ulid as qd}from"ulid";var Pt=24n,zd=Pt*4n,$e=(1n<<zd)-1n,Gd=/^[0-9a-f]+$/;function Ri(e){return!e||!Gd.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function Re(e,t=Pt){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 le(e,t){if(!e&&!t)return Re($e/2n,Pt);let n=e?Ri(e):l("Resolved lower bound",0n);if(d(n))return n;let r=t?Ri(t):l("Resolved upper bound",$e);if(d(r))return r;let o=n.value,i=r.value;if(i<=o)return Re($e/2n,Pt);let s=(o+i)/2n;return s===o||s===i?a("No rank space available between neighbors"):Re(s,Pt)}function Ai(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=$e*BigInt(r+1)/(t+1n),i=Re(o,Pt);if(d(i))return i;n.push(i.value)}return l("Resolved evenly spaced ranks",n)}var _r=(e,t)=>{let n=O(e),r=Ai(n.length);if(d(r))return r;let o={};for(let i=0;i<n.length;i++){let s=n[i],c=r.value[i];if(!s||!c)return a("Unable to assign rebalance rank");o[s.id]=c}return l("Created rebalance event",{id:qd(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};var X={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};var nt=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return a("Node not found");if(r.context===t)return l("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return l("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return a(`No ancestor found for context: ${t}`)},jr=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},ft=(e,t)=>e?e.readonly?a({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:a("Node not found"),b={deleteNode(e){Ne(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=v(),r=n[e];if(!r)return a("Edit target node not found");let o=ft(r,"edit");if(o)return o;let i={...r,props:{...r.props,description:t}};return this.updateNode(i),l("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return a("Rename target node not found");let r=ft(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),l("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return O(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),i=this.getNode(t);if(!o)return a("Node not found");if(!i)return a("Target parent not found");if(r===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let s=ft(o,"move");if(s)return s;if(jr(t,e))return a("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=v(),o=this.getNode(e);if(!o)return a("Node not found");if(r===e)return a("Cannot delete root node");let i=new Set,s=u=>{let m=t[u];if(!(!m||i.has(u))){i.add(u);for(let g of O(m.id))s(g.id)}};s(e);let c={...structuredClone(t)};for(let u of i){if(!c[u])return a("Unable to locate node to delete");c[u]={...c[u],isDeleted:!0}}return n?(S({nodes:c}),l("Successfully tomb stoned",o)):a("Unable to delete undefined")},createContributor(e){let t=Ne(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?a("Unable to create contributor"):l("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!r)return a("Unable to assign contributor, missing target");let o=ft(r,"edit");if(o)return o;if(!H(r))return a("Target is not an issue");let i=r.props.assignees??[];if(i.includes(t))return a("Contributor already assigned");let s={...r,props:{...r.props,assignees:[...i,t]}};return this.updateNode(s),l("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!r)return a("Unable to unassign, missing target");let o=ft(r,"edit");if(o)return o;if(!H(r))return a("Target is not an issue");let i=r.props.assignees??[];if(!i.includes(t))return l("Issue is not assigned to that contributor",{assignee:t});let s={...r,props:{...r.props,assignees:i.filter(c=>c!==t)}};return this.updateNode(s),l("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!r)return a("Unable to add tag, missing target");let o=ft(r,"edit");if(o)return o;if(!H(r))return a("Target is not an issue");let i=r.props.tags??[];if(i.includes(t))return a("Tag already assigned");let s={...r,props:{...r.props,tags:[...i,t]}};return this.updateNode(s),l("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!r)return a("Unable to remove tag, missing target");let o=ft(r,"edit");if(o)return o;if(!H(r))return a("Target is not an issue");let i=r.props.tags??[];if(!i.includes(t))return l("Issue is not tagged with that tag",{tag:t});let s={...r,props:{...r.props,tags:i.filter(c=>c!==t)}};return this.updateNode(s),l("Tag removed",{tag:t})},createTag(e){let t=Ne(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):l("Tag created",e)},createNode(e){let t=Ne(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?a("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return a("Failed to locate node");let n={...t,readonly:!0},r=Ne(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?a(r.message):l("Locked node",n)},updateNode(e){let t=Ne(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:l("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings(e){return O(e)}};var V={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,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:w.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:w.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:i="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:w.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:w.FIELD_LIST,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:w.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:i=!0,isVirtual:s=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:w.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:s})};import xt from"chalk";import Ui from"string-width";import{decodeTime as oc}from"ulid";import kt from"chalk";var ie={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},h={accent:ie.cyan,accent2:ie.magenta,primary:ie.white,secondary:ie.grayDark,secondary2:ie.grayLight,gray:ie.gray,green:ie.green,yellow:ie.yellow,red:ie.red};var C={red:ie.red,yellow:ie.yellow,green:ie.green,blue:ie.blue,magenta:ie.magenta,cyan:ie.cyan},vt={urgent:C.red,critical:C.red,important:C.red,blocker:C.red,asap:C.red,immediate:C.red,fail:C.red,failure:C.red,broken:C.red,bug:C.red,error:C.red,incident:C.red,outage:C.red,production:C.red,crash:C.red,security:C.red,warning:C.yellow,warn:C.yellow,risky:C.yellow,risk:C.yellow,attention:C.yellow,pending:C.yellow,review:C.yellow,"needs-review":C.yellow,qa:C.yellow,testing:C.yellow,test:C.yellow,validate:C.yellow,verification:C.yellow,staging:C.yellow,check:C.yellow,"follow-up":C.yellow,followup:C.yellow,waiting:C.yellow,blocked:C.yellow,hold:C.yellow,done:C.green,complete:C.green,completed:C.green,success:C.green,ok:C.green,stable:C.green,resolved:C.green,fixed:C.green,closed:C.green,merged:C.green,released:C.green,deployed:C.green,approved:C.green,verified:C.green,working:C.green,healthy:C.green,pass:C.green,passing:C.green,info:C.blue,information:C.blue,note:C.blue,docs:C.blue,documentation:C.blue,doc:C.blue,guide:C.blue,help:C.blue,explanation:C.blue,detail:C.blue,details:C.blue,context:C.blue,design:C.blue,discussion:C.blue,proposal:C.blue,idea:C.blue,feature:C.magenta,enhancement:C.magenta,improvement:C.magenta,refactor:C.magenta,refactoring:C.magenta,cleanup:C.magenta,optimize:C.magenta,optimization:C.magenta,perf:C.magenta,performance:C.magenta,upgrade:C.magenta,migration:C.magenta,modernize:C.magenta,debt:C.magenta,todo:C.cyan,next:C.cyan,planned:C.cyan,plan:C.cyan,future:C.cyan,backlog:C.cyan,investigate:C.cyan,explore:C.cyan,prototype:C.cyan};var Yd=[0,0,0],zr=.2,Vr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Ti=(e,t,n)=>Math.max(t,Math.min(n,e)),Kr=(e,t,n)=>e+(t-e)*n,wi=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Xd=e=>e.toLowerCase().trim(),Jd=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,s=e/60,c=i*(1-Math.abs(s%2-1)),u=0,m=0,g=0;s>=0&&s<1?(u=i,m=c):s>=1&&s<2?(u=c,m=i):s>=2&&s<3?(m=i,g=c):s>=3&&s<4?(m=c,g=i):s>=4&&s<5?(u=c,g=i):(u=i,g=c);let y=o-i/2;return[Math.round((u+y)*255),Math.round((m+y)*255),Math.round((g+y)*255)]},Mi=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Qd=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},Pi=(e,t,n)=>{let r=Ti(n,0,1);return[Math.round(Kr(e[0],t[0],r)),Math.round(Kr(e[1],t[1],r)),Math.round(Kr(e[2],t[2],r))]},Zd=(e,t=zr)=>Pi(e,Yd,t),ec=(e,t=zr)=>Mi(Zd(Qd(e),t)),tc=(e,t,n)=>Pi(e,t,n),Zt=e=>{let n=wi(e)%360,r=Jd(n,Vr.stringColor.saturation,Vr.stringColor.lightness);return Mi(r)},Ee=(e,t=vt)=>{let n=Xd(e);return n&&t[n]?t[n]:Zt(n)},ki=(e,t=vt,n=zr)=>ec(Ee(e,t),n),nc=e=>{let t=Vr.gradient.stops,n=Ti(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),s=o-i;return tc(t[i],t[i+1],s)},Bn=e=>wi(e.toLowerCase().trim())/4294967295,Li=e=>{let t=Bn(e);return nc(t)},rc=e=>{let[t,n,r]=Li(e);return{normal:o=>kt.bgRgb(t,n,r).black(o),cursor:o=>kt.bgRgb(t,n,r).white.bold(o)}},Gr=e=>{let[t,n,r]=Li(e);return{fg:o=>kt.rgb(t,n,r)(o),fgCursor:o=>kt.rgb(t,n,r).inverse(o),bg:o=>kt.bgRgb(t,n,r).black(o),bgCursor:o=>kt.bgRgb(t,n,r).white.bold(o)}},Un=e=>rc(e).normal(` ${e} `);import{decodeTime as Di}from"ulid";var Fi=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"},Bi=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())}`},On=e=>{try{return l("Decoded date",new Date(Di(e)))}catch(t){return a("Decoding failed + "+t.message)}},qr=e=>{if(!e?.id)return null;try{return Di(e.id)}catch{return null}};var ic=(e,t)=>e+" ".repeat(Math.max(0,t-Ui(e))),sc=(e,t)=>" ".repeat(Math.max(0,t-Ui(e)))+e,ac=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"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),dc=(e,t)=>t?e<t?"up":e>t?"down":null:null,cc=(e,t)=>{let n=b.getNode(e.payload.parent),r=n?xt.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let i=dc(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},lc=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?xt.bgHex(Ee(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?xt.bgHex(Ee(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?xt.hex(Ee(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?xt.hex(Ee(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""}},uc=e=>{let t=Fi(oc(e));return xt.gray(sc(t,8))},mc=12,pc=e=>ic(`${e}`,mc),Oi=(e,t)=>{let n=uc(e.id),r=pc(e.userName),o=xt.dim("\u203A"),i=e.action==="move.node"?cc(e,t):[ac(e.action),lc(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};import{decodeTime as gc,encodeTime as fc}from"ulid";var vc="0123456789ABCDEFGHJKMNPQRSTVWXYZ",xc=e=>{let t=2166136261;for(let o of e)t^=o.charCodeAt(0),t=Math.imul(t,16777619);let n=BigInt(t>>>0),r="";for(let o=0;o<16;o++)n=n*1103515245n+12345n&0xffffffffn,r+=vc[Number(n%32n)];return r},rt=(e,t)=>{let n=gc(e);return fc(n,10)+xc(`${e}:${t}`)};var yc=e=>rt(e,"description"),hc=e=>rt(e,"assignees"),Cc=e=>rt(e,"tags"),Nc=e=>rt(e,"history"),$i=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:i=!1,childRenderAxis:s="horizontal"})=>{let c=b.getNode(e);if(!c){b.createNode({...V.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:s});return}!tt(c)||!(c.title!==t||c.parentNodeId!==n||c.rank!==r||c.props.value!==o||c.readonly!==i||c.childRenderAxis!==s)||b.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:i,childRenderAxis:s})},Hi=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let s=b.getNode(e);if(!s){b.createNode({...V.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return}!Qt(s)||!(s.title!==t||s.parentNodeId!==n||s.rank!==r||s.readonly!==o||s.childRenderAxis!==i)||b.updateNode({...s,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:i})},Wi=e=>{let t=Re($e/4n),n=Re($e/2n),r=Re($e*3n/4n),o=Re($e);d(t)||d(n)||d(r)||d(o)||($i({id:yc(e.id),name:X.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"}),Hi({id:hc(e.id),name:X.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0}),Hi({id:Cc(e.id),name:X.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0}),$i({id:Nc(e.id),name:X.HISTORY,parentNodeId:e.id,rank:o.value,value:Ec(e),readonly:!0,childRenderAxis:"vertical"}))},Ec=e=>{let t=[...e.log].reverse(),n=new Map;for(let r of t){let o=n.get(r.action)??[];o.push(r.payload),n.set(r.action,o)}return t.map(r=>Oi(r,n.get(r.action)??[])).join(`
21
+ `)};var Sc=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[He,$n]=Sc;var k=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),_i=e=>{let t=b.getNode(e);!t||!H(t)||t.isDeleted||Wi(t)},bc=e=>{for(let t of e){_i(t);let n=v().nodes[t]?.parentNodeId;n&&_i(n)}},Ic=(e,t)=>{let n=b.getNode(e);n&&b.updateNode({...n,log:[...n.log??[],t]})},Rc=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},Ac=e=>{switch(e.action){case"delete.node":case"edit.description":return Rc(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":default:return[]}},Tc=e=>{Ne(t=>({...t,eventLog:[...t.eventLog,e]}))},wc=e=>{let t=e.userId,n=e.userName;if(!t?.length||!n?.length)return k("Invalid user ID format",e);let r=b.createContributor({id:t,name:n});return d(r)?k(r.message,e):null},Mc=(e,t)=>{let n=wc(e);if(n)return n;let r=[...new Set(Ac(e))];return t||(r.forEach(o=>Ic(o,e)),Tc(e)),bc(r),null},Pc={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=V.workspace(t,n,r),i=tn(o);if(d(i))return k(i.message,e);let s=b.createNode(o);return d(s)?k(s.message??"Failed to initialize workspace",e):Wr(s.value)?l("Workspace initialized",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=b.createNode(V.workspace(t,n,r));return d(o)?k(o.message??"Failed to add workspace",e):Wr(o.value)?l("Added workspace",{action:e.action,result:o.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=b.createNode(V.board(t,n,r,o));return d(i)?k(i.message??"Unable to create board",e):yi(i.value)?l("Added board",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=b.createNode(V.swimlane(t,n,r,o));return d(i)?k(i.message??"Unable to create swimlane",e):Mt(i.value)?l("Added swimlane",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=b.createNode(V.ticket(t,n,r,o));return d(i)?k(i.message??"Unable to create issue",e):H(i.value)?l("Added issue",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:i}=e.payload,s=b.createNode(V.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(X.DESCRIPTION)?"vertical":"horizontal"}));return d(s)?k(s.message??`Unable to create field: ${n}`,e):tt(s.value)?l("Added field",{action:e.action,result:s.value}):a("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!b.getNode(t))return k(`Unable to locate node with id ${t}`,e);let o=b.renameNode(t,n);return d(o)?k(o.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=b.tombstoneNode(t);return d(n)?k(n.message??"Unable to delete node",e):l("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=b.createTag({id:t,name:n});return d(r)?k(r.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=b.createContributor({id:t,name:n});return d(r)?k(r.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=b.tag(t,n);return d(r)?k(r.message??"Unable to tag issue",e):l("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=b.untag(t,n);return d(r)?k(r.message??"Unable to untag issue",e):l("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=b.assign(t,n);return d(r)?k(r.message??"Unable to assign issue",e):l("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=b.unassign(t,n);return d(r)?k(r.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?k(o.message??"Failed to move node",e):l("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=b.editValue(t,n);return d(r)?k(r.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=b.getNode(t);if(!o)return k("Unable to locate issue",e);if(!H(o))return k("Can only close issues",e);let i=b.getNode(He);if(!i)return k("Unable to locate target swimlane",e);if(n!==i.id)return k("Close target must be closed swimlane",e);let s=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(s)?k(s.message??"Unable to close issue",e):l("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=b.getNode(t);if(!o)return k("Unable to locate issue",e);if(!H(o))return k("Can only reopen issues",e);let i=b.getNode(He);if(!i)return k("Unable to locate closed swimlane",e);if(n===i.id)return k("Cannot reopen issue into closed swimlane",e);if(!b.getNode(n))return k("Reopen parent no longer exists",e);let c=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?k(c.message??"Unable to reopen issue",e):l("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=b.lockNode(t);return d(n)?k(n.message??"Unable to lock node",e):l("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=b.getNode(r);if(!i)return k(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return k(`Node ${r} is not child of ${t}`,e);let s=b.updateNode({...i,rank:o});if(d(s))return k(s.message??"Unable to rebalance child",e)}return l("Rebalanced children",{action:e.action,result:{parent:t}})}};function en(e,t=!1){let n=Pc[e.action](e);if(d(n))return n;let r=Mc(e,t);return r||n}var yt=e=>e.map(t=>en(t));import _c from"node:fs";import jc from"node:path";import{decodeTime as Kc,monotonicFactory as Vc}from"ulid";import{z as nn}from"zod";import Hn from"node:fs";import Xr from"node:path";import{decodeTime as kc}from"ulid";import{z as Yr}from"zod";var Lc=Yr.object({userId:Yr.string().min(1).default("unknown"),userName:Yr.string().min(1).default("unknown")}),Dc=e=>{let[t,n]=Xr.basename(e,".jsonl").split("."),r=Lc.safeParse({userId:t,userName:n});return r.success?l("Parsed event file actor",r.data):a(`Invalid event file name ${Xr.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Fc=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])},Bc=(e,t)=>t in e,Uc=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Oc=e=>{let{userId:t,userName:n,...r}=e,o=Fc(r);if(d(o))return a(o.message);let i=o.value,s=e.id?.[0];return s?Bc(r,i)?l("Decoded persisted event",Uc({id:s,action:i,payload:r[i],userId:t,userName:n})):a(`Persisted event is missing payload for action: ${i}`):a("Persisted event is missing id")},Jr=e=>{let t=[];for(let n of e){let r=Oc(n);if(d(r))return a(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${r.message}`);t.push(r.value)}return l("Decoded reconstructed events",t)},$c=e=>{if(!Hn.existsSync(e))return l("Event file missing",[]);let t=Dc(e);if(d(t))return a(t.message);let n=Hn.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
22
+ `)){let i=o.trim();if(!i)continue;let s;try{s=JSON.parse(i)}catch{return a(`Failed to parse event JSON from ${e}: ${i}`)}let c=Zr(s);if(d(c))return a(`${c.message} in ${e}: ${i}`);r.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return l("Parsed persisted events file",r)};function Qr(e){let t=Gt(e);if(!Hn.existsSync(t))return l("No events found",[]);let n=Hn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Xr.join(t,o)),r=[];for(let o of n){let i=$c(o);if(d(i))return a(i.message);r.push(...i.value)}return l("All events loaded",Hc(r))}function Lt(e){let t=Qr(e);return d(t)?a(t.message):Jr(t.value)}function ji(e,t){let n=Qr(e);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=Wc(n.value,t),i=Jr(r);if(d(i))return a(i.message);let s=Jr(o);return d(s)?a(s.message):l("Loaded merged events before time",{appliedEvents:i.value,unappliedEvents:s.value})}function Ki(e=process.cwd()){let t=Qr(e);return d(t)?a(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var Hc=e=>{let t=new Map,n=new Map;for(let m of e){let g=m.id[0],y=m.id[1]??null;t.set(g,m);let N=n.get(y)??[];N.push(m),n.set(y,N)}for(let m of n.values())m.sort((g,y)=>g.id[0].localeCompare(y.id[0]));let r=[],o=new Set,i=m=>{let g=m.id[0];if(o.has(g))return;r.push(m),o.add(g);let y=n.get(g)??[];for(let N of y)i(N)},s=n.get(null)??[];for(let m of s)i(m);let c=e.filter(m=>{let g=m.id[0],y=m.id[1]??null;return!o.has(g)&&y!==null&&!t.has(y)}).sort((m,g)=>m.id[0].localeCompare(g.id[0]));for(let m of c)i(m);let u=e.filter(m=>!o.has(m.id[0])).sort((m,g)=>m.id[0].localeCompare(g.id[0]));for(let m of u)i(m);return r},Wc=(e,t)=>{let n=new Set,r=[],o=[];for(let i of e){let s=i.id[0],c=i.id[1],u=!1;try{u=kc(s)<t}catch{u=!1}!u||c&&n.has(c)?(n.add(s),o.push(i)):r.push(i)}return{appliedEvents:r,unappliedEvents:o}};var Vi=e=>({action:e.action,payload:e.payload});var Gi=1,zi=Vc(),zc=nn.tuple([nn.string().min(1),nn.string().min(1).nullable()]),Gc=nn.looseObject({v:nn.literal(Gi),id:zc}),Zr=e=>{let t=Gc.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(", ")}`)},Wn=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",z=()=>{let{userName:e,userId:t}=U();return e?t?e.trim()?l("Successfully resolved actor ID",{userId:Wn(t),userName:Wn(e)}):a("Unable to resolve actor ID from settings or OS user info"):a("User ID not configured"):a("User name not configured")},rn=({userId:e,userName:t})=>`${Wn(e)}.${Wn(t)}.jsonl`,qc=(e,{userId:t,userName:n})=>{let r=rn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return a(`Invalid event log file name: ${r}`);let i=jc.join(Gt(e),r);return l("Successfully resolved event log path",i)},Yc=(e,t)=>{let n={[e.action]:e.payload,v:Gi,id:t};return Zr(n)};function _n({event:e,rootDir:t}){try{let n=qo(t);if(d(n))return n;let r=qc(t,{userId:e.userId,userName:e.userName});if(d(r))return r;let o=Ki(t);if(d(o))return a(o.message);let i=o.value?zi(Math.max(Date.now(),Kc(o.value)+1)):zi(),s=Yc(Vi(e),[i,o.value]);return d(s)?a(s.message):(_c.appendFileSync(r.value,`${JSON.stringify(s.value)}
23
+ `,"utf8"),l("Event persisted",{path:r.value,entry:s.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return a(`Failed to persist event: ${r}`)}}function Ae(e,t){let n=en(e);if(n.status!==qe.Success)return n;let r=_n({event:e,rootDir:t});return d(r)?r:n}function qi(e,t){return e.map(n=>Ae(n,t))}var Se=async e=>{let t=await Ie();return d(t)?t:Ae(e,t.value)};var Yi=e=>jn(O(e),{at:"end"}),jn=(e,t={at:"end"})=>{let n=r=>d(r)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(le(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(le(void 0,r.rank)):a("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(le(r.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let r=Xi(e,t.sibling);if(r<0)return a("Sibling not found");let o=r>0?e[r-1]:void 0,i=e[r];return i?n(le(o?.rank,i.rank)):a("Sibling not found")}case"after":{let r=Xi(e,t.sibling);if(r<0)return a("Sibling not found");let o=e[r],i=r<e.length-1?e[r+1]:void 0;return o?n(le(o.rank,i?.rank)):a("Sibling not found")}}},O=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Xi=(e,t)=>e.findIndex(n=>n.id===t),Ji=(e,t,n={at:"end"})=>jn(O(t).filter(r=>r.id!==e),n),eo=(e,t,n,r,o)=>{let i=Ji(t,e,n);if(d(i))return i;if(!i.value.needsRebalance)return l("Resolved rank",i.value.rank);let s=_r(e,r);if(d(s))return s;let c=Ae(s.value,o);if(d(c))return c;let u=Ji(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)},Kn=(e,t,n)=>{let r=Yi(e);if(d(r))return r;if(!r.value.needsRebalance)return l("Resolved rank",r.value.rank);let o=_r(e,t);if(d(o))return o;let i=Ae(o.value,n);if(d(i))return i;let s=Yi(e);return d(s)?s:s.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",s.value.rank)};var T={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=O(t.id)[n];!r||t.context==="FIELD"||T.navigate({contextNode:r,selectedIndex:B(r.id).length?0:-1})},enterParentNode(){let{contextNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=B(n.id),o=r.findIndex(({id:s})=>s===e.id),i=r.length===0?-1:o>=0?o:0;T.navigate({contextNode:n,selectedIndex:i})},navigateToNextItem:()=>Qi(1),navigateToPreviousItem:()=>Qi(-1),navigateToNextContainer:()=>Zi(1),navigateToPreviousContainer:()=>Zi(-1),navigate:({contextNode:e,selectedIndex:t})=>{S({contextNodeId:e.id,selectedIndex:t})}},Qi=e=>{let{selectedIndex:t,contextNode:n}=v(),r=B(n.id).length;if(r===0)return;let i=(Math.max(0,t)+e+r)%r;T.navigate({selectedIndex:i,contextNode:n})},Zi=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=B(o.id),s=i.findIndex(N=>N.id===t.id);if(s<0)return;let c=i.at(s+e)??i.at(0);if(!c)return;let u=B(c.id),m=Math.max(0,u.length-1),g=Math.min(Math.max(0,r),m),y=u.length?g:-1;T.navigate({contextNode:c,selectedIndex:y})};var ts=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),ns=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},Xc=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&tt(t)&&t.childRenderAxis==="vertical"},Vn=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=B(r.id);return T.navigate({contextNode:r,selectedIndex:ts(t,o.length)}),!0},rs=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Vn(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let s=O(o.id).findIndex(c=>c.id===n.id);return s>=0?(T.navigate({contextNode:o,selectedIndex:s}),!0):rs(o.id)},es=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),rs(n))return!0;n=t[n]?.parentNodeId}return!1},Jc=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},os=e=>{let{nodes:t,rootNodeId:n}=v();if(Xc(e.contextNodeId)&&Vn(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Jc(e.selectedNodeId)&&e.selectedNodeId&&es(e.selectedNodeId))return l("Restored navigation to selected node or ancestor",null);if(Vn(e.contextNodeId,e.selectedIndex))return l("Restored navigation to previous container",null);if(e.parentNodeId&&Vn(e.parentNodeId,e.selectedIndex))return l("Restored navigation to previous parent",null);if(es(e.contextNodeId))return l("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return a("Unable to restore navigation");let o=B(r.id);return T.navigate({contextNode:r,selectedIndex:ts(e.selectedIndex,o.length)}),l("Restored navigation to root",null)};import{monotonicFactory as Qc,ulid as We}from"ulid";var on=Qc();function Zc(){let e=ot();if(d(e))return a("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(i=>i.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[r]=B(n.id),[o]=r?B(r.id):[];if(o){let i=t.renderedChildrenIndex?.[o.id]??[];return l("Resolved boot nav target",{contextNode:o,selectedIndex:i.length>0?0:-1})}else return r?l("Resolved boot nav target",{contextNode:r,selectedIndex:0}):n?l("Resolved boot nav target",{contextNode:n,selectedIndex:0}):l("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function el(){let e=Zc();return d(e)?e:T.navigate(e.value)}function is({userId:e,userName:t}){let n=on(),r=on(),o=on(),i=on(),s=on(),c=le(void 0,void 0);if(d(c))return c;let u=le(void 0,void 0);if(d(u))return u;let m=le(u.value,void 0);if(d(m))return m;let g=le(void 0,void 0);if(d(g))return g;let y=le(g.value,void 0);if(d(y))return y;let N=le(y.value,void 0);if(d(N))return N;let E=le(void 0,void 0);return d(E)?E:l("Created default events",[{id:We(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:We(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:We(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:g.value}},{id:We(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:y.value}},{id:We(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"Done",parent:r,rank:N.value}},{id:We(),userId:e,userName:t,action:"add.board",payload:{id:$n,name:"Closed",parent:n,rank:m.value}},{id:We(),userId:e,userName:t,action:"add.swimlane",payload:{id:He,name:"Closed",parent:$n,rank:E.value}},{id:We(),userId:e,userName:t,action:"lock.node",payload:{id:$n}},{id:We(),userId:e,userName:t,action:"lock.node",payload:{id:He}}])}function zn(e){if(!e.length){let r=V.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=tn(r);return d(o)?o:(S({hasProjectDefinition:!1,mode:p.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!e.some(r=>r.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=yt(e).filter(d);return n.length>0?a(`Materializing failed:
24
+ ${n.map(r=>r.message).join(`
25
+ `)}`):(el(),S({hasProjectDefinition:!0}),l("State booted successfully",null))}var to=({status:e,msg:t})=>{Dt()&&S({syncStatus:{status:e,msg:t}})},ss=(e="Syncing...")=>{to({status:"syncing",msg:e})},as=(e="Synced")=>{to({status:"synced",msg:e})},tl=e=>{to({status:"failed",msg:e})},Pe=e=>(tl(e),a(e));var Ft=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),no=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)}},W=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);import Bt from"node:fs";import sn from"node:path";var cs=async e=>{if((await Te({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return l("Initial commit already exists",!1);ae.info("Creating initial commit");let n=await K.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?a(n.message):l("Created initial commit",!0)},ds=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",nl=async e=>{let t=await Mn(e);if(d(t))return a(t.message);let n=await ii(e);return d(n)?a(n.message):l("Built sync commit message",`[epiq:sync:${ds(t.value)}:${ds(n.value)}]`)},ro=async({repoRoot:e,stateBranchName:t})=>{ae.info(`Creating ${t}`);let n=await L({args:["commit-tree",li,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return a(`Failed to create state branch commit
26
+ ${n.message}`);let r=n.value.stdout.trim(),o=await L({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?a(`Failed to create ${t}
27
+ ${o.message}`):l("Created state branch",!0)},rl=async({repoRoot:e,stateBranchName:t})=>{let n=await Br({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
28
+ `+n.message);let r=n.value,o=r?await Tn({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(d(o))return a(`Ensure local state branch failed
29
+ `+o.message);let i=o.value;if(r&&i){let c=await K.fetch({cwd:e,remote:he,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
30
+ ${c.message}`)}let s=await wn({repoRoot:e,branch:t});if(d(s))return a(`Ensure local state branch failed
31
+ `+s.message);if(s.value)return l("Local state branch already exists",!1);if(i){let c=await L({args:["branch","--track",t,`${he}/${t}`],cwd:e});return d(c)?a(`Failed to create local ${t} from remote
32
+ ${c.message}`):l("Created local state branch from remote",!0)}return ro({repoRoot:e,stateBranchName:t})},ol=async({repoRoot:e,branch:t})=>{let n=await L({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=n.value.stdout.split(`
33
+ `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return l("Found worktree for branch",o)}return l("No worktree found for branch",null)},il=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Jt(sn.dirname(t));if(d(r))return a(`Failed to create state branch worktree
34
+ `+r.message);Bt.existsSync(t)&&!Bt.existsSync(sn.join(t,".git"))&&(ae.info("Removing broken state branch worktree path"),mi(t)),ae.info("Creating state branch worktree");let o=await K.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?a(`Failed to create state branch worktree
35
+ ${o.message}`):l("Created state branch worktree",!0)},oo=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await ol({repoRoot:e,branch:n});if(d(r))return a(r.message);let o=sn.resolve(t),i=r.value?sn.resolve(r.value):null;if(i&&i===o&&Bt.existsSync(i))return l("State branch already checked out in expected worktree",!1);if(i&&i!==o){ae.info("Moving state branch worktree to expected location");let u=await K.worktreeRemove({cwd:e,worktreeRoot:i});if(d(u))return a(`Failed to remove existing state branch worktree
36
+ ${u.message}`)}if(i&&!Bt.existsSync(i)){ae.info("Pruning stale state branch worktree");let u=await K.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
37
+ ${u.message}`)}let s=await oi({repoRoot:e,worktreeRoot:t});if(d(s))return a(s.message);let c=Bt.existsSync(t);if(s.value&&c)return l("State branch worktree already exists",!1);if(s.value&&!c){ae.info("Pruning missing registered state branch worktree");let u=await K.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
38
+ ${u.message}`)}return il({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},sl=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Mn(e);if(d(n))return a(n.message);if(n.value===t)return l("State branch already checked out",!1);(await Te({cwd:e,args:["rebase","--abort"]})).exitCode===0&&ae.info("Aborted stale state branch rebase");let o=await K.checkout({cwd:e,branch:t});return d(o)?a(`Failed to checkout ${t}
39
+ ${o.message}`):l("Checked out state branch",!0)},al=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Ur(t);if(d(n))return a(n.message);if(n.value)return l("State branch upstream already configured",!1);let r=await Br({repoRoot:t});if(d(r))return a(r.message);if(!r.value)return l("No remote available for state branch upstream",!1);let o=Tt(e);if(d(o))return o;let i=o.value,s=await Tn({repoRoot:t,branch:i});if(d(s))return a(s.message);if(!s.value)return l("Remote state branch missing; upstream will be configured on first push",!1);ae.info(`Configuring ${i} upstream`);let c=await K.fetch({cwd:t,remote:he,branch:i});if(d(c))return a(`Failed to fetch ${i}
40
+ ${c.message}`);let u=await K.setUpstream({cwd:t,branch:i,upstream:`${he}/${i}`});return d(u)?a(`Failed to set state branch upstream
41
+ ${u.message}`):l("Configured state branch upstream",!0)},Gn=async({stateBranchRoot:e,eventFileName:t})=>{let n=Hr(t),r=sn.join(e,n);if(!Bt.existsSync(r))return l("No event file to stage",void 0);let o=await K.stage({cwd:e,pathspec:[n]});return d(o)?a(`Failed to stage state branch event file
42
+ ${o.message}`):l("Staged state branch event file",void 0)},ls=async({repoRoot:e,stateBranchRoot:t})=>{let n=await nl(e);return d(n)?a(`Create state branch sync commit failed
43
+ `+n.message):wt({cwd:t,message:n.value})},an=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Ur(t);if(d(n))return a(n.message);let r=Tt(e);if(d(r))return r;let o=r.value,i=n.value?await K.push({cwd:t}):await K.push({cwd:t,remote:he,branch:o,setUpstream:!0});return d(i)?a(`Failed during state branch push
44
+ ${i.message}`):l("Pushed state branch",!0)},us=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Tt(e);if(d(o))return o;let i=o.value,s=[kn(),await rl({repoRoot:e,stateBranchName:i}),await oo({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await sl({stateBranchRoot:t,stateBranchName:i}),await gi(t),n?await al({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of s){if(d(c))return a(c.message);r=r||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{decodeTime as Jv}from"ulid";var dl=async({cwd:e,ensureUpstream:t})=>{logger.info("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=W("getRepoRootDir",await Je(e));if(d(n))return a(n.message);let r=n.value;logger.info("[sync] repo root",r);let o=W("getStateBranchRoot",Xe({repoRoot:r}));if(d(o))return a(o.message);let i=o.value;logger.info("[sync] state branch root",i);let s=W("ensureInitialCommit",await cs(r));if(d(s))return a(s.message);logger.info("[sync] initial commit result",{created:s.value}),logger.info("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:i,ensureUpstream:t});let c=W("bootstrapStateBranchStorage",await us({repoRoot:r,stateBranchRoot:i,ensureUpstream:t}));if(d(c))return a(c.message);logger.info("[sync] bootstrap result",{bootstrapped:c.value,stateBranchRoot:i}),logger.info("[sync] checking state branch git operation",{stateBranchRoot:i});let u=W("hasInProgressGitOperation(stateBranchRoot)",await An(i));if(d(u))return a(u.message);if(logger.info("[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.info("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:i});let m=W("ensureStateBranchLayout",pi(r,i));return d(m)?a(m.message):(logger.info("[sync] state branch layout ready"),logger.info("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:i,bootstrapped:c.value}),l("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:c.value}))},cl=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.info("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.info("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let r=W("stageStateBranchOwnEventFile",await Gn({stateBranchRoot:t,eventFileName:n}));if(d(r))return a(r.message);let o=W("hasStagedChanges(after stage)",await ai(t));if(d(o))return a(o.message);if(logger.info("[sync] state branch change check after stage result",{changed:o.value}),!o.value)return logger.info("[sync] no own event file changes to commit"),l("No own event file changes to commit",{createdCommit:!1});logger.info("[sync] creating sync commit");let i=W("createStateBranchSyncCommit",await ls({repoRoot:e,stateBranchRoot:t}));return d(i)?a(i.message):(logger.info("[sync] created sync commit",i.value),l("Committed own event file",{createdCommit:!0,commitSha:i.value}))},ll=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.info("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.info("[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.info("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),a("Own event file must end with .jsonl");ss("Syncing");let n=W("ensureSyncReady",await dl({cwd:e,ensureUpstream:!0}));if(d(n))return Pe(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value,s=W("isDetachedHead(stateBranchRoot)",await di(o));if(d(s))return Pe(s.message);if(logger.info("[sync] detached state branch check result",{detached:s.value}),s.value)return Pe("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,g=!1,y=W("getStateBranch",Tt(r));if(d(y))return Pe(y.message);let N=y.value;logger.info("[sync] resolved state branch",{stateBranch:N,stateBranchRoot:o});let E=W("commitOwnEventFileToStateBranch",await cl({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(E))return Pe(E.message);c=E.value.createdCommit,u=E.value.commitSha;let I=W("pullBranchRebaseIfPresent",await Or({cwd:o,branch:N}));if(d(I))return Pe(I.message);if(m=I.value,c||i){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:i,stateBranchRoot:o});let A=W("pushStateBranch",await an({stateBranchRoot:o,repoRoot:r}));if(d(A)&&si(A.message)){let R=W("pullBranchRebaseIfPresent(retry)",await Or({cwd:o,branch:N}));if(d(R))return Pe(R.message);m=m||R.value,A=W("pushStateBranch(retry)",await an({stateBranchRoot:o,repoRoot:r}))}if(d(A))return Pe(A.message);g=A.value}if(c){logger.info("[sync] resolving final sync commit sha",{stateBranchRoot:o});let A=W("git rev-parse HEAD",await L({args:["rev-parse","HEAD"],cwd:o}));if(d(A))return Pe(A.message);u=A.value.stdout.trim(),logger.info("[sync] final sync commit sha",u)}return as(g?"Synced and pushed":m||c?"Synced local state":"Already synced"),logger.info("[sync] syncEpiqWithRemote:done"),l("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,pulled:m,pushed:g,bootstrapped:i})},qn=async()=>{let e=ms();if(e)return e;logger.info("[sync] syncAndReloadState:start");let t=W("resolveActorId",z());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id"),a("Unable to resolve event log path");let n=rn(t.value);logger.info("[sync] resolved own event file name",{ownEventFileName:n});let r=W("syncEpiqWithRemote",await ll({ownEventFileName:n}));if(d(r))return logger.info("[sync] syncAndReloadState:sync failed",r.message),a(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.info("[sync] loading merged events after sync",{stateBranchRoot:o});let i=W("loadMergedEvents",Lt(o));if(d(i))return a(`Unable to load events. ${i.message}`);logger.info("[sync] loaded merged events after sync",{count:i.value.length});let s=ms();if(s)return s;let c=ns(),u=W("bootStateFromEventLog",zn(i.value));if(d(u))return a(`Unable to boot synced state. ${u.message}`);logger.info("[sync] booted state from synced events"),S({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}});let m=W("restoreNavigationAnchor",os(c));return d(m)?m:(logger.info("[sync] syncAndReloadState:done"),l("Synced",!0))},ms=()=>v().mode===p.DEFAULT?null:(S({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var Ut=3e3,ps=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Ut?null:t},gs=0,io,so=!1,dn=!1,ao=()=>{if(so)return!0;let e=ot();return d(e)?!1:e.value.syncStatus.status==="syncing"},ul=()=>{let e=U().autoSyncIntervalMs??1e4,t=Date.now()-gs;return Math.max(0,e-t)},fs=()=>{io||(io=setTimeout(async()=>{if(io=void 0,!!Dt()){if(ao()){dn=!0;return}dn=!1,await ml()}},ul()))},ml=async()=>{if(v().readOnly||v().timeMode==="peek")return a("Cannot auto-sync while peeking");if(!Dt())return a("Cannot auto-sync before state is initialized");if(ao())return dn=!0,a("Sync already in progress");so=!0,gs=Date.now(),S({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await qn()}finally{so=!1,dn&&fs()}},vs=()=>{Dt()&&(dn=!0,!ao()&&fs())};var pl=e=>e.props.tags??[],gl=e=>e.props.assignees??[],co=e=>pl(e).map(t=>b.getTag(t)).filter(t=>!!t),lo=e=>gl(e).map(t=>b.getContributor(t)).filter(t=>!!t),Yn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!H(n)?a("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",co(n))},Xn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!H(n)?a("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",lo(n))};var x={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",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",NONE:""};var fl=/^(\d+)(h|d|w|mo|y)$/,vl=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,xl=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let i=new Date(e,t-1,n,r,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===n&&i.getHours()===r&&i.getMinutes()===o},yl=(e,t=new Date)=>{let n=e.match(fl);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let s=new Date(t);switch(o){case"h":return s.setHours(s.getHours()-i),s;case"d":return s.setDate(s.getDate()-i),s;case"w":return s.setDate(s.getDate()-i*7),s;case"mo":return s.setMonth(s.getMonth()-i),s;case"y":return s.setFullYear(s.getFullYear()-i),s;default:return null}},hl=e=>{let t=e.match(vl);if(!t)return null;let[,n,r,o,i,s]=t,c=Number(n),u=Number(r),m=Number(o),g=i?Number(i):0,y=s?Number(s):0;return xl({year:c,month:u,day:m,hour:g,minute:y})?new Date(c,u-1,m,g,y):null},Jn=e=>{let t=e.trim().toLowerCase();return yl(t)??hl(t)},xs=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Cl=[{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}],ys=(e=Cl)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let i=r;i<=o;i++)t.push(`${i}${n}`);return t};var Nl=["BOARD","TICKET","SWIMLANE"],ne={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},it={TITLE:"title",DESCRIPTION:"description"},El=[ne.EDITOR,ne.VIEW,ne.USERNAME,ne.AUTOSYNC,ne.SYNC_DEBOUNCE_MS],Sl=[it.TITLE,it.DESCRIPTION],mo=[String(Ut),"5000","15000","30000","60000"],ht=[x.EXIT,x.SYNC,x.HELP,x.EXPORT,x.CONFIG],Qn=[x.NEW,x.EDIT,x.DELETE,x.MOVE],uo=[x.TAG,x.UNTAG,x.ASSIGN,x.UNASSIGN,x.CLOSE_ISSUE,x.RE_OPEN_ISSUE,x.EDIT],hs=[x.FILTER,x.PEEK],bl={WORKSPACE:[...ht,...Qn],BOARD:[...hs,...ht,...Qn],SWIMLANE:[...hs,...ht,...Qn],TICKET:[...ht,...Qn,...uo],FIELD:[...ht,...uo],FIELD_LIST:[...ht,...uo],TEXT:[...ht]},Il=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Rl=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=Ze();if(!r)return[x.HELP,x.CONFIG];if(!fi())return[x.HELP,x.INIT];if(t)return[x.HELP,x.PEEK,x.EXPORT,x.CONFIG];let o=e?.context,i=o&&Nl.includes(o);return[...new Set([...n,e].map(c=>c?.context).flatMap(c=>c?bl[c]:[]))].filter(c=>c===x.MOVE?!1:c===x.EDIT||c===x.DELETE?i:!0)},J=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=v())=>{let i=t.context??"WORKSPACE";return{[x.NONE]:Rl({breadCrumb:o,readOnly:r,selectedNode:n}),[x.EXIT]:["confirm"],[x.EXPORT]:[],[x.SYNC]:[],[x.INIT]:[],[x.HELP]:[],[x.PEEK]:[...ys(),"now","prev","next"],[x.EDIT]:[...Sl],[x.DELETE]:["confirm"],[x.RE_OPEN_ISSUE]:["confirm"],[x.CLOSE_ISSUE]:["confirm"],[x.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[x.FILTER]:["tag","assignee","description","title","clear"],[x.TAG]:[...new Set([...Object.keys(vt),...b.getExistingTags()])],[x.UNTAG]:[...Yn()?.value?.map(({name:c})=>c)??[]],[x.UNASSIGN]:[...Xn()?.value?.map(({name:c})=>c)??[]],[x.ASSIGN]:b.getExistingAssignees(),[x.NEW]:Il(i),[x.CONFIG]:[...El]}[e]??[]};import Ss from"chalk";var Cs=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import Ns from"chalk";var Q=e=>Ns.dim(e),ue=e=>Ns.hex(h.primary)(e),me=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let s=o.trim();if(s.length<i)return"";let g=[...t.filter(Boolean).filter(y=>y.startsWith(s))].sort((y,N)=>Bn(y)-Bn(N)).slice(0,r).map(y=>Un(y)).join(" ");return g?`${Q(e)}${g}${Q(n)}`:""};var Ct={None:"none",Invalid:"invalid",Valid:"valid"};var Al=["BOARD","TICKET","SWIMLANE"],Es=()=>{let e=v().selectedNode;return e?.context?Al.includes(e.context)?j():D({message:Q("Command not available in this context")}):D({message:Q("Missing target context")})},Z="<ENTER> to confirm",j=(e="",t=[])=>({message:Q(e),validity:Ct.Valid,completionWordList:t}),D=({message:e,completionWordList:t=[]})=>({validity:Ct.Invalid,message:e,completionWordList:t}),er=e=>e.length===0,Zn=e=>` ${Ss.dim.bgHex(ki(e))(` ${e} `)} `,po=({modifier:e})=>{let t="confirm";return e===t?j(Z):D({message:er(e)?Q("if you are certain, enter ")+Un(t):"",completionWordList:[t]})},Tl=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?D({message:Q(n)}):j():D({message:er(r)?t:"",completionWordList:[...e]}),cn=({hint:e})=>({modifier:t,inputString:n})=>er(t)&&er(n)?D({message:e,completionWordList:[]}):j(Z),wl=({modifier:e,inputString:t})=>{let n=J(x.CONFIG);if(!n.includes(e))return D({message:me({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ne.EDITOR:{let r=[...Cs];return t.trim()?r.includes(t.trim())?j(Z):D({message:me({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):D({message:me({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ne.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?j(Z):D({message:me({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ne.USERNAME:return t.trim()?j(Z):D({message:ue("Enter a user name. Saved in ")+Ss.bgBlack("~/.epiq-global/config.json")});case ne.AUTOSYNC:{let r=["yes","no"],o=U().autoSync;if(!r.includes(t.trim())){let i=vi(o);return D({message:me({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return j(Z)}case ne.SYNC_DEBOUNCE_MS:{let r=U().autoSyncIntervalMs,o=ps(t);if(!t.trim()||o===null||o<Ut){let i=me({prefix:" examples: ",wordList:mo,minLengthForHints:0,inputString:t});return D({message:ue(`provide duration above ${Ut}ms. current duration: ${r}ms.`)+i,completionWordList:mo})}return j(Z)}default:return D({message:ue("Unknown config option"),completionWordList:n})}},Ml=({modifier:e})=>{let t=J(x.EDIT);if(!t.includes(e)){let i=me({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return D({message:i||ue("Unknown edit option"),completionWordList:t})}let{breadCrumb:n,selectedNode:r}=v();if(!Ce([...n,r],"TICKET"))return D({message:ue("Command not available in this context")});switch(e){case it.TITLE:return j(Z);case it.DESCRIPTION:let{preferredEditor:i}=U();return i?j(Q("<ENTER> to edit in ")+i):D({message:"No editor selected"});default:return D({message:ue("Unknown edit option"),completionWordList:t})}},Pl={[x.EXPORT]:()=>j(Z+Q(", and create export markdown file")),[x.PEEK]:e=>{let t=e.modifier;if(t==="now")return j(Z);let n={message:Q("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return j(Z);let r=Jn(t);if(!t||!r)return D(n);let o=Ce(v().breadCrumb,"BOARD");if(d(o))return D({message:ue("Command is not applicable in this context")});let i=On(o.value.id);return d(i)?D({message:ue("Unable to peek: board id is not a valid ULID")}):xs({date:r,horizonDate:i.value})?j(Z):D({message:ue(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[x.EXIT]:()=>j(Z+Q(" and exit the application")),[x.INIT]:()=>j(Z),[x.PALETTE]:()=>j(Z),[x.FILTER]:e=>{if(e.modifier==="clear")return j();let t=i=>J(x.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return D({message:me({wordList:J(x.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:J(x.FILTER)});let n=Object.values(v().tags).map(i=>i.name),r=Object.values(v().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?D({message:me({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):j():D({message:me({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[x.NONE]:e=>{let t=J(x.NONE);return D({message:me({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[x.NEW]:e=>Tl({list:J(x.NEW),hint:me({wordList:J(x.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[x.HELP]:()=>j(Z),[x.EDIT]:Ml,[x.CONFIG]:wl,[x.DELETE]:e=>{let t=Es();return t.validity==="invalid"?t:po(e)},[x.CLOSE_ISSUE]:e=>po(e),[x.RE_OPEN_ISSUE]:e=>po(e),[x.MOVE]:e=>{let t=Es();return t.validity==="invalid"?t:cn({hint:me({prefix:"hey hacker! These commands are blocked for you... ",wordList:J(x.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[x.TAG]:e=>{let n=b.getExistingTags().slice(0,10).map(Zn).join("");return cn({hint:n.length?Q("create tag or reuse:")+n+Q(""):Q("create tag ...")})(e)},[x.UNTAG]:e=>{let t=Yn();if(d(t))return D({message:ue("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Zn).slice(0,10);return n.length?cn({hint:Q(" ... ")+n.join("")})(e):D({message:ue("Issue has no tags"),completionWordList:[]})},[x.ASSIGN]:e=>{let t=b.getExistingAssignees().map(Zn).slice(0,10);return cn({hint:Q("assignees... ")+t.join("")})(e)},[x.UNASSIGN]:e=>{let t=Xn();if(d(t))return D({message:ue("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Zn).slice(0,10);return n.length?cn({hint:Q("remove assignee... ")+n.join("")})(e):D({message:ue("Issue has no assignees"),completionWordList:[]})},[x.SYNC]:()=>j(Z)},bs=Object.fromEntries(Object.entries(Pl).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Is=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var Rs=e=>Object.values(x).includes(e),As=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:s,validity:c,completionWordList:u}=bs[n].validate(n,r,i),m=o==="command"||o==="modifier"?J(n):Is,{mode:g}=v(),y=g===p.COMMAND_LINE?s??"":"",N=[...u,...m];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:y,autoCompletion:t?Ii(e,N):{hint:"",hints:[],remainder:"",overlap:0}}};var Ts=e=>{let t=e.trimStart(),n=Ll(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),s=Dl(e),c=Rs(r)?r:null,u=c!==null,m=r!=="",g=c?J(c)??[]:[],y=c&&g.includes(o)?o:"",N="word";n.length===0||n.length===1&&!i?N="command":(n.length===1&&i||n.length===2&&!i)&&(N="modifier");let E=i?"":s,I=kl(t,c,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:s,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:i,modifier:y,target:N,inputToMatch:E,inputString:I}},kl=(e,t,n)=>{let r=e;return t&&r.startsWith(t)&&(r=r.slice(t.length)),r=r.replace(/^\s+/,""),n&&r.startsWith(n)&&(r=r.slice(n.length),r=r.replace(/^\s+/,"")),r},Ll=e=>e.trim()?e.trim().split(/\s+/):[],Dl=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Fl}from"react";var Ot=e=>e===go||e===":",go=" ",se={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ct.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},fo=new Set,ws=()=>{for(let e of fo)e()},vo=e=>(fo.add(e),()=>fo.delete(e)),_e=e=>{let n=e(se),r=Ts(n.value),o=n.cursorPosition===n.value.length;se={...n,commandMeta:As(r,o)},ws()},ln=({message:e,status:t})=>{let n=structuredClone(se);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,se=n,ws(),l(e,null)},xo=e=>{_e(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},yo=e=>{_e(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Ot(n[o-1]);)o--;for(;o>0&&!Ot(n[o-1]);)o--}else{for(;o<n.length&&!Ot(n[o]);)o++;for(;o<n.length&&Ot(n[o]);)o++}return{...t,cursorPosition:o}})},Ms=()=>{_e(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}})},Ps=()=>{_e(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Ot(t[r-1]);)r--;for(;r>0&&!Ot(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},F=e=>{_e(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),s=i+o,c=Math.max(0,Math.min(i.length,s.length));return{...t,value:s,cursorPosition:c,commandIsPending:!1}})},ks=()=>{_e(e=>({...e,commandIsPending:!0}))},Ls=({addToHistory:e=!0})=>{_e(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Bl()},Ds=()=>{_e(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}})},Fs=()=>{_e(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Bl=()=>F(()=>""),G=()=>se,Bs=()=>Fl(vo,G,G),Us=()=>{let[e,...t]=se.value.split(go);return t.join(go).trim()};var Os=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",$s=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Hs=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Ws=(e,t)=>{if($s(e,e.sequence))return f.MoveCursorLeftOfWord;if(Hs(e,e.sequence))return f.MoveCursorRightOfWord;if(Os(e,e.sequence))return f.EraseInputWord;switch(e.name){case"tab":return f.AutoCompleteCommand;case"up":return f.GetLastCommandFromHistory;case"down":return f.GetNextCommandFromHistory;case"left":return f.MoveCursorLeft;case"right":return f.MoveCursorRight;case"return":return f.Confirm;case"backspace":return t?f.EraseInput:f.ExitCommandLine;case"escape":return f.ExitCommandLine;default:return f.CaptureInput}},_s=(e,t)=>{if($s(e,e.sequence))return f.MoveCursorLeftOfWord;if(Hs(e,e.sequence))return f.MoveCursorRightOfWord;if(Os(e,e.sequence))return f.EraseInputWord;switch(e.name){case"tab":return f.AutoCompleteCommand;case"up":return f.NavPreviousItem;case"down":return f.NavNextItem;case"left":return f.MoveCursorLeft;case"right":return f.MoveCursorRight;case"return":return f.Confirm;case"backspace":return t?f.EraseInput:f.ExitCommandLine;case"escape":return f.ExitCommandLine;default:return f.CaptureInput}};var f={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 Ul(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function Ol(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function $l(e,t,n){let r=v().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function js(e,t){let n=G();if(e.sequence==="?"&&t!==p.PALETTE)return f.InitCommandPalette;if(e.sequence===":"&&t!==p.COMMAND_LINE)return f.InitCommandLine;if(t===p.MOVE)switch(e.name){case"m":case"return":return f.ConfirmMove}if(t===p.COMMAND_LINE)return Ws(e,n.value);if(t===p.PALETTE)return _s(e,n.value);let r=Ul(e)||Ol(e);if(r)return Hl(r,t);if(e.ctrl&&e.name==="c")return f.Exit;switch(e.name){case"r":return f.EditTitle;case"e":return f.EditDescription;case"n":return f.AddItem;case"m":return f.InitMove;case"d":return f.Delete;case"return":return f.Confirm;case"space":return f.Confirm;case"v":return U().viewMode==="wide"?f.SetViewDense:f.SetViewWide;case"q":case"escape":return f.Exit;default:return null}}function Hl(e,t){let n=t===p.MOVE?{prevItem:f.MovePreviousItem,nextItem:f.MoveNextItem,prevContainer:f.MoveToPreviousContainer,nextContainer:f.MoveToNextContainer}:{prevItem:f.NavPreviousItem,nextItem:f.NavNextItem,prevContainer:f.NavToPreviousContainer,nextContainer:f.NavToNextContainer};return $l(v().contextNode.childRenderAxis,e,n)}var tr=e=>{let{context:t}=v().contextNode;if(!t)return P.None;switch(e){case x.EXIT:return P.Exit;case x.EXPORT:return P.Export;case x.INIT:return P.Init;case x.DELETE:return P.Delete;case x.EDIT:return P.Edit;case x.HELP:return P.ViewHelp;case x.RE_OPEN_ISSUE:return P.ReopenIssue;case x.CLOSE_ISSUE:return P.CloseIssue;case x.TAG:return P.TagTicket;case x.UNTAG:return P.UntagTicket;case x.ASSIGN:return P.AssignUserToTicket;case x.UNASSIGN:return P.UnassignUserFromTicket;case x.NEW:return P.NewItem;case x.FILTER:return P.Filter;case x.MOVE:return P.Move;case x.PEEK:return P.Peek;case x.CONFIG:return P.Config;case x.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",Sync:"sync",Export:"export"};import{ulid as ge}from"ulid";import ea from"node:fs";import du from"node:path";import cu from"react";import{Box as su}from"ink";import sr from"react";import{Box as No,Text as Ql}from"ink";import ke from"react";import{Text as Ks}from"ink";import Vs,{useEffect as zs,useState as Wl}from"react";var Gs={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},pe=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=ee(),r=Gs[n]??Gs.default,[o,i]=Wl(0);if(zs(()=>{i(0)},[r]),zs(()=>{if(!e)return;let c=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return Vs.createElement(Ks,null,t);let s=r[o]??r[0]??t;return Vs.createElement(Ks,{color:h.accent,dimColor:o===1},s)};import{Box as ho,Text as _l}from"ink";import nr from"react";var st=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),s=Math.max(1,Math.ceil(r)),c=Math.max(1,Math.floor(i/s)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-c),g=o?Math.min(m,Math.max(0,u-c+1)):Math.min(m,Math.floor(u/c)*c),y=g+c,N=e.slice(g,y),E=e.length>c,I=i,A=E?Math.max(1,Math.floor(c/e.length*I)):I,R=Math.max(0,I-A),M=Math.max(1,e.length-c),$=E?Math.floor(g/M*R):0;return nr.createElement(ho,{flexDirection:"row",height:i,width:"100%"},nr.createElement(ho,{flexDirection:"column",flexGrow:1,height:i},N),nr.createElement(ho,{flexDirection:"column",width:1,height:I},Array.from({length:I}).map((Be,be)=>nr.createElement(_l,{key:be,color:E&&be>=$&&be<$+A?h.accent:h.secondary},E?"\u2502":" "))))};import{Box as rr,Text as Yl}from"ink";import Nt from"react";import{Text as jl}from"ink";import Kl from"react";var Vl=e=>e.toLowerCase().trim(),zl=(e,t=vt)=>{let n=Vl(e);return t[n]?t[n]:Zt(n)},$t=({id:e,isSelected:t})=>{let n=b.getContributor(e);if(n)return Kl.createElement(jl,{underline:t,color:zl(n.name)},"@"+n.name)};import{Text as Gl}from"ink";import ql from"react";var Ht=({id:e,isSelected:t})=>{let n=b.getTag(e);if(n)return ql.createElement(Gl,{underline:t,backgroundColor:Ee(n.name),color:h.primary}," "+n.name+" ")};var qs=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Fn(hi(t.title),r),i=co(t),s=lo(t);return Nt.createElement(rr,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?h.accent:h.secondary,justifyContent:"space-between"},Nt.createElement(rr,{borderBottom:!0},Nt.createElement(rr,{paddingLeft:1,flexDirection:"column"},Nt.createElement(Yl,{color:h.primary},o))),Nt.createElement(rr,{flexDirection:"row",paddingLeft:1},i.map(c=>Nt.createElement(Ht,{key:c.id,id:c.id})),s.map(c=>Nt.createElement($t,{key:c.id,id:c.id}))))};import Xl from"chalk";import{Box as un,Text as Co}from"ink";import je from"react";var Jl=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ys=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(E=>b.getTag(E)).filter(E=>!!E),s=(t.props.assignees??[]).map(E=>b.getContributor(E)).filter(E=>!!E),c=1,u=i.length*(1+c),m=s.length*(2+c),g=i.map(E=>je.createElement(un,{key:E.id,paddingRight:c},je.createElement(Co,{color:Ee(E.name)},"\u25A0"))),y=s.map(E=>je.createElement(un,{key:E.id,paddingRight:c},je.createElement(Co,{color:Zt(E.name)},"@"+E.name.at(0)))),N=n?h.accent:o===p.MOVE?h.secondary:h.primary;return je.createElement(un,{borderBottom:!0,justifyContent:"space-between"},je.createElement(un,null,je.createElement(pe,{isSelected:n,placeholder:Xl.dim.gray(r+1+" ")}),je.createElement(Co,{wrap:"truncate",color:N},Jl(t.title,e-u-m-14))),je.createElement(un,null,g,y))};import Zl from"chalk";var eu=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:s,mode:c})=>{let{renderedChildrenIndex:u}=ee(),m=u[e.id]??[],g=`${e.title} ${Zl.hex(h.secondary2).dim("("+m.length+")")}`,y=3,N=o?1:4,E=r-y-(o?2:1),I=ke.createElement(No,{borderStyle:"round",borderColor:h.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},ke.createElement(pe,{isSelected:t}),ke.createElement(Ql,{bold:!0,color:t?h.accent:h.primary},g," ",e.readonly?"\u{1F512}":"")),A=(R,M)=>{let $=i&&s===M;return o?ke.createElement(Ys,{key:R.id,index:M,width:n,ticket:R,isSelected:$,mode:c}):ke.createElement(qs,{key:R.id,width:n,ticket:R,isSelected:$})};return ke.createElement(No,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?h.accent:h.secondary,paddingRight:1,paddingLeft:1,height:r},I,ke.createElement(No,{padding:o?1:0},m.length>0&&ke.createElement(st,{selectedIndex:s,height:E,itemHeight:N},m.map(A)),ke.createElement(pe,{isSelected:i&&s===-1})))},Xs=ke.memo(eu);import{Box as bo,Text as ru}from"ink";import at,{useMemo as Qs}from"react";import{Box as or,Text as tu}from"ink";import Ke from"react";var Js=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=ee(),{title:o}=t,i=t.parentNodeId?b.getNode(t.parentNodeId):void 0,s=i&&H(i)?o===X.ASSIGNEES?i.props.assignees??[]:o===X.TAGS?i.props.tags??[]:[]:[];return Ke.createElement(or,{alignItems:"center",paddingTop:1},Ke.createElement(or,{minWidth:12},Ke.createElement(pe,{isSelected:n}),Ke.createElement(tu,{color:n?h.accent:h.secondary2},o,":")),Ke.createElement(or,{flexDirection:"row",marginLeft:1,paddingRight:1},s.map((c,u)=>{let m=r.id===t.id&&u===e;return Ke.createElement(or,{key:`${o}-${c}`,paddingRight:2,minHeight:1},Ke.createElement(pe,{isSelected:m}),o===X.ASSIGNEES?Ke.createElement($t,{isSelected:m,id:c}):o===X.TAGS?Ke.createElement(Ht,{isSelected:m,id:c}):null)})))};import{Box as ir,Text as Eo}from"ink";import Ve,{useEffect as nu}from"react";var So=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:s,contextNode:c}=ee(),u=N=>String(N).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];nu(()=>{let N=[];return m.forEach((E,I)=>{let A=Re(BigInt(I+1));if(!Y(A))return;let R=V.text({id:`${e}-${I}`,name:`Line ${I+1}`,parentNodeId:e,rank:A.value,props:{value:E},readonly:!0,isVirtual:!0}),M=b.createNode(R);Y(M)&&N.push(M.value.id)}),()=>N.forEach(b.deleteNode)},[e,n]);let g="\u2029",y=m.map((N,E)=>{let I=c.id===e&&s===E;return Ve.createElement(ir,{key:`${e}-${E}`},Ve.createElement(Eo,{color:I?h.primary:h.secondary2,dimColor:!I},`${E+1} `.padStart(5,"\xA0")),Ve.createElement(Eo,{backgroundColor:I?"gray":""},u(N.length?Fn(N,i-10):g)))});return Ve.createElement(ir,{flexDirection:"column",paddingTop:1},Ve.createElement(ir,null,Ve.createElement(pe,{isSelected:o}),Ve.createElement(Eo,{color:o?h.accent:h.secondary2},t)),Ve.createElement(ir,{flexDirection:"row",borderStyle:"round",borderColor:h.secondary,paddingLeft:1,marginLeft:1},Ve.createElement(st,{scrollByOne:!0,children:y,height:r-2,selectedIndex:s,itemHeight:1})))};var ou=e=>rt(e,"description"),iu=e=>rt(e,"history"),Zs=({ticket:e,height:t})=>{let{selectedIndex:n,contextNode:r}=ee(),o=process.stdout.columns||120,i=Qs(()=>ou(e.id),[e.id]),s=Qs(()=>iu(e.id),[e.id]),c=r.id===e.id,u=r.id===s||r.parentNodeId===s,m=B(e.id);if(u){let R=b.getNode(s),M=R&&tt(R)?R.props.value??"":"",Be=t-3;return at.createElement(bo,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},R?at.createElement(So,{id:R.id,label:"Event log",text:M,selected:!1,maxWidth:o,height:Be}):null)}let g=m.reduce((R,M)=>Qt(M)||M.id===s?R+1:R,0),y=2,N=3,E=g,I=t-N-E-y,A=(R,M)=>R.id===i?at.createElement(So,{key:R.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:M,maxWidth:o,height:I}):Qt(R)?at.createElement(Js,{key:R.id,parent:R,selected:M,selectedIndex:n}):R.id===s?at.createElement(bo,{key:R.id,paddingTop:1},at.createElement(pe,{isSelected:M}),at.createElement(ru,{backgroundColor:h.secondary,color:M?h.accent:h.primary}," History \u203A\u203A ")):null;return at.createElement(bo,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((R,M)=>A(R,c&&n===M)))};var au=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:s,width:c})=>{let u=t.context,m=u===w.TICKET||u===w.FIELD_LIST||u===w.FIELD,g=u===w.BOARD||u===w.SWIMLANE,y=u===w.TICKET?t:r.find(R=>R.context===w.TICKET),N=Math.floor(c/3),E=Math.floor(c/Math.max(e.length,1)),I=Math.min(E,N),A=i==="dense";return sr.createElement(su,{flexDirection:"row",height:s},g&&e.map((R,M)=>{let $=t.id===R.id,Be=$?n:-1,be=t.context===w.BOARD&&n===M;return sr.createElement(Xs,{key:R.id,height:s,width:I,swimlane:R,isSelected:be,isDense:A,isFocused:$,listSelectedIndex:Be,mode:o})}),m&&y&&sr.createElement(Zs,{height:s,ticket:y}))},ar=sr.memo(au);import{render as lu}from"ink";import{Writable as uu}from"node:stream";var mn=e=>String(e).padStart(2,"0"),mu=e=>{let t=e.getUTCFullYear(),n=mn(e.getUTCMonth()+1),r=mn(e.getUTCDate()),o=mn(e.getUTCHours()),i=mn(e.getUTCMinutes()),s=mn(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${s}`},pu=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",gu=async(e,{width:t,height:n})=>{let r="",o=new uu({write(s,c,u){let m=fu(s.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=lu(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(s=>setTimeout(s,0)),i.unmount(),r},fu=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),ta=async()=>{let{viewMode:e}=U(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=v(),s=r.find(M=>M.context==="BOARD");if(!s)return a("No board found to export");let c=120,u=40,m=await gu(cu.createElement(ar,{height:u,width:c,swimlanes:(i[s.id]??[]).filter(M=>M!==void 0&&Mt(M)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:u});if(!m)return a("Failed to render board export");let g=bn(process.cwd());if(d(g))return a("Unable to export, epiq root not found");let y=new Date,N=mu(y),E=`board_${pu(s.title)}_${N}.md`,I=Go(g.value);ea.mkdirSync(I,{recursive:!0});let A=du.join(I,E),R=`# Board - ${s.title}
23
45
  Date: ${y.toISOString()}
24
46
 
25
47
  \`\`\`text
26
48
  ${m}
27
49
  \`\`\`
28
- `;return Fs.writeFileSync(w,R,"utf8"),l("Exported board layout",w)};var A={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=$(t.id)[n];!r||t.context==="FIELD"||A.navigate({contextNode:r,selectedIndex:U(r.id).length?0:-1})},enterParentNode(){let{contextNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=U(n.id),o=r.findIndex(({id:s})=>s===e.id),i=r.length===0?-1:o>=0?o:0;A.navigate({contextNode:n,selectedIndex:i})},navigateToNextItem:()=>Os(1),navigateToPreviousItem:()=>Os(-1),navigateToNextContainer:()=>Us(1),navigateToPreviousContainer:()=>Us(-1),navigate:({contextNode:e,selectedIndex:t})=>{S({contextNodeId:e.id,selectedIndex:t})}},Os=e=>{let{selectedIndex:t,contextNode:n}=v(),r=U(n.id).length;if(r===0)return;let i=(Math.max(0,t)+e+r)%r;A.navigate({selectedIndex:i,contextNode:n})},Us=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=U(o.id),s=i.findIndex(N=>N.id===t.id);if(s<0)return;let c=i.at(s+e)??i.at(0);if(!c)return;let u=U(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),y=u.length?p:-1;A.navigate({contextNode:c,selectedIndex:y})};import Dl from"node:os";import _s from"node:path";import{z as It}from"zod";import{accessSync as Al,copyFileSync as Tl,existsSync as rr,mkdirSync as $s,readdirSync as Hs,readFileSync as wl,renameSync as Ml,rmSync as Pl,statSync as Ws,unlinkSync as kl,writeFileSync as Ll}from"node:fs";import jt from"node:path";var Ce={writeToFile:(e,t)=>{try{let n=jt.dirname(e);rr(n)||$s(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Ll(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return wl(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Ce.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 rr(e)&&Ws(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Al(e),!0}catch{return!1}},mkDir:e=>$s(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=jt.parse(t);for(;;){let r=jt.join(t,e);try{if(rr(r)&&Ws(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=jt.dirname(t)}return null},readFirstJSON(e){try{if(!Ce.dirExists(e))return null;let t=Hs(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=jt.join(e,t);return Ce.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Ce.dirExists(e)?Hs(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{kl(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Pl(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(jt.dirname(t)),!n?.overwrite&&rr(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ml(e,t)}catch(r){if(r?.code==="EXDEV"){Tl(e,t),this.rmFile(e);return}throw r}}};var Fl={userId:"",userName:"",preferredEditor:"",autoSync:!1},js=It.object({preferredEditor:It.string().optional(),userName:It.string().optional(),userId:It.string().optional(),autoSync:It.boolean().nullable().optional(),autoSyncDebounceMs:It.number().optional(),viewMode:It.enum(["dense","wide"]).optional()}),Bl="config.json",Ks=()=>_s.join(Dl.homedir(),Se),yo=()=>_s.join(Ks(),Bl),ho=()=>{try{return Ce.mkDir(Ks()),l(`Ensured ~/${Se} exists`,null)}catch{return a(`Unable to create ~/${Se}`)}},Ol=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${Se}/config.json JSON`)}let n=js.safeParse(t??{});return n.success?l("Parsed config",n.data):a(`Invalid ~/${Se}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Vs=()=>{let e=ho();if(d(e))return a(e.message);let t=yo(),n=Ce.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Ol(n)},zs=e=>{let t=ho();if(d(t))return a(t.message);let n=js.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=yo();try{return Ce.writeToFile(r,JSON.stringify(n.data,null,2)+`
29
- `),l("Config written",null)}catch{return a(`Unable to write ~/${Se}/config.json`)}},Rt=e=>{let t=Vs();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return zs(n)},Gs=()=>{let e=yo(),t=ho();if(d(t))return a(`Unable to create ~/${Se}`);if(!(Ce.readFile(e)!==null)){let m=zs(Fl);if(d(m))throw new Error(`Unable to create ~/${Se}/config.json`)}let r=Vs();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:s,autoSync:c,autoSyncDebounceMs:u}=r.value;return!i||!s?a(`User name or ID not configured in ~/${Se}/config.json`):l("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:s,autoSync:c??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"})};import ql from"node:fs";import Yl from"node:path";import{decodeTime as Xl,monotonicFactory as Jl}from"ulid";import{z as un}from"zod";import or from"node:fs";import No from"node:path";import{decodeTime as Ul}from"ulid";import{z as Co}from"zod";var $l=Co.object({userId:Co.string().min(1).default("unknown"),userName:Co.string().min(1).default("unknown")}),Hl=e=>{let[t,n]=No.basename(e,".jsonl").split("."),r=$l.safeParse({userId:t,userName:n});return r.success?l("Parsed event file actor",r.data):a(`Invalid event file name ${No.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Wl=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])},_l=(e,t)=>t in e,jl=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Kl=e=>{let{userId:t,userName:n,...r}=e,o=Wl(r);if(d(o))return a(o.message);let i=o.value,s=e.id?.[0];return s?_l(r,i)?l("Decoded persisted event",jl({id:s,action:i,payload:r[i],userId:t,userName:n})):a(`Persisted event is missing payload for action: ${i}`):a("Persisted event is missing id")},Eo=e=>{let t=[];for(let n of e){let r=Kl(n);if(d(r))return a(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${r.message}`);t.push(r.value)}return l("Decoded reconstructed events",t)},Vl=e=>{if(!or.existsSync(e))return l("Event file missing",[]);let t=Hl(e);if(d(t))return a(t.message);let n=or.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
30
- `)){let i=o.trim();if(!i)continue;let s;try{s=JSON.parse(i)}catch{return a(`Failed to parse event JSON from ${e}: ${i}`)}let c=bo(s);if(d(c))return a(`${c.message} in ${e}: ${i}`);r.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return l("Parsed persisted events file",r)};function So(e){let t=Jt(e);if(!or.existsSync(t))return l("No events found",[]);let n=or.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>No.join(t,o)),r=[];for(let o of n){let i=Vl(o);if(d(i))return a(i.message);r.push(...i.value)}return l("All events loaded",zl(r))}function Kt(e){let t=So(e);return d(t)?a(t.message):Eo(t.value)}function qs(e,t){let n=So(e);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=Gl(n.value,t),i=Eo(r);if(d(i))return a(i.message);let s=Eo(o);return d(s)?a(s.message):l("Loaded merged events before time",{appliedEvents:i.value,unappliedEvents:s.value})}function Ys(e=process.cwd()){let t=So(e);return d(t)?a(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var zl=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],y=m.id[1]??null;t.set(p,m);let N=n.get(y)??[];N.push(m),n.set(y,N)}for(let m of n.values())m.sort((p,y)=>p.id[0].localeCompare(y.id[0]));let r=[],o=new Set,i=m=>{let p=m.id[0];if(o.has(p))return;r.push(m),o.add(p);let y=n.get(p)??[];for(let N of y)i(N)},s=n.get(null)??[];for(let m of s)i(m);let c=e.filter(m=>{let p=m.id[0],y=m.id[1]??null;return!o.has(p)&&y!==null&&!t.has(y)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of c)i(m);let u=e.filter(m=>!o.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)i(m);return r},Gl=(e,t)=>{let n=new Set,r=[],o=[];for(let i of e){let s=i.id[0],c=i.id[1],u=!1;try{u=Ul(s)<t}catch{u=!1}!u||c&&n.has(c)?(n.add(s),o.push(i)):r.push(i)}return{appliedEvents:r,unappliedEvents:o}};var Xs=e=>({action:e.action,payload:e.payload});var Qs=1,Js=Jl(),Ql=un.tuple([un.string().min(1),un.string().min(1).nullable()]),Zl=un.looseObject({v:un.literal(Qs),id:Ql}),bo=e=>{let t=Zl.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(", ")}`)},ir=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",G=()=>{let{userName:e,userId:t}=H();return e?t?e.trim()?l("Successfully resolved actor ID",{userId:ir(t),userName:ir(e)}):a("Unable to resolve actor ID from settings or OS user info"):a("User ID not configured"):a("User name not configured")},mn=({userId:e,userName:t})=>`${ir(e)}.${ir(t)}.jsonl`,eu=(e,{userId:t,userName:n})=>{let r=mn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return a(`Invalid event log file name: ${r}`);let i=Yl.join(Jt(e),r);return l("Successfully resolved event log path",i)},tu=(e,t)=>{let n={[e.action]:e.payload,v:Qs,id:t};return bo(n)};function sr({event:e,rootDir:t}){try{let n=ri(t);if(d(n))return n;let r=eu(t,{userId:e.userId,userName:e.userName});if(d(r))return r;let o=Ys(t);if(d(o))return a(o.message);let i=o.value?Js(Math.max(Date.now(),Xl(o.value)+1)):Js(),s=tu(Xs(e),[i,o.value]);return d(s)?a(s.message):(ql.appendFileSync(r.value,`${JSON.stringify(s.value)}
31
- `,"utf8"),l("Event persisted",{path:r.value,entry:s.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return a(`Failed to persist event: ${r}`)}}var Zs=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id)return r.payload.parent}return null};var nu=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ge,ar]=nu;import{ulid as du}from"ulid";import{spawnSync as ru}from"node:child_process";import ou from"node:os";import ea from"node:path";import{ulid as iu}from"ulid";function su(){let{preferredEditor:e}=H(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function au(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function ta(e){let t=ea.join(ou.tmpdir(),"epiq");Ce.mkDir(t);let n=ea.join(t,iu());Ce.writeToFile(n,e??"");let r=su();for(let o of r){let i=au(o,n),s=ru(i,{stdio:"inherit",shell:!0});if(!s.error&&s.status===0){let c=Ce.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 na=async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let t=await Me();if(d(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=v(),i=Ie([...r,o],"TICKET");if(d(i))return a("Edit target must be an issue");let s=i.value;if(!W(s))return a("Edit target must be an issue");if(s.readonly)return a("Cannot edit readonly issue");let c=U(s.id).find(y=>y.title===J.DESCRIPTION);if(!c)return a("No target found");if(c.readonly)return a("Cannot edit readonly field");let u=s.props.description??"";if(typeof u!="string")return a("Selected field is not editable text");let m=ta(u);if(d(m))return a("Failed to edit field");let p=m.value;return p===u?l("No changes made",null):ke({id:du(),action:"edit.description",payload:{id:s.id,md:p},...e.value},n)};import hu from"node:fs";import ca from"node:path";import Io from"node:fs";import cu from"node:path";var ra=async e=>{let t=cu.join(e,".gitignore"),n=Io.existsSync(t)?Io.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
50
+ `;return ea.writeFileSync(A,R,"utf8"),l("Exported board layout",A)};import Su from"node:os";import ia from"node:path";import{z as Et}from"zod";import{accessSync as vu,copyFileSync as xu,existsSync as dr,mkdirSync as na,readdirSync as ra,readFileSync as yu,renameSync as hu,rmSync as Cu,statSync as oa,unlinkSync as Nu,writeFileSync as Eu}from"node:fs";import Wt from"node:path";var ve={writeToFile:(e,t)=>{try{let n=Wt.dirname(e);dr(n)||na(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Eu(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return yu(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ve.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 dr(e)&&oa(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await vu(e),!0}catch{return!1}},mkDir:e=>na(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Wt.parse(t);for(;;){let r=Wt.join(t,e);try{if(dr(r)&&oa(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Wt.dirname(t)}return null},readFirstJSON(e){try{if(!ve.dirExists(e))return null;let t=ra(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Wt.join(e,t);return ve.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ve.dirExists(e)?ra(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Nu(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Cu(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Wt.dirname(t)),!n?.overwrite&&dr(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{hu(e,t)}catch(r){if(r?.code==="EXDEV"){xu(e,t),this.rmFile(e);return}throw r}}};var bu={userId:"",userName:"",preferredEditor:"",autoSync:!1},sa=Et.object({preferredEditor:Et.string().optional(),userName:Et.string().optional(),userId:Et.string().optional(),autoSync:Et.boolean().nullable().optional(),autoSyncDebounceMs:Et.number().optional(),viewMode:Et.enum(["dense","wide"]).optional()}),Iu="config.json",aa=()=>ia.join(Su.homedir(),ye),Io=()=>ia.join(aa(),Iu),Ro=()=>{try{return ve.mkDir(aa()),l(`Ensured ~/${ye} exists`,null)}catch{return a(`Unable to create ~/${ye}`)}},Ru=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${ye}/config.json JSON`)}let n=sa.safeParse(t??{});return n.success?l("Parsed config",n.data):a(`Invalid ~/${ye}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},da=()=>{let e=Ro();if(d(e))return a(e.message);let t=Io(),n=ve.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Ru(n)},ca=e=>{let t=Ro();if(d(t))return a(t.message);let n=sa.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Io();try{return ve.writeToFile(r,JSON.stringify(n.data,null,2)+`
51
+ `),l("Config written",null)}catch{return a(`Unable to write ~/${ye}/config.json`)}},St=e=>{let t=da();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return ca(n)},la=()=>{let e=Io(),t=Ro();if(d(t))return a(`Unable to create ~/${ye}`);if(!(ve.readFile(e)!==null)){let m=ca(bu);if(d(m))throw new Error(`Unable to create ~/${ye}/config.json`)}let r=da();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:s,autoSync:c,autoSyncDebounceMs:u}=r.value;return!i||!s?a(`User name or ID not configured in ~/${ye}/config.json`):l("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:s,autoSync:c??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"})};var ua=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id)return r.payload.parent}return null};import{ulid as ku}from"ulid";import{spawnSync as Au}from"node:child_process";import Tu from"node:os";import ma from"node:path";import{ulid as wu}from"ulid";function Mu(){let{preferredEditor:e}=U(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Pu(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function pa(e){let t=ma.join(Tu.tmpdir(),"epiq");ve.mkDir(t);let n=ma.join(t,wu());ve.writeToFile(n,e??"");let r=Mu();for(let o of r){let i=Pu(o,n),s=Au(i,{stdio:"inherit",shell:!0});if(!s.error&&s.status===0){let c=ve.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 ga=async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let t=await Ie();if(d(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=v(),i=Ce([...r,o],"TICKET");if(d(i))return a("Edit target must be an issue");let s=i.value;if(!H(s))return a("Edit target must be an issue");if(s.readonly)return a("Cannot edit readonly issue");let c=B(s.id).find(y=>y.title===X.DESCRIPTION);if(!c)return a("No target found");if(c.readonly)return a("Cannot edit readonly field");let u=s.props.description??"";if(typeof u!="string")return a("Selected field is not editable text");let m=pa(u);if(d(m))return a("Failed to edit field");let g=m.value;return g===u?l("No changes made",null):Ae({id:ku(),action:"edit.description",payload:{id:s.id,md:g},...e.value},n)};import Du from"node:fs";import va from"node:path";import Ao from"node:fs";import Lu from"node:path";var fa=async e=>{let t=Lu.join(e,".gitignore"),n=Ao.existsSync(t)?Ao.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
32
52
  `).map(u=>u.trim()),i=r.filter(u=>!o.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(i.length===0)return l("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...i].join(`
33
53
  `);return n=n.trimEnd()+`
34
54
 
35
55
  ${c}
36
- `,Io.writeFileSync(t,n,"utf8"),le.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};import Vt from"node:fs";import pn from"node:path";var ia=async e=>{if((await be({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return l("Initial commit already exists",!1);le.info("Creating initial commit");let n=await K.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?a(n.message):l("Created initial commit",!0)},oa=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",lu=async e=>{let t=await Dn(e);if(d(t))return a(t.message);let n=await gi(e);return d(n)?a(n.message):l("Built sync commit message",`[epiq:sync:${oa(t.value)}:${oa(n.value)}]`)},Ro=async({repoRoot:e,stateBranchName:t})=>{le.info(`Creating ${t}`);let n=await D({args:["commit-tree",Ni,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return a(`Failed to create state branch commit
37
- ${n.message}`);let r=n.value.stdout.trim(),o=await D({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?a(`Failed to create ${t}
38
- ${o.message}`):l("Created state branch",!0)},uu=async({repoRoot:e,stateBranchName:t})=>{let n=await Wr({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
39
- `+n.message);let r=n.value,o=r?await tn({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(d(o))return a(`Ensure local state branch failed
40
- `+o.message);let i=o.value;if(r&&i){let c=await K.fetch({cwd:e,remote:pe,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
41
- ${c.message}`)}let s=await Ln({repoRoot:e,branch:t});if(d(s))return a(`Ensure local state branch failed
42
- `+s.message);if(s.value)return l("Local state branch already exists",!1);if(i){let c=await D({args:["branch","--track",t,`${pe}/${t}`],cwd:e});return d(c)?a(`Failed to create local ${t} from remote
43
- ${c.message}`):l("Created local state branch from remote",!0)}return Ro({repoRoot:e,stateBranchName:t})},mu=async({repoRoot:e,branch:t})=>{let n=await D({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=n.value.stdout.split(`
44
- `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return l("Found worktree for branch",o)}return l("No worktree found for branch",null)},pu=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=nn(pn.dirname(t));if(d(r))return a(`Failed to create state branch worktree
45
- `+r.message);Vt.existsSync(t)&&!Vt.existsSync(pn.join(t,".git"))&&(le.info("Removing broken state branch worktree path"),Si(t)),le.info("Creating state branch worktree");let o=await K.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?a(`Failed to create state branch worktree
46
- ${o.message}`):l("Created state branch worktree",!0)},Ao=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await mu({repoRoot:e,branch:n});if(d(r))return a(r.message);let o=pn.resolve(t),i=r.value?pn.resolve(r.value):null;if(i&&i===o&&Vt.existsSync(i))return l("State branch already checked out in expected worktree",!1);if(i&&i!==o){le.info("Moving state branch worktree to expected location");let u=await K.worktreeRemove({cwd:e,worktreeRoot:i});if(d(u))return a(`Failed to remove existing state branch worktree
47
- ${u.message}`)}if(i&&!Vt.existsSync(i)){le.info("Pruning stale state branch worktree");let u=await K.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
48
- ${u.message}`)}let s=await pi({repoRoot:e,worktreeRoot:t});if(d(s))return a(s.message);let c=Vt.existsSync(t);if(s.value&&c)return l("State branch worktree already exists",!1);if(s.value&&!c){le.info("Pruning missing registered state branch worktree");let u=await K.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
49
- ${u.message}`)}return pu({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},gu=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Dn(e);if(d(n))return a(n.message);if(n.value===t)return l("State branch already checked out",!1);(await be({cwd:e,args:["rebase","--abort"]})).exitCode===0&&le.info("Aborted stale state branch rebase");let o=await K.checkout({cwd:e,branch:t});return d(o)?a(`Failed to checkout ${t}
50
- ${o.message}`):l("Checked out state branch",!0)},fu=async({repoRoot:e,stateBranchRoot:t})=>{let n=await _r(t);if(d(n))return a(n.message);if(n.value)return l("State branch upstream already configured",!1);let r=await Wr({repoRoot:t});if(d(r))return a(r.message);if(!r.value)return l("No remote available for state branch upstream",!1);let o=ht(e);if(d(o))return o;let i=o.value,s=await tn({repoRoot:t,branch:i});if(d(s))return a(s.message);if(!s.value)return l("Remote state branch missing; upstream will be configured on first push",!1);le.info(`Configuring ${i} upstream`);let c=await K.fetch({cwd:t,remote:pe,branch:i});if(d(c))return a(`Failed to fetch ${i}
51
- ${c.message}`);let u=await K.setUpstream({cwd:t,branch:i,upstream:`${pe}/${i}`});return d(u)?a(`Failed to set state branch upstream
52
- ${u.message}`):l("Configured state branch upstream",!0)},dr=async({stateBranchRoot:e,eventFileName:t})=>{let n=Ct(t),r=pn.join(e,n);if(!Vt.existsSync(r))return l("No event file to stage",void 0);let o=await K.stage({cwd:e,pathspec:[n]});return d(o)?a(`Failed to stage state branch event file
53
- ${o.message}`):l("Staged state branch event file",void 0)},sa=async({repoRoot:e,stateBranchRoot:t})=>{let n=await lu(e);return d(n)?a(`Create state branch sync commit failed
54
- `+n.message):Dt({cwd:t,message:n.value})},gn=async({repoRoot:e,stateBranchRoot:t})=>{let n=await _r(t);if(d(n))return a(n.message);let r=ht(e);if(d(r))return r;let o=r.value,i=n.value?await K.push({cwd:t}):await K.push({cwd:t,remote:pe,branch:o,setUpstream:!0});return d(i)?a(`Failed during state branch push
55
- ${i.message}`):l("Pushed state branch",!0)},aa=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=ht(e);if(d(o))return o;let i=o.value,s=[Bn(),await uu({repoRoot:e,stateBranchName:i}),await Ao({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await gu({stateBranchRoot:t,stateBranchName:i}),await Ii(t),n?await fu({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of s){if(d(c))return a(c.message);r=r||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{monotonicFactory as vu,ulid as qe}from"ulid";var fn=vu();function xu(){let e=ot();if(d(e))return a("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(i=>i.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[r]=U(n.id),[o]=r?U(r.id):[];if(o){let i=t.renderedChildrenIndex?.[o.id]??[];return l("Resolved boot nav target",{contextNode:o,selectedIndex:i.length>0?0:-1})}else return r?l("Resolved boot nav target",{contextNode:r,selectedIndex:0}):n?l("Resolved boot nav target",{contextNode:n,selectedIndex:0}):l("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function yu(){let e=xu();return d(e)?e:A.navigate(e.value)}function da({userId:e,userName:t}){let n=fn(),r=fn(),o=fn(),i=fn(),s=fn(),c=ge(void 0,void 0);if(d(c))return c;let u=ge(void 0,void 0);if(d(u))return u;let m=ge(u.value,void 0);if(d(m))return m;let p=ge(void 0,void 0);if(d(p))return p;let y=ge(p.value,void 0);if(d(y))return y;let N=ge(y.value,void 0);if(d(N))return N;let E=ge(void 0,void 0);return d(E)?E:l("Created default events",[{id:qe(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:qe(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:qe(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:qe(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:y.value}},{id:qe(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"Done",parent:r,rank:N.value}},{id:qe(),userId:e,userName:t,action:"add.board",payload:{id:ar,name:"Closed",parent:n,rank:m.value}},{id:qe(),userId:e,userName:t,action:"add.swimlane",payload:{id:Ge,name:"Closed",parent:ar,rank:E.value}},{id:qe(),userId:e,userName:t,action:"lock.node",payload:{id:ar}},{id:qe(),userId:e,userName:t,action:"lock.node",payload:{id:Ge}}])}function cr(e){if(!e.length){let r=z.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=vn(r);return d(o)?o:(S({hasProjectDefinition:!1,mode:g.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!e.some(r=>r.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=At(e).filter(d);return n.length>0?a(`Materializing failed:
56
- ${n.map(r=>r.message).join(`
57
- `)}`):(yu(),S({hasProjectDefinition:!0}),l("State booted successfully",null))}var Cu=async e=>{let t=await D({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},_=(e,t)=>a(`[${e}] ${t}`),la=async()=>{let e=oi(),t=await et(process.cwd());if(d(t))return _(1,t.message);let n=t.value,r=await kn(n);if(d(r))return _(2,r.message);if(r.value)return _(2,"Cannot initialize Epiq while a git operation is in progress");let o=await Cu(n);if(d(o))return _(2.5,o.message);if(o.value)return _(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Or(n))return _(4,"Epiq project already initialized");let i=it();if(!i.isSetupDone||!i.userName)return _(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let s=H(),c=s.userName,u=s.userId;if(!u||!c)return _(5,"Missing Epiq user id");let m=e.stateBranch,p=await Ln({repoRoot:n,branch:m});if(d(p))return _(6,p.message);if(p.value)return _(6,`State branch already exists: ${m}`);let y=await Ro({repoRoot:n,stateBranchName:m});if(d(y))return _(6,y.message);let N=Bn();if(d(N))return _(7,N.message);let E=ca.join(Fn(),e.projectId),I=await Ao({repoRoot:n,stateBranchRoot:E,stateBranchName:m});if(d(I))return _(8,I.message);let w=ca.join(E,".epiq");hu.mkdirSync(w,{recursive:!0});let R=da({userId:u,userName:c});if(d(R))return _(9,R.message);for(let Br of R.value){let ti=sr({event:Br,rootDir:E});if(d(ti))return _(9,ti.message)}let T=await dr({stateBranchRoot:E,eventFileName:mn({userId:u,userName:c})});if(d(T))return _(10,T.message);let F=await Dt({cwd:E,message:"[epiq:init]"});if(d(F))return _(10,F.message);let re=await ra(n);if(d(re))return _(11,re.message);let se=si({repoRoot:n,fileContents:e});if(d(se))return _(12,se.message);let $e=await K.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d($e))return _(13,$e.message);let xt=await K.commit({cwd:n,message:"[epiq:init-project]"});if(d(xt))return _(13,xt.message);let Ee="Project initialized!",Yt=await D({cwd:n,args:["push","-u","origin","HEAD"]});d(Yt)&&(Ee+=` Warn: [init:14] ${Yt.message}`);let ae=await gn({repoRoot:n,stateBranchRoot:E});d(ae)&&(Ee+=` Warn: [init:15] ${ae.message}`);let Lt=At(R.value).filter(d);if(Lt.length>0)return _(16,Lt.map(Br=>Br.message).join(`
58
- `));let yt=ot();if(d(yt))return _(16,yt.message);let{rootNodeId:Wd,nodes:_d}=yt.value,ei=_d[Wd];return ei?(A.navigate({contextNode:ei,selectedIndex:0}),S({hasProjectDefinition:!0,mode:g.DEFAULT}),l(Ee,null)):_(16,"Unable to resolve initialized root node")};import{ulid as Eu}from"ulid";import{ulid as Nu}from"ulid";var ua=null,lt=()=>structuredClone(ua),xn=e=>{ua=e},ma=()=>{let{contextNode:e,selectedIndex:t}=v(),r=$(e.id)[t];return r?l("Resolved selected child",r):a("Target node not found")},To=({id:e,parentId:t,position:n={at:"end"}})=>{let r=$(t).filter(o=>o.id!==e);return lr(r,n)},pa=({id:e,parentId:t,position:n={at:"end"}})=>{let r=G();if(d(r))return a("Unable to resolve user ID");let o=To({parentId:t,id:e,position:n});return d(o)?o:l("Created pending move state",{id:Nu(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},ga=e=>{xn(e);let t=yn(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function wo(e){let t=ma();if(d(t))return t;let{contextNode:n,nodes:r}=v();if(!n.parentNodeId)return a("Missing parent node id");let o=r[n.parentNodeId];if(!o)return a("Missing parent node");let i=$(o.id),s=i.findIndex(({id:m})=>m===n.id);if(s<0)return a("Current node not found among siblings");let c=i[s+e];if(!c)return a("Missing sibling node");let u=pa({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:ga(u.value)}function Mo(e){let t=ma();if(d(t))return t;let{contextNode:n,selectedIndex:r}=v(),i=$(n.id)[r+e];if(!i)return a("Missing sibling node");let s=pa({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return d(s)?s:ga(s.value)}var fa=()=>{let e=lt();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,r=v().nodes[n];if(!r)return a("Move parent not found");let o=$(n).findIndex(i=>i.id===t);return o===-1?a("Moved node not found among rendered children"):(A.navigate({contextNode:r,selectedIndex:o}),l("Synchronized navigation to moved node",null))},ur=(e,t="Moved preview")=>{if(d(e))return e;let n=fa();return d(n)?n:(S({mode:g.MOVE}),l(t,null))},va=async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=V().commandMeta,{contextNode:n,selectedIndex:r}=v(),o=$(n.id)[r];if(!o)return S({mode:g.DEFAULT}),a("No move target");if(t==="start"){if(o.readonly)return a("Target node is read-only");if(r===-1)return a("No item selected");if(!o.parentNodeId)return a("Target has no parent");let i=$(o.parentNodeId),s=i.findIndex(({id:y})=>y===o.id);if(s===-1)return a("Target not found among siblings");let c=i[s-1],u=i[s+1],m=u!=null?{at:"before",sibling:u.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=To({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(xn({id:Eu(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),S({mode:g.MOVE}),l("Move initialized",null))}if(t==="next")return ur(Mo(1));if(t==="previous")return ur(Mo(-1));if(t==="to-next")return ur(wo(1));if(t==="to-previous")return ur(wo(-1));if(t==="confirm"){let i=lt();if(!i)return a("No pending move to confirm");let s=await Me();if(d(s))return s;let c=ke(i,s.value);if(d(c))return c;let u=fa();return d(u)?u:(xn(null),S({mode:g.DEFAULT}),l("Moved item",null))}return t==="cancel"?(xn(null),S({mode:g.DEFAULT}),l("Cancelling move",null)):a("Invalid move modifier")};import{ulid as mr}from"ulid";import{monotonicFactory as Su,ulid as bu}from"ulid";var Iu=Su(),xa=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Iu();return l("Created issue events",[{id:bu(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var ya=async(e,t)=>{let n=G();if(d(n))return a("Unable to resolve user ID");let r=await Me();if(d(r))return r;let o=r.value;if(!t.inputString)return a(`provide a name for your ${t.modifier}`);let{breadCrumb:i,contextNode:s,selectedIndex:c}=v(),u=m=>{let p=ke(m,o);if(d(p))return p;let y=b.getNode(p.value.result.id);if(!y)return a("Created node not found");if(!y.parentNodeId)return p;let N=b.getNode(y.parentNodeId);return N?(A.navigate({contextNode:N,selectedIndex:b.getSiblings(y.parentNodeId).findIndex(({id:E})=>E===y.id)}),p):a("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=v(),p=b.getNode(m);if(!p)return a("Workspace not found");let y=pr(p.id,n.value,o);return d(y)?y:u({id:mr(),action:"add.board",payload:{id:mr(),name:t.inputString,parent:p.id,rank:y.value},...n.value})}if(t.modifier==="swimlane"){let m=Ie(i,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=pr(m.value.id,n.value,o);return d(p)?p:u({id:mr(),action:"add.swimlane",payload:{id:mr(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=U(s.id)[c],p=s.context==="SWIMLANE"?s:s.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let F=Ie(i,"SWIMLANE");return d(F)?null:F.value})();if(!p)return a("Unable to add issue in this context");let y=pr(p.id,n.value,o);if(d(y))return y;let N=xa({name:t.inputString,parent:p.id,rank:y.value,user:n.value});if(d(N))return N;let E=N.value,I=ha(E,o);if(I.some(F=>d(F)))return a("Issue create failed: "+I.filter(d).map(F=>F.message).filter(Boolean).join(", "));let w=I[0];if(!w||d(w))return a("Issue creation failed");let T=E.find(F=>F.action==="add.issue")?.payload.id;return T?(A.navigate({contextNode:p,selectedIndex:b.getSiblings(p.id).findIndex(({id:F})=>F===T)}),l("Issue created",null)):a("Unable to determine ticket id")}return l("Success",null)};var Ca=async()=>{let e=Ie(v().breadCrumb,"BOARD");if(d(e))return e;let t=await et(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Ze({repoRoot:t.value});if(d(n))throw new Error(n.message);let{modifier:r}=V().commandMeta;if(r==="now"){let I=Kt(n.value);if(d(I))return a(I.message);let w=hn();if(d(w))return w;let T=At(I.value).filter(d);return T.length>0?a(T.map(F=>F.message).join(", ")):(S({mode:g.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),l("Peeking now",!0))}let o;if(r==="prev"){let I=v().eventLog.at(-1),w=eo(I);if(w===null)return a("No previous event to peek");o=w}else if(r==="next"){let I=v().unappliedEvents.at(0),w=eo(I);if(w===null)return a("No next event to peek");o=w+1}else{let I=jn(r);if(!I)return a("Invalid peek date");o=I.getTime()}let i=v(),s=e.value.id,c=qs(n.value,o);if(d(c))return a(c.message);let{appliedEvents:u,unappliedEvents:m}=c.value,p=hn();if(d(p))return p;let N=At(u).filter(d);if(N.length>0)return hn(),S(i),a(N.map(I=>I.message).join(", "));let E=v().nodes[s];return E?(A.navigate({contextNode:E,selectedIndex:0}),S({mode:g.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),l("Peeking",!0)):(hn(),S(i),a("Board did not exist at peek date"))};import Ru from"zod";var Na=()=>{let e=V().commandMeta.inputString,t=Ru.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=Rt({autoSyncDebounceMs:t.data});return d(n)?n:(De({autoSyncIntervalMs:t.data}),S({mode:g.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var Ea=()=>{let e=V().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return a("Invalid response");let t=_i(e),n=Rt({autoSync:t});return d(n)?n:(De({autoSync:t}),S({mode:g.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Sa=async()=>{O(()=>""),S({mode:g.DEFAULT});let e=ot();if(d(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");S({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Hn();return d(t)?(S({syncStatus:{msg:t.message,status:"failed"}}),t):(S({mode:g.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{useSyncExternalStore as iE}from"react";var gr,Au=new Set,ba=()=>{for(let e of Au)e()};var ut=()=>{if(!gr)throw new Error("Ui state not initialized. Call initUiState() first.");return gr};var Ia=(e={})=>(gr=e,ba(),l("UX state initialized",null)),Tu=e=>{let t=ut();return gr=e(t),ba(),l("UX state updated",null)},mt=e=>Tu(t=>({...t,...e}));var Ra=e=>Object.values(v().tags).find(t=>t.name===e),Aa=e=>Object.values(v().contributors).find(t=>t.name===e),fr=[{systemOnly:!0,intent:P.Move,description:"Internal move-state command",mode:g.COMMAND_LINE,action:va},{intent:P.Delete,description:"Delete the currently selected node",mode:g.COMMAND_LINE,action:async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=U(t.id)[n];return r?Ae({id:ye(),action:"delete.node",payload:{id:r.id},...e.value}):a("Unable to resolve child to delete")},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=V().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(s=>Q(x.FILTER).map(c=>c.split(n)[0]).includes(s))(r))return a("Invalid filter modifier");let i={target:r,operator:"=",value:t.trim()};return Te(s=>({...s,filters:e==="clear"?[]:[...s.filters,i],mode:g.DEFAULT})),l("Filter updated",null)}},{intent:P.ViewHelp,description:"Open the help screen",mode:g.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return mt({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),S({mode:g.HELP}),l("Viewing help",null)}},{intent:P.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:g.COMMAND_LINE,action:async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=U(t.id)[n];if(!r)return a("Unable to close issue, no target found");if(!W(r))return a("Cannot close in this context");let o=v().nodes[Ge];if(!o)return a("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return a("Issue is already closed");let i=await Me();if(d(i))return i;let s=i.value,c=Po(o.id,r.id,{at:"end"},e.value,s);if(d(c))return c;let u=await Ae({id:ye(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value});return d(u)?u:l("Issue closed",null)},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:g.COMMAND_LINE,action:async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=U(t.id)[n];if(!r)return a("Unable to reopen issue, no target found");let o=r.context==="TICKET"?l("Resolved ticket",r):pt(r.id,"TICKET");if(d(o))return a("Cannot reopen in this context");let i=o.value,s=v().nodes[Ge];if(!s)return a("Unable to locate closed swimlane");if(i.parentNodeId!==s.id)return a("Issue is not closed");if(!W(i))return a("Target node is not issue");let c=Zs(i);if(!c)return a("Unable to resolve previous parent from issue history");if(c===s.id)return a("Previous parent resolves to closed swimlane");let u=v().nodes[c];if(!u)return a("Previous parent no longer exists");let m=await Me();if(d(m))return m;let p=m.value,y=Po(u.id,i.id,{at:"end"},e.value,p);if(d(y))return y;let N=await Ae({id:ye(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:y.value},...e.value});return d(N)?N:l("Issue reopened",null)},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.Init,description:"Initialize Epiq in the current git repository",mode:g.COMMAND_LINE,action:la},{intent:P.NewItem,description:"Create a new board, swimlane, or issue",mode:g.COMMAND_LINE,action:ya,onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.Rename,description:"itle] Rename the currently selected node",mode:g.COMMAND_LINE,action:async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=U(t.id)[n];if(!r)return a("Missing node");if(r.readonly)return a("Cannot rename readonly node");let o=ys();return o?Ae({id:ye(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):a("Provide a title")},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.UntagTicket,description:"Remove a tag from the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=V().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let o=Ra(r);if(!o)return a(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return a("Invalid untag target");let s=pt(i.id,"TICKET");if(d(s))return a("Unable to untag issue in this context");let c=s.value;return W(c)?(c.props.tags??[]).includes(o.id)?Ae({id:ye(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}):a("Issue is not tagged with that tag"):a("Target node is not issue")},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.TagTicket,description:"Add or create a tag on the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=V().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let{selectedNode:o}=v();if(!o)return a("Invalid tag target");let i=pt(o.id,"TICKET");if(d(i))return a("Unable to tag issue in this context");let s=i.value;if(!W(s))return a("Target node is not issue");let c=Ra(r),u;if(c)u=c.id;else{let p=ye(),y=await Ae({id:ye(),action:"create.tag",payload:{id:p,name:r},...e.value});if(d(y))return y;u=y.value.result.id}return(s.props.tags??[]).includes(u)?a("Already tagged with that tag"):Ae({id:ye(),action:"add.issue.tag",payload:{id:s.id,tag:u},...e.value})},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.AssignUserToTicket,description:"Assign a user to the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=V().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee");let{selectedIndex:o,contextNode:i}=v(),s=U(i.id)[o];if(!s)return a("Invalid assign target");let c=pt(s.id,"TICKET");if(d(c))return a("Unable to assign issue in this context");let u=c.value;if(!W(u))return a("Target node is not issue");let m=Aa(r),p;if(m)p=m.id;else{let N=ye(),E=await Ae({id:ye(),action:"create.contributor",payload:{id:N,name:r},...e.value});if(d(E))return E;p=E.value.result.id}return(u.props.assignees??[]).includes(p)?a("Assignee already assigned"):Ae({id:ye(),action:"add.issue.assignee",payload:{id:u.id,assignee:p},...e.value})},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=G();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=V().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee to remove");let o=Aa(r);if(!o)return a(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return a("Invalid unassign target");let s=pt(i.id,"TICKET");if(d(s))return a("Unable to unassign in this context");let c=s.value;return W(c)?(c.props.assignees??[]).includes(o.id)?Ae({id:ye(),action:"remove.issue.assignee",payload:{id:c.id,assignee:o.id},...e.value}):a(`Issue is not assigned to "${r}"`):a("Target node is not issue")},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.Sync,description:"Pull, commit, and push Epiq state",mode:g.COMMAND_LINE,action:Sa},{intent:P.Peek,description:"View board state at another point in time",mode:g.COMMAND_LINE,action:Ca},{intent:P.Export,description:"Export the current board layout to markdown",mode:g.COMMAND_LINE,action:async()=>{let e=await Bs();return d(e)?e:(S({mode:g.DEFAULT}),l("Export successful",!0))}},{intent:P.Exit,description:"Exit the application",mode:g.COMMAND_LINE,action:async()=>(A.exit(),l("Exit successful",!0))},{intent:P.Edit,description:"Edit title or description",mode:g.COMMAND_LINE,action:async(e,t)=>{if(t.modifier===st.DESCRIPTION)return na();if(t.modifier===st.TITLE){let n=G();if(d(n))return a("Unable to resolve user ID");let{contextNode:r,selectedIndex:o}=v(),i=U(r.id)[o];if(!i)return a("Missing node");if(i.readonly)return a("Cannot rename readonly node");let s=t.inputString.trim();return s?Ae({id:ye(),action:"edit.title",payload:{id:i.id,name:s},...n.value}):a("Provide a title")}return a("Unknown edit command")},onSuccess:()=>S({mode:g.DEFAULT})},{intent:P.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:g.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case oe.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=H(),s=n||i,c=r??ye();if(!s||!c)return a("Unable to resolve user name or id");let u=Rt({userName:s,userId:c,preferredEditor:o??""});return d(u)?u:(De({userName:s,userId:c}),S({mode:g.DEFAULT}),l(`Username set to "${s}"`,null))}case oe.EDITOR:{if(!n)return a("No editor provided");let r=Rt({preferredEditor:n});return d(r)?r:(De({preferredEditor:n}),S({mode:g.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case oe.VIEW:return n!=="wide"&&n!=="dense"?a("Invalid view mode"):(De({viewMode:n}),l(`View set to "${n}"`,null));case oe.AUTOSYNC:return Ea();case oe.SYNC_DEBOUNCE_MS:return Na();default:return a("Unknown config command")}}}];var wu=new Set(["peek","filter","view-help"]),Be=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=V();if(!t)return a("No command to confirm");if(!e&&n===St.Invalid)return a("Invalid command");let i=Xn(t);ps();let{readOnly:s}=v();if(s&&!wu.has(i))return dn({status:Je.Fail,message:"Command not available in readonly state",value:null});let c=fr.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!c)return dn({status:Je.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return dn({status:Je.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?dn(u):(gs({addToHistory:!e}),c.onSuccess?.(),H().autoSync&&$i(),u)};var vr=[{intent:f.Exit,mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(S({mode:g.COMMAND_LINE}),O(()=>"move cancel"),Be({isForceExecutedBySystem:!0}))},{intent:f.InitMove,mode:g.DEFAULT,description:"[m] move (init/confirm)",action:()=>(S({mode:g.COMMAND_LINE}),O(()=>"move start"),Be({isForceExecutedBySystem:!0}))},{intent:f.ConfirmMove,mode:g.MOVE,action:()=>(S({mode:g.COMMAND_LINE}),O(()=>"move confirm"),Be({isForceExecutedBySystem:!0}))}],xr=[{intent:f.MovePreviousItem,mode:g.MOVE,action:()=>lt()?(S({mode:g.COMMAND_LINE}),O(()=>"move previous"),Be({isForceExecutedBySystem:!0})):a("No pending move")},{intent:f.MoveNextItem,mode:g.MOVE,action:()=>lt()?(S({mode:g.COMMAND_LINE}),O(()=>"move next"),Be({isForceExecutedBySystem:!0})):a("No pending move")}],Ta=[{intent:f.MoveToNextContainer,mode:g.MOVE,action:()=>lt()?(S({mode:g.COMMAND_LINE}),O(()=>"move to-next"),Be({isForceExecutedBySystem:!0})):a("No pending move")},{intent:f.MoveToPreviousContainer,mode:g.MOVE,action:()=>lt()?(S({mode:g.COMMAND_LINE}),O(()=>"move to-previous"),Be({isForceExecutedBySystem:!0})):a("No pending move")}];var wa={[M.WORKSPACE]:[...vr,...xr],[M.BOARD]:[...vr,...xr],[M.SWIMLANE]:[...vr,...xr,...Ta],[M.TICKET]:[],[M.FIELD]:[],[M.FIELD_LIST]:[],[M.TEXT]:[]};var Ma=()=>{O(()=>"");let{pendingNavTarget:e}=ut();S({mode:g.DEFAULT}),e&&A.navigate(e),mt({pendingNavTarget:void 0})},Pa=[{intent:f.ExitCommandLine,mode:g.HELP,action:()=>(Ma(),l("Exiting help",null))},{intent:f.Exit,mode:g.HELP,action:()=>(Ma(),l("Closed help",null))},{intent:f.NavPreviousItem,mode:g.HELP,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:f.NavNextItem,mode:g.HELP,action:()=>(A.navigateToNextItem(),l("Navigating to next help item",null))},{intent:f.NavToPreviousContainer,mode:g.HELP,action:()=>(A.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:f.NavToNextContainer,mode:g.HELP,action:()=>(A.navigateToNextContainer(),l("Navigating to next help container",null))}];var Mu=e=>{S({mode:g.COMMAND_LINE});let{pendingNavTarget:t}=ut();t&&A.navigate(t),mt({pendingNavTarget:void 0}),O(()=>`${e} `)},ka=()=>{O(()=>"");let{pendingNavTarget:e}=ut();e&&A.navigate(e),mt({pendingNavTarget:void 0}),S({mode:g.DEFAULT})},La=[{intent:f.InitCommandPalette,mode:g.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{O(()=>"");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return mt({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),S({mode:g.PALETTE}),l("Opening command palette",null)}},{intent:f.Confirm,mode:g.PALETTE,action:()=>{let{selectedNode:e}=v();if(!e||!nt(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?(Mu(t),l("Selected command",t)):l("No command selected",null)}},{intent:f.ExitCommandLine,mode:g.PALETTE,action:()=>(ka(),l("Exiting palette",null))},{intent:f.Exit,mode:g.PALETTE,action:()=>(ka(),l("Closed command palette",null))},{intent:f.NavPreviousItem,mode:g.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:f.NavNextItem,mode:g.PALETTE,action:()=>(A.navigateToNextItem(),l("Navigating to next item",null))},{intent:f.NavToPreviousContainer,mode:g.PALETTE,action:()=>(A.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:f.NavToNextContainer,mode:g.PALETTE,action:()=>(A.navigateToNextContainer(),l("Navigating to next container",null))}];var Da=[...Pa,...La,{intent:f.AddItem,mode:g.DEFAULT,description:"[n] new...",action:()=>(S({mode:g.COMMAND_LINE}),O(()=>`${x.NEW} `),l("Adding new item",null))},{intent:f.Delete,mode:g.DEFAULT,description:"[d] delete",action:()=>(S({mode:g.COMMAND_LINE}),O(()=>`${x.DELETE} `),l("Deleting item",null))},{intent:f.InitCommandLine,mode:g.DEFAULT,description:"[:] focus command line",action:()=>(S({mode:g.COMMAND_LINE}),O(()=>""),l("Entering command line mode",null))},{intent:f.Confirm,mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!$(e?.id??"")?.length){if(e?.title===J.DESCRIPTION)return S({mode:g.COMMAND_LINE}),O(()=>`${x.EDIT} description `),l("Propose command",!0);if(e?.title===J.ASSIGNEES)return S({mode:g.COMMAND_LINE}),O(()=>`${x.ASSIGN} `),l("Propose command",!0);if(e?.title===J.TAGS)return S({mode:g.COMMAND_LINE}),O(()=>`${x.TAG} `),l("Propose command",!0);if(t.title===J.DESCRIPTION&&e?.context==="TEXT")return S({mode:g.COMMAND_LINE}),O(()=>`${x.EDIT} description `),l("Propose command",!0)}return A.enterChildNode(),l("Entering context",null)}},{intent:f.EditTitle,mode:g.DEFAULT,description:"[r] rename title",action:()=>(S({mode:g.COMMAND_LINE}),O(()=>`${x.EDIT} title ${v().selectedNode?.title}`),l("Exiting context",null))},{intent:f.EditDescription,mode:g.DEFAULT,description:"[e] edit description",action:()=>(S({mode:g.COMMAND_LINE}),O(()=>`${x.EDIT} description `),l("Exiting context",null))},{intent:f.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(A.enterParentNode(),l("Exiting context",null))},{intent:f.NavPreviousItem,mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:f.NavNextItem,mode:g.DEFAULT,action:()=>(A.navigateToNextItem(),l("Navigating to next item",null))},{intent:f.NavToPreviousContainer,mode:g.DEFAULT,action:()=>(A.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:f.NavToNextContainer,mode:g.DEFAULT,action:()=>(A.navigateToNextContainer(),l("Navigating to next container",null))}];var Pu=500,ku=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Fa=e=>{let t=ku(e);t&&O(n=>(n+t).slice(0,Pu))};var Lu=[g.COMMAND_LINE,g.PALETTE],Du=e=>[{intent:f.MoveCursorLeft,mode:e,action:()=>(lo(-1),l("Moving cursor left",null))},{intent:f.MoveCursorRight,mode:e,action:()=>(lo(1),l("Moving cursor right",null))},{intent:f.MoveCursorLeftOfWord,mode:e,action:()=>(uo("left"),l("Moving cursor left of word",null))},{intent:f.MoveCursorRightOfWord,mode:e,action:()=>(uo("right"),l("Moving cursor right of word",null))},{intent:f.AutoCompleteCommand,mode:e,action:()=>(O((t,{remainder:n})=>n?t+n:t),l("Auto-completing command",null))},{intent:f.CaptureInput,mode:e,action:(t,{sequence:n})=>(Fa(n??""),l("Capturing input",null))},{intent:f.EraseInput,mode:e,action:()=>(us(),l("Erasing input",null))},{intent:f.EraseInputWord,mode:e,action:()=>(ms(),l("Erasing input word",null))}],Ba=[{intent:f.Confirm,mode:g.COMMAND_LINE,action:()=>(Be(),l("Executing command",null))},{intent:f.ViewHelp,mode:g.DEFAULT,action:()=>(S({mode:g.HELP}),l("Viewing help",null))},...Lu.flatMap(Du),{intent:f.ExitCommandLine,mode:g.COMMAND_LINE,action:()=>(S({mode:g.DEFAULT}),l("Exiting command line",null))},{intent:f.GetLastCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(fs(),l("Getting last command from history",null))},{intent:f.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(vs(),l("Getting next command from history",null))}];import $a from"chalk";var yr=$a.dim.hex(h.secondary2)(": for command line"),Oa="q to exit",Ua=`${$a.hex(h.accent)("m")} to confirm`,ko={[M.WORKSPACE]:[yr],[M.BOARD]:[yr],[M.BOARD+g.COMMAND_LINE]:[yr],[M.SWIMLANE]:[yr],[M.TICKET+g.HELP]:[Oa],[M.SWIMLANE+g.HELP]:[Oa],[M.TICKET]:[],[M.FIELD]:[],[M.SWIMLANE+g.MOVE]:[Ua],[M.TICKET+g.MOVE]:[Ua]};var Cn=e=>e.trim().toLocaleLowerCase(),Fu=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},Bu=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},Ha=(e,t)=>{let n=Cn(t.value);if(!n)return!0;switch(t.target){case"title":return Cn(e.title??"").includes(n);case"description":return Cn(e.props.description??"").includes(n);case"tag":return Fu(e).map(Cn).some(o=>o.includes(n));case"assignee":return Bu(e).map(Cn).some(o=>o.includes(n));default:return!0}};function Wa(e,t,n){let r=t[e];if(!r)return a("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let s=o[o.length-1];return!s||s.id!==n?a("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var _a=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 Tt,Lo,Do=new Set,ja=()=>{for(let e of Do)e()},Uu=e=>(Do.add(e),()=>Do.delete(e));function Ka(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return a("derive(): contextNodeId is missing");if(!r)return a("derive(): rootNode is missing");if(!o[r])return a("derive(): unable to find root node");let c=o[t];if(!c)return a("Unable to derive state, contextNode not found");let u=Wa(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,y=ko[p+n]??ko[p]??[],N=[...Da,...wa[p]??[],...Ba],E=_a(N),I=$u(o,i),w=I[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:y,availableActions:N,actionIndex:E,selectedNode:w,renderedChildrenIndex:I})}var v=()=>{if(!Tt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Tt},ot=()=>Tt?l("Retrieved state",Tt):a("State not initialized. Call initWorkspaceState() first.");function vn(e){Lo=e;let t=Qe(process.cwd()),n=!1;if(!d(t)){let i=tt(t.value);if(d(i))return a(i.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:g.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},o=Ka(r);return d(o)?o:(Tt=o.value,ja(),l("State initialized",null))}function Te(e){let t=v(),n=e(t),r=Ka(n);return d(r)?a(r.message??"Unable to update state"):(Tt=r.value,ja(),l("State updated",null))}var S=e=>Te(t=>({...t,...e}));var te=()=>Ou(Uu,v,v),$u=(e,t)=>{let n={};for(let r of Object.values(e))W(r)&&t.length>0&&!t.every(o=>Ha(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let s=e[o.id],c=e[i.id];return!s||!c?0:s.rank.localeCompare(c.rank)});return n},U=e=>v()?.renderedChildrenIndex[e]??[],hn=()=>Lo?vn(Lo):a("Cannot reset state: no initial workspace found"),Ut=()=>Tt!==void 0;var pt=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return a("Node not found");if(r.context===t)return l("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return l("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return a(`No ancestor found for context: ${t}`)},Fo=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},wt=(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"),b={deleteNode(e){Te(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=v(),r=n[e];if(!r)return a("Edit target node not found");let o=wt(r,"edit");if(o)return o;let i={...r,props:{...r.props,description:t}};return this.updateNode(i),l("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return a("Rename target node not found");let r=wt(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),l("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return $(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),i=this.getNode(t);if(!o)return a("Node not found");if(!i)return a("Target parent not found");if(r===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let s=wt(o,"move");if(s)return s;if(Fo(t,e))return a("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=v(),o=this.getNode(e);if(!o)return a("Node not found");if(r===e)return a("Cannot delete root node");let i=new Set,s=u=>{let m=t[u];if(!(!m||i.has(u))){i.add(u);for(let p of $(m.id))s(p.id)}};s(e);let c={...structuredClone(t)};for(let u of i){if(!c[u])return a("Unable to locate node to delete");c[u]={...c[u],isDeleted:!0}}return n?(S({nodes:c}),l("Successfully tomb stoned",o)):a("Unable to delete undefined")},createContributor(e){let t=Te(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?a("Unable to create contributor"):l("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!r)return a("Unable to assign contributor, missing target");let o=wt(r,"edit");if(o)return o;if(!W(r))return a("Target is not an issue");let i=r.props.assignees??[];if(i.includes(t))return a("Contributor already assigned");let s={...r,props:{...r.props,assignees:[...i,t]}};return this.updateNode(s),l("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!r)return a("Unable to unassign, missing target");let o=wt(r,"edit");if(o)return o;if(!W(r))return a("Target is not an issue");let i=r.props.assignees??[];if(!i.includes(t))return l("Issue is not assigned to that contributor",{assignee:t});let s={...r,props:{...r.props,assignees:i.filter(c=>c!==t)}};return this.updateNode(s),l("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!r)return a("Unable to add tag, missing target");let o=wt(r,"edit");if(o)return o;if(!W(r))return a("Target is not an issue");let i=r.props.tags??[];if(i.includes(t))return a("Tag already assigned");let s={...r,props:{...r.props,tags:[...i,t]}};return this.updateNode(s),l("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!r)return a("Unable to remove tag, missing target");let o=wt(r,"edit");if(o)return o;if(!W(r))return a("Target is not an issue");let i=r.props.tags??[];if(!i.includes(t))return l("Issue is not tagged with that tag",{tag:t});let s={...r,props:{...r.props,tags:i.filter(c=>c!==t)}};return this.updateNode(s),l("Tag removed",{tag:t})},createTag(e){let t=Te(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):l("Tag created",e)},createNode(e){let t=Te(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?a("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return a("Failed to locate node");let n={...t,readonly:!0},r=Te(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?a(r.message):l("Locked node",n)},updateNode(e){let t=Te(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:l("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings(e){return $(e)}};import Mt from"chalk";import Va from"string-width";import{decodeTime as Hu}from"ulid";var Wu=(e,t)=>e+" ".repeat(Math.max(0,t-Va(e))),_u=(e,t)=>" ".repeat(Math.max(0,t-Va(e)))+e,ju=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"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),Ku=(e,t)=>t?e<t?"up":e>t?"down":null:null,Vu=(e,t)=>{let n=b.getNode(e.payload.parent),r=n?Mt.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let i=Ku(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},zu=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?Mt.bgHex(Re(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?Mt.bgHex(Re(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?Mt.hex(Re(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?Mt.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""}},Gu=e=>{let t=qi(Hu(e));return Mt.gray(_u(t,8))},qu=12,Yu=e=>Wu(`${e}`,qu),za=(e,t)=>{let n=Gu(e.id),r=Yu(e.userName),o=Mt.dim("\u203A"),i=e.action==="move.node"?Vu(e,t):[ju(e.action),zu(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};var Xu=e=>dt(e,"description"),Ju=e=>dt(e,"assignees"),Qu=e=>dt(e,"tags"),Zu=e=>dt(e,"history"),Ga=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:i=!1,childRenderAxis:s="horizontal"})=>{let c=b.getNode(e);if(!c){b.createNode({...z.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:s});return}!rt(c)||!(c.title!==t||c.parentNodeId!==n||c.rank!==r||c.props.value!==o||c.readonly!==i||c.childRenderAxis!==s)||b.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:i,childRenderAxis:s})},qa=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let s=b.getNode(e);if(!s){b.createNode({...z.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return}!rn(s)||!(s.title!==t||s.parentNodeId!==n||s.rank!==r||s.readonly!==o||s.childRenderAxis!==i)||b.updateNode({...s,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:i})},Ya=e=>{let t=Pe(_e/4n),n=Pe(_e/2n),r=Pe(_e*3n/4n),o=Pe(_e);d(t)||d(n)||d(r)||d(o)||(Ga({id:Xu(e.id),name:J.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"}),qa({id:Ju(e.id),name:J.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0}),qa({id:Qu(e.id),name:J.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0}),Ga({id:Zu(e.id),name:J.HISTORY,parentNodeId:e.id,rank:o.value,value:em(e),readonly:!0,childRenderAxis:"vertical"}))},em=e=>{let t=[...e.log].reverse(),n=new Map;for(let r of t){let o=n.get(r.action)??[];o.push(r.payload),n.set(r.action,o)}return t.map(r=>za(r,n.get(r.action)??[])).join(`
59
- `)};var k=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Xa=e=>{let t=b.getNode(e);!t||!W(t)||t.isDeleted||Ya(t)},tm=e=>{for(let t of e){Xa(t);let n=v().nodes[t]?.parentNodeId;n&&Xa(n)}},nm=(e,t)=>{let n=b.getNode(e);n&&b.updateNode({...n,log:[...n.log??[],t]})},rm=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},om=e=>{switch(e.action){case"delete.node":case"edit.description":return rm(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":default:return[]}},im=e=>{Te(t=>({...t,eventLog:[...t.eventLog,e]}))},sm=e=>{let t=e.userId,n=e.userName;if(!t?.length||!n?.length)return k("Invalid user ID format",e);let r=b.createContributor({id:t,name:n});return d(r)?k(r.message,e):null},am=(e,t)=>{let n=sm(e);if(n)return n;let r=[...new Set(om(e))];return t||(r.forEach(o=>nm(o,e)),im(e)),tm(r),null},dm={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=z.workspace(t,n,r),i=vn(o);if(d(i))return k(i.message,e);let s=b.createNode(o);return d(s)?k(s.message??"Failed to initialize workspace",e):Vr(s.value)?l("Workspace initialized",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=b.createNode(z.workspace(t,n,r));return d(o)?k(o.message??"Failed to add workspace",e):Vr(o.value)?l("Added workspace",{action:e.action,result:o.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=b.createNode(z.board(t,n,r,o));return d(i)?k(i.message??"Unable to create board",e):Ri(i.value)?l("Added board",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=b.createNode(z.swimlane(t,n,r,o));return d(i)?k(i.message??"Unable to create swimlane",e):Ft(i.value)?l("Added swimlane",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=b.createNode(z.ticket(t,n,r,o));return d(i)?k(i.message??"Unable to create issue",e):W(i.value)?l("Added issue",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:i}=e.payload,s=b.createNode(z.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(J.DESCRIPTION)?"vertical":"horizontal"}));return d(s)?k(s.message??`Unable to create field: ${n}`,e):rt(s.value)?l("Added field",{action:e.action,result:s.value}):a("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!b.getNode(t))return k(`Unable to locate node with id ${t}`,e);let o=b.renameNode(t,n);return d(o)?k(o.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=b.tombstoneNode(t);return d(n)?k(n.message??"Unable to delete node",e):l("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=b.createTag({id:t,name:n});return d(r)?k(r.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=b.createContributor({id:t,name:n});return d(r)?k(r.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=b.tag(t,n);return d(r)?k(r.message??"Unable to tag issue",e):l("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=b.untag(t,n);return d(r)?k(r.message??"Unable to untag issue",e):l("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=b.assign(t,n);return d(r)?k(r.message??"Unable to assign issue",e):l("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=b.unassign(t,n);return d(r)?k(r.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?k(o.message??"Failed to move node",e):l("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=b.editValue(t,n);return d(r)?k(r.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=b.getNode(t);if(!o)return k("Unable to locate issue",e);if(!W(o))return k("Can only close issues",e);let i=b.getNode(Ge);if(!i)return k("Unable to locate target swimlane",e);if(n!==i.id)return k("Close target must be closed swimlane",e);let s=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(s)?k(s.message??"Unable to close issue",e):l("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=b.getNode(t);if(!o)return k("Unable to locate issue",e);if(!W(o))return k("Can only reopen issues",e);let i=b.getNode(Ge);if(!i)return k("Unable to locate closed swimlane",e);if(n===i.id)return k("Cannot reopen issue into closed swimlane",e);if(!b.getNode(n))return k("Reopen parent no longer exists",e);let c=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?k(c.message??"Unable to reopen issue",e):l("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=b.lockNode(t);return d(n)?k(n.message??"Unable to lock node",e):l("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=b.getNode(r);if(!i)return k(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return k(`Node ${r} is not child of ${t}`,e);let s=b.updateNode({...i,rank:o});if(d(s))return k(s.message??"Unable to rebalance child",e)}return l("Rebalanced children",{action:e.action,result:{parent:t}})}};function yn(e,t=!1){let n=dm[e.action](e);if(d(n))return n;let r=am(e,t);return r||n}var At=e=>e.map(t=>yn(t));function ke(e,t){let n=yn(e);if(n.status!==Je.Success)return n;let r=sr({event:e,rootDir:t});return d(r)?r:n}function ha(e,t){return e.map(n=>ke(n,t))}var Ae=async e=>{let t=await Me();return d(t)?t:ke(e,t.value)};var Ja=e=>lr($(e),{at:"end"}),lr=(e,t={at:"end"})=>{let n=r=>d(r)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(ge(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(ge(void 0,r.rank)):a("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(ge(r.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let r=Qa(e,t.sibling);if(r<0)return a("Sibling not found");let o=r>0?e[r-1]:void 0,i=e[r];return i?n(ge(o?.rank,i.rank)):a("Sibling not found")}case"after":{let r=Qa(e,t.sibling);if(r<0)return a("Sibling not found");let o=e[r],i=r<e.length-1?e[r+1]:void 0;return o?n(ge(o.rank,i?.rank)):a("Sibling not found")}}},$=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Qa=(e,t)=>e.findIndex(n=>n.id===t),Za=(e,t,n={at:"end"})=>lr($(t).filter(r=>r.id!==e),n),Po=(e,t,n,r,o)=>{let i=Za(t,e,n);if(d(i))return i;if(!i.value.needsRebalance)return l("Resolved rank",i.value.rank);let s=zr(e,r);if(d(s))return s;let c=ke(s.value,o);if(d(c))return c;let u=Za(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)},pr=(e,t,n)=>{let r=Ja(e);if(d(r))return r;if(!r.value.needsRebalance)return l("Resolved rank",r.value.rank);let o=zr(e,t);if(d(o))return o;let i=ke(o.value,n);if(d(i))return i;let s=Ja(e);return d(s)?s:s.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",s.value.rank)};var td=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),nd=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},cm=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&rt(t)&&t.childRenderAxis==="vertical"},hr=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=U(r.id);return A.navigate({contextNode:r,selectedIndex:td(t,o.length)}),!0},rd=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return hr(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let s=$(o.id).findIndex(c=>c.id===n.id);return s>=0?(A.navigate({contextNode:o,selectedIndex:s}),!0):rd(o.id)},ed=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),rd(n))return!0;n=t[n]?.parentNodeId}return!1},lm=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},od=e=>{let{nodes:t,rootNodeId:n}=v();if(cm(e.contextNodeId)&&hr(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(lm(e.selectedNodeId)&&e.selectedNodeId&&ed(e.selectedNodeId))return l("Restored navigation to selected node or ancestor",null);if(hr(e.contextNodeId,e.selectedIndex))return l("Restored navigation to previous container",null);if(e.parentNodeId&&hr(e.parentNodeId,e.selectedIndex))return l("Restored navigation to previous parent",null);if(ed(e.contextNodeId))return l("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return a("Unable to restore navigation");let o=U(r.id);return A.navigate({contextNode:r,selectedIndex:td(e.selectedIndex,o.length)}),l("Restored navigation to root",null)};var Bo=({status:e,msg:t})=>{Ut()&&S({syncStatus:{status:e,msg:t}})},Oo=(e="Syncing...")=>{Bo({status:"syncing",msg:e})},Uo=(e="Synced")=>{Bo({status:"synced",msg:e})},um=e=>{Bo({status:"failed",msg:e})},q=e=>(um(e),a(e));var zt=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),$o=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)}},L=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);import{decodeTime as mm}from"ulid";var Nn=e=>{let t=[];for(let n of e.split(`
60
- `)){let r=n.trim();if(r)try{t.push(JSON.parse(r))}catch{return a("Failed to parse persisted events")}}return l("Parsed persisted events",t)},Ho=e=>{let[t,n]=e.id;return`${t}:${n??""}`},id=e=>{try{return mm(e.id[0])}catch{return 0}},Wo=(e,t)=>{let n=new Map;for(let r of[...e,...t])n.set(Ho(r),r);return[...n.values()].sort((r,o)=>{let i=id(r)-id(o);return i!==0?i:Ho(r).localeCompare(Ho(o))})},_o=e=>e.length===0?"":e.map(t=>JSON.stringify(t)).join(`
61
- `)+`
62
- `;var Cr=e=>we.existsSync(e)?we.readFileSync(e,"utf8"):null,cd=(e,t)=>Cr(e)===t?!1:(we.mkdirSync(Pt.dirname(e),{recursive:!0}),we.writeFileSync(e,t,"utf8"),!0),pm=({stateBranchRoot:e,ownEventFileName:t})=>Pt.join(e,Ct(t)),gm=async({stateBranchRoot:e,ownEventFileName:t})=>{let n=Ct(t),r=Pt.join(e,n);return(await be({cwd:e,args:["checkout","--",n]})).exitCode!==0&&we.existsSync(r)&&we.rmSync(r,{force:!0}),l("Restored own event file to HEAD",null)},sd=({ownEventPath:e,ownSnapshot:t})=>{if(t===null)return l("No own snapshot to merge",!1);let n=Cr(e)??"",r=Nn(n);if(d(r))return a(r.message);let o=Nn(t);if(d(o))return a(o.message);let i=Wo(r.value,o.value),s=cd(e,_o(i));return l("Merged own snapshot",s)},fm=e=>{let t=Pt.join(e,".epiq","events"),n=new Map;if(!we.existsSync(t))return l("No event files to snapshot",n);for(let r of we.readdirSync(t)){if(!r.endsWith(".jsonl"))continue;let o=Pt.join(t,r);we.statSync(o).isFile()&&n.set(r,we.readFileSync(o,"utf8"))}return l("Snapshotted event files",n)},vm=async e=>{if((await be({cwd:e,args:["checkout","--",Ct("")]})).exitCode!==0){let n=Pt.join(e,".epiq","events");we.existsSync(n)&&we.rmSync(n,{recursive:!0,force:!0})}return l("Restored event files to HEAD",null)},xm=({stateBranchRoot:e,snapshots:t})=>{let n=!1;for(let[r,o]of t){let i=Pt.join(e,Ct(r)),s=Cr(i)??"",c=Nn(s);if(d(c))return a(c.message);let u=Nn(o);if(d(u))return a(u.message);let m=Wo(c.value,u.value);n=cd(i,_o(m))||n}return l("Merged event snapshots",n)},ld=async(e=process.cwd())=>{logger.info("[sync] syncEpiqFromRemote:start",e),Oo("Syncing from remote");let t=L("ensureSyncReady",await ud({cwd:e,ensureUpstream:!1}));if(d(t))return q(t.message);let{repoRoot:n,stateBranchRoot:r}=t.value,o=L("getStateBranch",ht(n));if(d(o))return q(o.message);let i=o.value,s=L("snapshotEventFiles",fm(r));if(d(s))return q(s.message);let c=L("restoreEventFilesToHead",await vm(r));if(d(c))return q(c.message);let u=L("resetBranchHardToRemote",await xi({cwd:r,branch:i}));if(d(u))return q(u.message);let m=L("mergeEventSnapshots",xm({stateBranchRoot:r,snapshots:s.value}));return d(m)?q(m.message):(Uo(m.value?"Synced and merged local state":"Synced from remote"),logger.info("[sync] syncEpiqFromRemote:done"),l("Synced state branch from remote",{repoRoot:n,stateBranchRoot:r}))},ud=async({cwd:e,ensureUpstream:t})=>{logger.info("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=L("getRepoRootDir",await et(e));if(d(n))return a(n.message);let r=n.value;logger.info("[sync] repo root",r);let o=L("getStateBranchRoot",Ze({repoRoot:r}));if(d(o))return a(o.message);let i=o.value;logger.info("[sync] state branch root",i);let s=L("ensureInitialCommit",await ia(r));if(d(s))return a(s.message);logger.info("[sync] initial commit result",{created:s.value}),logger.info("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:i,ensureUpstream:t});let c=L("bootstrapStateBranchStorage",await aa({repoRoot:r,stateBranchRoot:i,ensureUpstream:t}));if(d(c))return a(c.message);logger.info("[sync] bootstrap result",{bootstrapped:c.value,stateBranchRoot:i}),logger.info("[sync] checking state branch git operation",{stateBranchRoot:i});let u=L("hasInProgressGitOperation(stateBranchRoot)",await kn(i));if(d(u))return a(u.message);if(logger.info("[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.info("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:i});let m=L("ensureStateBranchLayout",bi(r,i));return d(m)?a(m.message):(logger.info("[sync] state branch layout ready"),logger.info("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:i,bootstrapped:c.value}),l("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:c.value}))},ad=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.info("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.info("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let r=L("stageStateBranchOwnEventFile",await dr({stateBranchRoot:t,eventFileName:n}));if(d(r))return a(r.message);let o=L("hasStagedChanges(after stage)",await yi(t));if(d(o))return a(o.message);if(logger.info("[sync] state branch change check after stage result",{changed:o.value}),!o.value)return logger.info("[sync] no own event file changes to commit"),l("No own event file changes to commit",{createdCommit:!1});logger.info("[sync] creating sync commit");let i=L("createStateBranchSyncCommit",await sa({repoRoot:e,stateBranchRoot:t}));return d(i)?a(i.message):(logger.info("[sync] created sync commit",i.value),l("Committed own event file",{createdCommit:!0,commitSha:i.value}))},ym=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.info("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.info("[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.info("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),a("Own event file must end with .jsonl");Oo("Syncing");let n=L("ensureSyncReady",await ud({cwd:e,ensureUpstream:!0}));if(d(n))return q(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value;logger.info("[sync] sync preconditions ready",{repoRoot:r,stateBranchRoot:o,bootstrapped:i}),logger.info("[sync] checking detached state branch",{stateBranchRoot:o});let s=L("isDetachedHead(stateBranchRoot)",await hi(o));if(d(s))return q(s.message);if(logger.info("[sync] detached state branch check result",{detached:s.value}),s.value)return logger.info("[sync] state branch is detached"),q("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,y=L("getStateBranch",ht(r));if(d(y))return q(y.message);let N=y.value;logger.info("[sync] resolved state branch",{stateBranch:N,stateBranchRoot:o});let E=pm({stateBranchRoot:o,ownEventFileName:t}),I=Cr(E),w=L("restoreOwnEventFileToHead",await gm({stateBranchRoot:o,ownEventFileName:t}));if(d(w))return q(w.message);let R=L("pullBranchRebaseIfPresent",await jr({cwd:o,branch:N}));if(d(R))return q(R.message);m=R.value;let T=L("mergeOwnSnapshot",sd({ownEventPath:E,ownSnapshot:I}));if(d(T))return q(T.message);let F=L("commitOwnEventFileToStateBranch",await ad({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(F))return q(F.message);if(c=F.value.createdCommit,u=F.value.commitSha,logger.info("[sync] sync own result",{createdCommit:c,commitSha:u}),c||i){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:i,stateBranchRoot:o});let re=L("pushStateBranch(initial)",await gn({stateBranchRoot:o,repoRoot:r})),se=re;if(d(re)&&fi(re.message)){logger.info("[sync] non-fast-forward, retrying sync");let $e=L("pullBranchRebaseIfPresent(retry)",await jr({cwd:o,branch:N}));if(d($e))return q($e.message);logger.info("[sync] pull retry result",$e.value);let xt=L("mergeOwnSnapshot(retry)",sd({ownEventPath:E,ownSnapshot:I}));if(d(xt))return q(xt.message);let Ee=L("commitOwnEventFileToStateBranch(retry)",await ad({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(Ee))return q(Ee.message);logger.info("[sync] retry sync result",Ee.value),Ee.value.createdCommit&&(c=!0,u=Ee.value.commitSha),se=L("pushStateBranch(retry)",await gn({stateBranchRoot:o,repoRoot:r}))}if(d(se))return q(se.message);p=se.value,logger.info("[sync] pushed to state branch",p)}else logger.info("[sync] no commit created, skipped push");if(c){logger.info("[sync] resolving final sync commit sha",{stateBranchRoot:o});let re=L("git rev-parse HEAD",await D({args:["rev-parse","HEAD"],cwd:o}));if(d(re))return q(re.message);u=re.value.stdout.trim(),logger.info("[sync] final sync commit sha",u)}return Uo(p?"Synced and pushed":m||c||T.value?"Synced local state":"Already synced"),logger.info("[sync] syncEpiqWithRemote:done",{pulled:m,pushed:p,createdCommit:c,bootstrapped:i,commitSha:u}),l("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,pulled:m,pushed:p,bootstrapped:i})},Hn=async()=>{let e=dd();if(e)return e;logger.info("[sync] syncAndReloadState:start");let t=L("resolveActorId",G());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id"),a("Unable to resolve event log path");let n=mn(t.value);logger.info("[sync] resolved own event file name",{ownEventFileName:n});let r=L("syncEpiqWithRemote",await ym({ownEventFileName:n}));if(d(r))return logger.info("[sync] syncAndReloadState:sync failed",r.message),a(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.info("[sync] loading merged events after sync",{stateBranchRoot:o});let i=L("loadMergedEvents",Kt(o));if(d(i))return a(`Unable to load events. ${i.message}`);logger.info("[sync] loaded merged events after sync",{count:i.value.length});let s=dd();if(s)return s;let c=nd(),u=L("bootStateFromEventLog",cr(i.value));if(d(u))return a(`Unable to boot synced state. ${u.message}`);logger.info("[sync] booted state from synced events"),S({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}});let m=L("restoreNavigationAnchor",od(c));return d(m)?m:(logger.info("[sync] syncAndReloadState:done"),l("Synced",!0))},dd=()=>v().mode===g.DEFAULT?null:(S({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));import{Box as vt}from"ink";import Y from"react";import{Box as Nr,Text as kt}from"ink";import he,{useEffect as hm,useMemo as Cm}from"react";import{ulid as Nm}from"ulid";var md=({text:e,match:t,color:n,highlightColor:r=h.secondary,dimColor:o=!1})=>{if(!t)return he.createElement(kt,{color:n,dimColor:o},e);let i=e.toLowerCase(),s=t.toLowerCase(),c=i.indexOf(s);return c===-1?he.createElement(kt,{color:n,dimColor:o},e):he.createElement(kt,{color:n,dimColor:o},e.slice(0,c),he.createElement(kt,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},pd=Nm(),Em=e=>`${e}`,Sm=e=>{let{pendingNavTarget:t}=ut();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,i=new Set(Q(x.NONE,{breadCrumb:n,contextNode:r,readOnly:v().readOnly,selectedNode:o}));return[...new Set(Object.values(x))].filter(s=>s!=="move").filter(s=>s.length>0).filter(s=>s!==x.PALETTE).map(s=>{let c=Xn(s),u=fr.find(m=>m.intent===c);return{command:s,description:u?.description??`[${s}] Run command`,isAvailable:i.has(s)}}).filter(s=>s.command.toLowerCase().startsWith(e)||e.length>=2&&s.description.toLowerCase().includes(e)).sort((s,c)=>s.isAvailable!==c.isAvailable?s.isAvailable?-1:1:s.command.localeCompare(c.command))},bm=e=>z.text({id:pd,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),Im=(e,t,n)=>z.text({id:Em(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),jo=[],Rm=e=>{gd();let t=b.createNode(bm(v().rootNodeId));d(t)||!nt(t.value)||(jo=[t.value,...e.map((n,r)=>Im(n,r,pd)).map(b.createNode).filter(X).map(({value:n})=>n).filter(nt)],A.navigate({contextNode:t.value,selectedIndex:0}))},gd=()=>{let e=jo.map(t=>t.id);jo=[];for(let t of e)b.deleteNode(t)};function fd({width:e,height:t}){let r=xs().value.trim().toLowerCase(),o=Cm(()=>Sm(r),[r]);hm(()=>(Rm(o),()=>{gd()}),[o]);let i=v().selectedIndex;return he.createElement(Nr,{flexDirection:"column",width:e,height:t-2},he.createElement(Nr,{paddingX:1},he.createElement(kt,{color:h.accent},"Command Palette"),he.createElement(kt,{dimColor:!0}," \u2014 select a command and press enter")),he.createElement(at,{height:t-4,itemHeight:3,selectedIndex:i},o.map((s,c)=>{let u=c===i,m=s.isAvailable?h.accent:h.secondary2,p=s.isAvailable?"":"[unavailable] ";return he.createElement(Nr,{key:s.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:h.secondary,borderStyle:"single"},he.createElement(kt,{color:m,dimColor:!s.isAvailable},u?"\u276F ":" ",he.createElement(md,{text:Mi(s.command),match:r,color:m,dimColor:!s.isAvailable})),he.createElement(Nr,{paddingLeft:2},he.createElement(md,{text:p+s.description,match:r.length>=2?r:"",color:u&&s.isAvailable?h.primary:h.secondary2,dimColor:!s.isAvailable})))})))}import{Box as $m}from"ink";import zo from"react";import Sn from"chalk";import{Box as Ko,Text as vd}from"ink";import En,{useEffect as Am,useMemo as Tm,useState as wm}from"react";var xd=Sn.gray,Mm=Sn.inverse,Pm=Sn.inverse.gray,km={hint:"",hints:[],overlap:0,remainder:""},hd=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},Lm=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=Re(t);return{bg:r=>Sn.bgHex(n).black(r),bgCursor:r=>Sn.bgHex(n).inverse.black(r)}}return oo(t)},Dm=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=hd({value:e,command:t});if(!r)return null;let i=e.slice(r.end).match(/^\s*/)?.[0].length??0,s=r.end+i;return e.slice(s,s+n.length)!==n?null:{start:s,end:s+n.length}},yd=()=>({value:ce.value,cursorPosition:ce.cursorPosition,commandIsPending:ce.commandIsPending,autoCompletion:ce.commandMeta.autoCompletion??km,infoMessage:ce.commandMeta.infoMessage,validationStatus:ce.commandMeta.validity,command:ce.commandMeta.command,inputString:ce.commandMeta.inputString,modifier:ce.commandMeta.modifier}),Fm=(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,Cd=({width:e,mode:t})=>{let[n,r]=wm(yd());Am(()=>{let N=()=>{let I=yd();r(w=>Fm(w,I)?w:I)},E=co(N);return N(),()=>{E()}},[]);let{value:o,cursorPosition:i,infoMessage:s,commandIsPending:c,autoCompletion:u,command:m,modifier:p}=n,y=Tm(()=>{let N=Math.max(0,Math.min(i,o.length)),E=hd({value:o,command:m}),I=Dm({value:o,command:m,modifier:p}),w=m?oo(m):null,R=Lm({command:m,modifier:p}),T=(ae,me)=>{let Lt=E&&me>=E.start&&me<E.end,yt=I&&me>=I.start&&me<I.end;return Lt&&w?w.fg(ae):yt&&R?R.bg(ae):ae},F=(ae,me)=>{let Lt=E&&me>=E.start&&me<E.end,yt=I&&me>=I.start&&me<I.end;return Lt&&w?w.fgCursor(ae):yt&&R?R.bgCursor(ae):Mm(ae)},re=o.slice(0,N),se=o[N]??" ",$e=N<o.length?o.slice(N+1):"",xt=Array.from(re).map((ae,me)=>T(ae,me)).join(""),Ee=F(se,N),Yt=Array.from($e).map((ae,me)=>T(ae,N+1+me)).join("");if(u.hint){let ae=u.hint[u.overlap]??se;Ee=Pm(ae),Yt=xd(u.remainder.slice(1)+$e)}return xd(t===g.PALETTE?"?":":")+xt+Ee+Yt},[o,i,u,m,p]);return En.createElement(Ko,{flexDirection:"column",justifyContent:"flex-start"},En.createElement(Ko,{flexDirection:"column",paddingX:1,borderColor:h.secondary,borderStyle:"round",width:e},En.createElement(Ko,null,En.createElement(vd,null,y),s&&En.createElement(vd,{wrap:"truncate",color:c?h.red:h.secondary2},` ${s} `))))};import Nd from"chalk";import{Box as Bm,Text as Vo}from"ink";import Er from"react";var Om=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Um=(e,t)=>{let n=[],r=0;for(let o of e){let s=(n.length>0?" | ":"").length+o.length;if(r+s>t-4)break;n.push(o),r+=s}return n},Ed=({width:e,availableHints:t})=>{let n=Math.max(0,e-2),r=Um(t,e).join(" | "),o=Nd.hex(h.secondary),i=Nd.hex(h.secondary2),s=o(`\u256D${"\u2500".repeat(n)}\u256E`),c=o(`\u2570${"\u2500".repeat(n)}\u256F`),u=`${o("\u2502")}${i(Om(` ${r} `,n))}${o("\u2502")}`;return Er.createElement(Bm,{flexDirection:"column",width:e},Er.createElement(Vo,null,s),Er.createElement(Vo,null,u),Er.createElement(Vo,null,c))};var bn=({width:e,mode:t,availableHints:n})=>{let r=[],o=0;for(let i of n){let c=(r.length>0?" | ":"").length+i.length;if(o+c>e+2)break;r.push(i),o+=c}return zo.createElement($m,null,t===g.COMMAND_LINE||t===g.PALETTE?zo.createElement(Cd,{width:e,mode:t}):zo.createElement(Ed,{width:e,mode:t,availableHints:n}))};import{Box as gt,Text as Gt}from"ink";import ue,{useEffect as Hm,useMemo as Wm}from"react";import{ulid as Sd}from"ulid";var br=Sd(),_m=()=>[...new Set([...v().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),r=t?.replace("[",""),o=n?.trim();return[r,o]}).filter(e=>e[0]!==void 0&&e[1]!==void 0).sort(([e],[t])=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(([e,t])=>({keys:e,action:t})),jm=e=>z.text({id:br,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),Km=(e,t,n)=>z.text({id:Sd(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),Sr=[],bd=()=>{let e=Sr.filter(n=>n.id!==br).map(n=>n.id),t=Sr.filter(n=>n.id===br).map(n=>n.id);Sr=[];for(let n of[...e,...t])b.deleteNode(n)},Vm=e=>{bd();let t=b.createNode(jm(v().rootNodeId));if(d(t)||!nt(t.value))return logger.error("Could not attach help nodes");Sr=[t.value,...e.map((n,r)=>Km(n,r,br)).map(b.createNode).filter(X).map(({value:n})=>n).filter(nt)],A.navigate({contextNode:t.value,selectedIndex:0})},Id=({width:e,height:t})=>{let n=Wm(()=>_m(),[]);Hm(()=>(Vm(n),()=>{bd()}),[n]);let r=v().selectedIndex;return ue.createElement(gt,{flexDirection:"column",marginTop:3,borderColor:h.secondary,borderStyle:"round",width:e,height:t-2},ue.createElement(gt,{paddingX:1,justifyContent:"center"},ue.createElement(Gt,{color:h.accent},"Help"),ue.createElement(Gt,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),ue.createElement(gt,{paddingX:1,marginTop:1},ue.createElement(gt,{width:20,justifyContent:"flex-end"},ue.createElement(Gt,{color:h.secondary},"Key(s)")),ue.createElement(gt,{flexGrow:1,width:40,paddingLeft:2},ue.createElement(Gt,{color:h.secondary},"Action"))),ue.createElement(at,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:i},s)=>{let c=s===r;return ue.createElement(gt,{paddingX:1,key:`${o}-${i}-${s}`,flexDirection:"row"},ue.createElement(gt,{width:20,justifyContent:"flex-end"},ue.createElement(Gt,{color:h.accent},o)),ue.createElement(gt,{flexGrow:1,width:40,paddingLeft:2},ue.createElement(Gt,{color:c?h.primary:h.secondary2},i)))})))};import zm from"chalk";import{Box as Ir,Text as Ye}from"ink";import Ne from"react";var Rd=({width:e,height:t})=>Ne.createElement(Ir,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},Ne.createElement(Ye,{color:h.accent,bold:!0},"Initialize project"),Ne.createElement(Ye,null,`This folder is not an ${zm.hex(h.accent)("epiq")} project yet.`),Ne.createElement(Ye,{color:h.primary},"To start tracking issues here, we need to initialize a new",Ne.createElement(Ye,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json "),"file in this repository."),Ne.createElement(Ir,{marginTop:1,flexDirection:"column"},Ne.createElement(Ir,null,Ne.createElement(Ye,{color:h.accent}," "),Ne.createElement(Ye,{color:h.primary},"Type "),Ne.createElement(Ye,{backgroundColor:h.secondary}," :init "))),Ne.createElement(Ir,{marginTop:1},Ne.createElement(Ye,{color:h.secondary2},"This will create, commit and push "),Ne.createElement(Ye,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json ")));import{Box as Rr,Text as Oe}from"ink";import ie from"react";var Gm=({isDone:e,command:t,value:n})=>ie.createElement(Rr,null,ie.createElement(Oe,{color:h.accent,dimColor:e},e?" \u2714 ":" "),ie.createElement(Oe,{dimColor:e},"Type "),ie.createElement(Oe,{backgroundColor:h.secondary,dimColor:e}," "+t+" "),n!==void 0&&ie.createElement(ie.Fragment,null,ie.createElement(Oe,{dimColor:e}," "),ie.createElement(Oe,{color:h.secondary,dimColor:e},"<"+n+">"))),qm=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"yes":"no"};function Go({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:i,autoSync:s,isSetAutoSync:c}=it(),u=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:i,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:s,message:"Almost there. Configure auto sync."}],m=u.findIndex(y=>!y.done),p=m===-1?void 0:u[m];return ie.createElement(Rr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},ie.createElement(Oe,{color:h.accent,bold:!0},"Welcome! \u{1F539}"),ie.createElement(Oe,null,"Let's get you started - it's a breeze."),ie.createElement(Oe,{color:h.secondary2},"Remember - you can always search available commands by typing:",ie.createElement(Oe,{color:h.accent}," ? ")),p&&ie.createElement(Oe,{color:h.secondary2},p.message),ie.createElement(Rr,{flexDirection:"column"},u.map((y,N)=>m===-1||N<=m?ie.createElement(Rr,{key:y.key,marginBottom:1},ie.createElement(Gm,{isDone:y.done,command:y.command,value:y.done?qm(y.value):void 0})):null)))}import wr from"chalk";import{Box as Tr,Text as Xe}from"ink";import ne from"react";import{Box as qo,Text as Ym}from"ink";import qt from"react";var Xm=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Ad=({width:e})=>{let{viewMode:t}=H(),{breadCrumb:n,contextNode:r,selectedIndex:o}=v(),i=$(r.id)[o],s=pt(i?.id??r.id,"TICKET"),c=X(s)?s.value:void 0,u=c?.props.tags??[],m=c?.props.assignees??[],p=c?.parentNodeId?!Fo(r.id,c.parentNodeId)&&t==="dense":!1,y=n.map((E,I)=>{let w=I===n.length-1,R=$(E.id),T=w?R?.[o]?.title:void 0;return`${I?" / ":""}${E.title??""}${T?` \u25B8 ${T}`:""}`}).join(""),N=Xm(y,e);return qt.createElement(qo,null,qt.createElement(Ym,{color:h.secondary2},N),p?u.map(E=>qt.createElement(qo,{key:E,paddingLeft:2},qt.createElement(_t,{id:E}))):null,p?m.map(E=>qt.createElement(qo,{key:E,paddingLeft:2},qt.createElement(Wt,{id:E}))):null)};import{Box as Jm,Text as Td}from"ink";import Ar from"react";var Qm=({filters:e})=>Ar.createElement(Jm,{columnGap:1},Ar.createElement(Td,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Ar.createElement(Td,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),wd=Ar.memo(Qm);var Md="0.6.5";import Yo from"chalk";import{Box as Zm,Text as Pd}from"ink";import Xo,{useEffect as ep,useState as tp}from"react";var np=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],kd=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)}},rp=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},op=(e,t,n)=>{let r=kd(e),o=kd(t);return rp({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},ip=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,i=e[r],s=e[Math.min(r+1,e.length-1)];return op(i,s,o)};function Ld({syncStatus:e,autoSync:t}){let[n,r]=tp(0);ep(()=>{if(e.status!=="syncing"){r(0);return}let c=setInterval(()=>{r(u=>u+1)},50);return()=>clearInterval(c)},[e.status]);let o={synced:" ",failed:"retry",syncing:"...",pending:"wait"},s={synced:h.secondary2,failed:h.yellow,pending:h.secondary2,syncing:ip(np,(Math.sin(n*.12)+1)/2)??""}[e.status];return Xo.createElement(Zm,null,Xo.createElement(Pd,null,Yo.hex(h.secondary2).dim(t?"AutoSync: ":"Sync: ")),Xo.createElement(Pd,null,Yo.hex(s)("\u25CF")+Yo.hex(h.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}function Mr({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,eventLog:r,unappliedEvents:o,syncStatus:i,mode:s}=te(),{userName:c,preferredEditor:u,autoSync:m}=H(),p=56,y=process.stdout.columns-p-8,N=r.at(-1)?.id,E=Vn(N??""),I=X(E)?Yi(E.value):"INVALID DATE";return ne.createElement(Tr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?ne.createElement(Xe,null," "):ne.createElement(Tr,{paddingLeft:1},e.length>0?ne.createElement(wd,{filters:e}):ne.createElement(Ad,{width:y})),n==="live"?ne.createElement(Tr,{columnGap:1,paddingRight:2,"max-width":p,overflow:"hidden",justifyContent:"flex-end"},ne.createElement(Ld,{autoSync:!!m,syncStatus:i}),ne.createElement(Xe,null,wr.hex(h.secondary2).dim("Mode: ")+wr.hex(h.secondary2).dim(s.padEnd(8," "))," "),ne.createElement(Dd,{icon:"@",value:c}),ne.createElement(Dd,{icon:"\u276F",value:u}),ne.createElement(Xe,{dimColor:!0,color:h.secondary2},Md+" ")):"",n==="peek"?ne.createElement(Tr,{paddingLeft:1},ne.createElement(Xe,{backgroundColor:h.yellow}," Readonly "),ne.createElement(Xe,{color:h.yellow}," "+o.length+" edits ago at "),ne.createElement(Xe,{backgroundColor:h.yellow,color:h.accent}," "+I+" "),ne.createElement(Xe,{color:h.yellow},". Resume with "),ne.createElement(Xe,{backgroundColor:h.yellow}," :peek now ")):"")}function Dd({icon:e,value:t}){return ne.createElement(Xe,null,wr.dim(e)+wr.hex(h.accent)(` ${t??"-"} `))}import{Box as sp,Text as ap}from"ink";import In from"react";import{Box as Pr,Text as Jo}from"ink";import ft from"react";function Qo(){let e=te(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,s=t?.id?U(t?.id):[];return ft.createElement(Pr,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:h.secondary,width:i},ft.createElement(Pr,{padding:1,paddingTop:0,paddingBottom:0},ft.createElement(Jo,null,"Select a board:")),ft.createElement(Pr,{padding:1,flexDirection:"column"},s.map((c,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,y=U(c.id).flatMap(({id:N})=>$(N)).length;return ft.createElement(Pr,{key:c.id??u},ft.createElement(Jo,{color:m?h.accent:h.secondary2},ft.createElement(xe,{isSelected:m})),ft.createElement(Jo,{color:m?h.accent:h.secondary2},c.title," (",y," issues)",c.readonly?" \u{1F512}":""))})))}var dp=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:s})=>{let{renderedChildrenIndex:c}=te(),u=n.find(({context:N})=>N==="BOARD"),y=i-1-3;return In.createElement(sp,{flexDirection:"row"},e.context==="WORKSPACE"?In.createElement(Qo,null):u?In.createElement(nr,{height:y,width:s,swimlanes:(c[u.id]??[]).filter(N=>N!==void 0&&Ft(N)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):In.createElement(ap,null))},Fd=In.memo(dp);function Zo({width:e,height:t}){let n=te(),r=n.filters;if(n.mode===g.HELP)return Y.createElement(vt,{flexDirection:"column"},Y.createElement(Id,{width:e,height:t}));if(n.mode===g.PALETTE)return Y.createElement(vt,{flexDirection:"column"},Y.createElement(fd,{width:e,height:t}),Y.createElement(bn,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:o}=it(),i=!o,s=o&&!n.hasProjectDefinition;if(i)return Y.createElement(vt,{flexDirection:"column"},Y.createElement(vt,{flexDirection:"column"},Y.createElement(Mr,{hideBreadCrumb:!0,filters:r}),Y.createElement(Go,{height:t,width:e})),Y.createElement(bn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(s)return Y.createElement(vt,{flexDirection:"column"},Y.createElement(vt,{flexDirection:"column"},Y.createElement(Mr,{hideBreadCrumb:!0,filters:r}),Y.createElement(Rd,{height:t,width:e})),Y.createElement(bn,{width:e,mode:n.mode,availableHints:n.availableHints}));let c=Ie(n.breadCrumb??[],"BOARD");if(X(c)){let u=c.value.id,m=U(u).length,p=3,y=Math.floor(e/p),N=Math.floor(e/Math.max(m,1));e=Math.min(N,y)*Math.max(m,p)}return Y.createElement(vt,{flexDirection:"column"},Y.createElement(vt,{flexDirection:"column"},Y.createElement(Mr,{filters:r}),Y.createElement(Fd,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:H().viewMode??"dense",mode:n.mode})),Y.createElement(bn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import cp from"readline";var kr,Lr,Ue,lp=new Set([f.MoveCursorLeft,f.EraseInputWord,f.MoveCursorLeftOfWord,f.MoveCursorRight,f.MoveCursorRightOfWord,f.NavToPreviousContainer,f.NavToNextContainer,f.NavPreviousItem,f.NavNextItem,f.SetViewDense,f.SetViewWide,f.Confirm,f.Exit,f.InitCommandLine,f.InitCommandPalette,f.ExitCommandLine,f.CaptureInput,f.EraseInput,f.EraseInputWord,f.HideHelp,f.ViewHelp,f.SetViewDense,f.SetViewWide,f.GetLastCommandFromHistory,f.GetNextCommandFromHistory,f.AutoCompleteCommand]),Bd=async e=>{if(e.ctrl&&e.name==="c")return A.exit();let{actionIndex:t,mode:n,readOnly:r}=v(),o=bs(e,n);if(!o||r&&!lp.has(o))return;let i=t[n]?.[o];if(i?.action)try{await i.action(i,e)}catch(s){logger.error(s)}},up=()=>async function(t,n){n.name!=="escape"&&(Ue&&(clearTimeout(Ue),Ue=void 0),await Bd(n))},mp=()=>async function(t){if(t.length===1&&t[0]===27){Ue&&clearTimeout(Ue),Ue=setTimeout(()=>{Bd({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Ue=void 0},25);return}Ue&&(clearTimeout(Ue),Ue=void 0)};function Od(){kr&&process.stdin.removeListener("keypress",kr),Lr&&process.stdin.removeListener("data",Lr),kr=up(),Lr=mp(),cp.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Lr),process.stdin.on("keypress",kr)}Ia();gp(`${Dr.bold("Epiq CLI")}
56
+ `,Ao.writeFileSync(t,n,"utf8"),ae.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var Fu=async e=>{let t=await L({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},_=(e,t)=>a(`[${e}] ${t}`),xa=async()=>{let e=Yo(),t=await Je(process.cwd());if(d(t))return _(1,t.message);let n=t.value,r=await An(n);if(d(r))return _(2,r.message);if(r.value)return _(2,"Cannot initialize Epiq while a git operation is in progress");let o=await Fu(n);if(d(o))return _(2.5,o.message);if(o.value)return _(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(kr(n))return _(4,"Epiq project already initialized");let i=Ze();if(!i.isSetupDone||!i.userName)return _(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let s=U(),c=s.userName,u=s.userId;if(!u||!c)return _(5,"Missing Epiq user id");let m=e.stateBranch,g=await wn({repoRoot:n,branch:m});if(d(g))return _(6,g.message);if(g.value)return _(6,`State branch already exists: ${m}`);let y=await ro({repoRoot:n,stateBranchName:m});if(d(y))return _(6,y.message);let N=kn();if(d(N))return _(7,N.message);let E=va.join(Pn(),e.projectId),I=await oo({repoRoot:n,stateBranchRoot:E,stateBranchName:m});if(d(I))return _(8,I.message);let A=va.join(E,".epiq");Du.mkdirSync(A,{recursive:!0});let R=is({userId:u,userName:c});if(d(R))return _(9,R.message);for(let Pr of R.value){let zo=_n({event:Pr,rootDir:E});if(d(zo))return _(9,zo.message)}let M=await Gn({stateBranchRoot:E,eventFileName:rn({userId:u,userName:c})});if(d(M))return _(10,M.message);let $=await wt({cwd:E,message:"[epiq:init]"});if(d($))return _(10,$.message);let Be=await fa(n);if(d(Be))return _(11,Be.message);let be=Jo({repoRoot:n,fileContents:e});if(d(be))return _(12,be.message);let Kt=await K.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(Kt))return _(13,Kt.message);let Cn=await K.commit({cwd:n,message:"[epiq:init-project]"});if(d(Cn))return _(13,Cn.message);let Rt="Project initialized!",Vt=await L({cwd:n,args:["push","-u","origin","HEAD"]});d(Vt)&&(Rt+=` Warn: [init:14] ${Vt.message}`);let oe=await an({repoRoot:n,stateBranchRoot:E});d(oe)&&(Rt+=` Warn: [init:15] ${oe.message}`);let At=yt(R.value).filter(d);if(At.length>0)return _(16,At.map(Pr=>Pr.message).join(`
57
+ `));let gt=ot();if(d(gt))return _(16,gt.message);let{rootNodeId:Rd,nodes:Ad}=gt.value,Vo=Ad[Rd];return Vo?(T.navigate({contextNode:Vo,selectedIndex:0}),S({hasProjectDefinition:!0,mode:p.DEFAULT}),l(Rt,null)):_(16,"Unable to resolve initialized root node")};import{ulid as Uu}from"ulid";import{ulid as Bu}from"ulid";var ya=null,dt=()=>structuredClone(ya),pn=e=>{ya=e},ha=()=>{let{contextNode:e,selectedIndex:t}=v(),r=O(e.id)[t];return r?l("Resolved selected child",r):a("Target node not found")},To=({id:e,parentId:t,position:n={at:"end"}})=>{let r=O(t).filter(o=>o.id!==e);return jn(r,n)},Ca=({id:e,parentId:t,position:n={at:"end"}})=>{let r=z();if(d(r))return a("Unable to resolve user ID");let o=To({parentId:t,id:e,position:n});return d(o)?o:l("Created pending move state",{id:Bu(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Na=e=>{pn(e);let t=en(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function wo(e){let t=ha();if(d(t))return t;let{contextNode:n,nodes:r}=v();if(!n.parentNodeId)return a("Missing parent node id");let o=r[n.parentNodeId];if(!o)return a("Missing parent node");let i=O(o.id),s=i.findIndex(({id:m})=>m===n.id);if(s<0)return a("Current node not found among siblings");let c=i[s+e];if(!c)return a("Missing sibling node");let u=Ca({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:Na(u.value)}function Mo(e){let t=ha();if(d(t))return t;let{contextNode:n,selectedIndex:r}=v(),i=O(n.id)[r+e];if(!i)return a("Missing sibling node");let s=Ca({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return d(s)?s:Na(s.value)}var Ea=()=>{let e=dt();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,r=v().nodes[n];if(!r)return a("Move parent not found");let o=O(n).findIndex(i=>i.id===t);return o===-1?a("Moved node not found among rendered children"):(T.navigate({contextNode:r,selectedIndex:o}),l("Synchronized navigation to moved node",null))},cr=(e,t="Moved preview")=>{if(d(e))return e;let n=Ea();return d(n)?n:(S({mode:p.MOVE}),l(t,null))},Sa=async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=G().commandMeta,{contextNode:n,selectedIndex:r}=v(),o=O(n.id)[r];if(!o)return S({mode:p.DEFAULT}),a("No move target");if(t==="start"){if(o.readonly)return a("Target node is read-only");if(r===-1)return a("No item selected");if(!o.parentNodeId)return a("Target has no parent");let i=O(o.parentNodeId),s=i.findIndex(({id:y})=>y===o.id);if(s===-1)return a("Target not found among siblings");let c=i[s-1],u=i[s+1],m=u!=null?{at:"before",sibling:u.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},g=To({parentId:o.parentNodeId,id:o.id,position:m});return d(g)?g:(pn({id:Uu(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:g.value.rank},...e.value}),S({mode:p.MOVE}),l("Move initialized",null))}if(t==="next")return cr(Mo(1));if(t==="previous")return cr(Mo(-1));if(t==="to-next")return cr(wo(1));if(t==="to-previous")return cr(wo(-1));if(t==="confirm"){let i=dt();if(!i)return a("No pending move to confirm");let s=await Ie();if(d(s))return s;let c=Ae(i,s.value);if(d(c))return c;let u=Ea();return d(u)?u:(pn(null),S({mode:p.DEFAULT}),l("Moved item",null))}return t==="cancel"?(pn(null),S({mode:p.DEFAULT}),l("Cancelling move",null)):a("Invalid move modifier")};import{ulid as lr}from"ulid";import{monotonicFactory as Ou,ulid as $u}from"ulid";var Hu=Ou(),ba=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Hu();return l("Created issue events",[{id:$u(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var Ia=async(e,t)=>{let n=z();if(d(n))return a("Unable to resolve user ID");let r=await Ie();if(d(r))return r;let o=r.value;if(!t.inputString)return a(`provide a name for your ${t.modifier}`);let{breadCrumb:i,contextNode:s,selectedIndex:c}=v(),u=m=>{let g=Ae(m,o);if(d(g))return g;let y=b.getNode(g.value.result.id);if(!y)return a("Created node not found");if(!y.parentNodeId)return g;let N=b.getNode(y.parentNodeId);return N?(T.navigate({contextNode:N,selectedIndex:b.getSiblings(y.parentNodeId).findIndex(({id:E})=>E===y.id)}),g):a("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=v(),g=b.getNode(m);if(!g)return a("Workspace not found");let y=Kn(g.id,n.value,o);return d(y)?y:u({id:lr(),action:"add.board",payload:{id:lr(),name:t.inputString,parent:g.id,rank:y.value},...n.value})}if(t.modifier==="swimlane"){let m=Ce(i,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let g=Kn(m.value.id,n.value,o);return d(g)?g:u({id:lr(),action:"add.swimlane",payload:{id:lr(),name:t.inputString,parent:m.value.id,rank:g.value},...n.value})}if(t.modifier==="issue"){let m=B(s.id)[c],g=s.context==="SWIMLANE"?s:s.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let $=Ce(i,"SWIMLANE");return d($)?null:$.value})();if(!g)return a("Unable to add issue in this context");let y=Kn(g.id,n.value,o);if(d(y))return y;let N=ba({name:t.inputString,parent:g.id,rank:y.value,user:n.value});if(d(N))return N;let E=N.value,I=qi(E,o);if(I.some($=>d($)))return a("Issue create failed: "+I.filter(d).map($=>$.message).filter(Boolean).join(", "));let A=I[0];if(!A||d(A))return a("Issue creation failed");let M=E.find($=>$.action==="add.issue")?.payload.id;return M?(T.navigate({contextNode:g,selectedIndex:b.getSiblings(g.id).findIndex(({id:$})=>$===M)}),l("Issue created",null)):a("Unable to determine ticket id")}return l("Success",null)};var Ra=async()=>{let e=Ce(v().breadCrumb,"BOARD");if(d(e))return e;let t=await Je(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Xe({repoRoot:t.value});if(d(n))throw new Error(n.message);let{modifier:r}=G().commandMeta;if(r==="now"){let I=Lt(n.value);if(d(I))return a(I.message);let A=gn();if(d(A))return A;let M=yt(I.value).filter(d);return M.length>0?a(M.map($=>$.message).join(", ")):(S({mode:p.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),l("Peeking now",!0))}let o;if(r==="prev"){let I=v().eventLog.at(-1),A=qr(I);if(A===null)return a("No previous event to peek");o=A}else if(r==="next"){let I=v().unappliedEvents.at(0),A=qr(I);if(A===null)return a("No next event to peek");o=A+1}else{let I=Jn(r);if(!I)return a("Invalid peek date");o=I.getTime()}let i=v(),s=e.value.id,c=ji(n.value,o);if(d(c))return a(c.message);let{appliedEvents:u,unappliedEvents:m}=c.value,g=gn();if(d(g))return g;let N=yt(u).filter(d);if(N.length>0)return gn(),S(i),a(N.map(I=>I.message).join(", "));let E=v().nodes[s];return E?(T.navigate({contextNode:E,selectedIndex:0}),S({mode:p.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),l("Peeking",!0)):(gn(),S(i),a("Board did not exist at peek date"))};import Wu from"zod";var Aa=()=>{let e=G().commandMeta.inputString,t=Wu.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=St({autoSyncDebounceMs:t.data});return d(n)?n:(Me({autoSyncIntervalMs:t.data}),S({mode:p.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var Ta=()=>{let e=G().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return a("Invalid response");let t=xi(e),n=St({autoSync:t});return d(n)?n:(Me({autoSync:t}),S({mode:p.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var wa=async()=>{F(()=>""),S({mode:p.DEFAULT});let e=ot();if(d(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");S({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await qn();return d(t)?(S({syncStatus:{msg:t.message,status:"failed"}}),t):(S({mode:p.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{useSyncExternalStore as ES}from"react";var ur,_u=new Set,Ma=()=>{for(let e of _u)e()};var ct=()=>{if(!ur)throw new Error("Ui state not initialized. Call initUiState() first.");return ur};var Pa=(e={})=>(ur=e,Ma(),l("UX state initialized",null)),ju=e=>{let t=ct();return ur=e(t),Ma(),l("UX state updated",null)},lt=e=>ju(t=>({...t,...e}));var ka=e=>Object.values(v().tags).find(t=>t.name===e),La=e=>Object.values(v().contributors).find(t=>t.name===e),mr=[{systemOnly:!0,intent:P.Move,description:"Internal move-state command",mode:p.COMMAND_LINE,action:Sa},{intent:P.Delete,description:"Delete the currently selected node",mode:p.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=B(t.id)[n];return r?Se({id:ge(),action:"delete.node",payload:{id:r.id},...e.value}):a("Unable to resolve child to delete")},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=G().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(s=>J(x.FILTER).map(c=>c.split(n)[0]).includes(s))(r))return a("Invalid filter modifier");let i={target:r,operator:"=",value:t.trim()};return Ne(s=>({...s,filters:e==="clear"?[]:[...s.filters,i],mode:p.DEFAULT})),l("Filter updated",null)}},{intent:P.ViewHelp,description:"Open the help screen",mode:p.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return lt({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),S({mode:p.HELP}),l("Viewing help",null)}},{intent:P.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:p.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=B(t.id)[n];if(!r)return a("Unable to close issue, no target found");if(!H(r))return a("Cannot close in this context");let o=v().nodes[He];if(!o)return a("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return a("Issue is already closed");let i=await Ie();if(d(i))return i;let s=i.value,c=eo(o.id,r.id,{at:"end"},e.value,s);if(d(c))return c;let u=await Se({id:ge(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value});return d(u)?u:l("Issue closed",null)},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:p.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=B(t.id)[n];if(!r)return a("Unable to reopen issue, no target found");let o=r.context==="TICKET"?l("Resolved ticket",r):nt(r.id,"TICKET");if(d(o))return a("Cannot reopen in this context");let i=o.value,s=v().nodes[He];if(!s)return a("Unable to locate closed swimlane");if(i.parentNodeId!==s.id)return a("Issue is not closed");if(!H(i))return a("Target node is not issue");let c=ua(i);if(!c)return a("Unable to resolve previous parent from issue history");if(c===s.id)return a("Previous parent resolves to closed swimlane");let u=v().nodes[c];if(!u)return a("Previous parent no longer exists");let m=await Ie();if(d(m))return m;let g=m.value,y=eo(u.id,i.id,{at:"end"},e.value,g);if(d(y))return y;let N=await Se({id:ge(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:y.value},...e.value});return d(N)?N:l("Issue reopened",null)},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.Init,description:"Initialize Epiq in the current git repository",mode:p.COMMAND_LINE,action:xa},{intent:P.NewItem,description:"Create a new board, swimlane, or issue",mode:p.COMMAND_LINE,action:Ia,onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.Rename,description:"itle] Rename the currently selected node",mode:p.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=B(t.id)[n];if(!r)return a("Missing node");if(r.readonly)return a("Cannot rename readonly node");let o=Us();return o?Se({id:ge(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):a("Provide a title")},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.UntagTicket,description:"Remove a tag from the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=G().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let o=ka(r);if(!o)return a(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return a("Invalid untag target");let s=nt(i.id,"TICKET");if(d(s))return a("Unable to untag issue in this context");let c=s.value;return H(c)?(c.props.tags??[]).includes(o.id)?Se({id:ge(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}):a("Issue is not tagged with that tag"):a("Target node is not issue")},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.TagTicket,description:"Add or create a tag on the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=G().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let{selectedNode:o}=v();if(!o)return a("Invalid tag target");let i=nt(o.id,"TICKET");if(d(i))return a("Unable to tag issue in this context");let s=i.value;if(!H(s))return a("Target node is not issue");let c=ka(r),u;if(c)u=c.id;else{let g=ge(),y=await Se({id:ge(),action:"create.tag",payload:{id:g,name:r},...e.value});if(d(y))return y;u=y.value.result.id}return(s.props.tags??[]).includes(u)?a("Already tagged with that tag"):Se({id:ge(),action:"add.issue.tag",payload:{id:s.id,tag:u},...e.value})},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.AssignUserToTicket,description:"Assign a user to the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=G().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee");let{selectedIndex:o,contextNode:i}=v(),s=B(i.id)[o];if(!s)return a("Invalid assign target");let c=nt(s.id,"TICKET");if(d(c))return a("Unable to assign issue in this context");let u=c.value;if(!H(u))return a("Target node is not issue");let m=La(r),g;if(m)g=m.id;else{let N=ge(),E=await Se({id:ge(),action:"create.contributor",payload:{id:N,name:r},...e.value});if(d(E))return E;g=E.value.result.id}return(u.props.assignees??[]).includes(g)?a("Assignee already assigned"):Se({id:ge(),action:"add.issue.assignee",payload:{id:u.id,assignee:g},...e.value})},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=G().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee to remove");let o=La(r);if(!o)return a(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return a("Invalid unassign target");let s=nt(i.id,"TICKET");if(d(s))return a("Unable to unassign in this context");let c=s.value;return H(c)?(c.props.assignees??[]).includes(o.id)?Se({id:ge(),action:"remove.issue.assignee",payload:{id:c.id,assignee:o.id},...e.value}):a(`Issue is not assigned to "${r}"`):a("Target node is not issue")},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.Sync,description:"Pull, commit, and push Epiq state",mode:p.COMMAND_LINE,action:wa},{intent:P.Peek,description:"View board state at another point in time",mode:p.COMMAND_LINE,action:Ra},{intent:P.Export,description:"Export the current board layout to markdown",mode:p.COMMAND_LINE,action:async()=>{let e=await ta();return d(e)?e:(S({mode:p.DEFAULT}),l("Export successful",!0))}},{intent:P.Exit,description:"Exit the application",mode:p.COMMAND_LINE,action:async()=>(T.exit(),l("Exit successful",!0))},{intent:P.Edit,description:"Edit title or description",mode:p.COMMAND_LINE,action:async(e,t)=>{if(t.modifier===it.DESCRIPTION)return ga();if(t.modifier===it.TITLE){let n=z();if(d(n))return a("Unable to resolve user ID");let{contextNode:r,selectedIndex:o}=v(),i=B(r.id)[o];if(!i)return a("Missing node");if(i.readonly)return a("Cannot rename readonly node");let s=t.inputString.trim();return s?Se({id:ge(),action:"edit.title",payload:{id:i.id,name:s},...n.value}):a("Provide a title")}return a("Unknown edit command")},onSuccess:()=>S({mode:p.DEFAULT})},{intent:P.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:p.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case ne.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=U(),s=n||i,c=r??ge();if(!s||!c)return a("Unable to resolve user name or id");let u=St({userName:s,userId:c,preferredEditor:o??""});return d(u)?u:(Me({userName:s,userId:c}),S({mode:p.DEFAULT}),l(`Username set to "${s}"`,null))}case ne.EDITOR:{if(!n)return a("No editor provided");let r=St({preferredEditor:n});return d(r)?r:(Me({preferredEditor:n}),S({mode:p.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case ne.VIEW:return n!=="wide"&&n!=="dense"?a("Invalid view mode"):(Me({viewMode:n}),l(`View set to "${n}"`,null));case ne.AUTOSYNC:return Ta();case ne.SYNC_DEBOUNCE_MS:return Aa();default:return a("Unknown config command")}}}];var Ku=new Set(["peek","filter","view-help"]),Le=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=G();if(!t)return a("No command to confirm");if(!e&&n===Ct.Invalid)return a("Invalid command");let i=tr(t);ks();let{readOnly:s}=v();if(s&&!Ku.has(i))return ln({status:qe.Fail,message:"Command not available in readonly state",value:null});let c=mr.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!c)return ln({status:qe.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return ln({status:qe.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?ln(u):(Ls({addToHistory:!e}),c.onSuccess?.(),U().autoSync&&vs(),u)};var pr=[{intent:f.Exit,mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(S({mode:p.COMMAND_LINE}),F(()=>"move cancel"),Le({isForceExecutedBySystem:!0}))},{intent:f.InitMove,mode:p.DEFAULT,description:"[m] move (init/confirm)",action:()=>(S({mode:p.COMMAND_LINE}),F(()=>"move start"),Le({isForceExecutedBySystem:!0}))},{intent:f.ConfirmMove,mode:p.MOVE,action:()=>(S({mode:p.COMMAND_LINE}),F(()=>"move confirm"),Le({isForceExecutedBySystem:!0}))}],gr=[{intent:f.MovePreviousItem,mode:p.MOVE,action:()=>dt()?(S({mode:p.COMMAND_LINE}),F(()=>"move previous"),Le({isForceExecutedBySystem:!0})):a("No pending move")},{intent:f.MoveNextItem,mode:p.MOVE,action:()=>dt()?(S({mode:p.COMMAND_LINE}),F(()=>"move next"),Le({isForceExecutedBySystem:!0})):a("No pending move")}],Da=[{intent:f.MoveToNextContainer,mode:p.MOVE,action:()=>dt()?(S({mode:p.COMMAND_LINE}),F(()=>"move to-next"),Le({isForceExecutedBySystem:!0})):a("No pending move")},{intent:f.MoveToPreviousContainer,mode:p.MOVE,action:()=>dt()?(S({mode:p.COMMAND_LINE}),F(()=>"move to-previous"),Le({isForceExecutedBySystem:!0})):a("No pending move")}];var Fa={[w.WORKSPACE]:[...pr,...gr],[w.BOARD]:[...pr,...gr],[w.SWIMLANE]:[...pr,...gr,...Da],[w.TICKET]:[],[w.FIELD]:[],[w.FIELD_LIST]:[],[w.TEXT]:[]};var Ba=()=>{F(()=>"");let{pendingNavTarget:e}=ct();S({mode:p.DEFAULT}),e&&T.navigate(e),lt({pendingNavTarget:void 0})},Ua=[{intent:f.ExitCommandLine,mode:p.HELP,action:()=>(Ba(),l("Exiting help",null))},{intent:f.Exit,mode:p.HELP,action:()=>(Ba(),l("Closed help",null))},{intent:f.NavPreviousItem,mode:p.HELP,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:f.NavNextItem,mode:p.HELP,action:()=>(T.navigateToNextItem(),l("Navigating to next help item",null))},{intent:f.NavToPreviousContainer,mode:p.HELP,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:f.NavToNextContainer,mode:p.HELP,action:()=>(T.navigateToNextContainer(),l("Navigating to next help container",null))}];var Vu=e=>{S({mode:p.COMMAND_LINE});let{pendingNavTarget:t}=ct();t&&T.navigate(t),lt({pendingNavTarget:void 0}),F(()=>`${e} `)},Oa=()=>{F(()=>"");let{pendingNavTarget:e}=ct();e&&T.navigate(e),lt({pendingNavTarget:void 0}),S({mode:p.DEFAULT})},$a=[{intent:f.InitCommandPalette,mode:p.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{F(()=>"");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return lt({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),S({mode:p.PALETTE}),l("Opening command palette",null)}},{intent:f.Confirm,mode:p.PALETTE,action:()=>{let{selectedNode:e}=v();if(!e||!et(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?(Vu(t),l("Selected command",t)):l("No command selected",null)}},{intent:f.ExitCommandLine,mode:p.PALETTE,action:()=>(Oa(),l("Exiting palette",null))},{intent:f.Exit,mode:p.PALETTE,action:()=>(Oa(),l("Closed command palette",null))},{intent:f.NavPreviousItem,mode:p.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:f.NavNextItem,mode:p.PALETTE,action:()=>(T.navigateToNextItem(),l("Navigating to next item",null))},{intent:f.NavToPreviousContainer,mode:p.PALETTE,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:f.NavToNextContainer,mode:p.PALETTE,action:()=>(T.navigateToNextContainer(),l("Navigating to next container",null))}];var Ha=[...Ua,...$a,{intent:f.AddItem,mode:p.DEFAULT,description:"[n] new...",action:()=>(S({mode:p.COMMAND_LINE}),F(()=>`${x.NEW} `),l("Adding new item",null))},{intent:f.Delete,mode:p.DEFAULT,description:"[d] delete",action:()=>(S({mode:p.COMMAND_LINE}),F(()=>`${x.DELETE} `),l("Deleting item",null))},{intent:f.InitCommandLine,mode:p.DEFAULT,description:"[:] focus command line",action:()=>(S({mode:p.COMMAND_LINE}),F(()=>""),l("Entering command line mode",null))},{intent:f.Confirm,mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!O(e?.id??"")?.length){if(e?.title===X.DESCRIPTION)return S({mode:p.COMMAND_LINE}),F(()=>`${x.EDIT} description `),l("Propose command",!0);if(e?.title===X.ASSIGNEES)return S({mode:p.COMMAND_LINE}),F(()=>`${x.ASSIGN} `),l("Propose command",!0);if(e?.title===X.TAGS)return S({mode:p.COMMAND_LINE}),F(()=>`${x.TAG} `),l("Propose command",!0);if(t.title===X.DESCRIPTION&&e?.context==="TEXT")return S({mode:p.COMMAND_LINE}),F(()=>`${x.EDIT} description `),l("Propose command",!0)}return T.enterChildNode(),l("Entering context",null)}},{intent:f.EditTitle,mode:p.DEFAULT,description:"[r] rename title",action:()=>(S({mode:p.COMMAND_LINE}),F(()=>`${x.EDIT} title ${v().selectedNode?.title}`),l("Exiting context",null))},{intent:f.EditDescription,mode:p.DEFAULT,description:"[e] edit description",action:()=>(S({mode:p.COMMAND_LINE}),F(()=>`${x.EDIT} description `),l("Exiting context",null))},{intent:f.Exit,mode:p.DEFAULT,description:"[q] exit context",action:()=>(T.enterParentNode(),l("Exiting context",null))},{intent:f.NavPreviousItem,mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:f.NavNextItem,mode:p.DEFAULT,action:()=>(T.navigateToNextItem(),l("Navigating to next item",null))},{intent:f.NavToPreviousContainer,mode:p.DEFAULT,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:f.NavToNextContainer,mode:p.DEFAULT,action:()=>(T.navigateToNextContainer(),l("Navigating to next container",null))}];var zu=500,Gu=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Wa=e=>{let t=Gu(e);t&&F(n=>(n+t).slice(0,zu))};var qu=[p.COMMAND_LINE,p.PALETTE],Yu=e=>[{intent:f.MoveCursorLeft,mode:e,action:()=>(xo(-1),l("Moving cursor left",null))},{intent:f.MoveCursorRight,mode:e,action:()=>(xo(1),l("Moving cursor right",null))},{intent:f.MoveCursorLeftOfWord,mode:e,action:()=>(yo("left"),l("Moving cursor left of word",null))},{intent:f.MoveCursorRightOfWord,mode:e,action:()=>(yo("right"),l("Moving cursor right of word",null))},{intent:f.AutoCompleteCommand,mode:e,action:()=>(F((t,{remainder:n})=>n?t+n:t),l("Auto-completing command",null))},{intent:f.CaptureInput,mode:e,action:(t,{sequence:n})=>(Wa(n??""),l("Capturing input",null))},{intent:f.EraseInput,mode:e,action:()=>(Ms(),l("Erasing input",null))},{intent:f.EraseInputWord,mode:e,action:()=>(Ps(),l("Erasing input word",null))}],_a=[{intent:f.Confirm,mode:p.COMMAND_LINE,action:()=>(Le(),l("Executing command",null))},{intent:f.ViewHelp,mode:p.DEFAULT,action:()=>(S({mode:p.HELP}),l("Viewing help",null))},...qu.flatMap(Yu),{intent:f.ExitCommandLine,mode:p.COMMAND_LINE,action:()=>(S({mode:p.DEFAULT}),l("Exiting command line",null))},{intent:f.GetLastCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(Ds(),l("Getting last command from history",null))},{intent:f.GetNextCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(Fs(),l("Getting next command from history",null))}];import Va from"chalk";var fr=Va.dim.hex(h.secondary2)(": for command line"),ja="q to exit",Ka=`${Va.hex(h.accent)("m")} to confirm`,Po={[w.WORKSPACE]:[fr],[w.BOARD]:[fr],[w.BOARD+p.COMMAND_LINE]:[fr],[w.SWIMLANE]:[fr],[w.TICKET+p.HELP]:[ja],[w.SWIMLANE+p.HELP]:[ja],[w.TICKET]:[],[w.FIELD]:[],[w.SWIMLANE+p.MOVE]:[Ka],[w.TICKET+p.MOVE]:[Ka]};var fn=e=>e.trim().toLocaleLowerCase(),Xu=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},Ju=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},za=(e,t)=>{let n=fn(t.value);if(!n)return!0;switch(t.target){case"title":return fn(e.title??"").includes(n);case"description":return fn(e.props.description??"").includes(n);case"tag":return Xu(e).map(fn).some(o=>o.includes(n));case"assignee":return Ju(e).map(fn).some(o=>o.includes(n));default:return!0}};function Ga(e,t,n){let r=t[e];if(!r)return a("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let s=o[o.length-1];return!s||s.id!==n?a("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var qa=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 bt,ko,Lo=new Set,Ya=()=>{for(let e of Lo)e()},Zu=e=>(Lo.add(e),()=>Lo.delete(e));function Xa(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return a("derive(): contextNodeId is missing");if(!r)return a("derive(): rootNode is missing");if(!o[r])return a("derive(): unable to find root node");let c=o[t];if(!c)return a("Unable to derive state, contextNode not found");let u=Ga(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:g}=c,y=Po[g+n]??Po[g]??[],N=[...Ha,...Fa[g]??[],..._a],E=qa(N),I=em(o,i),A=I[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:y,availableActions:N,actionIndex:E,selectedNode:A,renderedChildrenIndex:I})}var v=()=>{if(!bt)throw new Error("State not initialized. Call initWorkspaceState() first.");return bt},ot=()=>bt?l("Retrieved state",bt):a("State not initialized. Call initWorkspaceState() first.");function tn(e){ko=e;let t=Ye(process.cwd()),n=!1;if(!d(t)){let i=Qe(t.value);if(d(i))return a(i.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:p.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},o=Xa(r);return d(o)?o:(bt=o.value,Ya(),l("State initialized",null))}function Ne(e){let t=v(),n=e(t),r=Xa(n);return d(r)?a(r.message??"Unable to update state"):(bt=r.value,Ya(),l("State updated",null))}var S=e=>Ne(t=>({...t,...e}));var ee=()=>Qu(Zu,v,v),em=(e,t)=>{let n={};for(let r of Object.values(e))H(r)&&t.length>0&&!t.every(o=>za(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let s=e[o.id],c=e[i.id];return!s||!c?0:s.rank.localeCompare(c.rank)});return n},B=e=>v()?.renderedChildrenIndex[e]??[],gn=()=>ko?tn(ko):a("Cannot reset state: no initial workspace found"),Dt=()=>bt!==void 0;import{Box as vr,Text as It}from"ink";import fe,{useEffect as tm,useMemo as nm}from"react";import{ulid as rm}from"ulid";var Ja=({text:e,match:t,color:n,highlightColor:r=h.secondary,dimColor:o=!1})=>{if(!t)return fe.createElement(It,{color:n,dimColor:o},e);let i=e.toLowerCase(),s=t.toLowerCase(),c=i.indexOf(s);return c===-1?fe.createElement(It,{color:n,dimColor:o},e):fe.createElement(It,{color:n,dimColor:o},e.slice(0,c),fe.createElement(It,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},Qa=rm(),om=e=>`${e}`,im=e=>{let{pendingNavTarget:t}=ct();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,i=new Set(J(x.NONE,{breadCrumb:n,contextNode:r,readOnly:v().readOnly,selectedNode:o}));return[...new Set(Object.values(x))].filter(s=>s!=="move").filter(s=>s.length>0).filter(s=>s!==x.PALETTE).map(s=>{let c=tr(s),u=mr.find(m=>m.intent===c);return{command:s,description:u?.description??`[${s}] Run command`,isAvailable:i.has(s)}}).filter(s=>s.command.toLowerCase().startsWith(e)||e.length>=2&&s.description.toLowerCase().includes(e)).sort((s,c)=>s.isAvailable!==c.isAvailable?s.isAvailable?-1:1:s.command.localeCompare(c.command))},sm=e=>V.text({id:Qa,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),am=(e,t,n)=>V.text({id:om(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),Do=[],dm=e=>{Za();let t=b.createNode(sm(v().rootNodeId));d(t)||!et(t.value)||(Do=[t.value,...e.map((n,r)=>am(n,r,Qa)).map(b.createNode).filter(Y).map(({value:n})=>n).filter(et)],T.navigate({contextNode:t.value,selectedIndex:0}))},Za=()=>{let e=Do.map(t=>t.id);Do=[];for(let t of e)b.deleteNode(t)};function ed({width:e,height:t}){let r=Bs().value.trim().toLowerCase(),o=nm(()=>im(r),[r]);tm(()=>(dm(o),()=>{Za()}),[o]);let i=v().selectedIndex;return fe.createElement(vr,{flexDirection:"column",width:e,height:t-2},fe.createElement(vr,{paddingX:1},fe.createElement(It,{color:h.accent},"Command Palette"),fe.createElement(It,{dimColor:!0}," \u2014 select a command and press enter")),fe.createElement(st,{height:t-4,itemHeight:3,selectedIndex:i},o.map((s,c)=>{let u=c===i,m=s.isAvailable?h.accent:h.secondary2,g=s.isAvailable?"":"[unavailable] ";return fe.createElement(vr,{key:s.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:h.secondary,borderStyle:"single"},fe.createElement(It,{color:m,dimColor:!s.isAvailable},u?"\u276F ":" ",fe.createElement(Ja,{text:Ci(s.command),match:r,color:m,dimColor:!s.isAvailable})),fe.createElement(vr,{paddingLeft:2},fe.createElement(Ja,{text:g+s.description,match:r.length>=2?r:"",color:u&&s.isAvailable?h.primary:h.secondary2,dimColor:!s.isAvailable})))})))}import{Box as Nm}from"ink";import Uo from"react";import xn from"chalk";import{Box as Fo,Text as td}from"ink";import vn,{useEffect as cm,useMemo as lm,useState as um}from"react";var nd=xn.gray,mm=xn.inverse,pm=xn.inverse.gray,gm={hint:"",hints:[],overlap:0,remainder:""},od=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},fm=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=Ee(t);return{bg:r=>xn.bgHex(n).black(r),bgCursor:r=>xn.bgHex(n).inverse.black(r)}}return Gr(t)},vm=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=od({value:e,command:t});if(!r)return null;let i=e.slice(r.end).match(/^\s*/)?.[0].length??0,s=r.end+i;return e.slice(s,s+n.length)!==n?null:{start:s,end:s+n.length}},rd=()=>({value:se.value,cursorPosition:se.cursorPosition,commandIsPending:se.commandIsPending,autoCompletion:se.commandMeta.autoCompletion??gm,infoMessage:se.commandMeta.infoMessage,validationStatus:se.commandMeta.validity,command:se.commandMeta.command,inputString:se.commandMeta.inputString,modifier:se.commandMeta.modifier}),xm=(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,id=({width:e,mode:t})=>{let[n,r]=um(rd());cm(()=>{let N=()=>{let I=rd();r(A=>xm(A,I)?A:I)},E=vo(N);return N(),()=>{E()}},[]);let{value:o,cursorPosition:i,infoMessage:s,commandIsPending:c,autoCompletion:u,command:m,modifier:g}=n,y=lm(()=>{let N=Math.max(0,Math.min(i,o.length)),E=od({value:o,command:m}),I=vm({value:o,command:m,modifier:g}),A=m?Gr(m):null,R=fm({command:m,modifier:g}),M=(oe,ce)=>{let At=E&&ce>=E.start&&ce<E.end,gt=I&&ce>=I.start&&ce<I.end;return At&&A?A.fg(oe):gt&&R?R.bg(oe):oe},$=(oe,ce)=>{let At=E&&ce>=E.start&&ce<E.end,gt=I&&ce>=I.start&&ce<I.end;return At&&A?A.fgCursor(oe):gt&&R?R.bgCursor(oe):mm(oe)},Be=o.slice(0,N),be=o[N]??" ",Kt=N<o.length?o.slice(N+1):"",Cn=Array.from(Be).map((oe,ce)=>M(oe,ce)).join(""),Rt=$(be,N),Vt=Array.from(Kt).map((oe,ce)=>M(oe,N+1+ce)).join("");if(u.hint){let oe=u.hint[u.overlap]??be;Rt=pm(oe),Vt=nd(u.remainder.slice(1)+Kt)}return nd(t===p.PALETTE?"?":":")+Cn+Rt+Vt},[o,i,u,m,g]);return vn.createElement(Fo,{flexDirection:"column",justifyContent:"flex-start"},vn.createElement(Fo,{flexDirection:"column",paddingX:1,borderColor:h.secondary,borderStyle:"round",width:e},vn.createElement(Fo,null,vn.createElement(td,null,y),s&&vn.createElement(td,{wrap:"truncate",color:c?h.red:h.secondary2},` ${s} `))))};import sd from"chalk";import{Box as ym,Text as Bo}from"ink";import xr from"react";var hm=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Cm=(e,t)=>{let n=[],r=0;for(let o of e){let s=(n.length>0?" | ":"").length+o.length;if(r+s>t-4)break;n.push(o),r+=s}return n},ad=({width:e,availableHints:t})=>{let n=Math.max(0,e-2),r=Cm(t,e).join(" | "),o=sd.hex(h.secondary),i=sd.hex(h.secondary2),s=o(`\u256D${"\u2500".repeat(n)}\u256E`),c=o(`\u2570${"\u2500".repeat(n)}\u256F`),u=`${o("\u2502")}${i(hm(` ${r} `,n))}${o("\u2502")}`;return xr.createElement(ym,{flexDirection:"column",width:e},xr.createElement(Bo,null,s),xr.createElement(Bo,null,u),xr.createElement(Bo,null,c))};var yn=({width:e,mode:t,availableHints:n})=>{let r=[],o=0;for(let i of n){let c=(r.length>0?" | ":"").length+i.length;if(o+c>e+2)break;r.push(i),o+=c}return Uo.createElement(Nm,null,t===p.COMMAND_LINE||t===p.PALETTE?Uo.createElement(id,{width:e,mode:t}):Uo.createElement(ad,{width:e,mode:t,availableHints:n}))};import{Box as ut,Text as _t}from"ink";import de,{useEffect as Em,useMemo as Sm}from"react";import{ulid as dd}from"ulid";var hr=dd(),bm=()=>[...new Set([...v().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),r=t?.replace("[",""),o=n?.trim();return[r,o]}).filter(e=>e[0]!==void 0&&e[1]!==void 0).sort(([e],[t])=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(([e,t])=>({keys:e,action:t})),Im=e=>V.text({id:hr,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),Rm=(e,t,n)=>V.text({id:dd(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),yr=[],cd=()=>{let e=yr.filter(n=>n.id!==hr).map(n=>n.id),t=yr.filter(n=>n.id===hr).map(n=>n.id);yr=[];for(let n of[...e,...t])b.deleteNode(n)},Am=e=>{cd();let t=b.createNode(Im(v().rootNodeId));if(d(t)||!et(t.value))return logger.error("Could not attach help nodes");yr=[t.value,...e.map((n,r)=>Rm(n,r,hr)).map(b.createNode).filter(Y).map(({value:n})=>n).filter(et)],T.navigate({contextNode:t.value,selectedIndex:0})},ld=({width:e,height:t})=>{let n=Sm(()=>bm(),[]);Em(()=>(Am(n),()=>{cd()}),[n]);let r=v().selectedIndex;return de.createElement(ut,{flexDirection:"column",marginTop:3,borderColor:h.secondary,borderStyle:"round",width:e,height:t-2},de.createElement(ut,{paddingX:1,justifyContent:"center"},de.createElement(_t,{color:h.accent},"Help"),de.createElement(_t,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),de.createElement(ut,{paddingX:1,marginTop:1},de.createElement(ut,{width:20,justifyContent:"flex-end"},de.createElement(_t,{color:h.secondary},"Key(s)")),de.createElement(ut,{flexGrow:1,width:40,paddingLeft:2},de.createElement(_t,{color:h.secondary},"Action"))),de.createElement(st,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:i},s)=>{let c=s===r;return de.createElement(ut,{paddingX:1,key:`${o}-${i}-${s}`,flexDirection:"row"},de.createElement(ut,{width:20,justifyContent:"flex-end"},de.createElement(_t,{color:h.accent},o)),de.createElement(ut,{flexGrow:1,width:40,paddingLeft:2},de.createElement(_t,{color:c?h.primary:h.secondary2},i)))})))};import Tm from"chalk";import{Box as Cr,Text as ze}from"ink";import xe from"react";var ud=({width:e,height:t})=>xe.createElement(Cr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},xe.createElement(ze,{color:h.accent,bold:!0},"Initialize project"),xe.createElement(ze,null,`This folder is not an ${Tm.hex(h.accent)("epiq")} project yet.`),xe.createElement(ze,{color:h.primary},"To start tracking issues here, we need to initialize a new",xe.createElement(ze,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json "),"file in this repository."),xe.createElement(Cr,{marginTop:1,flexDirection:"column"},xe.createElement(Cr,null,xe.createElement(ze,{color:h.accent}," "),xe.createElement(ze,{color:h.primary},"Type "),xe.createElement(ze,{backgroundColor:h.secondary}," :init "))),xe.createElement(Cr,{marginTop:1},xe.createElement(ze,{color:h.secondary2},"This will create, commit and push "),xe.createElement(ze,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json ")));import{Box as Nr,Text as De}from"ink";import re from"react";var wm=({isDone:e,command:t,value:n})=>re.createElement(Nr,null,re.createElement(De,{color:h.accent,dimColor:e},e?" \u2714 ":" "),re.createElement(De,{dimColor:e},"Type "),re.createElement(De,{backgroundColor:h.secondary,dimColor:e}," "+t+" "),n!==void 0&&re.createElement(re.Fragment,null,re.createElement(De,{dimColor:e}," "),re.createElement(De,{color:h.secondary,dimColor:e},"<"+n+">"))),Mm=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"yes":"no"};function Oo({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:i,autoSync:s,isSetAutoSync:c}=Ze(),u=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:i,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:s,message:"Almost there. Configure auto sync."}],m=u.findIndex(y=>!y.done),g=m===-1?void 0:u[m];return re.createElement(Nr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},re.createElement(De,{color:h.accent,bold:!0},"Welcome! \u{1F539}"),re.createElement(De,null,"Let's get you started - it's a breeze."),re.createElement(De,{color:h.secondary2},"Remember - you can always search available commands by typing:",re.createElement(De,{color:h.accent}," ? ")),g&&re.createElement(De,{color:h.secondary2},g.message),re.createElement(Nr,{flexDirection:"column"},u.map((y,N)=>m===-1||N<=m?re.createElement(Nr,{key:y.key,marginBottom:1},re.createElement(wm,{isDone:y.done,command:y.command,value:y.done?Mm(y.value):void 0})):null)))}import br from"chalk";import{Box as Sr,Text as Ge}from"ink";import te from"react";import{Box as $o,Text as Pm}from"ink";import jt from"react";var km=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",md=({width:e})=>{let{viewMode:t}=U(),{breadCrumb:n,contextNode:r,selectedIndex:o}=v(),i=O(r.id)[o],s=nt(i?.id??r.id,"TICKET"),c=Y(s)?s.value:void 0,u=c?.props.tags??[],m=c?.props.assignees??[],g=c?.parentNodeId?!jr(r.id,c.parentNodeId)&&t==="dense":!1,y=n.map((E,I)=>{let A=I===n.length-1,R=O(E.id),M=A?R?.[o]?.title:void 0;return`${I?" / ":""}${E.title??""}${M?` \u25B8 ${M}`:""}`}).join(""),N=km(y,e);return jt.createElement($o,null,jt.createElement(Pm,{color:h.secondary2},N),g?u.map(E=>jt.createElement($o,{key:E,paddingLeft:2},jt.createElement(Ht,{id:E}))):null,g?m.map(E=>jt.createElement($o,{key:E,paddingLeft:2},jt.createElement($t,{id:E}))):null)};import{Box as Lm,Text as pd}from"ink";import Er from"react";var Dm=({filters:e})=>Er.createElement(Lm,{columnGap:1},Er.createElement(pd,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Er.createElement(pd,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),gd=Er.memo(Dm);var fd="0.6.7";import Ho from"chalk";import{Box as Fm,Text as vd}from"ink";import Wo,{useEffect as Bm,useState as Um}from"react";var Om=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],xd=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)}},$m=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},Hm=(e,t,n)=>{let r=xd(e),o=xd(t);return $m({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Wm=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,i=e[r],s=e[Math.min(r+1,e.length-1)];return Hm(i,s,o)};function yd({syncStatus:e,autoSync:t}){let[n,r]=Um(0);Bm(()=>{if(e.status!=="syncing"){r(0);return}let c=setInterval(()=>{r(u=>u+1)},50);return()=>clearInterval(c)},[e.status]);let o={synced:" ",failed:"retry",syncing:"...",pending:"wait"},s={synced:h.secondary2,failed:h.yellow,pending:h.secondary2,syncing:Wm(Om,(Math.sin(n*.12)+1)/2)??""}[e.status];return Wo.createElement(Fm,null,Wo.createElement(vd,null,Ho.hex(h.secondary2).dim(t?"AutoSync: ":"Sync: ")),Wo.createElement(vd,null,Ho.hex(s)("\u25CF")+Ho.hex(h.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}function Ir({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,eventLog:r,unappliedEvents:o,syncStatus:i,mode:s}=ee(),{userName:c,preferredEditor:u,autoSync:m}=U(),g=56,y=process.stdout.columns-g-8,N=r.at(-1)?.id,E=On(N??""),I=Y(E)?Bi(E.value):"INVALID DATE";return te.createElement(Sr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?te.createElement(Ge,null," "):te.createElement(Sr,{paddingLeft:1},e.length>0?te.createElement(gd,{filters:e}):te.createElement(md,{width:y})),n==="live"?te.createElement(Sr,{columnGap:1,paddingRight:2,"max-width":g,overflow:"hidden",justifyContent:"flex-end"},te.createElement(yd,{autoSync:!!m,syncStatus:i}),te.createElement(Ge,null,br.hex(h.secondary2).dim("Mode: ")+br.hex(h.secondary2).dim(s.padEnd(8," "))," "),te.createElement(hd,{icon:"@",value:c}),te.createElement(hd,{icon:"\u276F",value:u}),te.createElement(Ge,{dimColor:!0,color:h.secondary2},fd+" ")):"",n==="peek"?te.createElement(Sr,{paddingLeft:1},te.createElement(Ge,{backgroundColor:h.yellow}," Readonly "),te.createElement(Ge,{color:h.yellow}," "+o.length+" edits ago at "),te.createElement(Ge,{backgroundColor:h.yellow,color:h.accent}," "+I+" "),te.createElement(Ge,{color:h.yellow},". Resume with "),te.createElement(Ge,{backgroundColor:h.yellow}," :peek now ")):"")}function hd({icon:e,value:t}){return te.createElement(Ge,null,br.dim(e)+br.hex(h.accent)(` ${t??"-"} `))}import{Box as _m,Text as jm}from"ink";import hn from"react";import{Box as Rr,Text as _o}from"ink";import mt from"react";function jo(){let e=ee(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,s=t?.id?B(t?.id):[];return mt.createElement(Rr,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:h.secondary,width:i},mt.createElement(Rr,{padding:1,paddingTop:0,paddingBottom:0},mt.createElement(_o,null,"Select a board:")),mt.createElement(Rr,{padding:1,flexDirection:"column"},s.map((c,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,y=B(c.id).flatMap(({id:N})=>O(N)).length;return mt.createElement(Rr,{key:c.id??u},mt.createElement(_o,{color:m?h.accent:h.secondary2},mt.createElement(pe,{isSelected:m})),mt.createElement(_o,{color:m?h.accent:h.secondary2},c.title," (",y," issues)",c.readonly?" \u{1F512}":""))})))}var Km=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:s})=>{let{renderedChildrenIndex:c}=ee(),u=n.find(({context:N})=>N==="BOARD"),y=i-1-3;return hn.createElement(_m,{flexDirection:"row"},e.context==="WORKSPACE"?hn.createElement(jo,null):u?hn.createElement(ar,{height:y,width:s,swimlanes:(c[u.id]??[]).filter(N=>N!==void 0&&Mt(N)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):hn.createElement(jm,null))},Cd=hn.memo(Km);function Ko({width:e,height:t}){let n=ee(),r=n.filters;if(n.mode===p.HELP)return q.createElement(pt,{flexDirection:"column"},q.createElement(ld,{width:e,height:t}));if(n.mode===p.PALETTE)return q.createElement(pt,{flexDirection:"column"},q.createElement(ed,{width:e,height:t}),q.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:o}=Ze(),i=!o,s=o&&!n.hasProjectDefinition;if(i)return q.createElement(pt,{flexDirection:"column"},q.createElement(pt,{flexDirection:"column"},q.createElement(Ir,{hideBreadCrumb:!0,filters:r}),q.createElement(Oo,{height:t,width:e})),q.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(s)return q.createElement(pt,{flexDirection:"column"},q.createElement(pt,{flexDirection:"column"},q.createElement(Ir,{hideBreadCrumb:!0,filters:r}),q.createElement(ud,{height:t,width:e})),q.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}));let c=Ce(n.breadCrumb??[],"BOARD");if(Y(c)){let u=c.value.id,m=B(u).length,g=3,y=Math.floor(e/g),N=Math.floor(e/Math.max(m,1));e=Math.min(N,y)*Math.max(m,g)}return q.createElement(pt,{flexDirection:"column"},q.createElement(pt,{flexDirection:"column"},q.createElement(Ir,{filters:r}),q.createElement(Cd,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:U().viewMode??"dense",mode:n.mode})),q.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import Vm from"readline";var Ar,Tr,Fe,zm=new Set([f.MoveCursorLeft,f.EraseInputWord,f.MoveCursorLeftOfWord,f.MoveCursorRight,f.MoveCursorRightOfWord,f.NavToPreviousContainer,f.NavToNextContainer,f.NavPreviousItem,f.NavNextItem,f.SetViewDense,f.SetViewWide,f.Confirm,f.Exit,f.InitCommandLine,f.InitCommandPalette,f.ExitCommandLine,f.CaptureInput,f.EraseInput,f.EraseInputWord,f.HideHelp,f.ViewHelp,f.SetViewDense,f.SetViewWide,f.GetLastCommandFromHistory,f.GetNextCommandFromHistory,f.AutoCompleteCommand]),Nd=async e=>{if(e.ctrl&&e.name==="c")return T.exit();let{actionIndex:t,mode:n,readOnly:r}=v(),o=js(e,n);if(!o||r&&!zm.has(o))return;let i=t[n]?.[o];if(i?.action)try{await i.action(i,e)}catch(s){logger.error(s)}},Gm=()=>async function(t,n){n.name!=="escape"&&(Fe&&(clearTimeout(Fe),Fe=void 0),await Nd(n))},qm=()=>async function(t){if(t.length===1&&t[0]===27){Fe&&clearTimeout(Fe),Fe=setTimeout(()=>{Nd({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Fe=void 0},25);return}Fe&&(clearTimeout(Fe),Fe=void 0)};function Ed(){Ar&&process.stdin.removeListener("keypress",Ar),Tr&&process.stdin.removeListener("data",Tr),Ar=Gm(),Tr=qm(),Vm.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Tr),process.stdin.on("keypress",Ar)}Pa();Xm(`${wr.bold("Epiq CLI")}
63
58
 
64
- ${Dr.dim("Boot in directory:")}
65
- ${Dr.cyan("$ epiq")}
59
+ ${wr.dim("Boot in directory:")}
60
+ ${wr.cyan("$ epiq")}
66
61
 
67
- `,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}});var Ud=process.stdout.columns||120,$d=process.stdout.rows||20,Fr=null,vp=e=>{try{return Fr?(Fr.rerender(e),l("Rerendered app",void 0)):(Fr=pp(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${$o(t)}`)}},Hd=()=>vp(fp.createElement(Zo,{width:Ud,height:$d}));async function xp(){try{let e=Gs();X(e)&&De(e.value);let t=Qe(process.cwd()),n=[];if(X(t)){let i=t.value,s=await ld(i);d(s)&&logger.debug(3,s.message);let c=Ze({repoRoot:t.value});if(d(c))return zt(3,c.message);let u=Kt(c.value);if(d(u))return zt(3,u.message);n=u.value}let r=cr(n);if(d(r))return zt(4,r.message);S({hasProjectDefinition:X(t),hasInitializingEvents:!!n.length});let o=Hd();return d(o)?zt(6,o.message):(Od(),l("Booted Epiq",void 0))}catch(e){return zt(0,$o(e))}}process.stdout.on("resize",()=>{if(Ud=process.stdout.columns||120,$d=process.stdout.rows||20,!Fr)return;let e=Hd();d(e)&&logger.info(`[boot:resize] ${e.message}`)});(async()=>{console.clear();let e=await xp();d(e)&&(logger.info(e.message),console.error(Dr.red(`Failed to boot Epiq:
62
+ `,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}});var Sd=process.stdout.columns||120,bd=process.stdout.rows||20,Mr=null,Qm=e=>{try{return Mr?(Mr.rerender(e),l("Rerendered app",void 0)):(Mr=Ym(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${no(t)}`)}},Id=()=>Qm(Jm.createElement(Ko,{width:Sd,height:bd}));async function Zm(){try{let e=la();Y(e)&&Me(e.value);let t=Ye(process.cwd()),n=[];if(Y(t)){let i=Xe({repoRoot:t.value});if(d(i))return Ft(3,i.message);let s=Lt(i.value);if(d(s))return Ft(3,s.message);n=s.value}let r=zn(n);if(d(r))return Ft(4,r.message);S({hasProjectDefinition:Y(t),hasInitializingEvents:!!n.length});let o=Id();return d(o)?Ft(6,o.message):(Ed(),l("Booted Epiq",void 0))}catch(e){return Ft(0,no(e))}}process.stdout.on("resize",()=>{if(Sd=process.stdout.columns||120,bd=process.stdout.rows||20,!Mr)return;let e=Id();d(e)&&logger.info(`[boot:resize] ${e.message}`)});(async()=>{console.clear();let e=await Zm();d(e)&&(logger.info(e.message),console.error(wr.red(`Failed to boot Epiq:
68
63
  ${e.message}`)),process.exitCode=1)})();