epiq 0.6.20 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,63 +1,66 @@
1
1
  #!/usr/bin/env node
2
- import Fr from"chalk";import{render as pp}from"ink";import gp from"meow";import fp from"react";import Gr from"node:fs";import nc from"node:os";import Le from"node:path";import Yt from"node:fs";import{ulid as Kd}from"ulid";import{z as wn}from"zod";var qe={None:"none",Success:"success",Fail:"fail"},a=e=>({status:qe.Fail,message:e,value:null}),c=(e,t)=>({status:qe.Success,message:e,value:t}),d=e=>e.status==="fail",J=e=>e.status==="success";import Gt from"node:fs";import $e from"node:path";var Sp=process.env.IS_LOCAL==="true",_e=".epiq",he=".epiq-global",In="events",jd="project.json",Rn=e=>$e.join(e,_e),An=e=>$e.join(Rn(e),jd),qt=e=>$e.join(Rn(e),In),ni=e=>$e.join(e,_e),Vd=e=>{let t=$e.join(e,_e);return Gt.existsSync(t)&&Gt.statSync(t).isDirectory()},Ur=e=>{let t=An(e);return Gt.existsSync(t)&&Gt.statSync(t).isFile()},Tn=e=>{let t=$e.resolve(e);for(;;){if(Vd(t))return c("Resolved closest .epiq root",t);let n=$e.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},Ye=e=>{let t=$e.resolve(e);for(;;){if(Ur(t))return c("Resolved closest epiq project root",t);let n=$e.dirname(t);if(n===t)return a("No .epiq/project.json found in any parent");t=n}},ri=e=>{let t=qt(e);try{return Gt.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return a(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},Re=async()=>{let e=await Je(process.cwd());if(d(e))return e;let t=Xe({repoRoot:e.value});return d(t)?t:c("Resolved persist root",t.value)};var zd="__epiq_state__",Gd=wn.object({projectId:wn.string().min(1),stateBranch:wn.string().min(1),createdAt:wn.iso.datetime()}),Mn=()=>({projectId:Kd(),stateBranch:zd,createdAt:new Date().toISOString()}),Qe=e=>{let t=An(e);if(!Yt.existsSync(t))return a("Missing .epiq/project.json");try{let n=Yt.readFileSync(t,"utf8"),r=JSON.parse(n),o=Gd.safeParse(r);return o.success?c("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")}},oi=e=>{let t=Qe(e);return d(t)?a(t.message):c("Read projectId",t.value.projectId)},ii=({repoRoot:e,fileContents:t})=>{let n=Rn(e),r=An(e);try{if(Yt.mkdirSync(n,{recursive:!0}),Yt.existsSync(r)){let o=Qe(e);return d(o)?a(o.message):c("Project already initialized",null)}return Yt.writeFileSync(r,JSON.stringify(t,null,2)+`
3
- `,"utf8"),c("Created project.json",null)}catch(o){return a(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var $r=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let s=r(...i);if(!n.has(s)){let l=e(...i).then(u=>(d(u)&&n.delete(s),u));n.set(s,l)}return n.get(s)});return o.clear=()=>n.clear(),o};import Xt from"fs";import jr from"path";import qd from"util";var si=1e3,Yd=50,_r=0,ai=()=>process.env.EPIQ_MCP==="true",di=()=>{let e=process.cwd(),t=Tn(e);return d(t)?ai()?jr.join(process.cwd(),".epiq-mcp.log"):void 0:jr.join(t.value,_e,"log","epiq.log")};function Xd(){let e=di();if(!e||!Xt.existsSync(e))return;let n=Xt.readFileSync(e,"utf8").split(`
4
- `);if(n[n.length-1]===""&&n.pop(),n.length<=si)return;let r=n.slice(-si).join(`
2
+ import Ut from"chalk";import{render as Xg}from"ink";import Jg from"meow";import Qg from"react";import zp from"chalk";var xt={None:"none",Success:"success",Fail:"fail"},a=e=>({status:xt.Fail,message:e,value:null}),l=(e,t)=>({status:xt.Success,message:e,value:t}),d=e=>e.status==="fail",Q=e=>e.status==="success";import{spawn as Yc}from"node:child_process";import br from"node:process";var Hs=e=>{let t=br.platform==="darwin"?"open":br.platform==="win32"?"cmd":"xdg-open",n=br.platform==="win32"?["/c","start","",e]:[e];Yc(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as $p}from"node:fs/promises";import Wp from"node:http";import Zt from"node:path";import{fileURLToPath as _p}from"node:url";import{decodeTime as Up,ulid as ve}from"ulid";import Pr from"node:fs";import cl from"node:os";import Ve from"node:path";import bn from"node:fs";import{ulid as Qc}from"ulid";import{z as ro}from"zod";import hn from"node:fs";import rt from"node:path";var mf=process.env.IS_LOCAL==="true",st=".epiq",ke=".epiq-global",eo="events",Xc="project.json",to=e=>rt.join(e,st),no=e=>rt.join(to(e),Xc),In=e=>rt.join(to(e),eo),Vs=e=>rt.join(e,st),Jc=e=>{let t=rt.join(e,st);return hn.existsSync(t)&&hn.statSync(t).isDirectory()},Cr=e=>{let t=no(e);return hn.existsSync(t)&&hn.statSync(t).isFile()},oo=e=>{let t=rt.resolve(e);for(;;){if(Jc(t))return l("Resolved closest .epiq root",t);let n=rt.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},_e=e=>{let t=rt.resolve(e);for(;;){if(Cr(t))return l("Resolved closest epiq project root",t);let n=rt.dirname(t);if(n===t)return a("No .epiq/project.json found in any parent");t=n}},Gs=e=>{let t=In(e);try{return hn.mkdirSync(t,{recursive:!0}),l("Resolved events dir",t)}catch(n){return a(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},je=async()=>{let e=await ht(process.cwd());if(d(e))return e;let t=Oe({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};var Zc="__epiq_state__",el=ro.object({projectId:ro.string().min(1),stateBranch:ro.string().min(1),createdAt:ro.iso.datetime()}),tn=()=>({projectId:Qc(),stateBranch:Zc,createdAt:new Date().toISOString()}),It=e=>{let t=no(e);if(!bn.existsSync(t))return a("Missing .epiq/project.json");try{let n=bn.readFileSync(t,"utf8"),o=JSON.parse(n),r=el.safeParse(o);return r.success?l("Read project.json",r.data):a(`Invalid .epiq/project.json: ${r.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return a(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Ks=e=>{let t=It(e);return d(t)?a(t.message):l("Read projectId",t.value.projectId)},zs=({repoRoot:e,fileContents:t})=>{let n=to(e),o=no(e);try{if(bn.mkdirSync(n,{recursive:!0}),bn.existsSync(o)){let r=It(e);return d(r)?a(r.message):l("Project already initialized",null)}return bn.writeFileSync(o,JSON.stringify(t,null,2)+`
3
+ `,"utf8"),l("Created project.json",null)}catch(r){return a(r instanceof Error?`Failed to initialize project: ${r.message}`:"Failed to initialize project")}};var Nr=(e,t)=>{let n=new Map,o=t??((...s)=>JSON.stringify(s)),r=((...s)=>{let i=o(...s);if(!n.has(i)){let c=e(...s).then(u=>(d(u)&&n.delete(i),u));n.set(i,c)}return n.get(i)});return r.clear=()=>n.clear(),r};import Cn from"fs";import Tr from"path";import tl from"util";var qs=1e3,nl=50,Sr=0,Ys=()=>process.env.EPIQ_MCP==="true",Xs=()=>{let e=process.cwd(),t=oo(e);return d(t)?Ys()?Tr.join(process.cwd(),".epiq-mcp.log"):void 0:Tr.join(t.value,st,"log","epiq.log")};function ol(){let e=Xs();if(!e||!Cn.existsSync(e))return;let n=Cn.readFileSync(e,"utf8").split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=qs)return;let o=n.slice(-qs).join(`
5
5
  `)+`
6
- `;Xt.writeFileSync(e,r,"utf8")}function Wr(e,t,n=!1){let r=di();if(!r)return;let o=qd.format(...t),i=new Date,l=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
7
- `;Xt.mkdirSync(jr.dirname(r),{recursive:!0}),Xt.appendFileSync(r,l,"utf8"),_r++,_r>=Yd&&(_r=0,Xd())}var Hr=()=>ai()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",de={info(...e){let t=Hr();(t==="info"||t==="debug")&&Wr("[Info]",e,!1)},debug(...e){Hr()==="debug"&&Wr("[Debug]",e,!0)},error(...e){let t=Hr();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;Wr("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=de;import{spawn as Jd}from"node:child_process";import Pn from"node:fs";import Jt from"node:path";var G={stage:({cwd:e,pathspec:t})=>k({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>k({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>k({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>k({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>k({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 k({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>k({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>k({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>k({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>k({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"):c("Resolved state branch",n.value.stateBranch)},ye="origin";var ci=1e4,Qd={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},ui=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Pn.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=Jd("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Qd}),i=!1,s="",l="",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 ${ci}ms`].join(`
8
- `);u(n?{stdout:s,stderr:g,exitCode:124}:a(g))},ci);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",g=>{s+=g}),o.stderr.on("data",g=>{l+=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 h=g??1;if(n){u({stdout:s,stderr:l,exitCode:h});return}if(h!==0){u(a([`git ${e.join(" ")}`,l.trim()||s.trim()||"Git command failed"].filter(Boolean).join(`
10
- `)));return}u(c("Git command succeeded",{stdout:s,stderr:l,exitCode:h}))})}),k=({args:e,cwd:t})=>ui({args:e,cwd:t,allowFail:!1}),Pe=({args:e,cwd:t})=>ui({args:e,cwd:t,allowFail:!0}),wt=async({cwd:e,message:t})=>{let n=await G.commit({cwd:e,message:t});if(d(n))return a(`Failed to create commit
11
- ${n.message}`);let r=await k({args:["rev-parse","HEAD"],cwd:e});return d(r)?a(`Commit created, but failed to read HEAD SHA
12
- ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},Zd=async e=>{let t=await k({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return a(t.message);let n=t.value.stdout.trim();return c("Resolved git dir",Jt.isAbsolute(n)?n:Jt.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"};for(let[i,s]of Object.entries(r))if(Pn.existsSync(Jt.join(n,i)))return c("Checked for in-progress Git operation",s);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[i,s]of Object.entries(o))if(Pn.existsSync(Jt.join(n,i)))return c("Checked for in-progress Git operation",s);return c("Checked for in-progress Git operation",null)},Ln=async e=>{let t=await ec(e);return d(t)?a(t.message):c("Checked for in-progress Git operation",t.value!==null)},Vr=async({repoRoot:e})=>{let n=(await Pe({args:["remote","get-url",ye],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},kn=async({repoRoot:e,branch:t})=>{let n=await Pe({args:["ls-remote","--heads",ye,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${ye}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},Dn=async({repoRoot:e,branch:t})=>{let n=await Pe({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):a(n.stderr.trim()||`Unable to inspect branch ${t}`)},li=e=>{try{return Pn.realpathSync.native(e)}catch{return Jt.resolve(e)}},mi=async({repoRoot:e,worktreeRoot:t})=>{let n=await k({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=li(t),o=n.value.stdout.split(`
13
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(li).includes(r);return c("Checked worktree registration",o)},Kr=async e=>{let t=await Pe({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Fn=async e=>{let t=await k({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):c("Resolved current branch",t.value.stdout.trim())},pi=async e=>{let t=await k({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},gi=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),tc=async e=>(await Pe({cwd:e,args:["rebase","--abort"]})).exitCode===0?c("Aborted stale rebase",!0):c("No rebase to abort",!1);var zr=async({cwd:e,branch:t})=>{let n=await kn({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return c("Remote branch missing, skipped pull",!1);let r=await tc(e);if(d(r))return a(r.message);let o=await G.fetch({cwd:e,remote:ye,branch:t});if(d(o))return a(`Failed to fetch ${t}
14
- ${o.message}`);let i=await G.pullRebase({cwd:e,remote:ye,branch:t});return d(i)?a(`Failed during pull --rebase
15
- ${i.message}`):c("Pulled with rebase",!0)},fi=async e=>{let t=await Pe({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?c("No staged changes",!1):t.exitCode===1?c("Has staged changes",!0):a(t.stderr.trim()||"Unable to inspect staged changes")};var vi=async e=>{let t=await Fn(e);return d(t)?a(t.message):c("Checked detached HEAD state",t.value==="HEAD")};var hi="4b825dc642cb6eb9a060e54bf8d69288fbee4904",qr=e=>Le.join(_e,In,e),yi=()=>Le.join(nc.homedir(),he),On=()=>Le.join(yi(),"worktrees"),Xe=({repoRoot:e})=>{let t=oi(e);return d(t)?a(t.message):c("Resolved state branch root",Le.join(On(),t.value))},rc=e=>Le.join(e,_e),xi=e=>Le.join(rc(e),In);var Qt=e=>{try{return Gr.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},Bn=()=>{let e=Qt(yi());if(d(e))return a(`Ensure epiq home failed.
16
- `+e.message);let t=Qt(On());return d(t)?a(`Ensure worktrees dir failed.
17
- `+t.message):c("Ensured epiq storage",!0)},Ei=e=>{Gr.existsSync(e)&&(de.debug("[sync] remove path",e),Gr.rmSync(e,{recursive:!0,force:!0}))};var Ci=(e,t)=>{for(let n of[xi(e),xi(t)]){let r=Qt(n);if(d(r))return a(r.message)}return c("Ensured state branch",void 0)},Ni=async e=>{let t=await k({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return a(`ensure state branch is storage only failed
18
- `+t.message);let r=t.value.stdout.trim().split(`
19
- `).filter(Boolean).filter(s=>s!==_e);if(r.length===0)return c("State branch is storage-only",!1);let o=await k({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):c("Cleaned storage branch",!0)},Je=$r(async(e=process.cwd())=>{let t=await k({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?a("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>Le.resolve(e)),pg=$r(async e=>{let t=await k({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 c("Resolved git dir",r)},e=>Le.resolve(e));import{Box as gt}from"ink";import z from"react";import{useSyncExternalStore as oc}from"react";var Zt={logLevel:"info",autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Yr=new Set,ic=()=>{for(let e of Yr)e()},$=()=>Zt,bi=()=>oc(e=>(Yr.add(e),()=>{Yr.delete(e)}),()=>Zt),Ee=e=>(Zt={...Zt,...e},ic(),Zt);var Ze=()=>{let e=$(),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}},Si=()=>{let e=Ye(process.cwd());if(d(e))return!1;let t=Qe(e.value);return J(t)},Ii=e=>e===!0?"on":e===!1?"off":null,Ri=e=>e==="on"?!0:e==="off"?!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?c("Found node",n):a("Unable to find node in breadcrumb")};import{useSyncExternalStore as gm}from"react";var w={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Xr(e){return e.context===w.WORKSPACE}function B(e){return e.context===w.TICKET}function et(e){return e.context===w.TEXT}function tt(e){return e.context===w.FIELD}function en(e){return e.context===w.FIELD_LIST}var Mt=e=>e.context===w.SWIMLANE,Ai=e=>e.context===w.BOARD;var Ti=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",wi=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Mi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Pi=(e,t)=>{if(wi(e,e.sequence))return f.MoveCursorLeftOfWord;if(Mi(e,e.sequence))return f.MoveCursorRightOfWord;if(Ti(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}},Li=(e,t)=>{if(wi(e,e.sequence))return f.MoveCursorLeftOfWord;if(Mi(e,e.sequence))return f.MoveCursorRightOfWord;if(Ti(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}};function Un(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var $n=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",ki=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),Di=e=>e.charAt(0).toUpperCase()+e.slice(1);var Fi=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},Oi=(e,t)=>t?e.get(t)??[]:[];var Bi=new WeakMap,sc=e=>{let t=Bi.get(e);return t||(t=Fi(e),Bi.set(e,t)),t};var Ui=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Oi(sc(e),r).filter(i=>Un(r,i)>=n)};var ac={hint:"",hints:[],overlap:0,remainder:""},$i=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return ac;let o=Ui({wordList:r,inputToMatch:e,overlapThreshold:1});return dc(t,o)},dc=(e,t)=>{let n=t[0]??"",r=Un(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),s=r<(o??"").length,l=!!i,g=(l&&s?o:n)+(l&&s?":":" "),h=g.slice(r);return{hint:g,hints:t,overlap:r,remainder:h}};import{ulid as uc}from"ulid";var Pt=24n,cc=Pt*4n,We=(1n<<cc)-1n,lc=/^[0-9a-f]+$/;function _i(e){return!e||!lc.test(e)?a(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function Ae(e,t=Pt){if(e<0n)return a("Negative rank not allowed");let n=e.toString(16);return c("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function me(e,t){if(!e&&!t)return Ae(We/2n,Pt);let n=e?_i(e):c("Resolved lower bound",0n);if(d(n))return n;let r=t?_i(t):c("Resolved upper bound",We);if(d(r))return r;let o=n.value,i=r.value;if(i<=o)return Ae(We/2n,Pt);let s=(o+i)/2n;return s===o||s===i?a("No rank space available between neighbors"):Ae(s,Pt)}function Wi(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=We*BigInt(r+1)/(t+1n),i=Ae(o,Pt);if(d(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var Jr=(e,t)=>{let n=U(e),r=Wi(n.length);if(d(r))return r;let o={};for(let i=0;i<n.length;i++){let s=n[i],l=r.value[i];if(!s||!l)return a("Unable to assign rebalance rank");o[s.id]=l}return c("Created rebalance event",{id:uc(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};var Q={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 c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return a(`No ancestor found for context: ${t}`)},Qr=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},vt=(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=vt(r,"edit");if(o)return o;let i={...r,props:{...r.props,description:t}};return this.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return a("Rename target node not found");let r=vt(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("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 U(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=vt(o,"move");if(s)return s;if(Qr(t,e))return a("Cannot move node into its own descendant");let l={...o,parentNodeId:t,rank:n};return this.updateNode(l),c("Moved node successfully",l)},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 U(m.id))s(g.id)}};s(e);let l={...structuredClone(t)};for(let u of i){if(!l[u])return a("Unable to locate node to delete");l[u]={...l[u],isDeleted:!0}}return n?(N({nodes:l}),c("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"):c("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=vt(r,"edit");if(o)return o;if(!B(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),c("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=vt(r,"edit");if(o)return o;if(!B(r))return a("Target is not an issue");let i=r.props.assignees??[];if(!i.includes(t))return c("Issue is not assigned to that contributor",{assignee:t});let s={...r,props:{...r.props,assignees:i.filter(l=>l!==t)}};return this.updateNode(s),c("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=vt(r,"edit");if(o)return o;if(!B(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),c("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=vt(r,"edit");if(o)return o;if(!B(r))return a("Target is not an issue");let i=r.props.tags??[];if(!i.includes(t))return c("Issue is not tagged with that tag",{tag:t});let s={...r,props:{...r.props,tags:i.filter(l=>l!==t)}};return this.updateNode(s),c("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"):c("Tag created",e)},createNode(e){let t=Ne(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?a("Unable to create node"):c("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):c("Locked node",n)},updateNode(e){let t=Ne(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:c("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings(e){return U(e)}};var q={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 ht from"chalk";import Ji from"string-width";import{decodeTime as Cc}from"ulid";import Lt from"chalk";var oe={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},y={accent:oe.cyan,accent2:oe.magenta,primary:oe.white,secondary:oe.grayDark,secondary2:oe.grayLight,gray:oe.gray,green:oe.green,yellow:oe.yellow,red:oe.red};var E={red:oe.red,yellow:oe.yellow,green:oe.green,blue:oe.blue,magenta:oe.magenta,cyan:oe.cyan},xt={urgent:E.red,critical:E.red,important:E.red,blocker:E.red,asap:E.red,immediate:E.red,fail:E.red,failure:E.red,broken:E.red,bug:E.red,error:E.red,incident:E.red,outage:E.red,production:E.red,crash:E.red,security:E.red,warning:E.yellow,warn:E.yellow,risky:E.yellow,risk:E.yellow,attention:E.yellow,pending:E.yellow,review:E.yellow,"needs-review":E.yellow,qa:E.yellow,testing:E.yellow,test:E.yellow,validate:E.yellow,verification:E.yellow,staging:E.yellow,check:E.yellow,"follow-up":E.yellow,followup:E.yellow,waiting:E.yellow,blocked:E.yellow,hold:E.yellow,done:E.green,complete:E.green,completed:E.green,success:E.green,ok:E.green,stable:E.green,resolved:E.green,fixed:E.green,closed:E.green,merged:E.green,released:E.green,deployed:E.green,approved:E.green,verified:E.green,working:E.green,healthy:E.green,pass:E.green,passing:E.green,info:E.blue,information:E.blue,note:E.blue,docs:E.blue,documentation:E.blue,doc:E.blue,guide:E.blue,help:E.blue,explanation:E.blue,detail:E.blue,details:E.blue,context:E.blue,design:E.blue,discussion:E.blue,proposal:E.blue,idea:E.blue,feature:E.magenta,enhancement:E.magenta,improvement:E.magenta,refactor:E.magenta,refactoring:E.magenta,cleanup:E.magenta,optimize:E.magenta,optimization:E.magenta,perf:E.magenta,performance:E.magenta,upgrade:E.magenta,migration:E.magenta,modernize:E.magenta,debt:E.magenta,todo:E.cyan,next:E.cyan,planned:E.cyan,plan:E.cyan,future:E.cyan,backlog:E.cyan,investigate:E.cyan,explore:E.cyan,prototype:E.cyan};var mc=[0,0,0],to=.2,eo={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Hi=(e,t,n)=>Math.max(t,Math.min(n,e)),Zr=(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},pc=e=>e.toLowerCase().trim(),gc=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,s=e/60,l=i*(1-Math.abs(s%2-1)),u=0,m=0,g=0;s>=0&&s<1?(u=i,m=l):s>=1&&s<2?(u=l,m=i):s>=2&&s<3?(m=i,g=l):s>=3&&s<4?(m=l,g=i):s>=4&&s<5?(u=l,g=i):(u=i,g=l);let h=o-i/2;return[Math.round((u+h)*255),Math.round((m+h)*255),Math.round((g+h)*255)]},Vi=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,fc=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},Ki=(e,t,n)=>{let r=Hi(n,0,1);return[Math.round(Zr(e[0],t[0],r)),Math.round(Zr(e[1],t[1],r)),Math.round(Zr(e[2],t[2],r))]},vc=(e,t=to)=>Ki(e,mc,t),xc=(e,t=to)=>Vi(vc(fc(e),t)),hc=(e,t,n)=>Ki(e,t,n),tn=e=>{let n=ji(e)%360,r=gc(n,eo.stringColor.saturation,eo.stringColor.lightness);return Vi(r)},be=(e,t=xt)=>{let n=pc(e);return n&&t[n]?t[n]:tn(n)},zi=(e,t=xt,n=to)=>xc(be(e,t),n),yc=e=>{let t=eo.gradient.stops,n=Hi(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 hc(t[i],t[i+1],s)},_n=e=>ji(e.toLowerCase().trim())/4294967295,Gi=e=>{let t=_n(e);return yc(t)},Ec=e=>{let[t,n,r]=Gi(e);return{normal:o=>Lt.bgRgb(t,n,r).black(o),cursor:o=>Lt.bgRgb(t,n,r).white.bold(o)}},no=e=>{let[t,n,r]=Gi(e);return{fg:o=>Lt.rgb(t,n,r)(o),fgCursor:o=>Lt.rgb(t,n,r).inverse(o),bg:o=>Lt.bgRgb(t,n,r).black(o),bgCursor:o=>Lt.bgRgb(t,n,r).white.bold(o)}},Wn=e=>Ec(e).normal(` ${e} `);import{decodeTime as qi}from"ulid";var Yi=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"},Xi=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())}`},Hn=e=>{try{return c("Decoded date",new Date(qi(e)))}catch(t){return a("Decoding failed + "+t.message)}},ro=e=>{if(!e?.id)return null;try{return qi(e.id)}catch{return null}};var Nc=(e,t)=>e+" ".repeat(Math.max(0,t-Ji(e))),bc=(e,t)=>" ".repeat(Math.max(0,t-Ji(e)))+e,Sc=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`),Ic=(e,t)=>t?e<t?"up":e>t?"down":null:null,Rc=(e,t)=>{let n=b.getNode(e.payload.parent),r=n?ht.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let i=Ic(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},Ac=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?ht.bgHex(be(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?ht.bgHex(be(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?ht.hex(be(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?ht.hex(be(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""}},Tc=e=>{let t=Yi(Cc(e));return ht.gray(bc(t,8))},wc=12,Mc=e=>Nc(`${e}`,wc),Qi=(e,t)=>{let n=Tc(e.id),r=Mc(e.userName),o=ht.dim("\u203A"),i=e.action==="move.node"?Rc(e,t):[Sc(e.action),Ac(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};import{createHash as Pc}from"node:crypto";var Lc="0123456789ABCDEFGHJKMNPQRSTVWXYZ",kc=e=>{let t=Pc("sha256").update(e).digest(),n=0n;for(let o=0;o<16;o++)n=n<<8n|BigInt(t[o]);let r="";for(let o=0;o<26;o++){let i=BigInt((25-o)*5);r+=Lc[Number(n>>i&31n)]}return r},rt=(e,t)=>kc(`${e}:virtual:${t}`);var Dc=e=>rt(e,"description"),Fc=e=>rt(e,"assignees"),Oc=e=>rt(e,"tags"),Bc=e=>rt(e,"history"),Zi=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:i=!1,childRenderAxis:s="horizontal"})=>{let l=b.getNode(e);if(!l){let g=b.createNode({...q.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:s});return d(g)?g:c("Virtual field created",void 0)}if(!tt(l))return a(`Existing virtual node ${e} is not a field`);if(!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==i||l.childRenderAxis!==s))return c("Virtual field unchanged",void 0);let m=b.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:i,childRenderAxis:s});return d(m)?m:c("Virtual field updated",void 0)},es=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let s=b.getNode(e);if(!s){let m=b.createNode({...q.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return d(m)?m:c("Virtual field list created",void 0)}if(!en(s))return a(`Existing virtual node ${e} is not a field list`);if(!(s.title!==t||s.parentNodeId!==n||s.rank!==r||s.readonly!==o||s.childRenderAxis!==i))return c("Virtual field list unchanged",void 0);let u=b.updateNode({...s,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:i});return d(u)?u:c("Virtual field list updated",void 0)},ts=e=>{let t=Ae(We/4n),n=Ae(We/2n),r=Ae(We*3n/4n),o=Ae(We*7n/8n);if(d(t))return t;if(d(n))return n;if(d(r))return r;if(d(o))return o;let i=Zi({id:Dc(e.id),name:Q.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(i))return i;let s=es({id:Fc(e.id),name:Q.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(s))return s;let l=es({id:Oc(e.id),name:Q.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(d(l))return l;let u=Zi({id:Bc(e.id),name:Q.HISTORY,parentNodeId:e.id,rank:o.value,value:Uc(e),readonly:!0,childRenderAxis:"vertical"});return d(u)?u:c("Ticket virtual nodes materialized",void 0)},Uc=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=>Qi(r,n.get(r.action)??[])).join(`
21
- `)};var $c=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[He,jn]=$c;var L=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),ns=e=>{let t=b.getNode(e);if(!t||!B(t)||t.isDeleted)return null;let n=ts(t);return d(n)?n:null},_c=e=>{for(let t of e){let n=ns(t);if(n)return n;let r=v().nodes[t]?.parentNodeId;if(!r)continue;let o=ns(r);if(o)return o}return null},Wc=(e,t)=>{let n=b.getNode(e);n&&b.updateNode({...n,log:[...n.log??[],t]})},Hc=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},jc=e=>{switch(e.action){case"delete.node":case"edit.description":return Hc(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[]}},Vc=e=>{Ne(t=>({...t,eventLog:[...t.eventLog,e]}))},Kc=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?L("Invalid user ID format",e):c("Valid user",null)},zc=(e,t)=>{let n=Kc(e);if(d(n))return n;let r=[...new Set(jc(e))];t||(r.forEach(i=>Wc(i,e)),Vc(e));let o=_c(r);return o||null},Gc={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=q.workspace(t,n,r),i=rn(o);if(d(i))return L(i.message,e);let s=b.createNode(o);return d(s)?L(s.message??"Failed to initialize workspace",e):Xr(s.value)?c("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(q.workspace(t,n,r));return d(o)?L(o.message??"Failed to add workspace",e):Xr(o.value)?c("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(q.board(t,n,r,o));return d(i)?L(i.message??"Unable to create board",e):Ai(i.value)?c("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(q.swimlane(t,n,r,o));return d(i)?L(i.message??"Unable to create swimlane",e):Mt(i.value)?c("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(q.ticket(t,n,r,o));return d(i)?L(i.message??"Unable to create issue",e):B(i.value)?c("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(q.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(Q.DESCRIPTION)?"vertical":"horizontal"}));return d(s)?L(s.message??`Unable to create field: ${n}`,e):tt(s.value)?c("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 L(`Unable to locate node with id ${t}`,e);let o=b.renameNode(t,n);return d(o)?L(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=b.tombstoneNode(t);return d(n)?L(n.message??"Unable to delete node",e):c("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)?L(r.message??"Unable to create tag",e):c("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)?L(r.message??"Unable to create contributor",e):c("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)?L(r.message??"Unable to tag issue",e):c("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)?L(r.message??"Unable to untag issue",e):c("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)?L(r.message??"Unable to assign issue",e):c("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)?L(r.message??"Unable to unassign issue",e):c("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)?L(o.message??"Failed to move node",e):c("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)?L(r.message??"Unable to edit description",e):c("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 L("Unable to locate issue",e);if(!B(o))return L("Can only close issues",e);let i=b.getNode(He);if(!i)return L("Unable to locate target swimlane",e);if(n!==i.id)return L("Close target must be closed swimlane",e);let s=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(s)?L(s.message??"Unable to close issue",e):c("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 L("Unable to locate issue",e);if(!B(o))return L("Can only reopen issues",e);let i=b.getNode(He);if(!i)return L("Unable to locate closed swimlane",e);if(n===i.id)return L("Cannot reopen issue into closed swimlane",e);if(!b.getNode(n))return L("Reopen parent no longer exists",e);let l=b.moveNodeToRank({id:t,parentId:n,rank:r});return d(l)?L(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=b.lockNode(t);return d(n)?L(n.message??"Unable to lock node",e):c("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 L(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return L(`Node ${r} is not child of ${t}`,e);let s=b.updateNode({...i,rank:o});if(d(s))return L(s.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}};function nn(e,t=!1){let n=Gc[e.action](e);if(d(n))return n;let r=zc(e,t);return r||n}var yt=e=>e.map(t=>nn(t));import ol from"node:fs";import il from"node:path";import{decodeTime as sl,monotonicFactory as al}from"ulid";import{z as on}from"zod";import Vn from"node:fs";import io from"node:path";import{decodeTime as qc}from"ulid";import{z as oo}from"zod";var Yc=oo.object({userId:oo.string().min(1).default("unknown"),userName:oo.string().min(1).default("unknown")}),Xc=e=>{let[t,n]=io.basename(e,".jsonl").split("."),r=Yc.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):a(`Invalid event file name ${io.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Jc=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"):c("Resolved persisted action",t[0])},Qc=(e,t)=>t in e,Zc=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),el=e=>{let{userId:t,userName:n,...r}=e,o=Jc(r);if(d(o))return a(o.message);let i=o.value,s=e.id?.[0];return s?Qc(r,i)?c("Decoded persisted event",Zc({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")},so=e=>{let t=[];for(let n of e){let r=el(n);if(d(r))return a(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${r.message}`);t.push(r.value)}return c("Decoded reconstructed events",t)},tl=e=>{if(!Vn.existsSync(e))return c("Event file missing",[]);let t=Xc(e);if(d(t))return a(t.message);let n=Vn.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 l=co(s);if(d(l))return a(`${l.message} in ${e}: ${i}`);r.push({...l.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",r)};function ao(e){let t=qt(e);if(!Vn.existsSync(t))return c("No events found",[]);let n=Vn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>io.join(t,o)),r=[];for(let o of n){let i=tl(o);if(d(i))return a(i.message);r.push(...i.value)}return c("All events loaded",nl(r))}function kt(e){let t=ao(e);return d(t)?a(t.message):so(t.value)}function rs(e,t){let n=ao(e);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=rl(n.value,t),i=so(r);if(d(i))return a(i.message);let s=so(o);return d(s)?a(s.message):c("Loaded merged events before time",{appliedEvents:i.value,unappliedEvents:s.value})}function os(e=process.cwd()){let t=ao(e);return d(t)?a(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var nl=e=>{let t=new Map,n=new Map;for(let m of e){let g=m.id[0],h=m.id[1]??null;t.set(g,m);let C=n.get(h)??[];C.push(m),n.set(h,C)}for(let m of n.values())m.sort((g,h)=>g.id[0].localeCompare(h.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 h=n.get(g)??[];for(let C of h)i(C)},s=n.get(null)??[];for(let m of s)i(m);let l=e.filter(m=>{let g=m.id[0],h=m.id[1]??null;return!o.has(g)&&h!==null&&!t.has(h)}).sort((m,g)=>m.id[0].localeCompare(g.id[0]));for(let m of l)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},rl=(e,t)=>{let n=new Set,r=[],o=[];for(let i of e){let s=i.id[0],l=i.id[1],u=!1;try{u=qc(s)<t}catch{u=!1}!u||l&&n.has(l)?(n.add(s),o.push(i)):r.push(i)}return{appliedEvents:r,unappliedEvents:o}};var is=e=>({action:e.action,payload:e.payload});var as=1,ss=al(),dl=on.tuple([on.string().min(1),on.string().min(1).nullable()]),cl=on.looseObject({v:on.literal(as),id:dl}),co=e=>{let t=cl.safeParse(e);return t.success?c("Parsed persisted event",t.data):a(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Kn=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Y=()=>{let{userName:e,userId:t}=$();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:Kn(t),userName:Kn(e)}):a("Unable to resolve actor ID from settings or OS user info"):a("User ID not configured"):a("User name not configured")},sn=({userId:e,userName:t})=>`${Kn(e)}.${Kn(t)}.jsonl`,ll=(e,{userId:t,userName:n})=>{let r=sn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return a(`Invalid event log file name: ${r}`);let i=il.join(qt(e),r);return c("Successfully resolved event log path",i)},ul=(e,t)=>{let n={[e.action]:e.payload,v:as,id:t};return co(n)};function zn({event:e,rootDir:t}){try{let n=ri(t);if(d(n))return n;let r=ll(t,{userId:e.userId,userName:e.userName});if(d(r))return r;let o=os(t);if(d(o))return a(o.message);let i=o.value?ss(Math.max(Date.now(),sl(o.value)+1)):ss(),s=ul(is(e),[i,o.value]);return d(s)?a(s.message):(ol.appendFileSync(r.value,`${JSON.stringify(s.value)}
23
- `,"utf8"),c("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 Te(e,t){let n=nn(e);if(n.status!==qe.Success)return n;let r=zn({event:e,rootDir:t});return d(r)?r:n}function ds(e,t){return e.map(n=>Te(n,t))}var Se=async e=>{let t=await Re();return d(t)?t:Te(e,t.value)};var cs=e=>Gn(U(e),{at:"end"}),Gn=(e,t={at:"end"})=>{let n=r=>d(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(me(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(me(void 0,r.rank)):a("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(me(r.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let r=ls(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(me(o?.rank,i.rank)):a("Sibling not found")}case"after":{let r=ls(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(me(o.rank,i?.rank)):a("Sibling not found")}}},U=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),ls=(e,t)=>e.findIndex(n=>n.id===t),us=(e,t,n={at:"end"})=>Gn(U(t).filter(r=>r.id!==e),n),lo=(e,t,n,r,o)=>{let i=us(t,e,n);if(d(i))return i;if(!i.value.needsRebalance)return c("Resolved rank",i.value.rank);let s=Jr(e,r);if(d(s))return s;let l=Te(s.value,o);if(d(l))return l;let u=us(t,e,n);return d(u)?u:u.value.needsRebalance?a("Rank rebalance failed to create space"):c("Resolved rank after rebalance",u.value.rank)},qn=(e,t,n)=>{let r=cs(e);if(d(r))return r;if(!r.value.needsRebalance)return c("Resolved rank",r.value.rank);let o=Jr(e,t);if(d(o))return o;let i=Te(o.value,n);if(d(i))return i;let s=cs(e);return d(s)?s:s.value.needsRebalance?a("Rank rebalance failed to create space"):c("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=U(t.id)[n];!r||t.context==="FIELD"||T.navigate({contextNode:r,selectedIndex:_(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=_(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:()=>ms(1),navigateToPreviousItem:()=>ms(-1),navigateToNextContainer:()=>ps(1),navigateToPreviousContainer:()=>ps(-1),navigate:({contextNode:e,selectedIndex:t})=>{N({contextNodeId:e.id,selectedIndex:t})}},ms=e=>{let{selectedIndex:t,contextNode:n}=v(),r=_(n.id).length;if(r===0)return;let i=(Math.max(0,t)+e+r)%r;T.navigate({selectedIndex:i,contextNode:n})},ps=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=_(o.id),s=i.findIndex(C=>C.id===t.id);if(s<0)return;let l=i.at(s+e)??i.at(0);if(!l)return;let u=_(l.id),m=Math.max(0,u.length-1),g=Math.min(Math.max(0,r),m),h=u.length?g:-1;T.navigate({contextNode:l,selectedIndex:h})};var fs=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),vs=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},ml=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&tt(t)&&t.childRenderAxis==="vertical"},Yn=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=U(r.id);return T.navigate({contextNode:r,selectedIndex:fs(t,o.length)}),!0},xs=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Yn(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let s=U(o.id).findIndex(l=>l.id===n.id);return s>=0?(T.navigate({contextNode:o,selectedIndex:s}),!0):xs(o.id)},gs=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),xs(n))return!0;n=t[n]?.parentNodeId}return!1},pl=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},hs=e=>{let{nodes:t,rootNodeId:n}=v();if(ml(e.contextNodeId)&&Yn(e.contextNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(pl(e.selectedNodeId)&&e.selectedNodeId&&gs(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(Yn(e.contextNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&Yn(e.parentNodeId,e.selectedIndex))return c("Restored navigation to previous parent",null);if(gs(e.contextNodeId))return c("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 T.navigate({contextNode:r,selectedIndex:fs(e.selectedIndex,o.length)}),c("Restored navigation to root",null)};import{monotonicFactory as gl,ulid as je}from"ulid";var an=gl();function fl(){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]=_(n.id),[o]=r?_(r.id):[];if(o){let i=t.renderedChildrenIndex?.[o.id]??[];return c("Resolved boot nav target",{contextNode:o,selectedIndex:i.length>0?0:-1})}else return r?c("Resolved boot nav target",{contextNode:r,selectedIndex:0}):n?c("Resolved boot nav target",{contextNode:n,selectedIndex:0}):c("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function vl(){let e=fl();return d(e)?e:T.navigate(e.value)}function ys({userId:e,userName:t}){let n=an(),r=an(),o=an(),i=an(),s=an(),l=me(void 0,void 0);if(d(l))return l;let u=me(void 0,void 0);if(d(u))return u;let m=me(u.value,void 0);if(d(m))return m;let g=me(void 0,void 0);if(d(g))return g;let h=me(g.value,void 0);if(d(h))return h;let C=me(h.value,void 0);if(d(C))return C;let I=me(void 0,void 0);return d(I)?I:c("Created default events",[{id:je(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:je(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:je(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:g.value}},{id:je(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:h.value}},{id:je(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"Done",parent:r,rank:C.value}},{id:je(),userId:e,userName:t,action:"add.board",payload:{id:jn,name:"Closed",parent:n,rank:m.value}},{id:je(),userId:e,userName:t,action:"add.swimlane",payload:{id:He,name:"Closed",parent:jn,rank:I.value}},{id:je(),userId:e,userName:t,action:"lock.node",payload:{id:jn}},{id:je(),userId:e,userName:t,action:"lock.node",payload:{id:He}}])}function Xn(e){if(!e.length){let r=q.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=rn(r);return d(o)?o:(N({hasProjectDefinition:!1,mode:p.DEFAULT}),c("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
- `)}`):(vl(),N({hasProjectDefinition:!0}),c("State booted successfully",null))}var Et=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),uo=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);var mo=({status:e,msg:t})=>{Dt()&&N({syncStatus:{status:e,msg:t}})},Es=(e="Syncing...")=>{mo({status:"syncing",msg:e})},Cs=(e="Synced")=>{mo({status:"synced",msg:e})},xl=e=>{mo({status:"failed",msg:e})},ke=e=>(xl(e),a(e));import Ft from"node:fs";import dn from"node:path";var bs=async e=>{if((await Pe({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Initial commit already exists",!1);de.info("Creating initial commit");let n=await G.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?a(n.message):c("Created initial commit",!0)},Ns=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",hl=async e=>{let t=await Fn(e);if(d(t))return a(t.message);let n=await pi(e);return d(n)?a(n.message):c("Built sync commit message",`[sync|branch:${Ns(t.value)}:sha:${Ns(n.value)}]`)},po=async({repoRoot:e,stateBranchName:t})=>{de.info(`Creating ${t}`);let n=await k({args:["commit-tree",hi,"-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 k({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?a(`Failed to create ${t}
27
- ${o.message}`):c("Created state branch",!0)},yl=async({repoRoot:e,stateBranchName:t})=>{let n=await Vr({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
28
- `+n.message);let r=n.value,o=r?await kn({repoRoot:e,branch:t}):c("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 l=await G.fetch({cwd:e,remote:ye,branch:t});if(d(l))return a(`Failed to fetch ${t} from remote
30
- ${l.message}`)}let s=await Dn({repoRoot:e,branch:t});if(d(s))return a(`Ensure local state branch failed
31
- `+s.message);if(s.value)return c("Local state branch already exists",!1);if(i){let l=await k({args:["branch","--track",t,`${ye}/${t}`],cwd:e});return d(l)?a(`Failed to create local ${t} from remote
32
- ${l.message}`):c("Created local state branch from remote",!0)}return po({repoRoot:e,stateBranchName:t})},El=async({repoRoot:e,branch:t})=>{let n=await k({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 c("Found worktree for branch",o)}return c("No worktree found for branch",null)},Cl=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Qt(dn.dirname(t));if(d(r))return a(`Failed to create state branch worktree
34
- `+r.message);Ft.existsSync(t)&&!Ft.existsSync(dn.join(t,".git"))&&(de.info("Removing broken state branch worktree path"),Ei(t)),de.info("Creating state branch worktree");let o=await G.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?a(`Failed to create state branch worktree
35
- ${o.message}`):c("Created state branch worktree",!0)},cn=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await El({repoRoot:e,branch:n});if(d(r))return a(r.message);let o=dn.resolve(t),i=r.value?dn.resolve(r.value):null;if(i&&i===o&&Ft.existsSync(i))return c("State branch already checked out in expected worktree",!1);if(i&&i!==o){de.info("Moving state branch worktree to expected location");let u=await G.worktreeRemove({cwd:e,worktreeRoot:i});if(d(u))return a(`Failed to remove existing state branch worktree
36
- ${u.message}`)}if(i&&!Ft.existsSync(i)){de.info("Pruning stale state branch worktree");let u=await G.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
37
- ${u.message}`)}let s=await mi({repoRoot:e,worktreeRoot:t});if(d(s))return a(s.message);let l=Ft.existsSync(t);if(s.value&&l)return c("State branch worktree already exists",!1);if(s.value&&!l){de.info("Pruning missing registered state branch worktree");let u=await G.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
38
- ${u.message}`)}return Cl({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Nl=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Fn(e);if(d(n))return a(n.message);if(n.value===t)return c("State branch already checked out",!1);(await Pe({cwd:e,args:["rebase","--abort"]})).exitCode===0&&de.info("Aborted stale state branch rebase");let o=await G.checkout({cwd:e,branch:t});return d(o)?a(`Failed to checkout ${t}
39
- ${o.message}`):c("Checked out state branch",!0)},bl=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Kr(t);if(d(n))return a(n.message);if(n.value)return c("State branch upstream already configured",!1);let r=await Vr({repoRoot:t});if(d(r))return a(r.message);if(!r.value)return c("No remote available for state branch upstream",!1);let o=Tt(e);if(d(o))return o;let i=o.value,s=await kn({repoRoot:t,branch:i});if(d(s))return a(s.message);if(!s.value)return c("Remote state branch missing; upstream will be configured on first push",!1);de.info(`Configuring ${i} upstream`);let l=await G.fetch({cwd:t,remote:ye,branch:i});if(d(l))return a(`Failed to fetch ${i}
40
- ${l.message}`);let u=await G.setUpstream({cwd:t,branch:i,upstream:`${ye}/${i}`});return d(u)?a(`Failed to set state branch upstream
41
- ${u.message}`):c("Configured state branch upstream",!0)},Jn=async({stateBranchRoot:e,eventFileName:t})=>{let n=qr(t),r=dn.join(e,n);if(!Ft.existsSync(r))return c("No event file to stage",void 0);let o=await G.stage({cwd:e,pathspec:[n]});return d(o)?a(`Failed to stage state branch event file
42
- ${o.message}`):c("Staged state branch event file",void 0)},Ss=async({repoRoot:e,stateBranchRoot:t})=>{let n=await hl(e);return d(n)?a(`Create state branch sync commit failed
43
- `+n.message):wt({cwd:t,message:n.value})},ln=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Kr(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 G.push({cwd:t}):await G.push({cwd:t,remote:ye,branch:o,setUpstream:!0});return d(i)?a(`Failed during state branch push
44
- ${i.message}`):c("Pushed state branch",!0)},Is=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Tt(e);if(d(o))return o;let i=o.value,s=[Bn(),await yl({repoRoot:e,stateBranchName:i}),await cn({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await Nl({stateBranchRoot:t,stateBranchName:i}),await Ni(t),n?await bl({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of s){if(d(l))return a(l.message);r=r||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{decodeTime as Ex}from"ulid";var Sl=async({cwd:e,ensureUpstream:t})=>{logger.debug("[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.debug("[sync] repo root",r);let o=W("getStateBranchRoot",Xe({repoRoot:r}));if(d(o))return a(o.message);let i=o.value;logger.debug("[sync] state branch root",i);let s=W("ensureInitialCommit",await bs(r));if(d(s))return a(s.message);logger.debug("[sync] initial commit result",{created:s.value}),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:i,ensureUpstream:t});let l=W("bootstrapStateBranchStorage",await Is({repoRoot:r,stateBranchRoot:i,ensureUpstream:t}));if(d(l))return a(l.message);logger.debug("[sync] bootstrap result",{bootstrapped:l.value,stateBranchRoot:i}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:i});let u=W("hasInProgressGitOperation(stateBranchRoot)",await Ln(i));if(d(u))return a(u.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:u.value}),u.value)return logger.info("[sync] state branch git operation in progress"),a("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:i});let m=W("ensureStateBranchLayout",Ci(r,i));return d(m)?a(m.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}),c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}))},Il=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.debug("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.debug("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let r=W("stageStateBranchOwnEventFile",await Jn({stateBranchRoot:t,eventFileName:n}));if(d(r))return a(r.message);let o=W("hasStagedChanges(after stage)",await fi(t));if(d(o))return a(o.message);if(logger.debug("[sync] state branch change check after stage result",{changed:o.value}),!o.value)return logger.info("[sync] no own event file changes to commit"),c("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let i=W("createStateBranchSyncCommit",await Ss({repoRoot:e,stateBranchRoot:t}));return d(i)?a(i.message):(logger.debug("[sync] created sync commit",i.value),c("Committed own event file",{createdCommit:!0,commitSha:i.value}))},Rs=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.debug("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.error("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),a("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),a("Own event file must end with .jsonl");Es();let n=W("ensureSyncReady",await Sl({cwd:e,ensureUpstream:!0}));if(d(n))return ke(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value,s=W("isDetachedHead(stateBranchRoot)",await vi(o));if(d(s))return ke(s.message);if(logger.debug("[sync] detached state branch check result",{detached:s.value}),s.value)return ke("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,g=!1,h=W("getStateBranch",Tt(r));if(d(h))return ke(h.message);let C=h.value;logger.debug("[sync] resolved state branch",{stateBranch:C,stateBranchRoot:o});let I=W("commitOwnEventFileToStateBranch",await Il({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(I))return ke(I.message);l=I.value.createdCommit,u=I.value.commitSha;let S=W("pullBranchRebaseIfPresent",await zr({cwd:o,branch:C}));if(d(S))return ke(S.message);if(m=S.value,l||i){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:i,stateBranchRoot:o});let A=W("pushStateBranch",await ln({stateBranchRoot:o,repoRoot:r}));if(d(A)&&gi(A.message)){let R=W("pullBranchRebaseIfPresent(retry)",await zr({cwd:o,branch:C}));if(d(R))return ke(R.message);m=m||R.value,A=W("pushStateBranch(retry)",await ln({stateBranchRoot:o,repoRoot:r}))}if(d(A))return ke(A.message);g=A.value}if(l){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let A=W("git rev-parse HEAD",await k({args:["rev-parse","HEAD"],cwd:o}));if(d(A))return ke(A.message);u=A.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return Cs(g?"Synced and pushed":m||l?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,pulled:m,pushed:g,bootstrapped:i})};var Qn=async()=>{let e=As();if(e)return e;logger.debug("[sync] syncAndReloadState:start");let t=W("resolveActorId",Y());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id"),a("Unable to resolve event log path");N({syncStatus:{msg:"Reloading synced state",status:"syncing"}});let n=sn(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n});let r=W("syncEpiqWithRemote",await Rs({ownEventFileName:n}));if(d(r))return logger.error("[sync] syncAndReloadState:sync failed",r.message),a(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let i=W("loadMergedEvents",kt(o));if(d(i))return a(`Unable to load events. ${i.message}`);logger.debug("[sync] loaded merged events after sync",{count:i.value.length});let s=As();if(s)return s;let l=vs();if(!v().selectedNode?.isVirtual&&!v().contextNode?.isVirtual){let m=W("bootStateFromEventLog",Xn(i.value));if(d(m))return a(`Unable to boot synced state. ${m.message}`)}logger.debug("[sync] booted state from synced events");let u=W("restoreNavigationAnchor",hs(l));return d(u)?u:(N({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done"),c("Synced",!0))},As=()=>v().mode===p.DEFAULT?null:(N({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var Ot=3e3,Ts=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Ot?null:t},ws=0,go,fo=!1,un=!1,vo=()=>{if(fo)return!0;let e=ot();return d(e)?!1:e.value.syncStatus.status==="syncing"},Rl=()=>{let e=$().autoSyncIntervalMs??1e4,t=Date.now()-ws;return Math.max(0,e-t)},Ms=()=>{go||(go=setTimeout(async()=>{if(go=void 0,!!Dt()){if(vo()){un=!0;return}un=!1,await Al()}},Rl()))},Al=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(vo())return un=!0,a("Sync already in progress");fo=!0,ws=Date.now(),N({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Qn()}finally{fo=!1,un&&Ms()}},Zn=()=>{Dt()&&(un=!0,!vo()&&Ms())};var Tl=e=>e.props.tags??[],wl=e=>e.props.assignees??[],xo=e=>Tl(e).map(t=>b.getTag(t)).filter(t=>!!t),ho=e=>wl(e).map(t=>b.getContributor(t)).filter(t=>!!t),er=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!B(n)?a("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",xo(n))},tr=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!B(n)?a("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",ho(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",COFFEE:"coffee",NONE:""};var Ml=/^(\d+)(h|d|w|mo|y)$/,Pl=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Ll=({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},kl=(e,t=new Date)=>{let n=e.match(Ml);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}},Dl=e=>{let t=e.match(Pl);if(!t)return null;let[,n,r,o,i,s]=t,l=Number(n),u=Number(r),m=Number(o),g=i?Number(i):0,h=s?Number(s):0;return Ll({year:l,month:u,day:m,hour:g,minute:h})?new Date(l,u-1,m,g,h):null},nr=e=>{let t=e.trim().toLowerCase();return kl(t)??Dl(t)},Ps=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Fl=[{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}],Ls=(e=Fl)=>{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 Ol=["BOARD","TICKET","SWIMLANE"],X={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",LOG_LEVEL:"logLevel"},it={TITLE:"title",DESCRIPTION:"description"},Bl=[X.EDITOR,X.VIEW,X.USERNAME,X.AUTOSYNC,X.SYNC_DEBOUNCE_MS,X.LOG_LEVEL],Ul=[it.TITLE,it.DESCRIPTION],Eo=[String(Ot),"5000","15000","30000","60000"],Ct=[x.COFFEE,x.EXIT,x.SYNC,x.HELP,x.EXPORT,x.CONFIG],rr=[x.NEW,x.EDIT,x.DELETE,x.MOVE],yo=[x.TAG,x.UNTAG,x.ASSIGN,x.UNASSIGN,x.CLOSE_ISSUE,x.RE_OPEN_ISSUE,x.EDIT],ks=[x.FILTER,x.PEEK],$l={WORKSPACE:[...Ct,...rr],BOARD:[...ks,...Ct,...rr],SWIMLANE:[...ks,...Ct,...rr],TICKET:[...Ct,...rr,...yo],FIELD:[...Ct,...yo],FIELD_LIST:[...Ct,...yo],TEXT:[...Ct]},_l=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Wl=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=Ze();if(!r)return[x.HELP,x.CONFIG];if(!Si())return[x.HELP,x.INIT];if(t)return[x.HELP,x.PEEK,x.EXPORT,x.CONFIG];let o=e?.context,i=o&&Ol.includes(o);return[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?$l[l]:[]))].filter(l=>l===x.MOVE?!1:l===x.EDIT||l===x.DELETE?i:!0)},Z=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=v())=>{let i=t.context??"WORKSPACE";return{[x.NONE]:Wl({breadCrumb:o,readOnly:r,selectedNode:n}),[x.EXIT]:["confirm"],[x.EXPORT]:[],[x.SYNC]:[],[x.INIT]:[],[x.HELP]:[],[x.PEEK]:[...Ls(),"now","prev","next"],[x.EDIT]:[...Ul],[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(xt),...b.getExistingTags()])],[x.UNTAG]:[...er()?.value?.map(({name:l})=>l)??[]],[x.UNASSIGN]:[...tr()?.value?.map(({name:l})=>l)??[]],[x.ASSIGN]:b.getExistingAssignees(),[x.NEW]:_l(i),[x.CONFIG]:[...Bl],[x.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import Bs from"chalk";var Ds=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import Fs from"chalk";var ee=e=>Fs.dim(e),pe=e=>Fs.hex(y.primary)(e),ie=({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(h=>h.startsWith(s))].sort((h,C)=>_n(h)-_n(C)).slice(0,r).map(h=>Wn(h)).join(" ");return g?`${ee(e)}${g}${ee(n)}`:""};var Nt={None:"none",Invalid:"invalid",Valid:"valid"};var Hl=["BOARD","TICKET","SWIMLANE"],Os=()=>{let e=v().selectedNode;return e?.context?Hl.includes(e.context)?H():D({message:ee("Command not available in this context")}):D({message:ee("Missing target context")})},te="<ENTER> to confirm",H=(e="",t=[])=>({message:ee(e),validity:Nt.Valid,completionWordList:t}),D=({message:e,completionWordList:t=[]})=>({validity:Nt.Invalid,message:e,completionWordList:t}),ir=e=>e.length===0,or=e=>` ${Bs.dim.bgHex(zi(e))(` ${e} `)} `,Co=({modifier:e})=>{let t="confirm";return e===t?H(te):D({message:ir(e)?ee("if you are certain, enter ")+Wn(t):"",completionWordList:[t]})},jl=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?D({message:ee(n)}):H():D({message:ir(r)?t:"",completionWordList:[...e]}),Bt=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>ir(n)&&ir(r)?D({message:e,completionWordList:[]}):H(t??te),Vl=({modifier:e,inputString:t})=>{let n=Z(x.CONFIG);if(!n.includes(e))return D({message:ie({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case X.EDITOR:{let r=[...Ds];return t.trim()?r.includes(t.trim())?H(te):D({message:ie({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):D({message:ie({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?H(te):D({message:ie({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.USERNAME:return t.trim()?H(te):D({message:pe("Enter a user name. Saved in ")+Bs.bgBlack("~/.epiq-global/config.json")});case X.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?H(te):D({message:ie({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case X.AUTOSYNC:{let r=["on","off"],o=$().autoSync;if(!r.includes(t.trim())){let i=Ii(o);return D({message:ie({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return H(te)}case X.SYNC_DEBOUNCE_MS:{let r=$().autoSyncIntervalMs,o=Ts(t);if(!t.trim()||o===null||o<Ot){let i=ie({prefix:" examples: ",wordList:Eo,minLengthForHints:0,inputString:t});return D({message:pe(`provide duration above ${Ot}ms. current duration: ${r}ms.`)+i,completionWordList:Eo})}return H(te)}default:return D({message:pe("Unknown config option"),completionWordList:n})}},Kl=({modifier:e})=>{let t=Z(x.EDIT);if(!t.includes(e)){let i=ie({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return D({message:i||pe("Unknown edit option"),completionWordList:t})}let{breadCrumb:n,selectedNode:r}=v();if(!Ce([...n,r],"TICKET"))return D({message:pe("Command not available in this context")});switch(e){case it.TITLE:return H(te);case it.DESCRIPTION:let{preferredEditor:i}=$();return i?H(ee("<ENTER> to edit in ")+i):D({message:"No editor selected"});default:return D({message:pe("Unknown edit option"),completionWordList:t})}},zl={[x.EXPORT]:()=>H(te+ee(", and create export markdown file")),[x.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(te);let n={message:ee("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return H(te);let r=nr(t);if(!t||!r)return D(n);let o=Ce(v().breadCrumb,"BOARD");if(d(o))return D({message:pe("Command is not applicable in this context")});let i=Hn(o.value.id);return d(i)?D({message:pe("Unable to peek: board id is not a valid ULID")}):Ps({date:r,horizonDate:i.value})?H(te):D({message:pe(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[x.EXIT]:()=>H(te+ee(" and exit the application")),[x.INIT]:()=>H(te),[x.PALETTE]:()=>H(te),[x.FILTER]:e=>{if(e.modifier==="clear")return H();let t=i=>Z(x.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return D({message:ie({wordList:Z(x.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Z(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:ie({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):H():D({message:ie({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[x.NONE]:e=>{let t=Z(x.NONE);return D({message:ie({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[x.NEW]:e=>jl({list:Z(x.NEW),hint:ie({wordList:Z(x.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[x.HELP]:()=>H(te),[x.EDIT]:Kl,[x.CONFIG]:Vl,[x.DELETE]:e=>{let t=Os();return t.validity==="invalid"?t:Co(e)},[x.CLOSE_ISSUE]:e=>Co(e),[x.RE_OPEN_ISSUE]:e=>Co(e),[x.MOVE]:e=>{let t=Os();return t.validity==="invalid"?t:Bt({hint:ie({prefix:"hey hacker! These commands are blocked for you... ",wordList:Z(x.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[x.TAG]:e=>{let n=b.getExistingTags().slice(0,10).map(or).join("");return Bt({hint:n.length?ee("create tag or reuse:")+n+ee(""):ee("create tag ...")})(e)},[x.UNTAG]:e=>{let t=er();if(d(t))return D({message:pe("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(or).slice(0,10);return n.length?Bt({hint:ee(" ... ")+n.join("")})(e):D({message:pe("Issue has no tags"),completionWordList:[]})},[x.ASSIGN]:e=>{let t=b.getExistingAssignees().map(or).slice(0,10);return Bt({hint:ee("assignees... ")+t.join("")})(e)},[x.UNASSIGN]:e=>{let t=tr();if(d(t))return D({message:pe("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(or).slice(0,10);return n.length?Bt({hint:ee("remove assignee... ")+n.join("")})(e):D({message:pe("Issue has no assignees"),completionWordList:[]})},[x.SYNC]:()=>H(te),[x.COFFEE]:e=>{let{modifier:t}=e,n=Z(x.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?D({message:ee("enter an amount ... "),completionWordList:n.filter(r=>r.startsWith(t))}):Bt({hint:ie({prefix:"Fuel continued development with ... ",wordList:["$1"," $3 ","$5","$20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},Us=Object.fromEntries(Object.entries(zl).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var $s=["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 _s=e=>Object.values(x).includes(e),Ws=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:s,validity:l,completionWordList:u}=Us[n].validate(n,r,i),m=o==="command"||o==="modifier"?Z(n):$s,{mode:g}=v(),h=g===p.COMMAND_LINE?s??"":"",C=[...u,...m];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:h,autoCompletion:t?$i(e,C):{hint:"",hints:[],remainder:"",overlap:0}}};var Hs=e=>{let t=e.trimStart(),n=ql(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),s=Yl(e),l=_s(r)?r:null,u=l!==null,m=r!=="",g=l?Z(l)??[]:[],h=l&&g.includes(o)?o:"",C="word";n.length===0||n.length===1&&!i?C="command":(n.length===1&&i||n.length===2&&!i)&&(C="modifier");let I=i?"":s,S=Gl(t,l,h);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:s,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:i,modifier:h,target:C,inputToMatch:I,inputString:S}},Gl=(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},ql=e=>e.trim()?e.trim().split(/\s+/):[],Yl=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Xl}from"react";var Ut=e=>e===No||e===":",No=" ",se={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Nt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},bo=new Set,js=()=>{for(let e of bo)e()},So=e=>(bo.add(e),()=>bo.delete(e)),De=e=>{let n=e(se),r=Hs(n.value),o=n.cursorPosition===n.value.length;se={...n,commandMeta:Ws(r,o)},js()},mn=({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,js(),c(e,null)},Io=e=>{De(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Ro=e=>{De(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Ut(n[o-1]);)o--;for(;o>0&&!Ut(n[o-1]);)o--}else{for(;o<n.length&&!Ut(n[o]);)o++;for(;o<n.length&&Ut(n[o]);)o++}return{...t,cursorPosition:o}})},Vs=()=>{De(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}})},Ks=()=>{De(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Ut(t[r-1]);)r--;for(;r>0&&!Ut(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},sr=e=>{De(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,l=Math.max(0,Math.min(i.length,s.length));return{...t,value:s,cursorPosition:l,commandIsPending:!1}})},zs=()=>{De(e=>({...e,commandIsPending:!0}))},F=e=>{De(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Gs=({addToHistory:e=!0})=>{De(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},qs=()=>{De(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}})},Ys=()=>{De(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},V=()=>se,Xs=()=>Xl(So,V,V),Js=()=>{let[e,...t]=se.value.split(No);return t.join(No).trim()};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 Jl(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function Ql(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function Zl(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 Qs(e,t){let n=V();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 Pi(e,n.value);if(t===p.PALETTE)return Li(e,n.value);let r=Jl(e)||Ql(e);if(r)return eu(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 $().viewMode==="wide"?f.SetViewDense:f.SetViewWide;case"q":case"escape":return f.Exit;default:return null}}function eu(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 Zl(v().contextNode.childRenderAxis,e,n)}var ar=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.COFFEE:return P.Coffee;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",Coffee:"coffee"};import{ulid as fe}from"ulid";import ma from"node:fs";import bu from"node:path";import Su from"react";import{Box as Cu}from"ink";import pr from"react";import uu from"chalk";import{Box as To,Text as mu}from"ink";import Fe from"react";import{Text as Zs}from"ink";import ea,{useEffect as ta,useState as tu}from"react";var na={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},ge=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=K(),r=na[n]??na.default,[o,i]=tu(0);if(ta(()=>{i(0)},[r]),ta(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return ea.createElement(Zs,null,t);let s=r[o]??r[0]??t;return ea.createElement(Zs,{color:y.accent,dimColor:o===1},s)};import{Box as Ao,Text as nu}from"ink";import dr 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)),l=Math.max(1,Math.floor(i/s)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-l),g=o?Math.min(m,Math.max(0,u-l+1)):Math.min(m,Math.floor(u/l)*l),h=g+l,C=e.slice(g,h),I=e.length>l,S=i,A=I?Math.max(1,Math.floor(l/e.length*S)):S,R=Math.max(0,S-A),M=Math.max(1,e.length-l),O=I?Math.floor(g/M*R):0;return dr.createElement(Ao,{flexDirection:"row",height:i,width:"100%"},dr.createElement(Ao,{flexDirection:"column",flexGrow:1,height:i},C),dr.createElement(Ao,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((Ie,le)=>dr.createElement(nu,{key:le,color:I&&le>=O&&le<O+A?y.accent:y.secondary},I?"\u2502":" "))))};import{Box as cr,Text as cu}from"ink";import bt from"react";import{Text as ru}from"ink";import ou from"react";var iu=e=>e.toLowerCase().trim(),su=(e,t=xt)=>{let n=iu(e);return t[n]?t[n]:tn(n)},$t=({id:e,isSelected:t})=>{let n=b.getContributor(e);if(n)return ou.createElement(ru,{underline:t,color:su(n.name)},"@"+n.name)};import{Text as au}from"ink";import du from"react";var _t=({id:e,isSelected:t})=>{let n=b.getTag(e);if(n)return du.createElement(au,{underline:t,backgroundColor:be(n.name),color:y.primary}," "+n.name+" ")};var ra=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=$n(ki(t.title),r),i=xo(t),s=ho(t);return bt.createElement(cr,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?y.accent:y.secondary,justifyContent:"space-between"},bt.createElement(cr,{borderBottom:!0},bt.createElement(cr,{paddingLeft:1,flexDirection:"column"},bt.createElement(cu,{color:y.primary},o))),bt.createElement(cr,{flexDirection:"row",paddingLeft:1},i.map(l=>bt.createElement(_t,{key:l.id,id:l.id})),s.map(l=>bt.createElement($t,{key:l.id,id:l.id}))))};import{Box as Wt,Text as lr}from"ink";import we from"react";var lu=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,oa=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(S=>b.getTag(S)).filter(S=>!!S),s=(t.props.assignees??[]).map(S=>b.getContributor(S)).filter(S=>!!S),l=1,u=i.length*(1+l),m=s.length*(2+l),g=i.map(S=>we.createElement(Wt,{key:S.id,paddingRight:l},we.createElement(lr,{color:be(S.name)},"\u25A0"))),h=s.map(S=>we.createElement(Wt,{key:S.id,paddingRight:l},we.createElement(lr,{color:tn(S.name)},"@"+S.name.at(0)))),C=n?y.accent:o===p.MOVE?y.secondary:y.primary;return we.createElement(Wt,{borderBottom:!0,justifyContent:"space-between"},we.createElement(Wt,null,we.createElement(Wt,{width:4},n?we.createElement(ge,{isSelected:n}):we.createElement(lr,{color:"gray",dimColor:!0},r+1)),we.createElement(lr,{wrap:"truncate",color:C},lu(t.title,e-u-m-18))),we.createElement(Wt,null,g,h))};var pu=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:s,mode:l})=>{let{renderedChildrenIndex:u}=K(),m=u[e.id]??[],g=`${e.title} ${uu.hex(y.secondary2).dim("("+m.length+")")}`,h=3,C=o?1:4,I=r-h-(o?2:1),S=Fe.createElement(To,{borderStyle:"round",borderColor:y.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Fe.createElement(ge,{isSelected:t}),Fe.createElement(mu,{bold:!0,color:t?y.accent:y.primary},g," ",e.readonly?"\u{1F512}":"")),A=(R,M)=>{let O=i&&s===M;return B(R)?o?Fe.createElement(oa,{key:R.id,index:M,width:n,ticket:R,isSelected:O,mode:l}):Fe.createElement(ra,{key:R.id,width:n,ticket:R,isSelected:O}):null};return Fe.createElement(To,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?y.accent:y.secondary,paddingRight:1,paddingLeft:1,height:r},S,Fe.createElement(To,{padding:o?1:0},m.length>0&&Fe.createElement(st,{selectedIndex:s,height:I,itemHeight:C},m.map(A)),Fe.createElement(ge,{isSelected:i&&s===-1})))},ia=Fe.memo(pu);import{Box as Lo,Text as hu}from"ink";import at,{useMemo as la}from"react";import{Box as ur,Text as gu}from"ink";import Ve from"react";var sa=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=K(),{title:o}=t,i=t.parentNodeId?b.getNode(t.parentNodeId):void 0,s=i&&B(i)?o===Q.ASSIGNEES?i.props.assignees??[]:o===Q.TAGS?i.props.tags??[]:[]:[];return Ve.createElement(ur,{alignItems:"center",paddingTop:1},Ve.createElement(ur,{minWidth:12},Ve.createElement(ge,{isSelected:n}),Ve.createElement(gu,{color:n?y.accent:y.secondary2},o,":")),Ve.createElement(ur,{flexDirection:"row",marginLeft:1,paddingRight:1},s.map((l,u)=>{let m=r.id===t.id&&u===e;return Ve.createElement(ur,{key:`${o}-${l}`,paddingRight:2,minHeight:1},Ve.createElement(ge,{isSelected:m}),o===Q.ASSIGNEES?Ve.createElement($t,{isSelected:m,id:l}):o===Q.TAGS?Ve.createElement(_t,{isSelected:m,id:l}):null)})))};import{Box as mr,Text as wo}from"ink";import Ke,{useEffect as fu,useMemo as aa}from"react";var vu="\u2029",da=(e,t)=>`${e}::inline-line::${t}`,Mo=new Map,ca=e=>{let t=Mo.get(e)??[];Mo.delete(e);for(let n of t)b.deleteNode(n)},xu=(e,t)=>{ca(e);let n=[];t.forEach((r,o)=>{let i=Ae(BigInt(o+1));if(!J(i))return;let s=b.createNode(q.text({id:da(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:i.value,props:{value:r},readonly:!0,isVirtual:!0}));J(s)&&n.push(s.value.id)}),Mo.set(e,n)},Po=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:s,contextNode:l}=K(),u=aa(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=aa(()=>u.join("\0"),[u]);fu(()=>(xu(e,u),()=>{ca(e)}),[e,m]);let g=C=>String(C).replace(/\r?\n/g,""),h=u.map((C,I)=>{let S=l.id===e&&s===I;return Ke.createElement(mr,{key:da(e,I)},Ke.createElement(wo,{color:S?y.primary:y.secondary2,dimColor:!S},`${I+1} `.padStart(5,"\xA0")),Ke.createElement(wo,{backgroundColor:S?"gray":void 0},g(C.length?$n(C,i-10):vu)))});return Ke.createElement(mr,{flexDirection:"column",paddingTop:1},Ke.createElement(mr,null,Ke.createElement(ge,{isSelected:o}),Ke.createElement(wo,{color:o?y.accent:y.secondary2},t)),Ke.createElement(mr,{flexDirection:"row",borderStyle:"round",borderColor:y.secondary,paddingLeft:1,marginLeft:1},Ke.createElement(st,{scrollByOne:!0,height:r-3,selectedIndex:s,itemHeight:1},h)))};var yu=e=>rt(e,"description"),Eu=e=>rt(e,"history"),ua=({ticket:e,height:t})=>{let{selectedIndex:n,contextNode:r}=K(),o=process.stdout.columns||120,i=la(()=>yu(e.id),[e.id]),s=la(()=>Eu(e.id),[e.id]),l=r.id===e.id,u=r.id===s||r.parentNodeId===s,m=_(e.id);if(u){let R=b.getNode(s),M=R&&tt(R)?R.props.value??"":"",Ie=t-3;return at.createElement(Lo,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},R?at.createElement(Po,{id:R.id,label:"Event log",text:M,selected:!1,maxWidth:o,height:Ie}):null)}let g=m.reduce((R,M)=>en(M)||M.id===s?R+1:R,0),h=2,C=3,I=g,S=t-C-I-h,A=(R,M)=>R.id===i?at.createElement(Po,{key:R.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:M,maxWidth:o,height:S}):en(R)?at.createElement(sa,{key:R.id,parent:R,selected:M,selectedIndex:n}):R.id===s?at.createElement(Lo,{key:R.id,paddingTop:1},at.createElement(ge,{isSelected:M}),at.createElement(hu,{backgroundColor:y.secondary,color:M?y.accent:y.primary}," History \u203A\u203A ")):null;return at.createElement(Lo,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((R,M)=>A(R,l&&n===M)))};var Nu=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:s,width:l})=>{let u=t.context,m=u===w.TICKET||u===w.FIELD_LIST||u===w.FIELD,g=u===w.BOARD||u===w.SWIMLANE,h=u===w.TICKET?t:r.find(R=>R.context===w.TICKET),C=Math.floor(l/3),I=Math.floor(l/Math.max(e.length,1)),S=Math.min(I,C),A=i==="dense";return pr.createElement(Cu,{flexDirection:"row",height:s},g&&e.map((R,M)=>{let O=t.id===R.id,Ie=O?n:-1,le=t.context===w.BOARD&&n===M;return pr.createElement(ia,{key:R.id,height:s,width:S,swimlane:R,isSelected:le,isDense:A,isFocused:O,listSelectedIndex:Ie,mode:o})}),m&&h&&pr.createElement(ua,{height:s,ticket:h}))},gr=pr.memo(Nu);import{render as Iu}from"ink";import{Writable as Ru}from"node:stream";var pn=e=>String(e).padStart(2,"0"),Au=e=>{let t=e.getUTCFullYear(),n=pn(e.getUTCMonth()+1),r=pn(e.getUTCDate()),o=pn(e.getUTCHours()),i=pn(e.getUTCMinutes()),s=pn(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${s}`},Tu=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",wu=async(e,{width:t,height:n})=>{let r="",o=new Ru({write(s,l,u){let m=Mu(s.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=Iu(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(s=>setTimeout(s,0)),i.unmount(),r},Mu=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),pa=async()=>{let{viewMode:e}=$(),{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 l=120,u=40,m=await wu(Su.createElement(gr,{height:u,width:l,swimlanes:(i[s.id]??[]).filter(M=>M!==void 0&&Mt(M)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:l,height:u});if(!m)return a("Failed to render board export");let g=Tn(process.cwd());if(d(g))return a("Unable to export, epiq root not found");let h=new Date,C=Au(h),I=`board_${Tu(s.title)}_${C}.md`,S=ni(g.value);ma.mkdirSync(S,{recursive:!0});let A=bu.join(S,I),R=`# Board - ${s.title}
45
- Date: ${h.toISOString()}
6
+ `;Cn.writeFileSync(e,o,"utf8")}function Er(e,t,n=!1){let o=Xs();if(!o)return;let r=tl.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${r}
7
+ `;Cn.mkdirSync(Tr.dirname(o),{recursive:!0}),Cn.appendFileSync(o,c,"utf8"),Sr++,Sr>=nl&&(Sr=0,ol())}var Rr=()=>Ys()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",ee={info(...e){let t=Rr();(t==="info"||t==="debug")&&Er("[Info]",e,!1)},debug(...e){Rr()==="debug"&&Er("[Debug]",e,!0)},error(...e){let t=Rr();if(t==="error"||t==="info"||t==="debug"){let o=e.some(r=>r instanceof Error)?void 0:new Error().stack;Er("[Error]",[...e,o].filter(Boolean),!1)}}};globalThis.logger=ee;import{spawn as rl}from"node:child_process";import so from"node:fs";import Nn from"node:path";var te={stage:({cwd:e,pathspec:t})=>B({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>B({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>B({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>B({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>B({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:o=!1})=>{let r=t&&n?["push",...o?["-u"]:[],t,n]:["push"];return B({args:r,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>B({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>B({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>B({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>B({args:["worktree","prune"],cwd:e})};var nn=e=>{let t=_e(e);if(d(t))return a("Unable to resolve epiq project root");let n=It(t.value);return d(n)?a("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},De="origin";var Js=1e4,sl={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Zs=({args:e,cwd:t,allowFail:n})=>new Promise(o=>{if(!so.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){o({stdout:"",stderr:p,exitCode:1});return}o(a(p));return}let r=rl("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:sl}),s=!1,i="",c="",u=p=>{s||(s=!0,clearTimeout(m),o(p))},m=setTimeout(()=>{r.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Js}ms`].join(`
8
+ `);u(n?{stdout:i,stderr:p,exitCode:124}:a(p))},Js);r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",p=>{i+=p}),r.stderr.on("data",p=>{c+=p}),r.on("error",p=>{if(n){u({stdout:i,stderr:p.message,exitCode:1});return}u(a([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
9
+ `)))}),r.on("close",p=>{let v=p??1;if(n){u({stdout:i,stderr:c,exitCode:v});return}if(v!==0){u(a([`git ${e.join(" ")}`,c.trim()||i.trim()||"Git command failed"].filter(Boolean).join(`
10
+ `)));return}u(l("Git command succeeded",{stdout:i,stderr:c,exitCode:v}))})}),B=({args:e,cwd:t})=>Zs({args:e,cwd:t,allowFail:!1}),He=({args:e,cwd:t})=>Zs({args:e,cwd:t,allowFail:!0}),on=async({cwd:e,message:t})=>{let n=await te.commit({cwd:e,message:t});if(d(n))return a(`Failed to create commit
11
+ ${n.message}`);let o=await B({args:["rev-parse","HEAD"],cwd:e});return d(o)?a(`Commit created, but failed to read HEAD SHA
12
+ ${o.message}`):l("Created commit and resolved SHA",o.value.stdout.trim())},il=async e=>{let t=await B({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return a(t.message);let n=t.value.stdout.trim();return l("Resolved git dir",Nn.isAbsolute(n)?n:Nn.resolve(e,n))},al=async e=>{let t=await il(e);if(d(t))return a(t.message);let n=t.value,o={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(o))if(so.existsSync(Nn.join(n,s)))return l("Checked for in-progress Git operation",i);let r={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(r))if(so.existsSync(Nn.join(n,s)))return l("Checked for in-progress Git operation",i);return l("Checked for in-progress Git operation",null)},io=async e=>{let t=await al(e);return d(t)?a(t.message):l("Checked for in-progress Git operation",t.value!==null)},Ar=async({repoRoot:e})=>{let n=(await He({args:["remote","get-url",De],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},ao=async({repoRoot:e,branch:t})=>{let n=await He({args:["ls-remote","--heads",De,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${De}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},co=async({repoRoot:e,branch:t})=>{let n=await He({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?l("Local branch exists",!0):n.exitCode===1?l("Local branch missing",!1):a(n.stderr.trim()||`Unable to inspect branch ${t}`)},Qs=e=>{try{return so.realpathSync.native(e)}catch{return Nn.resolve(e)}},ei=async({repoRoot:e,worktreeRoot:t})=>{let n=await B({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let o=Qs(t),r=n.value.stdout.split(`
13
+ `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Qs).includes(o);return l("Checked worktree registration",r)},wr=async e=>{let t=await He({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},lo=async e=>{let t=await B({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved current branch",t.value.stdout.trim())},ti=async e=>{let t=await B({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},ni=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),dl=async e=>(await He({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1);var Mr=async({cwd:e,branch:t})=>{let n=await ao({repoRoot:e,branch:t});if(d(n))return a(n.message);if(!n.value)return l("Remote branch missing, skipped pull",!1);let o=await dl(e);if(d(o))return a(o.message);let r=await te.fetch({cwd:e,remote:De,branch:t});if(d(r))return a(`Failed to fetch ${t}
14
+ ${r.message}`);let s=await te.pullRebase({cwd:e,remote:De,branch:t});return d(s)?a(`Failed during pull --rebase
15
+ ${s.message}`):l("Pulled with rebase",!0)},oi=async e=>{let t=await He({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?l("No staged changes",!1):t.exitCode===1?l("Has staged changes",!0):a(t.stderr.trim()||"Unable to inspect staged changes")};var ri=async e=>{let t=await lo(e);return d(t)?a(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var ii="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Lr=e=>Ve.join(st,eo,e),ai=()=>Ve.join(cl.homedir(),ke),uo=()=>Ve.join(ai(),"worktrees"),Oe=({repoRoot:e})=>{let t=Ks(e);return d(t)?a(t.message):l("Resolved state branch root",Ve.join(uo(),t.value))},ll=e=>Ve.join(e,st),si=e=>Ve.join(ll(e),eo);var Sn=e=>{try{return Pr.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},mo=()=>{let e=Sn(ai());if(d(e))return a(`Ensure epiq home failed.
16
+ `+e.message);let t=Sn(uo());return d(t)?a(`Ensure worktrees dir failed.
17
+ `+t.message):l("Ensured epiq storage",!0)},di=e=>{Pr.existsSync(e)&&(ee.debug("[sync] remove path",e),Pr.rmSync(e,{recursive:!0,force:!0}))};var ci=(e,t)=>{for(let n of[si(e),si(t)]){let o=Sn(n);if(d(o))return a(o.message)}return l("Ensured state branch",void 0)},li=async e=>{let t=await B({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return a(`ensure state branch is storage only failed
18
+ `+t.message);let o=t.value.stdout.trim().split(`
19
+ `).filter(Boolean).filter(i=>i!==st);if(o.length===0)return l("State branch is storage-only",!1);let r=await B({args:["rm","-r","--ignore-unmatch","--",...o],cwd:e});if(d(r))return a(`Failed to clean storage branch
20
+ ${r.message}`);let s=await on({cwd:e,message:"[epiq:repair-storage-branch]"});return d(s)?a(s.message):l("Cleaned storage branch",!0)},ht=Nr(async(e=process.cwd())=>{let t=await B({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?a("Not inside a Git repository"):l("Resolved repo root",t.value.stdout.trim())},e=>Ve.resolve(e)),tv=Nr(async e=>{let t=await B({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return a(t.message);let n=t.value.stdout.trim(),o=Ve.isAbsolute(n)?n:Ve.join(e,n);return l("Resolved git dir",o)},e=>Ve.resolve(e));import rn from"node:fs";import En from"node:path";var mi=async e=>{if((await He({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return l("Initial commit already exists",!1);ee.info("Creating initial commit");let n=await te.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?a(n.message):l("Created initial commit",!0)},ui=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",ul=async e=>{let t=await lo(e);if(d(t))return a(t.message);let n=await ti(e);return d(n)?a(n.message):l("Built sync commit message",`[sync|branch:${ui(t.value)}:sha:${ui(n.value)}]`)},kr=async({repoRoot:e,stateBranchName:t})=>{ee.info(`Creating ${t}`);let n=await B({args:["commit-tree",ii,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return a(`Failed to create state branch commit
21
+ ${n.message}`);let o=n.value.stdout.trim(),r=await B({args:["update-ref",`refs/heads/${t}`,o],cwd:e});return d(r)?a(`Failed to create ${t}
22
+ ${r.message}`):l("Created state branch",!0)},ml=async({repoRoot:e,stateBranchName:t})=>{let n=await Ar({repoRoot:e});if(d(n))return a(`Ensure local state branch failed
23
+ `+n.message);let o=n.value,r=o?await ao({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(d(r))return a(`Ensure local state branch failed
24
+ `+r.message);let s=r.value;if(o&&s){let c=await te.fetch({cwd:e,remote:De,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
25
+ ${c.message}`)}let i=await co({repoRoot:e,branch:t});if(d(i))return a(`Ensure local state branch failed
26
+ `+i.message);if(i.value)return l("Local state branch already exists",!1);if(s){let c=await B({args:["branch","--track",t,`${De}/${t}`],cwd:e});return d(c)?a(`Failed to create local ${t} from remote
27
+ ${c.message}`):l("Created local state branch from remote",!0)}return kr({repoRoot:e,stateBranchName:t})},pl=async({repoRoot:e,branch:t})=>{let n=await B({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let o=n.value.stdout.split(`
28
+ `),r=null;for(let s of o){if(s.startsWith("worktree ")){r=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&r)return l("Found worktree for branch",r)}return l("No worktree found for branch",null)},gl=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=Sn(En.dirname(t));if(d(o))return a(`Failed to create state branch worktree
29
+ `+o.message);rn.existsSync(t)&&!rn.existsSync(En.join(t,".git"))&&(ee.info("Removing broken state branch worktree path"),di(t)),ee.info("Creating state branch worktree");let r=await te.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(r)?a(`Failed to create state branch worktree
30
+ ${r.message}`):l("Created state branch worktree",!0)},$t=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await pl({repoRoot:e,branch:n});if(d(o))return a(o.message);let r=En.resolve(t),s=o.value?En.resolve(o.value):null;if(s&&s===r&&rn.existsSync(s))return l("State branch already checked out in expected worktree",!1);if(s&&s!==r){ee.info("Moving state branch worktree to expected location");let u=await te.worktreeRemove({cwd:e,worktreeRoot:s});if(d(u))return a(`Failed to remove existing state branch worktree
31
+ ${u.message}`)}if(s&&!rn.existsSync(s)){ee.info("Pruning stale state branch worktree");let u=await te.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
32
+ ${u.message}`)}let i=await ei({repoRoot:e,worktreeRoot:t});if(d(i))return a(i.message);let c=rn.existsSync(t);if(i.value&&c)return l("State branch worktree already exists",!1);if(i.value&&!c){ee.info("Pruning missing registered state branch worktree");let u=await te.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
33
+ ${u.message}`)}return gl({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},fl=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await lo(e);if(d(n))return a(n.message);if(n.value===t)return l("State branch already checked out",!1);(await He({cwd:e,args:["rebase","--abort"]})).exitCode===0&&ee.info("Aborted stale state branch rebase");let r=await te.checkout({cwd:e,branch:t});return d(r)?a(`Failed to checkout ${t}
34
+ ${r.message}`):l("Checked out state branch",!0)},vl=async({repoRoot:e,stateBranchRoot:t})=>{let n=await wr(t);if(d(n))return a(n.message);if(n.value)return l("State branch upstream already configured",!1);let o=await Ar({repoRoot:t});if(d(o))return a(o.message);if(!o.value)return l("No remote available for state branch upstream",!1);let r=nn(e);if(d(r))return r;let s=r.value,i=await ao({repoRoot:t,branch:s});if(d(i))return a(i.message);if(!i.value)return l("Remote state branch missing; upstream will be configured on first push",!1);ee.info(`Configuring ${s} upstream`);let c=await te.fetch({cwd:t,remote:De,branch:s});if(d(c))return a(`Failed to fetch ${s}
35
+ ${c.message}`);let u=await te.setUpstream({cwd:t,branch:s,upstream:`${De}/${s}`});return d(u)?a(`Failed to set state branch upstream
36
+ ${u.message}`):l("Configured state branch upstream",!0)},po=async({stateBranchRoot:e,eventFileName:t})=>{let n=Lr(t),o=En.join(e,n);if(!rn.existsSync(o))return l("No event file to stage",void 0);let r=await te.stage({cwd:e,pathspec:[n]});return d(r)?a(`Failed to stage state branch event file
37
+ ${r.message}`):l("Staged state branch event file",void 0)},pi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await ul(e);return d(n)?a(`Create state branch sync commit failed
38
+ `+n.message):on({cwd:t,message:n.value})},Rn=async({repoRoot:e,stateBranchRoot:t})=>{let n=await wr(t);if(d(n))return a(n.message);let o=nn(e);if(d(o))return o;let r=o.value,s=n.value?await te.push({cwd:t}):await te.push({cwd:t,remote:De,branch:r,setUpstream:!0});return d(s)?a(`Failed during state branch push
39
+ ${s.message}`):l("Pushed state branch",!0)},gi=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let o=!1,r=nn(e);if(d(r))return r;let s=r.value,i=[mo(),await ml({repoRoot:e,stateBranchName:s}),await $t({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await fl({stateBranchRoot:t,stateBranchName:s}),await li(t),n?await vl({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(d(c))return a(c.message);o=o||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",o)};import{WebSocket as yl}from"ws";var go=new Set,fi=e=>{go.add(e),e.on("close",()=>{go.delete(e)}),e.on("error",()=>{go.delete(e)})},Wt=e=>{let t=JSON.stringify(e);for(let n of go)n.readyState===yl.OPEN&&n.send(t)};import{useSyncExternalStore as Lp}from"react";var w={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Dr(e){return e.context===w.WORKSPACE}function A(e){return e.context===w.TICKET}function bt(e){return e.context===w.TEXT}function Ge(e){return e.context===w.FIELD}function Tn(e){return e.context===w.FIELD_LIST}var Ct=e=>e.context===w.SWIMLANE,fo=e=>e.context===w.BOARD,An=e=>e.context===w.COMMENT;var f={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var vi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",yi=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",xi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",hi=(e,t)=>{if(yi(e,e.sequence))return x.MoveCursorLeftOfWord;if(xi(e,e.sequence))return x.MoveCursorRightOfWord;if(vi(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.GetLastCommandFromHistory;case"down":return x.GetNextCommandFromHistory;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}},Ii=(e,t)=>{if(yi(e,e.sequence))return x.MoveCursorLeftOfWord;if(xi(e,e.sequence))return x.MoveCursorRightOfWord;if(vi(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.NavPreviousItem;case"down":return x.NavNextItem;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}};function vo(e,t){let n=Math.min(e.length,t.length),o=0;for(;o<n&&e[o]===t[o];)o++;return o}var yo=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Nt=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),bi=e=>e.charAt(0).toUpperCase()+e.slice(1);var Ci=e=>{let t=new Map;for(let n of e)for(let o=1;o<=n.length;o++){let r=n.slice(0,o),s=t.get(r);s?s.push(n):t.set(r,[n])}return t},Ni=(e,t)=>t?e.get(t)??[]:[];var Si=new WeakMap,xl=e=>{let t=Si.get(e);return t||(t=Ci(e),Si.set(e,t)),t};var Ei=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let o=t.toLowerCase();return Ni(xl(e),o).filter(s=>vo(o,s)>=n)};var hl={hint:"",hints:[],overlap:0,remainder:""},Ri=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},o)=>{if(n||e==="")return hl;let r=Ei({wordList:o,inputToMatch:e,overlapThreshold:1});return Il(t,r)},Il=(e,t)=>{let n=t[0]??"",o=vo(e.toLowerCase(),n.toLowerCase()),[r,s]=n.split(":"),i=o<(r??"").length,c=!!s,p=(c&&i?r:n)+(c&&i?":":" "),v=p.slice(o);return{hint:p,hints:t,overlap:o,remainder:v}};import{useSyncExternalStore as bl}from"react";var wn={logLevel:"info",autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Fr=new Set,Cl=()=>{for(let e of Fr)e()},_=()=>wn,Ti=()=>bl(e=>(Fr.add(e),()=>{Fr.delete(e)}),()=>wn),Fe=e=>(wn={...wn,...e},Cl(),wn);import{ulid as El}from"ulid";var sn=24n,Nl=sn*4n,Ke=(1n<<Nl)-1n,Sl=/^[0-9a-f]+$/;function Ai(e){return!e||!Sl.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function Be(e,t=sn){if(e<0n)return a("Negative rank not allowed");let n=e.toString(16);return l("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Ce(e,t){if(!e&&!t)return Be(Ke/2n,sn);let n=e?Ai(e):l("Resolved lower bound",0n);if(d(n))return n;let o=t?Ai(t):l("Resolved upper bound",Ke);if(d(o))return o;let r=n.value,s=o.value;if(s<=r)return Be(Ke/2n,sn);let i=(r+s)/2n;return i===r||i===s?a("No rank space available between neighbors"):Be(i,sn)}function wi(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let o=0;o<e;o++){let r=Ke*BigInt(o+1)/(t+1n),s=Be(r,sn);if(d(s))return s;n.push(s.value)}return l("Resolved evenly spaced ranks",n)}var Br=(e,t)=>{let n=j(e),o=wi(n.length);if(d(o))return o;let r={};for(let s=0;s<n.length;s++){let i=n[s],c=o.value[s];if(!i||!c)return a("Unable to assign rebalance rank");r[i.id]=c}return l("Created rebalance event",{id:El(),action:"rebalance.children",payload:{parent:e,ranks:r},...t})};import{ulid as Tu}from"ulid";var it=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o)return a("Node not found");if(o.context===t)return l("Resolved ancestor node",o);let r=o.parentNodeId?n[o.parentNodeId]:void 0;for(;r;){if(r.context===t)return l("Resolved ancestor node",r);r=r.parentNodeId?n[r.parentNodeId]:void 0}return a(`No ancestor found for context: ${t}`)},Ur=(e,t)=>{let{nodes:n}=g(),o=n[e];for(;o?.parentNodeId;){if(o.parentNodeId===t)return!0;o=n[o.parentNodeId]}return!1},_t=(e,t)=>e?e.readonly?a({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:a("Node not found"),I={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.userId&&n.userId!==t)return a("Contributor is already linked to another user");let o={...n,userId:t},r=ue(s=>({...s,contributors:{...s.contributors,[e]:o}}));return d(r)?a("Unable to link contributor to user"):l("Linked contributor to user",o)},deleteNode(e){ue(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create comment, missing issue");if(!A(t))return a("Can only comment on issues");let n=ue(o=>({...o,comments:{...o.comments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?a("Unable to create comment"):l("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return a("Unable to edit comment, missing comment");let o=this.getNode(n.issue);if(!o)return a("Unable to edit comment, missing issue");if(!A(o))return a("Can only edit issue comments");let r={...n,md:t,deleted:!1},s=ue(i=>({...i,comments:{...i.comments??{},[e]:r}}));return d(s)?a("Unable to edit comment"):l("Edited comment",r)},deleteComment(e){let t=this.getComment(e);if(!t)return a("Unable to delete comment, missing comment");let n={...t,deleted:!0},o=ue(r=>({...r,comments:{...r.comments??{},[e]:n}}));return d(o)?a("Unable to delete comment"):l("Deleted comment",n)},getComment(e){return g().comments?.[e]},getCommentsByIssue(e){return Object.values(g().comments??{}).filter(t=>t.issue===e&&!t.deleted)},editValue(e,t){let{nodes:n}=g(),o=n[e];if(!o)return a("Edit target node not found");let r=_t(o,"edit");if(r)return r;let s={...o,props:{...o.props,description:t}};return this.updateNode(s),l("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return a("Rename target node not found");let o=_t(n,"rename");if(o)return o;let r={...n,title:t};return this.updateNode(r),l("Renamed node",r)},getExistingTags(){let{tags:e}=g();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=g();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return j(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:o}=g(),r=this.getNode(e),s=this.getNode(t);if(!r)return a("Node not found");if(!s)return a("Target parent not found");if(o===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let i=_t(r,"move");if(i)return i;if(Ur(t,e))return a("Cannot move node into its own descendant");let c={...r,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:o}=g(),r=this.getNode(e);if(!r)return a("Node not found");if(o===e)return a("Cannot delete root node");let s=new Set,i=u=>{let m=t[u];if(!(!m||s.has(u))){s.add(u);for(let p of j(m.id))i(p.id)}};i(e);let c={...structuredClone(t)};for(let u of s){if(!c[u])return a("Unable to locate node to delete");c[u]={...c[u],isDeleted:!0}}return n?(N({nodes:c}),l("Successfully tomb stoned",r)):a("Unable to delete undefined")},createContributor(e){let t=ue(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?a("Unable to create contributor"):l("Created contributor",e)},assign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!o)return a("Unable to assign contributor, missing target");let r=_t(o,"edit");if(r)return r;if(!A(o))return a("Target is not an issue");let s=o.props.assignees??[];if(s.includes(t))return a("Contributor already assigned");let i={...o,props:{...o.props,assignees:[...s,t]}};return this.updateNode(i),l("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!o)return a("Unable to unassign, missing target");let r=_t(o,"edit");if(r)return r;if(!A(o))return a("Target is not an issue");let s=o.props.assignees??[];if(!s.includes(t))return l("Issue is not assigned to that contributor",{assignee:t});let i={...o,props:{...o.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(i),l("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!o)return a("Unable to add tag, missing target");let r=_t(o,"edit");if(r)return r;if(!A(o))return a("Target is not an issue");let s=o.props.tags??[];if(s.includes(t))return a("Tag already assigned");let i={...o,props:{...o.props,tags:[...s,t]}};return this.updateNode(i),l("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!o)return a("Unable to remove tag, missing target");let r=_t(o,"edit");if(r)return r;if(!A(o))return a("Target is not an issue");let s=o.props.tags??[];if(!s.includes(t))return l("Issue is not tagged with that tag",{tag:t});let i={...o,props:{...o.props,tags:s.filter(c=>c!==t)}};return this.updateNode(i),l("Tag removed",{tag:t})},createTag(e){let t=ue(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):l("Tag created",e)},createNode(e){let t=ue(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?a("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return a("Failed to locate node");let n={...t,readonly:!0},o=ue(r=>({...r,nodes:{...r.nodes,[e]:n}}));return d(o)?a(o.message):l("Locked node",n)},updateNode(e){let t=ue(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:l("Updated node",e)},getContributor(e){return g().contributors[e]},getTag(e){return g().tags[e]},getNode(e){return g().nodes[e]},getSiblings(e){return j(e)}};var ne={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments"};var Y={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:w.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,o,r=!1)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:o,props:r={},childRenderAxis:s="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:w.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),fieldList:({id:e,name:t,parentNodeId:n,rank:o,childRenderAxis:r="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.FIELD_LIST,childRenderAxis:r,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!0,isVirtual:s=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:w.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:r,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:o,props:r={},readonly:s=!0,isVirtual:i=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:w.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};import jt from"chalk";import Fi from"string-width";import{decodeTime as kl}from"ulid";import dn from"chalk";var me={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},y={accent:me.cyan,accent2:me.magenta,primary:me.white,secondary:me.grayDark,secondary2:me.grayLight,gray:me.gray,green:me.green,yellow:me.yellow,red:me.red};var b={red:me.red,yellow:me.yellow,green:me.green,blue:me.blue,magenta:me.magenta,cyan:me.cyan},an={urgent:b.red,critical:b.red,important:b.red,blocker:b.red,asap:b.red,immediate:b.red,fail:b.red,failure:b.red,broken:b.red,bug:b.red,error:b.red,incident:b.red,outage:b.red,production:b.red,crash:b.red,security:b.red,warning:b.yellow,warn:b.yellow,risky:b.yellow,risk:b.yellow,attention:b.yellow,pending:b.yellow,review:b.yellow,"needs-review":b.yellow,qa:b.yellow,testing:b.yellow,test:b.yellow,validate:b.yellow,verification:b.yellow,staging:b.yellow,check:b.yellow,"follow-up":b.yellow,followup:b.yellow,waiting:b.yellow,blocked:b.yellow,hold:b.yellow,done:b.green,complete:b.green,completed:b.green,success:b.green,ok:b.green,stable:b.green,resolved:b.green,fixed:b.green,closed:b.green,merged:b.green,released:b.green,deployed:b.green,approved:b.green,verified:b.green,working:b.green,healthy:b.green,pass:b.green,passing:b.green,info:b.blue,information:b.blue,note:b.blue,docs:b.blue,documentation:b.blue,doc:b.blue,guide:b.blue,help:b.blue,explanation:b.blue,detail:b.blue,details:b.blue,context:b.blue,design:b.blue,discussion:b.blue,proposal:b.blue,idea:b.blue,feature:b.magenta,enhancement:b.magenta,improvement:b.magenta,refactor:b.magenta,refactoring:b.magenta,cleanup:b.magenta,optimize:b.magenta,optimization:b.magenta,perf:b.magenta,performance:b.magenta,upgrade:b.magenta,migration:b.magenta,modernize:b.magenta,debt:b.magenta,todo:b.cyan,next:b.cyan,planned:b.cyan,plan:b.cyan,future:b.cyan,backlog:b.cyan,investigate:b.cyan,explore:b.cyan,prototype:b.cyan};var $r={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Mi=(e,t,n)=>Math.max(t,Math.min(n,e)),Or=(e,t,n)=>e+(t-e)*n,Pi=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Rl=e=>e.toLowerCase().trim(),Tl=(e,t,n)=>{let o=t/100,r=n/100,s=(1-Math.abs(2*r-1))*o,i=e/60,c=s*(1-Math.abs(i%2-1)),u=0,m=0,p=0;i>=0&&i<1?(u=s,m=c):i>=1&&i<2?(u=c,m=s):i>=2&&i<3?(m=s,p=c):i>=3&&i<4?(m=c,p=s):i>=4&&i<5?(u=c,p=s):(u=s,p=c);let v=r-s/2;return[Math.round((u+v)*255),Math.round((m+v)*255),Math.round((p+v)*255)]},Al=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var wl=(e,t,n)=>{let o=Mi(n,0,1);return[Math.round(Or(e[0],t[0],o)),Math.round(Or(e[1],t[1],o)),Math.round(Or(e[2],t[2],o))]};var Ml=(e,t,n)=>wl(e,t,n),Mn=e=>{let n=Pi(e)%360,o=Tl(n,$r.stringColor.saturation,$r.stringColor.lightness);return Al(o)},oe=(e,t=an)=>{let n=Rl(e);return n&&t[n]?t[n]:Mn(n)};var Pl=e=>{let t=$r.gradient.stops,n=Mi(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let o=t.length-1,r=n*o,s=Math.min(Math.floor(r),o-1),i=r-s;return Ml(t[s],t[s+1],i)},xo=e=>Pi(e.toLowerCase().trim())/4294967295,Li=e=>{let t=xo(e);return Pl(t)},Ll=e=>{let[t,n,o]=Li(e);return{normal:r=>dn.bgRgb(t,n,o).black(r),cursor:r=>dn.bgRgb(t,n,o).white.bold(r)}},Wr=e=>{let[t,n,o]=Li(e);return{fg:r=>dn.rgb(t,n,o)(r),fgCursor:r=>dn.rgb(t,n,o).inverse(r),bg:r=>dn.bgRgb(t,n,o).black(r),bgCursor:r=>dn.bgRgb(t,n,o).white.bold(r)}},ho=e=>Ll(e).normal(` ${e} `);import{decodeTime as ki}from"ulid";var Io=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:o,ms:r}of n){let s=Math.floor(t/r);if(s>=1)return`${s}${o} ago`}return"just now"},Di=e=>{let t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},bo=e=>{try{return l("Decoded date",new Date(ki(e)))}catch(t){return a("Decoding failed + "+t.message)}},_r=e=>{if(!e?.id)return null;try{return ki(e.id)}catch{return null}};var Dl=(e,t)=>e+" ".repeat(Math.max(0,t-Fi(e))),Fl=(e,t)=>" ".repeat(Math.max(0,t-Fi(e)))+e,Bl=e=>({"add.issue":"Created with title","add.issue.assignee":"Assigned to","remove.issue.assignee":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","add.issue.tag":"Tagged with","remove.issue.tag":"Removed tag","lock.node":"Locked node","move.node":"Moved issue","add.issue.comment":"Commented","delete.issue.comment":"Deleted comment"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),Ul=(e,t)=>t?e<t?"up":e>t?"down":null:null,Ol=(e,t)=>{let n=I.getNode(e.payload.parent),o=n?jt.dim.bgBlack(` ${n.title} `):"unknown",r=t.at(-1);if(r&&"parent"in r&&"rank"in r&&r.parent===e.payload.parent){let s=Ul(e.payload.rank,r.rank);if(s)return`Moved ${s} in ${o}`}return`Moved issue to ${o}`},$l=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?jt.bgHex(oe(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?jt.bgHex(oe(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?jt.hex(oe(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?jt.hex(oe(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},Wl=e=>{let t=Io(kl(e));return jt.gray(Fl(t,8))},_l=12,jl=e=>Dl(`${e}`,_l),Bi=(e,t)=>{let n=Wl(e.id),o=jl(e.userName),r=jt.dim("\u203A"),s=e.action==="move.node"?Ol(e,t):[Bl(e.action),$l(e)].filter(Boolean).join(" ");return`${o} ${n} ${r} ${s}`};import{createHash as Hl}from"node:crypto";var Vl="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Gl=e=>{let t=Hl("sha256").update(e).digest(),n=0n;for(let r=0;r<16;r++)n=n<<8n|BigInt(t[r]);let o="";for(let r=0;r<26;r++){let s=BigInt((25-r)*5);o+=Vl[Number(n>>s&31n)]}return o},Ne=(e,t)=>Gl(`${e}:virtual:${t}`);var Kl=e=>Ne(e,"comments"),zl=e=>Ne(e,"description"),ql=e=>Ne(e,"assignees"),Yl=e=>Ne(e,"tags"),Xl=e=>Ne(e,"history"),jr=({id:e,name:t,parentNodeId:n,rank:o,value:r,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=I.getNode(e);if(!c){let p=I.createNode({...Y.field({id:e,name:t,parentNodeId:n,rank:o,props:{value:r},isVirtual:!0}),readonly:s,childRenderAxis:i});return d(p)?p:l("Virtual field created",void 0)}if(!Ge(c))return a(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==o||c.props.value!==r||c.readonly!==s||c.childRenderAxis!==i))return l("Virtual field unchanged",void 0);let m=I.updateNode({...c,title:t,parentNodeId:n,rank:o,props:{...c.props,value:r},readonly:s,childRenderAxis:i});return d(m)?m:l("Virtual field updated",void 0)},Ui=({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!1,childRenderAxis:s="horizontal"})=>{let i=I.getNode(e);if(!i){let m=I.createNode({...Y.fieldList({id:e,name:t,parentNodeId:n,rank:o,isVirtual:!0}),readonly:r,childRenderAxis:s});return d(m)?m:l("Virtual field list created",void 0)}if(!Tn(i))return a(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==o||i.readonly!==r||i.childRenderAxis!==s))return l("Virtual field list unchanged",void 0);let u=I.updateNode({...i,title:t,parentNodeId:n,rank:o,readonly:r,childRenderAxis:s});return d(u)?u:l("Virtual field list updated",void 0)},Oi=e=>{let t=Be(Ke/4n),n=Be(Ke/2n),o=Be(Ke*3n/4n),r=Be(Ke*7n/8n),s=Be(Ke*13n/16n);if(d(t))return t;if(d(n))return n;if(d(o))return o;if(d(r))return r;if(d(s))return s;let i=jr({id:zl(e.id),name:ne.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(i))return i;let c=Ui({id:ql(e.id),name:ne.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(c))return c;let u=Ui({id:Yl(e.id),name:ne.TAGS,parentNodeId:e.id,rank:o.value,readonly:!0});if(d(u))return u;let m=jr({id:Kl(e.id),name:ne.COMMENTS,parentNodeId:e.id,rank:r.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(m))return m;let p=jr({id:Xl(e.id),name:ne.HISTORY,parentNodeId:e.id,rank:s.value,value:Jl(e),readonly:!0,childRenderAxis:"vertical"});return d(p)?p:l("Ticket virtual nodes materialized",void 0)},Jl=e=>{let t=[...e.log].reverse(),n=new Map;for(let o of t){let r=n.get(o.action)??[];r.push(o.payload),n.set(o.action,r)}return t.map(o=>Bi(o,n.get(o.action)??[])).join(`
40
+ `)};var Ql=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[de,Co]=Ql;var L=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),$i=e=>{let t=I.getNode(e);if(!t||!A(t)||t.isDeleted)return null;let n=Oi(t);return d(n)?n:null},Zl=e=>{for(let t of e){let n=$i(t);if(n)return n;let o=g().nodes[t]?.parentNodeId;if(!o)continue;let r=$i(o);if(r)return r}return null},eu=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},tu=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},nu=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":return[e.payload.issue];case"delete.node":case"edit.description":return tu(e.payload.id);case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"move.node":case"close.issue":case"reopen.issue":case"add.issue.tag":case"remove.issue.tag":case"add.issue.assignee":case"remove.issue.assignee":return[e.payload.id];case"rebalance.children":return Object.keys(e.payload.ranks);case"create.tag":case"create.contributor":case"link.contributor.user":default:return[]}},ou=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},ru=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?L("Invalid user ID format",e):l("Valid user",null)},su=(e,t)=>{let n=ru(e);if(d(n))return n;let o=[...new Set(nu(e))];t||(o.forEach(s=>eu(s,e)),ou(e));let r=Zl(o);return r||null},iu={"init.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=Y.workspace(t,n,o),s=Ln(r);if(d(s))return L(s.message,e);let i=I.createNode(r);return d(i)?L(i.message??"Failed to initialize workspace",e):Dr(i.value)?l("Workspace initialized",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=I.createNode(Y.workspace(t,n,o));return d(r)?L(r.message??"Failed to add workspace",e):Dr(r.value)?l("Added workspace",{action:e.action,result:r.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=I.createNode(Y.board(t,n,o,r));return d(s)?L(s.message??"Unable to create board",e):fo(s.value)?l("Added board",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=I.createNode(Y.swimlane(t,n,o,r));return d(s)?L(s.message??"Unable to create swimlane",e):Ct(s.value)?l("Added swimlane",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=I.createNode(Y.ticket(t,n,o,r));return d(s)?L(s.message??"Unable to create issue",e):A(s.value)?l("Added issue",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:o,val:r,rank:s}=e.payload,i=I.createNode(Y.field({id:t,name:n,parentNodeId:o,rank:s,props:{value:r},childRenderAxis:n.includes(ne.DESCRIPTION)?"vertical":"horizontal"}));return d(i)?L(i.message??`Unable to create field: ${n}`,e):Ge(i.value)?l("Added field",{action:e.action,result:i.value}):a("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!I.getNode(t))return L(`Unable to locate node with id ${t}`,e);let r=I.renameNode(t,n);return d(r)?L(r.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:r.value})},"delete.node":e=>{let{id:t}=e.payload,n=I.tombstoneNode(t);return d(n)?L(n.message??"Unable to delete node",e):l("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,o=I.createTag({id:t,name:n});return d(o)?L(o.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:o.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,o=I.createContributor({id:t,name:n});return d(o)?L(o.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:o.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=I.tag(t,n);return d(o)?L(o.message??"Unable to tag issue",e):l("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=I.untag(t,n);return d(o)?L(o.message??"Unable to untag issue",e):l("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,o=I.assign(t,n);return d(o)?L(o.message??"Unable to assign issue",e):l("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,o=I.unassign(t,n);return d(o)?L(o.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(r)?L(r.message??"Failed to move node",e):l("Moved node",{action:e.action,result:r.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,o=I.editValue(t,n);return d(o)?L(o.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:o.value})},"close.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.getNode(t);if(!r)return L("Unable to locate issue",e);if(!A(r))return L("Can only close issues",e);let s=I.getNode(de);if(!s)return L("Unable to locate target swimlane",e);if(n!==s.id)return L("Close target must be closed swimlane",e);let i=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(i)?L(i.message??"Unable to close issue",e):l("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.getNode(t);if(!r)return L("Unable to locate issue",e);if(!A(r))return L("Can only reopen issues",e);let s=I.getNode(de);if(!s)return L("Unable to locate closed swimlane",e);if(n===s.id)return L("Cannot reopen issue into closed swimlane",e);if(!I.getNode(n))return L("Reopen parent no longer exists",e);let c=I.moveNodeToRank({id:t,parentId:n,rank:o});return d(c)?L(c.message??"Unable to reopen issue",e):l("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=I.lockNode(t);return d(n)?L(n.message??"Unable to lock node",e):l("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[o,r]of Object.entries(n)){let s=I.getNode(o);if(!s)return L(`Unable to locate node ${o}`,e);if(s.parentNodeId!==t)return L(`Node ${o} is not child of ${t}`,e);let i=I.updateNode({...s,rank:r});if(d(i))return L(i.message??"Unable to rebalance child",e)}return l("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:o,md:r}=e.payload,s=I.createComment({id:t,issue:n,authorId:o,authorName:I.getContributor(o)?.name??"Unknown",md:r,deleted:!1});return d(s)?L(s.message??"Unable to add comment",e):l("Comment added",{action:e.action,result:{id:t,issue:n,author:o,md:r}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:o}=e.payload,r=I.getComment(t);if(!r)return L("Unable to locate comment",e);if(r.issue!==n)return L("Comment does not belong to issue",e);let s=I.editComment(t,o);return d(s)?L(s.message??"Unable to edit comment",e):l("Comment edited",{action:e.action,result:{id:t,issue:n,md:o}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,o=I.getComment(t);if(!o)return L("Unable to locate comment",e);if(o.issue!==n)return L("Comment does not belong to issue",e);let r=I.deleteComment(t);return d(r)?L(r.message??"Unable to delete comment",e):l("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=I.linkUserId({contributorId:t,userId:e.userId});return d(n)?L(n.message??"Unable to link contributor",e):l("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function Pn(e,t=!1){let n=iu[e.action](e);if(d(n))return n;let o=su(e,t);return o||n}var Ht=e=>e.map(t=>Pn(t));import yu from"node:fs";import xu from"node:path";import{decodeTime as hu,monotonicFactory as Iu}from"ulid";import{z as kn}from"zod";import No from"node:fs";import Vr from"node:path";import{decodeTime as au}from"ulid";import{z as Hr}from"zod";var du=Hr.object({userId:Hr.string().min(1).default("unknown"),userName:Hr.string().min(1).default("unknown")}),cu=e=>{let[t,n]=Vr.basename(e,".jsonl").split("."),o=du.safeParse({userId:t,userName:n});return o.success?l("Parsed event file actor",o.data):a(`Invalid event file name ${Vr.basename(e)}: ${o.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},lu=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?a(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?a("Invalid persisted event: action key is missing or invalid"):l("Resolved persisted action",t[0])},uu=(e,t)=>t in e,mu=({id:e,action:t,payload:n,userId:o,userName:r})=>({id:e,action:t,payload:n,userId:o,userName:r}),pu=e=>{let{userId:t,userName:n,...o}=e,r=lu(o);if(d(r))return a(r.message);let s=r.value,i=e.id?.[0];return i?uu(o,s)?l("Decoded persisted event",mu({id:i,action:s,payload:o[s],userId:t,userName:n})):a(`Persisted event is missing payload for action: ${s}`):a("Persisted event is missing id")},Gr=e=>{let t=[];for(let n of e){let o=pu(n);if(d(o))return a(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${o.message}`);t.push(o.value)}return l("Decoded reconstructed events",t)},gu=e=>{if(!No.existsSync(e))return l("Event file missing",[]);let t=cu(e);if(d(t))return a(t.message);let n=No.readFileSync(e,"utf8"),o=[];for(let r of n.split(`
41
+ `)){let s=r.trim();if(!s)continue;let i;try{i=JSON.parse(s)}catch{return a(`Failed to parse event JSON from ${e}: ${s}`)}let c=zr(i);if(d(c))return a(`${c.message} in ${e}: ${s}`);o.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return l("Parsed persisted events file",o)};function Kr(e){let t=In(e);if(!No.existsSync(t))return l("No events found",[]);let n=No.readdirSync(t).filter(r=>r.endsWith(".jsonl")).map(r=>Vr.join(t,r)),o=[];for(let r of n){let s=gu(r);if(d(s))return a(s.message);o.push(...s.value)}return l("All events loaded",fu(o))}function at(e){let t=Kr(e);return d(t)?a(t.message):Gr(t.value)}function Wi(e,t){let n=Kr(e);if(d(n))return a(n.message);let{appliedEvents:o,unappliedEvents:r}=vu(n.value,t),s=Gr(o);if(d(s))return a(s.message);let i=Gr(r);return d(i)?a(i.message):l("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:i.value})}function _i(e=process.cwd()){let t=Kr(e);return d(t)?a(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var fu=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],v=m.id[1]??null;t.set(p,m);let C=n.get(v)??[];C.push(m),n.set(v,C)}for(let m of n.values())m.sort((p,v)=>p.id[0].localeCompare(v.id[0]));let o=[],r=new Set,s=m=>{let p=m.id[0];if(r.has(p))return;o.push(m),r.add(p);let v=n.get(p)??[];for(let C of v)s(C)},i=n.get(null)??[];for(let m of i)s(m);let c=e.filter(m=>{let p=m.id[0],v=m.id[1]??null;return!r.has(p)&&v!==null&&!t.has(v)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of c)s(m);let u=e.filter(m=>!r.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)s(m);return o},vu=(e,t)=>{let n=new Set,o=[],r=[];for(let s of e){let i=s.id[0],c=s.id[1],u=!1;try{u=au(i)<t}catch{u=!1}!u||c&&n.has(c)?(n.add(i),r.push(s)):o.push(s)}return{appliedEvents:o,unappliedEvents:r}};var ji=e=>({action:e.action,payload:e.payload});var Gi=1,Hi=Iu(),bu=kn.tuple([kn.string().min(1),kn.string().min(1).nullable()]),Cu=kn.looseObject({v:kn.literal(Gi),id:bu}),zr=e=>{let t=Cu.safeParse(e);return t.success?l("Parsed persisted event",t.data):a(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Vi=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Nu=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Su=e=>e.trim().length>0&&e.length<=80,X=()=>{let{userName:e,userId:t}=_();return e?t?Nu(t)?Su(e)?l("Successfully resolved actor ID",{userId:t,userName:e}):a("Invalid user name in config"):a("Invalid user ID in config"):a("User ID not configured"):a("User name not configured")},Vt=({userId:e,userName:t})=>`${Vi(e)}.${Vi(t)}.jsonl`,Eu=(e,{userId:t,userName:n})=>{let o=Vt({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(o))return a(`Invalid event log file name: ${o}`);let s=xu.join(In(e),o);return l("Successfully resolved event log path",s)},Ru=(e,t)=>{let n={[e.action]:e.payload,v:Gi,id:t};return zr(n)};function So({event:e,rootDir:t}){try{let n=Gs(t);if(d(n))return n;let o=Eu(t,{userId:e.userId,userName:e.userName});if(d(o))return o;let r=_i(t);if(d(r))return a(r.message);let s=r.value?Hi(Math.max(Date.now(),hu(r.value)+1)):Hi(),i=Ru(ji(e),[s,r.value]);return d(i)?a(i.message):(yu.appendFileSync(o.value,`${JSON.stringify(i.value)}
42
+ `,"utf8"),l("Event persisted",{path:o.value,entry:i.value}))}catch(n){let o=n instanceof Error?n.message:"Unknown persist error";return a(`Failed to persist event: ${o}`)}}function Ki(e,t){let n=Pn(e);if(n.status!==xt.Success)return n;let o=So({event:e,rootDir:t});return d(o)?o:n}function F(e,t){if(e.length===0||!e[0])return a("No events provided");let n=Au(e[0],t);if(d(n))return n;let o=e.map(s=>Ki(s,t)),r=o.filter(d);return r.length>0?a("Materialize and persist failed: "+r.map(s=>s.message).join(", ")):l("Materialization succeeded",o.map(s=>s.value))}var Au=(e,t)=>{if(e.action==="create.contributor")return l("Contributor already being created",void 0);if(I.getContributor(e.userId))return l("Contributor exists",void 0);let n={id:Tu(),action:"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName},o=Ki(n,t);return d(o)?a(o.message):l("Contributor created",void 0)};var zi=e=>Eo(j(e),{at:"end"}),Eo=(e,t={at:"end"})=>{let n=o=>d(o)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(Ce(void 0,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Ce(void 0,o.rank)):a("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Ce(o.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let o=qi(e,t.sibling);if(o<0)return a("Sibling not found");let r=o>0?e[o-1]:void 0,s=e[o];return s?n(Ce(r?.rank,s.rank)):a("Sibling not found")}case"after":{let o=qi(e,t.sibling);if(o<0)return a("Sibling not found");let r=e[o],s=o<e.length-1?e[o+1]:void 0;return r?n(Ce(r.rank,s?.rank)):a("Sibling not found")}}},j=e=>Object.values(g().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),qi=(e,t)=>e.findIndex(n=>n.id===t),Yi=(e,t,n={at:"end"})=>Eo(j(t).filter(o=>o.id!==e),n),Gt=(e,t,n,o,r)=>{let s=Yi(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return l("Resolved rank",s.value.rank);let i=Br(e,o);if(d(i))return i;let c=F([i.value],r);if(d(c))return c;let u=Yi(t,e,n);return d(u)?u:u.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",u.value.rank)},cn=(e,t,n)=>{let o=zi(e);if(d(o))return o;if(!o.value.needsRebalance)return l("Resolved rank",o.value.rank);let r=Br(e,t);if(d(r))return r;let s=F([r.value],n);if(d(s))return s;let i=zi(e);return d(i)?i:i.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",i.value.rank)};var T={exit(){process.exit(0)},enterChildNode(){let e=g(),t=e.contextNode,n=Math.max(0,e.selectedIndex),o=W(t.id),r=o[n];r&&(t.context==="FIELD"&&o.length===0||r.context==="COMMENT"||r.context==="TEXT"||T.navigate({contextNode:r,selectedIndex:W(r.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=g();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let o=W(n.id),r=o.findIndex(({id:i})=>i===e.id),s=o.length===0?-1:r>=0?r:0;T.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Xi(1),navigateToPreviousItem:()=>Xi(-1),navigateToNextContainer:()=>Ji(1),navigateToPreviousContainer:()=>Ji(-1),navigate:({contextNode:e,selectedIndex:t})=>{N({contextNodeId:e.id,selectedIndex:t})}},Xi=e=>{let{selectedIndex:t,contextNode:n}=g(),o=W(n.id).length;if(o===0)return;let s=(Math.max(0,t)+e+o)%o;T.navigate({selectedIndex:s,contextNode:n})},Ji=e=>{let{contextNode:t,nodes:n,selectedIndex:o}=g();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let r=n[t.parentNodeId];if(!r)return;let s=W(r.id),i=s.findIndex(C=>C.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let u=W(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,o),m),v=u.length?p:-1;T.navigate({contextNode:c,selectedIndex:v})};var Zi=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),ea=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=g();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},wu=e=>{let t=g().nodes[e];return!!t&&!t.isDeleted&&Ge(t)&&t.childRenderAxis==="vertical"},Ro=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o||o.isDeleted)return!1;let r=j(o.id);return T.navigate({contextNode:o,selectedIndex:Zi(t,r.length)}),!0},ta=e=>{let{nodes:t}=g(),n=t[e];if(!n||n.isDeleted)return!1;let o=n.parentNodeId;if(!o)return Ro(n.id,0);let r=t[o];if(!r||r.isDeleted)return!1;let i=j(r.id).findIndex(c=>c.id===n.id);return i>=0?(T.navigate({contextNode:r,selectedIndex:i}),!0):ta(r.id)},Qi=e=>{let{nodes:t}=g(),n=e,o=new Set;for(;n&&!o.has(n);){if(o.add(n),ta(n))return!0;n=t[n]?.parentNodeId}return!1},Mu=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},na=e=>{let{nodes:t,rootNodeId:n}=g();if(wu(e.contextNodeId)&&Ro(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Mu(e.selectedNodeId)&&e.selectedNodeId&&Qi(e.selectedNodeId))return l("Restored navigation to selected node or ancestor",null);if(Ro(e.contextNodeId,e.selectedIndex))return l("Restored navigation to previous container",null);if(e.parentNodeId&&Ro(e.parentNodeId,e.selectedIndex))return l("Restored navigation to previous parent",null);if(Qi(e.contextNodeId))return l("Restored navigation to previous container or ancestor",null);let o=t[n];if(!o||o.isDeleted)return a("Unable to restore navigation");let r=j(o.id);return T.navigate({contextNode:o,selectedIndex:Zi(e.selectedIndex,r.length)}),l("Restored navigation to root",null)};import{monotonicFactory as Pu,ulid as dt}from"ulid";var Dn=Pu();function Lu(){let e=ze();if(d(e))return a("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[o]=W(n.id),[r]=o?W(o.id):[];if(r){let s=t.renderedChildrenIndex?.[r.id]??[];return l("Resolved boot nav target",{contextNode:r,selectedIndex:s.length>0?0:-1})}else return o?l("Resolved boot nav target",{contextNode:o,selectedIndex:0}):n?l("Resolved boot nav target",{contextNode:n,selectedIndex:0}):l("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function ku(){let e=Lu();return d(e)?e:T.navigate(e.value)}function oa({userId:e,userName:t}){let n=Dn(),o=Dn(),r=Dn(),s=Dn(),i=Dn(),c=Ce(void 0,void 0);if(d(c))return c;let u=Ce(void 0,void 0);if(d(u))return u;let m=Ce(u.value,void 0);if(d(m))return m;let p=Ce(void 0,void 0);if(d(p))return p;let v=Ce(p.value,void 0);if(d(v))return v;let C=Ce(v.value,void 0);if(d(C))return C;let E=Ce(void 0,void 0);return d(E)?E:l("Created default events",[{id:dt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:dt(),userId:e,userName:t,action:"add.board",payload:{id:o,name:"Default",parent:n,rank:u.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:r,name:"Todo",parent:o,rank:p.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:o,rank:v.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"Done",parent:o,rank:C.value}},{id:dt(),userId:e,userName:t,action:"add.board",payload:{id:Co,name:"Closed",parent:n,rank:m.value}},{id:dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:de,name:"Closed",parent:Co,rank:E.value}},{id:dt(),userId:e,userName:t,action:"lock.node",payload:{id:Co}},{id:dt(),userId:e,userName:t,action:"lock.node",payload:{id:de}}])}function Kt(e){if(!e.length){let o=Y.workspace("temporary-uninitialized-workspace","Workspace","a0"),r=Ln(o);return d(r)?r:(N({hasProjectDefinition:!1,mode:f.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!e.some(o=>o.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=Ht(e).filter(d);return n.length>0?a(`Materializing failed:
43
+ ${n.map(o=>o.message).join(`
44
+ `)}`):(ku(),N({hasProjectDefinition:!0}),l("State booted successfully",null))}var zt=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),To=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}},G=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);var qe=null,Ao=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!qe,currentStatus:g().syncStatus?.status,currentMessage:g().syncStatus?.msg}),qe)return logger.debug("[sync] syncAndReloadState joining existing promise"),qe;logger.debug("[sync] syncAndReloadState creating promise"),qe=Du();try{let e=await qe;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!d(e),message:(d(e),e.message),statusAfterResolve:g().syncStatus?.status,statusMessageAfterResolve:g().syncStatus?.msg}),d(e)&&g().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),N({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),qe||a(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:g().syncStatus?.status,statusMessageBeforeClear:g().syncStatus?.msg}),qe=null}},Du=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:g().mode,syncStatus:g().syncStatus});let e=ra();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:g().mode,message:e.message,syncStatus:g().syncStatus}),e;if(qe)return qe;logger.debug("[sync] syncAndReloadState:start");let t=G("resolveActorId",X());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),a("Unable to resolve event log path");N({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:g().syncStatus});let n=Vt(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let o=G("syncEpiqWithRemote",await wo({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!d(o),message:(d(o),o.message)}),d(o))return logger.error("[sync] syncAndReloadState:sync failed",o.message),N({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:g().syncStatus}),Ue(`Unable to sync state. ${o.message}`);let{stateBranchRoot:r}=o.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:r});let s=G("loadMergedEvents",at(r));if(logger.debug("[sync] loadMergedEvents:result",{success:!d(s),message:(d(s),s.message),count:d(s)?void 0:s.value.length}),d(s))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:g().syncStatus}),a(`Unable to load events. ${s.message}`);logger.debug("[sync] loaded merged events after sync",{count:s.value.length});let i=ra();if(i)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:g().mode,message:i.message,syncStatus:g().syncStatus}),i;let c=ea();if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:c,selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id,selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual}),!g().selectedNode?.isVirtual&&!g().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:s.value.length});let m=G("bootStateFromEventLog",Kt(s.value));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(m),message:(d(m),m.message)}),d(m))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:g().syncStatus}),a(`Unable to boot synced state. ${m.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),logger.debug("[sync] restoreNavigationAnchor:start");let u=G("restoreNavigationAnchor",na(c));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(u),message:d(u)?u.message:"Navigation restored",selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id}),d(u)?(N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:g().syncStatus}),u):(N({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:g().syncStatus}),l("Synced",!0))},ra=()=>g().mode===f.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:g().mode,syncStatus:g().syncStatus}),N({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var ln=3e3,sa=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<ln?null:t},ia=0,qr,Yr=!1,Fn=!1,Xr=()=>{if(Yr)return!0;let e=ze();return d(e)?!1:e.value.syncStatus.status==="syncing"},Fu=()=>{let e=_().autoSyncIntervalMs??1e4,t=Date.now()-ia;return Math.max(0,e-t)},aa=()=>{qr||(qr=setTimeout(async()=>{if(qr=void 0,!!un()){if(Xr()){Fn=!0;return}Fn=!1,await Bu()}},Fu()))},Bu=async()=>{if(g().readOnly||g().timeMode==="peek")return a("Cannot auto-sync while peeking");if(!un())return a("Cannot auto-sync before state is initialized");if(Xr())return Fn=!0,a("Sync already in progress");Yr=!0,ia=Date.now(),N({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Ao()}finally{Yr=!1,Fn&&aa()}},Mo=()=>{un()&&(Fn=!0,!Xr()&&aa())};var St=()=>{let e=_(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),o=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&o,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:o}},da=()=>{let e=_e(process.cwd());if(d(e))return!1;let t=It(e.value);return Q(t)},ca=e=>e===!0?"on":e===!1?"off":null,la=e=>e==="on"?!0:e==="off"?!1:null;var Uu=e=>e.props.tags??[],Ou=e=>e.props.assignees??[],Jr=e=>Uu(e).map(t=>I.getTag(t)).filter(t=>!!t),Qr=e=>Ou(e).map(t=>I.getContributor(t)).filter(t=>!!t),Po=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!A(n)?a("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",Jr(n))},Lo=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!A(n)?a("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",Qr(n))};var h={PALETTE:"?",EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",COFFEE:"coffee",NONE:""};var $u=/^(\d+)(h|d|w|mo|y)$/,Wu=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,_u=({year:e,month:t,day:n,hour:o=0,minute:r=0})=>{let s=new Date(e,t-1,n,o,r);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===o&&s.getMinutes()===r},ju=(e,t=new Date)=>{let n=e.match($u);if(!n)return null;let[,o,r]=n,s=Number(o);if(!Number.isInteger(s)||s<=0)return null;let i=new Date(t);switch(r){case"h":return i.setHours(i.getHours()-s),i;case"d":return i.setDate(i.getDate()-s),i;case"w":return i.setDate(i.getDate()-s*7),i;case"mo":return i.setMonth(i.getMonth()-s),i;case"y":return i.setFullYear(i.getFullYear()-s),i;default:return null}},Hu=e=>{let t=e.match(Wu);if(!t)return null;let[,n,o,r,s,i]=t,c=Number(n),u=Number(o),m=Number(r),p=s?Number(s):0,v=i?Number(i):0;return _u({year:c,month:u,day:m,hour:p,minute:v})?new Date(c,u-1,m,p,v):null},ko=e=>{let t=e.trim().toLowerCase();return ju(t)??Hu(t)},ua=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Vu=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],ma=(e=Vu)=>{let t=[];for(let{unit:n,from:o,to:r}of e)for(let s=o;s<=r;s++)t.push(`${s}${n}`);return t};var Gu=["BOARD","TICKET","SWIMLANE","COMMENT"],re={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",LOG_LEVEL:"logLevel"},Ye={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Ku=[re.EDITOR,re.VIEW,re.USERNAME,re.AUTOSYNC,re.SYNC_DEBOUNCE_MS,re.LOG_LEVEL],zu=[Ye.TITLE,Ye.DESCRIPTION,Ye.COMMENT],es=[String(ln),"5000","15000","30000","60000"],qt=[h.COFFEE,h.EXIT,h.SYNC,h.HELP,h.EXPORT,h.CONFIG],Do=[h.NEW,h.EDIT,h.DELETE,h.MOVE],Zr=[h.TAG,h.UNTAG,h.ASSIGN,h.UNASSIGN,h.CLOSE_ISSUE,h.RE_OPEN_ISSUE,h.EDIT,h.COMMENT],pa=[h.FILTER,h.PEEK],qu={WORKSPACE:[...qt,...Do],BOARD:[...pa,...qt,...Do],SWIMLANE:[...pa,...qt,...Do],TICKET:[...qt,...Do,...Zr],FIELD:[...qt,...Zr],FIELD_LIST:[...qt,...Zr],TEXT:[...qt],COMMENT:[h.EDIT,h.DELETE]},Yu=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Xu=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:o}=St();if(!o)return[h.HELP,h.CONFIG];if(!da())return[h.HELP,h.INIT];if(t)return[h.HELP,h.PEEK,h.EXPORT,h.CONFIG];let r=e?.context,s=r&&Gu.includes(r);return[...new Set([...n,e].map(c=>c?.context).flatMap(c=>c?qu[c]:[]))].filter(c=>c===h.MOVE?!1:c===h.EDIT||c===h.DELETE?s:!0)},ie=(e,{contextNode:t,selectedNode:n,readOnly:o,breadCrumb:r}=g())=>{let s=t.context??"WORKSPACE";return{[h.NONE]:Xu({breadCrumb:r,readOnly:o,selectedNode:n}),[h.EXIT]:["confirm"],[h.EXPORT]:[],[h.SYNC]:[],[h.INIT]:[],[h.HELP]:[],[h.PEEK]:[...ma(),"now","prev","next"],[h.EDIT]:[...zu],[h.COMMENT]:[],[h.DELETE]:["confirm"],[h.RE_OPEN_ISSUE]:["confirm"],[h.CLOSE_ISSUE]:["confirm"],[h.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[h.FILTER]:["tag","assignee","description","title","clear"],[h.TAG]:[...new Set([...Object.keys(an),...I.getExistingTags()])],[h.UNTAG]:[...Po()?.value?.map(({name:c})=>c)??[]],[h.UNASSIGN]:[...Lo()?.value?.map(({name:c})=>c)??[]],[h.ASSIGN]:I.getExistingAssignees(),[h.NEW]:Yu(s),[h.CONFIG]:[...Ku],[h.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import ya from"chalk";var ga=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Se=(e,t)=>{let n=e.find(o=>o.context===t);return n!==void 0?l("Found node",n):a("Unable to find node in breadcrumb")};import fa from"chalk";var Z=e=>fa.dim(e),xe=e=>fa.hex(y.primary)(e),pe=({prefix:e="",wordList:t,postfix:n="",noOfHints:o=100,inputString:r,minLengthForHints:s=1})=>{let i=r.trim();if(i.length<s)return"";let p=[...t.filter(Boolean).filter(v=>v.startsWith(i))].sort((v,C)=>xo(v)-xo(C)).slice(0,o).map(v=>ho(v)).join(" ");return p?`${Z(e)}${p}${Z(n)}`:""};var Et={None:"none",Invalid:"invalid",Valid:"valid"};var mn=140,Ju=["BOARD","TICKET","SWIMLANE"],va=()=>{let e=g().selectedNode;if(!e?.context)return U({message:Z("Missing target context")});if(Ju.includes(e.context))return H();if(e.parentNodeId){let t=g().nodes[e.parentNodeId];if(t?.id===Ne(t?.parentNodeId??"","comments"))return H()}return U({message:Z("Command not available in this context")})},se="<ENTER> to confirm",H=(e="",t=[])=>({message:Z(e),validity:Et.Valid,completionWordList:t}),U=({message:e,completionWordList:t=[]})=>({validity:Et.Invalid,message:e,completionWordList:t}),Bo=e=>e.length===0,Fo=e=>` ${ya.hex("#000").bgHex(oe(e))(` ${e} `)} `,ts=({modifier:e})=>{let t="confirm";return e===t?H(se):U({message:Bo(e)?Z("if you are certain, enter ")+ho(t):"",completionWordList:[t]})},Qu=({list:e,hint:t,onValue:n})=>({modifier:o,inputString:r})=>e.includes(o)?r.trim().length<1?U({message:Z(n)}):H():U({message:Bo(o)?t:"",completionWordList:[...e]}),Yt=({hint:e,onOk:t})=>({modifier:n,inputString:o})=>Bo(n)&&Bo(o)?U({message:e,completionWordList:[]}):H(t??se),Zu=({modifier:e,inputString:t})=>{let n=ie(h.CONFIG);if(!n.includes(e))return U({message:pe({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case re.EDITOR:{let o=[...ga];return t.trim()?o.includes(t.trim())?H(se):U({message:pe({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o}):U({message:pe({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case re.VIEW:{let o=["dense","wide"];return o.includes(t.trim())?H(se):U({message:pe({prefix:"view... ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case re.USERNAME:return t.trim()?H(se):U({message:xe("Enter a user name. Saved in ")+ya.bgBlack("~/.epiq-global/config.json")});case re.LOG_LEVEL:{let o=["debug","error","info"],r=t.trim();return o.includes(r)?H(se):U({message:pe({prefix:"one of: ",wordList:[...o],inputString:r,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...o]})}case re.AUTOSYNC:{let o=["on","off"],r=_().autoSync;if(!o.includes(t.trim())){let s=ca(r);return U({message:pe({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:o,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:o})}return H(se)}case re.SYNC_DEBOUNCE_MS:{let o=_().autoSyncIntervalMs,r=sa(t);if(!t.trim()||r===null||r<ln){let s=pe({prefix:" examples: ",wordList:es,minLengthForHints:0,inputString:t});return U({message:xe(`provide duration above ${ln}ms. current duration: ${o}ms.`)+s,completionWordList:es})}return H(se)}default:return U({message:xe("Unknown config option"),completionWordList:n})}},em=({modifier:e,inputString:t})=>{let n=ie(h.EDIT);if(!n.includes(e)){let i=pe({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return U({message:i||xe("Unknown edit option"),completionWordList:n})}let{breadCrumb:o,selectedNode:r}=g(),s=Se([...o,r],"TICKET");if(d(s))return U({message:xe("Command not available in this context")});switch(e){case Ye.COMMENT:return t||pn(()=>"hahah"),H(se);case Ye.TITLE:return H(se);case Ye.DESCRIPTION:{let{preferredEditor:i}=_();return i?H(Z("<ENTER> to edit in ")+i):U({message:"No editor selected"})}default:return U({message:xe("Unknown edit option"),completionWordList:n})}},tm={[h.EXPORT]:()=>H(se+Z(", and create export markdown file")),[h.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(se);let n={message:Z("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return H(se);let o=ko(t);if(!t||!o)return U(n);let r=Se(g().breadCrumb,"BOARD");if(d(r))return U({message:xe("Command is not applicable in this context")});let s=bo(r.value.id);return d(s)?U({message:xe("Unable to peek: board id is not a valid ULID")}):ua({date:o,horizonDate:s.value})?H(se):U({message:xe(`nothing to peek before ${s.value.toISOString().slice(0,16).replace("T"," ")}`)})},[h.EXIT]:()=>H(se+Z(" and exit the application")),[h.INIT]:()=>H(se),[h.PALETTE]:()=>H(se),[h.FILTER]:e=>{if(e.modifier==="clear")return H();let t=s=>ie(h.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return U({message:pe({wordList:ie(h.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ie(h.FILTER)});let n=Object.values(g().tags).map(s=>s.name),o=Object.values(g().contributors).map(s=>s.name),r=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?r.length&&!r.includes(e.inputString.trim())?U({message:pe({prefix:`existing ${e.modifier}s... `,wordList:r,noOfHints:10,inputString:e.inputString}),completionWordList:r}):H():U({message:pe({prefix:"one of... ",wordList:r,noOfHints:10,inputString:e.inputString}),completionWordList:r})},[h.NONE]:e=>{let t=ie(h.NONE);return U({message:pe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[h.NEW]:e=>Qu({list:ie(h.NEW),hint:pe({wordList:ie(h.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[h.HELP]:()=>H(se),[h.EDIT]:em,[h.COMMENT]:e=>{let t=Yt({hint:Z(`write a comment (max ${mn} char)...`),onOk:Z(`(${e.inputString.length}/${mn})`)})(e);return t.validity===Et.Invalid?t:e.inputString.length>mn?H(xe("max input exceeded")):t},[h.CONFIG]:Zu,[h.DELETE]:e=>{let t=va();return t.validity==="invalid"?t:ts(e)},[h.CLOSE_ISSUE]:e=>ts(e),[h.RE_OPEN_ISSUE]:e=>ts(e),[h.MOVE]:e=>{let t=va();return t.validity==="invalid"?t:Yt({hint:pe({prefix:"hey hacker! These commands are blocked for you... ",wordList:ie(h.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[h.TAG]:e=>{let n=I.getExistingTags().slice(0,10).map(Fo).join("");return Yt({hint:n.length?Z("create tag or reuse:")+n+Z(""):Z("create tag ...")})(e)},[h.UNTAG]:e=>{let t=Po();if(d(t))return U({message:xe("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(Fo).slice(0,10);return n.length?Yt({hint:Z(" ... ")+n.join("")})(e):U({message:xe("Issue has no tags"),completionWordList:[]})},[h.ASSIGN]:e=>{let t=I.getExistingAssignees().map(Fo).slice(0,10);return Yt({hint:Z("assignees... ")+t.join("")})(e)},[h.UNASSIGN]:e=>{let t=Lo();if(d(t))return U({message:xe("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(Fo).slice(0,10);return n.length?Yt({hint:Z("remove assignee... ")+n.join("")})(e):U({message:xe("Issue has no assignees"),completionWordList:[]})},[h.SYNC]:()=>H(se),[h.COFFEE]:e=>{let{modifier:t}=e,n=ie(h.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?U({message:Z("enter an amount ... "),completionWordList:n.filter(o=>o.startsWith(t))}):Yt({hint:pe({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},xa=Object.fromEntries(Object.entries(tm).map(([e,t])=>[e,{validate:(n,o,r)=>t({modifier:o,command:n,inputString:r})}]));var ha=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var Ia=e=>Object.values(h).includes(e),ba=(e,t)=>{let n=e.command??"",{modifier:o,target:r,inputString:s}=e,{message:i,validity:c,completionWordList:u}=xa[n].validate(n,o,s),m=r==="command"||r==="modifier"?ie(n):ha,{mode:p}=g(),v=p===f.COMMAND_LINE?i??"":"",C=[...u,...m];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:v,autoCompletion:t?Ri(e,C):{hint:"",hints:[],remainder:"",overlap:0}}};var Ca=e=>{let t=e.trimStart(),n=om(t),o=n[0]??"",r=n[1]??"",s=/\s$/.test(e),i=rm(e),c=Ia(o)?o:null,u=c!==null,m=o!=="",p=c?ie(c)??[]:[],v=c&&p.includes(r)?r:"",C="word";n.length===0||n.length===1&&!s?C="command":(n.length===1&&s||n.length===2&&!s)&&(C="modifier");let E=s?"":i,S=nm(t,c,v);return{raw:e,trimmedStart:t,words:n,firstWord:o,lastWord:i,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:s,modifier:v,target:C,inputToMatch:E,inputString:S}},nm=(e,t,n)=>{let o=e;return t&&o.startsWith(t)&&(o=o.slice(t.length)),o=o.replace(/^\s+/,""),n&&o.startsWith(n)&&(o=o.slice(n.length),o=o.replace(/^\s+/,"")),o},om=e=>e.trim()?e.trim().split(/\s+/):[],rm=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as sm}from"react";var gn=e=>e===ns||e===":",ns=" ",ge={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Et.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},os=new Set,Na=()=>{for(let e of os)e()},rs=e=>(os.add(e),()=>os.delete(e)),Xe=e=>{let n=e(ge),o=Ca(n.value),r=n.cursorPosition===n.value.length;ge={...n,commandMeta:ba(o,r)},Na()},Bn=({message:e,status:t})=>{let n=structuredClone(ge);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,ge=n,Na(),l(e,null)},ss=e=>{Xe(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},is=e=>{Xe(t=>{let{value:n,cursorPosition:o}=t,r=o;if(e==="left"){for(;r>0&&gn(n[r-1]);)r--;for(;r>0&&!gn(n[r-1]);)r--}else{for(;r<n.length&&!gn(n[r]);)r++;for(;r<n.length&&gn(n[r]);)r++}return{...t,cursorPosition:r}})},Sa=()=>{Xe(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},Ea=()=>{Xe(e=>{let{value:t,cursorPosition:n}=e,o=n;for(;o>0&&gn(t[o-1]);)o--;for(;o>0&&!gn(t[o-1]);)o--;let r=t.slice(n);return{...e,value:t.slice(0,o)+r,cursorPosition:o,commandIsPending:!1}})},pn=e=>{Xe(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),o=t.value.slice(0,n),r=t.value.slice(n),s=e(o,t.commandMeta.autoCompletion),i=s+r,c=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:c,commandIsPending:!1}})},Ra=()=>{Xe(e=>({...e,commandIsPending:!0}))},$=e=>{Xe(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Ta=({addToHistory:e=!0})=>{Xe(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},Aa=()=>{Xe(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},wa=()=>{Xe(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},q=()=>ge,Ma=()=>sm(rs,q,q),Pa=()=>{let[e,...t]=ge.value.split(ns);return t.join(ns).trim()};var x={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",EditTitle:"editTitle",EditDescription:"editDescription",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function im(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function am(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function dm(e,t,n){let o=g().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:o?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:o?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:o?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:o?n.nextContainer:null}}function La(e,t){let n=q();if(e.sequence==="?"&&t!==f.PALETTE)return x.InitCommandPalette;if(e.sequence===":"&&t!==f.COMMAND_LINE)return x.InitCommandLine;if(t===f.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===f.COMMAND_LINE)return hi(e,n.value);if(t===f.PALETTE)return Ii(e,n.value);let o=im(e)||am(e);if(o)return cm(o,t);if(e.ctrl&&e.name==="c")return x.Exit;switch(e.name){case"r":return x.EditTitle;case"e":return x.EditDescription;case"n":return x.AddItem;case"m":return x.InitMove;case"d":return x.Delete;case"return":return x.Confirm;case"space":return x.Confirm;case"v":return _().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;default:return null}}function cm(e,t){let n=t===f.MOVE?{prevItem:x.MovePreviousItem,nextItem:x.MoveNextItem,prevContainer:x.MoveToPreviousContainer,nextContainer:x.MoveToNextContainer}:{prevItem:x.NavPreviousItem,nextItem:x.NavNextItem,prevContainer:x.NavToPreviousContainer,nextContainer:x.NavToNextContainer};return dm(g().contextNode.childRenderAxis,e,n)}var Uo=e=>{let{context:t}=g().contextNode;if(!t)return M.None;switch(e){case h.EXIT:return M.Exit;case h.EXPORT:return M.Export;case h.COFFEE:return M.Coffee;case h.INIT:return M.Init;case h.DELETE:return M.Delete;case h.EDIT:return M.Edit;case h.COMMENT:return M.Comment;case h.HELP:return M.ViewHelp;case h.RE_OPEN_ISSUE:return M.ReopenIssue;case h.CLOSE_ISSUE:return M.CloseIssue;case h.TAG:return M.TagTicket;case h.UNTAG:return M.UntagTicket;case h.ASSIGN:return M.AssignUserToTicket;case h.UNASSIGN:return M.UnassignUserFromTicket;case h.NEW:return M.NewItem;case h.FILTER:return M.Filter;case h.MOVE:return M.Move;case h.PEEK:return M.Peek;case h.CONFIG:return M.Config;case h.SYNC:return M.Sync;default:return M.None}},M={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export",Coffee:"coffee"};import{ulid as fe}from"ulid";import Xa from"node:fs";import $m from"node:path";import Wm from"react";import{Box as Um}from"ink";import Ho from"react";import Im from"chalk";import{Box as ds,Text as bm}from"ink";import Qe from"react";import{Text as ka}from"ink";import Da,{useEffect as Fa,useState as lm}from"react";var Ba={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},he=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=K(),o=Ba[n]??Ba.default,[r,s]=lm(0);if(Fa(()=>{s(0)},[o]),Fa(()=>{if(!e)return;let c=setInterval(()=>{s(u=>(u+1)%o.length)},500);return()=>clearInterval(c)},[e,o]),!e)return Da.createElement(ka,null,t);let i=o[r]??o[0]??t;return Da.createElement(ka,{color:y.accent,dimColor:r===1},i)};import{Box as as,Text as um}from"ink";import Oo from"react";var Je=({children:e=[],height:t,selectedIndex:n,itemHeight:o=1,scrollByOne:r=!1})=>{if(e.length===0)return null;let s=Math.max(1,Math.floor(t)),i=Math.max(1,Math.ceil(o)),c=Math.max(1,Math.floor(s/i)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-c),p=r?Math.min(m,Math.max(0,u-c+1)):Math.min(m,Math.floor(u/c)*c),v=p+c,C=e.slice(p,v),E=e.length>c,S=s,R=E?Math.max(1,Math.floor(c/e.length*S)):S,D=Math.max(0,S-R),P=Math.max(1,e.length-c),V=E?Math.floor(p/P*D):0;return Oo.createElement(as,{flexDirection:"row",height:s,width:"100%"},Oo.createElement(as,{flexDirection:"column",flexGrow:1,height:s},C),Oo.createElement(as,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((O,k)=>Oo.createElement(um,{key:k,color:E&&k>=V&&k<V+R?y.accent:y.secondary},E?"\u2502":" "))))};import{Box as $o,Text as xm}from"ink";import Xt from"react";import{Text as mm}from"ink";import pm from"react";var gm=e=>e.toLowerCase().trim(),fm=(e,t=an)=>{let n=gm(e);return t[n]?t[n]:Mn(n)},Rt=({id:e,isSelected:t})=>{let n=I.getContributor(e);if(n)return pm.createElement(mm,{underline:t,color:fm(n.name)},"@"+n.name)};import{Text as vm}from"ink";import ym from"react";var fn=({id:e,isSelected:t})=>{let n=I.getTag(e);if(n)return ym.createElement(vm,{underline:t,backgroundColor:oe(n.name),color:y.secondary}," "+n.name+" ")};var Ua=({width:e,ticket:t,isSelected:n})=>{let o=e-14,r=yo(Nt(t.title),o),s=Jr(t),i=Qr(t);return Xt.createElement($o,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?y.accent:y.secondary,justifyContent:"space-between"},Xt.createElement($o,{borderBottom:!0},Xt.createElement($o,{paddingLeft:1,flexDirection:"column"},Xt.createElement(xm,{color:y.primary},r))),Xt.createElement($o,{flexDirection:"row",paddingLeft:1},s.map(c=>Xt.createElement(fn,{key:c.id,id:c.id})),i.map(c=>Xt.createElement(Rt,{key:c.id,id:c.id}))))};import{Box as Jt,Text as Un}from"ink";import Re from"react";var hm=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Oa=({width:e,ticket:t,isSelected:n,index:o,mode:r})=>{let s=(t.props.tags??[]).map(P=>I.getTag(P)).filter(P=>!!P),i=(t.props.assignees??[]).map(P=>I.getContributor(P)).filter(P=>!!P),c=1,u=s.length*(1+c),m=i.length*(2+c),p=s.map(P=>Re.createElement(Jt,{key:P.id,paddingRight:c},Re.createElement(Un,{color:oe(P.name)},"\u25A0"))),v=i.map(P=>Re.createElement(Jt,{key:P.id,paddingRight:c},Re.createElement(Un,{color:Mn(P.name)},"@"+P.name.at(0)))),C=n?y.accent:r===f.MOVE?y.secondary:y.primary,E=4,S=I.getCommentsByIssue(t.id),R=S.length?String(S.length).length+2+c:0,D=S.length?Re.createElement(Jt,{paddingRight:c},Re.createElement(Un,{color:y.accent},"[",S.length,"]")):null;return Re.createElement(Jt,{borderBottom:!0,justifyContent:"space-between"},Re.createElement(Jt,null,Re.createElement(Jt,{width:E},n?Re.createElement(he,{isSelected:n}):Re.createElement(Un,{color:"gray",dimColor:!0},o+1)),Re.createElement(Un,{wrap:"truncate",color:C},hm(t.title,e-u-m-R-18))),Re.createElement(Jt,null,p,v,D))};var Cm=({swimlane:e,isSelected:t,width:n,height:o,isDense:r,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:u}=K(),m=u[e.id]??[],p=`${e.title} ${Im.hex(y.secondary2).dim("("+m.length+")")}`,v=3,C=r?1:4,E=o-v-(r?2:1),S=Qe.createElement(ds,{borderStyle:"round",borderColor:y.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Qe.createElement(he,{isSelected:t}),Qe.createElement(bm,{bold:!0,color:t?y.accent:y.primary},p," ",e.readonly?"\u{1F512}":"")),R=(D,P)=>{let V=s&&i===P;return A(D)?r?Qe.createElement(Oa,{key:D.id,index:P,width:n,ticket:D,isSelected:V,mode:c}):Qe.createElement(Ua,{key:D.id,width:n,ticket:D,isSelected:V}):null};return Qe.createElement(ds,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?y.accent:y.secondary,paddingRight:1,paddingLeft:1,height:o},S,Qe.createElement(ds,{padding:r?1:0},m.length>0&&Qe.createElement(Je,{selectedIndex:i,height:E,itemHeight:C},m.map(R)),Qe.createElement(he,{isSelected:s&&i===-1})))},$a=Qe.memo(Cm);import{Box as On,Text as qa}from"ink";import Te,{useMemo as jo}from"react";import{Box as Wo,Text as Nm}from"ink";import ct from"react";var Wa=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:o}=K(),{title:r}=t,s=t.parentNodeId?I.getNode(t.parentNodeId):void 0,i=s&&A(s)?r===ne.ASSIGNEES?s.props.assignees??[]:r===ne.TAGS?s.props.tags??[]:[]:[];return ct.createElement(Wo,{alignItems:"center",paddingTop:1},ct.createElement(Wo,{minWidth:12},ct.createElement(he,{isSelected:n}),ct.createElement(Nm,{color:n?y.accent:y.secondary2},r,":")),ct.createElement(Wo,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,u)=>{let m=o.id===t.id&&u===e;return ct.createElement(Wo,{key:`${r}-${c}`,paddingRight:2,minHeight:1},ct.createElement(he,{isSelected:m}),r===ne.ASSIGNEES?ct.createElement(Rt,{isSelected:m,id:c}):r===ne.TAGS?ct.createElement(fn,{isSelected:m,id:c}):null)})))};import{Box as _o,Text as cs}from"ink";import lt,{useEffect as Sm,useMemo as _a}from"react";var Em="\u2029",ja=(e,t)=>`${e}::inline-line::${t}`,ls=new Map,Ha=e=>{let t=ls.get(e)??[];ls.delete(e);for(let n of t)I.deleteNode(n)},Rm=(e,t)=>{Ha(e);let n=[];t.forEach((o,r)=>{let s=Be(BigInt(r+1));if(!Q(s))return;let i=I.createNode(Y.text({id:ja(e,r),name:`Line ${r+1}`,parentNodeId:e,rank:s.value,props:{value:o},readonly:!0,isVirtual:!0}));Q(i)&&n.push(i.value.id)}),ls.set(e,n)},us=({id:e,label:t,text:n,height:o,selected:r,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=K(),u=_a(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=_a(()=>u.join("\0"),[u]);Sm(()=>(Rm(e,u),()=>{Ha(e)}),[e,m]);let p=C=>String(C).replace(/\r?\n/g,""),v=u.map((C,E)=>{let S=c.id===e&&i===E;return lt.createElement(_o,{key:ja(e,E)},lt.createElement(cs,{color:S?y.primary:y.secondary2,dimColor:!S},`${E+1} `.padStart(5,"\xA0")),lt.createElement(cs,{backgroundColor:S?"gray":void 0},p(C.length?yo(C,s-10):Em)))});return lt.createElement(_o,{flexDirection:"column",paddingTop:1},lt.createElement(_o,null,lt.createElement(he,{isSelected:r}),lt.createElement(cs,{color:r?y.accent:y.secondary2},t)),lt.createElement(_o,{flexDirection:"row",borderStyle:"round",borderColor:y.secondary,paddingLeft:1,marginLeft:1},lt.createElement(Je,{scrollByOne:!0,height:o-3,selectedIndex:i,itemHeight:1},v)))};import{Box as Tt,Text as ut}from"ink";import ae,{useEffect as Tm,useMemo as Am,useRef as wm}from"react";import{decodeTime as ms}from"ulid";var Va=e=>{let t=new Set((e.log??[]).filter(n=>n.action==="delete.issue.comment").map(n=>n.payload.id));return(e.log??[]).filter(n=>n.action==="add.issue.comment"&&n.payload.issue===e.id&&!t.has(n.payload.id)).length},Ga=(e,t,n)=>Y.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});var Mm=e=>Ne(e,"comments"),Pm=e=>I.getCommentsByIssue(e.id).sort((t,n)=>ms(t.id)-ms(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Ka=e=>{for(let t of e)I.deleteNode(t.id)},Lm=(e,t)=>{let n=I.getNode(Mm(e.id));if(!n||!Ge(n))return[];let o=t.map((r,s)=>Ga(r,s,n.id)).map(I.createNode).filter(Q).map(({value:r})=>r).filter(An);return t.length>0&&g().selectedIndex<0&&T.navigate({contextNode:n,selectedIndex:0}),o},km=(e,t)=>{let n=e.replace(/\s+/g," ").trim();return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}\u2026`};function za({ticket:e,width:t,height:n}){let o=Am(()=>Pm(e),[e]),r=wm([]);Tm(()=>(Ka(r.current),r.current=Lm(e,o),()=>{Ka(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=K(),c=Math.max(1,n-4),u=Math.max(20,t-8);return o.length===0?ae.createElement(Tt,{flexDirection:"column",width:t,height:n,padding:1},ae.createElement(ut,{color:y.primary},"No comments yet."),ae.createElement(Tt,{paddingTop:1},ae.createElement(ut,{color:y.primary},"Use"),ae.createElement(ut,{color:y.accent}," :comment "),ae.createElement(ut,{color:y.primary},"to add the first one."))):ae.createElement(Tt,{flexDirection:"column",width:t,height:n},ae.createElement(Tt,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},ae.createElement(ut,{color:y.secondary2},"Comments (",o.length,") ")),ae.createElement(Je,{height:c,itemHeight:4,selectedIndex:s},o.map((m,p)=>{let v=p===s;return ae.createElement(Tt,{key:m.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},ae.createElement(Tt,{flexDirection:"row",paddingBottom:1},ae.createElement(ut,{color:y.accent},v?"\u276F ":" "),ae.createElement(Tt,{paddingLeft:1},ae.createElement(ut,{color:y.secondary2},`#${p+1} `),ae.createElement(Rt,{id:m.authorId}),ae.createElement(ut,{color:y.secondary2}," "+Io(ms(m.id))))),ae.createElement(Tt,{paddingLeft:3,paddingBottom:1},ae.createElement(ut,{color:y.primary},km(m.md,u))))})))}var Dm=e=>Ne(e,"description"),Fm=e=>Ne(e,"comments"),Bm=e=>Ne(e,"history"),Ya=({ticket:e,height:t})=>{let n=jo(()=>Va(e),[e]),{selectedIndex:o,contextNode:r}=K(),s=process.stdout.columns||120,i=jo(()=>Dm(e.id),[e.id]),c=jo(()=>Fm(e.id),[e.id]),u=jo(()=>Bm(e.id),[e.id]),m=r.id===e.id,p=r.id===c||r.parentNodeId===c,v=r.id===u||r.parentNodeId===u,C=W(e.id);if(p){let k=t-3;return Te.createElement(On,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Te.createElement(za,{ticket:e,width:s,height:k}))}if(v){let O=I.getNode(u),k=O&&Ge(O)?O.props.value??"":"",ft=t-3;return Te.createElement(On,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},O?Te.createElement(us,{id:O.id,label:"Event log",text:k,selected:!1,maxWidth:s,height:ft}):null)}let E=C.reduce((O,k)=>Tn(k)||k.id===c||k.id===u?O+1:O,0),S=2,R=3,D=E,P=t-R-D-S,V=(O,k)=>O.id===i?Te.createElement(us,{key:O.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:k,maxWidth:s,height:P}):Tn(O)?Te.createElement(Wa,{key:O.id,parent:O,selected:k,selectedIndex:o}):O.id===c?Te.createElement(On,{key:O.id,paddingTop:1},Te.createElement(he,{isSelected:k}),Te.createElement(qa,{backgroundColor:y.secondary,color:k?y.accent:y.primary},` Comments (${n}) \u203A\u203A `)):O.id===u?Te.createElement(On,{key:O.id,paddingTop:1},Te.createElement(he,{isSelected:k}),Te.createElement(qa,{backgroundColor:y.secondary,color:k?y.accent:y.primary}," History \u203A\u203A ")):null;return Te.createElement(On,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},C.map((O,k)=>V(O,m&&o===k)))};var Om=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,viewMode:s,height:i,width:c})=>{let u=t.context,m=u===w.TICKET||u===w.FIELD_LIST||u===w.FIELD,p=u===w.BOARD||u===w.SWIMLANE,v=u===w.TICKET?t:o.find(D=>D.context===w.TICKET),C=Math.floor(c/3),E=Math.floor(c/Math.max(e.length,1)),S=Math.min(E,C),R=s==="dense";return Ho.createElement(Um,{flexDirection:"row",height:i},p&&e.map((D,P)=>{let V=t.id===D.id,O=V?n:-1,k=t.context===w.BOARD&&n===P;return Ho.createElement($a,{key:D.id,height:i,width:S,swimlane:D,isSelected:k,isDense:R,isFocused:V,listSelectedIndex:O,mode:r})}),m&&v&&Ho.createElement(Ya,{height:i,ticket:v}))},Vo=Ho.memo(Om);import{render as _m}from"ink";import{Writable as jm}from"node:stream";var $n=e=>String(e).padStart(2,"0"),Hm=e=>{let t=e.getUTCFullYear(),n=$n(e.getUTCMonth()+1),o=$n(e.getUTCDate()),r=$n(e.getUTCHours()),s=$n(e.getUTCMinutes()),i=$n(e.getUTCSeconds());return`${t}-${n}-${o}_${r}-${s}-${i}`},Vm=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Gm=async(e,{width:t,height:n})=>{let o="",r=new jm({write(i,c,u){let m=Km(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(o=m),u()}});r.columns=t,r.rows=n,r.isTTY=!0;let s=_m(e,{stdout:r,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),o},Km=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Ja=async()=>{let{viewMode:e}=_(),{contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,renderedChildrenIndex:s}=g(),i=o.find(P=>P.context==="BOARD");if(!i)return a("No board found to export");let c=120,u=40,m=await Gm(Wm.createElement(Vo,{height:u,width:c,swimlanes:(s[i.id]??[]).filter(P=>P!==void 0&&Ct(P)),contextNode:t,selectedIndex:n,breadCrumb:o,viewMode:e??"dense",mode:r}),{width:c,height:u});if(!m)return a("Failed to render board export");let p=oo(process.cwd());if(d(p))return a("Unable to export, epiq root not found");let v=new Date,C=Hm(v),E=`board_${Vm(i.title)}_${C}.md`,S=Vs(p.value);Xa.mkdirSync(S,{recursive:!0});let R=$m.join(S,E),D=`# Board - ${i.title}
45
+ Date: ${v.toISOString()}
46
46
 
47
47
  \`\`\`text
48
48
  ${m}
49
49
  \`\`\`
50
- `;return ma.writeFileSync(A,R,"utf8"),c("Exported board layout",A)};import Uu from"node:os";import xa from"node:path";import{z as dt}from"zod";import{accessSync as Pu,copyFileSync as Lu,existsSync as fr,mkdirSync as ga,readdirSync as fa,readFileSync as ku,renameSync as Du,rmSync as Fu,statSync as va,unlinkSync as Ou,writeFileSync as Bu}from"node:fs";import Ht from"node:path";var ko=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",ve={writeToFile:(e,t)=>{try{let n=Ht.dirname(e);fr(n)||ga(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Bu(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return ku(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 fr(e)&&va(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Pu(e),!0}catch{return!1}},mkDir:e=>ga(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Ht.parse(t);for(;;){let r=Ht.join(t,e);try{if(fr(r)&&va(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Ht.dirname(t)}return null},readFirstJSON(e){try{if(!ve.dirExists(e))return null;let t=fa(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Ht.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)?fa(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Ou(e)}catch(t){(!ko(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Fu(e,{recursive:!0,force:!0})}catch(t){(!ko(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Ht.dirname(t)),!n?.overwrite&&fr(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Du(e,t)}catch(r){if(ko(r)&&r.code==="EXDEV"){Lu(e,t),this.rmFile(e);return}throw r}}};var $u={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},ha=dt.object({logLevel:dt.enum(["info","error","debug"]),preferredEditor:dt.string().optional(),userName:dt.string().optional(),userId:dt.string().optional(),autoSync:dt.boolean().nullable().optional(),autoSyncDebounceMs:dt.number().optional(),viewMode:dt.enum(["dense","wide"]).optional()}).partial(),_u="config.json",ya=()=>xa.join(Uu.homedir(),he),Do=()=>xa.join(ya(),_u),Fo=()=>{try{return ve.mkDir(ya()),c(`Ensured ~/${he} exists`,null)}catch{return a(`Unable to create ~/${he}`)}},Wu=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${he}/config.json JSON`)}let n=ha.safeParse(t??{});return n.success?c("Parsed config",n.data):a(`Invalid ~/${he}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Ea=()=>{let e=Fo();if(d(e))return a(e.message);let t=Do(),n=ve.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Wu(n)},Ca=e=>{let t=Fo();if(d(t))return a(t.message);let n=ha.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Do();try{return ve.writeToFile(r,JSON.stringify(n.data,null,2)+`
51
- `),c("Config written",null)}catch{return a(`Unable to write ~/${he}/config.json`)}},ze=e=>{let t=Ea();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return Ca(n)},Na=()=>{let e=Do(),t=Fo();if(d(t))return a(`Unable to create ~/${he}`);if(!(ve.readFile(e)!==null)){let g=Ca($u);if(d(g))throw new Error(`Unable to create ~/${he}/config.json`)}let r=Ea();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:s,autoSync:l,autoSyncDebounceMs:u,logLevel:m}=r.value;return!i||!s?a(`User name or ID not configured in ~/${he}/config.json`):(process.env.EPIQ_LOG_LEVEL=m,c("successfully loaded settings",{logLevel:m??"debug",preferredEditor:o??"",userName:i,userId:s,autoSync:l??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"}))};var ba=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id){for(let o=n-1;o>=0;o--){let i=t[o];if(i&&"id"in i.payload&&i.payload.id===e.id&&"parent"in i.payload&&i.payload.parent)return i.payload.parent}return null}}return null};import{useSyncExternalStore as _C}from"react";var vr,Hu=new Set,Sa=()=>{for(let e of Hu)e()};var ct=()=>{if(!vr)throw new Error("Ui state not initialized. Call initUiState() first.");return vr};var Ia=(e={})=>(vr=e,Sa(),c("UX state initialized",null)),ju=e=>{let t=ct();return vr=e(t),Sa(),c("UX state updated",null)},lt=e=>ju(t=>({...t,...e}));import{spawn as Vu}from"node:child_process";function Oo(e){let t=process.platform,o=Vu(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return o.unref(),o.on("error",()=>{}),!0}import{ulid as Xu}from"ulid";import{spawnSync as Ku}from"node:child_process";import zu from"node:os";import Ra from"node:path";import{ulid as Gu}from"ulid";function qu(){let{preferredEditor:e}=$(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Yu(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Aa(e){let t=Ra.join(zu.tmpdir(),"epiq");ve.mkDir(t);let n=Ra.join(t,Gu());ve.writeToFile(n,e??"");let r=qu();for(let o of r){let i=Yu(o,n),s=Ku(i,{stdio:"inherit",shell:!0});if(!s.error&&s.status===0){let l=ve.readFile(n);if(l==null)return a("Unable to read edited file");let u=l.replace(/\r?\n$/,"");return c("Successfully edited",u)}}return a("Unable to open editor")}var Ta=async()=>{let e=Y();if(d(e))return a("Unable to resolve user ID");let t=await Re();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(!B(s))return a("Edit target must be an issue");if(s.readonly)return a("Cannot edit readonly issue");let l=_(s.id).find(h=>h.title===Q.DESCRIPTION);if(!l)return a("No target found");if(l.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=Aa(u);if(d(m))return a("Failed to edit field");let g=m.value;return g===u?c("No changes made",null):Te({id:Xu(),action:"edit.description",payload:{id:s.id,md:g},...e.value},n)};import Qu from"node:fs";import Ma from"node:path";import Bo from"node:fs";import Ju from"node:path";var wa=async e=>{let t=Ju.join(e,".gitignore"),n=Bo.existsSync(t)?Bo.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
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 c("Local epiq paths already ignored",!1);let l=["# [epiq]: local hydrated state is never committed",...i].join(`
50
+ `;return Xa.writeFileSync(R,D,"utf8"),l("Exported board layout",R)};import ep from"node:os";import td from"node:path";import{z as At}from"zod";import{accessSync as zm,copyFileSync as qm,existsSync as Go,mkdirSync as Qa,readdirSync as Za,readFileSync as Ym,renameSync as Xm,rmSync as Jm,statSync as ed,unlinkSync as Qm,writeFileSync as Zm}from"node:fs";import vn from"node:path";var ps=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",Ae={writeToFile:(e,t)=>{try{let n=vn.dirname(e);Go(n)||Qa(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);Zm(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Ym(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Ae.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Go(e)&&ed(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await zm(e),!0}catch{return!1}},mkDir:e=>Qa(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=vn.parse(t);for(;;){let o=vn.join(t,e);try{if(Go(o)&&ed(o).isDirectory())return o}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=vn.dirname(t)}return null},readFirstJSON(e){try{if(!Ae.dirExists(e))return null;let t=Za(e).filter(o=>o.endsWith(".json")).sort()[0];if(!t)return null;let n=vn.join(e,t);return Ae.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Ae.dirExists(e)?Za(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Qm(e)}catch(t){(!ps(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Jm(e,{recursive:!0,force:!0})}catch(t){(!ps(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(vn.dirname(t)),!n?.overwrite&&Go(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Xm(e,t)}catch(o){if(ps(o)&&o.code==="EXDEV"){qm(e,t),this.rmFile(e);return}throw o}}};var tp={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},nd=At.object({logLevel:At.enum(["info","error","debug"]),preferredEditor:At.string().optional(),userName:At.string().optional(),userId:At.string().optional(),autoSync:At.boolean().nullable().optional(),autoSyncDebounceMs:At.number().optional(),viewMode:At.enum(["dense","wide"]).optional()}).partial(),np="config.json",od=()=>td.join(ep.homedir(),ke),gs=()=>td.join(od(),np),fs=()=>{try{return Ae.mkDir(od()),l(`Ensured ~/${ke} exists`,null)}catch{return a(`Unable to create ~/${ke}`)}},op=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${ke}/config.json JSON`)}let n=nd.safeParse(t??{});return n.success?l("Parsed config",n.data):a(`Invalid ~/${ke}/config.json shape: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Wn=()=>{let e=fs();if(d(e))return a(e.message);let t=gs(),n=Ae.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):op(n)},rd=e=>{let t=fs();if(d(t))return a(t.message);let n=nd.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`);let o=gs();try{return Ae.writeToFile(o,JSON.stringify(n.data,null,2)+`
51
+ `),l("Config written",null)}catch{return a(`Unable to write ~/${ke}/config.json`)}},mt=e=>{let t=Wn();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return rd(n)},_n=()=>{let e=gs(),t=fs();if(d(t))return a(`Unable to create ~/${ke}`);if(!(Ae.readFile(e)!==null)){let p=rd(tp);if(d(p))throw new Error(`Unable to create ~/${ke}/config.json`)}let o=Wn();if(d(o))throw new Error(o.message||"Unable to load settings");let{preferredEditor:r,userName:s,userId:i,autoSync:c,autoSyncDebounceMs:u,logLevel:m}=o.value;return!s||!i?a(`User name or ID not configured in ~/${ke}/config.json`):(process.env.EPIQ_LOG_LEVEL=m,l("successfully loaded settings",{logLevel:m??"debug",preferredEditor:r??"",userName:s,userId:i,autoSync:c??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"}))};var Ko=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o&&o.action==="close.issue"&&o.payload.id===e.id){for(let r=n-1;r>=0;r--){let s=t[r];if(s&&"id"in s.payload&&s.payload.id===e.id&&"parent"in s.payload&&s.payload.parent)return s.payload.parent}return null}}return null};import{useSyncExternalStore as DN}from"react";var zo,rp=new Set,sd=()=>{for(let e of rp)e()};var wt=()=>{if(!zo)throw new Error("Ui state not initialized. Call initUiState() first.");return zo};var id=(e={})=>(zo=e,sd(),l("UX state initialized",null)),sp=e=>{let t=wt();return zo=e(t),sd(),l("UX state updated",null)},Mt=e=>sp(t=>({...t,...e}));import{spawn as ip}from"node:child_process";function vs(e){let t=process.platform,r=ip(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return r.unref(),r.on("error",()=>{}),!0}import{ulid as ys}from"ulid";import{spawnSync as ap}from"node:child_process";import dp from"node:os";import ad from"node:path";import{ulid as cp}from"ulid";function lp(){let{preferredEditor:e}=_(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function up(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function dd(e){let t=ad.join(dp.tmpdir(),"epiq");Ae.mkDir(t);let n=ad.join(t,cp());Ae.writeToFile(n,e??"");let o=lp();for(let r of o){let s=up(r,n),i=ap(s,{stdio:"inherit",shell:!0});if(!i.error&&i.status===0){let c=Ae.readFile(n);if(c==null)return a("Unable to read edited file");let u=c.replace(/\r?\n$/,"");return l("Successfully edited",u)}}return a("Unable to open editor")}var cd=async e=>{let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(o&&An(o))return mp(e);if(e.modifier===Ye.DESCRIPTION)return pp();if(e.modifier===Ye.TITLE){let r=X();if(d(r))return a("Unable to resolve user ID");let s=o;if(!s)return a("Missing node");if(s.readonly)return a("Cannot rename readonly node");let i=e.inputString.trim();if(!i)return a("Provide a title");let c=await je();return d(c)?c:F([{id:ys(),action:"edit.title",payload:{id:s.id,name:i},...r.value}],c.value)}return a("Unknown edit command")},mp=async e=>{let t=X();if(d(t))return a("Unable to resolve user ID");let{contextNode:n,selectedIndex:o}=g(),r=W(n.id)[o];if(!r||!An(r))return a("Select a comment first");if(r.readonly)return a("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return a("Unable to resolve comment issue");let i=g().nodes[s];if(!i||!A(i))return a("Unable to resolve comment issue");if(i.readonly)return a("Cannot edit readonly issue");let c=r.id.split(":").at(0)??"",u=I.getComment(c);if(!u||u.deleted)return a("Unable to resolve comment");if(u.issue!==i.id)return a("Comment does not belong to selected issue");if(u.authorId!==t.value.userId)return a("You can only edit your own comments"+u.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return a("Provide a comment");let p=await je();if(d(p))return p;let v=p.value;return F([{id:ys(),action:"edit.issue.comment",payload:{id:u.id,issue:i.id,md:m},...t.value}],v)},pp=async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let t=await je();if(d(t))return t;let n=t.value,{breadCrumb:o,selectedNode:r}=g(),s=Se([...o,r],"TICKET");if(d(s))return a("Edit target must be an issue");let i=s.value;if(!A(i))return a("Edit target must be an issue");if(i.readonly)return a("Cannot edit readonly issue");let c=W(i.id).find(v=>v.title===ne.DESCRIPTION);if(!c)return a("No target found");if(c.readonly)return a("Cannot edit readonly field");let u=i.props.description??"";if(typeof u!="string")return a("Selected field is not editable text");let m=dd(u);if(d(m))return a("Failed to edit field");let p=m.value;return p===u?l("No changes made",null):F([{id:ys(),action:"edit.description",payload:{id:i.id,md:p},...e.value}],n)};import fp from"node:fs";import ud from"node:path";import xs from"node:fs";import gp from"node:path";var ld=async e=>{let t=gp.join(e,".gitignore"),n=xs.existsSync(t)?xs.readFileSync(t,"utf8"):"",o=[".epiq/events/",".epiq/log/"],r=n.split(`
52
+ `).map(u=>u.trim()),s=o.filter(u=>!r.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(s.length===0)return l("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...s].join(`
53
53
  `);return n=n.trimEnd()+`
54
54
 
55
- ${l}
56
- `,Bo.writeFileSync(t,n,"utf8"),de.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};var Zu=async e=>{let t=await k({cwd:e,args:["status","--porcelain"]});return d(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},j=(e,t)=>a(`[${e}] ${t}`),Pa=async()=>{F("");let e=Mn(),t=await Je(process.cwd());if(d(t))return j(1,t.message);let n=t.value,r=await Ln(n);if(d(r))return j(2,r.message);if(r.value)return j(2,`Cannot initialize Epiq while a git operation is in progress: ${r.value}`);let o=await Zu(n);if(d(o))return j(2.5,o.message);if(o.value)return j(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Ur(n))return j(4,"Epiq project already initialized");let i=Ze();if(!i.isSetupDone||!i.userName)return j(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let s=$(),l=s.userName,u=s.userId;if(!u||!l)return j(5,"Missing Epiq user id");let m=e.stateBranch,g=await Dn({repoRoot:n,branch:m});if(d(g))return j(6,g.message);if(g.value)return j(6,`State branch already exists: ${m}`);let h=await po({repoRoot:n,stateBranchName:m});if(d(h))return j(6,h.message);let C=Bn();if(d(C))return j(7,C.message);let I=Ma.join(On(),e.projectId),S=await cn({repoRoot:n,stateBranchRoot:I,stateBranchName:m});if(d(S))return j(8,S.message);let A=Ma.join(I,".epiq");Qu.mkdirSync(A,{recursive:!0});let R=ys({userId:u,userName:l});if(d(R))return j(9,R.message);for(let Br of R.value){let ti=zn({event:Br,rootDir:I});if(d(ti))return j(9,ti.message)}let M=await Jn({stateBranchRoot:I,eventFileName:sn({userId:u,userName:l})});if(d(M))return j(10,M.message);let O=await wt({cwd:I,message:"[epiq:init]"});if(d(O))return j(10,O.message);let Ie=await wa(n);if(d(Ie))return j(11,Ie.message);let le=ii({repoRoot:n,fileContents:e});if(d(le))return j(12,le.message);let Kt=await G.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(Kt))return j(13,Kt.message);let Sn=await G.commit({cwd:n,message:"[epiq:init-project]"});if(d(Sn))return j(13,Sn.message);let Rt="Project initialized!",zt=await k({cwd:n,args:["push","-u","origin","HEAD"]});d(zt)&&(Rt+=` Warn: [init:14] ${zt.message}`);let re=await ln({repoRoot:n,stateBranchRoot:I});d(re)&&(Rt+=` Warn: [init:15] ${re.message}`);let At=yt(R.value).filter(d);if(At.length>0)return j(16,At.map(Br=>Br.message).join(`
57
- `));let ft=ot();if(d(ft))return j(16,ft.message);let{rootNodeId:Wd,nodes:Hd}=ft.value,ei=Hd[Wd];return ei?(T.navigate({contextNode:ei,selectedIndex:0}),N({hasProjectDefinition:!0,mode:p.DEFAULT}),c(Rt,null)):j(16,"Unable to resolve initialized root node")};import{ulid as tm}from"ulid";import{ulid as em}from"ulid";var La=null,ut=()=>structuredClone(La),gn=e=>{La=e},ka=()=>{let{contextNode:e,selectedIndex:t}=v(),r=U(e.id)[t];return r?c("Resolved selected child",r):a("Target node not found")},Uo=({id:e,parentId:t,position:n={at:"end"}})=>{let r=U(t).filter(o=>o.id!==e);return Gn(r,n)},Da=({id:e,parentId:t,position:n={at:"end"}})=>{let r=Y();if(d(r))return a("Unable to resolve user ID");let o=Uo({parentId:t,id:e,position:n});return d(o)?o:c("Created pending move state",{id:em(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Fa=e=>{gn(e);let t=nn(e,!0);return d(t)?t:c("Node moved successfully",t.value)};function $o(e){let t=ka();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=U(o.id),s=i.findIndex(({id:m})=>m===n.id);if(s<0)return a("Current node not found among siblings");let l=i[s+e];if(!l)return a("Missing sibling node");let u=Da({id:t.value.id,parentId:l.id,position:{at:"end"}});return d(u)?u:Fa(u.value)}function _o(e){let t=ka();if(d(t))return t;let{contextNode:n,selectedIndex:r}=v(),i=U(n.id)[r+e];if(!i)return a("Missing sibling node");let s=Da({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return d(s)?s:Fa(s.value)}var Oa=()=>{let e=ut();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=U(n).findIndex(i=>i.id===t);return o===-1?a("Moved node not found among rendered children"):(T.navigate({contextNode:r,selectedIndex:o}),c("Synchronized navigation to moved node",null))},xr=(e,t="Moved preview")=>{if(d(e))return e;let n=Oa();return d(n)?n:(N({mode:p.MOVE}),c(t,null))},Ba=async()=>{let e=Y();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=V().commandMeta,{contextNode:n,selectedIndex:r}=v(),o=U(n.id)[r];if(!o)return N({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=U(o.parentNodeId),s=i.findIndex(({id:h})=>h===o.id);if(s===-1)return a("Target not found among siblings");let l=i[s-1],u=i[s+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},g=Uo({parentId:o.parentNodeId,id:o.id,position:m});return d(g)?g:(gn({id:tm(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:g.value.rank},...e.value}),N({mode:p.MOVE}),c("Move initialized",null))}if(t==="next")return xr(_o(1));if(t==="previous")return xr(_o(-1));if(t==="to-next")return xr($o(1));if(t==="to-previous")return xr($o(-1));if(t==="confirm"){let i=ut();if(!i)return a("No pending move to confirm");let s=await Re();if(d(s))return s;let l=Te(i,s.value);if(d(l))return l;let u=Oa();return d(u)?u:(gn(null),N({mode:p.DEFAULT}),c("Moved item",null))}return t==="cancel"?(gn(null),N({mode:p.DEFAULT}),c("Cancelling move",null)):a("Invalid move modifier")};import{ulid as hr}from"ulid";import{monotonicFactory as nm,ulid as rm}from"ulid";var om=nm(),Ua=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=om();return c("Created issue events",[{id:rm(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var $a=async(e,t)=>{let n=Y();if(d(n))return a("Unable to resolve user ID");let r=await Re();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:l}=v(),u=m=>{let g=Te(m,o);if(d(g))return g;let h=b.getNode(g.value.result.id);if(!h)return a("Created node not found");if(!h.parentNodeId)return g;let C=b.getNode(h.parentNodeId);return C?(T.navigate({contextNode:C,selectedIndex:b.getSiblings(h.parentNodeId).findIndex(({id:I})=>I===h.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 h=qn(g.id,n.value,o);return d(h)?h:u({id:hr(),action:"add.board",payload:{id:hr(),name:t.inputString,parent:g.id,rank:h.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=qn(m.value.id,n.value,o);return d(g)?g:u({id:hr(),action:"add.swimlane",payload:{id:hr(),name:t.inputString,parent:m.value.id,rank:g.value},...n.value})}if(t.modifier==="issue"){let m=_(s.id)[l],g=s.context==="SWIMLANE"?s:s.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let O=Ce(i,"SWIMLANE");return d(O)?null:O.value})();if(!g)return a("Unable to add issue in this context");let h=qn(g.id,n.value,o);if(d(h))return h;let C=Ua({name:t.inputString,parent:g.id,rank:h.value,user:n.value});if(d(C))return C;let I=C.value,S=ds(I,o);if(S.some(O=>d(O)))return a("Issue create failed: "+S.filter(d).map(O=>O.message).filter(Boolean).join(", "));let A=S[0];if(!A||d(A))return a("Issue creation failed");let M=I.find(O=>O.action==="add.issue")?.payload.id;return M?(T.navigate({contextNode:g,selectedIndex:b.getSiblings(g.id).findIndex(({id:O})=>O===M)}),c("Issue created",null)):a("Unable to determine ticket id")}return c("Success",null)};var _a=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}=V().commandMeta;if(r==="now"){let S=kt(n.value);if(d(S))return a(S.message);let A=fn();if(d(A))return A;let M=yt(S.value).filter(d);return M.length>0?a(M.map(O=>O.message).join(", ")):(N({mode:p.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}let o;if(r==="prev"){let S=v().eventLog.at(-1),A=ro(S);if(A===null)return a("No previous event to peek");o=A}else if(r==="next"){let S=v().unappliedEvents.at(0),A=ro(S);if(A===null)return a("No next event to peek");o=A+1}else{let S=nr(r);if(!S)return a("Invalid peek date");o=S.getTime()}let i=v(),s=e.value.id,l=rs(n.value,o);if(d(l))return a(l.message);let{appliedEvents:u,unappliedEvents:m}=l.value,g=fn();if(d(g))return g;let C=yt(u).filter(d);if(C.length>0)return fn(),N(i),a(C.map(S=>S.message).join(", "));let I=v().nodes[s];return I?(T.navigate({contextNode:I,selectedIndex:0}),N({mode:p.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),c("Peeking",!0)):(fn(),N(i),a("Board did not exist at peek date"))};import im from"zod";var Wa=()=>{let e=V().commandMeta.inputString,t=im.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return a("Auto sync duration must be a number of at least 3000 ms");let n=ze({autoSyncDebounceMs:t.data});return d(n)?n:(Ee({autoSyncIntervalMs:t.data}),N({mode:p.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))};var Ha=()=>{let e=V().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=Ri(e),n=ze({autoSync:t});return d(n)?n:(Ee({autoSync:t}),N({mode:p.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var ja=()=>{let e=V().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=ze({logLevel:e});return d(n)?n:(Ee({logLevel:e}),N({mode:p.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var Va=async()=>{F(""),N({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");N({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Qn();return d(t)?(N({syncStatus:{msg:t.message,status:"failed"}}),t):(N({mode:p.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var Ka=e=>Object.values(v().tags).find(t=>t.name===e),za=e=>Object.values(v().contributors).find(t=>t.name===e),yr=[{systemOnly:!0,intent:P.Move,description:"Internal move-state command",mode:p.COMMAND_LINE,action:Ba},{intent:P.Delete,description:"Delete the currently selected node",mode:p.COMMAND_LINE,action:async()=>{let e=Y();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=_(t.id)[n];return r?Se({id:fe(),action:"delete.node",payload:{id:r.id},...e.value}):a("Unable to resolve child to delete")},onSuccess:()=>N({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}=V().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(s=>Z(x.FILTER).map(l=>l.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})),c("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}}),N({mode:p.HELP}),c("Viewing help",null)}},{intent:P.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:p.COMMAND_LINE,action:async()=>{let e=Y();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return a("Unable to close issue, no target found");if(!B(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 Re();if(d(i))return i;let s=i.value,l=lo(o.id,r.id,{at:"end"},e.value,s);if(d(l))return l;let u=await Se({id:fe(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...e.value});return d(u)?u:c("Issue closed",null)},onSuccess:()=>N({mode:p.DEFAULT})},{intent:P.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:p.COMMAND_LINE,action:async()=>{let e=Y();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return a("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("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(!B(i))return a("Target node is not issue");let l=ba(i);if(!l)return a("Unable to resolve previous parent from issue history");if(l===s.id)return a("Previous parent resolves to closed swimlane");let u=v().nodes[l];if(!u)return a("Previous parent no longer exists");let m=await Re();if(d(m))return m;let g=m.value,h=lo(u.id,i.id,{at:"end"},e.value,g);if(d(h))return h;let C=await Se({id:fe(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:h.value},...e.value});return d(C)?C:c("Issue reopened",null)},onSuccess:()=>N({mode:p.DEFAULT})},{intent:P.Init,description:"Initialize Epiq in the current git repository",mode:p.COMMAND_LINE,action:Pa},{intent:P.NewItem,description:"Create a new board, swimlane, or issue",mode:p.COMMAND_LINE,action:$a,onSuccess:()=>N({mode:p.DEFAULT})},{intent:P.Rename,description:"itle] Rename the currently selected node",mode:p.COMMAND_LINE,action:async()=>{let e=Y();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return a("Missing node");if(r.readonly)return a("Cannot rename readonly node");let o=Js();return o?Se({id:fe(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):a("Provide a title")},onSuccess:()=>N({mode:p.DEFAULT})},{intent:P.UntagTicket,description:"Remove a tag from the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=Y();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=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 l=s.value;return B(l)?(l.props.tags??[]).includes(o.id)?Se({id:fe(),action:"remove.issue.tag",payload:{id:l.id,tag:o.id},...e.value}):a("Issue is not tagged with that tag"):a("Target node is not issue")},onSuccess:()=>N({mode:p.DEFAULT})},{intent:P.TagTicket,description:"Add or create a tag on the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=Y();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=nt(o.id,"TICKET");if(d(i))return a("Unable to tag issue in this context");let s=i.value;if(!B(s))return a("Target node is not issue");let l=Ka(r),u;if(l)u=l.id;else{let g=fe(),h=await Se({id:fe(),action:"create.tag",payload:{id:g,name:r},...e.value});if(d(h))return h;u=h.value.result.id}return(s.props.tags??[]).includes(u)?a("Already tagged with that tag"):Se({id:fe(),action:"add.issue.tag",payload:{id:s.id,tag:u},...e.value})},onSuccess:()=>N({mode:p.DEFAULT})},{intent:P.AssignUserToTicket,description:"Assign a user to the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=Y();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=_(i.id)[o];if(!s)return a("Invalid assign target");let l=nt(s.id,"TICKET");if(d(l))return a("Unable to assign issue in this context");let u=l.value;if(!B(u))return a("Target node is not issue");let m=za(r),g;if(m)g=m.id;else{let C=fe(),I=await Se({id:fe(),action:"create.contributor",payload:{id:C,name:r},...e.value});if(d(I))return I;g=I.value.result.id}return(u.props.assignees??[]).includes(g)?a("Assignee already assigned"):Se({id:fe(),action:"add.issue.assignee",payload:{id:u.id,assignee:g},...e.value})},onSuccess:()=>N({mode:p.DEFAULT})},{intent:P.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=Y();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=za(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 l=s.value;return B(l)?(l.props.assignees??[]).includes(o.id)?Se({id:fe(),action:"remove.issue.assignee",payload:{id:l.id,assignee:o.id},...e.value}):a(`Issue is not assigned to "${r}"`):a("Target node is not issue")},onSuccess:()=>N({mode:p.DEFAULT})},{intent:P.Sync,description:"Pull, commit, and push Epiq state",mode:p.COMMAND_LINE,action:Va},{intent:P.Peek,description:"View board state at another point in time",mode:p.COMMAND_LINE,action:_a},{intent:P.Export,description:"Export the current board layout to markdown",mode:p.COMMAND_LINE,action:async()=>{let e=await pa();return d(e)?e:(N({mode:p.DEFAULT}),c("Export successful",!0))}},{intent:P.Exit,description:"Exit the application",mode:p.COMMAND_LINE,action:async()=>(T.exit(),c("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 Ta();if(t.modifier===it.TITLE){let n=Y();if(d(n))return a("Unable to resolve user ID");let{contextNode:r,selectedIndex:o}=v(),i=_(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:fe(),action:"edit.title",payload:{id:i.id,name:s},...n.value}):a("Provide a title")}return a("Unknown edit command")},onSuccess:()=>N({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 X.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=$(),s=n||i,l=r??fe();if(!s||!l)return a("Unable to resolve user name or id");let u=ze({userName:s,userId:l,preferredEditor:o??""});return d(u)?u:(Ee({userName:s,userId:l}),N({mode:p.DEFAULT}),c(`Username set to "${s}"`,null))}case X.EDITOR:{if(!n)return a("No editor provided");let r=ze({preferredEditor:n});return d(r)?r:(Ee({preferredEditor:n}),N({mode:p.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case X.VIEW:return n!=="wide"&&n!=="dense"?a("Invalid view mode"):(Ee({viewMode:n}),c(`View set to "${n}"`,null));case X.AUTOSYNC:return Ha();case X.LOG_LEVEL:return ja();case X.SYNC_DEBOUNCE_MS:return Wa();default:return a("Unknown config command")}}},{intent:P.Coffee,description:"Sponsor the development of Epiq!",mode:p.COMMAND_LINE,action:()=>{let e=V().commandMeta.modifier;return e==="custom"?Oo("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):Oo(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),F(""),c("Thanks you!",null)}}];var sm=new Set(["peek","filter","view-help"]),Oe=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===Nt.Invalid)return a("Invalid command");let i=ar(t);zs();let{readOnly:s}=v();if(s&&!sm.has(i))return mn({status:qe.Fail,message:"Command not available in readonly state",value:null});let l=yr.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return mn({status:qe.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return mn({status:qe.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?mn(u):(Gs({addToHistory:!e}),l.onSuccess?.(),$().autoSync&&Zn(),u)};var Er=[{intent:f.Exit,mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(N({mode:p.COMMAND_LINE}),F("move cancel"),Oe({isForceExecutedBySystem:!0}))},{intent:f.InitMove,mode:p.DEFAULT,description:"[m] move (init/confirm)",action:()=>(N({mode:p.COMMAND_LINE}),F("move start"),Oe({isForceExecutedBySystem:!0}))},{intent:f.ConfirmMove,mode:p.MOVE,action:()=>(N({mode:p.COMMAND_LINE}),F("move confirm"),Oe({isForceExecutedBySystem:!0}))}],Cr=[{intent:f.MovePreviousItem,mode:p.MOVE,action:()=>ut()?(N({mode:p.COMMAND_LINE}),F("move previous"),Oe({isForceExecutedBySystem:!0})):a("No pending move")},{intent:f.MoveNextItem,mode:p.MOVE,action:()=>ut()?(N({mode:p.COMMAND_LINE}),F("move next"),Oe({isForceExecutedBySystem:!0})):a("No pending move")}],Ga=[{intent:f.MoveToNextContainer,mode:p.MOVE,action:()=>ut()?(N({mode:p.COMMAND_LINE}),F("move to-next"),Oe({isForceExecutedBySystem:!0})):a("No pending move")},{intent:f.MoveToPreviousContainer,mode:p.MOVE,action:()=>ut()?(N({mode:p.COMMAND_LINE}),F("move to-previous"),Oe({isForceExecutedBySystem:!0})):a("No pending move")}];var qa={[w.WORKSPACE]:[...Er,...Cr],[w.BOARD]:[...Er,...Cr],[w.SWIMLANE]:[...Er,...Cr,...Ga],[w.TICKET]:[],[w.FIELD]:[],[w.FIELD_LIST]:[],[w.TEXT]:[]};var Ya=()=>{F("");let{pendingNavTarget:e}=ct();N({mode:p.DEFAULT}),e&&T.navigate(e),lt({pendingNavTarget:void 0})},Xa=[{intent:f.ExitCommandLine,mode:p.HELP,action:()=>(Ya(),c("Exiting help",null))},{intent:f.Exit,mode:p.HELP,action:()=>(Ya(),c("Closed help",null))},{intent:f.NavPreviousItem,mode:p.HELP,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),c("Navigating to previous help item",null))},{intent:f.NavNextItem,mode:p.HELP,action:()=>(T.navigateToNextItem(),c("Navigating to next help item",null))},{intent:f.NavToPreviousContainer,mode:p.HELP,action:()=>(T.navigateToPreviousContainer(),c("Navigating to previous help container",null))},{intent:f.NavToNextContainer,mode:p.HELP,action:()=>(T.navigateToNextContainer(),c("Navigating to next help container",null))}];var am=e=>{N({mode:p.COMMAND_LINE});let{pendingNavTarget:t}=ct();t&&T.navigate(t),lt({pendingNavTarget:void 0}),F(`${e} `)},Ja=()=>{F("");let{pendingNavTarget:e}=ct();e&&T.navigate(e),lt({pendingNavTarget:void 0}),N({mode:p.DEFAULT})},Qa=[{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}}),N({mode:p.PALETTE}),c("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?(am(t),c("Selected command",t)):c("No command selected",null)}},{intent:f.ExitCommandLine,mode:p.PALETTE,action:()=>(Ja(),c("Exiting palette",null))},{intent:f.Exit,mode:p.PALETTE,action:()=>(Ja(),c("Closed command palette",null))},{intent:f.NavPreviousItem,mode:p.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:f.NavNextItem,mode:p.PALETTE,action:()=>(T.navigateToNextItem(),c("Navigating to next item",null))},{intent:f.NavToPreviousContainer,mode:p.PALETTE,action:()=>(T.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:f.NavToNextContainer,mode:p.PALETTE,action:()=>(T.navigateToNextContainer(),c("Navigating to next container",null))}];var Za=[...Xa,...Qa,{intent:f.AddItem,mode:p.DEFAULT,description:"[n] new...",action:()=>(N({mode:p.COMMAND_LINE}),F(`${x.NEW} `),c("Adding new item",null))},{intent:f.Delete,mode:p.DEFAULT,description:"[d] delete",action:()=>(N({mode:p.COMMAND_LINE}),F(`${x.DELETE} `),c("Deleting item",null))},{intent:f.InitCommandLine,mode:p.DEFAULT,description:"[:] focus command line",action:()=>(N({mode:p.COMMAND_LINE}),F(""),c("Entering command line mode",null))},{intent:f.Confirm,mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!U(e?.id??"")?.length){if(e?.title===Q.DESCRIPTION)return N({mode:p.COMMAND_LINE}),F(`${x.EDIT} description `),c("Propose command",!0);if(e?.title===Q.ASSIGNEES)return N({mode:p.COMMAND_LINE}),F(`${x.ASSIGN} `),c("Propose command",!0);if(e?.title===Q.TAGS)return N({mode:p.COMMAND_LINE}),F(`${x.TAG} `),c("Propose command",!0);if(t.title===Q.DESCRIPTION&&e?.context==="TEXT")return N({mode:p.COMMAND_LINE}),F(`${x.EDIT} description `),c("Propose command",!0)}return T.enterChildNode(),c("Entering context",null)}},{intent:f.EditTitle,mode:p.DEFAULT,description:"[r] rename title",action:()=>(N({mode:p.COMMAND_LINE}),F(`${x.EDIT} title ${v().selectedNode?.title}`),c("Exiting context",null))},{intent:f.EditDescription,mode:p.DEFAULT,description:"[e] edit description",action:()=>(N({mode:p.COMMAND_LINE}),F(`${x.EDIT} description `),c("Exiting context",null))},{intent:f.Exit,mode:p.DEFAULT,description:"[q] exit context",action:()=>(T.enterParentNode(),c("Exiting context",null))},{intent:f.NavPreviousItem,mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:f.NavNextItem,mode:p.DEFAULT,action:()=>(T.navigateToNextItem(),c("Navigating to next item",null))},{intent:f.NavToPreviousContainer,mode:p.DEFAULT,action:()=>(T.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:f.NavToNextContainer,mode:p.DEFAULT,action:()=>(T.navigateToNextContainer(),c("Navigating to next container",null))}];var dm=500,cm=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),ed=e=>{let t=cm(e);t&&sr(n=>(n+t).slice(0,dm))};var lm=[p.COMMAND_LINE,p.PALETTE],um=e=>[{intent:f.MoveCursorLeft,mode:e,action:()=>(Io(-1),c("Moving cursor left",null))},{intent:f.MoveCursorRight,mode:e,action:()=>(Io(1),c("Moving cursor right",null))},{intent:f.MoveCursorLeftOfWord,mode:e,action:()=>(Ro("left"),c("Moving cursor left of word",null))},{intent:f.MoveCursorRightOfWord,mode:e,action:()=>(Ro("right"),c("Moving cursor right of word",null))},{intent:f.AutoCompleteCommand,mode:e,action:()=>(sr((t,{remainder:n})=>n?t+n:t),c("Auto-completing command",null))},{intent:f.CaptureInput,mode:e,action:(t,{sequence:n})=>(ed(n??""),c("Capturing input",null))},{intent:f.EraseInput,mode:e,action:()=>(Vs(),c("Erasing input",null))},{intent:f.EraseInputWord,mode:e,action:()=>(Ks(),c("Erasing input word",null))}],td=[{intent:f.Confirm,mode:p.COMMAND_LINE,action:()=>(Oe(),c("Executing command",null))},{intent:f.ViewHelp,mode:p.DEFAULT,action:()=>(N({mode:p.HELP}),c("Viewing help",null))},...lm.flatMap(um),{intent:f.ExitCommandLine,mode:p.COMMAND_LINE,action:()=>(N({mode:p.DEFAULT}),c("Exiting command line",null))},{intent:f.GetLastCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(qs(),c("Getting last command from history",null))},{intent:f.GetNextCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(Ys(),c("Getting next command from history",null))}];import od from"chalk";var Nr=od.dim.hex(y.secondary2)(": for command line"),nd="q to exit",rd=`${od.hex(y.accent)("m")} to confirm`,Wo={[w.WORKSPACE]:[Nr],[w.BOARD]:[Nr],[w.BOARD+p.COMMAND_LINE]:[Nr],[w.SWIMLANE]:[Nr],[w.TICKET+p.HELP]:[nd],[w.SWIMLANE+p.HELP]:[nd],[w.TICKET]:[],[w.FIELD]:[],[w.SWIMLANE+p.MOVE]:[rd],[w.TICKET+p.MOVE]:[rd]};var vn=e=>e.trim().toLocaleLowerCase(),mm=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},pm=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},id=(e,t)=>{let n=vn(t.value);if(!n)return!0;switch(t.target){case"title":return vn(e.title??"").includes(n);case"description":return vn(e.props.description??"").includes(n);case"tag":return mm(e).map(vn).some(o=>o.includes(n));case"assignee":return pm(e).map(vn).some(o=>o.includes(n));default:return!0}};function sd(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(),c("Breadcrumb built",o))}var ad=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 St,Ho,jo=new Set,dd=()=>{for(let e of jo)e()},fm=e=>(jo.add(e),()=>jo.delete(e));function cd(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 l=o[t];if(!l)return a("Unable to derive state, contextNode not found");let u=sd(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:g}=l,h=Wo[g+n]??Wo[g]??[],C=[...Za,...qa[g]??[],...td],I=ad(C),S=vm(o,i),A=S[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:h,availableActions:C,actionIndex:I,selectedNode:A,renderedChildrenIndex:S})}var v=()=>{if(!St)throw new Error("State not initialized. Call initWorkspaceState() first.");return St},ot=()=>St?c("Retrieved state",St):a("State not initialized. Call initWorkspaceState() first.");function rn(e){Ho=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=cd(r);return d(o)?o:(St=o.value,dd(),c("State initialized",null))}function Ne(e){let t=v(),n=e(t),r=cd(n);return d(r)?a(r.message??"Unable to update state"):(St=r.value,dd(),c("State updated",null))}var N=e=>Ne(t=>({...t,...e}));var K=()=>gm(fm,v,v),vm=(e,t)=>{let n={};for(let r of Object.values(e))B(r)&&t.length>0&&!t.every(o=>id(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],l=e[i.id];return!s||!l?0:s.rank.localeCompare(l.rank)});return n},_=e=>v()?.renderedChildrenIndex[e]??[],fn=()=>Ho?rn(Ho):a("Cannot reset state: no initial workspace found"),Dt=()=>St!==void 0;import{Box as Vo,Text as xn}from"ink";import Me,{useEffect as xm,useMemo as hm}from"react";import{ulid as ym}from"ulid";var ld=({text:e,match:t,color:n,highlightColor:r=y.secondary,dimColor:o=!1})=>{if(!t)return Me.createElement(xn,{color:n,dimColor:o},e);let i=e.toLowerCase(),s=t.toLowerCase(),l=i.indexOf(s);return l===-1?Me.createElement(xn,{color:n,dimColor:o},e):Me.createElement(xn,{color:n,dimColor:o},e.slice(0,l),Me.createElement(xn,{backgroundColor:r,bold:!0},e.slice(l,l+t.length)),e.slice(l+t.length))},ud=ym(),Em=e=>`${e}`,Cm=e=>{let{pendingNavTarget:t}=ct();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,i=new Set(Z(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 l=ar(s),u=yr.find(m=>m.intent===l);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,l)=>s.isAvailable!==l.isAvailable?s.isAvailable?-1:1:s.command.localeCompare(l.command))},Nm=e=>q.text({id:ud,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),bm=(e,t,n)=>q.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}),Ko=[],Sm=e=>{md();let t=b.createNode(Nm(v().rootNodeId));d(t)||!et(t.value)||(Ko=[t.value,...e.map((n,r)=>bm(n,r,ud)).map(b.createNode).filter(J).map(({value:n})=>n).filter(et)],T.navigate({contextNode:t.value,selectedIndex:0}))},md=()=>{let e=Ko.map(t=>t.id);Ko=[];for(let t of e)b.deleteNode(t)};function pd({width:e,height:t}){let r=Xs().value.trim().toLowerCase(),o=hm(()=>Cm(r),[r]);xm(()=>(Sm(o),()=>{md()}),[o]);let i=v().selectedIndex;return Me.createElement(Vo,{flexDirection:"column",width:e,height:t-2},Me.createElement(st,{height:t-4,itemHeight:3,selectedIndex:i},o.map((s,l)=>{let u=l===i,m=s.isAvailable?y.accent:y.secondary2,g=s.isAvailable?"":"[unavailable] ";return Me.createElement(Vo,{key:s.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},Me.createElement(xn,{color:m,dimColor:!s.isAvailable},u?"\u276F ":" ",Me.createElement(ld,{text:Di(s.command),match:r,color:m,dimColor:!s.isAvailable})),Me.createElement(Vo,{paddingLeft:2},Me.createElement(ld,{text:g+s.description,match:r.length>=2?r:"",color:u&&s.isAvailable?y.primary:y.secondary2,dimColor:!s.isAvailable})))})))}import{Box as Bm}from"ink";import Go from"react";import yn from"chalk";import{Box as zo,Text as gd}from"ink";import hn,{useEffect as Im,useMemo as Rm,useState as Am}from"react";var fd=yn.gray,Tm=yn.inverse,wm=yn.inverse.gray,Mm={hint:"",hints:[],overlap:0,remainder:""},xd=({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}},Pm=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=be(t);return{bg:r=>yn.bgHex(n).black(r),bgCursor:r=>yn.bgHex(n).inverse.black(r)}}return no(t)},Lm=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=xd({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}},vd=()=>({value:se.value,cursorPosition:se.cursorPosition,commandIsPending:se.commandIsPending,autoCompletion:se.commandMeta.autoCompletion??Mm,infoMessage:se.commandMeta.infoMessage,validationStatus:se.commandMeta.validity,command:se.commandMeta.command,inputString:se.commandMeta.inputString,modifier:se.commandMeta.modifier}),km=(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,hd=({width:e,mode:t})=>{let[n,r]=Am(vd());Im(()=>{let C=()=>{let S=vd();r(A=>km(A,S)?A:S)},I=So(C);return C(),()=>{I()}},[]);let{value:o,cursorPosition:i,infoMessage:s,commandIsPending:l,autoCompletion:u,command:m,modifier:g}=n,h=Rm(()=>{let C=Math.max(0,Math.min(i,o.length)),I=xd({value:o,command:m}),S=Lm({value:o,command:m,modifier:g}),A=m?no(m):null,R=Pm({command:m,modifier:g}),M=(re,ue)=>{let At=I&&ue>=I.start&&ue<I.end,ft=S&&ue>=S.start&&ue<S.end;return At&&A?A.fg(re):ft&&R?R.bg(re):re},O=(re,ue)=>{let At=I&&ue>=I.start&&ue<I.end,ft=S&&ue>=S.start&&ue<S.end;return At&&A?A.fgCursor(re):ft&&R?R.bgCursor(re):Tm(re)},Ie=o.slice(0,C),le=o[C]??" ",Kt=C<o.length?o.slice(C+1):"",Sn=Array.from(Ie).map((re,ue)=>M(re,ue)).join(""),Rt=O(le,C),zt=Array.from(Kt).map((re,ue)=>M(re,C+1+ue)).join("");if(u.hint){let re=u.hint[u.overlap]??le;Rt=wm(re),zt=fd(u.remainder.slice(1)+Kt)}return fd(t===p.PALETTE?"?":":")+Sn+Rt+zt},[o,i,u,m,g]);return hn.createElement(zo,{flexDirection:"column",justifyContent:"flex-start"},hn.createElement(zo,{flexDirection:"column",paddingX:1,borderColor:y.secondary,borderStyle:"round",width:e},hn.createElement(zo,null,hn.createElement(gd,null,h),s&&hn.createElement(gd,{wrap:"truncate",color:l?y.red:y.secondary2},` ${s} `))))};import{Box as Dm,Text as Fm}from"ink";import yd from"react";var Om=(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=Om(t,e).join(" | ");return yd.createElement(Dm,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},yd.createElement(Fm,{color:y.secondary2},n.length?n:"\xA0"))};var En=({width:e,mode:t,availableHints:n})=>{let r=[],o=0;for(let i of n){let l=(r.length>0?" | ":"").length+i.length;if(o+l>e+2)break;r.push(i),o+=l}return Go.createElement(Bm,null,t===p.COMMAND_LINE||t===p.PALETTE?Go.createElement(hd,{width:e,mode:t}):Go.createElement(Ed,{width:e,mode:t,availableHints:n}))};import{Box as mt,Text as jt}from"ink";import ce,{useEffect as Um,useMemo as $m}from"react";import{ulid as Cd}from"ulid";var Sr=Cd(),_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})),Wm=e=>q.text({id:Sr,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),Hm=(e,t,n)=>q.text({id:Cd(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),br=[],Nd=()=>{let e=br.filter(n=>n.id!==Sr).map(n=>n.id),t=br.filter(n=>n.id===Sr).map(n=>n.id);br=[];for(let n of[...e,...t])b.deleteNode(n)},jm=e=>{Nd();let t=b.createNode(Wm(v().rootNodeId));if(d(t)||!et(t.value))return logger.error("Could not attach help nodes");br=[t.value,...e.map((n,r)=>Hm(n,r,Sr)).map(b.createNode).filter(J).map(({value:n})=>n).filter(et)],T.navigate({contextNode:t.value,selectedIndex:0})},bd=({width:e,height:t})=>{let n=$m(()=>_m(),[]);Um(()=>(jm(n),()=>{Nd()}),[n]);let r=v().selectedIndex;return ce.createElement(mt,{flexDirection:"column",marginTop:3,borderColor:y.secondary,borderStyle:"round",width:e,height:t-2},ce.createElement(mt,{paddingX:1,justifyContent:"center"},ce.createElement(jt,{color:y.accent},"Help"),ce.createElement(jt,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),ce.createElement(mt,{paddingX:1,marginTop:1},ce.createElement(mt,{width:20,justifyContent:"flex-end"},ce.createElement(jt,{color:y.secondary},"Key(s)")),ce.createElement(mt,{flexGrow:1,width:40,paddingLeft:2},ce.createElement(jt,{color:y.secondary},"Action"))),ce.createElement(st,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:i},s)=>{let l=s===r;return ce.createElement(mt,{paddingX:1,key:`${o}-${i}-${s}`,flexDirection:"row"},ce.createElement(mt,{width:20,justifyContent:"flex-end"},ce.createElement(jt,{color:y.accent},o)),ce.createElement(mt,{flexGrow:1,width:40,paddingLeft:2},ce.createElement(jt,{color:l?y.primary:y.secondary2},i)))})))};import Vm from"chalk";import{Box as Ir,Text as Ge}from"ink";import xe from"react";var Sd=({width:e,height:t})=>xe.createElement(Ir,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},xe.createElement(Ge,{color:y.accent,bold:!0},"Initialize project"),xe.createElement(Ge,null,`This folder is not an ${Vm.hex(y.accent)("epiq")} project yet.`),xe.createElement(Ge,{color:y.primary},"To start tracking issues here, we need to initialize a new",xe.createElement(Ge,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),xe.createElement(Ir,{marginTop:1,flexDirection:"column"},xe.createElement(Ir,null,xe.createElement(Ge,{color:y.accent}," "),xe.createElement(Ge,{color:y.primary},"Type "),xe.createElement(Ge,{backgroundColor:y.secondary}," :init "))),xe.createElement(Ir,{marginTop:1},xe.createElement(Ge,{color:y.secondary2},"This will create, commit and push "),xe.createElement(Ge,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json ")));import{Box as Rr,Text as Be}from"ink";import ne from"react";var Km=({isDone:e,command:t,value:n})=>ne.createElement(Rr,null,ne.createElement(Be,{color:y.accent,dimColor:e},e?" \u2714 ":" "),ne.createElement(Be,{dimColor:e},"Type "),ne.createElement(Be,{backgroundColor:y.secondary,dimColor:e}," "+t+" "),n!==void 0&&ne.createElement(ne.Fragment,null,ne.createElement(Be,{dimColor:e}," "),ne.createElement(Be,{color:y.secondary,dimColor:e},"<"+n+">"))),zm=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function qo({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:i,autoSync:s,isSetAutoSync:l}=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:l,command:":config autosync",value:s,message:"Almost there. Configure auto sync."}],m=u.findIndex(h=>!h.done),g=m===-1?void 0:u[m];return ne.createElement(Rr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},ne.createElement(Be,{color:y.accent,bold:!0},"Welcome! \u{1F539}"),ne.createElement(Be,null,"Let's get you started - it's a breeze."),ne.createElement(Be,{color:y.secondary2},"Remember - you can always search available commands by typing:",ne.createElement(Be,{color:y.accent}," ? ")),g&&ne.createElement(Be,{color:y.secondary2},g.message),ne.createElement(Rr,{flexDirection:"column"},u.map((h,C)=>m===-1||C<=m?ne.createElement(Rr,{key:h.key,marginBottom:1},ne.createElement(Km,{isDone:h.done,command:h.command,value:h.done?zm(h.value):void 0})):null)))}import Pr from"chalk";import{Box as Mr,Text as Vt}from"ink";import ae from"react";var Id="0.6.20";import{Box as Ar,Text as Gm}from"ink";import It from"react";var Rd=({width:e})=>{let{viewMode:t}=$(),n=K(),{breadCrumb:r,contextNode:o,selectedIndex:i,renderedChildrenIndex:s}=n,l=s[o.id]?.[i],u=nt(l?.id??o.id,"TICKET"),m=J(u)?u.value:void 0,g=m?.props.tags??[],h=m?.props.assignees??[],C=m?.parentNodeId?!Qr(o.id,m.parentNodeId)&&t==="dense":!1,I=r.map((R,M)=>{let O=M===r.length-1,Ie=U(R.id),le=O?Ie?.[i]?.title:void 0;return`${M?" / ":""}${R.title??""}${le?` \u25B8 ${le}`:""}`}).join(""),S=g.reduce((R,M)=>R+(b.getTag(M)?.name.length??0)+4,0)+h.reduce((R,M)=>R+(b.getContributor(M)?.name.length??0)+4,0),A=e-S;return It.createElement(Ar,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},It.createElement(Ar,{overflow:"hidden",width:A},It.createElement(Gm,{wrap:"truncate-end",color:y.secondary2},I)),C?g.map(R=>It.createElement(Ar,{key:R,paddingLeft:1},It.createElement(_t,{id:R}))):null,C?h.map(R=>It.createElement(Ar,{key:R,paddingLeft:1},It.createElement($t,{id:R}))):null)};import{Box as qm,Text as Ad}from"ink";import Tr from"react";var Ym=({filters:e})=>Tr.createElement(qm,{columnGap:1},Tr.createElement(Ad,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Tr.createElement(Ad,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Td=Tr.memo(Ym);import{Box as Xm,Text as wr}from"ink";import Cn from"react";function wd(){let{eventLog:e,unappliedEvents:t}=K(),n=e.at(-1)?.id,r=Hn(n??""),o=J(r)?Xi(r.value):"INVALID DATE";return Cn.createElement(Xm,{paddingLeft:1},Cn.createElement(wr,{backgroundColor:y.accent}," Readonly "),Cn.createElement(wr,{color:y.accent}," "+t.length+" edits ago at "+o+"."),Cn.createElement(wr,{color:y.accent}," Resume with "),Cn.createElement(wr,{backgroundColor:y.accent}," :peek now "))}import Yo from"chalk";import{Box as Jm,Text as Md}from"ink";import Xo,{useEffect as Qm,useState as Zm}from"react";var ep=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Pd=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)}},tp=({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)}`},np=(e,t,n)=>{let r=Pd(e),o=Pd(t);return tp({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},rp=(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 np(i,s,o)};function Ld({syncStatus:e,autoSync:t}){let[n,r]=Zm(0);Qm(()=>{if(e.status!=="syncing"){r(0);return}let l=setInterval(()=>{r(u=>u+1)},50);return()=>clearInterval(l)},[e.status]);let o={synced:" ",failed:"---",syncing:"...",pending:"idle"},s={synced:y.secondary2,failed:y.yellow,pending:y.secondary2,syncing:rp(ep,(Math.sin(n*.12)+1)/2)??""}[e.status];return Xo.createElement(Jm,null,Xo.createElement(Md,null,Yo.hex(y.secondary2).dim(t?"AutoSync: ":"Sync: ")),Xo.createElement(Md,null,Yo.hex(s)("\u25CF")+Yo.hex(y.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}function Nn({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o}=K(),{userName:i,preferredEditor:s,autoSync:l}=$(),u=64,m=process.stdout.columns-u-8;return ae.createElement(Mr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?ae.createElement(Vt,null," "):o===p.PALETTE?ae.createElement(Mr,null,ae.createElement(Vt,{color:y.accent},"Command Palette"),ae.createElement(Vt,{dimColor:!0,color:y.secondary2}," ","- search, select and press enter")):ae.createElement(Mr,{paddingLeft:1},e.length>0?ae.createElement(Td,{filters:e}):ae.createElement(Rd,{width:m})),n==="live"?ae.createElement(Mr,{columnGap:1,paddingRight:2,"max-width":u,overflow:"hidden",justifyContent:"flex-end"},ae.createElement(Ld,{autoSync:!!l,syncStatus:r}),ae.createElement(Vt,null,Pr.hex(y.secondary2).dim("Mode: ")+Pr.hex(y.secondary2).dim(o.padEnd(8," "))," "),ae.createElement(kd,{icon:"@",value:i}),ae.createElement(kd,{icon:"\u276F",value:s}),ae.createElement(Vt,{dimColor:!0,color:y.secondary2},Id+" ")):"",n==="peek"?ae.createElement(wd,null):"")}function kd({icon:e,value:t}){return ae.createElement(Vt,null,Pr.dim(e)+Pr.hex(y.accent)(` ${t??"-"} `))}import{Box as op,Text as ip}from"ink";import bn from"react";import{Box as Lr,Text as Jo}from"ink";import pt from"react";function Qo(){let e=K(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,s=t?.id?_(t?.id):[];return pt.createElement(Lr,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:y.secondary,width:i},pt.createElement(Lr,{padding:1,paddingTop:0,paddingBottom:0},pt.createElement(Jo,null,"Select a board:")),pt.createElement(Lr,{padding:1,flexDirection:"column"},s.map((l,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,h=_(l.id).flatMap(({id:C})=>U(C)).length;return pt.createElement(Lr,{key:l.id??u},pt.createElement(Jo,{color:m?y.accent:y.secondary2},pt.createElement(ge,{isSelected:m})),pt.createElement(Jo,{color:m?y.accent:y.secondary2},l.title," (",h," issues)",l.readonly?" \u{1F512}":""))})))}var sp=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:s})=>{let{renderedChildrenIndex:l}=K(),u=n.find(({context:C})=>C==="BOARD"),h=i-1-3;return bn.createElement(op,{flexDirection:"row"},e.context==="WORKSPACE"?bn.createElement(Qo,null):u?bn.createElement(gr,{height:h,width:s,swimlanes:(l[u.id]??[]).filter(C=>C!==void 0&&Mt(C)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):bn.createElement(ip,null))},Dd=bn.memo(sp);import{useEffect as ap}from"react";var dp=e=>{ap(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:i,preferredEditor:s}=$();s&&i&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:l,mode:u}=v();u==="default"&&!l&&Zn(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},Fd=({autoSync:e})=>(dp(e),null);function Zo({width:e,height:t}){let n=K(),{autoSync:r,viewMode:o}=bi(),i=n.filters;if(n.mode===p.HELP)return z.createElement(gt,{flexDirection:"column"},z.createElement(bd,{width:e,height:t}));if(n.mode===p.PALETTE)return z.createElement(gt,{flexDirection:"column"},z.createElement(Nn,{filters:i}),z.createElement(pd,{width:e,height:t-2}),z.createElement(En,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:s}=Ze(),l=!s,u=s&&!n.hasProjectDefinition;if(l)return z.createElement(gt,{flexDirection:"column"},z.createElement(gt,{flexDirection:"column"},z.createElement(Nn,{hideBreadCrumb:!0,filters:i}),z.createElement(qo,{height:t,width:e})),z.createElement(En,{width:e,mode:n.mode,availableHints:n.availableHints}));if(u)return z.createElement(gt,{flexDirection:"column"},z.createElement(gt,{flexDirection:"column"},z.createElement(Nn,{hideBreadCrumb:!0,filters:i}),z.createElement(Sd,{height:t,width:e})),z.createElement(En,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=Ce(n.breadCrumb??[],"BOARD");if(J(m)){let g=m.value.id,h=_(g).length,C=3,I=Math.floor(e/C),S=Math.floor(e/Math.max(h,1));e=Math.min(S,I)*Math.max(h,C)}return z.createElement(gt,{flexDirection:"column"},z.createElement(Fd,{autoSync:r}),z.createElement(gt,{flexDirection:"column"},z.createElement(Nn,{filters:i}),z.createElement(Dd,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),z.createElement(En,{width:e,mode:n.mode,availableHints:n.availableHints}))}import cp from"readline";var kr,Dr,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]),Od=async e=>{if(e.ctrl&&e.name==="c")return T.exit();let{actionIndex:t,mode:n,readOnly:r}=v(),o=Qs(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 Od(n))},mp=()=>async function(t){if(t.length===1&&t[0]===27){Ue&&clearTimeout(Ue),Ue=setTimeout(()=>{Od({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Ue=void 0},25);return}Ue&&(clearTimeout(Ue),Ue=void 0)};function Bd(){kr&&process.stdin.removeListener("keypress",kr),Dr&&process.stdin.removeListener("data",Dr),kr=up(),Dr=mp(),cp.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Dr),process.stdin.on("keypress",kr)}Ia();gp(`${Fr.bold("Epiq CLI")}
55
+ ${c}
56
+ `,xs.writeFileSync(t,n,"utf8"),ee.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var vp=async e=>{let t=await B({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},z=(e,t)=>a(`[${e}] ${t}`),md=async()=>{$("");let e=tn(),t=await ht(process.cwd());if(d(t))return z(1,t.message);let n=t.value,o=await io(n);if(d(o))return z(2,o.message);if(o.value)return z(2,`Cannot initialize Epiq while a git operation is in progress: ${o.value}`);let r=await vp(n);if(d(r))return z(2.5,r.message);if(r.value)return z(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Cr(n))return z(4,"Epiq project already initialized");let s=St();if(!s.isSetupDone||!s.userName)return z(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let i=_(),c=i.userName,u=i.userId;if(!u||!c)return z(5,"Missing Epiq user id");let m=e.stateBranch,p=await co({repoRoot:n,branch:m});if(d(p))return z(6,p.message);if(p.value)return z(6,`State branch already exists: ${m}`);let v=await kr({repoRoot:n,stateBranchName:m});if(d(v))return z(6,v.message);let C=mo();if(d(C))return z(7,C.message);let E=ud.join(uo(),e.projectId),S=await $t({repoRoot:n,stateBranchRoot:E,stateBranchName:m});if(d(S))return z(8,S.message);let R=ud.join(E,".epiq");fp.mkdirSync(R,{recursive:!0});let D=oa({userId:u,userName:c});if(d(D))return z(9,D.message);for(let Ir of D.value){let js=So({event:Ir,rootDir:E});if(d(js))return z(9,js.message)}let P=await po({stateBranchRoot:E,eventFileName:Vt({userId:u,userName:c})});if(d(P))return z(10,P.message);let V=await on({cwd:E,message:"[epiq:init]"});if(d(V))return z(10,V.message);let O=await ld(n);if(d(O))return z(11,O.message);let k=zs({repoRoot:n,fileContents:e});if(d(k))return z(12,k.message);let Ee=await te.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(Ee))return z(13,Ee.message);let ft=await te.commit({cwd:n,message:"[epiq:init-project]"});if(d(ft))return z(13,ft.message);let vt="Project initialized!",yt=await B({cwd:n,args:["push","-u","origin","HEAD"]});d(yt)&&(vt+=` Warn: [init:14] ${yt.message}`);let le=await Rn({repoRoot:n,stateBranchRoot:E});d(le)&&(vt+=` Warn: [init:15] ${le.message}`);let en=Ht(D.value).filter(d);if(en.length>0)return z(16,en.map(Ir=>Ir.message).join(`
57
+ `));let Ot=ze();if(d(Ot))return z(16,Ot.message);let{rootNodeId:zc,nodes:qc}=Ot.value,_s=qc[zc];return _s?(T.navigate({contextNode:_s,selectedIndex:0}),N({hasProjectDefinition:!0,mode:f.DEFAULT}),l(vt,null)):z(16,"Unable to resolve initialized root node")};import{ulid as xp}from"ulid";import{ulid as yp}from"ulid";var pd=null,Pt=()=>structuredClone(pd),jn=e=>{pd=e},gd=()=>{let{contextNode:e,selectedIndex:t}=g(),o=j(e.id)[t];return o?l("Resolved selected child",o):a("Target node not found")},hs=({id:e,parentId:t,position:n={at:"end"}})=>{let o=j(t).filter(r=>r.id!==e);return Eo(o,n)},fd=({id:e,parentId:t,position:n={at:"end"}})=>{let o=X();if(d(o))return a("Unable to resolve user ID");let r=hs({parentId:t,id:e,position:n});return d(r)?r:l("Created pending move state",{id:yp(),...o.value,action:"move.node",payload:{id:e,parent:t,rank:r.value.rank}})},vd=e=>{jn(e);let t=Pn(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function Is(e){let t=gd();if(d(t))return t;let{contextNode:n,nodes:o}=g();if(!n.parentNodeId)return a("Missing parent node id");let r=o[n.parentNodeId];if(!r)return a("Missing parent node");let s=j(r.id),i=s.findIndex(({id:m})=>m===n.id);if(i<0)return a("Current node not found among siblings");let c=s[i+e];if(!c)return a("Missing sibling node");let u=fd({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:vd(u.value)}function bs(e){let t=gd();if(d(t))return t;let{contextNode:n,selectedIndex:o}=g(),s=j(n.id)[o+e];if(!s)return a("Missing sibling node");let i=fd({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(i)?i:vd(i.value)}var yd=()=>{let e=Pt();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,o=g().nodes[n];if(!o)return a("Move parent not found");let r=j(n).findIndex(s=>s.id===t);return r===-1?a("Moved node not found among rendered children"):(T.navigate({contextNode:o,selectedIndex:r}),l("Synchronized navigation to moved node",null))},qo=(e,t="Moved preview")=>{if(d(e))return e;let n=yd();return d(n)?n:(N({mode:f.MOVE}),l(t,null))},xd=async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=q().commandMeta,{contextNode:n,selectedIndex:o}=g(),r=j(n.id)[o];if(!r)return N({mode:f.DEFAULT}),a("No move target");if(t==="start"){if(r.readonly)return a("Target node is read-only");if(o===-1)return a("No item selected");if(!r.parentNodeId)return a("Target has no parent");let s=j(r.parentNodeId),i=s.findIndex(({id:v})=>v===r.id);if(i===-1)return a("Target not found among siblings");let c=s[i-1],u=s[i+1],m=u!=null?{at:"before",sibling:u.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=hs({parentId:r.parentNodeId,id:r.id,position:m});return d(p)?p:(jn({id:xp(),action:"move.node",payload:{id:r.id,parent:r.parentNodeId,rank:p.value.rank},...e.value}),N({mode:f.MOVE}),l("Move initialized",null))}if(t==="next")return qo(bs(1));if(t==="previous")return qo(bs(-1));if(t==="to-next")return qo(Is(1));if(t==="to-previous")return qo(Is(-1));if(t==="confirm"){let s=Pt();if(!s)return a("No pending move to confirm");let i=await je();if(d(i))return i;let c=F([s],i.value);if(d(c))return c;let u=yd();return d(u)?u:(jn(null),N({mode:f.DEFAULT}),l("Moved item",null))}return t==="cancel"?(jn(null),N({mode:f.DEFAULT}),l("Cancelling move",null)):a("Invalid move modifier")};import{ulid as Xo}from"ulid";import{monotonicFactory as hp,ulid as Ip}from"ulid";var bp=hp(),Yo=({name:e,parent:t,rank:n,user:{userId:o,userName:r}})=>{let s=bp();return l("Created issue events",[{id:Ip(),userId:o,userName:r,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var hd=async(e,t)=>{let n=X();if(d(n))return a("Unable to resolve user ID");let o=await je();if(d(o))return o;let r=o.value;if(!t.inputString)return a(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:c}=g(),u=m=>{let p=F([m],r);if(d(p))return p;let v=I.getNode(p.value[0].result.id);if(!v)return a("Created node not found");if(!v.parentNodeId)return p;let C=I.getNode(v.parentNodeId);return C?(T.navigate({contextNode:C,selectedIndex:I.getSiblings(v.parentNodeId).findIndex(({id:E})=>E===v.id)}),p):a("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=g(),p=I.getNode(m);if(!p)return a("Workspace not found");let v=cn(p.id,n.value,r);return d(v)?v:u({id:Xo(),action:"add.board",payload:{id:Xo(),name:t.inputString,parent:p.id,rank:v.value},...n.value})}if(t.modifier==="swimlane"){let m=Se(s,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=cn(m.value.id,n.value,r);return d(p)?p:u({id:Xo(),action:"add.swimlane",payload:{id:Xo(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=W(i.id)[c],p=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let V=Se(s,"SWIMLANE");return d(V)?null:V.value})();if(!p)return a("Unable to add issue in this context");let v=cn(p.id,n.value,r);if(d(v))return v;let C=Yo({name:t.inputString,parent:p.id,rank:v.value,user:n.value});if(d(C))return C;let E=C.value,S=F([...E],r);if(d(S))return S;if(!S.value[0])return a("Issue creation failed");let P=E.find(V=>V.action==="add.issue")?.payload.id;return P?(T.navigate({contextNode:p,selectedIndex:I.getSiblings(p.id).findIndex(({id:V})=>V===P)}),l("Issue created",null)):a("Unable to determine ticket id")}return l("Success",null)};var Id=async()=>{let e=Se(g().breadCrumb,"BOARD");if(d(e))return e;let t=await ht(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Oe({repoRoot:t.value});if(d(n))throw new Error(n.message);let{modifier:o}=q().commandMeta;if(o==="now"){let S=at(n.value);if(d(S))return a(S.message);let R=Hn();if(d(R))return R;let P=Ht(S.value).filter(d);return P.length>0?a(P.map(V=>V.message).join(", ")):(N({mode:f.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),l("Peeking now",!0))}let r;if(o==="prev"){let S=g().eventLog.at(-1),R=_r(S);if(R===null)return a("No previous event to peek");r=R}else if(o==="next"){let S=g().unappliedEvents.at(0),R=_r(S);if(R===null)return a("No next event to peek");r=R+1}else{let S=ko(o);if(!S)return a("Invalid peek date");r=S.getTime()}let s=g(),i=e.value.id,c=Wi(n.value,r);if(d(c))return a(c.message);let{appliedEvents:u,unappliedEvents:m}=c.value,p=Hn();if(d(p))return p;let C=Ht(u).filter(d);if(C.length>0)return Hn(),N(s),a(C.map(S=>S.message).join(", "));let E=g().nodes[i];return E?(T.navigate({contextNode:E,selectedIndex:0}),N({mode:f.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),l("Peeking",!0)):(Hn(),N(s),a("Board did not exist at peek date"))};import Cp from"zod";var bd=()=>{let e=q().commandMeta.inputString,t=Cp.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return a("Auto sync duration must be a number of at least 3000 ms");let n=mt({autoSyncDebounceMs:t.data});return d(n)?n:(Fe({autoSyncIntervalMs:t.data}),N({mode:f.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var Cd=()=>{let e=q().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=la(e),n=mt({autoSync:t});return d(n)?n:(Fe({autoSync:t}),N({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Nd=()=>{let e=q().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=mt({logLevel:e});return d(n)?n:(Fe({logLevel:e}),N({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var Sd=async()=>{$(""),N({mode:f.DEFAULT});let e=ze();if(d(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");N({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Ao();return d(t)?(N({syncStatus:{msg:t.message,status:"failed"}}),t):(N({mode:f.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var Np=e=>e.action==="add.issue.comment",Ed=e=>Object.values(g().tags).find(t=>t.name===e),Rd=e=>Object.values(g().contributors).find(t=>t.name===e),pt=async()=>{let e=await je();return d(e)?e:l("Resolved persist root",e.value)},Jo=[{systemOnly:!0,intent:M.Move,description:"Internal move-state command",mode:f.COMMAND_LINE,action:xd},{intent:M.Delete,description:"Delete the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(!o)return a("Unable to resolve child to delete");let r=await pt();if(d(r))return r;if(o.context==="COMMENT"){let s=o.id,i=A(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let c=g().nodes[i];if(!c||!A(c))return a("Unable to resolve comment issue");let u=c.log?.filter(Np).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?a("You can only delete your own comments"):F([{id:fe(),action:"delete.issue.comment",payload:{id:s,issue:i},...e.value}],r.value):a("Unable to resolve comment")}return F([{id:fe(),action:"delete.node",payload:{id:o.id},...e.value}],r.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:f.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=q().commandMeta,n=/(!=|=)/,[o]=e.split(n);if(!o||!(i=>ie(h.FILTER).map(c=>c.split(n)[0]).includes(i))(o))return a("Invalid filter modifier");let s={target:o,operator:"=",value:t.trim()};return ue(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:f.DEFAULT})),l("Filter updated",null)}},{intent:M.ViewHelp,description:"Open the help screen",mode:f.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return Mt({pendingNavTarget:{contextNode:e,breadCrumb:o,selectedIndex:t,selectedNode:n}}),N({mode:f.HELP}),l("Viewing help",null)}},{intent:M.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(!o)return a("Unable to close issue, no target found");if(!A(o))return a("Cannot close in this context");let r=g().nodes[de];if(!r)return a("Unable to locate closed swimlane");if(o.parentNodeId===r.id)return a("Issue is already closed");let s=await pt();if(d(s))return s;let i=s.value,c=Gt(r.id,o.id,{at:"end"},e.value,i);if(d(c))return c;let u=F([{id:fe(),action:"close.issue",payload:{id:o.id,parent:r.id,rank:c.value},...e.value}],i);return d(u)?u:l("Issue closed",null)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(!o)return a("Unable to reopen issue, no target found");let r=o.context==="TICKET"?l("Resolved ticket",o):it(o.id,"TICKET");if(d(r))return a("Cannot reopen in this context");let s=r.value,i=g().nodes[de];if(!i)return a("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return a("Issue is not closed");if(!A(s))return a("Target node is not issue");let c=Ko(s);if(!c)return a("Unable to resolve previous parent from issue history");if(c===i.id)return a("Previous parent resolves to closed swimlane");let u=g().nodes[c];if(!u)return a("Previous parent no longer exists");let m=await pt();if(d(m))return m;let p=m.value,v=Gt(u.id,s.id,{at:"end"},e.value,p);if(d(v))return v;let C=F([{id:fe(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:v.value},...e.value}],p);return d(C)?C:l("Issue reopened",null)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Init,description:"Initialize Epiq in the current git repository",mode:f.COMMAND_LINE,action:md},{intent:M.NewItem,description:"Create a new board, swimlane, or issue",mode:f.COMMAND_LINE,action:hd,onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Rename,description:"itle] Rename the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=W(t.id)[n];if(!o)return a("Missing node");if(o.readonly)return a("Cannot rename readonly node");let r=Pa();if(!r)return a("Provide a title");let s=await pt();return d(s)?s:F([{id:fe(),action:"edit.title",payload:{id:o.id,name:r},...e.value}],s.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.UntagTicket,description:"Remove a tag from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide a tag");let r=Ed(o);if(!r)return a(`Tag "${o}" does not exist`);let{selectedNode:s}=g();if(!s)return a("Invalid untag target");let i=it(s.id,"TICKET");if(d(i))return a("Unable to untag issue in this context");let c=i.value;if(!A(c))return a("Target node is not issue");if(!(c.props.tags??[]).includes(r.id))return a("Issue is not tagged with that tag");let m=await pt();return d(m)?m:F([{id:fe(),action:"remove.issue.tag",payload:{id:c.id,tag:r.id},...e.value}],m.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.TagTicket,description:"Add or create a tag on the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide a tag");let{selectedNode:r}=g();if(!r)return a("Invalid tag target");let s=it(r.id,"TICKET");if(d(s))return a("Unable to tag issue in this context");let i=s.value;if(!A(i))return a("Target node is not issue");let c=await pt();if(d(c))return c;let u=Ed(o),m=u?.id??fe();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):F([...u?[]:[{id:fe(),action:"create.tag",payload:{id:m,name:o},...e.value}],{id:fe(),action:"add.issue.tag",payload:{id:i.id,tag:m},...e.value}],c.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.AssignUserToTicket,description:"Assign a user to the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide an assignee");let{selectedIndex:r,contextNode:s}=g(),i=W(s.id)[r];if(!i)return a("Invalid assign target");let c=it(i.id,"TICKET");if(d(c))return a("Unable to assign issue in this context");let u=c.value;if(!A(u))return a("Target node is not issue");let m=await pt();if(d(m))return m;let p=Rd(o),v=p?.id??fe();return(u.props.assignees??[]).includes(v)?a("Assignee already assigned"):F([...p?[]:[{id:fe(),action:"create.contributor",payload:{id:v,name:o},...e.value}],{id:fe(),action:"add.issue.assignee",payload:{id:u.id,assignee:v},...e.value}],m.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=X();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,o=(t||n).trim();if(!o)return a("Provide an assignee to remove");let r=Rd(o);if(!r)return a(`Assignee "${o}" does not exist`);let{selectedNode:s}=g();if(!s)return a("Invalid unassign target");let i=it(s.id,"TICKET");if(d(i))return a("Unable to unassign in this context");let c=i.value;if(!A(c))return a("Target node is not issue");if(!(c.props.assignees??[]).includes(r.id))return a(`Issue is not assigned to "${o}"`);let m=await pt();return d(m)?m:F([{id:fe(),action:"remove.issue.assignee",payload:{id:c.id,assignee:r.id},...e.value}],m.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Comment,description:"Add a comment to the selected issue",mode:f.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return a("Provide a comment");if(n.length>mn)return a(`Cannot exceed ${mn} characters`);let o=X();if(d(o))return a("Unable to resolve user ID");let{breadCrumb:r,selectedNode:s}=g(),i=Se([...r,s],"TICKET");if(d(i))return a("Edit target must be an issue");let c=i.value;if(!c)return a("Invalid comment target");let u=c.context==="TICKET"?l("Resolved ticket",c):it(c.id,"TICKET");if(d(u))return a("Unable to comment on issue in this context");let m=u.value;if(!A(m))return a("Target node is not issue");let p=await pt();return d(p)?p:F([{id:fe(),action:"add.issue.comment",payload:{id:fe(),issue:m.id,author:o.value.userId,md:n},...o.value}],p.value)},onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Sync,description:"Pull, commit, and push Epiq state",mode:f.COMMAND_LINE,action:Sd},{intent:M.Peek,description:"View board state at another point in time",mode:f.COMMAND_LINE,action:Id},{intent:M.Export,description:"Export the current board layout to markdown",mode:f.COMMAND_LINE,action:async()=>{let e=await Ja();return d(e)?e:(N({mode:f.DEFAULT}),l("Export successful",!0))}},{intent:M.Exit,description:"Exit the application",mode:f.COMMAND_LINE,action:async()=>(T.exit(),l("Exit successful",!0))},{intent:M.Edit,description:"Edit title or description",mode:f.COMMAND_LINE,action:async(e,t)=>cd(t),onSuccess:()=>N({mode:f.DEFAULT})},{intent:M.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:f.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case re.USERNAME:{let{userId:o,preferredEditor:r,userName:s}=_(),i=n||s,c=o??fe();if(!i||!c)return a("Unable to resolve user name or id");let u=mt({userName:i,userId:c,preferredEditor:r??""});return d(u)?u:(Fe({userName:i,userId:c}),N({mode:f.DEFAULT}),l(`Username set to "${i}"`,null))}case re.EDITOR:{if(!n)return a("No editor provided");let o=mt({preferredEditor:n});return d(o)?o:(Fe({preferredEditor:n}),N({mode:f.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case re.VIEW:return n!=="wide"&&n!=="dense"?a("Invalid view mode"):(Fe({viewMode:n}),l(`View set to "${n}"`,null));case re.AUTOSYNC:return Cd();case re.LOG_LEVEL:return Nd();case re.SYNC_DEBOUNCE_MS:return bd();default:return a("Unknown config command")}}},{intent:M.Coffee,description:"Sponsor the development of Epiq!",mode:f.COMMAND_LINE,action:()=>{let e=q().commandMeta.modifier;return e==="custom"?vs("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):vs(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),$(""),l("Thanks you!",null)}}];var Sp=new Set(["peek","filter","view-help"]),Ze=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:o,inputString:r}}=q();if(!t)return a("No command to confirm");if(!e&&n===Et.Invalid)return a("Invalid command");let s=Uo(t);Ra();let{readOnly:i}=g();if(i&&!Sp.has(s))return Bn({status:xt.Fail,message:"Command not available in readonly state",value:null});let c=Jo.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return Bn({status:xt.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:r,modifier:o})}catch(m){return Bn({status:xt.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?Bn(u):(Ta({addToHistory:!e}),c.onSuccess?.(),_().autoSync&&Mo(),u)};var Qo=[{intent:x.Exit,mode:f.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(N({mode:f.COMMAND_LINE}),$("move cancel"),Ze({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:f.DEFAULT,description:"[m] move (init/confirm)",action:()=>(N({mode:f.COMMAND_LINE}),$("move start"),Ze({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:f.MOVE,action:()=>(N({mode:f.COMMAND_LINE}),$("move confirm"),Ze({isForceExecutedBySystem:!0}))}],Zo=[{intent:x.MovePreviousItem,mode:f.MOVE,action:()=>Pt()?(N({mode:f.COMMAND_LINE}),$("move previous"),Ze({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveNextItem,mode:f.MOVE,action:()=>Pt()?(N({mode:f.COMMAND_LINE}),$("move next"),Ze({isForceExecutedBySystem:!0})):a("No pending move")}],Td=[{intent:x.MoveToNextContainer,mode:f.MOVE,action:()=>Pt()?(N({mode:f.COMMAND_LINE}),$("move to-next"),Ze({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveToPreviousContainer,mode:f.MOVE,action:()=>Pt()?(N({mode:f.COMMAND_LINE}),$("move to-previous"),Ze({isForceExecutedBySystem:!0})):a("No pending move")}];var Ad={[w.WORKSPACE]:[...Qo,...Zo],[w.BOARD]:[...Qo,...Zo],[w.SWIMLANE]:[...Qo,...Zo,...Td],[w.TICKET]:[],[w.FIELD]:[],[w.FIELD_LIST]:[],[w.TEXT]:[],[w.COMMENT]:[]};var wd=()=>{$("");let{pendingNavTarget:e}=wt();N({mode:f.DEFAULT}),e&&T.navigate(e),Mt({pendingNavTarget:void 0})},Md=[{intent:x.ExitCommandLine,mode:f.HELP,action:()=>(wd(),l("Exiting help",null))},{intent:x.Exit,mode:f.HELP,action:()=>(wd(),l("Closed help",null))},{intent:x.NavPreviousItem,mode:f.HELP,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:x.NavNextItem,mode:f.HELP,action:()=>(T.navigateToNextItem(),l("Navigating to next help item",null))},{intent:x.NavToPreviousContainer,mode:f.HELP,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:x.NavToNextContainer,mode:f.HELP,action:()=>(T.navigateToNextContainer(),l("Navigating to next help container",null))}];var Ep=e=>{N({mode:f.COMMAND_LINE});let{pendingNavTarget:t}=wt();t&&T.navigate(t),Mt({pendingNavTarget:void 0}),$(`${e} `)},Pd=()=>{$("");let{pendingNavTarget:e}=wt();e&&T.navigate(e),Mt({pendingNavTarget:void 0}),N({mode:f.DEFAULT})},Ld=[{intent:x.InitCommandPalette,mode:f.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{$("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return Mt({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}}),N({mode:f.PALETTE}),l("Opening command palette",null)}},{intent:x.Confirm,mode:f.PALETTE,action:()=>{let{selectedNode:e}=g();if(!e||!bt(e))return a("Command only applicable on text nodes");if(e.props.disabled)return a("Command is not available in this context");let t=e.title;return t?(Ep(t),l("Selected command",t)):l("No command selected",null)}},{intent:x.ExitCommandLine,mode:f.PALETTE,action:()=>(Pd(),l("Exiting palette",null))},{intent:x.Exit,mode:f.PALETTE,action:()=>(Pd(),l("Closed command palette",null))},{intent:x.NavPreviousItem,mode:f.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:x.NavNextItem,mode:f.PALETTE,action:()=>(T.navigateToNextItem(),l("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:f.PALETTE,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:f.PALETTE,action:()=>(T.navigateToNextContainer(),l("Navigating to next container",null))}];var kd=[...Md,...Ld,{intent:x.AddItem,mode:f.DEFAULT,description:"[n] new...",action:()=>(N({mode:f.COMMAND_LINE}),$(`${h.NEW} `),l("Adding new item",null))},{intent:x.Delete,mode:f.DEFAULT,description:"[d] delete",action:()=>(N({mode:f.COMMAND_LINE}),$(`${h.DELETE} `),l("Deleting item",null))},{intent:x.InitCommandLine,mode:f.DEFAULT,description:"[:] focus command line",action:()=>(N({mode:f.COMMAND_LINE}),$(""),l("Entering command line mode",null))},{intent:x.Confirm,mode:f.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=g();if(!j(e?.id??"")?.length){if(e?.title===ne.DESCRIPTION)return N({mode:f.COMMAND_LINE}),$(`${h.EDIT} description `),l("Propose command",!0);if(e?.title===ne.ASSIGNEES)return N({mode:f.COMMAND_LINE}),$(`${h.ASSIGN} `),l("Propose command",!0);if(e?.title===ne.TAGS)return N({mode:f.COMMAND_LINE}),$(`${h.TAG} `),l("Propose command",!0);if(t.title===ne.DESCRIPTION&&e?.context==="TEXT")return N({mode:f.COMMAND_LINE}),$(`${h.EDIT} description `),l("Propose command",!0)}return T.enterChildNode(),l("Entering context",null)}},{intent:x.EditTitle,mode:f.DEFAULT,description:"[r] rename title",action:()=>(N({mode:f.COMMAND_LINE}),$(`${h.EDIT} title ${g().selectedNode?.title}`),l("Exiting context",null))},{intent:x.EditDescription,mode:f.DEFAULT,description:"[e] edit description",action:()=>(N({mode:f.COMMAND_LINE}),$(`${h.EDIT} description `),l("Exiting context",null))},{intent:x.Exit,mode:f.DEFAULT,description:"[q] exit context",action:()=>(T.enterParentNode(),l("Exiting context",null))},{intent:x.NavPreviousItem,mode:f.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(T.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:x.NavNextItem,mode:f.DEFAULT,action:()=>(T.navigateToNextItem(),l("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:f.DEFAULT,action:()=>(T.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:f.DEFAULT,action:()=>(T.navigateToNextContainer(),l("Navigating to next container",null))}];var Rp=500,Tp=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Dd=e=>{let t=Tp(e);t&&pn(n=>(n+t).slice(0,Rp))};var Ap=[f.COMMAND_LINE,f.PALETTE],wp=e=>[{intent:x.MoveCursorLeft,mode:e,action:()=>(ss(-1),l("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:e,action:()=>(ss(1),l("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:e,action:()=>(is("left"),l("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:e,action:()=>(is("right"),l("Moving cursor right of word",null))},{intent:x.AutoCompleteCommand,mode:e,action:()=>(pn((t,{remainder:n})=>{let o=n?t+n:t,r="";return o==="edit title "&&(r=g().selectedNode?.title??""),o+r}),l("Auto-completing command",null))},{intent:x.CaptureInput,mode:e,action:(t,{sequence:n})=>(Dd(n??""),l("Capturing input",null))},{intent:x.EraseInput,mode:e,action:()=>(Sa(),l("Erasing input",null))},{intent:x.EraseInputWord,mode:e,action:()=>(Ea(),l("Erasing input word",null))}],Fd=[{intent:x.Confirm,mode:f.COMMAND_LINE,action:()=>(Ze(),l("Executing command",null))},{intent:x.ViewHelp,mode:f.DEFAULT,action:()=>(N({mode:f.HELP}),l("Viewing help",null))},...Ap.flatMap(wp),{intent:x.ExitCommandLine,mode:f.COMMAND_LINE,action:()=>(N({mode:f.DEFAULT}),l("Exiting command line",null))},{intent:x.GetLastCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(Aa(),l("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(wa(),l("Getting next command from history",null))}];import Od from"chalk";var er=Od.dim.hex(y.secondary2)(": for command line"),Bd="q to exit",Ud=`${Od.hex(y.accent)("m")} to confirm`,Cs={[w.WORKSPACE]:[er],[w.BOARD]:[er],[w.BOARD+f.COMMAND_LINE]:[er],[w.SWIMLANE]:[er],[w.TICKET+f.HELP]:[Bd],[w.SWIMLANE+f.HELP]:[Bd],[w.TICKET]:[],[w.FIELD]:[],[w.SWIMLANE+f.MOVE]:[Ud],[w.TICKET+f.MOVE]:[Ud]};var Vn=e=>e.trim().toLocaleLowerCase(),Mp=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},Pp=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},$d=(e,t)=>{let n=Vn(t.value);if(!n)return!0;switch(t.target){case"title":return Vn(e.title??"").includes(n);case"description":return Vn(e.props.description??"").includes(n);case"tag":return Mp(e).map(Vn).some(r=>r.includes(n));case"assignee":return Pp(e).map(Vn).some(r=>r.includes(n));default:return!0}};function Wd(e,t,n){let o=t[e];if(!o)return a("buildBreadCrumb(): current node not found");let r=[],s=o;for(;s&&(r.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let i=r[r.length-1];return!i||i.id!==n?a("buildBreadCrumb(): node is not connected to root"):(r.reverse(),l("Breadcrumb built",r))}var _d=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t};var Qt,Ns,Ss=new Set,jd=()=>{for(let e of Ss)e()},kp=e=>(Ss.add(e),()=>Ss.delete(e));function Hd(e){let{contextNodeId:t,mode:n,rootNodeId:o,nodes:r,filters:s}=e;if(!t)return a("derive(): contextNodeId is missing");if(!o)return a("derive(): rootNode is missing");if(!r[o])return a("derive(): unable to find root node");let c=r[t];if(!c)return a("Unable to derive state, contextNode not found");let u=Wd(t,r,o);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,v=Cs[p+n]??Cs[p]??[],C=[...kd,...Ad[p]??[],...Fd],E=_d(C),S=Dp(r,s),R=S[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:v,availableActions:C,actionIndex:E,selectedNode:R,renderedChildrenIndex:S})}var g=()=>{if(!Qt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Qt},ze=()=>Qt?l("Retrieved state",Qt):a("State not initialized. Call initWorkspaceState() first.");function Ln(e){Ns=e;let t=_e(process.cwd()),n=!1;if(!d(t)){let s=It(t.value);if(d(s))return a(s.message);n=!0}let o={readOnly:!1,filters:[],tags:{},contributors:{},mode:f.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{}},r=Hd(o);return d(r)?r:(Qt=r.value,jd(),l("State initialized",null))}function ue(e){let t=g(),n=e(t),o=Hd(n);return d(o)?a(o.message??"Unable to update state"):(Qt=o.value,jd(),l("State updated",null))}var N=e=>ue(t=>({...t,...e}));var K=()=>Lp(kp,g,g),Dp=(e,t)=>{let n={};for(let o of Object.values(e))A(o)&&t.length>0&&!t.every(r=>$d(o,r))||!o.parentNodeId||o.isDeleted||((!o.parentNodeId||!n[o.parentNodeId])&&(n[o.parentNodeId]=[]),n[o.parentNodeId].push(o));for(let o of Object.keys(n))n[o].sort((r,s)=>{let i=e[r.id],c=e[s.id];return!i||!c?0:i.rank.localeCompare(c.rank)});return n},W=e=>g()?.renderedChildrenIndex[e]??[],Hn=()=>Ns?Ln(Ns):a("Cannot reset state: no initial workspace found"),un=()=>Qt!==void 0;var Es=e=>{un()&&(N({syncStatus:e}),Wt({type:"sync-status",payload:e}))},tr=(e="Syncing...")=>{Es({status:"syncing",msg:e})},nr=(e="Synced")=>{Es({status:"synced",msg:e})},Rs=e=>{Es({status:"failed",msg:e})},Ue=e=>(Rs(e),a(e));import{decodeTime as FA}from"ulid";var Fp=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=G("getRepoRootDir",await ht(e));if(d(n))return a(n.message);let o=n.value;logger.debug("[sync] repo root",o);let r=G("getStateBranchRoot",Oe({repoRoot:o}));if(d(r))return a(r.message);let s=r.value;logger.debug("[sync] state branch root",s);let i=G("ensureInitialCommit",await mi(o));if(d(i))return a(i.message);logger.debug("[sync] initial commit result",{created:i.value}),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:o,stateBranchRoot:s,ensureUpstream:t});let c=G("bootstrapStateBranchStorage",await gi({repoRoot:o,stateBranchRoot:s,ensureUpstream:t}));if(d(c))return a(c.message);logger.debug("[sync] bootstrap result",{bootstrapped:c.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let u=G("hasInProgressGitOperation(stateBranchRoot)",await io(s));if(d(u))return a(u.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:u.value}),u.value)return logger.info("[sync] state branch git operation in progress"),a("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:o,stateBranchRoot:s});let m=G("ensureStateBranchLayout",ci(o,s));return d(m)?a(m.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:o,stateBranchRoot:s,bootstrapped:c.value}),l("Sync preconditions satisfied",{repoRoot:o,stateBranchRoot:s,bootstrapped:c.value}))},Bp=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.debug("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.debug("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let o=G("stageStateBranchOwnEventFile",await po({stateBranchRoot:t,eventFileName:n}));if(d(o))return a(o.message);let r=G("hasStagedChanges(after stage)",await oi(t));if(d(r))return a(r.message);if(logger.debug("[sync] state branch change check after stage result",{changed:r.value}),!r.value)return logger.info("[sync] no own event file changes to commit"),l("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let s=G("createStateBranchSyncCommit",await pi({repoRoot:e,stateBranchRoot:t}));return d(s)?a(s.message):(logger.debug("[sync] created sync commit",s.value),l("Committed own event file",{createdCommit:!0,commitSha:s.value}))},wo=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.debug("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.error("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),a("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),a("Own event file must end with .jsonl");tr();let n=G("ensureSyncReady",await Fp({cwd:e,ensureUpstream:!0}));if(d(n))return Ue(n.message);let{repoRoot:o,stateBranchRoot:r,bootstrapped:s}=n.value,i=G("isDetachedHead(stateBranchRoot)",await ri(r));if(d(i))return Ue(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return Ue("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,v=G("getStateBranch",nn(o));if(d(v))return Ue(v.message);let C=v.value;logger.debug("[sync] resolved state branch",{stateBranch:C,stateBranchRoot:r});let E=G("commitOwnEventFileToStateBranch",await Bp({repoRoot:o,stateBranchRoot:r,ownEventFileName:t}));if(d(E))return Ue(E.message);c=E.value.createdCommit,u=E.value.commitSha;let S=G("pullBranchRebaseIfPresent",await Mr({cwd:r,branch:C}));if(d(S))return Ue(S.message);if(m=S.value,c||s){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:r});let R=G("pushStateBranch",await Rn({stateBranchRoot:r,repoRoot:o}));if(d(R)&&ni(R.message)){let D=G("pullBranchRebaseIfPresent(retry)",await Mr({cwd:r,branch:C}));if(d(D))return Ue(D.message);m=m||D.value,R=G("pushStateBranch(retry)",await Rn({stateBranchRoot:r,repoRoot:o}))}if(d(R))return Ue(R.message);p=R.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:r});let R=G("git rev-parse HEAD",await B({args:["rev-parse","HEAD"],cwd:r}));if(d(R))return Ue(R.message);u=R.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return nr(p?"Synced and pushed":m||c?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),l("Synced event logs with state branch",{repoRoot:o,stateBranchRoot:r,createdCommit:c,commitSha:u,pulled:m,pushed:p,bootstrapped:s})};var Ts=e=>{let t=_e(e??process.cwd());return d(t)?a(t.message):l("Resolved Epiq repo root",t.value)},we=async e=>{let t=Ts(e);if(d(t))return t;let n=Oe({repoRoot:t.value});if(d(n))return a(n.message);let o=tn(),r=await $t({repoRoot:t.value,stateBranchRoot:n.value,stateBranchName:o.stateBranch});if(d(r))return a(r.message);let s=await B({cwd:n.value,args:["pull","--ff-only"]});d(s)&&ee.info(3,s.message);let i=at(n.value);if(d(i))return a(i.message);let c=Kt(i.value);return d(c)?a(c.message):l("Booted Epiq state",{repoRoot:t.value,stateBranchRoot:n.value})},Me=()=>{let e=_n();return d(e)?a(e.message):e.value.userId?e.value.userName?l("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):a("Unable to retrieve user name"):a("Unable to retrieve user id")},$e=()=>{let e=ze();return d(e)?a(e.message):e},Vd=e=>(e.props.tags??[]).map(t=>I.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:oe(t.name)})),Gd=e=>(e.props.assignees??[]).map(t=>I.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:oe(t.name)}));var Kd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=$e();if(d(n))return n;let o=Object.values(n.value.nodes).filter(A).filter(r=>e.includeClosed||r.parentNodeId!==de).map(r=>({id:r.id,title:Nt(r.title),description:r.props.description??"",parentNodeId:r.parentNodeId,isClosed:r.parentNodeId===de,readonly:!!r.readonly,tags:Vd(r),assignees:Gd(r)}));return l("Listed issues",o)},zd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=cn(e.parentId,n.value,t.value.stateBranchRoot);if(d(o))return o;let r=Yo({name:e.title,parent:e.parentId,user:n.value,rank:o.value});if(d(r))return r;let s=r.value,i=F([...s],t.value.stateBranchRoot);if(d(i))return a(i.message);let c=s.find(u=>u.action==="add.issue")?.payload.id;return c?l("Created issue",{id:c,title:e.title,parentId:e.parentId}):a("Unable to determine created issue id")},qd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=Gt(de,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(o))return o;let r={id:ve(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:de,rank:o.value}},s=F([r],t.value.stateBranchRoot);return d(s)?a(s.message):l("Closed issue",{id:e.issueId})},Yd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Target node is not issue");if(r.parentNodeId!==de)return a("Issue is not closed");let s=Ko(r);if(!s)return a("Unable to resolve previous parent from issue history");if(s===de)return a("Previous parent resolves to closed swimlane");let i=o.value.nodes[s];if(!i)return a("Previous parent no longer exists");let c=Gt(i.id,r.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let u={id:ve(),...n.value,action:"reopen.issue",payload:{id:r.id,parent:i.id,rank:c.value}},m=F([u],t.value.stateBranchRoot);return d(m)?a(m.message):l("Reopened issue",{id:r.id,parentId:i.id})},Xd=async e=>{let t=Ts(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=Oe({repoRoot:t.value});if(d(o))return o;let r=at(o.value);if(d(r))return r;let s=Kt(r.value);if(d(s))return s;let i=Gt(e.parentId,e.issueId,e.position??{at:"end"},n.value,o.value);if(d(i))return i;let c={id:ve(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:i.value}},u=F([c],o.value);return d(u)?a(u.message):l("Moved issue",{id:e.issueId,parentId:e.parentId})},or=async(e={})=>{tr();let t=Ts(e.repoRoot);if(d(t))return a("Sync failed");let n=Me();if(d(n))return n;let o=await wo({cwd:t.value,ownEventFileName:Vt(n.value)});return d(o)?(Rs(o.message),o):(nr(),l("Synced",o.value))};var Lt=async(e={})=>{let t=await we(e.repoRoot);if(d(t))return t;let n=$e();if(d(n))return n;let o=Object.values(n.value.nodes),r=o.filter(m=>fo(m)&&!m.isDeleted),s=new Map,i=new Map;for(let m of o)if(!m.isDeleted){if(Ct(m)&&m.parentNodeId){let p=s.get(m.parentNodeId)??[];p.push(m),s.set(m.parentNodeId,p)}if(A(m)&&m.parentNodeId){let p=i.get(m.parentNodeId)??[];p.push(m),i.set(m.parentNodeId,p)}}let c=_n();if(d(c))return c;let u={};for(let m of o.filter(A))m.isDeleted||(u[m.id]=I.getCommentsByIssue(m.id).map(p=>{let v=I.getContributor(p.authorId);return{id:p.id,issueId:p.issue,body:p.md,author:{id:p.authorId,name:v?.name??"Unknown",color:oe(v?.name??p.authorId)},createdAt:Up(p.id)}}));return l("Retrieved Epiq GUI state",{boards:r.sort((m,p)=>m.rank.localeCompare(p.rank)).map(m=>({id:m.id,title:m.title,swimlanes:(s.get(m.id)??[]).sort((p,v)=>p.rank.localeCompare(v.rank)).map(p=>({id:p.id,title:p.title,readonly:!!p.readonly,issues:(i.get(p.id)??[]).sort((v,C)=>v.rank.localeCompare(C.rank)).map(v=>({id:v.id,title:Nt(v.title),description:v.props.description??"",readonly:!!v.readonly,tags:Vd(v),assignees:Gd(v),parentNodeId:v.parentNodeId,isClosed:v.parentNodeId===de})),parentNodeId:p.parentNodeId}))})),tags:Object.values(n.value.tags).map(m=>({...m,color:oe(m.name)})),contributors:Object.values(n.value.contributors).map(m=>({...m,color:oe(m.name)})),user:{name:c.value.userName??"",id:c.value.userId??"",color:oe(c.value.userName??"")},commentsByIssueId:u})},Jd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Edit target must be an issue");if(r.readonly)return a("Cannot edit readonly issue");let s=r.props.description??"";if(s===e.description)return l("No changes made",{id:e.issueId,description:s});let i={id:ve(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},c=F([i],t.value.stateBranchRoot);return d(c)?a(c.message):l("Edited issue description",{id:e.issueId,description:e.description})},Qd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Edit target must be an issue");if(r.readonly)return a("Cannot edit readonly issue");let s=Nt(e.title);if(!s.trim())return a("Issue title cannot be empty");if(r.title===s)return l("No changes made",{id:e.issueId,title:s});let i={id:ve(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},c=F([i],t.value.stateBranchRoot);return d(c)?a(c.message):l("Edited issue title",{id:e.issueId,title:s})},Zd=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Tag target must be an issue");if(r.readonly)return a("Cannot tag readonly issue");let s=Nt(e.tagName).trim();if(!s)return a("Tag name cannot be empty");let i=Object.values(o.value.tags).find(p=>p.name===s),c=i?.id??ve(),u=[...i?[]:[{id:ve(),...n.value,action:"create.tag",payload:{id:c,name:s}}],{id:ve(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:c}}],m=F(u,t.value.stateBranchRoot);return d(m)?a(m.message):l("Added issue tag",{id:e.issueId,tag:{id:c,name:s}})},ec=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Untag target must be an issue");if(r.readonly)return a("Cannot untag readonly issue");if(!o.value.tags[e.tagId])return a("Tag not found");let s={id:ve(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},i=F([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue tag",{id:e.issueId,tagId:e.tagId})},tc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Assign target must be an issue");if(r.readonly)return a("Cannot assign readonly issue");let s=Nt(e.assigneeName).trim();if(!s)return a("Assignee name cannot be empty");let i=Object.values(o.value.contributors).find(p=>p.name===s),c=i?.id??ve(),u=[...i?[]:[{id:ve(),...n.value,action:"create.contributor",payload:{id:c,name:s}}],{id:ve(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:c}}],m=F(u,t.value.stateBranchRoot);return d(m)?a(m.message):l("Added issue assignee",{id:e.issueId,assignee:{id:c,name:s}})},nc=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Unassign target must be an issue");if(r.readonly)return a("Cannot unassign readonly issue");if(!o.value.contributors[e.assigneeId])return a("Assignee not found");let s={id:ve(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},i=F([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue assignee",{id:e.issueId,assigneeId:e.assigneeId})},rr=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.nodes[e.issueId];if(!r)return a("Issue not found");if(!A(r))return a("Comment target must be an issue");if(r.readonly)return a("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return a("Comment cannot be empty");let i=ve(),c={id:ve(),...n.value,action:"add.issue.comment",payload:{id:i,issue:e.issueId,md:s,author:n.value.userId}},u=F([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Added issue comment",{id:i,issueId:e.issueId,body:s})},sr=async e=>{let t=await we(e.repoRoot);if(d(t))return t;let n=Me();if(d(n))return n;let o=$e();if(d(o))return o;let r=o.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!r)return a("Unable to resolve comment");if(r.payload.author!==n.value.userId)return a("You can only delete your own comments");let s=o.value.nodes[r.payload.issue];if(!s)return a("Issue not found");if(!A(s))return a("Comment target must be an issue");if(s.readonly)return a("Cannot delete comment on readonly issue");if(o.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return l("Comment already deleted",{id:e.commentId,issueId:r.payload.issue});let c={id:ve(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:r.payload.issue}},u=F([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Deleted issue comment",{id:e.commentId,issueId:r.payload.issue})};var oc=e=>{let t,n,o=!1,r=!1,s=!1,i=()=>{let p=Wn();if(d(p))return ee.error(p.message);let{autoSync:v,userName:C,preferredEditor:E}=p.value;return!!(v&&C&&E)},c=async()=>{if(!o){if(r){s=!0;return}r=!0;try{await or({repoRoot:e.repoRoot}),Wt({type:"state",payload:await Lt({repoRoot:e.repoRoot})})}finally{r=!1,s&&(s=!1,c())}}},u=(p=750)=>{o||(n&&clearTimeout(n),n=setTimeout(()=>{c()},p))},m=()=>{if(o)return;let p=Wn();if(d(p))return ee.error(p.message);let{autoSyncDebounceMs:v}=p.value;i()&&(t=setTimeout(()=>{c(),m()},v??15e3))};return m(),{scheduleSync:u,dispose:()=>{o=!0,t&&clearTimeout(t),n&&clearTimeout(n)}}};import{WebSocketServer as Op}from"ws";var Pe=(e,t)=>{e.send(JSON.stringify(t))},Gn=async(e,t)=>Pe(e,{type:"state",payload:await Lt({repoRoot:t})}),et=async(e,t,n,o,r)=>{if(Pe(e,{type:o,payload:r}),d(r))return Pe(e,{type:"failed",payload:r.message});n(),Gn(e,t)},rc=(e,t,{onStateChanged:n})=>{new Op({server:e,path:"/ws"}).on("connection",r=>{fi(r),r.on("message",async s=>{try{let i=JSON.parse(s.toString()),{type:c}=i;if(c==="state:get")return Gn(r,t);if(c==="sync"){let u=await or({repoRoot:t});return Pe(r,{type:"sync:result",payload:u}),n(),Gn(r,t)}if(c==="issue:comment:add"){let u=await rr({repoRoot:t,...i.payload});return et(r,t,n,"issue:comment:add:result",u)}if(c==="issue:comment:delete"){let u=await sr({repoRoot:t,...i.payload});return Pe(r,{type:"issue:comment:delete:result",payload:u}),d(u)?Pe(r,{type:"failed",payload:u.message}):(n(),Gn(r,t))}if(c==="issue:edit:description"){let u=await Jd({repoRoot:t,...i.payload});return et(r,t,n,"issue:edit:description:result",u)}if(c==="issue:edit:title"){let u=await Qd({repoRoot:t,...i.payload});return et(r,t,n,"issue:edit:title:result",u)}if(c==="issue:tag:add"){let u=await Zd({repoRoot:t,...i.payload});return et(r,t,n,"issue:tag:add:result",u)}if(c==="issue:tag:remove"){let u=await ec({repoRoot:t,...i.payload});return et(r,t,n,"issue:tag:remove:result",u)}if(c==="issue:assignee:add"){let u=await tc({repoRoot:t,...i.payload});return et(r,t,n,"issue:assignee:add:result",u)}if(c==="issue:assignee:remove"){let u=await nc({repoRoot:t,...i.payload});return et(r,t,n,"issue:assignee:remove:result",u)}if(c==="issues:list")return Pe(r,{type:"issues",payload:await Kd({repoRoot:t})});if(c==="issues:create"){let u=await zd({...i.payload,repoRoot:t});return Pe(r,{type:"issues:create:result",payload:u}),d(u)?Wt({type:"failed",payload:u.message}):(Wt({type:"issue:created",payload:u.value}),n(),Gn(r,t))}if(c==="issues:move"){if(!i.payload.position)return Pe(r,{type:"error",message:"Missing move position"});let u=await Xd({...i.payload,repoRoot:t});return et(r,t,n,"issues:move:result",u)}if(c==="issue:close"){if(!i.payload.issueId)return Pe(r,{type:"error",message:"Missing issueId"});let u=await qd({repoRoot:t,issueId:i.payload.issueId});return et(r,t,n,"issue:close:result",u)}if(c==="issue:reopen"){if(!i.payload.issueId)return Pe(r,{type:"error",message:"Missing issueId"});let u=await Yd({repoRoot:t,issueId:i.payload.issueId});return et(r,t,n,"issue:reopen:result",u)}return Pe(r,{type:"error",message:"Unknown message type"})}catch(i){return Pe(r,{type:"error",message:i instanceof Error?i.message:String(i)})}})})};var jp=Zt.dirname(_p(import.meta.url)),Hp=process.env.IS_LOCAL==="true"?Zt.resolve(process.cwd(),"dist/gui"):Zt.join(jp,"gui"),tt=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},Vp=async e=>new Promise((t,n)=>{let o="";e.on("data",r=>{o+=r}),e.on("end",()=>{try{t(o?JSON.parse(o):{})}catch{n(new Error("Invalid JSON body"))}}),e.on("error",n)}),Gp=e=>e.endsWith(".html")?"text/html; charset=utf-8":e.endsWith(".js")?"text/javascript; charset=utf-8":e.endsWith(".css")?"text/css; charset=utf-8":e.endsWith(".json")?"application/json; charset=utf-8":e.endsWith(".ico")?"image/x-icon":"application/octet-stream",sc=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),o=Zt.resolve(Hp),r=Zt.resolve(o,n),s=Zt.relative(o,r);if(s.startsWith("..")||Zt.isAbsolute(s))return tt(t,403,{isError:!0,message:"Forbidden"});try{let i=await $p(r);return t.writeHead(200,{"content-type":Gp(r)}),t.end(i)}catch{return tt(t,404,{isError:!0,message:`Not found: ${n}`})}},Kp=async(e,t=3710)=>new Promise((n,o)=>{let r=s=>{let i=u=>{if(e.off("listening",c),u.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),r(0);return}o(u)},c=()=>{e.off("error",i);let u=e.address();if(!u||typeof u=="string"){o(new Error("Unable to resolve address"));return}n(u.port)};e.once("error",i),e.once("listening",c),e.listen(s,"127.0.0.1")};r(t)}),ic=async e=>{let t=Wp.createServer(async(r,s)=>{let i=new URL(r.url??"/","http://127.0.0.1");if(i.pathname==="/api/state")return tt(s,200,await Lt({repoRoot:e.repoRoot}));if(r.method==="POST"&&i.pathname==="/api/comments")try{let c=await Vp(r);if(!c.issueId||!c.body?.trim())return tt(s,400,{isError:!0,message:"Missing issueId or body"});let u=await rr({repoRoot:e.repoRoot,issueId:c.issueId,body:c.body});return"isError"in u&&u.isError?tt(s,400,u):tt(s,200,await Lt({repoRoot:e.repoRoot}))}catch(c){return tt(s,400,{isError:!0,message:c instanceof Error?c.message:"Unable to add comment"})}if(r.method==="DELETE"&&i.pathname.startsWith("/api/comments/")){let c=decodeURIComponent(i.pathname.replace("/api/comments/",""));if(!c)return tt(s,400,{isError:!0,message:"Missing comment id"});let u=await sr({repoRoot:e.repoRoot,commentId:c});return"isError"in u&&u.isError?tt(s,400,u):tt(s,200,await Lt({repoRoot:e.repoRoot}))}return i.pathname.startsWith("/board/")?sc("/",s):sc(i.pathname,s)});try{await Kp(t)}catch(r){return a(r instanceof Error?`Unable to start GUI server: ${r.message}`:`Unable to start GUI server: ${String(r)}`)}let n=oc({repoRoot:e.repoRoot});rc(t,e.repoRoot,{onStateChanged:()=>n.scheduleSync()}),t.on("close",n.dispose);let o=t.address();return!o||typeof o=="string"?(t.close(),a("Unable to resolve GUI server address")):l("Started GUI server",{url:`http://epiq.localhost:${o.port}${e.boardId?`/board/${e.boardId}`:""}`,server:t})};var ac=async e=>{let t=await ic({...e,boardId:""});if(d(t))return t;let{url:n}=t.value;return console.log(`Epiq GUI running at ${zp.cyan(n)}`),Hs(n),l("Started GUI",{url:n})};import{Box as Bt}from"ink";import J from"react";import{Box as As,Text as Kn}from"ink";import We,{useEffect as qp,useMemo as Yp}from"react";import{ulid as Xp}from"ulid";var dc=({text:e,match:t,color:n,highlightColor:o=y.secondary,dimColor:r=!1})=>{if(!t)return We.createElement(Kn,{color:n,dimColor:r},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?We.createElement(Kn,{color:n,dimColor:r},e):We.createElement(Kn,{color:n,dimColor:r},e.slice(0,c),We.createElement(Kn,{backgroundColor:o,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},cc=Xp(),Jp=e=>`${e}`,Qp=e=>{let{pendingNavTarget:t}=wt();if(!t)return[];let{breadCrumb:n,contextNode:o,selectedNode:r}=t,s=new Set(ie(h.NONE,{breadCrumb:n,contextNode:o,readOnly:g().readOnly,selectedNode:r}));return[...new Set(Object.values(h))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==h.PALETTE).map(i=>{let c=Uo(i),u=Jo.find(m=>m.intent===c);return{command:i,description:u?.description??`[${i}] Run command`,isAvailable:s.has(i)}}).filter(i=>i.command.toLowerCase().startsWith(e)||e.length>=2&&i.description.toLowerCase().includes(e)).sort((i,c)=>i.isAvailable!==c.isAvailable?i.isAvailable?-1:1:i.command.localeCompare(c.command))},Zp=e=>Y.text({id:cc,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),eg=(e,t,n)=>Y.text({id:Jp(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),ws=[],tg=e=>{lc();let t=I.createNode(Zp(g().rootNodeId));d(t)||!bt(t.value)||(ws=[t.value,...e.map((n,o)=>eg(n,o,cc)).map(I.createNode).filter(Q).map(({value:n})=>n).filter(bt)],T.navigate({contextNode:t.value,selectedIndex:0}))},lc=()=>{let e=ws.map(t=>t.id);ws=[];for(let t of e)I.deleteNode(t)};function uc({width:e,height:t}){let o=Ma().value.trim().toLowerCase(),r=Yp(()=>Qp(o),[o]);qp(()=>(tg(r),()=>{lc()}),[r]);let s=g().selectedIndex;return We.createElement(As,{flexDirection:"column",width:e,height:t-2},We.createElement(Je,{height:t-4,itemHeight:3,selectedIndex:s},r.map((i,c)=>{let u=c===s,m=i.isAvailable?y.accent:y.secondary2,p=i.isAvailable?"":"[unavailable] ";return We.createElement(As,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},We.createElement(Kn,{color:m,dimColor:!i.isAvailable},u?"\u276F ":" ",We.createElement(dc,{text:bi(i.command),match:o,color:m,dimColor:!i.isAvailable})),We.createElement(As,{paddingLeft:2},We.createElement(dc,{text:p+i.description,match:o.length>=2?o:"",color:u&&i.isAvailable?y.primary:y.secondary2,dimColor:!i.isAvailable})))})))}import{Box as gg}from"ink";import Ps from"react";import qn from"chalk";import{Box as Ms,Text as mc}from"ink";import zn,{useEffect as ng,useMemo as og,useState as rg}from"react";var pc=qn.gray,sg=qn.inverse,ig=qn.inverse.gray,ag={hint:"",hints:[],overlap:0,remainder:""},fc=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),r=e.length-n.length;return e.slice(r,r+t.length)!==t?null:{start:r,end:r+t.length}},dg=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=oe(t);return{bg:o=>qn.bgHex(n).black(o),bgCursor:o=>qn.bgHex(n).inverse.black(o)}}return Wr(t)},cg=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let o=fc({value:e,command:t});if(!o)return null;let s=e.slice(o.end).match(/^\s*/)?.[0].length??0,i=o.end+s;return e.slice(i,i+n.length)!==n?null:{start:i,end:i+n.length}},gc=()=>({value:ge.value,cursorPosition:ge.cursorPosition,commandIsPending:ge.commandIsPending,autoCompletion:ge.commandMeta.autoCompletion??ag,infoMessage:ge.commandMeta.infoMessage,validationStatus:ge.commandMeta.validity,command:ge.commandMeta.command,inputString:ge.commandMeta.inputString,modifier:ge.commandMeta.modifier}),lg=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,vc=({width:e,mode:t})=>{let[n,o]=rg(gc());ng(()=>{let C=()=>{let S=gc();o(R=>lg(R,S)?R:S)},E=rs(C);return C(),()=>{E()}},[]);let{value:r,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:u,command:m,modifier:p}=n,v=og(()=>{let C=Math.max(0,Math.min(s,r.length)),E=fc({value:r,command:m}),S=cg({value:r,command:m,modifier:p}),R=m?Wr(m):null,D=dg({command:m,modifier:p}),P=(le,be)=>{let en=E&&be>=E.start&&be<E.end,Ot=S&&be>=S.start&&be<S.end;return en&&R?R.fg(le):Ot&&D?D.bg(le):le},V=(le,be)=>{let en=E&&be>=E.start&&be<E.end,Ot=S&&be>=S.start&&be<S.end;return en&&R?R.fgCursor(le):Ot&&D?D.bgCursor(le):sg(le)},O=r.slice(0,C),k=r[C]??" ",Ee=C<r.length?r.slice(C+1):"",ft=Array.from(O).map((le,be)=>P(le,be)).join(""),vt=V(k,C),yt=Array.from(Ee).map((le,be)=>P(le,C+1+be)).join("");if(u.hint){let le=u.hint[u.overlap]??k;vt=ig(le),yt=pc(u.remainder.slice(1)+Ee)}return pc(t===f.PALETTE?"?":":")+ft+vt+yt},[r,s,u,m,p]);return zn.createElement(Ms,{flexDirection:"column",justifyContent:"flex-start"},zn.createElement(Ms,{flexDirection:"column",paddingX:1,borderColor:y.secondary,borderStyle:"round",width:e},zn.createElement(Ms,null,zn.createElement(mc,null,v),i&&zn.createElement(mc,{wrap:"truncate",color:c?y.red:y.secondary2},` ${i} `))))};import{Box as ug,Text as mg}from"ink";import yc from"react";var pg=(e,t)=>{let n=[],o=0;for(let r of e){let i=(n.length>0?" | ":"").length+r.length;if(o+i>t-4)break;n.push(r),o+=i}return n},xc=({width:e,availableHints:t})=>{let n=pg(t,e).join(" | ");return yc.createElement(ug,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},yc.createElement(mg,{color:y.secondary2},n.length?n:"\xA0"))};var Yn=({width:e,mode:t,availableHints:n})=>{let o=[],r=0;for(let s of n){let c=(o.length>0?" | ":"").length+s.length;if(r+c>e+2)break;o.push(s),r+=c}return Ps.createElement(gg,null,t===f.COMMAND_LINE||t===f.PALETTE?Ps.createElement(vc,{width:e,mode:t}):Ps.createElement(xc,{width:e,mode:t,availableHints:n}))};import{Box as kt,Text as yn}from"ink";import Ie,{useEffect as fg,useMemo as vg}from"react";import{ulid as hc}from"ulid";var ar=hc(),yg=()=>[...new Set([...g().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),o=t?.replace("[",""),r=n?.trim();return[o,r]}).filter(e=>e[0]!==void 0&&e[1]!==void 0).sort(([e],[t])=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(([e,t])=>({keys:e,action:t})),xg=e=>Y.text({id:ar,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),hg=(e,t,n)=>Y.text({id:hc(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),ir=[],Ic=()=>{let e=ir.filter(n=>n.id!==ar).map(n=>n.id),t=ir.filter(n=>n.id===ar).map(n=>n.id);ir=[];for(let n of[...e,...t])I.deleteNode(n)},Ig=e=>{Ic();let t=I.createNode(xg(g().rootNodeId));if(d(t)||!bt(t.value))return logger.error("Could not attach help nodes");ir=[t.value,...e.map((n,o)=>hg(n,o,ar)).map(I.createNode).filter(Q).map(({value:n})=>n).filter(bt)],T.navigate({contextNode:t.value,selectedIndex:0})},bc=({width:e,height:t})=>{let n=vg(()=>yg(),[]);fg(()=>(Ig(n),()=>{Ic()}),[n]);let o=g().selectedIndex;return Ie.createElement(kt,{flexDirection:"column",marginTop:3,borderColor:y.secondary,borderStyle:"round",width:e,height:t-2},Ie.createElement(kt,{paddingX:1,justifyContent:"center"},Ie.createElement(yn,{color:y.accent},"Help"),Ie.createElement(yn,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Ie.createElement(kt,{paddingX:1,marginTop:1},Ie.createElement(kt,{width:20,justifyContent:"flex-end"},Ie.createElement(yn,{color:y.secondary},"Key(s)")),Ie.createElement(kt,{flexGrow:1,width:40,paddingLeft:2},Ie.createElement(yn,{color:y.secondary},"Action"))),Ie.createElement(Je,{height:t-7,itemHeight:1,selectedIndex:o},n.map(({keys:r,action:s},i)=>{let c=i===o;return Ie.createElement(kt,{paddingX:1,key:`${r}-${s}-${i}`,flexDirection:"row"},Ie.createElement(kt,{width:20,justifyContent:"flex-end"},Ie.createElement(yn,{color:y.accent},r)),Ie.createElement(kt,{flexGrow:1,width:40,paddingLeft:2},Ie.createElement(yn,{color:c?y.primary:y.secondary2},s)))})))};import bg from"chalk";import{Box as dr,Text as gt}from"ink";import Le from"react";var Cc=({width:e,height:t})=>Le.createElement(dr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Le.createElement(gt,{color:y.accent,bold:!0},"Initialize project"),Le.createElement(gt,null,`This folder is not an ${bg.hex(y.accent)("epiq")} project yet.`),Le.createElement(gt,{color:y.primary},"To start tracking issues here, we need to initialize a new",Le.createElement(gt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),Le.createElement(dr,{marginTop:1,flexDirection:"column"},Le.createElement(dr,null,Le.createElement(gt,{color:y.accent}," "),Le.createElement(gt,{color:y.primary},"Type "),Le.createElement(gt,{backgroundColor:y.secondary}," :init "))),Le.createElement(dr,{marginTop:1},Le.createElement(gt,{color:y.secondary2},"This will create, commit and push "),Le.createElement(gt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json ")));import{Box as cr,Text as nt}from"ink";import ce from"react";var Cg=({isDone:e,command:t,value:n})=>ce.createElement(cr,null,ce.createElement(nt,{color:y.accent,dimColor:e},e?" \u2714 ":" "),ce.createElement(nt,{dimColor:e},"Type "),ce.createElement(nt,{backgroundColor:y.secondary,dimColor:e}," "+t+" "),n!==void 0&&ce.createElement(ce.Fragment,null,ce.createElement(nt,{dimColor:e}," "),ce.createElement(nt,{color:y.secondary,dimColor:e},"<"+n+">"))),Ng=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function Ls({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:o,userName:r,preferredEditor:s,autoSync:i,isSetAutoSync:c}=St(),u=[{key:"username",done:o,command:":config username",value:r,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:s,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:i,message:"Almost there. Configure auto sync."}],m=u.findIndex(v=>!v.done),p=m===-1?void 0:u[m];return ce.createElement(cr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},ce.createElement(nt,{color:y.accent,bold:!0},"Welcome! \u{1F539}"),ce.createElement(nt,null,"Let's get you started - it's a breeze."),ce.createElement(nt,{color:y.secondary2},"Remember - you can always search available commands by typing:",ce.createElement(nt,{color:y.accent}," ? ")),p&&ce.createElement(nt,{color:y.secondary2},p.message),ce.createElement(cr,{flexDirection:"column"},u.map((v,C)=>m===-1||C<=m?ce.createElement(cr,{key:v.key,marginBottom:1},ce.createElement(Cg,{isDone:v.done,command:v.command,value:v.done?Ng(v.value):void 0})):null)))}import gr from"chalk";import{Box as pr,Text as Jn}from"ink";import ye from"react";import{Box as lr,Text as Nc}from"ink";import Dt from"react";var Sg=e=>(I.getTag(e)?.name??"").length+3,Eg=e=>(I.getContributor(e)?.name??"").length+3,Sc=({width:e})=>{let{viewMode:t}=_(),n=K(),{breadCrumb:o,contextNode:r,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[r.id]?.[s],u=it(c?.id??r.id,"TICKET"),m=Q(u)?u.value:void 0,p=m?.props.tags??[],v=m?.props.assignees??[],C=m?.parentNodeId?!Ur(r.id,m.parentNodeId)&&t==="dense":!1,E=o.map((k,Ee)=>{let ft=Ee===o.length-1,vt=j(k.id),yt=ft?vt?.[s]?.title:void 0;return`${Ee?" / ":""}${k.title??""}${yt?` \u25B8 ${yt}`:""}`}).join(""),S=m?I.getCommentsByIssue(m.id):[],R=S.length?String(S.length).length+11:0,D=C?p.reduce((k,Ee)=>k+Sg(Ee),0)+v.reduce((k,Ee)=>k+Eg(Ee),0)+R:0,P=Math.max(0,e-D),V=E.substring(0,P),O=C?[...p.map(k=>Dt.createElement(lr,{key:`tag-${k}`,paddingLeft:1},Dt.createElement(fn,{id:k}))),...v.map(k=>Dt.createElement(lr,{key:`assignee-${k}`,paddingLeft:1},Dt.createElement(Rt,{id:k}))),S.length?Dt.createElement(lr,{key:"comments",paddingLeft:1},Dt.createElement(Nc,{color:y.accent},"[",S.length," comment",S.length===1?"":"s","]")):null]:[];return Dt.createElement(lr,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Dt.createElement(Nc,{color:y.secondary2},V),O)};import{Box as Rg,Text as Ec}from"ink";import ur from"react";var Tg=({filters:e})=>ur.createElement(Rg,{columnGap:1},ur.createElement(Ec,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:o})=>ur.createElement(Ec,{backgroundColor:"black",color:"white"},` ${n}${o}"${t}" `))),Rc=ur.memo(Tg);import{Box as Ag,Text as mr}from"ink";import Xn from"react";function Tc(){let{eventLog:e,unappliedEvents:t}=K(),n=e.at(-1)?.id,o=bo(n??""),r=Q(o)?Di(o.value):"INVALID DATE";return Xn.createElement(Ag,{paddingLeft:1},Xn.createElement(mr,{backgroundColor:y.accent}," Readonly "),Xn.createElement(mr,{color:y.accent}," "+t.length+" edits ago at "+r+"."),Xn.createElement(mr,{color:y.accent}," Resume with "),Xn.createElement(mr,{backgroundColor:y.accent}," :peek now "))}import ks from"chalk";import{Box as wg,Text as Ac}from"ink";import Ds,{useEffect as Mg,useState as Pg}from"react";var Lg=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],wc=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},kg=({r:e,g:t,b:n})=>{let o=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(n)}`},Dg=(e,t,n)=>{let o=wc(e),r=wc(t);return kg({r:o.r+(r.r-o.r)*n,g:o.g+(r.g-o.g)*n,b:o.b+(r.b-o.b)*n})},Fg=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),o=Math.floor(n),r=n-o,s=e[o],i=e[Math.min(o+1,e.length-1)];return Dg(s,i,r)};function Mc({syncStatus:e,autoSync:t}){let[n,o]=Pg(0);Mg(()=>{if(e.status!=="syncing"){o(0);return}let c=setInterval(()=>{o(u=>u+1)},50);return()=>clearInterval(c)},[e.status]);let r={synced:" ",failed:"---",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,pending:y.secondary2,syncing:Fg(Lg,(Math.sin(n*.12)+1)/2)??""}[e.status];return Ds.createElement(wg,null,Ds.createElement(Ac,null,ks.hex(y.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Ds.createElement(Ac,null,ks.hex(i)("\u25CF")+ks.hex(y.secondary2).dim(` ${r[e.status].padEnd(4)} `)))}import Fc from"chalk";import{Text as Bc}from"ink";import Uc,{useEffect as $g,useState as Wg}from"react";var xn="0.7.0";import Fs from"chalk";var Bg="https://registry.npmjs.org/epiq/latest",Bs=null,Pc=0,Ug=1e3*60*60*24,Lc=e=>e.replace(/^v/,""),Og=(e,t)=>{let n=Lc(e).split(".").map(Number),o=Lc(t).split(".").map(Number);for(let r=0;r<Math.max(n.length,o.length);r++){let s=n[r]??0,i=o[r]??0;if(s>i)return 1;if(s<i)return-1}return 0},kc=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Bs&&Date.now()-Pc<Ug)return Bs;try{let t=await fetch(Bg);if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.status}`);let o=(await t.json()).version??null,r={current:e,latest:o,updateAvailable:o?Og(o,e)>0:!1};return Bs=r,Pc=Date.now(),r}catch{return{current:e,latest:null,updateAvailable:!1}}},Dc=(e,t)=>{let n=e.split("."),o=t.split("."),r=o.findIndex((s,i)=>s!=n[i]);return o.map((s,i)=>i>=r?Fs.hex(y.accent).dim(s):Fs.hex(y.secondary).dim(s)).join(Fs.hex(y.secondary2).dim("."))};function Oc(){let[e,t]=Wg({current:xn,latest:null,updateAvailable:!1});return $g(()=>{let n=!0;return kc(xn).then(o=>{n&&t(o)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?Uc.createElement(Bc,{dimColor:!0,color:y.secondary2},xn+" "):Uc.createElement(Bc,null,Fc.hex(y.secondary2).dim(xn),Fc.hex(y.accent).dim(" \u2197 "),Dc(xn,e.latest))}function Qn({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:o,mode:r}=K(),{userName:s,preferredEditor:i,autoSync:c}=_(),u=64,m=process.stdout.columns-u-8;return ye.createElement(pr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?ye.createElement(Jn,null," "):r===f.PALETTE?ye.createElement(pr,null,ye.createElement(Jn,{color:y.accent},"Command Palette"),ye.createElement(Jn,{dimColor:!0,color:y.secondary2}," ","- search, select and press enter")):ye.createElement(pr,{paddingLeft:1},e.length>0?ye.createElement(Rc,{filters:e}):ye.createElement(Sc,{width:m})),n==="live"?ye.createElement(pr,{columnGap:1,paddingRight:2,"max-width":u,overflow:"hidden",justifyContent:"flex-end"},ye.createElement(Mc,{autoSync:!!c,syncStatus:o}),ye.createElement(Jn,null,gr.hex(y.secondary2).dim("Mode: ")+gr.hex(y.secondary2).dim(r.padEnd(8," "))," "),ye.createElement($c,{icon:"@",value:s}),ye.createElement($c,{icon:"\u276F",value:i}),ye.createElement(Oc,null)):"",n==="peek"?ye.createElement(Tc,null):"")}function $c({icon:e,value:t}){return ye.createElement(Jn,null,gr.dim(e)+gr.hex(y.accent)(` ${t??"-"} `))}import{Box as _g,Text as jg}from"ink";import Zn from"react";import{Box as fr,Text as Us}from"ink";import Ft from"react";function Os(){let e=K(),t=e.nodes[e.rootNodeId],r=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?W(t?.id):[];return Ft.createElement(fr,{flexDirection:"column",height:r,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},Ft.createElement(fr,{padding:1,paddingTop:0,paddingBottom:0},Ft.createElement(Us,null,"Select a board:")),Ft.createElement(fr,{padding:1,flexDirection:"column"},i.map((c,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,v=W(c.id).flatMap(({id:C})=>j(C)).length;return Ft.createElement(fr,{key:c.id??u},Ft.createElement(Us,{color:m?y.accent:y.secondary2},Ft.createElement(he,{isSelected:m})),Ft.createElement(Us,{color:m?y.accent:y.secondary2},c.title," (",v," issues)",c.readonly?" \u{1F512}":""))})))}var Hg=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:o,viewMode:r,height:s,width:i})=>{let{renderedChildrenIndex:c}=K(),u=n.find(({context:C})=>C==="BOARD"),v=s-1-3;return Zn.createElement(_g,{flexDirection:"row"},e.context==="WORKSPACE"?Zn.createElement(Os,null):u?Zn.createElement(Vo,{height:v,width:i,swimlanes:(c[u.id]??[]).filter(C=>C!==void 0&&Ct(C)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o}):Zn.createElement(jg,null))},Wc=Zn.memo(Hg);import{useEffect as Vg}from"react";var Gg=e=>{Vg(()=>{if(!e)return;let t,n=!1,o=()=>{if(n)return;let{autoSyncIntervalMs:r,userName:s,preferredEditor:i}=_();i&&s&&r&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:u}=g();u==="default"&&!c&&Mo(),o()},r))};return o(),()=>{n=!0,t&&clearTimeout(t)}},[e])},_c=({autoSync:e})=>(Gg(e),null);function $s({width:e,height:t}){let n=K(),{autoSync:o,viewMode:r}=Ti(),s=n.filters;if(n.mode===f.HELP)return J.createElement(Bt,{flexDirection:"column"},J.createElement(bc,{width:e,height:t}));if(n.mode===f.PALETTE)return J.createElement(Bt,{flexDirection:"column"},J.createElement(Qn,{filters:s}),J.createElement(uc,{width:e,height:t-2}),J.createElement(Yn,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=St(),c=!i,u=i&&!n.hasProjectDefinition;if(c)return J.createElement(Bt,{flexDirection:"column"},J.createElement(Bt,{flexDirection:"column"},J.createElement(Qn,{hideBreadCrumb:!0,filters:s}),J.createElement(Ls,{height:t,width:e})),J.createElement(Yn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(u)return J.createElement(Bt,{flexDirection:"column"},J.createElement(Bt,{flexDirection:"column"},J.createElement(Qn,{hideBreadCrumb:!0,filters:s}),J.createElement(Cc,{height:t,width:e})),J.createElement(Yn,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=Se(n.breadCrumb??[],"BOARD");if(Q(m)){let p=m.value.id,v=W(p).length,C=3,E=Math.floor(e/C),S=Math.floor(e/Math.max(v,1));e=Math.min(S,E)*Math.max(v,C)}return J.createElement(Bt,{flexDirection:"column"},J.createElement(_c,{autoSync:o}),J.createElement(Bt,{flexDirection:"column"},J.createElement(Qn,{filters:s}),J.createElement(Wc,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:r??"dense",mode:n.mode})),J.createElement(Yn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import Kg from"readline";var vr,yr,ot,zg=new Set([x.MoveCursorLeft,x.EraseInputWord,x.MoveCursorLeftOfWord,x.MoveCursorRight,x.MoveCursorRightOfWord,x.NavToPreviousContainer,x.NavToNextContainer,x.NavPreviousItem,x.NavNextItem,x.SetViewDense,x.SetViewWide,x.Confirm,x.Exit,x.InitCommandLine,x.InitCommandPalette,x.ExitCommandLine,x.CaptureInput,x.EraseInput,x.EraseInputWord,x.HideHelp,x.ViewHelp,x.SetViewDense,x.SetViewWide,x.GetLastCommandFromHistory,x.GetNextCommandFromHistory,x.AutoCompleteCommand]),jc=async e=>{if(e.ctrl&&e.name==="c")return T.exit();let{actionIndex:t,mode:n,readOnly:o}=g(),r=La(e,n);if(!r||o&&!zg.has(r))return;let s=t[n]?.[r];if(s?.action)try{await s.action(s,e)}catch(i){logger.error(i)}},qg=()=>async function(t,n){n.name!=="escape"&&(ot&&(clearTimeout(ot),ot=void 0),await jc(n))},Yg=()=>async function(t){if(t.length===1&&t[0]===27){ot&&clearTimeout(ot),ot=setTimeout(()=>{jc({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),ot=void 0},25);return}ot&&(clearTimeout(ot),ot=void 0)};function Hc(){vr&&process.stdin.removeListener("keypress",vr),yr&&process.stdin.removeListener("data",yr),vr=qg(),yr=Yg(),Kg.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",yr),process.stdin.on("keypress",vr)}async function Vc(){try{let e=_n();Q(e)&&Fe(e.value);let t=_e(process.cwd()),n=[];if(Q(t)){let s=Oe({repoRoot:t.value});if(d(s))return zt(3,s.message);let i=tn(),c=await $t({repoRoot:t.value,stateBranchRoot:s.value,stateBranchName:i.stateBranch});if(d(c))return zt(3,c.message);let u=await B({cwd:s.value,args:["pull","--ff-only"]});d(u)&&logger.info(3,u.message);let m=at(s.value);if(d(m))return zt(3,m.message);n=m.value}let o=Kt(n);if(d(o))return zt(4,o.message);N({hasProjectDefinition:Q(t),hasInitializingEvents:!!n.length});let r=Ws();return d(r)?zt(6,r.message):(Hc(),l("Booted Epiq",void 0))}catch(e){return zt(0,To(e))}}id();var Zg=`${Ut.bold("Epiq CLI")}
58
58
 
59
- ${Fr.dim("Boot in directory:")}
60
- ${Fr.cyan("$ epiq")}
59
+ ${Ut.dim("Boot in directory:")}
60
+ ${Ut.cyan("$ epiq")}
61
61
 
62
- `,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}});var Ud=process.stdout.columns||120,$d=process.stdout.rows||20,Or=null,vp=e=>{try{return Or?(Or.rerender(e),c("Rerendered app",void 0)):(Or=pp(e),c("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${uo(t)}`)}},_d=()=>vp(fp.createElement(Zo,{width:Ud,height:$d}));async function xp(){try{let e=Na();J(e)&&Ee(e.value);let t=Ye(process.cwd()),n=[];if(J(t)){let i=Xe({repoRoot:t.value});if(d(i))return Et(3,i.message);let s=Mn(),l=await cn({repoRoot:t.value,stateBranchRoot:i.value,stateBranchName:s.stateBranch});if(d(l))return Et(3,l.message);let u=await k({cwd:i.value,args:["pull","--ff-only"]});d(u)&&logger.info(3,u.message);let m=kt(i.value);if(d(m))return Et(3,m.message);n=m.value}let r=Xn(n);if(d(r))return Et(4,r.message);N({hasProjectDefinition:J(t),hasInitializingEvents:!!n.length});let o=_d();return d(o)?Et(6,o.message):(Bd(),c("Booted Epiq",void 0))}catch(e){return Et(0,uo(e))}}process.stdout.on("resize",()=>{if(Ud=process.stdout.columns||120,$d=process.stdout.rows||20,!Or)return;let e=_d();d(e)&&logger.info(`[boot:resize] ${e.message}`)});(async()=>{console.clear();let e=await xp();d(e)&&(logger.info(e.message),console.error(Fr.red(`Failed to boot Epiq:
63
- ${e.message}`)),process.exitCode=1)})();
62
+ ${Ut.dim("Launch GUI:")}
63
+ ${Ut.cyan("$ epiq gui")}
64
+ `,ef=Jg(Zg,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}}),xr=ef.input[0];xr&&xr!=="gui"&&(console.error(Ut.red(`Unknown command: ${xr}`)),process.exit(1));var Gc=process.stdout.columns||120,Kc=process.stdout.rows||20,hr=null,tf=e=>{try{return hr?(hr.rerender(e),l("Rerendered app",void 0)):(hr=Xg(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${To(t)}`)}},Ws=()=>tf(Qg.createElement($s,{width:Gc,height:Kc}));process.stdout.on("resize",()=>{if(Gc=process.stdout.columns||120,Kc=process.stdout.rows||20,!hr)return;let e=Ws();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(xr==="gui"){let e=await ac({repoRoot:process.cwd()});d(e)&&(console.error(Ut.red(`Failed to start Epiq GUI:
65
+ ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await Vc();d(e)&&(logger.info(e.message),console.error(Ut.red(`Failed to boot Epiq:
66
+ ${e.message}`)),process.exitCode=1)}export{Ws as renderApp};