epiq 1.7.2 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mcp.js CHANGED
@@ -1,73 +1,74 @@
1
1
  #!/usr/bin/env node
2
- var ag=Object.defineProperty;var y=(e,t)=>()=>(e&&(t=e(e=0)),t);var Eo=(e,t)=>{for(var n in t)ag(e,n,{get:t[n],enumerable:!0})};var Za={};Eo(Za,{failed:()=>i,isFail:()=>a,isSuccess:()=>vt,resultStatuses:()=>Ft,succeeded:()=>c});var Ft,i,c,a,vt,C=y(()=>{"use strict";Ft={Success:"success",Fail:"fail"},i=e=>({status:Ft.Fail,message:e,value:null}),c=(e,t)=>({status:Ft.Success,message:e,value:t}),a=e=>e.status==="fail",vt=e=>e.status==="success"});var nd={};Eo(nd,{ACTOR_ID_ENV:()=>gr,ACTOR_NAME_ENV:()=>yt,applyActorNameArgument:()=>lg,deriveActorId:()=>td,isValidUserId:()=>Ro,isValidUserName:()=>fr,resolveEnvActor:()=>ti});import dg from"node:crypto";var yt,gr,ed,cg,ei,Ro,fr,Wn,td,ti,lg,hr=y(()=>{"use strict";C();yt="EPIQ_USER_NAME",gr="EPIQ_USER_ID",ed="0123456789ABCDEFGHJKMNPQRSTVWXYZ",cg=26,ei=80,Ro=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),fr=e=>e.trim().length>0&&e.length<=ei,Wn=e=>e.trim().toLowerCase(),td=e=>{let t=dg.createHash("sha256").update(`epiq:actor:${Wn(e)}`).digest(),n="";for(let r=0;r<cg;r++)n+=ed[(t[r]??0)%ed.length];return n},ti=(e,t=process.env)=>{let n=(t[yt]??"").trim(),r=(t[gr]??"").trim();return n?fr(n)?!r&&e.userId&&e.userName&&Wn(e.userName)===Wn(n)?c("Actor override names the configured user",{userId:e.userId,userName:e.userName}):r&&!Ro(r)?i(`${gr} must be 26 characters of Crockford base32`):r&&e.userId&&r===e.userId?i(`${gr} is the configured user's own id; using it under a different name would rename them on the board`):c("Resolved actor from environment",{userId:r||td(n),userName:r?n:Wn(n)}):i(`${yt} must be 1-${ei} characters of text`):r?i(`${gr} is set without ${yt}`):c("No actor override",null)},lg=(e,t,n=process.env)=>{let r=e.trim();if(!fr(r))return i(`${t} must be 1-${ei} characters of text`);let o=(n[yt]??"").trim();return o&&Wn(o)!==Wn(r)?i(`${t} names ${r}, but ${yt} names ${o}`):(n[yt]=r,c("Applied actor name argument",r))}});import{decodeTime as rd}from"ulid";var No,ni,bt,vr,od,yr,dt=y(()=>{"use strict";C();No=1440*60*1e3,ni=(e,t=Date.now())=>e>t+No?t:e,bt=e=>ni(rd(e)),vr=e=>{let t=Date.now()+No,n=e.find(o=>o!==null&&o<=t)??null;if(n===null)return[...e];let r=null;return e.map(o=>{if(o===null)return null;let s=o<=t?o:r??n;return r=s,s})},od=e=>{try{return c("Decoded date",new Date(bt(e)))}catch(t){return i("Decoding failed + "+t.message)}},yr=e=>{if(!e?.id)return null;try{return rd(e.id)}catch{return null}}});var So,Xe,sd,xt=y(()=>{"use strict";C();So="removed",Xe=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):i("Unable to find node in breadcrumb")},sd=["png","jpg","gif","webp"]});function ri(e){return e.context===B.WORKSPACE}function P(e){return e.context===B.TICKET}function id(e){return e.context===B.TEXT}function Je(e){return e.context===B.FIELD}function br(e){return e.context===B.FIELD_LIST}var B,xn,Co,xr,he=y(()=>{"use strict";B={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};xn=e=>e.context===B.SWIMLANE,Co=e=>e.context===B.BOARD,xr=e=>e.context===B.COMMENT});var h,ue=y(()=>{"use strict";h={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"}});var ad=y(()=>{"use strict";In()});function Ao(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var It,Le,Xt=y(()=>{"use strict";It=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Le=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim()});var dd,cd,ld=y(()=>{"use strict";dd=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),s=t.get(o);s?s.push(n):t.set(o,[n])}return t},cd=(e,t)=>t?e.get(t)??[]:[]});var ud,ug,md,pd=y(()=>{"use strict";Xt();ld();ud=new WeakMap,ug=e=>{let t=ud.get(e);return t||(t=dd(e),ud.set(e,t)),t},md=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return cd(ug(e),r).filter(s=>Ao(r,s)>=n)}});var mg,gd,pg,fd=y(()=>{"use strict";Xt();pd();mg={hint:"",hints:[],overlap:0,remainder:""},gd=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return mg;let o=md({wordList:r,inputToMatch:e,overlapThreshold:1});return pg(t,o)},pg=(e,t)=>{let n=t[0]??"",r=Ao(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),d=r<(o??"").length,l=!!s,p=(l&&d?o:n)+(l&&d?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}}});import{useSyncExternalStore as yx}from"react";var To,gg,fg,xe,nt,Ue=y(()=>{"use strict";To={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},gg=new Set,fg=()=>{for(let e of gg)e()},xe=()=>To,nt=e=>(To={...To,...e},fg(),To)});function hd(e){return!e||!vg.test(e)?i(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function rt(e,t=Ir){if(e<0n)return i("Negative rank not allowed");let n=e.toString(16);return c("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function $e(e,t){if(!e&&!t)return rt(Et/2n,Ir);let n=e?hd(e):c("Resolved lower bound",0n);if(a(n))return n;let r=t?hd(t):c("Resolved upper bound",Et);if(a(r))return r;let o=n.value,s=r.value;if(s<=o)return i("Neighbouring ranks leave no space between them");let d=(o+s)/2n;return d===o||d===s?i("No rank space available between neighbors"):rt(d,Ir)}function vd(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=Et*BigInt(r+1)/(t+1n),s=rt(o,Ir);if(a(s))return s;n.push(s.value)}return c("Resolved evenly spaced ranks",n)}var Ir,hg,Et,vg,Gn=y(()=>{"use strict";C();Ir=24n,hg=Ir*4n,Et=(1n<<hg)-1n,vg=/^[0-9a-f]+$/});import{ulid as yg}from"ulid";var oi,yd=y(()=>{"use strict";C();Rt();Gn();oi=(e,t)=>{let n=me(e),r=vd(n.length);if(a(r))return r;let o={};for(let s=0;s<n.length;s++){let d=n[s],l=r.value[s];if(!d||!l)return i("Unable to assign rebalance rank");o[d.id]=l}return c("Created rebalance event",{id:yg(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})}});import Er from"node:fs";import{ulid as bg}from"ulid";import{z as wo}from"zod";var xg,Ig,Mo,Ot,Rr,bd,Bt=y(()=>{"use strict";C();pe();xg="__epiq_state__",Ig=wo.object({projectId:wo.string().min(1),stateBranch:wo.string().min(1),createdAt:wo.iso.datetime()}),Mo=()=>({projectId:bg(),stateBranch:xg,createdAt:new Date().toISOString()}),Ot=e=>{let t=ko(e);if(!Er.existsSync(t))return i("Missing .epiq/project.json");try{let n=Er.readFileSync(t,"utf8"),r=JSON.parse(n),o=Ig.safeParse(r);return o.success?c("Read project.json",o.data):i(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return i(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Rr=e=>{let t=Ot(e);return a(t)?i(t.message):c("Read projectId",t.value.projectId)},bd=({repoRoot:e,fileContents:t})=>{let n=Nr(e),r=ko(e);try{if(Er.mkdirSync(n,{recursive:!0}),Er.existsSync(r)){let o=Ot(e);return a(o)?i(o.message):c("Project already initialized",null)}return Er.writeFileSync(r,JSON.stringify(t,null,2)+`
3
- `,"utf8"),c("Created project.json",null)}catch(o){return i(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}}});import Eg from"node:os";import Rg from"node:path";var ct,En,Lo=y(()=>{"use strict";ct=".epiq-global",En=()=>process.env.EPIQ_GLOBAL_DIR??Rg.join(Eg.homedir(),ct)});var si,xd=y(()=>{"use strict";C();si=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let d=r(...s);if(!n.has(d)){let l=e(...s).then(u=>(a(u)&&n.delete(d),u));n.set(d,l)}return n.get(d)});return o.clear=()=>n.clear(),o}});var ye,Po=y(()=>{"use strict";lt();ye={stage:({cwd:e,pathspec:t,ignoreRemoval:n=!1})=>H({args:["add",...n?["--ignore-removal"]:[],...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:r})=>H({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...r?.length?["--",...r]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>H({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>H({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>H({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push","--no-verify",...r?["-u"]:[],t,n]:["push","--no-verify"];return H({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>H({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>H({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>H({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>H({args:["worktree","prune"],cwd:e})}});var Jt,ot,Sr=y(()=>{"use strict";Bt();C();pe();Jt=e=>{let t=Qe(e);if(a(t))return i("Unable to resolve epiq project root");let n=Ot(t.value);return a(n)?i("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},ot="origin"});import{spawn as Ng}from"node:child_process";import Rn from"node:fs";import Nn from"node:path";var Sg,Cg,Ag,Tg,wg,Mg,kg,Ed,H,je,qn,ii,Lg,Do,ai,di,Fo,Cr,Rd,ci,Oo,Nd,Sd,Pg,Id,li,Dg,ui,Cd,Ad,Td,wd,lt=y(()=>{"use strict";C();Po();Sr();Sg=1e4,Cg=12e4,Ag=new Set(["fetch","push","pull","clone","ls-remote","rebase","checkout","worktree"]),Tg=e=>{let t=e.find((n,r)=>!n.startsWith("-")&&e[r-1]!=="-c");return t&&Ag.has(t)?Cg:Sg},wg=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(Nn.delimiter))if(t)for(let n of e){let r=Nn.join(t,n);try{if(!Rn.statSync(r).isFile())continue;return Rn.accessSync(r,Rn.constants.X_OK),r}catch{continue}}return"git"},Mg=wg(),kg={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},Ed=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Rn.existsSync(t)){let f=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:f,exitCode:1});return}r(i(f));return}let o=Ng(Mg,e,{cwd:t,stdio:["ignore","pipe","pipe"],env:kg}),s=!1,d="",l="",u=f=>{s||(s=!0,clearTimeout(p),r(f))},m=Tg(e),p=setTimeout(()=>{o.kill("SIGTERM");let f=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${m}ms`].join(`
4
- `);u(n?{stdout:d,stderr:f,exitCode:124}:i(f))},m);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",f=>{d+=f}),o.stderr.on("data",f=>{l+=f}),o.on("error",f=>{if(n){u({stdout:d,stderr:f.message,exitCode:1});return}u(i([`git ${e.join(" ")}`,`cwd=${t}`,f.message].join(`
5
- `)))}),o.on("close",f=>{let I=f??1;if(n){u({stdout:d,stderr:l,exitCode:I});return}if(I!==0){u(i([`git ${e.join(" ")}`,l.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
6
- `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:I}))})}),H=({args:e,cwd:t})=>Ed({args:e,cwd:t,allowFail:!1}),je=({args:e,cwd:t})=>Ed({args:e,cwd:t,allowFail:!0}),qn=async({cwd:e,message:t,pathspec:n})=>{let r=await ye.commit({cwd:e,message:t,pathspec:n});if(a(r))return i(`Failed to create commit
7
- ${r.message}`);let o=await H({args:["rev-parse","HEAD"],cwd:e});return a(o)?i(`Commit created, but failed to read HEAD SHA
8
- ${o.message}`):c("Created commit and resolved SHA",o.value.stdout.trim())},ii=async e=>{let t=await H({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return i(t.message);let n=t.value.stdout.trim();return c("Resolved git dir",Nn.isAbsolute(n)?n:Nn.resolve(e,n))},Lg=async e=>{let t=await ii(e);if(a(t))return i(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,d]of Object.entries(r))if(Rn.existsSync(Nn.join(n,s)))return c("Checked for in-progress Git operation",d);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,d]of Object.entries(o))if(Rn.existsSync(Nn.join(n,s)))return c("Checked for in-progress Git operation",d);return c("Checked for in-progress Git operation",null)},Do=async e=>{let t=await Lg(e);return a(t)?i(t.message):c("Checked for in-progress Git operation",t.value!==null)},ai=async({repoRoot:e})=>{let n=(await je({args:["remote","get-url",ot],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},di=async({repoRoot:e,branch:t})=>{let n=await je({args:["ls-remote","--heads",ot,t],cwd:e});return n.exitCode!==0?i(n.stderr.trim()||`Unable to inspect remote branch ${ot}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},Fo=async({repoRoot:e,branch:t})=>{let n=await je({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):i(n.stderr.trim()||`Unable to inspect branch ${t}`)},Cr=e=>{try{return Rn.realpathSync.native(e)}catch{return Nn.resolve(e)}},Rd=async({repoRoot:e,worktreeRoot:t})=>{let n=await H({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let r=Cr(t),o=n.value.stdout.split(`
9
- `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Cr).includes(r);return c("Checked worktree registration",o)},ci=async e=>{let t=await je({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Oo=async e=>{let t=await H({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?i(t.message):c("Resolved current branch",t.value.stdout.trim())},Nd=async e=>{let t=await H({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?i(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},Sd=e=>e.includes("fetch first")||e.includes("non-fast-forward"),Pg=async e=>(await je({cwd:e,args:["rebase","--abort"]})).exitCode===0?c("Aborted stale rebase",!0):c("No rebase to abort",!1),Id=async e=>{let t=await je({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},li=e=>/could not resolve host/i.test(e)||/connection refused|connection timed out|operation timed out/i.test(e)||/network is unreachable|no route to host/i.test(e)||/failed to connect to/i.test(e),Dg=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),ui=async({cwd:e,branch:t})=>{let n=await Pg(e);if(a(n))return i(n.message);let r=await Id(e),o=await ye.fetch({cwd:e,remote:ot,branch:t});if(a(o))return Dg(o.message)?c("Remote branch missing, skipped pull",!1):i(`Failed to fetch ${t}
10
- ${o.message}`);let s=await ye.rebaseOnto({cwd:e,ref:`${ot}/${t}`});if(a(s))return i(`Failed during rebase
11
- ${s.message}`);let d=await Id(e),l=r!==null&&d!==null&&r!==d;return c(l?"Pulled with rebase":"Already up to date",l)},Cd=async e=>{let t=await je({args:["rev-list","--count","@{u}..HEAD"],cwd:e});return t.exitCode!==0?c("No upstream to compare against",!1):c("Compared against upstream",Number(t.stdout.trim())>0)},Ad=async e=>{let t=await je({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?i(t.stderr.trim()||"Unable to inspect the worktree for changes"):c("Inspected worktree for changes",t.stdout.trim().length>0)},Td=async(e,t)=>{let n=await je({args:["diff","--cached","--quiet",...t?.length?["--",...t]:[]],cwd:e});return n.exitCode===0?c("No staged changes",!1):n.exitCode===1?c("Has staged changes",!0):i(n.stderr.trim()||"Unable to inspect staged changes")},wd=async e=>{let t=await Oo(e);return a(t)?i(t.message):c("Checked detached HEAD state",t.value==="HEAD")}});import Qt from"node:fs";import st from"node:path";var kd,Ld,Pd,Dd,Bo,Ce,Fg,Md,Ar,_o,Fd,mi,pi,Od,Bd,ut,pI,mt=y(()=>{"use strict";Bt();C();Lo();pe();xd();Nt();lt();kd="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ld=e=>st.join(He,Zt,e),Pd=()=>st.join(He,gi),Dd=En,Bo=()=>st.join(Dd(),"worktrees"),Ce=({repoRoot:e})=>{let t=Rr(e);return a(t)?i(t.message):c("Resolved state branch root",st.join(Bo(),t.value))},Fg=e=>st.join(e,He),Md=e=>st.join(Fg(e),Zt),Ar=e=>{try{return Qt.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return i(t instanceof Error?t.message:String(t))}},_o=()=>{let e=Dd(),t=Bo(),n=!Qt.existsSync(e)||!Qt.existsSync(t),r=Ar(e);if(a(r))return i(`Ensure epiq home failed.
12
- `+r.message);let o=Ar(t);return a(o)?i(`Ensure worktrees dir failed.
13
- `+o.message):c("Ensured epiq storage",n)},Fd=e=>{Qt.existsSync(e)&&(X.debug("[sync] remove path",e),Qt.rmSync(e,{recursive:!0,force:!0}))},mi=`*.jsonl merge=union
14
- `,pi=()=>st.join(He,Zt,".gitattributes"),Od=(e,t)=>{for(let r of[Md(e),Md(t)]){let o=Ar(r);if(a(o))return i(o.message)}let n=st.join(t,pi());try{Qt.readFileSync(n,"utf8")!==mi&&Qt.writeFileSync(n,mi)}catch{Qt.writeFileSync(n,mi)}return c("Ensured state branch",void 0)},Bd=async e=>{let t=await H({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return i(`ensure state branch is storage only failed
2
+ var Wg=Object.defineProperty;var v=(e,t)=>()=>(e&&(t=e(e=0)),t);var To=(e,t)=>{for(var n in t)Wg(e,n,{get:t[n],enumerable:!0})};var Id={};To(Id,{failed:()=>i,isFail:()=>a,isSuccess:()=>yt,resultStatuses:()=>Ot,succeeded:()=>l});var Ot,i,l,a,yt,N=v(()=>{"use strict";Ot={Success:"success",Fail:"fail"},i=e=>({status:Ot.Fail,message:e,value:null}),l=(e,t)=>({status:Ot.Success,message:e,value:t}),a=e=>e.status==="fail",yt=e=>e.status==="success"});var Rd={};To(Rd,{ACTOR_ID_ENV:()=>Sr,ACTOR_NAME_ENV:()=>bt,applyActorNameArgument:()=>ci,deriveActorId:()=>Ed,isValidUserId:()=>wo,isValidUserName:()=>Nr,resolveEnvActor:()=>di});import Gg from"node:crypto";var bt,Sr,xd,qg,ai,wo,Nr,Jn,Ed,di,ci,Qn=v(()=>{"use strict";N();bt="EPIQ_USER_NAME",Sr="EPIQ_USER_ID",xd="0123456789ABCDEFGHJKMNPQRSTVWXYZ",qg=26,ai=80,wo=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Nr=e=>e.trim().length>0&&e.length<=ai,Jn=e=>e.trim().toLowerCase(),Ed=e=>{let t=Gg.createHash("sha256").update(`epiq:actor:${Jn(e)}`).digest(),n="";for(let r=0;r<qg;r++)n+=xd[(t[r]??0)%xd.length];return n},di=(e,t=process.env)=>{let n=(t[bt]??"").trim(),r=(t[Sr]??"").trim();return n?Nr(n)?!r&&e.userId&&e.userName&&Jn(e.userName)===Jn(n)?l("Actor override names the configured user",{userId:e.userId,userName:e.userName}):r&&!wo(r)?i(`${Sr} must be 26 characters of Crockford base32`):r&&e.userId&&r===e.userId?i(`${Sr} is the configured user's own id; using it under a different name would rename them on the board`):l("Resolved actor from environment",{userId:r||Ed(n),userName:r?n:Jn(n)}):i(`${bt} must be 1-${ai} characters of text`):r?i(`${Sr} is set without ${bt}`):l("No actor override",null)},ci=(e,t,n=process.env)=>{let r=e.trim();if(!Nr(r))return i(`${t} must be 1-${ai} characters of text`);let o=(n[bt]??"").trim();return o&&Jn(o)!==Jn(r)?i(`${t} names ${r}, but ${bt} names ${o}`):(n[bt]=r,l("Applied actor name argument",r))}});import{decodeTime as Sd}from"ulid";var Mo,li,dt,Cr,Nd,Ar,ct=v(()=>{"use strict";N();Mo=1440*60*1e3,li=(e,t=Date.now())=>e>t+Mo?t:e,dt=e=>li(Sd(e)),Cr=e=>{let t=Date.now()+Mo,n=e.find(o=>o!==null&&o<=t)??null;if(n===null)return[...e];let r=null;return e.map(o=>{if(o===null)return null;let s=o<=t?o:r??n;return r=s,s})},Nd=e=>{try{return l("Decoded date",new Date(dt(e)))}catch(t){return i("Decoding failed + "+t.message)}},Ar=e=>{if(!e?.id)return null;try{return Sd(e.id)}catch{return null}}});var ko,Ke,Cd,It=v(()=>{"use strict";N();ko="removed",Ke=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?l("Found node",n):i("Unable to find node in breadcrumb")},Cd=["png","jpg","gif","webp"]});function ui(e){return e.context===V.WORKSPACE}function P(e){return e.context===V.TICKET}function Ad(e){return e.context===V.TEXT}function Ye(e){return e.context===V.FIELD}function Tr(e){return e.context===V.FIELD_LIST}var V,In,Lo,wr,fe=v(()=>{"use strict";V={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};In=e=>e.context===V.SWIMLANE,Lo=e=>e.context===V.BOARD,wr=e=>e.context===V.COMMENT});var h,pe=v(()=>{"use strict";h={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"}});var Td=v(()=>{"use strict";xn()});import wd from"string-width";function Po(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var En,Vg,mi,zg,pi,Se,Qt=v(()=>{"use strict";En=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Vg=/\u001B\[[0-9;]*m/,mi="\x1B[0m",zg=e=>[...new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)].map(({segment:t})=>t),pi=(e,t)=>{if(t<=0)return"";if(wd(e)<=t)return e;if(t<=3)return"...".slice(0,t);let r=t-3,o="",s=0,d=!1;for(let c of e.split(/(\u001B\[[0-9;]*m)/))if(c!==""){if(Vg.test(c)){o+=c,d=c!==mi&&c!=="\x1B[m";continue}for(let u of zg(c)){let m=wd(u);if(s+m>r)return`${o}...${d?mi:""}`;o+=u,s+=m}}return`${o}...${d?mi:""}`},Se=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim()});var Md,kd,Ld=v(()=>{"use strict";Md=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),s=t.get(o);s?s.push(n):t.set(o,[n])}return t},kd=(e,t)=>t?e.get(t)??[]:[]});var Pd,Kg,Dd,Od=v(()=>{"use strict";Qt();Ld();Pd=new WeakMap,Kg=e=>{let t=Pd.get(e);return t||(t=Md(e),Pd.set(e,t)),t},Dd=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return kd(Kg(e),r).filter(s=>Po(r,s)>=n)}});var Yg,Bd,Xg,Fd=v(()=>{"use strict";Qt();Od();Yg={hint:"",hints:[],overlap:0,remainder:""},Bd=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Yg;let o=Dd({wordList:r,inputToMatch:e,overlapThreshold:1});return Xg(t,o)},Xg=(e,t)=>{let n=t[0]??"",r=Po(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),d=r<(o??"").length,c=!!s,p=(c&&d?o:n)+(c&&d?":":" "),g=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:g}}});import{useSyncExternalStore as gx}from"react";var Do,Jg,Qg,ve,et,Be=v(()=>{"use strict";Do={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Jg=new Set,Qg=()=>{for(let e of Jg)e()},ve=()=>Do,et=e=>(Do={...Do,...e},Qg(),Do)});function _d(e){return!e||!ef.test(e)?i(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function tt(e,t=Mr){if(e<0n)return i("Negative rank not allowed");let n=e.toString(16);return l("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Fe(e,t){if(!e&&!t)return tt(xt/2n,Mr);let n=e?_d(e):l("Resolved lower bound",0n);if(a(n))return n;let r=t?_d(t):l("Resolved upper bound",xt);if(a(r))return r;let o=n.value,s=r.value;if(s<=o)return i("Neighbouring ranks leave no space between them");let d=(o+s)/2n;return d===o||d===s?i("No rank space available between neighbors"):tt(d,Mr)}function Ud(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=xt*BigInt(r+1)/(t+1n),s=tt(o,Mr);if(a(s))return s;n.push(s.value)}return l("Resolved evenly spaced ranks",n)}var Mr,Zg,xt,ef,Zn=v(()=>{"use strict";N();Mr=24n,Zg=Mr*4n,xt=(1n<<Zg)-1n,ef=/^[0-9a-f]+$/});import{ulid as tf}from"ulid";var gi,$d=v(()=>{"use strict";N();Et();Zn();gi=(e,t)=>{let n=ce(e),r=Ud(n.length);if(a(r))return r;let o={};for(let s=0;s<n.length;s++){let d=n[s],c=r.value[s];if(!d||!c)return i("Unable to assign rebalance rank");o[d.id]=c}return l("Created rebalance event",{id:tf(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})}});import kr from"node:fs";import{ulid as nf}from"ulid";import{z as Oo}from"zod";var rf,of,Bo,Bt,Lr,jd,Ft=v(()=>{"use strict";N();ne();rf="__epiq_state__",of=Oo.object({projectId:Oo.string().min(1),stateBranch:Oo.string().min(1),createdAt:Oo.iso.datetime()}),Bo=()=>({projectId:nf(),stateBranch:rf,createdAt:new Date().toISOString()}),Bt=e=>{let t=Fo(e);if(!kr.existsSync(t))return i("Missing .epiq/project.json");try{let n=kr.readFileSync(t,"utf8"),r=JSON.parse(n),o=of.safeParse(r);return o.success?l("Read project.json",o.data):i(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return i(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Lr=e=>{let t=Bt(e);return a(t)?i(t.message):l("Read projectId",t.value.projectId)},jd=({repoRoot:e,fileContents:t})=>{let n=Rn(e),r=Fo(e);try{if(kr.mkdirSync(n,{recursive:!0}),kr.existsSync(r)){let o=Bt(e);return a(o)?i(o.message):l("Project already initialized",null)}return kr.writeFileSync(r,JSON.stringify(t,null,2)+`
3
+ `,"utf8"),l("Created project.json",null)}catch(o){return i(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}}});import sf from"node:os";import af from"node:path";var lt,Sn,_o=v(()=>{"use strict";lt=".epiq-global",Sn=()=>process.env.EPIQ_GLOBAL_DIR??af.join(sf.homedir(),lt)});var fi,Hd=v(()=>{"use strict";N();fi=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let d=r(...s);if(!n.has(d)){let c=e(...s).then(u=>(a(u)&&n.delete(d),u));n.set(d,c)}return n.get(d)});return o.clear=()=>n.clear(),o}});var he,Uo=v(()=>{"use strict";ut();he={stage:({cwd:e,pathspec:t,ignoreRemoval:n=!1})=>W({args:["add",...n?["--ignore-removal"]:[],...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:r})=>W({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...r?.length?["--",...r]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>W({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>W({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>W({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push","--no-verify",...r?["-u"]:[],t,n]:["push","--no-verify"];return W({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>W({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>W({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>W({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>W({args:["worktree","prune"],cwd:e})}});var Zt,nt,Pr=v(()=>{"use strict";Ft();N();ne();Zt=e=>{let t=Xe(e);if(a(t))return i("Unable to resolve epiq project root");let n=Bt(t.value);return a(n)?i("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},nt="origin"});import{spawn as df}from"node:child_process";import Nn from"node:fs";import Cn from"node:path";var cf,lf,uf,mf,pf,gf,ff,Gd,W,Ue,er,hi,hf,$o,Or,vi,jo,Dr,qd,yi,Ho,Vd,zd,vf,Wd,bi,yf,Ii,Kd,Yd,Xd,Jd,ut=v(()=>{"use strict";N();Uo();Pr();cf=1e4,lf=12e4,uf=new Set(["fetch","push","pull","clone","ls-remote","rebase","checkout","worktree"]),mf=e=>{let t=e.find((n,r)=>!n.startsWith("-")&&e[r-1]!=="-c");return t&&uf.has(t)?lf:cf},pf=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(Cn.delimiter))if(t)for(let n of e){let r=Cn.join(t,n);try{if(!Nn.statSync(r).isFile())continue;return Nn.accessSync(r,Nn.constants.X_OK),r}catch{continue}}return"git"},gf=pf(),ff={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},Gd=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Nn.existsSync(t)){let g=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:g,exitCode:1});return}r(i(g));return}let o=df(gf,e,{cwd:t,stdio:["ignore","pipe","pipe"],env:ff}),s=!1,d="",c="",u=g=>{s||(s=!0,clearTimeout(p),r(g))},m=mf(e),p=setTimeout(()=>{o.kill("SIGTERM");let g=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${m}ms`].join(`
4
+ `);u(n?{stdout:d,stderr:g,exitCode:124}:i(g))},m);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",g=>{d+=g}),o.stderr.on("data",g=>{c+=g}),o.on("error",g=>{if(n){u({stdout:d,stderr:g.message,exitCode:1});return}u(i([`git ${e.join(" ")}`,`cwd=${t}`,g.message].join(`
5
+ `)))}),o.on("close",g=>{let x=g??1;if(n){u({stdout:d,stderr:c,exitCode:x});return}if(x!==0){u(i([`git ${e.join(" ")}`,c.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
6
+ `)));return}u(l("Git command succeeded",{stdout:d,stderr:c,exitCode:x}))})}),W=({args:e,cwd:t})=>Gd({args:e,cwd:t,allowFail:!1}),Ue=({args:e,cwd:t})=>Gd({args:e,cwd:t,allowFail:!0}),er=async({cwd:e,message:t,pathspec:n})=>{let r=await he.commit({cwd:e,message:t,pathspec:n});if(a(r))return i(`Failed to create commit
7
+ ${r.message}`);let o=await W({args:["rev-parse","HEAD"],cwd:e});return a(o)?i(`Commit created, but failed to read HEAD SHA
8
+ ${o.message}`):l("Created commit and resolved SHA",o.value.stdout.trim())},hi=async e=>{let t=await W({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return i(t.message);let n=t.value.stdout.trim();return l("Resolved git dir",Cn.isAbsolute(n)?n:Cn.resolve(e,n))},hf=async e=>{let t=await hi(e);if(a(t))return i(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,d]of Object.entries(r))if(Nn.existsSync(Cn.join(n,s)))return l("Checked for in-progress Git operation",d);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,d]of Object.entries(o))if(Nn.existsSync(Cn.join(n,s)))return l("Checked for in-progress Git operation",d);return l("Checked for in-progress Git operation",null)},$o=async e=>{let t=await hf(e);return a(t)?i(t.message):l("Checked for in-progress Git operation",t.value!==null)},Or=async({repoRoot:e})=>{let n=(await Ue({args:["remote","get-url",nt],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},vi=async({repoRoot:e,branch:t})=>{let n=await Ue({args:["ls-remote","--heads",nt,t],cwd:e});return n.exitCode!==0?i(n.stderr.trim()||`Unable to inspect remote branch ${nt}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},jo=async({repoRoot:e,branch:t})=>{let n=await Ue({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):i(n.stderr.trim()||`Unable to inspect branch ${t}`)},Dr=e=>{try{return Nn.realpathSync.native(e)}catch{return Cn.resolve(e)}},qd=async({repoRoot:e,worktreeRoot:t})=>{let n=await W({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let r=Dr(t),o=n.value.stdout.split(`
9
+ `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Dr).includes(r);return l("Checked worktree registration",o)},yi=async e=>{let t=await Ue({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Ho=async e=>{let t=await W({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?i(t.message):l("Resolved current branch",t.value.stdout.trim())},Vd=async e=>{let t=await W({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?i(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},zd=e=>e.includes("fetch first")||e.includes("non-fast-forward"),vf=async e=>(await Ue({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1),Wd=async e=>{let t=await Ue({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},bi=e=>/could not resolve host/i.test(e)||/connection refused|connection timed out|operation timed out/i.test(e)||/network is unreachable|no route to host/i.test(e)||/failed to connect to/i.test(e),yf=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),Ii=async({cwd:e,branch:t})=>{let n=await vf(e);if(a(n))return i(n.message);let r=await Wd(e),o=await he.fetch({cwd:e,remote:nt,branch:t});if(a(o))return yf(o.message)?l("Remote branch missing, skipped pull",!1):i(`Failed to fetch ${t}
10
+ ${o.message}`);let s=await he.rebaseOnto({cwd:e,ref:`${nt}/${t}`});if(a(s))return i(`Failed during rebase
11
+ ${s.message}`);let d=await Wd(e),c=r!==null&&d!==null&&r!==d;return l(c?"Pulled with rebase":"Already up to date",c)},Kd=async e=>{let t=await Ue({args:["rev-list","--count","@{u}..HEAD"],cwd:e});return t.exitCode!==0?l("No upstream to compare against",!1):l("Compared against upstream",Number(t.stdout.trim())>0)},Yd=async e=>{let t=await Ue({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?i(t.stderr.trim()||"Unable to inspect the worktree for changes"):l("Inspected worktree for changes",t.stdout.trim().length>0)},Xd=async(e,t)=>{let n=await Ue({args:["diff","--cached","--quiet",...t?.length?["--",...t]:[]],cwd:e});return n.exitCode===0?l("No staged changes",!1):n.exitCode===1?l("Has staged changes",!0):i(n.stderr.trim()||"Unable to inspect staged changes")},Jd=async e=>{let t=await Ho(e);return a(t)?i(t.message):l("Checked detached HEAD state",t.value==="HEAD")}});import en from"node:fs";import rt from"node:path";var Zd,ec,tc,nc,Wo,Ne,bf,Qd,Br,Go,rc,xi,Ei,oc,sc,mt,cE,pt=v(()=>{"use strict";Ft();N();_o();ne();Hd();Rt();ut();Zd="4b825dc642cb6eb9a060e54bf8d69288fbee4904",ec=e=>rt.join($e,tn,e),tc=()=>rt.join($e,Ri),nc=Sn,Wo=()=>rt.join(nc(),"worktrees"),Ne=({repoRoot:e})=>{let t=Lr(e);return a(t)?i(t.message):l("Resolved state branch root",rt.join(Wo(),t.value))},bf=e=>rt.join(e,$e),Qd=e=>rt.join(bf(e),tn),Br=e=>{try{return en.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return i(t instanceof Error?t.message:String(t))}},Go=()=>{let e=nc(),t=Wo(),n=!en.existsSync(e)||!en.existsSync(t),r=Br(e);if(a(r))return i(`Ensure epiq home failed.
12
+ `+r.message);let o=Br(t);return a(o)?i(`Ensure worktrees dir failed.
13
+ `+o.message):l("Ensured epiq storage",n)},rc=e=>{en.existsSync(e)&&(X.debug("[sync] remove path",e),en.rmSync(e,{recursive:!0,force:!0}))},xi=`*.jsonl merge=union
14
+ `,Ei=()=>rt.join($e,tn,".gitattributes"),oc=(e,t)=>{for(let r of[Qd(e),Qd(t)]){let o=Br(r);if(a(o))return i(o.message)}let n=rt.join(t,Ei());try{en.readFileSync(n,"utf8")!==xi&&en.writeFileSync(n,xi)}catch{en.writeFileSync(n,xi)}return l("Ensured state branch",void 0)},sc=async e=>{let t=await W({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return i(`ensure state branch is storage only failed
15
15
  `+t.message);let r=t.value.stdout.trim().split(`
16
- `).filter(Boolean).filter(d=>d!==He);if(r.length===0)return c("State branch is storage-only",!1);let o=await H({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return i(`Failed to clean storage branch
17
- ${o.message}`);let s=await qn({cwd:e,message:"[epiq:repair-storage-branch]",pathspec:r});return a(s)?i(s.message):c("Cleaned storage branch",!0)},ut=si(async(e=process.cwd())=>{let t=await H({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?i("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>st.resolve(e)),pI=si(async e=>{let t=await H({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return i(t.message);let n=t.value.stdout.trim(),r=st.isAbsolute(n)?n:st.join(e,n);return c("Resolved git dir",r)},e=>st.resolve(e))});import Tr from"node:fs";import St from"node:path";var xI,He,Zt,gi,Og,Nr,ko,wr,Uo,_d,Bg,Mr,$o,_g,Qe,Ud,Ct,pe=y(()=>{"use strict";C();mt();Lo();xI=process.env.IS_LOCAL==="true",He=".epiq",Zt="events",gi="media",Og="project.json",Nr=e=>St.join(e,He),ko=e=>St.join(Nr(e),Og),wr=e=>St.join(Nr(e),Zt),Uo=e=>St.join(Nr(e),gi),_d=e=>St.join(e,He),Bg=e=>{let t=St.join(e,He);return Tr.existsSync(t)&&Tr.statSync(t).isDirectory()},Mr=e=>{let t=ko(e);return Tr.existsSync(t)&&Tr.statSync(t).isFile()},$o=e=>{let t=St.resolve(e);for(;;){if(Bg(t))return c("Resolved closest .epiq root",t);let n=St.dirname(t);if(n===t)return i("No .epiq directory found in any parent");t=n}},_g="No .epiq/project.json found in any parent",Qe=e=>{let t=St.resolve(e);for(;;){if(Mr(t))return c("Resolved closest epiq project root",t);let n=St.dirname(t);if(n===t)return i(_g);t=n}},Ud=e=>{let t=wr(e);try{return Tr.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return i(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},Ct=async()=>{let e=await ut(process.cwd());if(a(e))return e;let t=Ce({repoRoot:e.value});return a(t)?t:c("Resolved persist root",t.value)}});import kr from"fs";import yi from"path";import Ug from"util";function jg(){let e=Hd();if(!e||!kr.existsSync(e))return;let n=kr.readFileSync(e,"utf8").split(`
18
- `);if(n[n.length-1]===""&&n.pop(),n.length<=$d)return;let r=n.slice(-$d).join(`
16
+ `).filter(Boolean).filter(d=>d!==$e);if(r.length===0)return l("State branch is storage-only",!1);let o=await W({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return i(`Failed to clean storage branch
17
+ ${o.message}`);let s=await er({cwd:e,message:"[epiq:repair-storage-branch]",pathspec:r});return a(s)?i(s.message):l("Cleaned storage branch",!0)},mt=fi(async(e=process.cwd())=>{let t=await W({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?i("Not inside a Git repository"):l("Resolved repo root",t.value.stdout.trim())},e=>rt.resolve(e)),cE=fi(async e=>{let t=await W({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return i(t.message);let n=t.value.stdout.trim(),r=rt.isAbsolute(n)?n:rt.join(e,n);return l("Resolved git dir",r)},e=>rt.resolve(e))});import Fr from"node:fs";import St from"node:path";var hE,$e,tn,Ri,If,Rn,Fo,An,qo,ic,xf,_r,Vo,Ef,Xe,ac,Nt,ne=v(()=>{"use strict";N();pt();_o();hE=process.env.IS_LOCAL==="true",$e=".epiq",tn="events",Ri="media",If="project.json",Rn=e=>St.join(e,$e),Fo=e=>St.join(Rn(e),If),An=e=>St.join(Rn(e),tn),qo=e=>St.join(Rn(e),Ri),ic=e=>St.join(e,$e),xf=e=>{let t=St.join(e,$e);return Fr.existsSync(t)&&Fr.statSync(t).isDirectory()},_r=e=>{let t=Fo(e);return Fr.existsSync(t)&&Fr.statSync(t).isFile()},Vo=e=>{let t=St.resolve(e);for(;;){if(xf(t))return l("Resolved closest .epiq root",t);let n=St.dirname(t);if(n===t)return i("No .epiq directory found in any parent");t=n}},Ef="No .epiq/project.json found in any parent",Xe=e=>{let t=St.resolve(e);for(;;){if(_r(t))return l("Resolved closest epiq project root",t);let n=St.dirname(t);if(n===t)return i(Ef);t=n}},ac=e=>{let t=An(e);try{return Fr.mkdirSync(t,{recursive:!0}),l("Resolved events dir",t)}catch(n){return i(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},Nt=async()=>{let e=await mt(process.cwd());if(a(e))return e;let t=Ne({repoRoot:e.value});return a(t)?t:l("Resolved persist root",t.value)}});import gt from"fs";import Ti from"path";import Rf from"util";function Af(e){if(!gt.existsSync(e))return;let t=gt.statSync(e).size,n=Cf(e,wi).split(`
18
+ `);if(n[n.length-1]===""&&n.pop(),t<=wi&&n.length<=dc)return;let r=n.slice(-dc).join(`
19
19
  `)+`
20
- `;kr.writeFileSync(e,r,"utf8")}function hi(e,t,n=!1){let r=Hd();if(!r)return;let o=Ug.format(...t),s=new Date,l=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
21
- `;kr.mkdirSync(yi.dirname(r),{recursive:!0}),kr.appendFileSync(r,l,"utf8"),fi++,fi>=$g&&(fi=0,jg())}var $d,$g,fi,jd,Hd,vi,X,Nt=y(()=>{"use strict";C();pe();$d=1e3,$g=50,fi=0,jd=()=>process.env.EPIQ_MCP==="true",Hd=()=>{let e=process.cwd(),t=$o(e);return a(t)?jd()?yi.join(process.cwd(),".epiq-mcp.log"):void 0:yi.join(t.value,He,"log","epiq.log")};vi=()=>jd()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",X={info(...e){let t=vi();(t==="info"||t==="debug")&&hi("[Info]",e,!1)},debug(...e){vi()==="debug"&&hi("[Debug]",e,!0)},error(...e){let t=vi();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;hi("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=X});var se,Vn=y(()=>{"use strict";se={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"}});var K,Lr,en=y(()=>{"use strict";K=e=>e.slice(-7).toUpperCase(),Lr=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?K(e).includes(n):!0}});var Ae,Sn=y(()=>{"use strict";he();en();Ae={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:B.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{ref:K(e)},context:B.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:B.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:s="horizontal",isVirtual:d=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:B.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:d}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:B.FIELD_LIST,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{ref:K(e)},context:B.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!0,isVirtual:s=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:B.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:s=!0,isVirtual:d=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:B.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:d})}});var Hg,Ie,jo,zn=y(()=>{"use strict";Hg=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ie,jo]=Hg});function tn(e,t=!1){let n=Yg[e.action];if(!n)return i(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);if(!At()&&e.action!=="init.workspace")return L(`${e.action} arrived before the workspace was initialized`,e);if(e.action==="init.workspace"&&We){if(We.genesisApplied)return L("the workspace is already initialized",e);We.genesisApplied=!0}let r;try{r=n(e)}catch(s){return L(`threw while materializing (${s instanceof Error?s.message:String(s)})`,e)}if(a(r))return r;let o=Kg(e,t);return o||r}var bi,L,Dr,Cn,An,Wd,Gd,Wg,Gg,xi,qg,Vg,We,zg,Kg,Pr,Yg,_t,Ut=y(()=>{"use strict";Nt();he();C();Vn();ge();Sn();k();Ii();zn();bi=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),L=(e,t)=>({...bi(e,t),convergence:!0}),Dr=e=>a(e)&&e.convergence===!0,Cn=e=>{let t=e.filter(a);return{fatal:t.filter(n=>!Dr(n)),skipped:t.filter(Dr)}},An=e=>{e.length!==0&&X.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},Wd=e=>{let t=x.getNode(e);if(!t||!P(t)||t.isDeleted)return null;let n=Ho(t);return a(n)?n:null},Gd=e=>{if(!Wo())return null;for(let t of e){let n=Wd(t);if(n)return n;let r=g().nodes[t]?.parentNodeId;if(!r)continue;let o=Wd(r);if(o)return o}return null},Wg=(e,t)=>{let n=x.getNode(e);n&&x.updateNode({...n,log:[...n.log??[],t]})},Gg=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},xi=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":case"add.issue.attachment":case"delete.issue.attachment":return[e.payload.issue];case"delete.node":case"edit.description":return Gg(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"tombstone.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"link.contributor.user":default:return[]}},qg=e=>{ie(t=>({...t,eventLog:[...t.eventLog,e]}))},Vg=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?bi("Invalid user ID format",e):c("Valid user",null)},We=null,zg=e=>{for(let[t,n]of e.nodeLog){let r=x.getNode(t);r&&x.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&ie(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),Gd([...e.virtualNodeIds])},Kg=(e,t)=>{let n=Vg(e);if(a(n))return n;let r=[...new Set(xi(e))];if(We){for(let s of r){if(!t){let d=We.nodeLog.get(s);d?d.push(e):We.nodeLog.set(s,[e])}if(Wo()){We.virtualNodeIds.add(s);let d=g().nodes[s]?.parentNodeId;d&&We.virtualNodeIds.add(d)}}return t||We.appLog.push(e),null}t||(r.forEach(s=>Wg(s,e)),qg(e));let o=Gd(r);return o||null},Pr=(e,t,n)=>x.getNode(e)?L(`a node with id ${e} already exists`,n):t===e?L("a node cannot be its own parent",n):null,Yg={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Ae.workspace(t,n,r),s=Fr(o);if(a(s))return bi(s.message,e);let d=x.createNode(o);return a(d)?L(d.message??"Failed to initialize workspace",e):ri(d.value)?c("Workspace initialized",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Pr(t,void 0,e);if(o)return o;let s=x.createNode(Ae.workspace(t,n,r));return a(s)?L(s.message??"Failed to add workspace",e):ri(s.value)?c("Added workspace",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=Pr(t,r,e);if(s)return s;let d=x.createNode(Ae.board(t,n,r,o));return a(d)?L(d.message??"Unable to create board",e):Co(d.value)?c("Added board",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=Pr(t,r,e);if(s)return s;let d=x.createNode(Ae.swimlane(t,n,r,o));return a(d)?L(d.message??"Unable to create swimlane",e):xn(d.value)?c("Added swimlane",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=Pr(t,r,e);if(s)return s;let d=x.createNode(Ae.ticket(t,n,r,o));return a(d)?L(d.message??"Unable to create issue",e):P(d.value)?c("Added issue",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,d=Pr(t,r,e);if(d)return d;let l=x.createNode(Ae.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(se.DESCRIPTION)?"vertical":"horizontal"}));return a(l)?L(l.message??`Unable to create field: ${n}`,e):Je(l.value)?c("Added field",{action:e.action,result:l.value}):i("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!x.getNode(t))return L(`Unable to locate node with id ${t}`,e);let o=x.renameNode(t,n);return a(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=x.tombstoneNode(t);return a(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=x.createTag({id:t,name:n});return a(r)?L(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"tombstone.tag":e=>{let{id:t}=e.payload,n=x.tombstoneTag(t);return a(n)?L(n.message??"Unable to delete tag",e):c("Tag tombstoned",{action:e.action,result:n.value})},"restore.tag":e=>{let{id:t,name:n}=e.payload,r=x.restoreTag(t,n);return a(r)?L(r.message??"Unable to restore tag",e):c("Tag restored",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=x.createContributor({id:t,name:n});return a(r)?L(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,r=x.renameContributor(t,n);return a(r)?L(r.message??"Unable to rename contributor",e):c("Contributor renamed",{action:e.action,result:r.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=x.tombstoneContributor(t);return a(n)?L(n.message??"Unable to remove contributor",e):c("Contributor tombstoned",{action:e.action,result:n.value})},"restore.contributor":e=>{let{id:t,name:n}=e.payload,r=x.restoreContributor(t,n);return a(r)?L(r.message??"Unable to restore contributor",e):c("Contributor restored",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=x.tag(t,n);return a(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=x.untag(t,n);return a(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=x.assign(t,n);return a(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=x.unassign(t,n);return a(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=x.moveNodeToRank({id:t,parentId:n,rank:r});return a(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=x.editValue(t,n);return a(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=x.getNode(t);if(!o)return L("Unable to locate issue",e);if(!P(o))return L("Can only close issues",e);let s=x.getNode(Ie);if(!s)return L("Unable to locate target swimlane",e);if(n!==s.id)return L("Close target must be closed swimlane",e);let d=x.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?L(d.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=x.getNode(t);if(!o)return L("Unable to locate issue",e);if(!P(o))return L("Can only reopen issues",e);let s=x.getNode(Ie);if(!s)return L("Unable to locate closed swimlane",e);if(n===s.id)return L("Cannot reopen issue into closed swimlane",e);if(!x.getNode(n))return L("Reopen parent no longer exists",e);let l=x.moveNodeToRank({id:t,parentId:n,rank:r});return a(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=x.lockNode(t);return a(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 s=x.getNode(r);if(!s)return L(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return L(`Node ${r} is not child of ${t}`,e);let d=x.updateNode({...s,rank:o});if(a(d))return L(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:r,md:o}=e.payload,s=x.createComment({id:t,issue:n,authorId:r,authorName:x.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return a(s)?L(s.message??"Unable to add comment",e):c("Comment added",{action:e.action,result:{id:t,issue:n,author:r,md:o}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:r}=e.payload,o=x.getComment(t);if(!o)return L("Unable to locate comment",e);if(o.issue!==n)return L("Comment does not belong to issue",e);let s=x.editComment(t,r);return a(s)?L(s.message??"Unable to edit comment",e):c("Comment edited",{action:e.action,result:{id:t,issue:n,md:r}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,r=x.getComment(t);if(!r)return L("Unable to locate comment",e);if(r.issue!==n)return L("Comment does not belong to issue",e);let o=x.deleteComment(t);return a(o)?L(o.message??"Unable to delete comment",e):c("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"add.issue.attachment":e=>{let{id:t,issue:n,hash:r,ext:o,name:s,bytes:d}=e.payload,l=x.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:d,deleted:!1});return a(l)?L(l.message??"Unable to add attachment",e):c("Attachment added",{action:e.action,result:{id:t,issue:n,hash:r}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,r=x.getAttachment(t);if(!r)return L("Unable to locate attachment",e);if(r.issue!==n)return L("Attachment does not belong to issue",e);let o=x.deleteAttachment(t);return a(o)?L(o.message??"Unable to delete attachment",e):c("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=x.linkUserId({contributorId:t,userId:e.userId});return a(n)?L(n.message??"Unable to link contributor",e):c("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};_t=e=>{let t=qd(()=>{let n=We===null;n&&(We={appLog:[],nodeLog:new Map,virtualNodeIds:new Set,genesisApplied:!1});try{let r=e.map(o=>tn(o));if(n&&We){let o=zg(We);if(o)return e.map(()=>o)}return r}finally{n&&(We=null)}});return a(t)?e.map(()=>i(t.message)):t.value}});var Ei,Vd=y(()=>{"use strict";Ei=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown"});var Xg,Jg,zd,Kd,Ri=y(()=>{"use strict";Xg=["init.workspace","add.workspace","add.board","add.swimlane","add.issue","add.field","edit.title","delete.node","create.tag","tombstone.tag","restore.tag","create.contributor","rename.contributor","tombstone.contributor","restore.contributor","add.issue.assignee","remove.issue.assignee","add.issue.tag","remove.issue.tag","move.node","edit.description","add.issue.comment","edit.issue.comment","delete.issue.comment","add.issue.attachment","delete.issue.attachment","close.issue","reopen.issue","lock.node","rebalance.children","link.contributor.user"],Jg=new Set(Xg),zd=e=>Jg.has(e),Kd=e=>({action:e.action,payload:e.payload})});import{z as W}from"zod";var j,pt,nn,Go,Ni,Qg,Yd,Xd=y(()=>{"use strict";C();j=W.string().min(1),pt=W.string(),nn=W.string(),Go=W.looseObject({id:j}),Ni=W.looseObject({id:j,name:pt,parent:j,rank:nn}),Qg={"init.workspace":W.looseObject({id:j,name:pt,rank:nn}),"add.workspace":W.looseObject({id:j,name:pt,rank:nn}),"add.board":Ni,"add.swimlane":Ni,"add.issue":Ni,"add.field":W.looseObject({id:j,name:pt,parent:j,rank:nn}),"edit.title":W.looseObject({id:j,name:pt}),"delete.node":Go,"lock.node":Go,"move.node":W.looseObject({id:j,parent:j,rank:nn}),"edit.description":W.looseObject({id:j,md:W.string()}),"close.issue":W.looseObject({id:j,parent:j,rank:nn}),"reopen.issue":W.looseObject({id:j,parent:j,rank:nn}),"create.tag":W.looseObject({id:j,name:pt}),"tombstone.tag":Go,"restore.tag":W.looseObject({id:j,name:pt}),"create.contributor":W.looseObject({id:j,name:pt}),"rename.contributor":W.looseObject({id:j,name:pt}),"tombstone.contributor":Go,"restore.contributor":W.looseObject({id:j,name:pt}),"link.contributor.user":W.looseObject({contributor:j}),"add.issue.assignee":W.looseObject({id:j,assignee:j}),"remove.issue.assignee":W.looseObject({id:j,assignee:j}),"add.issue.tag":W.looseObject({id:j,tag:j}),"remove.issue.tag":W.looseObject({id:j,tag:j}),"add.issue.comment":W.looseObject({id:j,issue:j,md:W.string()}),"edit.issue.comment":W.looseObject({id:j,issue:j,md:W.string()}),"delete.issue.comment":W.looseObject({id:j,issue:j}),"add.issue.attachment":W.looseObject({id:j,issue:j,hash:W.string().min(1),ext:W.string().min(1),name:pt,bytes:W.number()}),"delete.issue.attachment":W.looseObject({id:j,issue:j}),"rebalance.children":W.looseObject({parent:j,ranks:W.record(W.string(),nn)})},Yd=(e,t)=>{let r=Qg[e].safeParse(t);return r.success?c("Payload is readable",void 0):i(`${e}: ${r.error.issues.map(o=>`${o.path.join(".")||"payload"} ${o.message}`).join(", ")}`)}});import Vo from"node:fs";import zo from"node:path";import{decodeTime as Zg}from"ulid";import{z as Si}from"zod";function Or(e,t){let n=wr(e);if(!Vo.existsSync(n))return c("No events found",[]);let r=Vo.readdirSync(n).filter(s=>s.endsWith(".jsonl")).map(s=>zo.join(n,s)),o=[];for(let s of r){let d=cf(s,t);if(a(d))return i(d.message);o.push(...d.value)}return c("All events loaded",uf(o))}function $t(e){let t=[],n=Or(e,t);if(a(n))return i(n.message);let r=Ai(n.value,t);return a(r)?i(r.message):(lf=t,c("Loaded merged events",{events:r.value,unreadable:t}))}function Ti(e){let t=Or(e);return a(t)?i(t.message):c("Loaded event actors",t.value.map(({userId:n,userName:r})=>({userId:n,userName:r})))}function Kn(e){let t=$t(e);return a(t)?i(t.message):c("Loaded merged events",t.value.events)}function wi(e,t){let n=Or(e);if(a(n))return i(n.message);let{appliedEvents:r,unappliedEvents:o}=mf(n.value,t),s=Ai(r);if(a(s))return i(s.message);let d=Ai(o);return a(d)?i(d.message):c("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:d.value})}function Jd(e=process.cwd()){let t=Or(e);return a(t)?i(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}function Mi(e){let t=Or(e);if(a(t))return i(t.message);let n=Qd(t.value);return c("Loaded effective event times",new Map(t.value.map((r,o)=>[r.id[0],n[o]??null])))}var ef,qo,tf,nf,rf,of,sf,af,df,Ai,cf,lf,Ci,uf,Qd,mf,rn=y(()=>{"use strict";Nt();C();pe();dt();Ri();gt();Xd();ef=Si.object({userId:Si.string().min(1).default("unknown"),userName:Si.string().min(1).default("unknown")}),qo=e=>{let t=Object.entries(e).filter(([o])=>o!=="id"&&o!=="v"&&o!=="userId"&&o!=="userName");if(t.length!==1)return null;let n=t[0]?.[1];if(typeof n!="object"||n===null)return null;let r=n.id;return typeof r=="string"&&r.length>0?r:null},tf=/^[0-9a-hjkmnp-tv-z]{26}$/i,nf=e=>tf.test(e)?e.toUpperCase():e,rf=e=>{let t=zo.basename(e,".jsonl"),n=t.indexOf("."),r=n===-1?t:t.slice(0,n),o=n===-1?void 0:t.slice(n+1),s=ef.safeParse({userId:nf(r),userName:o});return s.success?c("Parsed event file actor",s.data):i(`Invalid event file name ${zo.basename(e)}: ${s.error.issues.map(d=>d.path.join(".")||d.message).join(", ")}`)},of=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?i(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?i("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},sf=(e,t)=>t in e,af=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),df=e=>{let{userId:t,userName:n,...r}=e,o=of(r);if(a(o))return i(o.message);let s=o.value,d=e.id?.[0];return d?sf(r,s)?c("Decoded persisted event",af({id:d,action:s,payload:r[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},Ai=(e,t)=>{let n=[],r=new Map,o=new Map;for(let s of e){if(!ec(s.v)){o.set(s.v,(o.get(s.v)??0)+1),t?.push({eventId:s.id[0],reason:"unsupported-schema-version",detail:`v${s.v}`,targetNodeId:qo(s)});continue}let d=df(s);if(a(d)){t?.push({eventId:s.id[0],reason:"invalid-payload",detail:d.message,targetNodeId:qo(s)});continue}let l=d.value.action;if(!zd(l)){r.set(l,(r.get(l)??0)+1),t?.push({eventId:s.id[0],reason:"unknown-action",detail:l,targetNodeId:qo(s)});continue}let u=Yd(l,d.value.payload);if(a(u)){t?.push({eventId:s.id[0],reason:"invalid-payload",detail:u.message,targetNodeId:qo(s)});continue}n.push(d.value)}if(r.size>0){let s=[...r.entries()].map(([d,l])=>`${d} (x${l})`).join(", ");X.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${s}. Upgrade to apply them.`)}if(o.size>0){let s=[...o.entries()].map(([d,l])=>`v${d} (x${l})`).join(", ");X.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${s}. Upgrade to apply them.`)}return c("Decoded reconstructed events",n)},cf=(e,t)=>{if(!Vo.existsSync(e))return c("Event file missing",[]);let n=rf(e);if(a(n))return i(n.message);let r=Vo.readFileSync(e,"utf8"),o=[],s=zo.basename(e),d=(l,u)=>{t?.push({eventId:null,reason:"corrupt-line",detail:`${s}:${l} (${u})`,targetNodeId:null})};for(let[l,u]of r.split(`
22
- `).entries()){let m=u.trim();if(!m)continue;let p;try{p=JSON.parse(m)}catch{d(l+1,"invalid JSON");continue}let f=Zd(p);if(a(f)){d(l+1,f.message);continue}o.push({...f.value,userId:n.value.userId,userName:n.value.userName})}return c("Parsed persisted events file",o)};lf=[];Ci=(e,t)=>{let n=e.id[0].localeCompare(t.id[0]);return n!==0?n:JSON.stringify(e).localeCompare(JSON.stringify(t))},uf=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],f=m.id[1]??null;t.set(p,m);let I=n.get(f)??[];I.push(m),n.set(f,I)}for(let m of n.values())m.sort(Ci);let r=[],o=new Set,s=m=>{let p=[m];for(;p.length>0;){let f=p.pop(),I=f.id[0];if(o.has(I))continue;r.push(f),o.add(I);let N=n.get(I)??[];for(let A=N.length-1;A>=0;A--)p.push(N[A])}},d=(n.get(null)??[]).filter(m=>{let p=Object.keys(m).filter(f=>f!=="id"&&f!=="v"&&f!=="userId"&&f!=="userName");return p.length===1&&p[0]==="init.workspace"});for(let m of d)s(m);let l=e.filter(m=>{let p=m.id[0],f=m.id[1]??null;return o.has(p)?!1:f===null||!t.has(f)}).sort(Ci);for(let m of l)s(m);let u=e.filter(m=>!o.has(m.id[0])).sort(Ci);for(let m of u)s(m);return r},Qd=e=>vr(e.map(t=>{try{return Zg(t.id[0])}catch{return null}}));mf=(e,t)=>{let n=new Set,r=[],o=[],s=Qd(e);for(let d=0;d<e.length;d++){let l=e[d],u=l.id[0],m=l.id[1],p=s[d]??null;!(p!==null&&p<t)||m&&n.has(m)?(n.add(u),o.push(l)):r.push(l)}return{appliedEvents:r,unappliedEvents:o}}});import pf from"node:fs";import gf from"node:path";import{decodeTime as ff,monotonicFactory as hf}from"ulid";import{z as Tn}from"zod";function Ko({event:e,rootDir:t,edge:n}){try{let r=Ud(t);if(a(r))return r;let o=Sf(t,{userId:e.userId,userName:e.userName});if(a(o))return o;let s;if(n&&n.current!==void 0)s=n.current;else{let u=Jd(t);if(a(u))return i(u.message);s=u.value}let d=s?tc(bf(s)):tc(),l=Cf(Kd(e),[d,s]);return a(l)?i(l.message):(pf.appendFileSync(o.value,`${JSON.stringify(l.value)}
23
- `,"utf8"),n&&(n.current=d),c("Event persisted",{path:o.value,entry:l.value}))}catch(r){let o=r instanceof Error?r.message:"Unknown persist error";return i(`Failed to persist event: ${o}`)}}var nc,tc,vf,yf,bf,rc,xf,If,Zd,Ef,Rf,ec,Nf,ve,wn,Sf,Cf,gt=y(()=>{"use strict";Nt();hr();C();Ue();pe();Vd();dt();rn();Ri();nc=1,tc=hf(),vf=0xffffffffffff,yf=No,bf=e=>{let t=Date.now(),n;try{n=ff(e)}catch{return t}return n>=vf?t:n>t+yf?(X.error("[persist] edge id is too far in the future; seeding from the wall clock instead",{edgeRef:e,edgeTime:n,now:t}),t):Math.max(t,n+1)},rc=Tn.tuple([Tn.string().min(1),Tn.string().min(1).nullable()]),xf=Tn.looseObject({v:Tn.literal(nc),id:rc}),If=Tn.looseObject({v:Tn.number().int().positive(),id:rc}),Zd=e=>{let t=If.safeParse(e);return t.success?c("Parsed persisted event envelope",t.data):i(`Invalid persisted event envelope: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Ef=[1],Rf=new Set(Ef),ec=e=>Rf.has(e),Nf=e=>{let t=xf.safeParse(e);return t.success?c("Parsed persisted event",t.data):i(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ve=()=>{let{userName:e,userId:t}=xe();return e?t?Ro(t)?fr(e)?c("Successfully resolved actor ID",{userId:t,userName:e}):i("Invalid user name in config"):i("Invalid user ID in config"):i("User ID not configured"):i("User name not configured")},wn=({userId:e,userName:t})=>`${Ei(e)}.${Ei(t)}.jsonl`,Sf=(e,{userId:t,userName:n})=>{let r=wn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return i(`Invalid event log file name: ${r}`);let s=gf.join(wr(e),r);return c("Successfully resolved event log path",s)},Cf=(e,t)=>{let n={[e.action]:e.payload,v:nc,id:t};return Nf(n)}});import{ulid as Af}from"ulid";function oc(e,t,n){let r=tn(e);if(r.status!==Ft.Success)return r;let o=Ko({event:e,rootDir:t,edge:n});return a(o)?o:r}function O(e,t){if(e.length===0||!e[0])return i("No events provided");if(g().readOnly)return i(g().readOnlyReason??"Cannot change the board while time travelling");let n={},r=Tf(e[0],t,n);if(a(r))return r;let o=e.map(d=>oc(d,t,n)),s=o.filter(a);return s.length>0?i("Materialize and persist failed: "+s.map(d=>d.message).join(", ")):c("Materialization succeeded",o.map(d=>d.value))}var Tf,Mn=y(()=>{"use strict";C();ge();k();Ut();gt();Tf=(e,t,n)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return c("Contributor write already in flight",void 0);let r=x.getContributor(e.userId),o={id:Af(),action:r?"rename.contributor":"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName};if(r&&(r.tombstoned||r.name===e.userName))return c("Contributor name is current",void 0);let s=oc(o,t,n);return a(s)?i(s.message):c("Contributor name recorded",void 0)}});var sc,Yo,me,ic,ac,on,kn,Rt=y(()=>{"use strict";yd();Mn();C();k();Gn();sc=e=>Yo(me(e),{at:"end"}),Yo=(e,t={at:"end"})=>{let n=o=>a(o)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n($e(void 0,void 0));let r=()=>n($e(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n($e(void 0,o.rank)):i("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n($e(o.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let o=ic(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let d=o>0?e[o-1]:void 0;return n($e(d?.rank,s.rank))}case"after":{let o=ic(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let d=o<e.length-1?e[o+1]:void 0;return n($e(s.rank,d?.rank))}}},me=e=>Object.values(g().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),ic=(e,t)=>e.findIndex(n=>n.id===t),ac=(e,t,n={at:"end"})=>Yo(me(t).filter(r=>r.id!==e),n),on=(e,t,n,r,o)=>{let s=ac(t,e,n);if(a(s))return s;if(!s.value.needsRebalance)return c("Resolved rank",s.value.rank);let d=oi(e,r);if(a(d))return d;let l=O([d.value],o);if(a(l))return l;let u=ac(t,e,n);return a(u)?u:u.value.needsRebalance?i("Rank rebalance failed to create space"):c("Resolved rank after rebalance",u.value.rank)},kn=(e,t,n)=>{let r=sc(e);if(a(r))return r;if(!r.value.needsRebalance)return c("Resolved rank",r.value.rank);let o=oi(e,t);if(a(o))return o;let s=O([o.value],n);if(a(s))return s;let d=sc(e);return a(d)?d:d.value.needsRebalance?i("Rank rebalance failed to create space"):c("Resolved rank after rebalance",d.value.rank)}});var _,dc,cc,Ze=y(()=>{"use strict";k();_={exit(){process.exit(0)},enterChildNode(){let e=g(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=ae(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||_.navigate({contextNode:o,selectedIndex:ae(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=g();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=ae(n.id),o=r.findIndex(({id:d})=>d===e.id),s=r.length===0?-1:o>=0?o:0;_.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>dc(1),navigateToPreviousItem:()=>dc(-1),navigateToNextContainer:()=>cc(1),navigateToPreviousContainer:()=>cc(-1),navigate:({contextNode:e,selectedIndex:t})=>{E({contextNodeId:e.id,selectedIndex:t})}},dc=e=>{let{selectedIndex:t,contextNode:n}=g(),r=ae(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;_.navigate({selectedIndex:s,contextNode:n})},cc=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=g();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=ae(o.id),d=s.findIndex(I=>I.id===t.id);if(d<0)return;let l=s.at(d+e)??s.at(0);if(!l)return;let u=ae(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),f=u.length?p:-1;_.navigate({contextNode:l,selectedIndex:f})}});var uc,mc,wf,Xo,pc,lc,Mf,gc,fc=y(()=>{"use strict";he();C();Rt();k();Ze();uc=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),mc=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=g();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},wf=e=>{let t=g().nodes[e];return!!t&&!t.isDeleted&&Je(t)&&t.childRenderAxis==="vertical"},Xo=(e,t)=>{let{nodes:n}=g(),r=n[e];if(!r||r.isDeleted)return!1;let o=me(r.id);return _.navigate({contextNode:r,selectedIndex:uc(t,o.length)}),!0},pc=e=>{let{nodes:t}=g(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Xo(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let d=me(o.id).findIndex(l=>l.id===n.id);return d>=0?(_.navigate({contextNode:o,selectedIndex:d}),!0):pc(o.id)},lc=e=>{let{nodes:t}=g(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),pc(n))return!0;n=t[n]?.parentNodeId}return!1},Mf=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},gc=e=>{let{nodes:t,rootNodeId:n}=g();if(wf(e.contextNodeId)&&Xo(e.contextNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(Mf(e.selectedNodeId)&&e.selectedNodeId&&lc(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(Xo(e.contextNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&Xo(e.parentNodeId,e.selectedIndex))return c("Restored navigation to previous parent",null);if(lc(e.contextNodeId))return c("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return i("Unable to restore navigation");let o=me(r.id);return _.navigate({contextNode:r,selectedIndex:uc(e.selectedIndex,o.length)}),c("Restored navigation to root",null)}});import{monotonicFactory as kf,ulid as Tt}from"ulid";function Lf(){let e=Ge();if(a(e))return i("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return i("No workspace found in event log");let[r]=ae(n.id),[o]=r?ae(r.id):[];if(o){let s=t.renderedChildrenIndex?.[o.id]??[];return c("Resolved boot nav target",{contextNode:o,selectedIndex:s.length>0?0:-1})}else return r?c("Resolved boot nav target",{contextNode:r,selectedIndex:0}):c("Resolved boot nav target",{contextNode:n,selectedIndex:0})}function Pf(){let e=Lf();return a(e)?e:_.navigate(e.value)}function hc({userId:e,userName:t}){let n=Br(),r=Br(),o=Br(),s=Br(),d=Br(),l=$e(void 0,void 0);if(a(l))return l;let u=$e(void 0,void 0);if(a(u))return u;let m=$e(u.value,void 0);if(a(m))return m;let p=$e(void 0,void 0);if(a(p))return p;let f=$e(p.value,void 0);if(a(f))return f;let I=$e(f.value,void 0);if(a(I))return I;let N=$e(void 0,void 0);return a(N)?N:c("Created default events",[{id:Tt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:Tt(),userId:e,userName:t,action:"create.contributor",payload:{id:e,name:t}},{id:Tt(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Tt(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Tt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:Tt(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:r,rank:I.value}},{id:Tt(),userId:e,userName:t,action:"add.board",payload:{id:jo,name:"Closed",parent:n,rank:m.value}},{id:Tt(),userId:e,userName:t,action:"add.swimlane",payload:{id:Ie,name:"Closed",parent:jo,rank:N.value}},{id:Tt(),userId:e,userName:t,action:"lock.node",payload:{id:jo}},{id:Tt(),userId:e,userName:t,action:"lock.node",payload:{id:Ie}}])}function sn(e,t=[]){if(Df())return c("Skipped boot while checked out at a historical point",null);if(!e.length){let s=Ae.workspace("temporary-uninitialized-workspace","Workspace","a0"),d=Fr(s);return a(d)?d:(E({hasProjectDefinition:!1,mode:h.DEFAULT}),c("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return i("Initialized Epiq project has no workspace init event");let n=_t(e),{fatal:r,skipped:o}=Cn(n);return r.length>0?i(`Materializing failed:
20
+ `;gt.writeFileSync(e,r,"utf8")}function Ci(e,t,n=!1){let r=Nf();if(!r)return;let o=Tf(Rf.format(...t)),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
21
+ `;try{gt.mkdirSync(Ti.dirname(r),{recursive:!0}),gt.appendFileSync(r,c,"utf8"),Ni++,(Ni>=Sf||gt.statSync(r).size>wi)&&(Ni=0,Af(r))}catch{}}var dc,wi,Si,Sf,Ni,cc,Nf,Cf,Tf,Ai,X,Rt=v(()=>{"use strict";N();ne();dc=500,wi=4*1024*1024,Si=16*1024,Sf=50,Ni=0,cc=()=>process.env.EPIQ_MCP==="true",Nf=()=>{let e=process.cwd(),t=Vo(e);return a(t)?cc()?Ti.join(process.cwd(),".epiq-mcp.log"):void 0:Ti.join(t.value,$e,"log","epiq.log")},Cf=(e,t)=>{let n=gt.statSync(e).size;if(n<=t)return gt.readFileSync(e,"utf8");let r=gt.openSync(e,"r");try{let o=Buffer.alloc(t);gt.readSync(r,o,0,t,n-t);let s=o.toString("utf8"),d=s.indexOf(`
22
+ `);return d===-1?"":s.slice(d+1)}finally{gt.closeSync(r)}};Tf=e=>{if(e.length<=Si)return e;let t=e.length-Si;return`${e.slice(0,Si)} \u2026 [${t} more chars]`};Ai=()=>cc()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",X={info(...e){let t=Ai();(t==="info"||t==="debug")&&Ci("[Info]",e,!1)},debug(...e){Ai()==="debug"&&Ci("[Debug]",e,!0)},error(...e){let t=Ai();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;Ci("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=X});var ie,tr=v(()=>{"use strict";ie={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"}});var z,Ur,nn=v(()=>{"use strict";z=e=>e.slice(-7).toUpperCase(),Ur=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?z(e).includes(n):!0}});var Ce,Tn=v(()=>{"use strict";fe();nn();Ce={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:V.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{ref:z(e)},context:V.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:V.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:s="horizontal",isVirtual:d=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:V.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:d}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:V.FIELD_LIST,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{ref:z(e)},context:V.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!0,isVirtual:s=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:V.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:s=!0,isVirtual:d=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:V.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:d})}});var wf,ye,zo,nr=v(()=>{"use strict";wf=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ye,zo]=wf});function rn(e,t=!1){let n=Bf[e.action];if(!n)return i(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);if(!ot()&&e.action!=="init.workspace")return L(`${e.action} arrived before the workspace was initialized`,e);if(e.action==="init.workspace"&&je){if(je.genesisApplied)return L("the workspace is already initialized",e);je.genesisApplied=!0}let r;try{r=n(e)}catch(s){return L(`threw while materializing (${s instanceof Error?s.message:String(s)})`,e)}if(a(r))return r;let o=Of(e,t);return o||r}var Mi,L,jr,wn,Mn,lc,uc,Mf,kf,ki,Lf,Pf,je,Df,Of,$r,Bf,_t,Ut=v(()=>{"use strict";Rt();fe();N();tr();le();Tn();k();Li();nr();Mi=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),L=(e,t)=>({...Mi(e,t),convergence:!0}),jr=e=>a(e)&&e.convergence===!0,wn=e=>{let t=e.filter(a);return{fatal:t.filter(n=>!jr(n)),skipped:t.filter(jr)}},Mn=e=>{e.length!==0&&X.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},lc=e=>{let t=I.getNode(e);if(!t||!P(t)||t.isDeleted)return null;let n=Ko(t);return a(n)?n:null},uc=e=>{if(!Yo())return null;for(let t of e){let n=lc(t);if(n)return n;let r=f().nodes[t]?.parentNodeId;if(!r)continue;let o=lc(r);if(o)return o}return null},Mf=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},kf=e=>{let t=[e],n=f().nodes[e]?.parentNodeId;return n&&t.push(n),t},ki=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":case"add.issue.attachment":case"delete.issue.attachment":return[e.payload.issue];case"delete.node":case"edit.description":return kf(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"tombstone.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"link.contributor.user":default:return[]}},Lf=e=>{Ie(t=>({...t,eventLog:[...t.eventLog,e]}))},Pf=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?Mi("Invalid user ID format",e):l("Valid user",null)},je=null,Df=e=>{for(let[t,n]of e.nodeLog){let r=I.getNode(t);r&&I.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&Ie(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),uc([...e.virtualNodeIds])},Of=(e,t)=>{let n=Pf(e);if(a(n))return n;let r=[...new Set(ki(e))];if(je){for(let s of r){if(!t){let d=je.nodeLog.get(s);d?d.push(e):je.nodeLog.set(s,[e])}if(Yo()){je.virtualNodeIds.add(s);let d=f().nodes[s]?.parentNodeId;d&&je.virtualNodeIds.add(d)}}return t||je.appLog.push(e),null}t||(r.forEach(s=>Mf(s,e)),Lf(e));let o=uc(r);return o||null},$r=(e,t,n)=>I.getNode(e)?L(`a node with id ${e} already exists`,n):t===e?L("a node cannot be its own parent",n):null,Bf={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Ce.workspace(t,n,r),s=Hr(o);if(a(s))return Mi(s.message,e);let d=I.createNode(o);return a(d)?L(d.message??"Failed to initialize workspace",e):ui(d.value)?l("Workspace initialized",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=$r(t,void 0,e);if(o)return o;let s=I.createNode(Ce.workspace(t,n,r));return a(s)?L(s.message??"Failed to add workspace",e):ui(s.value)?l("Added workspace",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=$r(t,r,e);if(s)return s;let d=I.createNode(Ce.board(t,n,r,o));return a(d)?L(d.message??"Unable to create board",e):Lo(d.value)?l("Added board",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=$r(t,r,e);if(s)return s;let d=I.createNode(Ce.swimlane(t,n,r,o));return a(d)?L(d.message??"Unable to create swimlane",e):In(d.value)?l("Added swimlane",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=$r(t,r,e);if(s)return s;let d=I.createNode(Ce.ticket(t,n,r,o));return a(d)?L(d.message??"Unable to create issue",e):P(d.value)?l("Added issue",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,d=$r(t,r,e);if(d)return d;let c=I.createNode(Ce.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(ie.DESCRIPTION)?"vertical":"horizontal"}));return a(c)?L(c.message??`Unable to create field: ${n}`,e):Ye(c.value)?l("Added field",{action:e.action,result:c.value}):i("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 o=I.renameNode(t,n);return a(o)?L(o.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=I.tombstoneNode(t);return a(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,r=I.createTag({id:t,name:n});return a(r)?L(r.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:r.value})},"tombstone.tag":e=>{let{id:t}=e.payload,n=I.tombstoneTag(t);return a(n)?L(n.message??"Unable to delete tag",e):l("Tag tombstoned",{action:e.action,result:n.value})},"restore.tag":e=>{let{id:t,name:n}=e.payload,r=I.restoreTag(t,n);return a(r)?L(r.message??"Unable to restore tag",e):l("Tag restored",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=I.createContributor({id:t,name:n});return a(r)?L(r.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:r.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,r=I.renameContributor(t,n);return a(r)?L(r.message??"Unable to rename contributor",e):l("Contributor renamed",{action:e.action,result:r.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=I.tombstoneContributor(t);return a(n)?L(n.message??"Unable to remove contributor",e):l("Contributor tombstoned",{action:e.action,result:n.value})},"restore.contributor":e=>{let{id:t,name:n}=e.payload,r=I.restoreContributor(t,n);return a(r)?L(r.message??"Unable to restore contributor",e):l("Contributor restored",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=I.tag(t,n);return a(r)?L(r.message??"Unable to tag issue",e):l("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=I.untag(t,n);return a(r)?L(r.message??"Unable to untag issue",e):l("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=I.assign(t,n);return a(r)?L(r.message??"Unable to assign issue",e):l("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=I.unassign(t,n);return a(r)?L(r.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.moveNodeToRank({id:t,parentId:n,rank:r});return a(o)?L(o.message??"Failed to move node",e):l("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=I.editValue(t,n);return a(r)?L(r.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.getNode(t);if(!o)return L("Unable to locate issue",e);if(!P(o))return L("Can only close issues",e);let s=I.getNode(ye);if(!s)return L("Unable to locate target swimlane",e);if(n!==s.id)return L("Close target must be closed swimlane",e);let d=I.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?L(d.message??"Unable to close issue",e):l("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.getNode(t);if(!o)return L("Unable to locate issue",e);if(!P(o))return L("Can only reopen issues",e);let s=I.getNode(ye);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:r});return a(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 a(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[r,o]of Object.entries(n)){let s=I.getNode(r);if(!s)return L(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return L(`Node ${r} is not child of ${t}`,e);let d=I.updateNode({...s,rank:o});if(a(d))return L(d.message??"Unable to rebalance child",e)}return l("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:r,md:o}=e.payload,s=I.createComment({id:t,issue:n,authorId:r,authorName:I.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return a(s)?L(s.message??"Unable to add comment",e):l("Comment added",{action:e.action,result:{id:t,issue:n,author:r,md:o}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:r}=e.payload,o=I.getComment(t);if(!o)return L("Unable to locate comment",e);if(o.issue!==n)return L("Comment does not belong to issue",e);let s=I.editComment(t,r);return a(s)?L(s.message??"Unable to edit comment",e):l("Comment edited",{action:e.action,result:{id:t,issue:n,md:r}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,r=I.getComment(t);if(!r)return L("Unable to locate comment",e);if(r.issue!==n)return L("Comment does not belong to issue",e);let o=I.deleteComment(t);return a(o)?L(o.message??"Unable to delete comment",e):l("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"add.issue.attachment":e=>{let{id:t,issue:n,hash:r,ext:o,name:s,bytes:d}=e.payload,c=I.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:d,deleted:!1});return a(c)?L(c.message??"Unable to add attachment",e):l("Attachment added",{action:e.action,result:{id:t,issue:n,hash:r}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,r=I.getAttachment(t);if(!r)return L("Unable to locate attachment",e);if(r.issue!==n)return L("Attachment does not belong to issue",e);let o=I.deleteAttachment(t);return a(o)?L(o.message??"Unable to delete attachment",e):l("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=I.linkUserId({contributorId:t,userId:e.userId});return a(n)?L(n.message??"Unable to link contributor",e):l("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};_t=e=>{let t=mc(()=>{let n=je===null;n&&(je={appLog:[],nodeLog:new Map,virtualNodeIds:new Set,genesisApplied:!1});try{let r=e.map(o=>rn(o));if(n&&je){let o=Df(je);if(o)return e.map(()=>o)}return r}finally{n&&(je=null)}});return a(t)?e.map(()=>i(t.message)):t.value}});var Pi,pc=v(()=>{"use strict";Pi=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown"});import{existsSync as Ff,readdirSync as _f,statSync as Uf}from"node:fs";import $f from"node:path";var kn,gc,Di,on,fc,hc,vc,Wr=v(()=>{"use strict";ne();kn=e=>{let t=An(e);return Ff(t)?_f(t).filter(n=>n.endsWith(".jsonl")).sort().map(n=>{let{size:r,mtimeMs:o}=Uf($f.join(t,n));return`${n}:${r}:${o}`}).join("|"):"none"},gc=e=>new Map(e.split("|").filter(Boolean).map(t=>{let n=t.indexOf(":");return[t.slice(0,n),t.slice(n+1)]})),Di=(e,t,n)=>{let r=gc(t),o=kn(e),s=gc(o);for(let[d,c]of s)if(d!==n&&r.get(d)!==c)return null;for(let d of r.keys())if(d!==n&&!s.has(d))return null;return o},on=null,fc=e=>on&&on.root===e?on.signature:null,hc=(e,t)=>{on={root:e,signature:t}},vc=(e,t)=>{if(!on||on.root!==e)return;let n=Di(e,on.signature,t);on=n===null?null:{root:e,signature:n}}});var jf,Hf,yc,bc,Oi=v(()=>{"use strict";jf=["init.workspace","add.workspace","add.board","add.swimlane","add.issue","add.field","edit.title","delete.node","create.tag","tombstone.tag","restore.tag","create.contributor","rename.contributor","tombstone.contributor","restore.contributor","add.issue.assignee","remove.issue.assignee","add.issue.tag","remove.issue.tag","move.node","edit.description","add.issue.comment","edit.issue.comment","delete.issue.comment","add.issue.attachment","delete.issue.attachment","close.issue","reopen.issue","lock.node","rebalance.children","link.contributor.user"],Hf=new Set(jf),yc=e=>Hf.has(e),bc=e=>({action:e.action,payload:e.payload})});import{z as q}from"zod";var j,ft,sn,Xo,Bi,Wf,Ic,xc=v(()=>{"use strict";N();j=q.string().min(1),ft=q.string(),sn=q.string(),Xo=q.looseObject({id:j}),Bi=q.looseObject({id:j,name:ft,parent:j,rank:sn}),Wf={"init.workspace":q.looseObject({id:j,name:ft,rank:sn}),"add.workspace":q.looseObject({id:j,name:ft,rank:sn}),"add.board":Bi,"add.swimlane":Bi,"add.issue":Bi,"add.field":q.looseObject({id:j,name:ft,parent:j,rank:sn}),"edit.title":q.looseObject({id:j,name:ft}),"delete.node":Xo,"lock.node":Xo,"move.node":q.looseObject({id:j,parent:j,rank:sn}),"edit.description":q.looseObject({id:j,md:q.string()}),"close.issue":q.looseObject({id:j,parent:j,rank:sn}),"reopen.issue":q.looseObject({id:j,parent:j,rank:sn}),"create.tag":q.looseObject({id:j,name:ft}),"tombstone.tag":Xo,"restore.tag":q.looseObject({id:j,name:ft}),"create.contributor":q.looseObject({id:j,name:ft}),"rename.contributor":q.looseObject({id:j,name:ft}),"tombstone.contributor":Xo,"restore.contributor":q.looseObject({id:j,name:ft}),"link.contributor.user":q.looseObject({contributor:j}),"add.issue.assignee":q.looseObject({id:j,assignee:j}),"remove.issue.assignee":q.looseObject({id:j,assignee:j}),"add.issue.tag":q.looseObject({id:j,tag:j}),"remove.issue.tag":q.looseObject({id:j,tag:j}),"add.issue.comment":q.looseObject({id:j,issue:j,md:q.string()}),"edit.issue.comment":q.looseObject({id:j,issue:j,md:q.string()}),"delete.issue.comment":q.looseObject({id:j,issue:j}),"add.issue.attachment":q.looseObject({id:j,issue:j,hash:q.string().min(1),ext:q.string().min(1),name:ft,bytes:q.number()}),"delete.issue.attachment":q.looseObject({id:j,issue:j}),"rebalance.children":q.looseObject({parent:j,ranks:q.record(q.string(),sn)})},Ic=(e,t)=>{let r=Wf[e].safeParse(t);return r.success?l("Payload is readable",void 0):i(`${e}: ${r.error.issues.map(o=>`${o.path.join(".")||"payload"} ${o.message}`).join(", ")}`)}});import Qo from"node:fs";import Zo from"node:path";import{decodeTime as Gf}from"ulid";import{z as Fi}from"zod";function Gr(e,t){let n=An(e),r=kn(e);if(!Qo.existsSync(n))return l("No events found",[]);let o=Qo.readdirSync(n).filter(c=>c.endsWith(".jsonl")).map(c=>Zo.join(n,c)),s=[];for(let c of o){let u=Zf(c,t);if(a(u))return i(u.message);s.push(...u.value)}let d=th(s);return $t={root:e,signature:r,edge:d.at(-1)?.id?.[0]??null},l("All events loaded",d)}function jt(e){let t=[],n=Gr(e,t);if(a(n))return i(n.message);let r=Ui(n.value,t);return a(r)?i(r.message):(eh=t,l("Loaded merged events",{events:r.value,unreadable:t}))}function $i(e){let t=Gr(e);return a(t)?i(t.message):l("Loaded event actors",t.value.map(({userId:n,userName:r})=>({userId:n,userName:r})))}function Ln(e){let t=jt(e);return a(t)?i(t.message):l("Loaded merged events",t.value.events)}function ji(e,t){let n=Gr(e);if(a(n))return i(n.message);let{appliedEvents:r,unappliedEvents:o}=nh(n.value,t),s=Ui(r);if(a(s))return i(s.message);let d=Ui(o);return a(d)?i(d.message):l("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:d.value})}function Ec(e=process.cwd()){let t=kn(e);if($t&&$t.root===e&&$t.signature===t)return l("Loaded edge reference, unchanged",$t.edge);let n=Gr(e);return a(n)?i(n.message):l("Loaded edge reference",n.value.at(-1)?.id?.[0]??null)}function Rc(e,t,n){if(!$t||$t.root!==e)return;let r=Di(e,$t.signature,t);$t=r===null?null:{root:e,signature:r,edge:n}}function Hi(e){let t=Gr(e);if(a(t))return i(t.message);let n=Sc(t.value);return l("Loaded effective event times",new Map(t.value.map((r,o)=>[r.id[0],n[o]??null])))}var qf,Jo,Vf,zf,Kf,Yf,Xf,Jf,Qf,Ui,Zf,eh,$t,_i,th,Sc,nh,Ht=v(()=>{"use strict";Rt();N();ne();Wr();ct();Oi();ht();xc();qf=Fi.object({userId:Fi.string().min(1).default("unknown"),userName:Fi.string().min(1).default("unknown")}),Jo=e=>{let t=Object.entries(e).filter(([o])=>o!=="id"&&o!=="v"&&o!=="userId"&&o!=="userName");if(t.length!==1)return null;let n=t[0]?.[1];if(typeof n!="object"||n===null)return null;let r=n.id;return typeof r=="string"&&r.length>0?r:null},Vf=/^[0-9a-hjkmnp-tv-z]{26}$/i,zf=e=>Vf.test(e)?e.toUpperCase():e,Kf=e=>{let t=Zo.basename(e,".jsonl"),n=t.indexOf("."),r=n===-1?t:t.slice(0,n),o=n===-1?void 0:t.slice(n+1),s=qf.safeParse({userId:zf(r),userName:o});return s.success?l("Parsed event file actor",s.data):i(`Invalid event file name ${Zo.basename(e)}: ${s.error.issues.map(d=>d.path.join(".")||d.message).join(", ")}`)},Yf=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?i(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?i("Invalid persisted event: action key is missing or invalid"):l("Resolved persisted action",t[0])},Xf=(e,t)=>t in e,Jf=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Qf=e=>{let{userId:t,userName:n,...r}=e,o=Yf(r);if(a(o))return i(o.message);let s=o.value,d=e.id?.[0];return d?Xf(r,s)?l("Decoded persisted event",Jf({id:d,action:s,payload:r[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},Ui=(e,t)=>{let n=[],r=new Map,o=new Map;for(let s of e){if(!Cc(s.v)){o.set(s.v,(o.get(s.v)??0)+1),t?.push({eventId:s.id[0],reason:"unsupported-schema-version",detail:`v${s.v}`,targetNodeId:Jo(s)});continue}let d=Qf(s);if(a(d)){t?.push({eventId:s.id[0],reason:"invalid-payload",detail:d.message,targetNodeId:Jo(s)});continue}let c=d.value.action;if(!yc(c)){r.set(c,(r.get(c)??0)+1),t?.push({eventId:s.id[0],reason:"unknown-action",detail:c,targetNodeId:Jo(s)});continue}let u=Ic(c,d.value.payload);if(a(u)){t?.push({eventId:s.id[0],reason:"invalid-payload",detail:u.message,targetNodeId:Jo(s)});continue}n.push(d.value)}if(r.size>0){let s=[...r.entries()].map(([d,c])=>`${d} (x${c})`).join(", ");X.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${s}. Upgrade to apply them.`)}if(o.size>0){let s=[...o.entries()].map(([d,c])=>`v${d} (x${c})`).join(", ");X.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${s}. Upgrade to apply them.`)}return l("Decoded reconstructed events",n)},Zf=(e,t)=>{if(!Qo.existsSync(e))return l("Event file missing",[]);let n=Kf(e);if(a(n))return i(n.message);let r=Qo.readFileSync(e,"utf8"),o=[],s=Zo.basename(e),d=(c,u)=>{t?.push({eventId:null,reason:"corrupt-line",detail:`${s}:${c} (${u})`,targetNodeId:null})};for(let[c,u]of r.split(`
23
+ `).entries()){let m=u.trim();if(!m)continue;let p;try{p=JSON.parse(m)}catch{d(c+1,"invalid JSON");continue}let g=Nc(p);if(a(g)){d(c+1,g.message);continue}o.push({...g.value,userId:n.value.userId,userName:n.value.userName})}return l("Parsed persisted events file",o)};eh=[];$t=null;_i=(e,t)=>{let n=e.id[0].localeCompare(t.id[0]);return n!==0?n:JSON.stringify(e).localeCompare(JSON.stringify(t))},th=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],g=m.id[1]??null;t.set(p,m);let x=n.get(g)??[];x.push(m),n.set(g,x)}for(let m of n.values())m.sort(_i);let r=[],o=new Set,s=m=>{let p=[m];for(;p.length>0;){let g=p.pop(),x=g.id[0];if(o.has(x))continue;r.push(g),o.add(x);let S=n.get(x)??[];for(let C=S.length-1;C>=0;C--)p.push(S[C])}},d=(n.get(null)??[]).filter(m=>{let p=Object.keys(m).filter(g=>g!=="id"&&g!=="v"&&g!=="userId"&&g!=="userName");return p.length===1&&p[0]==="init.workspace"});for(let m of d)s(m);let c=e.filter(m=>{let p=m.id[0],g=m.id[1]??null;return o.has(p)?!1:g===null||!t.has(g)}).sort(_i);for(let m of c)s(m);let u=e.filter(m=>!o.has(m.id[0])).sort(_i);for(let m of u)s(m);return r},Sc=e=>Cr(e.map(t=>{try{return Gf(t.id[0])}catch{return null}}));nh=(e,t)=>{let n=new Set,r=[],o=[],s=Sc(e);for(let d=0;d<e.length;d++){let c=e[d],u=c.id[0],m=c.id[1],p=s[d]??null;!(p!==null&&p<t)||m&&n.has(m)?(n.add(u),o.push(c)):r.push(c)}return{appliedEvents:r,unappliedEvents:o}}});import rh from"node:fs";import Tc from"node:path";import{decodeTime as oh,monotonicFactory as sh}from"ulid";import{z as Pn}from"zod";function Wi(e,t){let n;if(t&&t.current!==void 0)n=t.current;else{let o=Ec(e);if(a(o))return i(o.message);n=o.value}let r=n?Ac(dh(n)):Ac();return l("Minted event id",[r,n])}function es({event:e,rootDir:t,edge:n,id:r}){try{let o=ac(t);if(a(o))return o;let s=gh(t,{userId:e.userId,userName:e.userName});if(a(s))return s;let d=r?l("Minted event id",r):Wi(t,n);if(a(d))return i(d.message);let[c,u]=d.value,m=fh(bc(e),[c,u]);if(a(m))return i(m.message);rh.appendFileSync(s.value,`${JSON.stringify(m.value)}
24
+ `,"utf8"),n&&(n.current=c);let p=Tc.basename(s.value);return Rc(t,p,c),vc(t,p),l("Event persisted",{path:s.value,entry:m.value})}catch(o){let s=o instanceof Error?o.message:"Unknown persist error";return i(`Failed to persist event: ${s}`)}}var wc,Ac,ih,ah,dh,Mc,ch,lh,Nc,uh,mh,Cc,ph,ge,Dn,gh,fh,ht=v(()=>{"use strict";Rt();Qn();N();Be();ne();pc();ct();Ht();Wr();Oi();wc=1,Ac=sh(),ih=0xffffffffffff,ah=Mo,dh=e=>{let t=Date.now(),n;try{n=oh(e)}catch{return t}return n>=ih?t:n>t+ah?(X.error("[persist] edge id is too far in the future; seeding from the wall clock instead",{edgeRef:e,edgeTime:n,now:t}),t):Math.max(t,n+1)},Mc=Pn.tuple([Pn.string().min(1),Pn.string().min(1).nullable()]),ch=Pn.looseObject({v:Pn.literal(wc),id:Mc}),lh=Pn.looseObject({v:Pn.number().int().positive(),id:Mc}),Nc=e=>{let t=lh.safeParse(e);return t.success?l("Parsed persisted event envelope",t.data):i(`Invalid persisted event envelope: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},uh=[1],mh=new Set(uh),Cc=e=>mh.has(e),ph=e=>{let t=ch.safeParse(e);return t.success?l("Parsed persisted event",t.data):i(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ge=()=>{let{userName:e,userId:t}=ve();return e?t?wo(t)?Nr(e)?l("Successfully resolved actor ID",{userId:t,userName:e}):i("Invalid user name in config"):i("Invalid user ID in config"):i("User ID not configured"):i("User name not configured")},Dn=({userId:e,userName:t})=>`${Pi(e)}.${Pi(t)}.jsonl`,gh=(e,{userId:t,userName:n})=>{let r=Dn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return i(`Invalid event log file name: ${r}`);let s=Tc.join(An(e),r);return l("Successfully resolved event log path",s)},fh=(e,t)=>{let n={[e.action]:e.payload,v:wc,id:t};return ph(n)}});import{ulid as hh}from"ulid";function kc(e,t,n){let r=Wi(t,n);if(a(r))return i(r.message);let o={...e,id:r.value[0]},s=rn(o);if(s.status!==Ot.Success)return s;let d=es({event:o,rootDir:t,edge:n,id:r.value});return a(d)?d:s}function B(e,t){if(e.length===0||!e[0])return i("No events provided");if(f().readOnly)return i(f().readOnlyReason??"Cannot change the board while time travelling");let n={},r=vh(e[0],t,n);if(a(r))return r;let o=e.map(d=>kc(d,t,n)),s=o.filter(a);return s.length>0?i("Materialize and persist failed: "+s.map(d=>d.message).join(", ")):l("Materialization succeeded",o.map(d=>d.value))}var vh,On=v(()=>{"use strict";N();le();k();Ut();ht();vh=(e,t,n)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return l("Contributor write already in flight",void 0);let r=I.getContributor(e.userId),o={id:hh(),action:r?"rename.contributor":"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName};if(r&&(r.tombstoned||r.name===e.userName))return l("Contributor name is current",void 0);let s=kc(o,t,n);return a(s)?i(s.message):l("Contributor name recorded",void 0)}});var Bn,Gi,Lc=v(()=>{"use strict";nn();Bn=e=>e.trim().toLocaleLowerCase(),Gi=(e,t)=>Bn(e).includes(Bn(t))});var yh,bh,Pc,Dc,Ih,xh,Oc,Bc=v(()=>{"use strict";k();nn();Lc();yh=e=>{let{tags:t}=f();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},bh=e=>{let{contributors:t}=f();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},Pc=null,Dc=new Map,Ih=()=>{let e=f().eventLog??[];if(e===Pc)return Dc;let t=new Map;for(let n of e){if(!n.userId)continue;let r=n.payload;for(let o of[r.id,r.issue]){if(typeof o!="string")continue;let s=t.get(o)??new Set;s.add(n.userId),t.set(o,s)}}return Pc=e,Dc=t,t},xh=e=>{let{contributors:t}=f(),n=Ih().get(e.id);return n?[...n].map(r=>t[r]?.name).filter(r=>!!r):[]},Oc=(e,t)=>{let n=Bn(t.value);if(!n)return!0;switch(t.target){case"title":return Gi(e.title??"",n);case"description":return Gi(e.props.description??"",n);case"tag":return yh(e).map(Bn).some(o=>o.includes(n));case"assignee":return bh(e).map(Bn).some(o=>o.includes(n));case"actor":return xh(e).map(Bn).some(o=>o.includes(n));case"ref":return Ur(e.id,t.value);default:return!0}}});var Fc,Eh,_c,Uc,qi=v(()=>{"use strict";fe();Bc();Fc=(e,t)=>e.rank.localeCompare(t.rank),Eh=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,_c=(e,t)=>Object.values(e).filter(n=>Eh(n,t)).sort(Fc),Uc=(e,t)=>{let n={};for(let r of Object.values(e)){if(P(r)&&t.length>0&&!t.every(s=>Oc(r,s))||!r.parentNodeId||r.isDeleted)continue;let o=n[r.parentNodeId];o?o.push(r):n[r.parentNodeId]=[r]}for(let r of Object.keys(n))n[r].sort(Fc);return n}});var $c,ts,ce,jc,Hc,an,Fn,Et=v(()=>{"use strict";$d();On();N();k();qi();Zn();$c=e=>ts(ce(e),{at:"end"}),ts=(e,t={at:"end"})=>{let n=o=>a(o)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(Fe(void 0,void 0));let r=()=>n(Fe(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Fe(void 0,o.rank)):i("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Fe(o.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let o=jc(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let d=o>0?e[o-1]:void 0;return n(Fe(d?.rank,s.rank))}case"after":{let o=jc(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let d=o<e.length-1?e[o+1]:void 0;return n(Fe(s.rank,d?.rank))}}},ce=e=>{let t=f();if(!Wc()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return _c(t.nodes,e)},jc=(e,t)=>e.findIndex(n=>n.id===t),Hc=(e,t,n={at:"end"})=>ts(ce(t).filter(r=>r.id!==e),n),an=(e,t,n,r,o)=>{let s=Hc(t,e,n);if(a(s))return s;if(!s.value.needsRebalance)return l("Resolved rank",s.value.rank);let d=gi(e,r);if(a(d))return d;let c=B([d.value],o);if(a(c))return c;let u=Hc(t,e,n);return a(u)?u:u.value.needsRebalance?i("Rank rebalance failed to create space"):l("Resolved rank after rebalance",u.value.rank)},Fn=(e,t,n)=>{let r=$c(e);if(a(r))return r;if(!r.value.needsRebalance)return l("Resolved rank",r.value.rank);let o=gi(e,t);if(a(o))return o;let s=B([o.value],n);if(a(s))return s;let d=$c(e);return a(d)?d:d.value.needsRebalance?i("Rank rebalance failed to create space"):l("Resolved rank after rebalance",d.value.rank)}});var U,Gc,qc,Je=v(()=>{"use strict";k();U={exit(){process.exit(0)},enterChildNode(){let e=f(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=ae(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||U.navigate({contextNode:o,selectedIndex:ae(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=f();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=ae(n.id),o=r.findIndex(({id:d})=>d===e.id),s=r.length===0?-1:o>=0?o:0;U.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Gc(1),navigateToPreviousItem:()=>Gc(-1),navigateToNextContainer:()=>qc(1),navigateToPreviousContainer:()=>qc(-1),navigate:({contextNode:e,selectedIndex:t})=>{E({contextNodeId:e.id,selectedIndex:t})}},Gc=e=>{let{selectedIndex:t,contextNode:n}=f(),r=ae(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;U.navigate({selectedIndex:s,contextNode:n})},qc=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=f();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=ae(o.id),d=s.findIndex(x=>x.id===t.id);if(d<0)return;let c=s.at(d+e)??s.at(0);if(!c)return;let u=ae(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),g=u.length?p:-1;U.navigate({contextNode:c,selectedIndex:g})}});var zc,Kc,Rh,ns,Yc,Vc,Sh,Xc,Jc=v(()=>{"use strict";fe();N();Et();k();Je();zc=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Kc=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=f();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},Rh=e=>{let t=f().nodes[e];return!!t&&!t.isDeleted&&Ye(t)&&t.childRenderAxis==="vertical"},ns=(e,t)=>{let{nodes:n}=f(),r=n[e];if(!r||r.isDeleted)return!1;let o=ce(r.id);return U.navigate({contextNode:r,selectedIndex:zc(t,o.length)}),!0},Yc=e=>{let{nodes:t}=f(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return ns(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let d=ce(o.id).findIndex(c=>c.id===n.id);return d>=0?(U.navigate({contextNode:o,selectedIndex:d}),!0):Yc(o.id)},Vc=e=>{let{nodes:t}=f(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Yc(n))return!0;n=t[n]?.parentNodeId}return!1},Sh=e=>{if(!e)return!1;let t=f().nodes[e];return!!t&&!t.isDeleted},Xc=e=>{let{nodes:t,rootNodeId:n}=f();if(Rh(e.contextNodeId)&&ns(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Sh(e.selectedNodeId)&&e.selectedNodeId&&Vc(e.selectedNodeId))return l("Restored navigation to selected node or ancestor",null);if(ns(e.contextNodeId,e.selectedIndex))return l("Restored navigation to previous container",null);if(e.parentNodeId&&ns(e.parentNodeId,e.selectedIndex))return l("Restored navigation to previous parent",null);if(Vc(e.contextNodeId))return l("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return i("Unable to restore navigation");let o=ce(r.id);return U.navigate({contextNode:r,selectedIndex:zc(e.selectedIndex,o.length)}),l("Restored navigation to root",null)}});import{monotonicFactory as Nh,ulid as Ct}from"ulid";function Ch(){let e=He();if(a(e))return i("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return i("No workspace found in event log");let[r]=ae(n.id),[o]=r?ae(r.id):[];if(o){let s=t.renderedChildrenIndex?.[o.id]??[];return l("Resolved boot nav target",{contextNode:o,selectedIndex:s.length>0?0:-1})}else return r?l("Resolved boot nav target",{contextNode:r,selectedIndex:0}):l("Resolved boot nav target",{contextNode:n,selectedIndex:0})}function Ah(){let e=Ch();return a(e)?e:U.navigate(e.value)}function Qc({userId:e,userName:t}){let n=qr(),r=qr(),o=qr(),s=qr(),d=qr(),c=Fe(void 0,void 0);if(a(c))return c;let u=Fe(void 0,void 0);if(a(u))return u;let m=Fe(u.value,void 0);if(a(m))return m;let p=Fe(void 0,void 0);if(a(p))return p;let g=Fe(p.value,void 0);if(a(g))return g;let x=Fe(g.value,void 0);if(a(x))return x;let S=Fe(void 0,void 0);return a(S)?S:l("Created default events",[{id:Ct(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:Ct(),userId:e,userName:t,action:"create.contributor",payload:{id:e,name:t}},{id:Ct(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Ct(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Ct(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:g.value}},{id:Ct(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:r,rank:x.value}},{id:Ct(),userId:e,userName:t,action:"add.board",payload:{id:zo,name:"Closed",parent:n,rank:m.value}},{id:Ct(),userId:e,userName:t,action:"add.swimlane",payload:{id:ye,name:"Closed",parent:zo,rank:S.value}},{id:Ct(),userId:e,userName:t,action:"lock.node",payload:{id:zo}},{id:Ct(),userId:e,userName:t,action:"lock.node",payload:{id:ye}}])}function dn(e,t=[]){if(Th())return l("Skipped boot while checked out at a historical point",null);if(!e.length){let s=Ce.workspace("temporary-uninitialized-workspace","Workspace","a0"),d=Hr(s);return a(d)?d:(E({hasProjectDefinition:!1,mode:h.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return i("Initialized Epiq project has no workspace init event");let n=_t(e),{fatal:r,skipped:o}=wn(n);return r.length>0?i(`Materializing failed:
24
25
  ${r.map(s=>s.message).join(`
25
- `)}`):(An(o),Pf(),E({hasProjectDefinition:!0}),Ff(t),c("State booted successfully",null))}var Br,Df,Ff,_r=y(()=>{"use strict";Nt();Ze();ue();C();Sn();k();Gn();Ut();zn();Br=kf();Df=()=>{let e=Ge();if(a(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},Ff=e=>{if(e.length===0)return;let t=e.filter(r=>r.reason==="corrupt-line"||r.reason==="invalid-payload"),n=e.filter(r=>r.reason==="unsupported-schema-version"||r.reason==="unknown-action");if(n.length>0){let r=[...new Set(n.map(o=>o.detail))].join(", ");X.info(`This build cannot read ${n.length} event(s) in the log (${r}). They are skipped, so anything they changed may be out of date until you upgrade.`)}if(t.length>0){let r=[...new Set(t.map(o=>o.detail))].join(", ");X.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}}});import{WebSocket as Of}from"ws";var Bf,vc,yc=y(()=>{"use strict";Bf=new Set,vc=e=>{let t=JSON.stringify(e);for(let n of Bf)n.readyState===Of.OPEN&&n.send(t)}});var Jo,Qo,Zo,ki,bc,Pe,es=y(()=>{"use strict";yc();C();k();Jo=e=>{At()&&(E({syncStatus:e}),vc({type:"sync-status",payload:e}))},Qo=(e="Syncing...")=>{Jo({status:"syncing",msg:e})},Zo=(e="Synced")=>{Jo({status:"synced",msg:e})},ki=e=>{Jo({status:"failed",msg:e})},bc=e=>{Jo({status:"offline",msg:e})},Pe=e=>(ki(e),i(e))});var Ur,Z,ts=y(()=>{"use strict";C();Ur=(e,t)=>(logger.error(`[boot:${e}] ${t}`),i(`[boot:${e}] ${t}`)),Z=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t)});import wt from"node:fs";import $r from"node:path";var Yn,xc,Ic,Ec,_f,Rc,Uf,$f,Nc,Li=y(()=>{"use strict";lt();C();pe();Yn=e=>e.split(`
26
- `).filter(t=>t.trim().length>0),xc=e=>{let t=$r.join(e,He,Zt);try{if(!wt.existsSync(t))return c("No events directory",[]);let n=wt.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>Yn(wt.readFileSync($r.join(t,r),"utf8")).length>0);return c("Looked for stranded event logs",n)}catch(n){return i(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},Ic=e=>$r.join(e,He,Zt),Ec=e=>{let t=Ic(e),n=new Map;try{if(!wt.existsSync(t))return n;for(let r of wt.readdirSync(t))r.endsWith(".jsonl")&&n.set(r,Yn(wt.readFileSync($r.join(t,r),"utf8")))}catch{return n}return n},_f=e=>{try{let t=JSON.parse(e);return typeof t=="object"&&t!==null}catch{return!1}},Rc=(e,t)=>{if(t.size===0)return[];let n=Ic(e),r=[];for(let[o,s]of t){if(s.length===0)continue;let d=$r.join(n,o);try{let l=wt.existsSync(d)?wt.readFileSync(d,"utf8"):null,u=new Set(l===null?[]:Yn(l)),m=s.filter(f=>!u.has(f)).filter(_f);if(m.length===0)continue;wt.mkdirSync(n,{recursive:!0});let p=l!==null&&l.length>0&&!l.endsWith(`
27
- `);wt.appendFileSync(d,`${p?`
26
+ `)}`):(Mn(o),Ah(),E({hasProjectDefinition:!0}),wh(t),l("State booted successfully",null))}var qr,Th,wh,Vr=v(()=>{"use strict";Rt();Je();pe();N();Tn();k();Zn();Ut();nr();qr=Nh();Th=()=>{let e=He();if(a(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},wh=e=>{if(e.length===0)return;let t=e.filter(r=>r.reason==="corrupt-line"||r.reason==="invalid-payload"),n=e.filter(r=>r.reason==="unsupported-schema-version"||r.reason==="unknown-action");if(n.length>0){let r=[...new Set(n.map(o=>o.detail))].join(", ");X.info(`This build cannot read ${n.length} event(s) in the log (${r}). They are skipped, so anything they changed may be out of date until you upgrade.`)}if(t.length>0){let r=[...new Set(t.map(o=>o.detail))].join(", ");X.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}}});import{WebSocket as Mh}from"ws";var kh,Zc,el=v(()=>{"use strict";kh=new Set,Zc=e=>{let t=JSON.stringify(e);for(let n of kh)n.readyState===Mh.OPEN&&n.send(t)}});var rs,os,ss,Vi,tl,Me,is=v(()=>{"use strict";el();N();k();rs=e=>{ot()&&(E({syncStatus:e}),Zc({type:"sync-status",payload:e}))},os=(e="Syncing...")=>{rs({status:"syncing",msg:e})},ss=(e="Synced")=>{rs({status:"synced",msg:e})},Vi=e=>{rs({status:"failed",msg:e})},tl=e=>{rs({status:"offline",msg:e})},Me=e=>(Vi(e),i(e))});var zr,Q,as=v(()=>{"use strict";N();zr=(e,t)=>(logger.error(`[boot:${e}] ${t}`),i(`[boot:${e}] ${t}`)),Q=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t)});import At from"node:fs";import Kr from"node:path";var rr,nl,rl,ol,Lh,sl,Ph,Dh,il,zi=v(()=>{"use strict";ut();N();ne();rr=e=>e.split(`
27
+ `).filter(t=>t.trim().length>0),nl=e=>{let t=Kr.join(e,$e,tn);try{if(!At.existsSync(t))return l("No events directory",[]);let n=At.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>rr(At.readFileSync(Kr.join(t,r),"utf8")).length>0);return l("Looked for stranded event logs",n)}catch(n){return i(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},rl=e=>Kr.join(e,$e,tn),ol=e=>{let t=rl(e),n=new Map;try{if(!At.existsSync(t))return n;for(let r of At.readdirSync(t))r.endsWith(".jsonl")&&n.set(r,rr(At.readFileSync(Kr.join(t,r),"utf8")))}catch{return n}return n},Lh=e=>{try{let t=JSON.parse(e);return typeof t=="object"&&t!==null}catch{return!1}},sl=(e,t)=>{if(t.size===0)return[];let n=rl(e),r=[];for(let[o,s]of t){if(s.length===0)continue;let d=Kr.join(n,o);try{let c=At.existsSync(d)?At.readFileSync(d,"utf8"):null,u=new Set(c===null?[]:rr(c)),m=s.filter(g=>!u.has(g)).filter(Lh);if(m.length===0)continue;At.mkdirSync(n,{recursive:!0});let p=c!==null&&c.length>0&&!c.endsWith(`
28
+ `);At.appendFileSync(d,`${p?`
28
29
  `:""}${m.join(`
29
30
  `)}
30
- `,"utf8"),r.push(`${o} (${m.length})`)}catch{continue}}return r},Uf=(e,t)=>{let n=new Set(Yn(t));return Yn(e).filter(r=>!n.has(r))},$f=(e,t,n)=>[`Refusing to commit ${e}: it is missing ${t.length} of the ${n} event(s) already committed.`,"","The event log is append-only, so a line can never legitimately go","missing. The working copy on disk is damaged; committing it would","publish that damage to everyone who pulls, and the log carries no way","to undo it.","","Nothing has been committed. The committed history is intact \u2014 recover","the file from it before syncing again:",` git show HEAD:${e}`,"","First dropped event:",` ${t[0]?.slice(0,200)??"<none>"}`].join(`
31
- `),Nc=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let r=await je({args:["show",`HEAD:${t}`],cwd:e});if(r.exitCode!==0)return c("No committed log to compare against",void 0);let o=Uf(r.stdout,n);return o.length>0?i($f(t,o,Yn(r.stdout).length)):c("Event log only grew",void 0)}});import jt from"node:fs";import jr from"node:path";var jf,Cc,Sc,Hf,Pi,Di,Wf,Gf,Ln,qf,Vf,ns,Ac,Tc,wc,Hr,Mc,Wr=y(()=>{"use strict";C();Nt();Po();Sr();Li();mt();lt();jf="[epiq:init-repo]",Cc=async e=>{let t=await je({args:["rev-parse","--verify","--quiet","HEAD"],cwd:e});if(t.exitCode===0)return c("Initial commit already exists",!1);if(!(t.exitCode===1&&t.stdout.trim()===""&&t.stderr.trim()===""))return i(["Could not determine whether the repository has any commits, so nothing was written.",`git rev-parse exited ${t.exitCode}`,t.stderr.trim()].filter(Boolean).join(`
32
- `));X.info("Creating initial commit");let r=await H({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(a(r))return i(r.message);let o=await H({args:["commit-tree",r.value.stdout.trim(),"-m",jf],cwd:e});if(a(o))return i(o.message);let s=await H({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return a(s)?i(s.message):c("Created initial commit",!0)},Sc=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Hf=async e=>{let t=await Oo(e);if(a(t))return i(t.message);let n=await Nd(e);return a(n)?i(n.message):c("Built sync commit message",`[sync|branch:${Sc(t.value)}:sha:${Sc(n.value)}]`)},Pi=async({repoRoot:e,stateBranchName:t})=>{X.info(`Creating ${t}`);let n=await H({args:["commit-tree",kd,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return i(`Failed to create state branch commit
33
- ${n.message}`);let r=n.value.stdout.trim(),o=await H({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return a(o)?i(`Failed to create ${t}
34
- ${o.message}`):c("Created state branch",!0)},Di=async({repoRoot:e,stateBranchName:t})=>{let n=await Fo({repoRoot:e,branch:t});if(a(n))return i(`Ensure local state branch failed
35
- `+n.message);if(n.value)return c("Local state branch already exists",!1);let r=await ai({repoRoot:e});if(a(r))return i(`Ensure local state branch failed
36
- `+r.message);let o=r.value,s=o?await di({repoRoot:e,branch:t}):c("No remote, no remote state branch",!1);if(a(s))return i(`Ensure local state branch failed
37
- `+s.message);let d=s.value;if(o&&d){let l=await ye.fetch({cwd:e,remote:ot,branch:t});if(a(l))return i(`Failed to fetch ${t} from remote
38
- ${l.message}`)}if(d){let l=await H({args:["branch","--track",t,`${ot}/${t}`],cwd:e});return a(l)?i(`Failed to create local ${t} from remote
39
- ${l.message}`):c("Created local state branch from remote",!0)}return Pi({repoRoot:e,stateBranchName:t})},Wf=async({repoRoot:e,branch:t})=>{let n=await H({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let r=n.value.stdout.split(`
40
- `),o=null;for(let s of r){if(s.startsWith("worktree ")){o=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&o)return c("Found worktree for branch",o)}return c("No worktree found for branch",null)},Gf=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Ar(jr.dirname(t));if(a(r))return i(`Failed to create state branch worktree
41
- `+r.message);if(jt.existsSync(t)&&!jt.existsSync(jr.join(t,".git"))){let s=xc(t);if(a(s))return i(s.message);if(s.value.length>0)return i([`Refusing to delete ${t}.`,"","It is not a usable worktree \u2014 it has no .git \u2014 but it still holds",`${s.value.length} event log(s) with content:`,...s.value.map(d=>` ${d}`),"","Deleting it would destroy them, and with no .git here there is no","committed copy to recover from. Move the directory aside and","salvage the logs before letting epiq recreate the worktree."].join(`
42
- `));X.info("Removing broken state branch worktree path"),Fd(t)}X.info("Creating state branch worktree");let o=await ye.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?i(`Failed to create state branch worktree
43
- ${o.message}`):c("Created state branch worktree",!0)},Ln=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Wf({repoRoot:e,branch:n});if(a(r))return i(r.message);let o=Cr(t),s=r.value?Cr(r.value):null;if(s&&s===o&&jt.existsSync(s))return c("State branch already checked out in expected worktree",!1);if(s&&s!==o){let u=await Ad(s);if(a(u))return i(u.message);if(u.value)return i([`Refusing to move the state branch worktree away from ${s}.`,"","It holds changes that are not committed yet, which for this","branch means events no sync has published. Removing it would","destroy them outright \u2014 there is no stash or reflog to recover","a deleted worktree from.","",`This worktree is expected at ${o}, so something else is`,"using a different EPIQ_GLOBAL_DIR against the same repository.","Sync from that location first, or point both at the same one."].join(`
44
- `));X.info("Moving state branch worktree to expected location");let m=await ye.worktreeRemove({cwd:e,worktreeRoot:s});if(a(m))return i(`Failed to remove existing state branch worktree
45
- ${m.message}`)}if(s&&!jt.existsSync(s)){X.info("Pruning stale state branch worktree");let u=await ye.worktreePrune({cwd:e});if(a(u))return i(`Failed to prune stale worktrees
46
- ${u.message}`)}let d=await Rd({repoRoot:e,worktreeRoot:t});if(a(d))return i(d.message);let l=jt.existsSync(t);if(d.value&&l)return c("State branch worktree already exists",!1);if(d.value&&!l){X.info("Pruning missing registered state branch worktree");let u=await ye.worktreePrune({cwd:e});if(a(u))return i(`Failed to prune stale worktrees
47
- ${u.message}`)}return Gf({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},qf=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Oo(e);if(a(n))return i(n.message);if(n.value===t)return c("State branch already checked out",!1);(await je({cwd:e,args:["rebase","--abort"]})).exitCode===0&&X.info("Aborted stale state branch rebase");let o=await ye.checkout({cwd:e,branch:t});return a(o)?i(`Failed to checkout ${t}
48
- ${o.message}`):c("Checked out state branch",!0)},Vf=async({repoRoot:e,stateBranchRoot:t})=>{let n=await ci(t);if(a(n))return i(n.message);if(n.value)return c("State branch upstream already configured",!1);let r=await ai({repoRoot:t});if(a(r))return i(r.message);if(!r.value)return c("No remote available for state branch upstream",!1);let o=Jt(e);if(a(o))return o;let s=o.value,d=await di({repoRoot:t,branch:s});if(a(d))return i(d.message);if(!d.value)return c("Remote state branch missing; upstream will be configured on first push",!1);X.info(`Configuring ${s} upstream`);let l=await ye.fetch({cwd:t,remote:ot,branch:s});if(a(l))return i(`Failed to fetch ${s}
49
- ${l.message}`);let u=await ye.setUpstream({cwd:t,branch:s,upstream:`${ot}/${s}`});return a(u)?i(`Failed to set state branch upstream
50
- ${u.message}`):c("Configured state branch upstream",!0)},ns=async({stateBranchRoot:e,eventFileName:t})=>{let n=Ld(t),r=jr.join(e,n);if(!jt.existsSync(r))return c("No event file to stage",null);let o=await Nc({stateBranchRoot:e,relativePath:n,workingContent:jt.readFileSync(r,"utf8")});if(a(o))return i(o.message);let s=await ye.stage({cwd:e,pathspec:[n]});return a(s)?i(`Failed to stage state branch event file
51
- ${s.message}`):c("Staged state branch event file",n)},Ac=async({stateBranchRoot:e})=>{let t=Pd(),n=jr.join(e,t);if(!jt.existsSync(n))return c("No media directory to stage",null);let r=await ye.stage({cwd:e,pathspec:[t],ignoreRemoval:!0});return a(r)?i(`Failed to stage state branch media files
52
- ${r.message}`):c("Staged state branch media files",t)},Tc=async({stateBranchRoot:e})=>{let t=pi();if(!jt.existsSync(jr.join(e,t)))return c("No event log attributes to stage",null);let n=await ye.stage({cwd:e,pathspec:[t]});return a(n)?i(`Failed to stage event log attributes
53
- ${n.message}`):c("Staged event log attributes",t)},wc=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await Hf(e);return a(r)?i(`Create state branch sync commit failed
54
- `+r.message):qn({cwd:t,message:r.value,pathspec:n})},Hr=async({repoRoot:e,stateBranchRoot:t})=>{let n=await ci(t);if(a(n))return i(n.message);let r=Jt(e);if(a(r))return r;let o=r.value,s=n.value?await ye.push({cwd:t}):await ye.push({cwd:t,remote:ot,branch:o,setUpstream:!0});if(a(s))return i(`Failed during state branch push
55
- ${s.message}`);let d=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return c(d?"Pushed state branch":"Remote already up to date",d)},Mc=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Jt(e);if(a(o))return o;let s=o.value,d=[_o(),await Di({repoRoot:e,stateBranchName:s}),await Ln({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await qf({stateBranchRoot:t,stateBranchName:s}),await Bd(t),n?await Vf({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of d){if(a(l))return i(l.message);r=r||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)}});import rs from"node:fs";import Oi from"node:os";import zf from"node:path";var Kf,kc,Yf,Xf,Jf,Pc,Fi,Lc,Qf,Dc,Fc=y(()=>{"use strict";C();lt();Nt();Kf="epiq-sync.lock",kc=600*1e3,Yf=e=>{try{let t=JSON.parse(e);return typeof t.pid!="number"||typeof t.hostname!="string"||typeof t.startedAt!="number"||typeof t.operation!="string"?null:t}catch{return null}},Xf=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Jf=e=>e&&(e.hostname!==Oi.hostname()||Xf(e.pid))?Date.now()-e.startedAt>kc:!0,Pc=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Fi=e=>{try{return Yf(rs.readFileSync(e,"utf8"))}catch{return null}},Lc=(e,t)=>{let n={pid:process.pid,hostname:Oi.hostname(),startedAt:Date.now(),operation:t};try{return rs.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},Qf=async({worktreeRoot:e,operation:t})=>{let n=await ii(e);if(a(n))return i(n.message);let r=zf.join(n.value,Kf),o=()=>{try{let l=Fi(r);l&&l.pid===process.pid&&rs.rmSync(r)}catch{}};if(Lc(r,t))return c("Acquired sync lock",{acquired:!0,release:o});let s=Fi(r);if(!Jf(s))return c("Sync lock is held",{acquired:!1,heldBy:s});X.info(`Breaking an abandoned sync lock: ${s?Pc(s):"unreadable lock file"}`);try{rs.rmSync(r,{force:!0})}catch{}if(Lc(r,t))return c("Acquired sync lock after breaking a stale one",{acquired:!0,release:o});let d=Fi(r);return c("Sync lock taken by another process",{acquired:!1,heldBy:d??{pid:-1,hostname:Oi.hostname(),startedAt:Date.now(),operation:"unknown"}})},Dc=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await Qf({worktreeRoot:e,operation:t});if(a(r))return i(r.message);if(!r.value.acquired)return X.info(`Skipping ${t}: the state worktree is held by ${Pc(r.value.heldBy)}`),c("State worktree is held by another process",null);let{release:o}=r.value;try{return c("Ran under the sync lock",await n())}finally{o()}}});import Zf from"node:fs";var eh,th,Oc,Bc,nh,os,Bi=y(()=>{"use strict";C();es();ts();Sr();mt();lt();Wr();Li();Fc();eh=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=Z("getRepoRootDir",await ut(e));if(a(n))return i(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=Z("getStateBranchRoot",Ce({repoRoot:r}));if(a(o))return i(o.message);let s=o.value;logger.debug("[sync] state branch root",s),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:s,ensureUpstream:t});let d=Z("bootstrapStateBranchStorage",await Mc({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(a(d))return i(d.message);logger.debug("[sync] bootstrap result",{bootstrapped:d.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let l=Z("hasInProgressGitOperation(stateBranchRoot)",await Do(s));if(a(l))return i(l.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:l.value}),l.value)return logger.info("[sync] state branch git operation in progress"),i("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:s});let u=Z("ensureStateBranchLayout",Od(r,s));return a(u)?i(u.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:d.value}),c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:d.value}))},th=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=Z("stageStateBranchOwnEventFile",await ns({stateBranchRoot:t,eventFileName:n}));if(a(r))return i(r.message);let o=Z("stageStateBranchMediaFiles",await Ac({stateBranchRoot:t}));if(a(o))return i(o.message);let s=Z("stageStateBranchEventAttributes",await Tc({stateBranchRoot:t}));if(a(s))return i(s.message);let d=[r.value,o.value,s.value].filter(m=>m!==null);if(d.length===0)return c("Nothing to stage",{createdCommit:!1});let l=Z("hasStagedChanges(after stage)",await Td(t,d));if(a(l))return i(l.message);if(logger.debug("[sync] state branch change check after stage result",{changed:l.value}),!l.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 u=Z("createStateBranchSyncCommit",await wc({repoRoot:e,stateBranchRoot:t,pathspec:d}));return a(u)?i(u.message):(logger.debug("[sync] created sync commit",u.value),c("Committed own event file",{createdCommit:!0,commitSha:u.value}))},Oc=e=>{let t=e.createdCommit?"Committed locally, offline":"Offline";return bc(t),c(t,{...e,pulled:!1,pushed:!1,offline:!0})},Bc=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}),i("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}),i("Own event file must end with .jsonl");Qo();let n=Z("ensureSyncReady",await eh({cwd:e,ensureUpstream:!0}));if(a(n))return Pe(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,d=Z("isDetachedHead(stateBranchRoot)",await wd(o));if(a(d))return Pe(d.message);if(logger.debug("[sync] detached state branch check result",{detached:d.value}),d.value)return Pe("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,p=!1,f=Z("getStateBranch",Jt(r));if(a(f))return Pe(f.message);let I=f.value;logger.debug("[sync] resolved state branch",{stateBranch:I,stateBranchRoot:o});let N=Z("commitOwnEventFileToStateBranch",await th({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(N))return Pe(N.message);l=N.value.createdCommit,u=N.value.commitSha;let A=Z("pullBranchRebaseIfPresent",await ui({cwd:o,branch:I}));if(a(A))return li(A.message)?Oc({repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,bootstrapped:s}):Pe(A.message);m=A.value;let w=Z("isAheadOfUpstream",await Cd(o));if(a(w))return Pe(w.message);if(l||s||w.value){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:s,stateBranchRoot:o});let T=Z("pushStateBranch",await Hr({stateBranchRoot:o,repoRoot:r}));if(a(T)&&Sd(T.message)){let M=Z("pullBranchRebaseIfPresent(retry)",await ui({cwd:o,branch:I}));if(a(M))return Pe(M.message);m=m||M.value,T=Z("pushStateBranch(retry)",await Hr({stateBranchRoot:o,repoRoot:r}))}if(a(T))return li(T.message)?Oc({repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,bootstrapped:s}):Pe(T.message);p=T.value}if(l){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let T=Z("git rev-parse HEAD",await H({args:["rev-parse","HEAD"],cwd:o}));if(a(T))return Pe(T.message);u=T.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return Zo(p?"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:p,bootstrapped:s,offline:!1})},nh=async(e,t)=>{let n=Ec(e);try{return await t()}finally{let r=Rc(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},os=async e=>{let t=e.cwd??process.cwd(),n=await ut(t);if(a(n))return Pe(n.message);let r=Ce({repoRoot:n.value});if(a(r))return Pe(r.message);let o=r.value;if(!Zf.existsSync(o))return Bc(e);let s=await Dc({worktreeRoot:o,operation:"sync",fn:()=>nh(o,()=>Bc(e))});return a(s)?Pe(s.message):s.value===null?c("Another process is syncing this board",{repoRoot:n.value,stateBranchRoot:o,createdCommit:!1,pulled:!1,pushed:!1,bootstrapped:!1,offline:!1,skipped:!0}):s.value}});var Mt,ss,rh,_c,_i=y(()=>{"use strict";fc();_r();rn();gt();ue();C();k();es();ts();Bi();Mt=null,ss=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Mt,currentStatus:g().syncStatus?.status,currentMessage:g().syncStatus?.msg}),Mt)return logger.debug("[sync] syncAndReloadState joining existing promise"),Mt;logger.debug("[sync] syncAndReloadState creating promise"),Mt=rh();try{let e=await Mt;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!a(e),message:(a(e),e.message),statusAfterResolve:g().syncStatus?.status,statusMessageAfterResolve:g().syncStatus?.msg}),a(e)&&g().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),E({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),Mt||i(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:g().syncStatus?.status,statusMessageBeforeClear:g().syncStatus?.msg}),Mt=null}},rh=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:g().mode,syncStatus:g().syncStatus});let e=_c();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:g().mode,message:e.message,syncStatus:g().syncStatus}),e;if(Mt)return Mt;logger.debug("[sync] syncAndReloadState:start");let t=Z("resolveActorId",ve());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:a(t)?t.message:"Missing actor id"}),i("Unable to resolve event log path");E({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:g().syncStatus});let n=wn(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=Z("syncEpiqWithRemote",await os({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!a(r),message:(a(r),r.message)}),a(r))return logger.error("[sync] syncAndReloadState:sync failed",r.message),E({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:g().syncStatus}),Pe(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let d=Z("loadMergedEvents",$t(o));if(logger.debug("[sync] loadMergedEvents:result",{success:!a(d),message:(a(d),d.message),count:a(d)?void 0:d.value.events.length}),a(d))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:g().syncStatus}),i(`Unable to load events. ${d.message}`);logger.debug("[sync] loaded merged events after sync",{count:d.value.events.length});let l=_c();if(l)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:g().mode,message:l.message,syncStatus:g().syncStatus}),l;let u=mc(),m=g().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:u,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:d.value.events.length});let f=Z("bootStateFromEventLog",sn(d.value.events,d.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!a(f),message:(a(f),f.message)}),a(f))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:g().syncStatus}),i(`Unable to boot synced state. ${f.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),E({filters:m}),logger.debug("[sync] restoreNavigationAnchor:start");let p=Z("restoreNavigationAnchor",gc(u));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!a(p),message:a(p)?p.message:"Navigation restored",selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id}),a(p)?(E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:g().syncStatus}),p):(E({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:g().syncStatus}),c("Synced",!0))},_c=()=>g().mode===h.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:g().mode,syncStatus:g().syncStatus}),E({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),i("Will not re-materialize if not in default mode, to not lose edit data"))});var Xn,Uc,$c,Ui,$i,Gr,ji,oh,jc,sh,Hc,is=y(()=>{"use strict";C();Ue();k();_i();Xn=3e3,Uc=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Xn?null:t},$c=0,$i=!1,Gr=!1,ji=()=>{if($i)return!0;let e=Ge();return a(e)?!1:e.value.syncStatus.status==="syncing"},oh=()=>{let e=xe().autoSyncIntervalMs??1e4,t=Date.now()-$c;return Math.max(0,e-t)},jc=()=>{Ui||(Ui=setTimeout(async()=>{if(Ui=void 0,!!At()){if(ji()){Gr=!0;return}Gr=!1,await sh()}},oh()))},sh=async()=>{if(g().readOnly||g().timeMode==="peek"||g().timeMode==="replay")return i("Cannot auto-sync while peeking");if(!At())return i("Cannot auto-sync before state is initialized");if(ji())return Gr=!0,i("Sync already in progress");$i=!0,$c=Date.now(),E({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await ss()}finally{$i=!1,Gr&&jc()}},Hc=()=>{At()&&(Gr=!0,!ji()&&jc())}});import qr from"node:fs";import Vr from"node:path";import{z as Jn}from"zod";var as,ih,ah,dh,Gc,qc,Wc,Vc,zc,Kc,ch,ds,Hi,zr=y(()=>{"use strict";C();Bt();Lo();pe();as="recent-projects.json",ih=20,ah=Jn.object({projectId:Jn.string().min(1),root:Jn.string().min(1),lastOpenedAt:Jn.number().finite()}),dh=Jn.object({projects:Jn.array(ah)}),Gc=()=>Vr.join(En(),as),qc=e=>Vr.basename(e)||e,Wc=e=>{let t=Vr.resolve(e);try{return qr.realpathSync(t)}catch{return t}},Vc=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,zc=e=>{if(!Mr(e.root))return!1;let t=Rr(e.root);return!a(t)&&t.value===e.projectId},Kc=()=>{let e=Gc();if(!qr.existsSync(e))return c("No recent projects recorded",[]);let t;try{t=JSON.parse(qr.readFileSync(e,"utf8"))}catch(r){return i(`Invalid ${as}: ${r instanceof Error?r.message:String(r)}`)}let n=dh.safeParse(t);return n.success?c("Read recent projects",n.data.projects):i(`Invalid ${as} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ch=e=>{let t=Gc();try{qr.mkdirSync(Vr.dirname(t),{recursive:!0}),qr.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
56
- `,"utf8")}catch(n){return i(`Unable to write ${as}: ${n instanceof Error?n.message:String(n)}`)}return c("Recorded recent project",e)},ds=({exclude:e}={})=>{let t=Kc();if(a(t))return t;let n=e===void 0?null:Wc(e);return c("Listed recent projects",t.value.filter(r=>n===null||Wc(r.root)!==n).filter(zc).sort(Vc))},Hi=({root:e,now:t=Date.now()})=>{let n=Vr.resolve(e),r=Rr(n);if(a(r))return i(r.message);let o=r.value,s=Kc(),d=a(s)?[]:s.value,l=[{projectId:o,root:n,lastOpenedAt:t},...d.filter(u=>u.projectId!==o&&u.root!==n)].filter(zc).sort(Vc).slice(0,ih);return ch(l)}});var cs,Yc,Xc,Jc,Kr=y(()=>{"use strict";C();Bt();Ue();pe();cs=()=>{let e=xe(),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}},Yc=()=>{let e=Qe(process.cwd());if(a(e))return!1;let t=Ot(e.value);return vt(t)},Xc=e=>e===!0?"on":e===!1?"off":null,Jc=e=>e==="on"?!0:e==="off"?!1:null});var De,S,Fe=y(()=>{"use strict";De={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"},S={accent:De.cyan,accent2:De.magenta,primary:De.white,secondary:De.grayDark,secondary2:De.grayLight,gray:De.gray,green:De.green,yellow:De.yellow,red:De.red}});var R,Qn,ls=y(()=>{"use strict";Fe();R={red:De.red,yellow:De.yellow,green:De.green,blue:De.blue,magenta:De.magenta,cyan:De.cyan},Qn={urgent:R.red,critical:R.red,important:R.red,blocker:R.red,asap:R.red,immediate:R.red,fail:R.red,failure:R.red,broken:R.red,bug:R.red,error:R.red,incident:R.red,outage:R.red,production:R.red,crash:R.red,security:R.red,warning:R.yellow,warn:R.yellow,risky:R.yellow,risk:R.yellow,attention:R.yellow,pending:R.yellow,review:R.yellow,"needs-review":R.yellow,qa:R.yellow,testing:R.yellow,test:R.yellow,validate:R.yellow,verification:R.yellow,staging:R.yellow,check:R.yellow,"follow-up":R.yellow,followup:R.yellow,waiting:R.yellow,blocked:R.yellow,hold:R.yellow,done:R.green,complete:R.green,completed:R.green,success:R.green,ok:R.green,stable:R.green,resolved:R.green,fixed:R.green,closed:R.green,merged:R.green,released:R.green,deployed:R.green,approved:R.green,verified:R.green,working:R.green,healthy:R.green,pass:R.green,passing:R.green,info:R.blue,information:R.blue,note:R.blue,docs:R.blue,documentation:R.blue,doc:R.blue,guide:R.blue,help:R.blue,explanation:R.blue,detail:R.blue,details:R.blue,context:R.blue,design:R.blue,discussion:R.blue,proposal:R.blue,idea:R.blue,feature:R.magenta,enhancement:R.magenta,improvement:R.magenta,refactor:R.magenta,refactoring:R.magenta,cleanup:R.magenta,optimize:R.magenta,optimization:R.magenta,perf:R.magenta,performance:R.magenta,upgrade:R.magenta,migration:R.magenta,modernize:R.magenta,debt:R.magenta,todo:R.cyan,next:R.cyan,planned:R.cyan,plan:R.cyan,future:R.cyan,backlog:R.cyan,investigate:R.cyan,explore:R.cyan,prototype:R.cyan}});var lh,uh,an,dn,us,ms,Yr=y(()=>{"use strict";he();C();ge();k();lh=e=>e.props.tags??[],uh=e=>e.props.assignees??[],an=e=>lh(e).map(t=>x.getTag(t)).filter(t=>!!t),dn=e=>uh(e).map(t=>x.getContributor(t)).filter(t=>!!t),us=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!P(n)?i("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",an(n))},ms=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!P(n)?i("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",dn(n))}});var v,Pn=y(()=>{"use strict";v={PALETTE:"?",EXIT:"exit",INIT:"init",OPEN:"open",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",REPLAY:"replay",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",YANK:"yank",SYNC:"sync",EXPORT:"export",COFFEE:"coffee",NONE:""}});var mh,ph,gh,fh,hh,Dn,Qc,ps,gs,Zc,vh,Wi,Xr=y(()=>{"use strict";mh=/^(\d+)(h|d|w|mo|y)$/,ph=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,gh=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let s=new Date(e,t-1,n,r,o);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===r&&s.getMinutes()===o},fh=(e,t=new Date)=>{let n=e.match(mh);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let d=new Date(t);switch(o){case"h":return d.setHours(d.getHours()-s),d;case"d":return d.setDate(d.getDate()-s),d;case"w":return d.setDate(d.getDate()-s*7),d;case"mo":return d.setMonth(d.getMonth()-s),d;case"y":return d.setFullYear(d.getFullYear()-s),d;default:return null}},hh=e=>{let t=e.match(ph);if(!t)return null;let[,n,r,o,s,d]=t,l=Number(n),u=Number(r),m=Number(o),p=s?Number(s):0,f=d?Number(d):0;return gh({year:l,month:u,day:m,hour:p,minute:f})?new Date(l,u-1,m,p,f):null},Dn=e=>{let t=e.trim().toLowerCase();return fh(t)??hh(t)},Qc=/^(\d+)(s|m)?$/,ps=e=>{let t=e.trim().toLowerCase().match(Qc);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},gs=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&Qc.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},Zc=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,vh=[{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}],Wi=(e=vh)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let s=r;s<=o;s++)t.push(`${s}${n}`);return t}});var yh,fe,et,Ne,bh,xh,qi,Vi,nl,Fn,fs,Gi,el,Ih,Eh,Jr,tl,Rh,Nh,zi,Sh,Ee,cn=y(()=>{"use strict";is();zr();C();Kr();zn();he();ge();k();ls();Yr();Pn();Xr();yh=["BOARD","TICKET","SWIMLANE","COMMENT"],fe={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},et={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Ne={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},bh=[fe.EDITOR,fe.VIEW,fe.USERNAME,fe.AUTOSYNC,fe.SYNC_DEBOUNCE_MS,fe.ATTACHMENT_MAX_KB,fe.LOG_LEVEL],xh=(e=g().selectedNode?.context)=>{switch(e){case"TICKET":return[et.TITLE,et.DESCRIPTION];case"BOARD":case"SWIMLANE":return[et.TITLE];case"COMMENT":return[et.COMMENT];default:return[]}},qi=[String(Xn),"5000","15000","30000","60000"],Vi=["250","500","1000"],nl=["10s","20s","30s","45s"],Fn=[v.COFFEE,v.EXIT,v.SYNC,v.HELP,v.EXPORT,v.CONFIG,v.YANK],fs=[v.NEW,v.EDIT,v.DELETE,v.MOVE],Gi=[v.TAG,v.UNTAG,v.ASSIGN,v.UNASSIGN,v.CLOSE_ISSUE,v.RE_OPEN_ISSUE,v.EDIT,v.COMMENT],el=[v.FILTER,v.PEEK,v.REPLAY],Ih={WORKSPACE:[...Fn,...fs],BOARD:[...el,...Fn,...fs],SWIMLANE:[...el,...Fn,...fs],TICKET:[...Fn,...fs,...Gi],FIELD:[...Fn,...Gi],FIELD_LIST:[...Fn,...Gi],TEXT:[...Fn],COMMENT:[v.EDIT,v.DELETE,v.YANK]},Eh=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Jr=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&P(n)),tl=e=>e.parentNodeId===Ie,Rh=({selectedNode:e,breadCrumb:t})=>{let n=xh(e?.context);return Jr({breadCrumb:t,selectedNode:e})?n.includes(et.DESCRIPTION)?n:[...n,et.DESCRIPTION]:n},Nh=({selectedNode:e,breadCrumb:t})=>{let n=Jr({breadCrumb:t,selectedNode:e});return n?[Ne.REF,Ne.TITLE,...n.props?.description?.trim()?[Ne.DESCRIPTION]:[],...an(n).length>0?[Ne.TAGS]:[],...dn(n).length>0?[Ne.ASSIGNEES]:[]]:e?[Ne.REF,Ne.TITLE]:[]},zi=()=>{let e=ds({exclude:process.cwd()});return a(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},Sh=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=cs();if(!r)return[v.HELP,v.CONFIG];if(!Yc())return[v.HELP,v.INIT,v.OPEN];if(t)return[v.HELP,v.PEEK,v.REPLAY,v.EXPORT,v.CONFIG,v.YANK];let o=e?.context,s=o&&yh.includes(o),d=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?Ih[u]:[]))],l=Jr({breadCrumb:n,selectedNode:e});return d.filter(u=>u===v.MOVE?!1:u===v.YANK?!!(l??e):u===v.EDIT?s||!!l:u===v.DELETE?s:u===v.UNTAG?!!(l&&an(l).length>0):u===v.UNASSIGN?!!(l&&dn(l).length>0):u===v.RE_OPEN_ISSUE?!!(l&&tl(l)):u===v.CLOSE_ISSUE?!!(l&&!tl(l)):!0)},Ee=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=g())=>{let s=t.context??"WORKSPACE";return{[v.NONE]:Sh({breadCrumb:o,readOnly:r,selectedNode:n}),[v.EXIT]:["confirm"],[v.EXPORT]:[],[v.SYNC]:[],[v.INIT]:[],[v.OPEN]:e===v.OPEN?zi():[],[v.HELP]:[],[v.PEEK]:[...Wi(),"now","prev","next"],[v.REPLAY]:[...Wi()],[v.EDIT]:Rh({selectedNode:n,breadCrumb:o}),[v.YANK]:Nh({selectedNode:n,breadCrumb:o}),[v.COMMENT]:[],[v.DELETE]:["confirm"],[v.RE_OPEN_ISSUE]:["confirm"],[v.CLOSE_ISSUE]:["confirm"],[v.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[v.FILTER]:["tag","assignee","description","title","ref","clear"],[v.TAG]:[...new Set([...Object.keys(Qn),...x.getExistingTags()])],[v.UNTAG]:[...us()?.value?.map(({name:l})=>l)??[]],[v.UNASSIGN]:[...ms()?.value?.map(({name:l})=>l)??[]],[v.ASSIGN]:x.getExistingAssignees(),[v.NEW]:Eh(s),[v.CONFIG]:[...bh],[v.COFFEE]:["1","3","5","20","custom"]}[e]??[]}});var rl,ol=y(()=>{"use strict";rl=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"]});import{accessSync as Ch,copyFileSync as Ah,existsSync as hs,mkdirSync as sl,readdirSync as il,readFileSync as Th,renameSync as wh,rmSync as Mh,statSync as al,unlinkSync as kh,writeFileSync as Lh}from"node:fs";import Zn from"node:path";var Ki,qe,vs=y(()=>{"use strict";Ki=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",qe={writeToFile:(e,t)=>{try{let n=Zn.dirname(e);hs(n)||sl(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Lh(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Th(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=qe.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 hs(e)&&al(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Ch(e),!0}catch{return!1}},mkDir:e=>sl(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Zn.parse(t);for(;;){let r=Zn.join(t,e);try{if(hs(r)&&al(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Zn.dirname(t)}return null},readFirstJSON(e){try{if(!qe.dirExists(e))return null;let t=il(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Zn.join(e,t);return qe.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return qe.dirExists(e)?il(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{kh(e)}catch(t){(!Ki(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Mh(e,{recursive:!0,force:!0})}catch(t){(!Ki(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Zn.dirname(t)),!n?.overwrite&&hs(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{wh(e,t)}catch(r){if(Ki(r)&&r.code==="EXDEV"){Ah(e,t),this.rmFile(e);return}throw r}}}});import Ph from"node:path";import{z as Ht}from"zod";var Dh,dl,Fh,cl,Yi,Xi,Oh,ys,ll,it,Ji,On=y(()=>{"use strict";hr();pe();C();vs();Dh={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},dl=Ht.object({logLevel:Ht.enum(["info","error","debug"]),preferredEditor:Ht.string().optional(),userName:Ht.string().optional(),userId:Ht.string().optional(),autoSync:Ht.boolean().nullable().optional(),autoSyncDebounceMs:Ht.number().optional(),attachmentMaxKb:Ht.number().optional(),viewMode:Ht.enum(["dense","wide"]).optional()}).partial(),Fh="config.json",cl=En,Yi=()=>Ph.join(cl(),Fh),Xi=()=>{try{return qe.mkDir(cl()),c(`Ensured ~/${ct} exists`,null)}catch{return i(`Unable to create ~/${ct}`)}},Oh=e=>{let t;try{t=JSON.parse(e)}catch{return i(`Invalid ~/${ct}/config.json JSON`)}let n=dl.safeParse(t??{});return n.success?c("Parsed config",n.data):i(`Invalid ~/${ct}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ys=()=>{let e=Xi();if(a(e))return i(e.message);let t=Yi(),n=qe.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Oh(n)},ll=e=>{let t=Xi();if(a(t))return i(t.message);let n=dl.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Yi();try{return qe.writeToFile(r,JSON.stringify(n.data,null,2)+`
57
- `),c("Config written",null)}catch{return i(`Unable to write ~/${ct}/config.json`)}},it=e=>{let t=ys();if(a(t))return i("Failed to read existing config");let n={...t.value,...e};return ll(n)},Ji=()=>{let e=Yi(),t=Xi();if(a(t))return i(`Unable to create ~/${ct}`);if(!(qe.readFile(e)!==null)){let A=ll(Dh);if(a(A))throw new Error(`Unable to create ~/${ct}/config.json`)}let r=ys();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:d,autoSync:l,autoSyncDebounceMs:u,attachmentMaxKb:m,logLevel:p,viewMode:f}=r.value,I=ti({userId:d,userName:s});if(a(I))return i(I.message);let N=I.value??{userId:d,userName:s};return!N.userName||!N.userId?i(`User name or ID not configured in ~/${ct}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,c("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:N.userName,userId:N.userId,autoSync:l??!1,autoSyncIntervalMs:u??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))}});var ul,ml,Qi,pl=y(()=>{"use strict";ul="/media/",ml=e=>`${ul}${e}`,Qi=(e,t)=>`![${e}](${ml(t)})`});import Bh from"node:crypto";import Zi from"node:fs";import _h from"node:path";var Wt,Qr,Uh,$h,jh,gl,Zr=y(()=>{"use strict";xt();C();pe();pl();Wt=500,Qr=(e,t)=>`${e}.${t}`,Uh=e=>e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?c("Sniffed image type","png"):e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?c("Sniffed image type","jpg"):e.length>=6&&(e.subarray(0,6).equals(Buffer.from("GIF87a","ascii"))||e.subarray(0,6).equals(Buffer.from("GIF89a","ascii")))?c("Sniffed image type","gif"):e.length>=12&&e.subarray(0,4).equals(Buffer.from("RIFF","ascii"))&&e.subarray(8,12).equals(Buffer.from("WEBP","ascii"))?c("Sniffed image type","webp"):i(`Unsupported image format. Allowed: ${sd.join(", ")}`),$h=e=>Bh.createHash("sha256").update(e).digest("hex"),jh=(e,t=Wt)=>{if(e.length===0)return i("Attachment is empty");if(e.length>t*1024)return i(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=Uh(e);return a(n)?n:c("Validated attachment data",{hash:$h(e),ext:n.value,bytes:e.length})},gl=(e,t,n=Wt)=>{let r=jh(t,n);if(a(r))return r;let o=Uo(e),s=_h.join(o,Qr(r.value.hash,r.value.ext));try{Zi.existsSync(s)||(Zi.mkdirSync(o,{recursive:!0}),Zi.writeFileSync(s,t))}catch(d){return i(`Unable to write attachment blob: ${d instanceof Error?d.message:String(d)}`)}return c("Wrote attachment blob",r.value)}});import Hh from"zod";var eo,to,fl,ea=y(()=>{"use strict";On();Zr();ue();C();Re();Ue();k();eo=50,to=5e3,fl=()=>{let e=de().commandMeta.inputString,t=Hh.coerce.number().int().min(eo).max(to).safeParse(e);if(!t.success)return i(`Attachment size cap must be ${eo}-${to} KB (default ${Wt})`);let n=it({attachmentMaxKb:t.data});return a(n)?n:(nt({attachmentMaxKb:t.data}),E({mode:h.DEFAULT}),c(`Attachment size cap set to ${t.data} KB`,null))}});import hl from"chalk";var na,vl,ta,yl,Wh,Gh,bl,qh,Vh,no,Oe,xl,Il,bs,zh,Kh,xs,kt=y(()=>{"use strict";ls();na={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},vl=(e,t,n)=>Math.max(t,Math.min(n,e)),ta=(e,t,n)=>e+(t-e)*n,yl=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Wh=e=>e.toLowerCase().trim(),Gh=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,d=e/60,l=s*(1-Math.abs(d%2-1)),u=0,m=0,p=0;d>=0&&d<1?(u=s,m=l):d>=1&&d<2?(u=l,m=s):d>=2&&d<3?(m=s,p=l):d>=3&&d<4?(m=l,p=s):d>=4&&d<5?(u=l,p=s):(u=s,p=l);let f=o-s/2;return[Math.round((u+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},bl=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,qh=(e,t,n)=>{let r=vl(n,0,1);return[Math.round(ta(e[0],t[0],r)),Math.round(ta(e[1],t[1],r)),Math.round(ta(e[2],t[2],r))]},Vh=(e,t,n)=>qh(e,t,n),no=e=>{let t=yl(e)%360,n=Gh(t,na.stringColor.saturation,na.stringColor.lightness);return bl(n)},Oe=(e,t=Qn)=>{let n=Wh(e);return n&&t[n]?t[n]:no(n)},xl=e=>{let t=na.gradient.stops,n=vl(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,s=Math.min(Math.floor(o),r-1),d=o-s;return Vh(t[s],t[s+1],d)},Il=e=>bl(xl(e)),bs=e=>yl(e.toLowerCase().trim())/4294967295,zh=e=>{let t=bs(e);return xl(t)},Kh=e=>{let[t,n,r]=zh(e);return{normal:o=>hl.bgRgb(t,n,r).black(o),cursor:o=>hl.bgRgb(t,n,r).white.bold(o)}},xs=e=>Kh(e).normal(` ${e} `)});var ft,ro=y(()=>{"use strict";ft=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null});import{createHash as Yh}from"node:crypto";var Xh,Jh,Te,er=y(()=>{"use strict";Xh="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Jh=e=>{let t=Yh("sha256").update(e).digest(),n=0n;for(let o=0;o<16;o++)n=n<<8n|BigInt(t[o]);let r="";for(let o=0;o<26;o++){let s=BigInt((25-o)*5);r+=Xh[Number(n>>s&31n)]}return r},Te=(e,t)=>Jh(`${e}:virtual:${t}`)});import El from"chalk";var ee,we,Me,Rl=y(()=>{"use strict";kt();Fe();ee=e=>El.dim(e),we=e=>El.hex(S.primary)(e),Me=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let d=o.trim();if(d.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(d))].sort((f,I)=>bs(f)-bs(I)).slice(0,r).map(f=>xs(f)).join(" ");return p?`${ee(e)}${p}${ee(n)}`:""}});var ln,Is=y(()=>{"use strict";ln={None:"none",Invalid:"invalid",Valid:"valid"}});import Cl from"chalk";var Qh,Nl,ce,Y,$,tr,Sl,Es,ra,Zh,Bn,ev,tv,nv,rv,ov,Al,Tl=y(()=>{"use strict";is();Kr();ol();dt();xt();C();ge();Ue();ea();Zr();k();kt();ro();Yr();er();Rl();Pn();Is();cn();Xr();Qh=["BOARD","TICKET","SWIMLANE"],Nl=()=>{let e=g().selectedNode;if(!e?.context)return $({message:ee("Missing target context")});if(Qh.includes(e.context))return Y();if(e.parentNodeId){let t=g().nodes[e.parentNodeId];if(t?.id===Te(t?.parentNodeId??"","comments"))return Y()}return $({message:ee("Command not available in this context")})},ce="<ENTER> to confirm",Y=(e="",t=[])=>({message:ee(e),validity:ln.Valid,completionWordList:t}),$=({message:e,completionWordList:t=[]})=>({validity:ln.Invalid,message:e,completionWordList:t}),tr=e=>e.length===0,Sl=(e,t)=>{let n=Xe(g().breadCrumb,"BOARD");if(a(n))return $({message:we("Command is not applicable in this context")});let r=od(n.value.id);return a(r)?$({message:we(`Unable to ${t}: board id is not a valid ULID`)}):Zc({date:e,horizonDate:r.value})?null:$({message:we(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},Es=e=>` ${Cl.hex("#000").bgHex(Oe(e))(` ${e} `)} `,ra=({modifier:e})=>{let t="confirm";return e===t?Y(ce):$({message:tr(e)?ee("if you are certain, enter ")+xs(t):"",completionWordList:[t]})},Zh=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?$({message:ee(n)}):Y():$({message:tr(r)?t:"",completionWordList:[...e]}),Bn=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>tr(n)&&tr(r)?$({message:e,completionWordList:[]}):Y(t??ce),ev=({modifier:e,inputString:t})=>{let n=zi();return!tr(e)||!tr(t)?Y(ce):$({message:n.length?ee("number from the list, or a path"):ee("path to an epiq project"),completionWordList:n})},tv=({modifier:e,inputString:t})=>{let n=Ee(v.CONFIG);if(!n.includes(e))return $({message:Me({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case fe.EDITOR:{let r=[...rl];return t.trim()?r.includes(t.trim())?Y(ce):$({message:Me({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):$({message:Me({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case fe.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?Y(ce):$({message:Me({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case fe.USERNAME:return t.trim()?Y(ce):$({message:we("Enter a user name. Saved in ")+Cl.bgBlack("~/.epiq-global/config.json")});case fe.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?Y(ce):$({message:Me({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case fe.AUTOSYNC:{let r=["on","off"],o=xe().autoSync;if(!r.includes(t.trim())){let s=Xc(o);return $({message:Me({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return Y(ce)}case fe.ATTACHMENT_MAX_KB:{let r=xe().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<eo||o>to){let s=Me({prefix:" examples: ",wordList:Vi,minLengthForHints:0,inputString:t});return $({message:we(`provide a size cap in KB (${eo}-${to}). current: ${r??Wt} KB.`)+s,completionWordList:Vi})}return Y(ce)}case fe.SYNC_DEBOUNCE_MS:{let r=xe().autoSyncIntervalMs,o=Uc(t);if(!t.trim()||o===null||o<Xn){let s=Me({prefix:" examples: ",wordList:qi,minLengthForHints:0,inputString:t});return $({message:we(`provide duration above ${Xn}ms. current duration: ${r}ms.`)+s,completionWordList:qi})}return Y(ce)}default:return $({message:we("Unknown config option"),completionWordList:n})}},nv=({modifier:e,inputString:t})=>{let n=Ee(v.EDIT);if(!n.length)return $({message:we("Command not available in this context")});if(!n.includes(e)){let r=Me({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return $({message:r||we("Unknown edit option"),completionWordList:n})}switch(e){case et.COMMENT:return t.trim()?Y(ce):$({message:ee("write a comment...")});case et.TITLE:return Y(ce);case et.DESCRIPTION:{let{preferredEditor:r}=xe();return r?Y(ee("<ENTER> to edit in ")+r):$({message:"No editor selected"})}default:return $({message:we("Unknown edit option"),completionWordList:n})}},rv=({modifier:e})=>{let t=Ee(v.YANK);return t.length?t.includes(e)?Y(ce+ee(" and copy to clipboard")):$({message:Me({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):$({message:we("Nothing selected to copy from")})},ov={[v.EXPORT]:()=>Y(ce+ee(", and create export markdown file")),[v.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return Y(ce);let n={message:ee("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=Dn(r);if(!r||!o)return $(n);let s=Sl(o,"peek");return s||Y(ce)},[v.REPLAY]:e=>{let{dateInput:t,durationInput:n}=gs(e.modifier,e.inputString),r={message:ee("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=Dn(t);if(!t||!o)return $(r);let s=Sl(o,"replay");return s||(n&&ps(n)===null?$({message:we("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):Y("<ENTER> to replay board history",n?nl:[]))},[v.EXIT]:()=>Y(ce+ee(" and exit the application")),[v.INIT]:()=>Y(ce),[v.OPEN]:ev,[v.PALETTE]:()=>Y(ce),[v.FILTER]:e=>{if(e.modifier==="clear")return Y(ce);let t=s=>Ee(v.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return $({message:Me({wordList:Ee(v.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Ee(v.FILTER)});let n=Object.values(g().tags).map(s=>s.name),r=Object.values(g().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?$({message:Me({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):Y():$({message:Me({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[v.NONE]:e=>{let t=Ee(v.NONE);return $({message:Me({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[v.NEW]:e=>Zh({list:Ee(v.NEW),hint:Me({wordList:Ee(v.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[v.HELP]:()=>Y(ce),[v.EDIT]:nv,[v.COMMENT]:e=>{let t=Bn({hint:ee(`write a comment (max ${4e3} char)...`),onOk:ee(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===ln.Invalid?t:e.inputString.length>4e3?Y(we("max input exceeded")):t},[v.CONFIG]:tv,[v.YANK]:rv,[v.DELETE]:e=>{let t=Nl();return t.validity==="invalid"?t:ra(e)},[v.CLOSE_ISSUE]:e=>ra(e),[v.RE_OPEN_ISSUE]:e=>ra(e),[v.MOVE]:e=>{let t=Nl();return t.validity==="invalid"?t:Bn({hint:Me({prefix:"hey hacker! These commands are blocked for you... ",wordList:Ee(v.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[v.TAG]:e=>{let n=x.getExistingTags().slice(0,10).map(Es).join("");return Bn({hint:n.length?ee("create tag or reuse:")+n+ee(""):ee("create tag ...")})(e)},[v.UNTAG]:e=>{let t=us();if(a(t))return $({message:we("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Es).slice(0,10);return n.length?Bn({hint:ee(" ... ")+n.join("")})(e):$({message:we("Issue has no tags"),completionWordList:[]})},[v.ASSIGN]:e=>{let t=x.getExistingAssignees().map(Es).slice(0,10);return Bn({hint:ee("assignees... ")+t.join("")})(e)},[v.UNASSIGN]:e=>{let t=ms();if(a(t))return $({message:we("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Es).slice(0,10);return n.length?Bn({hint:ee("remove assignee... ")+n.join("")})(e):$({message:we("Issue has no assignees"),completionWordList:[]})},[v.SYNC]:()=>Y(ce),[v.COFFEE]:e=>{let{modifier:t}=e,n=Ee(v.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?$({message:ee("enter an amount ... "),completionWordList:n.filter(r=>r.startsWith(t))}):Bn({hint:Me({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},Al=Object.fromEntries(Object.entries(ov).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]))});var Rs,wl=y(()=>{"use strict";Rs=["add","fix","bug","log","run","api","cli","ui","ux","test","mock","stub","sync","hash","sign","fork","push","pull","lock","warn","leak","hang","node","seed","lint","edit","save","load","read","send","drop","swap","wrap","port","host","role","user","auth","flag","diff","perf","docs","todo","task","team","epic","spec","remove","update","change","improve","enhance","refactor","rewrite","redesign","implement","build","create","delete","rename","migrate","upgrade","downgrade","revert","rollback","restore","replace","deprecate","cleanup","simplify","optimize","stabilize","harden","document","clarify","investigate","debug","reproduce","triage","mitigate","remediate","resolve","escalate","verify","validate","benchmark","profile","audit","monitor","instrument","configure","provision","deploy","release","publish","integrate","automate","support","enable","disable","prevent","handle","ensure","prioritize","estimate","schedule","track","install","uninstall","enforce","expose","extract","inject","override","extend","customize","localize","translate","redirect","forward","dispatch","broadcast","subscribe","unsubscribe","register","allocate","reserve","persist","retrieve","archive","expire","refresh","reload","reset","recover","replay","retry","scaffold","bootstrap","finalize","terminate","suspend","resume","cancel","abort","notify","alert","trigger","debounce","frontend","backend","fullstack","infrastructure","architecture","integration","application","environment","framework","platform","service","component","module","gateway","pipeline","container","orchestrator","middleware","endpoint","interface","database","datastore","cache","queue","scheduler","worker","daemon","runtime","library","package","plugin","extension","webhook","microservice","monolith","repository","namespace","cluster","sandbox","tenant","dashboard","console","portal","client","server","browser","mobile","desktop","kernel","driver","protocol","schema","migration","fixture","template","snippet","config","manifest","bundle","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","workaround","failure","outage","crash","freeze","corruption","inconsistency","severity","criticality","diagnostics","analysis","blocker","flaky","timeout","mismatch","misconfiguration","boundary","overflow","underflow","panic","stacktrace","breakage","breaking","oversight","ambiguity","discrepancy","anomaly","authorize","authenticate","confidentiality","availability","accessibility","reliability","compliance","governance","encrypt","decrypt","integrity","traceability","accountability","protection","privileges","permissions","sanitize","escape","vulnerability","exposure","secrets","credentials","certificate","session","cookie","identity","tokenization","rotation","scanning","hardening","threat","exploit","payload","injection","phishing","breach","dependency","orchestrate","synchronize","compatibility","incompatibility","interoperability","observability","telemetry","discovery","registration","coordination","distribution","isolation","virtualization","networking","routing","proxy","firewall","balancer","failover","topology","replica","shard","region","capacity","quota","metrics","logging","tracing","alerting","monitoring","heartbeat","liveness","rollover","serialize","deserialize","initialize","instantiate","propagate","aggregate","consolidate","normalize","standardize","transform","reconcile","correlate","index","partition","enrich","filter","stream","batch","parse","encode","decode","compress","decompress","deduplicate","paginate","query","ingest","export","import","backup","snapshot","mapping","record","dataset","metadata","checksum","rollup","lookup","cursor","truncate","concurrency","parallelism","contention","deadlock","throttle","backpressure","fragmentation","saturation","exhaustion","replicate","redundancy","obsolescence","starvation","overload","latency","throughput","scalability","bottleneck","memoize","prefetch","warmup","autoscale","horizontal","vertical","elasticity","recursion","allocation","leakage","garbage","collection","pooling","buffering","caching","eviction","staleness","modularize","encapsulate","abstraction","extensibility","configurability","maintainability","recoverability","readability","testability","debuggability","reusability","simplicity","consistency","linting","formatting","typecheck","coverage","tooling","scaffolding","boilerplate","technical","cleanliness","naming","comments","docstring","testing","unittest","mocking","stubbing","assertion","smoke","sanity","fuzzing","flakiness","harness","scenario","baseline","performance","functionality","requirement","recommendation","improvement","enhancement","description","acceptance","criteria","deliverable","milestone","iteration","backlog","roadmap","followup","hotfix","patch","changelog","rollout","feature","spike","proposal","specification","priority","sprint","story","subtask","assignee","reviewer","reproduction","context","expected","actual","impact","workflow","version","tracking","discussion","decision","tradeoff","feedback","approval","planning","breakdown","scoping"]});var sv,iv,av,dv,cv,Ml,kl,Ll,Pl=y(()=>{"use strict";C();k();wl();sv=3,iv=new Set(["the","and","for","are","but","not","you","all","any","can","was","one","our","out","use","this","that","with","have","from","will","your","they","them","then","than","when","what","were","been","into","should","would","could","about"]),av=e=>{let t=[];for(let n of Object.values(e.nodes)){n.title&&t.push(n.title);let r=n.props;typeof r.description=="string"&&t.push(r.description),typeof r.value=="string"&&t.push(r.value)}for(let n of Object.values(e.tags))t.push(n.name);for(let n of Object.values(e.contributors))t.push(n.name);for(let n of Object.values(e.comments))t.push(n.md);return t},dv=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=sv&&!iv.has(t)&&!/^\d+$/.test(t)),cv=e=>{let t=new Map;for(let s of av(e))for(let d of dv(s))t.set(d,(t.get(d)??0)+1);let n=[...t.entries()].sort((s,d)=>d[1]-s[1]||s[0].localeCompare(d[0])).map(([s])=>s),r=new Set(n),o=Rs.filter(s=>!r.has(s));return[...n,...o]},Ml=Rs,kl=-1,Ll=()=>{let e=Ge();if(a(e))return Rs;let t=e.value,n=t.eventLog.length;return n!==kl&&(Ml=cv(t),kl=n),Ml}});var Dl,Fl,oa=y(()=>{"use strict";fd();cn();Pn();Tl();Pl();k();ue();Dl=e=>Object.values(v).includes(e),Fl=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:d,validity:l,completionWordList:u}=Al[n].validate(n,r,s),m=n!==v.PEEK&&n!==v.REPLAY,p=o==="command"||o==="modifier"?Ee(n):m?Ll():[],{mode:f}=g(),I=f===h.COMMAND_LINE?d??"":"",N=[...u,...p];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:I,autoCompletion:t?gd(e,N):{hint:"",hints:[],remainder:"",overlap:0}}}});var Ol,lv,uv,mv,Bl=y(()=>{"use strict";oa();cn();Ol=e=>{let t=e.trimStart(),n=uv(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),d=mv(e),l=Dl(r)?r:null,u=l!==null,m=r!=="",p=l?Ee(l)??[]:[],f=l&&p.includes(o)?o:"",I="word";n.length===0||n.length===1&&!s?I="command":(n.length===1&&s||n.length===2&&!s)&&(I="modifier");let N=s?"":d,A=lv(t,l,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:d,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:s,modifier:f,target:I,inputToMatch:N,inputString:A}},lv=(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},uv=e=>e.trim()?e.trim().split(/\s+/):[],mv=e=>e.trimEnd().split(/\s+/).at(-1)??""});import{useSyncExternalStore as sA}from"react";var nr,sa,rr,pv,_l,Lt,oo,ia,aa,Ul,$l,Ns,jl,V,Hl,Wl,Gl,de,Ss,Re=y(()=>{"use strict";oa();Bl();C();Is();nr=e=>e===sa||e===":",sa=" ",rr={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:ln.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},pv=new Set,_l=()=>{for(let e of pv)e()},Lt=e=>{let n=e(rr),r=Ol(n.value),o=n.cursorPosition===n.value.length;rr={...n,commandMeta:Fl(r,o)},_l()},oo=({message:e,status:t})=>{let n=structuredClone(rr);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,rr=n,_l(),c(e,null)},ia=e=>{Lt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},aa=e=>{Lt(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&nr(n[o-1]);)o--;for(;o>0&&!nr(n[o-1]);)o--}else{for(;o<n.length&&!nr(n[o]);)o++;for(;o<n.length&&nr(n[o]);)o++}return{...t,cursorPosition:o}})},Ul=()=>{Lt(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}})},$l=()=>{Lt(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&nr(t[r-1]);)r--;for(;r>0&&!nr(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},Ns=e=>{Lt(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),s=e(r,t.commandMeta.autoCompletion),d=s+o,l=Math.max(0,Math.min(s.length,d.length));return{...t,value:d,cursorPosition:l,commandIsPending:!1}})},jl=()=>{Lt(e=>({...e,commandIsPending:!0}))},V=e=>{Lt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Hl=({addToHistory:e=!0})=>{Lt(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},Wl=()=>{Lt(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}})},Gl=()=>{Lt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},de=()=>rr,Ss=()=>{let[e,...t]=rr.value.split(sa);return t.join(sa).trim()}});var D,In=y(()=>{"use strict";ue();ad();k();Re();Ue();D={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",EditTitle:"editTitle",EditDescription:"editDescription",Yank:"yank",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"}});var ql,F,da=y(()=>{"use strict";k();Pn();ql=e=>{let{context:t}=g().contextNode;if(!t)return F.None;switch(e){case v.EXIT:return F.Exit;case v.EXPORT:return F.Export;case v.COFFEE:return F.Coffee;case v.INIT:return F.Init;case v.OPEN:return F.OpenProject;case v.DELETE:return F.Delete;case v.EDIT:return F.Edit;case v.COMMENT:return F.Comment;case v.HELP:return F.ViewHelp;case v.RE_OPEN_ISSUE:return F.ReopenIssue;case v.CLOSE_ISSUE:return F.CloseIssue;case v.TAG:return F.TagTicket;case v.UNTAG:return F.UntagTicket;case v.ASSIGN:return F.AssignUserToTicket;case v.UNASSIGN:return F.UnassignUserFromTicket;case v.NEW:return F.NewItem;case v.FILTER:return F.Filter;case v.MOVE:return F.Move;case v.PEEK:return F.Peek;case v.REPLAY:return F.Replay;case v.CONFIG:return F.Config;case v.YANK:return F.Yank;case v.SYNC:return F.Sync;default:return F.None}},F={Exit:"exit",Init:"init",OpenProject:"open-project",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Replay:"replay",Yank:"yank",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export",Coffee:"coffee"}});import{Text as Vl}from"ink";import zl,{useEffect as Kl,useState as gv}from"react";var Yl,ze,or=y(()=>{"use strict";k();Fe();Yl={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},ze=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Ke(),r=Yl[n]??Yl.default,[o,s]=gv(0);if(Kl(()=>{s(0)},[r]),Kl(()=>{if(!e)return;let l=setInterval(()=>{s(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return zl.createElement(Vl,null,t);let d=r[o]??r[0]??t;return zl.createElement(Vl,{color:S.accent,dimColor:o===1},d)}});import{Box as ca,Text as fv}from"ink";import Cs from"react";var hv,un,so=y(()=>{"use strict";Fe();hv=(e,t,n,r)=>{let o=u=>Math.max(1,e[u]??1),s=n,d=n+1,l=o(n);for(;d<t&&l+o(d)<=r;)l+=o(d),d++;for(;s>0&&l+o(s-1)<=r;)s--,l+=o(s);return{start:s,end:d}},un=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,itemHeights:o,scrollByOne:s=!1})=>{if(e.length===0)return null;let d=Math.max(1,Math.floor(t)),l=Math.max(1,Math.ceil(r)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(1,Math.floor(d/l)),p=Math.max(0,e.length-m),{start:f,end:I}=o?hv(o,e.length,u,d):s?{start:Math.min(p,Math.max(0,u-m+1)),end:Math.min(p,Math.max(0,u-m+1))+m}:{start:Math.min(p,Math.floor(u/m)*m),end:Math.min(p,Math.floor(u/m)*m)+m},N=Math.max(1,I-f),A=e.slice(f,I),w=e.length>N,T=d,M=w?Math.max(1,Math.floor(N/e.length*T)):T,U=Math.max(0,T-M),ne=Math.max(1,e.length-N),be=w?Math.floor(f/ne*U):0;return Cs.createElement(ca,{flexDirection:"row",height:d,width:"100%"},Cs.createElement(ca,{flexDirection:"column",flexGrow:1,height:d},A),Cs.createElement(ca,{flexDirection:"column",width:1,height:T},Array.from({length:T}).map((Q,q)=>Cs.createElement(fv,{key:q,color:w&&q>=be&&q<be+M?S.accent:S.secondary},w?"\u2502":" "))))}});var Xl,la,vv,As,ua=y(()=>{"use strict";k();vv=()=>{let{eventLog:e=[]}=g();if(la&&Xl===e)return la;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return Xl=e,la=t,t},As=e=>vv().has(e)});import{Text as yv}from"ink";import bv from"react";var xv,Iv,sr,Ts=y(()=>{"use strict";ls();kt();ge();ua();Xt();xv=e=>e.toLowerCase().trim(),Iv=(e,t=Qn)=>{let n=xv(e);return t[n]?t[n]:no(n)},sr=({id:e,isSelected:t,maxWidth:n})=>{let r=x.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:It(o,n);return bv.createElement(yv,{underline:t,color:Iv(o)},"@"+s,As(e)?"":"\u2197")}});import{Text as Ev}from"ink";import Rv from"react";var ws,ma=y(()=>{"use strict";ge();Fe();kt();Xt();ws=({id:e,isSelected:t,maxWidth:n})=>{let r=x.getTag(e);if(!r)return;let o=n===void 0?r.name:It(r.name,n);return Rv.createElement(Ev,{underline:t,backgroundColor:Oe(r.name),color:S.secondary}," "+o+" ")}});import{useEffect as Nv,useState as Sv}from"react";var Cv,Jl,Ms,io,Av,Tv,ir,ks=y(()=>{"use strict";kt();Cv=80,Jl=1400,Ms=new Set,io=null,Av=e=>(Ms.add(e),io||(io=setInterval(()=>{for(let t of Ms)t()},Cv)),()=>{Ms.delete(e),Ms.size===0&&io&&(clearInterval(io),io=null)}),Tv=()=>{let e=Date.now()%Jl/Jl;return e<.5?e*2:(1-e)*2},ir=e=>{let[,t]=Sv(0);return Nv(()=>{if(e)return Av(()=>t(n=>n+1))},[e]),Il(Tv())}});import{Box as ar,Text as dr}from"ink";import Ye from"react";var wv,Ql,Mv,kv,eu,tu=y(()=>{"use strict";ge();Fe();Xt();ua();en();Yr();Ts();ma();ks();wv=(e,t,n)=>{if(e.length<=t)return[e,null];let r=e.lastIndexOf(" ",t),o=r>0?r:t;return[e.slice(0,o),It(e.slice(o).trim(),n)]},Ql=3,Mv=2,kv=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let d=e.length-o-1,l=d>0?String(d).length+1:0;if(r+s.width+l>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},eu=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=ir(r),s=e-4,d=s-7-1,[l,u]=wv(Le(t.title),d,s),m=u?null:It(Le(t.props.description),s)||null,p=an(t),f=dn(t).map(M=>({...M,name:M.name})),I=Math.max(1,s-Ql),N=x.getCommentsByIssue(t.id),A=N.length?String(N.length).length+2+1:0,{shown:w,hidden:T}=kv([...p.map(M=>({id:M.id,isTag:!0,width:Math.min(M.name.length,I)+Ql})),...f.map(M=>({id:M.id,isTag:!1,width:Math.min(M.name.length,I)+Mv+(As(M.id)?0:1)}))],s-A);return Ye.createElement(ar,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?S.accent:S.secondary,justifyContent:"space-between"},Ye.createElement(ar,{paddingLeft:1,paddingRight:1,flexDirection:"column"},Ye.createElement(ar,{justifyContent:"space-between"},Ye.createElement(dr,{color:S.primary},l),Ye.createElement(dr,{color:S.secondary2,dimColor:!0},K(t.id))),u&&Ye.createElement(dr,{color:S.primary},u),m&&Ye.createElement(dr,{color:S.secondary2,dimColor:!0},m)),Ye.createElement(ar,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},Ye.createElement(ar,{flexDirection:"row"},w.map(M=>Ye.createElement(ar,{paddingRight:1,key:M.id},M.isTag?Ye.createElement(ws,{id:M.id,maxWidth:I}):Ye.createElement(sr,{id:M.id,maxWidth:I}))),T>0&&Ye.createElement(dr,{color:S.secondary2,dimColor:!0},"+",T)),N.length>0&&Ye.createElement(dr,{color:S.accent},"[",N.length,"]")))}});import{Box as _n,Text as ao}from"ink";import tt from"react";var Lv,nu,ru=y(()=>{"use strict";ue();ge();Fe();kt();or();ks();Lv=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,nu=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:d})=>{let l=ir(s),u=(r.props.tags??[]).map(Q=>x.getTag(Q)).filter(Q=>!!Q),m=(r.props.assignees??[]).map(Q=>x.getContributor(Q)).map(Q=>Q&&{...Q,name:Q.name}).filter(Q=>!!Q),p=1,f=u.length*(1+p),I=m.length*(2+p),N=u.map(Q=>tt.createElement(_n,{key:Q.id,paddingRight:p},tt.createElement(ao,{color:Oe(Q.name)},"\u25A0"))),A=m.map(Q=>tt.createElement(_n,{key:Q.id,paddingRight:p},tt.createElement(ao,{color:no(Q.name)},"@"+Q.name.at(0)))),w=s?l:o?S.accent:d===h.MOVE?S.secondary:S.primary,T=x.getCommentsByIssue(r.id),M=T.length?String(T.length).length+2+p:0,U=T.length?tt.createElement(_n,{paddingRight:p},tt.createElement(ao,{color:S.accent},"[",T.length,"]")):null,ne=f+I+M,be=Math.max(1,n-t-ne-(ne>0?1:0));return tt.createElement(_n,{justifyContent:"space-between"},tt.createElement(_n,null,tt.createElement(_n,{width:t},o?tt.createElement(ze,{isSelected:!0}):tt.createElement(ao,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),tt.createElement(ao,{wrap:"truncate",color:w},Lv(r.title,be))),tt.createElement(_n,null,N,A,U))}});import Pv from"chalk";import{Box as pa,Text as Dv}from"ink";import Pt from"react";var Fv,ou,su=y(()=>{"use strict";he();k();Fe();or();so();tu();ru();ks();Fv=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:d,mode:l})=>{let{renderedChildrenIndex:u,replay:m}=Ke(),p=u[e.id]??[],f=m?new Set(m.flashNodeIds):null,I=f?.has(e.id)??!1,N=ir(I),A=`${e.title} ${Pv.hex(S.secondary2).dim("("+p.length+")")}`,w=3,T=o?1:5,M=s&&d===-1,U=n-3-(o?1:0)-(M?2:0),ne=Math.max(2,String(p.length).length+1),be=r-w-1,Q=Pt.createElement(pa,{borderStyle:"round",borderColor:S.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},Pt.createElement(ze,{isSelected:t}),Pt.createElement(Dv,{bold:!0,color:I?N:t?S.accent:S.primary},A," ",e.readonly?"\u{1F512}":"")),q=(z,yn)=>{let bn=s&&d===yn;if(!P(z))return null;let pr=f?.has(z.id)??!1;return o?Pt.createElement(nu,{key:z.id,index:yn,labelWidth:ne,width:U,ticket:z,isSelected:bn,isFlashing:pr,mode:l}):Pt.createElement(eu,{key:z.id,width:U,ticket:z,isSelected:bn,isFlashing:pr})};return Pt.createElement(pa,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?S.accent:S.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},Q,Pt.createElement(pa,null,p.length>0&&Pt.createElement(un,{selectedIndex:d,height:be,itemHeight:T},p.map(q)),M&&Pt.createElement(ze,{isSelected:!0})))},ou=Pt.memo(Fv)});var iu,au,ga=y(()=>{"use strict";Sn();iu=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},au=(e,t,n)=>Ae.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0})});var cr,Ls=y(()=>{"use strict";cr=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let s=Math.floor(t/o);if(s>=1)return`${s}${r} ago`}return"just now"}});import{Box as lr,Text as Gt}from"ink";import Be,{useEffect as Ov,useMemo as Bv,useRef as _v}from"react";import{decodeTime as du}from"ulid";function lu({ticket:e,width:t,height:n}){let r=Bv(()=>$v(e),[e]),o=_v([]);Ov(()=>(cu(o.current),o.current=Hv(e,r),()=>{cu(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Ke(),l=Math.max(1,n-4),u=Math.max(12,t-32);return r.length===0?Be.createElement(lr,{flexDirection:"column",width:t,height:n,padding:1},Be.createElement(Gt,{color:S.primary},"No attachments yet."),Be.createElement(lr,{paddingTop:1},Be.createElement(Gt,{color:S.primary},"Attach images from the browser GUI"),Be.createElement(Gt,{color:S.accent}," epiq gui "),Be.createElement(Gt,{color:S.primary},"by dropping or pasting them."))):Be.createElement(lr,{flexDirection:"column",width:t,height:n},Be.createElement(lr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:S.secondary,borderStyle:"single",paddingBottom:1},Be.createElement(Gt,{color:S.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),Be.createElement(un,{height:l,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let f=p===s,I=m.name.length>u?m.name.slice(0,u-1)+"\u2026":m.name;return Be.createElement(lr,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Be.createElement(Gt,{color:S.accent},f?"\u276F ":" "),Be.createElement(lr,{paddingLeft:1},Be.createElement(Gt,{color:S.secondary2},`#${p+1} `),Be.createElement(Gt,{color:f?S.accent:S.primary},I),Be.createElement(Gt,{color:S.secondary2}," "+Wv(m.bytes)+" "+cr(bt(m.id)))))})))}var Uv,$v,cu,jv,Hv,Wv,uu=y(()=>{"use strict";Ze();dt();Ls();he();C();ge();Sn();k();Fe();er();so();Uv=e=>Te(e,"attachments"),$v=e=>x.getAttachmentsByIssue(e.id).sort((t,n)=>du(t.id)-du(n.id)),cu=e=>{for(let t of e)x.deleteNode(t.id)},jv=(e,t,n)=>Ae.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),Hv=(e,t)=>{let n=x.getNode(Uv(e.id));if(!n||!Je(n))return[];let r=t.map((o,s)=>jv(o,s,n.id)).map(o=>x.createNode(o)).filter(vt).map(({value:o})=>o).filter(Je);return t.length>0&&g().selectedIndex<0&&_.navigate({contextNode:n,selectedIndex:0}),r},Wv=e=>`${Math.max(1,Math.round(e/1024))} KB`});var pu,fa,mu,ha,gu,fu,Gv,hu,qv,va,vu=y(()=>{"use strict";pu=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,fa=e=>e.replace(pu,""),mu=e=>e==="additions"||e==="deletions",ha=e=>{let t=pu.exec(e);if(!t?.[1])return null;let n;try{n=JSON.parse(t[1])}catch{return null}let r=n;return typeof r?.filePath!="string"||typeof r.start!="number"||typeof r.end!="number"||typeof r.note!="string"||!mu(r.side)||!mu(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r},gu=/```\n([\s\S]*?)\n?```\s*$/,fu=e=>gu.exec(e)?.[1]??null,Gv=/`[^`\n]+`[^\n]*\n?$/,hu=e=>fa(e).replace(gu,"").replace(Gv,"").trim(),qv=e=>{let n=(e.endSide??e.side)==="deletions"?"removed":"added";return e.start===e.end?`line ${e.start} (${n})`:`lines ${e.start}-${e.end} (${n})`},va=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${qv(e)}`});var Vv,co,zv,Kv,Yv,Xv,bu,ya,xu,yu,Iu,ba=y(()=>{"use strict";vu();Vv=(e,t)=>{let n=Math.max(1,Math.floor(t)),r=e.split(/\s+/).filter(Boolean);if(r.length===0)return[""];let o=[],s="";for(let d of r){let l=d;for(;l.length>n;)s&&(o.push(s),s=""),o.push(l.slice(0,n)),l=l.slice(n);s?s.length+1+l.length<=n?s=`${s} ${l}`:(o.push(s),s=l):s=l}return s&&o.push(s),o},co=e=>{let t=e.split("`");return t.length%2===0?[{text:e}]:t.map((n,r)=>r%2===1?{text:n,code:!0}:{text:n}).filter(n=>n.text.length>0)},zv=/!\[([^\]]*)\]\([^)]*\)/g,Kv=e=>e.replace(zv,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),Yv=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),Xv=4,bu=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(Xv)),ya=e=>{let t=!1;return e.map(bu).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=ha(n);if(r)return{kind:"caption",text:va(r)};let o=Kv(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:co(s[1]??"")}:{kind:"text",spans:co(o)}})},xu=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],yu=(e,t)=>{let n=[];for(let r of ya(e))if(r.kind!=="fence"){if(r.kind==="blank"){n.length>0&&n[n.length-1]?.kind!=="blank"&&n.push(r);continue}if(r.kind==="code"){for(let o of xu(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of Vv(Yv(r.spans),t))n.push({kind:r.kind,spans:co(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},Iu=(e,t)=>{let n=ha(e),r=n?fu(e):null;if(!n||r===null)return yu(fa(e).split(`
58
- `),t);let o=hu(e),s=r.split(`
59
- `).map(bu),d=n.side===n.endSide?n.start:void 0,l=d===void 0?0:String(d+s.length-1).length+3;return[...o?[...yu(o.split(`
60
- `),t),{kind:"blank"}]:[],{kind:"caption",text:va(n)},...s.flatMap((u,m)=>xu(u,Math.max(1,t-l)).map((p,f)=>({kind:"code",text:p,number:d===void 0||f>0?void 0:d+m})))]}});import{Box as Eu,Text as Un}from"ink";import at from"react";var Ru,xa,Nu,Ia=y(()=>{"use strict";Fe();Ru=({spans:e,bold:t})=>at.createElement(Un,{color:S.primary,bold:t},e.map((n,r)=>n.code?at.createElement(Un,{key:r,color:S.yellow},n.text):at.createElement(Un,{key:r},n.text))),xa=({line:e,width:t,gutter:n=0})=>{switch(e.kind){case"blank":return at.createElement(Un,null," ");case"fence":return at.createElement(Un,{color:S.secondary2},"```");case"caption":return at.createElement(Un,{color:S.accent},e.text);case"heading":return at.createElement(Ru,{spans:e.spans,bold:!0});case"text":return at.createElement(Ru,{spans:e.spans});case"code":{let r=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return at.createElement(Un,{backgroundColor:S.secondary,color:S.primary},r,e.text.padEnd(Math.max(0,t-r.length)))}}},Nu=({lines:e,width:t})=>{let n=e.flatMap(o=>o.kind==="code"&&o.number!==void 0?[o.number]:[]),r=n.length>0?String(Math.max(...n)).length+3:0;return at.createElement(Eu,{flexDirection:"column"},e.map((o,s)=>at.createElement(Eu,{key:s},at.createElement(xa,{line:o,width:t,gutter:r}))))}});import{Box as mn,Text as pn}from"ink";import Se,{useEffect as Jv,useMemo as Su,useRef as Qv}from"react";import{decodeTime as Cu}from"ulid";function Tu({ticket:e,width:t,height:n}){let r=Su(()=>ty(e),[e]),o=Qv([]);Jv(()=>(Au(o.current),o.current=ny(e,r),()=>{Au(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Ke(),l=Math.max(1,n-4),u=Math.max(20,t-8),m=Su(()=>r.map(f=>{let I=Iu(f.md,u);return I.length>0?I:[{kind:"blank"}]}),[r,u]),p=m.map(f=>f.length+Zv);return r.length===0?Se.createElement(mn,{flexDirection:"column",width:t,height:n,padding:1},Se.createElement(pn,{color:S.primary},"No comments yet."),Se.createElement(mn,{paddingTop:1},Se.createElement(pn,{color:S.primary},"Use"),Se.createElement(pn,{color:S.accent}," :comment "),Se.createElement(pn,{color:S.primary},"to add the first one."))):Se.createElement(mn,{flexDirection:"column",width:t,height:n},Se.createElement(mn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:S.secondary,borderStyle:"single",paddingBottom:1},Se.createElement(pn,{color:S.secondary2},"Comments (",r.length,") ")),Se.createElement(un,{height:l,itemHeights:p,selectedIndex:s},r.map((f,I)=>{let N=I===s;return Se.createElement(mn,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:S.secondary,borderStyle:"single"},Se.createElement(mn,{flexDirection:"row",paddingBottom:1},Se.createElement(pn,{color:S.accent},N?"\u276F ":" "),Se.createElement(mn,{paddingLeft:1},Se.createElement(pn,{color:S.secondary2},`#${I+1} `),Se.createElement(sr,{id:f.authorId}),Se.createElement(pn,{color:S.secondary2}," "+cr(bt(f.id))))),Se.createElement(mn,{paddingLeft:3,paddingBottom:1},Se.createElement(Nu,{lines:m[I]??[],width:u})))})))}var Zv,ey,ty,Au,ny,wu=y(()=>{"use strict";Ze();dt();Ls();he();C();ge();k();Fe();er();Ts();so();ga();ba();Ia();Zv=4,ey=e=>Te(e,"comments"),ty=e=>x.getCommentsByIssue(e.id).sort((t,n)=>Cu(t.id)-Cu(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Au=e=>{for(let t of e)x.deleteNode(t.id)},ny=(e,t)=>{let n=x.getNode(ey(e.id));if(!n||!Je(n))return[];let r=t.map((o,s)=>au(o,s,n.id)).map(x.createNode).filter(vt).map(({value:o})=>o).filter(xr);return t.length>0&&g().selectedIndex<0&&_.navigate({contextNode:n,selectedIndex:0}),r}});import{Box as Ps,Text as ry}from"ink";import qt from"react";var Mu,ku=y(()=>{"use strict";he();ge();Vn();k();Fe();Ts();or();ma();Mu=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=Ke(),{title:o}=t,s=t.parentNodeId?x.getNode(t.parentNodeId):void 0,d=s&&P(s)?o===se.ASSIGNEES?s.props.assignees??[]:o===se.TAGS?(s.props.tags??[]).filter(l=>x.getTag(l)):[]:[];return qt.createElement(Ps,{alignItems:"center",paddingTop:1},qt.createElement(Ps,{minWidth:12},qt.createElement(ze,{isSelected:n}),qt.createElement(ry,{color:n?S.accent:S.secondary2},o,":")),qt.createElement(Ps,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((l,u)=>{let m=r.id===t.id&&u===e;return qt.createElement(Ps,{key:`${o}-${l}`,paddingRight:2,minHeight:1},qt.createElement(ze,{isSelected:m}),o===se.ASSIGNEES?qt.createElement(sr,{isSelected:m,id:l}):o===se.TAGS?qt.createElement(ws,{isSelected:m,id:l}):null)})))}});import{Box as lo,Text as Ea}from"ink";import ht,{useEffect as oy,useMemo as Ra}from"react";var sy,Lu,Na,Pu,iy,Sa,Du=y(()=>{"use strict";ge();C();Sn();k();Fe();Xt();or();so();Ia();ba();Gn();sy="\u2029",Lu=(e,t)=>`${e}::inline-line::${t}`,Na=new Map,Pu=e=>{let t=Na.get(e)??[];Na.delete(e);for(let n of t)x.deleteNode(n)},iy=(e,t)=>{Pu(e);let n=[];t.forEach((r,o)=>{let s=rt(BigInt(o+1));if(!vt(s))return;let d=x.createNode(Ae.text({id:Lu(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));vt(d)&&n.push(d.value.id)}),Na.set(e,n)},Sa=({id:e,label:t,text:n,height:r,selected:o,maxWidth:s})=>{let{selectedIndex:d,contextNode:l}=Ke(),u=Ra(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=Ra(()=>u.join("\0"),[u]);oy(()=>(iy(e,u),()=>{Pu(e)}),[e,m]);let p=s-10,I=Ra(()=>ya(u).map(N=>{if(N.kind==="code")return{...N,text:It(N.text,p)};if(N.kind==="text"||N.kind==="heading"){let A=N.spans.map(w=>w.code?`\`${w.text}\``:w.text).join("");return{...N,spans:co(It(A,p))}}return N}),[u,p]).map((N,A)=>{let w=l.id===e&&d===A;return ht.createElement(lo,{key:Lu(e,A)},ht.createElement(Ea,{color:w?S.primary:S.secondary2,dimColor:!w},`${A+1} `.padStart(5,"\xA0")),N.kind==="blank"?ht.createElement(Ea,{backgroundColor:w?"gray":void 0},sy):ht.createElement(lo,null,ht.createElement(xa,{line:N,width:N.kind==="code"?p:0})))});return ht.createElement(lo,{flexDirection:"column",paddingTop:1},ht.createElement(lo,null,ht.createElement(ze,{isSelected:o}),ht.createElement(Ea,{color:o?S.accent:S.secondary2},t)),ht.createElement(lo,{flexDirection:"row",borderStyle:"round",borderColor:S.secondary,paddingLeft:1,marginLeft:1},ht.createElement(un,{scrollByOne:!0,height:r-3,selectedIndex:d,itemHeight:1},I)))}});import{Box as $n,Text as Ca}from"ink";import ke,{useMemo as uo}from"react";var ay,dy,cy,ly,Fu,Ou=y(()=>{"use strict";he();ge();k();Fe();ga();er();uu();wu();or();ku();Du();ay=e=>Te(e,"description"),dy=e=>Te(e,"comments"),cy=e=>Te(e,"history"),ly=e=>Te(e,"attachments"),Fu=({ticket:e,height:t})=>{let n=uo(()=>iu(e),[e]),{selectedIndex:r,contextNode:o}=Ke(),s=process.stdout.columns||120,d=uo(()=>ay(e.id),[e.id]),l=uo(()=>dy(e.id),[e.id]),u=uo(()=>cy(e.id),[e.id]),m=uo(()=>ly(e.id),[e.id]),p=x.getAttachmentsByIssue(e.id).length,f=o.id===e.id,I=o.id===l||o.parentNodeId===l,N=o.id===u||o.parentNodeId===u,A=o.id===m||o.parentNodeId===m,w=ae(e.id);if(I){let z=t-3;return ke.createElement($n,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},ke.createElement(Tu,{ticket:e,width:s,height:z}))}if(A){let z=t-3;return ke.createElement($n,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},ke.createElement(lu,{ticket:e,width:s,height:z}))}if(N){let q=x.getNode(u),z=q&&Je(q)?q.props.value??"":"",bn=t-3;return ke.createElement($n,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},q?ke.createElement(Sa,{id:q.id,label:"Event log",text:z,selected:!1,maxWidth:s,height:bn}):null)}let T=w.reduce((q,z)=>br(z)||z.id===l||z.id===m||z.id===u?q+1:q,0),M=2,U=3,ne=T,be=t-U-ne-M,Q=(q,z)=>q.id===d?ke.createElement(Sa,{key:q.id,id:d,label:"Description (press e to edit)",text:e.props.description??"",selected:z,maxWidth:s,height:be}):br(q)?ke.createElement(Mu,{key:q.id,parent:q,selected:z,selectedIndex:r}):q.id===l?ke.createElement($n,{key:q.id,paddingTop:1},ke.createElement(ze,{isSelected:z}),ke.createElement(Ca,{backgroundColor:S.secondary,color:z?S.accent:S.primary},` Comments (${n}) \u203A\u203A `)):q.id===m?ke.createElement($n,{key:q.id,paddingTop:1},ke.createElement(ze,{isSelected:z}),ke.createElement(Ca,{backgroundColor:S.secondary,color:z?S.accent:S.primary},` Attachments (${p}) \u203A\u203A `)):q.id===u?ke.createElement($n,{key:q.id,paddingTop:1},ke.createElement(ze,{isSelected:z}),ke.createElement(Ca,{backgroundColor:S.secondary,color:z?S.accent:S.primary}," History \u203A\u203A ")):null;return ke.createElement($n,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},w.map((q,z)=>Q(q,f&&r===z)))}});import{Box as uy}from"ink";import Ds from"react";var my,Bu,_u=y(()=>{"use strict";he();su();Ou();my=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:d,width:l})=>{let u=t.context,m=u===B.TICKET||u===B.FIELD_LIST||u===B.FIELD,p=u===B.BOARD||u===B.SWIMLANE,f=u===B.TICKET?t:r.find(T=>T.context===B.TICKET),I=Math.floor(l/3),N=Math.floor(l/Math.max(e.length,1)),A=Math.min(N,I),w=s==="dense";return Ds.createElement(uy,{flexDirection:"row",height:d},p&&e.map((T,M)=>{let U=t.id===T.id,ne=U?n:-1,be=t.context===B.BOARD&&n===M;return Ds.createElement(ou,{key:T.id,height:d,width:A,swimlane:T,isSelected:be,isDense:w,isFocused:U,listSelectedIndex:ne,mode:o})}),m&&f&&Ds.createElement(Fu,{height:d,ticket:f}))},Bu=Ds.memo(my)});import Uu from"node:fs";import py from"node:path";import gy from"react";import{render as fy}from"ink";import{Writable as hy}from"node:stream";var mo,vy,yy,by,xy,$u,ju=y(()=>{"use strict";_u();he();C();k();pe();Ue();mo=e=>String(e).padStart(2,"0"),vy=e=>{let t=e.getUTCFullYear(),n=mo(e.getUTCMonth()+1),r=mo(e.getUTCDate()),o=mo(e.getUTCHours()),s=mo(e.getUTCMinutes()),d=mo(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${d}`},yy=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",by=async(e,{width:t,height:n})=>{let r="",o=new hy({write(d,l,u){let m=xy(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=fy(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),s.unmount(),r},xy=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),$u=async()=>{let{viewMode:e}=xe(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=g(),d=r.find(M=>M.context==="BOARD");if(!d)return i("No board found to export");let l=120,u=40,m=await by(gy.createElement(Bu,{height:u,width:l,swimlanes:(s[d.id]??[]).filter(M=>M!==void 0&&xn(M)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:l,height:u});if(!m)return i("Failed to render board export");let p=$o(process.cwd());if(a(p))return i("Unable to export, epiq root not found");let f=new Date,I=vy(f),N=`board_${yy(d.title)}_${I}.md`,A=_d(p.value);Uu.mkdirSync(A,{recursive:!0});let w=py.join(A,N),T=`# Board - ${d.title}
61
- Date: ${f.toISOString()}
31
+ `,"utf8"),r.push(`${o} (${m.length})`)}catch{continue}}return r},Ph=(e,t)=>{let n=new Set(rr(t));return rr(e).filter(r=>!n.has(r))},Dh=(e,t,n)=>[`Refusing to commit ${e}: it is missing ${t.length} of the ${n} event(s) already committed.`,"","The event log is append-only, so a line can never legitimately go","missing. The working copy on disk is damaged; committing it would","publish that damage to everyone who pulls, and the log carries no way","to undo it.","","Nothing has been committed. The committed history is intact \u2014 recover","the file from it before syncing again:",` git show HEAD:${e}`,"","First dropped event:",` ${t[0]?.slice(0,200)??"<none>"}`].join(`
32
+ `),il=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let r=await Ue({args:["show",`HEAD:${t}`],cwd:e});if(r.exitCode!==0)return l("No committed log to compare against",void 0);let o=Ph(r.stdout,n);return o.length>0?i(Dh(t,o,rr(r.stdout).length)):l("Event log only grew",void 0)}});import Wt from"node:fs";import Yr from"node:path";var Oh,dl,al,Bh,Ki,Yi,Fh,_h,_n,Uh,$h,ds,cl,ll,ul,Xr,ml,Jr=v(()=>{"use strict";N();Rt();Uo();Pr();zi();pt();ut();Oh="[epiq:init-repo]",dl=async e=>{let t=await Ue({args:["rev-parse","--verify","--quiet","HEAD"],cwd:e});if(t.exitCode===0)return l("Initial commit already exists",!1);if(!(t.exitCode===1&&t.stdout.trim()===""&&t.stderr.trim()===""))return i(["Could not determine whether the repository has any commits, so nothing was written.",`git rev-parse exited ${t.exitCode}`,t.stderr.trim()].filter(Boolean).join(`
33
+ `));X.info("Creating initial commit");let r=await W({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(a(r))return i(r.message);let o=await W({args:["commit-tree",r.value.stdout.trim(),"-m",Oh],cwd:e});if(a(o))return i(o.message);let s=await W({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return a(s)?i(s.message):l("Created initial commit",!0)},al=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Bh=async e=>{let t=await Ho(e);if(a(t))return i(t.message);let n=await Vd(e);return a(n)?i(n.message):l("Built sync commit message",`[sync|branch:${al(t.value)}:sha:${al(n.value)}]`)},Ki=async({repoRoot:e,stateBranchName:t})=>{X.info(`Creating ${t}`);let n=await W({args:["commit-tree",Zd,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return i(`Failed to create state branch commit
34
+ ${n.message}`);let r=n.value.stdout.trim(),o=await W({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return a(o)?i(`Failed to create ${t}
35
+ ${o.message}`):l("Created state branch",!0)},Yi=async({repoRoot:e,stateBranchName:t})=>{let n=await jo({repoRoot:e,branch:t});if(a(n))return i(`Ensure local state branch failed
36
+ `+n.message);if(n.value)return l("Local state branch already exists",!1);let r=await Or({repoRoot:e});if(a(r))return i(`Ensure local state branch failed
37
+ `+r.message);let o=r.value,s=o?await vi({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(a(s))return i(`Ensure local state branch failed
38
+ `+s.message);let d=s.value;if(o&&d){let c=await he.fetch({cwd:e,remote:nt,branch:t});if(a(c))return i(`Failed to fetch ${t} from remote
39
+ ${c.message}`)}if(d){let c=await W({args:["branch","--track",t,`${nt}/${t}`],cwd:e});return a(c)?i(`Failed to create local ${t} from remote
40
+ ${c.message}`):l("Created local state branch from remote",!0)}return Ki({repoRoot:e,stateBranchName:t})},Fh=async({repoRoot:e,branch:t})=>{let n=await W({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let r=n.value.stdout.split(`
41
+ `),o=null;for(let s of r){if(s.startsWith("worktree ")){o=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&o)return l("Found worktree for branch",o)}return l("No worktree found for branch",null)},_h=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Br(Yr.dirname(t));if(a(r))return i(`Failed to create state branch worktree
42
+ `+r.message);if(Wt.existsSync(t)&&!Wt.existsSync(Yr.join(t,".git"))){let s=nl(t);if(a(s))return i(s.message);if(s.value.length>0)return i([`Refusing to delete ${t}.`,"","It is not a usable worktree \u2014 it has no .git \u2014 but it still holds",`${s.value.length} event log(s) with content:`,...s.value.map(d=>` ${d}`),"","Deleting it would destroy them, and with no .git here there is no","committed copy to recover from. Move the directory aside and","salvage the logs before letting epiq recreate the worktree."].join(`
43
+ `));X.info("Removing broken state branch worktree path"),rc(t)}X.info("Creating state branch worktree");let o=await he.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?i(`Failed to create state branch worktree
44
+ ${o.message}`):l("Created state branch worktree",!0)},_n=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Fh({repoRoot:e,branch:n});if(a(r))return i(r.message);let o=Dr(t),s=r.value?Dr(r.value):null;if(s&&s===o&&Wt.existsSync(s))return l("State branch already checked out in expected worktree",!1);if(s&&s!==o){let u=await Yd(s);if(a(u))return i(u.message);if(u.value)return i([`Refusing to move the state branch worktree away from ${s}.`,"","It holds changes that are not committed yet, which for this","branch means events no sync has published. Removing it would","destroy them outright \u2014 there is no stash or reflog to recover","a deleted worktree from.","",`This worktree is expected at ${o}, so something else is`,"using a different EPIQ_GLOBAL_DIR against the same repository.","Sync from that location first, or point both at the same one."].join(`
45
+ `));X.info("Moving state branch worktree to expected location");let m=await he.worktreeRemove({cwd:e,worktreeRoot:s});if(a(m))return i(`Failed to remove existing state branch worktree
46
+ ${m.message}`)}if(s&&!Wt.existsSync(s)){X.info("Pruning stale state branch worktree");let u=await he.worktreePrune({cwd:e});if(a(u))return i(`Failed to prune stale worktrees
47
+ ${u.message}`)}let d=await qd({repoRoot:e,worktreeRoot:t});if(a(d))return i(d.message);let c=Wt.existsSync(t);if(d.value&&c)return l("State branch worktree already exists",!1);if(d.value&&!c){X.info("Pruning missing registered state branch worktree");let u=await he.worktreePrune({cwd:e});if(a(u))return i(`Failed to prune stale worktrees
48
+ ${u.message}`)}return _h({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Uh=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Ho(e);if(a(n))return i(n.message);if(n.value===t)return l("State branch already checked out",!1);(await Ue({cwd:e,args:["rebase","--abort"]})).exitCode===0&&X.info("Aborted stale state branch rebase");let o=await he.checkout({cwd:e,branch:t});return a(o)?i(`Failed to checkout ${t}
49
+ ${o.message}`):l("Checked out state branch",!0)},$h=async({repoRoot:e,stateBranchRoot:t})=>{let n=await yi(t);if(a(n))return i(n.message);if(n.value)return l("State branch upstream already configured",!1);let r=await Or({repoRoot:t});if(a(r))return i(r.message);if(!r.value)return l("No remote available for state branch upstream",!1);let o=Zt(e);if(a(o))return o;let s=o.value,d=await vi({repoRoot:t,branch:s});if(a(d))return i(d.message);if(!d.value)return l("Remote state branch missing; upstream will be configured on first push",!1);X.info(`Configuring ${s} upstream`);let c=await he.fetch({cwd:t,remote:nt,branch:s});if(a(c))return i(`Failed to fetch ${s}
50
+ ${c.message}`);let u=await he.setUpstream({cwd:t,branch:s,upstream:`${nt}/${s}`});return a(u)?i(`Failed to set state branch upstream
51
+ ${u.message}`):l("Configured state branch upstream",!0)},ds=async({stateBranchRoot:e,eventFileName:t})=>{let n=ec(t),r=Yr.join(e,n);if(!Wt.existsSync(r))return l("No event file to stage",null);let o=await il({stateBranchRoot:e,relativePath:n,workingContent:Wt.readFileSync(r,"utf8")});if(a(o))return i(o.message);let s=await he.stage({cwd:e,pathspec:[n]});return a(s)?i(`Failed to stage state branch event file
52
+ ${s.message}`):l("Staged state branch event file",n)},cl=async({stateBranchRoot:e})=>{let t=tc(),n=Yr.join(e,t);if(!Wt.existsSync(n))return l("No media directory to stage",null);let r=await he.stage({cwd:e,pathspec:[t],ignoreRemoval:!0});return a(r)?i(`Failed to stage state branch media files
53
+ ${r.message}`):l("Staged state branch media files",t)},ll=async({stateBranchRoot:e})=>{let t=Ei();if(!Wt.existsSync(Yr.join(e,t)))return l("No event log attributes to stage",null);let n=await he.stage({cwd:e,pathspec:[t]});return a(n)?i(`Failed to stage event log attributes
54
+ ${n.message}`):l("Staged event log attributes",t)},ul=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await Bh(e);return a(r)?i(`Create state branch sync commit failed
55
+ `+r.message):er({cwd:t,message:r.value,pathspec:n})},Xr=async({repoRoot:e,stateBranchRoot:t})=>{let n=await yi(t);if(a(n))return i(n.message);let r=Zt(e);if(a(r))return r;let o=r.value,s=n.value?await he.push({cwd:t}):await he.push({cwd:t,remote:nt,branch:o,setUpstream:!0});if(a(s))return i(`Failed during state branch push
56
+ ${s.message}`);let d=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return l(d?"Pushed state branch":"Remote already up to date",d)},ml=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Zt(e);if(a(o))return o;let s=o.value,d=[Go(),await Yi({repoRoot:e,stateBranchName:s}),await _n({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await Uh({stateBranchRoot:t,stateBranchName:s}),await sc(t),n?await $h({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of d){if(a(c))return i(c.message);r=r||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)}});import cs from"node:fs";import Ji from"node:os";import jh from"node:path";var Hh,pl,Wh,Gh,qh,fl,Xi,gl,Vh,hl,vl=v(()=>{"use strict";N();ut();Rt();Hh="epiq-sync.lock",pl=600*1e3,Wh=e=>{try{let t=JSON.parse(e);return typeof t.pid!="number"||typeof t.hostname!="string"||typeof t.startedAt!="number"||typeof t.operation!="string"?null:t}catch{return null}},Gh=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},qh=e=>e&&(e.hostname!==Ji.hostname()||Gh(e.pid))?Date.now()-e.startedAt>pl:!0,fl=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Xi=e=>{try{return Wh(cs.readFileSync(e,"utf8"))}catch{return null}},gl=(e,t)=>{let n={pid:process.pid,hostname:Ji.hostname(),startedAt:Date.now(),operation:t};try{return cs.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},Vh=async({worktreeRoot:e,operation:t})=>{let n=await hi(e);if(a(n))return i(n.message);let r=jh.join(n.value,Hh),o=()=>{try{let c=Xi(r);c&&c.pid===process.pid&&cs.rmSync(r)}catch{}};if(gl(r,t))return l("Acquired sync lock",{acquired:!0,release:o});let s=Xi(r);if(!qh(s))return l("Sync lock is held",{acquired:!1,heldBy:s});X.info(`Breaking an abandoned sync lock: ${s?fl(s):"unreadable lock file"}`);try{cs.rmSync(r,{force:!0})}catch{}if(gl(r,t))return l("Acquired sync lock after breaking a stale one",{acquired:!0,release:o});let d=Xi(r);return l("Sync lock taken by another process",{acquired:!1,heldBy:d??{pid:-1,hostname:Ji.hostname(),startedAt:Date.now(),operation:"unknown"}})},hl=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await Vh({worktreeRoot:e,operation:t});if(a(r))return i(r.message);if(!r.value.acquired)return X.info(`Skipping ${t}: the state worktree is held by ${fl(r.value.heldBy)}`),l("State worktree is held by another process",null);let{release:o}=r.value;try{return l("Ran under the sync lock",await n())}finally{o()}}});import zh from"node:fs";var Kh,Yh,Qi,yl,Xh,ls,Zi=v(()=>{"use strict";N();is();as();Pr();pt();ut();Jr();zi();vl();Kh=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=Q("getRepoRootDir",await mt(e));if(a(n))return i(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=Q("getStateBranchRoot",Ne({repoRoot:r}));if(a(o))return i(o.message);let s=o.value;logger.debug("[sync] state branch root",s),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:s,ensureUpstream:t});let d=Q("bootstrapStateBranchStorage",await ml({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(a(d))return i(d.message);logger.debug("[sync] bootstrap result",{bootstrapped:d.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let c=Q("hasInProgressGitOperation(stateBranchRoot)",await $o(s));if(a(c))return i(c.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:c.value}),c.value)return logger.info("[sync] state branch git operation in progress"),i("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:s});let u=Q("ensureStateBranchLayout",oc(r,s));return a(u)?i(u.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:d.value}),l("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:d.value}))},Yh=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=Q("stageStateBranchOwnEventFile",await ds({stateBranchRoot:t,eventFileName:n}));if(a(r))return i(r.message);let o=Q("stageStateBranchMediaFiles",await cl({stateBranchRoot:t}));if(a(o))return i(o.message);let s=Q("stageStateBranchEventAttributes",await ll({stateBranchRoot:t}));if(a(s))return i(s.message);let d=[r.value,o.value,s.value].filter(m=>m!==null);if(d.length===0)return l("Nothing to stage",{createdCommit:!1});let c=Q("hasStagedChanges(after stage)",await Xd(t,d));if(a(c))return i(c.message);if(logger.debug("[sync] state branch change check after stage result",{changed:c.value}),!c.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 u=Q("createStateBranchSyncCommit",await ul({repoRoot:e,stateBranchRoot:t,pathspec:d}));return a(u)?i(u.message):(logger.debug("[sync] created sync commit",u.value),l("Committed own event file",{createdCommit:!0,commitSha:u.value}))},Qi=(e,t="offline")=>{let n=e.createdCommit?`Committed locally, ${t}`:t==="offline"?"Offline":"No remote";return tl(n),l(n,{...e,pulled:!1,pushed:!1,offline:!0})},yl=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}),i("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}),i("Own event file must end with .jsonl");os();let n=Q("ensureSyncReady",await Kh({cwd:e,ensureUpstream:!0}));if(a(n))return Me(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,d=Q("isDetachedHead(stateBranchRoot)",await Jd(o));if(a(d))return Me(d.message);if(logger.debug("[sync] detached state branch check result",{detached:d.value}),d.value)return Me("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,g=Q("getStateBranch",Zt(r));if(a(g))return Me(g.message);let x=g.value;logger.debug("[sync] resolved state branch",{stateBranch:x,stateBranchRoot:o});let S=Q("commitOwnEventFileToStateBranch",await Yh({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(S))return Me(S.message);c=S.value.createdCommit,u=S.value.commitSha;let C=Q("hasRemote",await Or({repoRoot:o}));if(a(C))return Me(C.message);if(!C.value)return Qi({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,bootstrapped:s},"no remote");let M=Q("pullBranchRebaseIfPresent",await Ii({cwd:o,branch:x}));if(a(M))return bi(M.message)?Qi({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,bootstrapped:s}):Me(M.message);m=M.value;let w=Q("isAheadOfUpstream",await Kd(o));if(a(w))return Me(w.message);if(c||s||w.value){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:o});let T=Q("pushStateBranch",await Xr({stateBranchRoot:o,repoRoot:r}));if(a(T)&&zd(T.message)){let _=Q("pullBranchRebaseIfPresent(retry)",await Ii({cwd:o,branch:x}));if(a(_))return Me(_.message);m=m||_.value,T=Q("pushStateBranch(retry)",await Xr({stateBranchRoot:o,repoRoot:r}))}if(a(T))return bi(T.message)?Qi({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,bootstrapped:s}):Me(T.message);p=T.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let T=Q("git rev-parse HEAD",await W({args:["rev-parse","HEAD"],cwd:o}));if(a(T))return Me(T.message);u=T.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return ss(p?"Synced and pushed":m||c?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),l("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,pulled:m,pushed:p,bootstrapped:s,offline:!1})},Xh=async(e,t)=>{let n=ol(e);try{return await t()}finally{let r=sl(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},ls=async e=>{let t=e.cwd??process.cwd(),n=await mt(t);if(a(n))return Me(n.message);let r=Ne({repoRoot:n.value});if(a(r))return Me(r.message);let o=r.value;if(!zh.existsSync(o))return yl(e);let s=await hl({worktreeRoot:o,operation:"sync",fn:()=>Xh(o,()=>yl(e))});return a(s)?Me(s.message):s.value===null?l("Another process is syncing this board",{repoRoot:n.value,stateBranchRoot:o,createdCommit:!1,pulled:!1,pushed:!1,bootstrapped:!1,offline:!1,skipped:!0}):s.value}});var Tt,us,Jh,bl,ea=v(()=>{"use strict";Jc();Vr();Ht();ht();pe();N();k();is();as();Zi();Tt=null,us=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Tt,currentStatus:f().syncStatus?.status,currentMessage:f().syncStatus?.msg}),Tt)return logger.debug("[sync] syncAndReloadState joining existing promise"),Tt;logger.debug("[sync] syncAndReloadState creating promise"),Tt=Jh();try{let e=await Tt;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!a(e),message:(a(e),e.message),statusAfterResolve:f().syncStatus?.status,statusMessageAfterResolve:f().syncStatus?.msg}),a(e)&&f().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),E({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),Tt||i(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:f().syncStatus?.status,statusMessageBeforeClear:f().syncStatus?.msg}),Tt=null}},Jh=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:f().mode,syncStatus:f().syncStatus});let e=bl();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:f().mode,message:e.message,syncStatus:f().syncStatus}),e;if(Tt)return Tt;logger.debug("[sync] syncAndReloadState:start");let t=Q("resolveActorId",ge());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:a(t)?t.message:"Missing actor id"}),i("Unable to resolve event log path");E({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:f().syncStatus});let n=Dn(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=Q("syncEpiqWithRemote",await ls({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!a(r),message:(a(r),r.message)}),a(r))return logger.error("[sync] syncAndReloadState:sync failed",r.message),E({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:f().syncStatus}),Me(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let d=Q("loadMergedEvents",jt(o));if(logger.debug("[sync] loadMergedEvents:result",{success:!a(d),message:(a(d),d.message),count:a(d)?void 0:d.value.events.length}),a(d))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:f().syncStatus}),i(`Unable to load events. ${d.message}`);logger.debug("[sync] loaded merged events after sync",{count:d.value.events.length});let c=bl();if(c)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:f().mode,message:c.message,syncStatus:f().syncStatus}),c;let u=Kc(),m=f().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:u,selectedNodeId:f().selectedNode?.id,contextNodeId:f().contextNode?.id,selectedNodeIsVirtual:f().selectedNode?.isVirtual,contextNodeIsVirtual:f().contextNode?.isVirtual}),!f().selectedNode?.isVirtual&&!f().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:d.value.events.length});let g=Q("bootStateFromEventLog",dn(d.value.events,d.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!a(g),message:(a(g),g.message)}),a(g))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:f().syncStatus}),i(`Unable to boot synced state. ${g.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:f().selectedNode?.isVirtual,contextNodeIsVirtual:f().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),E({filters:m}),logger.debug("[sync] restoreNavigationAnchor:start");let p=Q("restoreNavigationAnchor",Xc(u));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!a(p),message:a(p)?p.message:"Navigation restored",selectedNodeId:f().selectedNode?.id,contextNodeId:f().contextNode?.id}),a(p)?(E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:f().syncStatus}),p):(E({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:f().syncStatus}),l("Synced",!0))},bl=()=>f().mode===h.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:f().mode,syncStatus:f().syncStatus}),E({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),i("Will not re-materialize if not in default mode, to not lose edit data"))});var or,Il,xl,ta,na,Qr,ra,Qh,El,Zh,Rl,ms=v(()=>{"use strict";N();Be();k();ea();or=3e3,Il=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<or?null:t},xl=0,na=!1,Qr=!1,ra=()=>{if(na)return!0;let e=He();return a(e)?!1:e.value.syncStatus.status==="syncing"},Qh=()=>{let e=ve().autoSyncIntervalMs??1e4,t=Date.now()-xl;return Math.max(0,e-t)},El=()=>{ta||(ta=setTimeout(async()=>{if(ta=void 0,!!ot()){if(ra()){Qr=!0;return}Qr=!1,await Zh()}},Qh()))},Zh=async()=>{if(f().readOnly||f().timeMode==="peek"||f().timeMode==="replay")return i("Cannot auto-sync while peeking");if(!ot())return i("Cannot auto-sync before state is initialized");if(ra())return Qr=!0,i("Sync already in progress");na=!0,xl=Date.now(),E({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await us()}finally{na=!1,Qr&&El()}},Rl=()=>{ot()&&(Qr=!0,!ra()&&El())}});import Zr from"node:fs";import eo from"node:path";import{z as sr}from"zod";var ps,ev,tv,nv,Nl,Cl,Sl,Al,Tl,wl,rv,gs,oa,to=v(()=>{"use strict";N();Ft();_o();ne();ps="recent-projects.json",ev=20,tv=sr.object({projectId:sr.string().min(1),root:sr.string().min(1),lastOpenedAt:sr.number().finite()}),nv=sr.object({projects:sr.array(tv)}),Nl=()=>eo.join(Sn(),ps),Cl=e=>eo.basename(e)||e,Sl=e=>{let t=eo.resolve(e);try{return Zr.realpathSync(t)}catch{return t}},Al=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,Tl=e=>{if(!_r(e.root))return!1;let t=Lr(e.root);return!a(t)&&t.value===e.projectId},wl=()=>{let e=Nl();if(!Zr.existsSync(e))return l("No recent projects recorded",[]);let t;try{t=JSON.parse(Zr.readFileSync(e,"utf8"))}catch(r){return i(`Invalid ${ps}: ${r instanceof Error?r.message:String(r)}`)}let n=nv.safeParse(t);return n.success?l("Read recent projects",n.data.projects):i(`Invalid ${ps} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},rv=e=>{let t=Nl();try{Zr.mkdirSync(eo.dirname(t),{recursive:!0}),Zr.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
57
+ `,"utf8")}catch(n){return i(`Unable to write ${ps}: ${n instanceof Error?n.message:String(n)}`)}return l("Recorded recent project",e)},gs=({exclude:e}={})=>{let t=wl();if(a(t))return t;let n=e===void 0?null:Sl(e);return l("Listed recent projects",t.value.filter(r=>n===null||Sl(r.root)!==n).filter(Tl).sort(Al))},oa=({root:e,now:t=Date.now()})=>{let n=eo.resolve(e),r=Lr(n);if(a(r))return i(r.message);let o=r.value,s=wl(),d=a(s)?[]:s.value,c=[{projectId:o,root:n,lastOpenedAt:t},...d.filter(u=>u.projectId!==o&&u.root!==n)].filter(Tl).sort(Al).slice(0,ev);return rv(c)}});var fs,Ml,kl,Ll,no=v(()=>{"use strict";N();Ft();Be();ne();fs=()=>{let e=ve(),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}},Ml=()=>{let e=Xe(process.cwd());if(a(e))return!1;let t=Bt(e.value);return yt(t)},kl=e=>e===!0?"on":e===!1?"off":null,Ll=e=>e==="on"?!0:e==="off"?!1:null});var Le,A,_e=v(()=>{"use strict";Le={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"},A={accent:Le.cyan,accent2:Le.magenta,primary:Le.white,secondary:Le.grayDark,secondary2:Le.grayLight,gray:Le.gray,green:Le.green,yellow:Le.yellow,red:Le.red}});var R,ir,hs=v(()=>{"use strict";_e();R={red:Le.red,yellow:Le.yellow,green:Le.green,blue:Le.blue,magenta:Le.magenta,cyan:Le.cyan},ir={urgent:R.red,critical:R.red,important:R.red,blocker:R.red,asap:R.red,immediate:R.red,fail:R.red,failure:R.red,broken:R.red,bug:R.red,error:R.red,incident:R.red,outage:R.red,production:R.red,crash:R.red,security:R.red,warning:R.yellow,warn:R.yellow,risky:R.yellow,risk:R.yellow,attention:R.yellow,pending:R.yellow,review:R.yellow,"needs-review":R.yellow,qa:R.yellow,testing:R.yellow,test:R.yellow,validate:R.yellow,verification:R.yellow,staging:R.yellow,check:R.yellow,"follow-up":R.yellow,followup:R.yellow,waiting:R.yellow,blocked:R.yellow,hold:R.yellow,done:R.green,complete:R.green,completed:R.green,success:R.green,ok:R.green,stable:R.green,resolved:R.green,fixed:R.green,closed:R.green,merged:R.green,released:R.green,deployed:R.green,approved:R.green,verified:R.green,working:R.green,healthy:R.green,pass:R.green,passing:R.green,info:R.blue,information:R.blue,note:R.blue,docs:R.blue,documentation:R.blue,doc:R.blue,guide:R.blue,help:R.blue,explanation:R.blue,detail:R.blue,details:R.blue,context:R.blue,design:R.blue,discussion:R.blue,proposal:R.blue,idea:R.blue,feature:R.magenta,enhancement:R.magenta,improvement:R.magenta,refactor:R.magenta,refactoring:R.magenta,cleanup:R.magenta,optimize:R.magenta,optimization:R.magenta,perf:R.magenta,performance:R.magenta,upgrade:R.magenta,migration:R.magenta,modernize:R.magenta,debt:R.magenta,todo:R.cyan,next:R.cyan,planned:R.cyan,plan:R.cyan,future:R.cyan,backlog:R.cyan,investigate:R.cyan,explore:R.cyan,prototype:R.cyan}});var ov,sv,cn,ln,vs,ys,ro=v(()=>{"use strict";fe();N();le();k();ov=e=>e.props.tags??[],sv=e=>e.props.assignees??[],cn=e=>ov(e).map(t=>I.getTag(t)).filter(t=>!!t),ln=e=>sv(e).map(t=>I.getContributor(t)).filter(t=>!!t),vs=()=>{let{breadCrumb:e,selectedNode:t}=f(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!P(n)?i("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",cn(n))},ys=()=>{let{breadCrumb:e,selectedNode:t}=f(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!P(n)?i("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",ln(n))}});var b,Un=v(()=>{"use strict";b={PALETTE:"?",EXIT:"exit",INIT:"init",OPEN:"open",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",REPLAY:"replay",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",YANK:"yank",SYNC:"sync",EXPORT:"export",NONE:""}});var iv,av,dv,cv,lv,$n,Pl,bs,Is,Dl,uv,sa,oo=v(()=>{"use strict";iv=/^(\d+)(h|d|w|mo|y)$/,av=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,dv=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let s=new Date(e,t-1,n,r,o);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===r&&s.getMinutes()===o},cv=(e,t=new Date)=>{let n=e.match(iv);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let d=new Date(t);switch(o){case"h":return d.setHours(d.getHours()-s),d;case"d":return d.setDate(d.getDate()-s),d;case"w":return d.setDate(d.getDate()-s*7),d;case"mo":return d.setMonth(d.getMonth()-s),d;case"y":return d.setFullYear(d.getFullYear()-s),d;default:return null}},lv=e=>{let t=e.match(av);if(!t)return null;let[,n,r,o,s,d]=t,c=Number(n),u=Number(r),m=Number(o),p=s?Number(s):0,g=d?Number(d):0;return dv({year:c,month:u,day:m,hour:p,minute:g})?new Date(c,u-1,m,p,g):null},$n=e=>{let t=e.trim().toLowerCase();return cv(t)??lv(t)},Pl=/^(\d+)(s|m)?$/,bs=e=>{let t=e.trim().toLowerCase().match(Pl);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},Is=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&Pl.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},Dl=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,uv=[{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}],sa=(e=uv)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let s=r;s<=o;s++)t.push(`${s}${n}`);return t}});var mv,ue,Qe,xe,pv,gv,aa,da,Fl,jn,xs,ia,Ol,fv,hv,so,Bl,vv,yv,ca,bv,Ee,un=v(()=>{"use strict";ms();to();N();no();nr();fe();le();k();hs();ro();Un();oo();mv=["BOARD","TICKET","SWIMLANE","COMMENT"],ue={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},Qe={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},xe={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},pv=[ue.EDITOR,ue.VIEW,ue.USERNAME,ue.AUTOSYNC,ue.SYNC_DEBOUNCE_MS,ue.ATTACHMENT_MAX_KB,ue.LOG_LEVEL],gv=(e=f().selectedNode?.context)=>{switch(e){case"TICKET":return[Qe.TITLE,Qe.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Qe.TITLE];case"COMMENT":return[Qe.COMMENT];default:return[]}},aa=[String(or),"5000","15000","30000","60000"],da=["250","500","1000"],Fl=["10s","20s","30s","45s"],jn=[b.EXIT,b.SYNC,b.HELP,b.EXPORT,b.CONFIG,b.YANK],xs=[b.NEW,b.EDIT,b.DELETE,b.MOVE],ia=[b.TAG,b.UNTAG,b.ASSIGN,b.UNASSIGN,b.CLOSE_ISSUE,b.RE_OPEN_ISSUE,b.EDIT,b.COMMENT],Ol=[b.FILTER,b.PEEK,b.REPLAY],fv={WORKSPACE:[...jn,...xs],BOARD:[...Ol,...jn,...xs],SWIMLANE:[...Ol,...jn,...xs],TICKET:[...jn,...xs,...ia],FIELD:[...jn,...ia],FIELD_LIST:[...jn,...ia],TEXT:[...jn],COMMENT:[b.EDIT,b.DELETE,b.YANK]},hv=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],so=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&P(n)),Bl=e=>e.parentNodeId===ye,vv=({selectedNode:e,breadCrumb:t})=>{let n=gv(e?.context);return so({breadCrumb:t,selectedNode:e})?n.includes(Qe.DESCRIPTION)?n:[...n,Qe.DESCRIPTION]:n},yv=({selectedNode:e,breadCrumb:t})=>{let n=so({breadCrumb:t,selectedNode:e});return n?[xe.REF,xe.TITLE,...n.props?.description?.trim()?[xe.DESCRIPTION]:[],...cn(n).length>0?[xe.TAGS]:[],...ln(n).length>0?[xe.ASSIGNEES]:[]]:e?[xe.REF,xe.TITLE]:[]},ca=()=>{let e=gs({exclude:process.cwd()});return a(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},bv=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=fs();if(!r)return[b.HELP,b.CONFIG];if(!Ml())return[b.HELP,b.INIT,b.OPEN];if(t)return[b.HELP,b.PEEK,b.REPLAY,b.EXPORT,b.CONFIG,b.YANK];let o=e?.context,s=o&&mv.includes(o),d=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?fv[u]:[]))],c=so({breadCrumb:n,selectedNode:e});return d.filter(u=>u===b.MOVE?!1:u===b.YANK?!!(c??e):u===b.EDIT?s||!!c:u===b.DELETE?s:u===b.UNTAG?!!(c&&cn(c).length>0):u===b.UNASSIGN?!!(c&&ln(c).length>0):u===b.RE_OPEN_ISSUE?!!(c&&Bl(c)):u===b.CLOSE_ISSUE?!!(c&&!Bl(c)):!0)},Ee=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=f())=>{let s=t.context??"WORKSPACE";return{[b.NONE]:bv({breadCrumb:o,readOnly:r,selectedNode:n}),[b.EXIT]:["confirm"],[b.EXPORT]:[],[b.SYNC]:[],[b.INIT]:[],[b.OPEN]:e===b.OPEN?ca():[],[b.HELP]:[],[b.PEEK]:[...sa(),"now","prev","next"],[b.REPLAY]:[...sa()],[b.EDIT]:vv({selectedNode:n,breadCrumb:o}),[b.YANK]:yv({selectedNode:n,breadCrumb:o}),[b.COMMENT]:[],[b.DELETE]:["confirm"],[b.RE_OPEN_ISSUE]:["confirm"],[b.CLOSE_ISSUE]:["confirm"],[b.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[b.FILTER]:["tag","assignee","actor","description","title","ref","clear"],[b.TAG]:[...new Set([...Object.keys(ir),...I.getExistingTags()])],[b.UNTAG]:[...vs()?.value?.map(({name:c})=>c)??[]],[b.UNASSIGN]:[...ys()?.value?.map(({name:c})=>c)??[]],[b.ASSIGN]:I.getExistingAssignees(),[b.NEW]:hv(s),[b.CONFIG]:[...pv]}[e]??[]}});var _l,Ul=v(()=>{"use strict";_l=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"]});import{accessSync as Iv,copyFileSync as xv,existsSync as Es,mkdirSync as $l,readdirSync as jl,readFileSync as Ev,renameSync as Rv,rmSync as Sv,statSync as Hl,unlinkSync as Nv,writeFileSync as Cv}from"node:fs";import ar from"node:path";var la,We,Rs=v(()=>{"use strict";la=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",We={writeToFile:(e,t)=>{try{let n=ar.dirname(e);Es(n)||$l(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Cv(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Ev(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=We.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Es(e)&&Hl(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Iv(e),!0}catch{return!1}},mkDir:e=>$l(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=ar.parse(t);for(;;){let r=ar.join(t,e);try{if(Es(r)&&Hl(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=ar.dirname(t)}return null},readFirstJSON(e){try{if(!We.dirExists(e))return null;let t=jl(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=ar.join(e,t);return We.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return We.dirExists(e)?jl(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Nv(e)}catch(t){(!la(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Sv(e,{recursive:!0,force:!0})}catch(t){(!la(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(ar.dirname(t)),!n?.overwrite&&Es(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Rv(e,t)}catch(r){if(la(r)&&r.code==="EXDEV"){xv(e,t),this.rmFile(e);return}throw r}}}});import Av from"node:path";import{z as Gt}from"zod";var Tv,Wl,wv,Gl,ua,ma,Mv,Ss,ql,st,pa,Hn=v(()=>{"use strict";Qn();ne();N();Rs();Tv={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Wl=Gt.object({logLevel:Gt.enum(["info","error","debug"]),preferredEditor:Gt.string().optional(),userName:Gt.string().optional(),userId:Gt.string().optional(),autoSync:Gt.boolean().nullable().optional(),autoSyncDebounceMs:Gt.number().optional(),attachmentMaxKb:Gt.number().optional(),viewMode:Gt.enum(["dense","wide"]).optional()}).partial(),wv="config.json",Gl=Sn,ua=()=>Av.join(Gl(),wv),ma=()=>{try{return We.mkDir(Gl()),l(`Ensured ~/${lt} exists`,null)}catch{return i(`Unable to create ~/${lt}`)}},Mv=e=>{let t;try{t=JSON.parse(e)}catch{return i(`Invalid ~/${lt}/config.json JSON`)}let n=Wl.safeParse(t??{});return n.success?l("Parsed config",n.data):i(`Invalid ~/${lt}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Ss=()=>{let e=ma();if(a(e))return i(e.message);let t=ua(),n=We.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Mv(n)},ql=e=>{let t=ma();if(a(t))return i(t.message);let n=Wl.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=ua();try{return We.writeToFile(r,JSON.stringify(n.data,null,2)+`
58
+ `),l("Config written",null)}catch{return i(`Unable to write ~/${lt}/config.json`)}},st=e=>{let t=Ss();if(a(t))return i("Failed to read existing config");let n={...t.value,...e};return ql(n)},pa=()=>{let e=ua(),t=ma();if(a(t))return i(`Unable to create ~/${lt}`);if(!(We.readFile(e)!==null)){let C=ql(Tv);if(a(C))throw new Error(`Unable to create ~/${lt}/config.json`)}let r=Ss();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:d,autoSync:c,autoSyncDebounceMs:u,attachmentMaxKb:m,logLevel:p,viewMode:g}=r.value,x=di({userId:d,userName:s});if(a(x))return i(x.message);let S=x.value??{userId:d,userName:s};return!S.userName||!S.userId?i(`User name or ID not configured in ~/${lt}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,l("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:S.userName,userId:S.userId,autoSync:c??!1,autoSyncIntervalMs:u??1e4,attachmentMaxKb:m??null,viewMode:g??"dense"}))}});var Vl,zl,ga,Kl=v(()=>{"use strict";Vl="/media/",zl=e=>`${Vl}${e}`,ga=(e,t)=>`![${e}](${zl(t)})`});import kv from"node:crypto";import fa from"node:fs";import Lv from"node:path";var qt,io,Pv,Dv,Ov,Yl,ao=v(()=>{"use strict";It();N();ne();Kl();qt=500,io=(e,t)=>`${e}.${t}`,Pv=e=>e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?l("Sniffed image type","png"):e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?l("Sniffed image type","jpg"):e.length>=6&&(e.subarray(0,6).equals(Buffer.from("GIF87a","ascii"))||e.subarray(0,6).equals(Buffer.from("GIF89a","ascii")))?l("Sniffed image type","gif"):e.length>=12&&e.subarray(0,4).equals(Buffer.from("RIFF","ascii"))&&e.subarray(8,12).equals(Buffer.from("WEBP","ascii"))?l("Sniffed image type","webp"):i(`Unsupported image format. Allowed: ${Cd.join(", ")}`),Dv=e=>kv.createHash("sha256").update(e).digest("hex"),Ov=(e,t=qt)=>{if(e.length===0)return i("Attachment is empty");if(e.length>t*1024)return i(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=Pv(e);return a(n)?n:l("Validated attachment data",{hash:Dv(e),ext:n.value,bytes:e.length})},Yl=(e,t,n=qt)=>{let r=Ov(t,n);if(a(r))return r;let o=qo(e),s=Lv.join(o,io(r.value.hash,r.value.ext));try{fa.existsSync(s)||(fa.mkdirSync(o,{recursive:!0}),fa.writeFileSync(s,t))}catch(d){return i(`Unable to write attachment blob: ${d instanceof Error?d.message:String(d)}`)}return l("Wrote attachment blob",r.value)}});import Bv from"zod";var co,lo,Xl,ha=v(()=>{"use strict";Hn();ao();pe();N();be();Be();k();co=50,lo=5e3,Xl=()=>{let e=me().commandMeta.inputString,t=Bv.coerce.number().int().min(co).max(lo).safeParse(e);if(!t.success)return i(`Attachment size cap must be ${co}-${lo} KB (default ${qt})`);let n=st({attachmentMaxKb:t.data});return a(n)?n:(et({attachmentMaxKb:t.data}),E({mode:h.DEFAULT}),l(`Attachment size cap set to ${t.data} KB`,null))}});import Jl from"chalk";var ya,Ql,va,Zl,Fv,_v,eu,Uv,$v,uo,Pe,tu,nu,Ns,jv,Hv,Cs,wt=v(()=>{"use strict";hs();ya={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Ql=(e,t,n)=>Math.max(t,Math.min(n,e)),va=(e,t,n)=>e+(t-e)*n,Zl=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Fv=e=>e.toLowerCase().trim(),_v=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,d=e/60,c=s*(1-Math.abs(d%2-1)),u=0,m=0,p=0;d>=0&&d<1?(u=s,m=c):d>=1&&d<2?(u=c,m=s):d>=2&&d<3?(m=s,p=c):d>=3&&d<4?(m=c,p=s):d>=4&&d<5?(u=c,p=s):(u=s,p=c);let g=o-s/2;return[Math.round((u+g)*255),Math.round((m+g)*255),Math.round((p+g)*255)]},eu=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Uv=(e,t,n)=>{let r=Ql(n,0,1);return[Math.round(va(e[0],t[0],r)),Math.round(va(e[1],t[1],r)),Math.round(va(e[2],t[2],r))]},$v=(e,t,n)=>Uv(e,t,n),uo=e=>{let t=Zl(e)%360,n=_v(t,ya.stringColor.saturation,ya.stringColor.lightness);return eu(n)},Pe=(e,t=ir)=>{let n=Fv(e??"");return n&&t[n]?t[n]:uo(n)},tu=e=>{let t=ya.gradient.stops,n=Ql(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,s=Math.min(Math.floor(o),r-1),d=o-s;return $v(t[s],t[s+1],d)},nu=e=>eu(tu(e)),Ns=e=>Zl(e.toLowerCase().trim())/4294967295,jv=e=>{let t=Ns(e);return tu(t)},Hv=e=>{let[t,n,r]=jv(e);return{normal:o=>Jl.bgRgb(t,n,r).black(o),cursor:o=>Jl.bgRgb(t,n,r).white.bold(o)}},Cs=e=>Hv(e).normal(` ${e} `)});var vt,mo=v(()=>{"use strict";vt=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null});import{createHash as Wv}from"node:crypto";var Gv,qv,Ae,dr=v(()=>{"use strict";Gv="0123456789ABCDEFGHJKMNPQRSTVWXYZ",qv=e=>{let t=Wv("sha256").update(e).digest(),n=0n;for(let o=0;o<16;o++)n=n<<8n|BigInt(t[o]);let r="";for(let o=0;o<26;o++){let s=BigInt((25-o)*5);r+=Gv[Number(n>>s&31n)]}return r},Ae=(e,t)=>qv(`${e}:virtual:${t}`)});import ru from"chalk";var re,Te,ke,ou=v(()=>{"use strict";wt();_e();re=e=>ru.dim(e),Te=e=>ru.hex(A.primary)(e),ke=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let d=o.trim();if(d.length<s)return"";let p=[...t.filter(Boolean).filter(g=>g.startsWith(d))].sort((g,x)=>Ns(g)-Ns(x)).slice(0,r).map(g=>Cs(g)).join(" ");return p?`${re(e)}${p}${re(n)}`:""}});var mn,As=v(()=>{"use strict";mn={None:"none",Invalid:"invalid",Valid:"valid"}});import au from"chalk";var Vv,su,de,K,H,lr,iu,Ts,ba,zv,cr,Kv,Yv,Xv,Jv,Qv,du,cu=v(()=>{"use strict";ms();no();Ul();ct();It();N();le();Be();ha();ao();k();wt();mo();ro();dr();ou();Un();As();un();oo();Vv=["BOARD","TICKET","SWIMLANE"],su=()=>{let e=f().selectedNode;if(!e?.context)return H({message:re("Missing target context")});if(Vv.includes(e.context))return K();if(e.parentNodeId){let t=f().nodes[e.parentNodeId];if(t?.id===Ae(t?.parentNodeId??"","comments"))return K()}return H({message:re("Command not available in this context")})},de="<ENTER> to confirm",K=(e="",t=[])=>({message:re(e),validity:mn.Valid,completionWordList:t}),H=({message:e,completionWordList:t=[]})=>({validity:mn.Invalid,message:e,completionWordList:t}),lr=e=>e.length===0,iu=(e,t)=>{let n=Ke(f().breadCrumb,"BOARD");if(a(n))return H({message:Te("Command is not applicable in this context")});let r=Nd(n.value.id);return a(r)?H({message:Te(`Unable to ${t}: board id is not a valid ULID`)}):Dl({date:e,horizonDate:r.value})?null:H({message:Te(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},Ts=e=>` ${au.hex("#000").bgHex(Pe(e))(` ${e} `)} `,ba=({modifier:e})=>{let t="confirm";return e===t?K(de):H({message:lr(e)?re("if you are certain, enter ")+Cs(t):"",completionWordList:[t]})},zv=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?H({message:re(n)}):K():H({message:lr(r)?t:"",completionWordList:[...e]}),cr=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>lr(n)&&lr(r)?H({message:e,completionWordList:[]}):K(t??de),Kv=({modifier:e,inputString:t})=>{let n=ca();return!lr(e)||!lr(t)?K(de):H({message:n.length?re("number from the list, or a path"):re("path to an epiq project"),completionWordList:n})},Yv=({modifier:e,inputString:t})=>{let n=Ee(b.CONFIG);if(!n.includes(e))return H({message:ke({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ue.EDITOR:{let r=[..._l];return t.trim()?r.includes(t.trim())?K(de):H({message:ke({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):H({message:ke({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ue.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?K(de):H({message:ke({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ue.USERNAME:return t.trim()?K(de):H({message:Te("Enter a user name. Saved in ")+au.bgBlack("~/.epiq-global/config.json")});case ue.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?K(de):H({message:ke({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case ue.AUTOSYNC:{let r=["on","off"],o=ve().autoSync;if(!r.includes(t.trim())){let s=kl(o);return H({message:ke({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return K(de)}case ue.ATTACHMENT_MAX_KB:{let r=ve().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<co||o>lo){let s=ke({prefix:" examples: ",wordList:da,minLengthForHints:0,inputString:t});return H({message:Te(`provide a size cap in KB (${co}-${lo}). current: ${r??qt} KB.`)+s,completionWordList:da})}return K(de)}case ue.SYNC_DEBOUNCE_MS:{let r=ve().autoSyncIntervalMs,o=Il(t);if(!t.trim()||o===null||o<or){let s=ke({prefix:" examples: ",wordList:aa,minLengthForHints:0,inputString:t});return H({message:Te(`provide duration above ${or}ms. current duration: ${r}ms.`)+s,completionWordList:aa})}return K(de)}default:return H({message:Te("Unknown config option"),completionWordList:n})}},Xv=({modifier:e,inputString:t})=>{let n=Ee(b.EDIT);if(!n.length)return H({message:Te("Command not available in this context")});if(!n.includes(e)){let r=ke({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return H({message:r||Te("Unknown edit option"),completionWordList:n})}switch(e){case Qe.COMMENT:return t.trim()?K(de):H({message:re("write a comment...")});case Qe.TITLE:return K(de);case Qe.DESCRIPTION:{let{preferredEditor:r}=ve();return r?K(re("<ENTER> to edit in ")+r):H({message:"No editor selected"})}default:return H({message:Te("Unknown edit option"),completionWordList:n})}},Jv=({modifier:e})=>{let t=Ee(b.YANK);return t.length?t.includes(e)?K(de+re(" and copy to clipboard")):H({message:ke({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):H({message:Te("Nothing selected to copy from")})},Qv={[b.EXPORT]:()=>K(de+re(", and create export markdown file")),[b.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return K(de);let n={message:re("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=$n(r);if(!r||!o)return H(n);let s=iu(o,"peek");return s||K(de)},[b.REPLAY]:e=>{let{dateInput:t,durationInput:n}=Is(e.modifier,e.inputString),r={message:re("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=$n(t);if(!t||!o)return H(r);let s=iu(o,"replay");return s||(n&&bs(n)===null?H({message:Te("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):K("<ENTER> to replay board history",n?Fl:[]))},[b.EXIT]:()=>K(de+re(" and exit the application")),[b.INIT]:()=>K(de),[b.OPEN]:Kv,[b.PALETTE]:()=>K(de),[b.FILTER]:e=>{if(e.modifier==="clear")return K(de);let t=s=>Ee(b.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return H({message:ke({wordList:Ee(b.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Ee(b.FILTER)});let n=Object.values(f().tags).map(s=>s.name),r=Object.values(f().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?H({message:ke({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):K():H({message:ke({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[b.NONE]:e=>{let t=Ee(b.NONE);return H({message:ke({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[b.NEW]:e=>zv({list:Ee(b.NEW),hint:ke({wordList:Ee(b.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[b.HELP]:()=>K(de),[b.EDIT]:Xv,[b.COMMENT]:e=>{let t=cr({hint:re(`write a comment (max ${4e3} char)...`),onOk:re(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===mn.Invalid?t:e.inputString.length>4e3?K(Te("max input exceeded")):t},[b.CONFIG]:Yv,[b.YANK]:Jv,[b.DELETE]:e=>{let t=su();return t.validity==="invalid"?t:ba(e)},[b.CLOSE_ISSUE]:e=>ba(e),[b.RE_OPEN_ISSUE]:e=>ba(e),[b.MOVE]:e=>{let t=su();return t.validity==="invalid"?t:cr({hint:ke({prefix:"hey hacker! These commands are blocked for you... ",wordList:Ee(b.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[b.TAG]:e=>{let n=I.getExistingTags().slice(0,10).map(Ts).join("");return cr({hint:n.length?re("create tag or reuse:")+n+re(""):re("create tag ...")})(e)},[b.UNTAG]:e=>{let t=vs();if(a(t))return H({message:Te("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Ts).slice(0,10);return n.length?cr({hint:re(" ... ")+n.join("")})(e):H({message:Te("Issue has no tags"),completionWordList:[]})},[b.ASSIGN]:e=>{let t=I.getExistingAssignees().map(Ts).slice(0,10);return cr({hint:re("assignees... ")+t.join("")})(e)},[b.UNASSIGN]:e=>{let t=ys();if(a(t))return H({message:Te("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Ts).slice(0,10);return n.length?cr({hint:re("remove assignee... ")+n.join("")})(e):H({message:Te("Issue has no assignees"),completionWordList:[]})},[b.SYNC]:()=>K(de)},du=Object.fromEntries(Object.entries(Qv).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]))});var ws,lu=v(()=>{"use strict";ws=["add","fix","bug","log","run","api","cli","ui","ux","test","mock","stub","sync","hash","sign","fork","push","pull","lock","warn","leak","hang","node","seed","lint","edit","save","load","read","send","drop","swap","wrap","port","host","role","user","auth","flag","diff","perf","docs","todo","task","team","epic","spec","remove","update","change","improve","enhance","refactor","rewrite","redesign","implement","build","create","delete","rename","migrate","upgrade","downgrade","revert","rollback","restore","replace","deprecate","cleanup","simplify","optimize","stabilize","harden","document","clarify","investigate","debug","reproduce","triage","mitigate","remediate","resolve","escalate","verify","validate","benchmark","profile","audit","monitor","instrument","configure","provision","deploy","release","publish","integrate","automate","support","enable","disable","prevent","handle","ensure","prioritize","estimate","schedule","track","install","uninstall","enforce","expose","extract","inject","override","extend","customize","localize","translate","redirect","forward","dispatch","broadcast","subscribe","unsubscribe","register","allocate","reserve","persist","retrieve","archive","expire","refresh","reload","reset","recover","replay","retry","scaffold","bootstrap","finalize","terminate","suspend","resume","cancel","abort","notify","alert","trigger","debounce","frontend","backend","fullstack","infrastructure","architecture","integration","application","environment","framework","platform","service","component","module","gateway","pipeline","container","orchestrator","middleware","endpoint","interface","database","datastore","cache","queue","scheduler","worker","daemon","runtime","library","package","plugin","extension","webhook","microservice","monolith","repository","namespace","cluster","sandbox","tenant","dashboard","console","portal","client","server","browser","mobile","desktop","kernel","driver","protocol","schema","migration","fixture","template","snippet","config","manifest","bundle","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","workaround","failure","outage","crash","freeze","corruption","inconsistency","severity","criticality","diagnostics","analysis","blocker","flaky","timeout","mismatch","misconfiguration","boundary","overflow","underflow","panic","stacktrace","breakage","breaking","oversight","ambiguity","discrepancy","anomaly","authorize","authenticate","confidentiality","availability","accessibility","reliability","compliance","governance","encrypt","decrypt","integrity","traceability","accountability","protection","privileges","permissions","sanitize","escape","vulnerability","exposure","secrets","credentials","certificate","session","cookie","identity","tokenization","rotation","scanning","hardening","threat","exploit","payload","injection","phishing","breach","dependency","orchestrate","synchronize","compatibility","incompatibility","interoperability","observability","telemetry","discovery","registration","coordination","distribution","isolation","virtualization","networking","routing","proxy","firewall","balancer","failover","topology","replica","shard","region","capacity","quota","metrics","logging","tracing","alerting","monitoring","heartbeat","liveness","rollover","serialize","deserialize","initialize","instantiate","propagate","aggregate","consolidate","normalize","standardize","transform","reconcile","correlate","index","partition","enrich","filter","stream","batch","parse","encode","decode","compress","decompress","deduplicate","paginate","query","ingest","export","import","backup","snapshot","mapping","record","dataset","metadata","checksum","rollup","lookup","cursor","truncate","concurrency","parallelism","contention","deadlock","throttle","backpressure","fragmentation","saturation","exhaustion","replicate","redundancy","obsolescence","starvation","overload","latency","throughput","scalability","bottleneck","memoize","prefetch","warmup","autoscale","horizontal","vertical","elasticity","recursion","allocation","leakage","garbage","collection","pooling","buffering","caching","eviction","staleness","modularize","encapsulate","abstraction","extensibility","configurability","maintainability","recoverability","readability","testability","debuggability","reusability","simplicity","consistency","linting","formatting","typecheck","coverage","tooling","scaffolding","boilerplate","technical","cleanliness","naming","comments","docstring","testing","unittest","mocking","stubbing","assertion","smoke","sanity","fuzzing","flakiness","harness","scenario","baseline","performance","functionality","requirement","recommendation","improvement","enhancement","description","acceptance","criteria","deliverable","milestone","iteration","backlog","roadmap","followup","hotfix","patch","changelog","rollout","feature","spike","proposal","specification","priority","sprint","story","subtask","assignee","reviewer","reproduction","context","expected","actual","impact","workflow","version","tracking","discussion","decision","tradeoff","feedback","approval","planning","breakdown","scoping"]});var Zv,ey,ty,ny,ry,uu,mu,pu,gu=v(()=>{"use strict";N();k();lu();Zv=3,ey=new Set(["the","and","for","are","but","not","you","all","any","can","was","one","our","out","use","this","that","with","have","from","will","your","they","them","then","than","when","what","were","been","into","should","would","could","about"]),ty=e=>{let t=[];for(let n of Object.values(e.nodes)){n.title&&t.push(n.title);let r=n.props;typeof r.description=="string"&&t.push(r.description),typeof r.value=="string"&&t.push(r.value)}for(let n of Object.values(e.tags))t.push(n.name);for(let n of Object.values(e.contributors))t.push(n.name);for(let n of Object.values(e.comments))t.push(n.md);return t},ny=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=Zv&&!ey.has(t)&&!/^\d+$/.test(t)),ry=e=>{let t=new Map;for(let s of ty(e))for(let d of ny(s))t.set(d,(t.get(d)??0)+1);let n=[...t.entries()].sort((s,d)=>d[1]-s[1]||s[0].localeCompare(d[0])).map(([s])=>s),r=new Set(n),o=ws.filter(s=>!r.has(s));return[...n,...o]},uu=ws,mu=-1,pu=()=>{let e=He();if(a(e))return ws;let t=e.value,n=t.eventLog.length;return n!==mu&&(uu=ry(t),mu=n),uu}});var fu,hu,Ia=v(()=>{"use strict";Fd();un();Un();cu();gu();k();pe();fu=e=>Object.values(b).includes(e),hu=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:d,validity:c,completionWordList:u}=du[n].validate(n,r,s),m=n!==b.PEEK&&n!==b.REPLAY,p=o==="command"||o==="modifier"?Ee(n):m?pu():[],{mode:g}=f(),x=g===h.COMMAND_LINE?d??"":"",S=[...u,...p];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:x,autoCompletion:t?Bd(e,S):{hint:"",hints:[],remainder:"",overlap:0}}}});var vu,oy,sy,iy,yu=v(()=>{"use strict";Ia();un();vu=e=>{let t=e.trimStart(),n=sy(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),d=iy(e),c=fu(r)?r:null,u=c!==null,m=r!=="",p=c?Ee(c)??[]:[],g=c&&p.includes(o)?o:"",x="word";n.length===0||n.length===1&&!s?x="command":(n.length===1&&s||n.length===2&&!s)&&(x="modifier");let S=s?"":d,C=oy(t,c,g);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:d,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:s,modifier:g,target:x,inputToMatch:S,inputString:C}},oy=(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},sy=e=>e.trim()?e.trim().split(/\s+/):[],iy=e=>e.trimEnd().split(/\s+/).at(-1)??""});import{useSyncExternalStore as vT}from"react";var ur,xa,mr,ay,bu,Mt,po,Ea,Ra,Iu,xu,Ms,Eu,Y,Ru,Su,Nu,me,ks,be=v(()=>{"use strict";Ia();yu();N();As();ur=e=>e===xa||e===":",xa=" ",mr={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:mn.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},ay=new Set,bu=()=>{for(let e of ay)e()},Mt=e=>{let n=e(mr),r=vu(n.value),o=n.cursorPosition===n.value.length;mr={...n,commandMeta:hu(r,o)},bu()},po=({message:e,status:t})=>{let n=structuredClone(mr);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,mr=n,bu(),l(e,null)},Ea=e=>{Mt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Ra=e=>{Mt(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&ur(n[o-1]);)o--;for(;o>0&&!ur(n[o-1]);)o--}else{for(;o<n.length&&!ur(n[o]);)o++;for(;o<n.length&&ur(n[o]);)o++}return{...t,cursorPosition:o}})},Iu=()=>{Mt(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}})},xu=()=>{Mt(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&ur(t[r-1]);)r--;for(;r>0&&!ur(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},Ms=e=>{Mt(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),s=e(r,t.commandMeta.autoCompletion),d=s+o,c=Math.max(0,Math.min(s.length,d.length));return{...t,value:d,cursorPosition:c,commandIsPending:!1}})},Eu=()=>{Mt(e=>({...e,commandIsPending:!0}))},Y=e=>{Mt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Ru=({addToHistory:e=!0})=>{Mt(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},Su=()=>{Mt(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}})},Nu=()=>{Mt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},me=()=>mr,ks=()=>{let[e,...t]=mr.value.split(xa);return t.join(xa).trim()}});var D,xn=v(()=>{"use strict";pe();Td();k();be();Be();D={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",EditTitle:"editTitle",EditDescription:"editDescription",Yank:"yank",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"}});var Cu,F,Sa=v(()=>{"use strict";k();Un();Cu=e=>{let{context:t}=f().contextNode;if(!t)return F.None;switch(e){case b.EXIT:return F.Exit;case b.EXPORT:return F.Export;case b.INIT:return F.Init;case b.OPEN:return F.OpenProject;case b.DELETE:return F.Delete;case b.EDIT:return F.Edit;case b.COMMENT:return F.Comment;case b.HELP:return F.ViewHelp;case b.RE_OPEN_ISSUE:return F.ReopenIssue;case b.CLOSE_ISSUE:return F.CloseIssue;case b.TAG:return F.TagTicket;case b.UNTAG:return F.UntagTicket;case b.ASSIGN:return F.AssignUserToTicket;case b.UNASSIGN:return F.UnassignUserFromTicket;case b.NEW:return F.NewItem;case b.FILTER:return F.Filter;case b.MOVE:return F.Move;case b.PEEK:return F.Peek;case b.REPLAY:return F.Replay;case b.CONFIG:return F.Config;case b.YANK:return F.Yank;case b.SYNC:return F.Sync;default:return F.None}},F={Exit:"exit",Init:"init",OpenProject:"open-project",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Replay:"replay",Yank:"yank",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export"}});import{Text as Au}from"ink";import Tu,{useEffect as wu,useState as dy}from"react";var Mu,qe,pr=v(()=>{"use strict";k();_e();Mu={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},qe=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Ve(),r=Mu[n]??Mu.default,[o,s]=dy(0);if(wu(()=>{s(0)},[r]),wu(()=>{if(!e)return;let c=setInterval(()=>{s(u=>(u+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return Tu.createElement(Au,null,t);let d=r[o]??r[0]??t;return Tu.createElement(Au,{color:A.accent,dimColor:o===1},d)}});import{Box as Na,Text as cy}from"ink";import Ls from"react";var ly,pn,go=v(()=>{"use strict";_e();ly=(e,t,n,r)=>{let o=u=>Math.max(1,e[u]??1),s=n,d=n+1,c=o(n);for(;d<t&&c+o(d)<=r;)c+=o(d),d++;for(;s>0&&c+o(s-1)<=r;)s--,c+=o(s);return{start:s,end:d}},pn=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,itemHeights:o,scrollByOne:s=!1})=>{if(e.length===0)return null;let d=Math.max(1,Math.floor(t)),c=Math.max(1,Math.ceil(r)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(1,Math.floor(d/c)),p=Math.max(0,e.length-m),{start:g,end:x}=o?ly(o,e.length,u,d):s?{start:Math.min(p,Math.max(0,u-m+1)),end:Math.min(p,Math.max(0,u-m+1))+m}:{start:Math.min(p,Math.floor(u/m)*m),end:Math.min(p,Math.floor(u/m)*m)+m},S=Math.max(1,x-g),C=e.slice(g,x),M=e.length>S,w=d,T=M?Math.max(1,Math.floor(S/e.length*w)):w,_=Math.max(0,w-T),O=Math.max(1,e.length-S),$=M?Math.floor(g/O*_):0;return Ls.createElement(Na,{flexDirection:"row",height:d,width:"100%"},Ls.createElement(Na,{flexDirection:"column",flexGrow:1,height:d},C),Ls.createElement(Na,{flexDirection:"column",width:1,height:w},Array.from({length:w}).map((Z,Jt)=>Ls.createElement(cy,{key:Jt,color:M&&Jt>=$&&Jt<$+T?A.accent:A.secondary},M?"\u2502":" "))))}});var ku,Ca,uy,Ps,Aa=v(()=>{"use strict";k();uy=()=>{let{eventLog:e=[]}=f();if(Ca&&ku===e)return Ca;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return ku=e,Ca=t,t},Ps=e=>uy().has(e)});import{Text as my}from"ink";import py from"react";var gy,fy,gr,Ds=v(()=>{"use strict";hs();wt();le();Aa();Qt();gy=e=>e.toLowerCase().trim(),fy=(e,t=ir)=>{let n=gy(e);return t[n]?t[n]:uo(n)},gr=({id:e,isSelected:t,maxWidth:n})=>{let r=I.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:En(o,n);return py.createElement(my,{underline:t,color:fy(o)},"@"+s,Ps(e)?"":"\u2197")}});import{Text as hy}from"ink";import vy from"react";var Os,Ta=v(()=>{"use strict";le();_e();wt();Qt();Os=({id:e,isSelected:t,maxWidth:n})=>{let r=I.getTag(e);if(!r)return;let o=n===void 0?r.name:En(r.name,n);return vy.createElement(hy,{underline:t,backgroundColor:Pe(r.name),color:A.secondary}," "+o+" ")}});import{useEffect as yy,useState as by}from"react";var Iy,Lu,Bs,fo,xy,Ey,fr,Fs=v(()=>{"use strict";wt();Iy=80,Lu=1400,Bs=new Set,fo=null,xy=e=>(Bs.add(e),fo||(fo=setInterval(()=>{for(let t of Bs)t()},Iy)),()=>{Bs.delete(e),Bs.size===0&&fo&&(clearInterval(fo),fo=null)}),Ey=()=>{let e=Date.now()%Lu/Lu;return e<.5?e*2:(1-e)*2},fr=e=>{let[,t]=by(0);return yy(()=>{if(e)return xy(()=>t(n=>n+1))},[e]),nu(Ey())}});import{Box as hr,Text as vr}from"ink";import ze from"react";var Ry,Pu,Sy,Ny,Ou,Bu=v(()=>{"use strict";le();_e();Qt();Aa();nn();ro();Ds();Ta();Fs();Ry=(e,t,n)=>{if(e.length<=t)return[e,null];let r=e.lastIndexOf(" ",t),o=r>0?r:t;return[e.slice(0,o),En(e.slice(o).trim(),n)]},Pu=3,Sy=2,Ny=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let d=e.length-o-1,c=d>0?String(d).length+1:0;if(r+s.width+c>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},Ou=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=fr(r),s=e-4,d=s-7-1,[c,u]=Ry(Se(t.title),d,s),m=u?null:En(Se(t.props.description),s)||null,p=cn(t),g=ln(t).map(T=>({...T,name:T.name})),x=Math.max(1,s-Pu),S=I.getCommentsByIssue(t.id),C=S.length?String(S.length).length+2+1:0,{shown:M,hidden:w}=Ny([...p.map(T=>({id:T.id,isTag:!0,width:Math.min(T.name.length,x)+Pu})),...g.map(T=>({id:T.id,isTag:!1,width:Math.min(T.name.length,x)+Sy+(Ps(T.id)?0:1)}))],s-C);return ze.createElement(hr,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?A.accent:A.secondary,justifyContent:"space-between"},ze.createElement(hr,{paddingLeft:1,paddingRight:1,flexDirection:"column"},ze.createElement(hr,{justifyContent:"space-between"},ze.createElement(vr,{color:A.primary},c),ze.createElement(vr,{color:A.secondary2,dimColor:!0},z(t.id))),u&&ze.createElement(vr,{color:A.primary},u),m&&ze.createElement(vr,{color:A.secondary2,dimColor:!0},m)),ze.createElement(hr,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},ze.createElement(hr,{flexDirection:"row"},M.map(T=>ze.createElement(hr,{paddingRight:1,key:T.id},T.isTag?ze.createElement(Os,{id:T.id,maxWidth:x}):ze.createElement(gr,{id:T.id,maxWidth:x}))),w>0&&ze.createElement(vr,{color:A.secondary2,dimColor:!0},"+",w)),S.length>0&&ze.createElement(vr,{color:A.accent},"[",S.length,"]")))}});import{Box as Wn,Text as ho}from"ink";import Ze from"react";var Cy,Fu,_u=v(()=>{"use strict";pe();le();_e();wt();pr();Fs();Cy=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Fu=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:d})=>{let c=fr(s),u=(r.props.tags??[]).map(Z=>I.getTag(Z)).filter(Z=>!!Z),m=(r.props.assignees??[]).map(Z=>I.getContributor(Z)).map(Z=>Z&&{...Z,name:Z.name}).filter(Z=>!!Z),p=1,g=u.length*(1+p),x=m.length*(2+p),S=u.map(Z=>Ze.createElement(Wn,{key:Z.id,paddingRight:p},Ze.createElement(ho,{color:Pe(Z.name)},"\u25A0"))),C=m.map(Z=>Ze.createElement(Wn,{key:Z.id,paddingRight:p},Ze.createElement(ho,{color:uo(Z.name)},"@"+Z.name.at(0)))),M=s?c:o?A.accent:d===h.MOVE?A.secondary:A.primary,w=I.getCommentsByIssue(r.id),T=w.length?String(w.length).length+2+p:0,_=w.length?Ze.createElement(Wn,{paddingRight:p},Ze.createElement(ho,{color:A.accent},"[",w.length,"]")):null,O=g+x+T,$=Math.max(1,n-t-O-(O>0?1:0));return Ze.createElement(Wn,{justifyContent:"space-between"},Ze.createElement(Wn,null,Ze.createElement(Wn,{width:t},o?Ze.createElement(qe,{isSelected:!0}):Ze.createElement(ho,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),Ze.createElement(ho,{wrap:"truncate",color:M},Cy(r.title,$))),Ze.createElement(Wn,null,S,C,_))}});import Ay from"chalk";import{Box as wa,Text as Ty}from"ink";import kt from"react";var wy,Uu,$u=v(()=>{"use strict";fe();k();_e();pr();go();Bu();_u();Fs();wy=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:d,mode:c})=>{let{renderedChildrenIndex:u,replay:m}=Ve(),p=u[e.id]??[],g=m?new Set(m.flashNodeIds):null,x=g?.has(e.id)??!1,S=fr(x),C=`${e.title} ${Ay.hex(A.secondary2).dim("("+p.length+")")}`,M=3,w=o?1:5,T=s&&d===-1,_=n-3-(o?1:0)-(T?2:0),O=Math.max(2,String(p.length).length+1),$=r-M-1,Z=kt.createElement(wa,{borderStyle:"round",borderColor:A.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},kt.createElement(qe,{isSelected:t}),kt.createElement(Ty,{bold:!0,color:x?S:t?A.accent:A.primary},C," ",e.readonly?"\u{1F512}":"")),Jt=(Dt,Xn)=>{let Er=s&&d===Xn;if(!P(Dt))return null;let Rr=g?.has(Dt.id)??!1;return o?kt.createElement(Fu,{key:Dt.id,index:Xn,labelWidth:O,width:_,ticket:Dt,isSelected:Er,isFlashing:Rr,mode:c}):kt.createElement(Ou,{key:Dt.id,width:_,ticket:Dt,isSelected:Er,isFlashing:Rr})};return kt.createElement(wa,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?A.accent:A.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},Z,kt.createElement(wa,null,p.length>0&&kt.createElement(pn,{selectedIndex:d,height:$,itemHeight:w},p.map(Jt)),T&&kt.createElement(qe,{isSelected:!0})))},Uu=kt.memo(wy)});var ju,Hu,Ma=v(()=>{"use strict";Tn();ju=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},Hu=(e,t,n)=>Ce.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0})});var yr,_s=v(()=>{"use strict";yr=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let s=Math.floor(t/o);if(s>=1)return`${s}${r} ago`}return"just now"}});import{Box as br,Text as Vt}from"ink";import De,{useEffect as My,useMemo as ky,useRef as Ly}from"react";import{decodeTime as Wu}from"ulid";function qu({ticket:e,width:t,height:n}){let r=ky(()=>Dy(e),[e]),o=Ly([]);My(()=>(Gu(o.current),o.current=By(e,r),()=>{Gu(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Ve(),c=Math.max(1,n-4),u=Math.max(12,t-32);return r.length===0?De.createElement(br,{flexDirection:"column",width:t,height:n,padding:1},De.createElement(Vt,{color:A.primary},"No attachments yet."),De.createElement(br,{paddingTop:1},De.createElement(Vt,{color:A.primary},"Attach images from the browser GUI"),De.createElement(Vt,{color:A.accent}," epiq gui "),De.createElement(Vt,{color:A.primary},"by dropping or pasting them."))):De.createElement(br,{flexDirection:"column",width:t,height:n},De.createElement(br,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:A.secondary,borderStyle:"single",paddingBottom:1},De.createElement(Vt,{color:A.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),De.createElement(pn,{height:c,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let g=p===s,x=m.name.length>u?m.name.slice(0,u-1)+"\u2026":m.name;return De.createElement(br,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},De.createElement(Vt,{color:A.accent},g?"\u276F ":" "),De.createElement(br,{paddingLeft:1},De.createElement(Vt,{color:A.secondary2},`#${p+1} `),De.createElement(Vt,{color:g?A.accent:A.primary},x),De.createElement(Vt,{color:A.secondary2}," "+Fy(m.bytes)+" "+yr(dt(m.id)))))})))}var Py,Dy,Gu,Oy,By,Fy,Vu=v(()=>{"use strict";Je();ct();_s();fe();N();le();Tn();k();_e();dr();go();Py=e=>Ae(e,"attachments"),Dy=e=>I.getAttachmentsByIssue(e.id).sort((t,n)=>Wu(t.id)-Wu(n.id)),Gu=e=>{for(let t of e)I.deleteNode(t.id)},Oy=(e,t,n)=>Ce.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),By=(e,t)=>{let n=I.getNode(Py(e.id));if(!n||!Ye(n))return[];let r=t.map((o,s)=>Oy(o,s,n.id)).map(o=>I.createNode(o)).filter(yt).map(({value:o})=>o).filter(Ye);return t.length>0&&f().selectedIndex<0&&U.navigate({contextNode:n,selectedIndex:0}),r},Fy=e=>`${Math.max(1,Math.round(e/1024))} KB`});var Ku,ka,zu,La,Yu,Xu,_y,Ju,Uy,Pa,Qu=v(()=>{"use strict";Ku=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,ka=e=>e.replace(Ku,""),zu=e=>e==="additions"||e==="deletions",La=e=>{let t=Ku.exec(e);if(!t?.[1])return null;let n;try{n=JSON.parse(t[1])}catch{return null}let r=n;return typeof r?.filePath!="string"||typeof r.start!="number"||typeof r.end!="number"||typeof r.note!="string"||!zu(r.side)||!zu(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r},Yu=/```\n([\s\S]*?)\n?```\s*$/,Xu=e=>Yu.exec(e)?.[1]??null,_y=/`[^`\n]+`[^\n]*\n?$/,Ju=e=>ka(e).replace(Yu,"").replace(_y,"").trim(),Uy=e=>{let n=(e.endSide??e.side)==="deletions"?"removed":"added";return e.start===e.end?`line ${e.start} (${n})`:`lines ${e.start}-${e.end} (${n})`},Pa=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${Uy(e)}`});var $y,vo,jy,Hy,Wy,Gy,em,Da,tm,Zu,nm,Oa=v(()=>{"use strict";Qu();$y=(e,t)=>{let n=Math.max(1,Math.floor(t)),r=e.split(/\s+/).filter(Boolean);if(r.length===0)return[""];let o=[],s="";for(let d of r){let c=d;for(;c.length>n;)s&&(o.push(s),s=""),o.push(c.slice(0,n)),c=c.slice(n);s?s.length+1+c.length<=n?s=`${s} ${c}`:(o.push(s),s=c):s=c}return s&&o.push(s),o},vo=e=>{let t=e.split("`");return t.length%2===0?[{text:e}]:t.map((n,r)=>r%2===1?{text:n,code:!0}:{text:n}).filter(n=>n.text.length>0)},jy=/!\[([^\]]*)\]\([^)]*\)/g,Hy=e=>e.replace(jy,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),Wy=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),Gy=4,em=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(Gy)),Da=e=>{let t=!1;return e.map(em).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=La(n);if(r)return{kind:"caption",text:Pa(r)};let o=Hy(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:vo(s[1]??"")}:{kind:"text",spans:vo(o)}})},tm=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],Zu=(e,t)=>{let n=[];for(let r of Da(e))if(r.kind!=="fence"){if(r.kind==="blank"){n.length>0&&n[n.length-1]?.kind!=="blank"&&n.push(r);continue}if(r.kind==="code"){for(let o of tm(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of $y(Wy(r.spans),t))n.push({kind:r.kind,spans:vo(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},nm=(e,t)=>{let n=La(e),r=n?Xu(e):null;if(!n||r===null)return Zu(ka(e).split(`
59
+ `),t);let o=Ju(e),s=r.split(`
60
+ `).map(em),d=n.side===n.endSide?n.start:void 0,c=d===void 0?0:String(d+s.length-1).length+3;return[...o?[...Zu(o.split(`
61
+ `),t),{kind:"blank"}]:[],{kind:"caption",text:Pa(n)},...s.flatMap((u,m)=>tm(u,Math.max(1,t-c)).map((p,g)=>({kind:"code",text:p,number:d===void 0||g>0?void 0:d+m})))]}});import{Box as rm,Text as Gn}from"ink";import it from"react";var om,Ba,sm,Fa=v(()=>{"use strict";_e();om=({spans:e,bold:t,wrap:n})=>it.createElement(Gn,{color:A.primary,bold:t,wrap:n},e.map((r,o)=>r.code?it.createElement(Gn,{key:o,color:A.yellow},r.text):it.createElement(Gn,{key:o},r.text))),Ba=({line:e,width:t,gutter:n=0,wrap:r})=>{switch(e.kind){case"blank":return it.createElement(Gn,null," ");case"fence":return it.createElement(Gn,{color:A.secondary2},"```");case"caption":return it.createElement(Gn,{color:A.accent,wrap:r},e.text);case"heading":return it.createElement(om,{spans:e.spans,bold:!0,wrap:r});case"text":return it.createElement(om,{spans:e.spans,wrap:r});case"code":{let o=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return it.createElement(Gn,{backgroundColor:A.secondary,color:A.primary,wrap:r},o,e.text.padEnd(Math.max(0,t-o.length)))}}},sm=({lines:e,width:t})=>{let n=e.flatMap(o=>o.kind==="code"&&o.number!==void 0?[o.number]:[]),r=n.length>0?String(Math.max(...n)).length+3:0;return it.createElement(rm,{flexDirection:"column"},e.map((o,s)=>it.createElement(rm,{key:s},it.createElement(Ba,{line:o,width:t,gutter:r}))))}});import{Box as gn,Text as fn}from"ink";import Re,{useEffect as qy,useMemo as im,useRef as Vy}from"react";import{decodeTime as am}from"ulid";function cm({ticket:e,width:t,height:n}){let r=im(()=>Yy(e),[e]),o=Vy([]);qy(()=>(dm(o.current),o.current=Xy(e,r),()=>{dm(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Ve(),c=Math.max(1,n-4),u=Math.max(20,t-8),m=im(()=>r.map(g=>{let x=nm(g.md,u);return x.length>0?x:[{kind:"blank"}]}),[r,u]),p=m.map(g=>g.length+zy);return r.length===0?Re.createElement(gn,{flexDirection:"column",width:t,height:n,padding:1},Re.createElement(fn,{color:A.primary},"No comments yet."),Re.createElement(gn,{paddingTop:1},Re.createElement(fn,{color:A.primary},"Use"),Re.createElement(fn,{color:A.accent}," :comment "),Re.createElement(fn,{color:A.primary},"to add the first one."))):Re.createElement(gn,{flexDirection:"column",width:t,height:n},Re.createElement(gn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:A.secondary,borderStyle:"single",paddingBottom:1},Re.createElement(fn,{color:A.secondary2},"Comments (",r.length,") ")),Re.createElement(pn,{height:c,itemHeights:p,selectedIndex:s},r.map((g,x)=>{let S=x===s;return Re.createElement(gn,{key:g.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:A.secondary,borderStyle:"single"},Re.createElement(gn,{flexDirection:"row",paddingBottom:1},Re.createElement(fn,{color:A.accent},S?"\u276F ":" "),Re.createElement(gn,{paddingLeft:1},Re.createElement(fn,{color:A.secondary2},`#${x+1} `),Re.createElement(gr,{id:g.authorId}),Re.createElement(fn,{color:A.secondary2}," "+yr(dt(g.id))))),Re.createElement(gn,{paddingLeft:3,paddingBottom:1},Re.createElement(sm,{lines:m[x]??[],width:u})))})))}var zy,Ky,Yy,dm,Xy,lm=v(()=>{"use strict";Je();ct();_s();fe();N();le();k();_e();dr();Ds();go();Ma();Oa();Fa();zy=4,Ky=e=>Ae(e,"comments"),Yy=e=>I.getCommentsByIssue(e.id).sort((t,n)=>am(t.id)-am(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),dm=e=>{for(let t of e)I.deleteNode(t.id)},Xy=(e,t)=>{let n=I.getNode(Ky(e.id));if(!n||!Ye(n))return[];let r=t.map((o,s)=>Hu(o,s,n.id)).map(I.createNode).filter(yt).map(({value:o})=>o).filter(wr);return t.length>0&&f().selectedIndex<0&&U.navigate({contextNode:n,selectedIndex:0}),r}});import{Box as Us,Text as Jy}from"ink";import zt from"react";var um,mm=v(()=>{"use strict";fe();le();tr();k();_e();Ds();pr();Ta();um=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=Ve(),{title:o}=t,s=t.parentNodeId?I.getNode(t.parentNodeId):void 0,d=s&&P(s)?o===ie.ASSIGNEES?s.props.assignees??[]:o===ie.TAGS?(s.props.tags??[]).filter(c=>I.getTag(c)):[]:[];return zt.createElement(Us,{alignItems:"center",paddingTop:1},zt.createElement(Us,{minWidth:12},zt.createElement(qe,{isSelected:n}),zt.createElement(Jy,{color:n?A.accent:A.secondary2},o,":")),zt.createElement(Us,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((c,u)=>{let m=r.id===t.id&&u===e;return zt.createElement(Us,{key:`${o}-${c}`,paddingRight:2,minHeight:1},zt.createElement(qe,{isSelected:m}),o===ie.ASSIGNEES?zt.createElement(gr,{isSelected:m,id:c}):o===ie.TAGS?zt.createElement(Os,{isSelected:m,id:c}):null)})))}});var _a,pm,Ua,$a=v(()=>{"use strict";_a=e=>Math.max(5,String(Math.max(e,1)).length+3),pm=(e,t)=>Math.max(0,e-6-_a(t)),Ua=(e,t=0)=>Math.max(1,e-5-2*t)});import{Box as Ir,Text as ja}from"ink";import at,{useEffect as Qy,useMemo as Ha}from"react";var Zy,gm,Wa,fm,eb,Ga,hm=v(()=>{"use strict";le();N();Tn();k();_e();Qt();$a();pr();go();Fa();Oa();Zn();Zy="\u2029",gm=(e,t)=>`${e}::inline-line::${t}`,Wa=new Map,fm=e=>{let t=Wa.get(e)??[];Wa.delete(e);for(let n of t)I.deleteNode(n)},eb=(e,t)=>{fm(e);let n=[];t.forEach((r,o)=>{let s=tt(BigInt(o+1));if(!yt(s))return;let d=I.createNode(Ce.text({id:gm(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));yt(d)&&n.push(d.value.id)}),Wa.set(e,n)},Ga=({id:e,label:t,text:n,rows:r,selected:o,maxWidth:s})=>{let{selectedIndex:d,contextNode:c}=Ve(),u=Ha(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=Ha(()=>u.join("\0"),[u]);Qy(()=>(eb(e,u),()=>{fm(e)}),[e,m]);let p=_a(u.length),g=pm(s,u.length),S=Ha(()=>Da(u).map(C=>{if(C.kind==="code"||C.kind==="caption")return{...C,text:pi(C.text,g)};if(C.kind==="text"||C.kind==="heading"){let M=C.spans.map(w=>w.code?`\`${w.text}\``:w.text).join("");return{...C,spans:vo(pi(M,g))}}return C}),[u,g]).map((C,M)=>{let w=c.id===e&&d===M;return at.createElement(Ir,{key:gm(e,M)},at.createElement(Ir,{flexShrink:0},at.createElement(ja,{color:w?A.primary:A.secondary2,dimColor:!w},`${M+1} `.padStart(p,"\xA0"))),C.kind==="blank"?at.createElement(ja,{backgroundColor:w?"gray":void 0},Zy):at.createElement(Ir,null,at.createElement(Ba,{line:C,width:C.kind==="code"?g:0,wrap:"truncate-end"})))});return at.createElement(Ir,{flexDirection:"column",paddingTop:1},at.createElement(Ir,null,at.createElement(qe,{isSelected:o}),at.createElement(ja,{color:o?A.accent:A.secondary2},t)),at.createElement(Ir,{flexDirection:"row",borderStyle:"round",borderColor:A.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},at.createElement(pn,{scrollByOne:!0,height:r,selectedIndex:d,itemHeight:1},S)))}});import{Box as qn,Text as qa}from"ink";import we,{useMemo as yo}from"react";var tb,nb,rb,ob,vm,ym=v(()=>{"use strict";fe();le();k();_e();Ma();dr();Vu();lm();pr();mm();hm();$a();tb=e=>Ae(e,"description"),nb=e=>Ae(e,"comments"),rb=e=>Ae(e,"history"),ob=e=>Ae(e,"attachments"),vm=({ticket:e,height:t})=>{let n=yo(()=>ju(e),[e]),{selectedIndex:r,contextNode:o}=Ve(),s=process.stdout.columns||120,d=yo(()=>tb(e.id),[e.id]),c=yo(()=>nb(e.id),[e.id]),u=yo(()=>rb(e.id),[e.id]),m=yo(()=>ob(e.id),[e.id]),p=I.getAttachmentsByIssue(e.id).length,g=o.id===e.id,x=o.id===c||o.parentNodeId===c,S=o.id===u||o.parentNodeId===u,C=o.id===m||o.parentNodeId===m,M=ae(e.id);if(x){let $=t-3;return we.createElement(qn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},we.createElement(cm,{ticket:e,width:s,height:$}))}if(C){let $=t-3;return we.createElement(qn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},we.createElement(qu,{ticket:e,width:s,height:$}))}if(S){let O=I.getNode(u),$=O&&Ye(O)?O.props.value??"":"",Z=Ua(t);return we.createElement(qn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},O?we.createElement(Ga,{id:O.id,label:"Event log",text:$,selected:!1,maxWidth:s,rows:Z}):null)}let w=M.reduce((O,$)=>Tr($)||$.id===c||$.id===m||$.id===u?O+1:O,0),T=Ua(t,w),_=(O,$)=>O.id===d?we.createElement(Ga,{key:O.id,id:d,label:"Description (press e to edit)",text:e.props.description??"",selected:$,maxWidth:s,rows:T}):Tr(O)?we.createElement(um,{key:O.id,parent:O,selected:$,selectedIndex:r}):O.id===c?we.createElement(qn,{key:O.id,paddingTop:1},we.createElement(qe,{isSelected:$}),we.createElement(qa,{backgroundColor:A.secondary,color:$?A.accent:A.primary},` Comments (${n}) \u203A\u203A `)):O.id===m?we.createElement(qn,{key:O.id,paddingTop:1},we.createElement(qe,{isSelected:$}),we.createElement(qa,{backgroundColor:A.secondary,color:$?A.accent:A.primary},` Attachments (${p}) \u203A\u203A `)):O.id===u?we.createElement(qn,{key:O.id,paddingTop:1},we.createElement(qe,{isSelected:$}),we.createElement(qa,{backgroundColor:A.secondary,color:$?A.accent:A.primary}," History \u203A\u203A ")):null;return we.createElement(qn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},M.map((O,$)=>_(O,g&&r===$)))}});import{Box as sb}from"ink";import $s from"react";var ib,bm,Im=v(()=>{"use strict";fe();$u();ym();ib=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:d,width:c})=>{let u=t.context,m=u===V.TICKET||u===V.FIELD_LIST||u===V.FIELD,p=u===V.BOARD||u===V.SWIMLANE,g=u===V.TICKET?t:r.find(w=>w.context===V.TICKET),x=Math.floor(c/3),S=Math.floor(c/Math.max(e.length,1)),C=Math.min(S,x),M=s==="dense";return $s.createElement(sb,{flexDirection:"row",height:d},p&&e.map((w,T)=>{let _=t.id===w.id,O=_?n:-1,$=t.context===V.BOARD&&n===T;return $s.createElement(Uu,{key:w.id,height:d,width:C,swimlane:w,isSelected:$,isDense:M,isFocused:_,listSelectedIndex:O,mode:o})}),m&&g&&$s.createElement(vm,{height:d,ticket:g}))},bm=$s.memo(ib)});import xm from"node:fs";import ab from"node:path";import db from"react";import{render as cb}from"ink";import{Writable as lb}from"node:stream";var bo,ub,mb,pb,gb,Em,Rm=v(()=>{"use strict";Im();fe();N();k();ne();Be();bo=e=>String(e).padStart(2,"0"),ub=e=>{let t=e.getUTCFullYear(),n=bo(e.getUTCMonth()+1),r=bo(e.getUTCDate()),o=bo(e.getUTCHours()),s=bo(e.getUTCMinutes()),d=bo(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${d}`},mb=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",pb=async(e,{width:t,height:n})=>{let r="",o=new lb({write(d,c,u){let m=gb(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=cb(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),s.unmount(),r},gb=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Em=async()=>{let{viewMode:e}=ve(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=f(),d=r.find(T=>T.context==="BOARD");if(!d)return i("No board found to export");let c=120,u=40,m=await pb(db.createElement(bm,{height:u,width:c,swimlanes:(s[d.id]??[]).filter(T=>T!==void 0&&In(T)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:u});if(!m)return i("Failed to render board export");let p=Vo(process.cwd());if(a(p))return i("Unable to export, epiq root not found");let g=new Date,x=ub(g),S=`board_${mb(d.title)}_${x}.md`,C=ic(p.value);xm.mkdirSync(C,{recursive:!0});let M=ab.join(C,S),w=`# Board - ${d.title}
62
+ Date: ${g.toISOString()}
62
63
 
63
64
  \`\`\`text
64
65
  ${m}
65
66
  \`\`\`
66
- `;return Uu.writeFileSync(w,T,"utf8"),c("Exported board layout",w)}});var Fs,Aa=y(()=>{"use strict";Fs=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id){for(let o=n-1;o>=0;o--){let s=t[o];if(s&&"id"in s.payload&&s.payload.id===e.id&&"parent"in s.payload&&s.payload.parent)return s.payload.parent}return null}}return null}});import{useSyncExternalStore as OM}from"react";var Ta,Iy,Ey,ur,Ry,gn,Os=y(()=>{"use strict";C();Iy=new Set,Ey=()=>{for(let e of Iy)e()},ur=()=>{if(!Ta)throw new Error("Ui state not initialized. Call initUiState() first.");return Ta},Ry=e=>{let t=ur();return Ta=e(t),Ey(),c("UX state updated",null)},gn=e=>Ry(t=>({...t,...e}))});import{spawn as Ny}from"node:child_process";function po(e){let t=process.platform,o=Ny(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}var wa=y(()=>{"use strict"});import{spawn as WM,spawnSync as Sy}from"node:child_process";import Cy from"node:os";import Hu from"node:path";import{ulid as Ay}from"ulid";function Wu(e){let t=[],n="",r=!1,o=null;for(let s of e.trim()){if(o){s===o?o=null:n+=s;continue}if(s==='"'||s==="'"){o=s,r=!0;continue}if(/\s/.test(s)){r&&t.push(n),n="",r=!1;continue}n+=s,r=!0}return r&&t.push(n),t}function Ty(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function Gu(){let{preferredEditor:e}=xe(),t=[e?Ty(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function qu(e){let[t=""]=Wu(e);return/(^|\/)code(-insiders)?$/.test(t)}function wy(e,t){let[n="",...r]=Wu(e);return{command:n,args:[...r,...t]}}function My(e,t){return wy(e,qu(e)?["--wait",t]:[t])}function Vu(e){let t=Hu.join(Cy.tmpdir(),"epiq");qe.mkDir(t);let n=Hu.join(t,Ay());qe.writeToFile(n,e??"");let r=Gu();for(let o of r){let{command:s,args:d}=My(o,n);if(!s)continue;let l=Sy(s,d,{stdio:"inherit"});if(!l.error&&l.status===0){let u=qe.readFile(n);if(u==null)return i("Unable to read edited file");let m=u.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return i("Unable to open editor")}var Ma=y(()=>{"use strict";C();Ue();vs()});import{ulid as ka}from"ulid";var zu,ky,Ly,Ku=y(()=>{"use strict";Ma();Mn();gt();xt();he();C();Vn();ge();k();pe();cn();zu=async e=>{let{contextNode:t,selectedIndex:n}=g(),r=ae(t.id)[n];if(e.modifier===et.DESCRIPTION)return Ly();if(r&&xr(r))return ky(e);if(e.modifier===et.TITLE){let o=ve();if(a(o))return i("Unable to resolve user ID");let s=r;if(!s)return i("Missing node");if(s.readonly)return i("Cannot rename readonly node");let d=e.inputString.trim();if(!d)return i("Provide a title");let l=await Ct();return a(l)?l:O([{id:ka(),action:"edit.title",payload:{id:s.id,name:d},...o.value}],l.value)}return i("Unknown edit command")},ky=async e=>{let t=ve();if(a(t))return i("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=g(),o=ae(n.id)[r];if(!o||!xr(o))return i("Select a comment first");if(o.readonly)return i("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return i("Unable to resolve comment issue");let d=g().nodes[s];if(!d||!P(d))return i("Unable to resolve comment issue");if(d.readonly)return i("Cannot edit readonly issue");let l=o.id.split(":").at(0)??"",u=x.getComment(l);if(!u||u.deleted)return i("Unable to resolve comment");if(u.issue!==d.id)return i("Comment does not belong to selected issue");if(u.authorId!==t.value.userId)return i("You can only edit your own comments"+u.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return i("Provide a comment");let p=await Ct();if(a(p))return p;let f=p.value;return O([{id:ka(),action:"edit.issue.comment",payload:{id:u.id,issue:d.id,md:m},...t.value}],f)},Ly=async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let t=await Ct();if(a(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=g(),s=Xe([...r,o],"TICKET");if(a(s))return i("Edit target must be an issue");let d=s.value;if(!P(d))return i("Edit target must be an issue");if(d.readonly)return i("Cannot edit readonly issue");let l=ae(d.id).find(f=>f.title===se.DESCRIPTION);if(!l)return i("No target found");if(l.readonly)return i("Cannot edit readonly field");let u=d.props.description??"";if(typeof u!="string")return i("Selected field is not editable text");let m=Vu(u);if(a(m))return i("Failed to edit field");let p=m.value;return p===u?c("No changes made",null):O([{id:ka(),action:"edit.description",payload:{id:d.id,md:p},...e.value}],n)}});import La from"node:fs";import Py from"node:path";var Yu,Xu=y(()=>{"use strict";C();Nt();Yu=async e=>{let t=Py.join(e,".gitignore"),n=La.existsSync(t)?La.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
67
- `).map(u=>u.trim()),s=r.filter(u=>!o.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(s.length===0)return c("Local epiq paths already ignored",!1);let l=["# [epiq]: local hydrated state is never committed",...s].join(`
67
+ `;return xm.writeFileSync(M,w,"utf8"),l("Exported board layout",M)}});var js,Va=v(()=>{"use strict";js=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id){for(let o=n-1;o>=0;o--){let s=t[o];if(s&&"id"in s.payload&&s.payload.id===e.id&&"parent"in s.payload&&s.payload.parent)return s.payload.parent}return null}}return null}});import{useSyncExternalStore as Qk}from"react";var za,fb,hb,xr,vb,hn,Hs=v(()=>{"use strict";N();fb=new Set,hb=()=>{for(let e of fb)e()},xr=()=>{if(!za)throw new Error("Ui state not initialized. Call initUiState() first.");return za},vb=e=>{let t=xr();return za=e(t),hb(),l("UX state updated",null)},hn=e=>vb(t=>({...t,...e}))});import{spawn as rL,spawnSync as yb}from"node:child_process";import bb from"node:os";import Sm from"node:path";import{ulid as Ib}from"ulid";function Nm(e){let t=[],n="",r=!1,o=null;for(let s of e.trim()){if(o){s===o?o=null:n+=s;continue}if(s==='"'||s==="'"){o=s,r=!0;continue}if(/\s/.test(s)){r&&t.push(n),n="",r=!1;continue}n+=s,r=!0}return r&&t.push(n),t}function xb(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function Cm(){let{preferredEditor:e}=ve(),t=[e?xb(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Am(e){let[t=""]=Nm(e);return/(^|\/)code(-insiders)?$/.test(t)}function Eb(e,t){let[n="",...r]=Nm(e);return{command:n,args:[...r,...t]}}function Rb(e,t){return Eb(e,Am(e)?["--wait",t]:[t])}function Tm(e){let t=Sm.join(bb.tmpdir(),"epiq");We.mkDir(t);let n=Sm.join(t,Ib());We.writeToFile(n,e??"");let r=Cm();for(let o of r){let{command:s,args:d}=Rb(o,n);if(!s)continue;let c=yb(s,d,{stdio:"inherit"});if(!c.error&&c.status===0){let u=We.readFile(n);if(u==null)return i("Unable to read edited file");let m=u.replace(/\r?\n$/,"");return l("Successfully edited",m)}}return i("Unable to open editor")}var Ka=v(()=>{"use strict";N();Be();Rs()});import{ulid as Ya}from"ulid";var wm,Sb,Nb,Mm=v(()=>{"use strict";Ka();On();ht();It();fe();N();tr();le();k();ne();un();wm=async e=>{let{contextNode:t,selectedIndex:n}=f(),r=ae(t.id)[n];if(e.modifier===Qe.DESCRIPTION)return Nb();if(r&&wr(r))return Sb(e);if(e.modifier===Qe.TITLE){let o=ge();if(a(o))return i("Unable to resolve user ID");let s=r;if(!s)return i("Missing node");if(s.readonly)return i("Cannot rename readonly node");let d=e.inputString.trim();if(!d)return i("Provide a title");let c=await Nt();return a(c)?c:B([{id:Ya(),action:"edit.title",payload:{id:s.id,name:d},...o.value}],c.value)}return i("Unknown edit command")},Sb=async e=>{let t=ge();if(a(t))return i("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=f(),o=ae(n.id)[r];if(!o||!wr(o))return i("Select a comment first");if(o.readonly)return i("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return i("Unable to resolve comment issue");let d=f().nodes[s];if(!d||!P(d))return i("Unable to resolve comment issue");if(d.readonly)return i("Cannot edit readonly issue");let c=o.id.split(":").at(0)??"",u=I.getComment(c);if(!u||u.deleted)return i("Unable to resolve comment");if(u.issue!==d.id)return i("Comment does not belong to selected issue");if(u.authorId!==t.value.userId)return i("You can only edit your own comments"+u.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return i("Provide a comment");let p=await Nt();if(a(p))return p;let g=p.value;return B([{id:Ya(),action:"edit.issue.comment",payload:{id:u.id,issue:d.id,md:m},...t.value}],g)},Nb=async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let t=await Nt();if(a(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=f(),s=Ke([...r,o],"TICKET");if(a(s))return i("Edit target must be an issue");let d=s.value;if(!P(d))return i("Edit target must be an issue");if(d.readonly)return i("Cannot edit readonly issue");let c=ae(d.id).find(g=>g.title===ie.DESCRIPTION);if(!c)return i("No target found");if(c.readonly)return i("Cannot edit readonly field");let u=d.props.description??"";if(typeof u!="string")return i("Selected field is not editable text");let m=Tm(u);if(a(m))return i("Failed to edit field");let p=m.value;return p===u?l("No changes made",null):B([{id:Ya(),action:"edit.description",payload:{id:d.id,md:p},...e.value}],n)}});import Xa from"node:fs";import Cb from"node:path";var km,Lm=v(()=>{"use strict";N();Rt();km=async e=>{let t=Cb.join(e,".gitignore"),n=Xa.existsSync(t)?Xa.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
68
+ `).map(u=>u.trim()),s=r.filter(u=>!o.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(s.length===0)return l("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...s].join(`
68
69
  `);return n=n.trimEnd()+`
69
70
 
70
- ${l}
71
- `,La.writeFileSync(t,n,"utf8"),X.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)}});import Dy from"node:fs";import Ju from"node:path";var Fy,re,Qu,Zu=y(()=>{"use strict";Xu();Po();mt();lt();Wr();Ze();Kr();_r();Ut();gt();ue();C();Bt();Re();Ue();k();pe();Fy=async e=>{let t=await H({cwd:e,args:["status","--porcelain"]});return a(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},re=(e,t)=>i(`[${e}] ${t}`),Qu=async()=>{V("");let e=Mo(),t=await ut(process.cwd());if(a(t))return re(1,t.message);let n=t.value,r=await Do(n);if(a(r))return re(2,r.message);if(r.value)return re(2,`Cannot initialize Epiq while a git operation is in progress: ${r.value}`);let o=await Fy(n);if(a(o))return re(2.5,o.message);if(o.value)return re(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Mr(n))return re(4,"Epiq project already initialized");let s=cs();if(!s.isSetupDone||!s.userName)return re(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=xe(),l=d.userName,u=d.userId;if(!u||!l)return re(5,"Missing Epiq user id");let m=await Cc(n);if(a(m))return re(6,m.message);let p=e.stateBranch,f=await Fo({repoRoot:n,branch:p});if(a(f))return re(6,f.message);if(f.value)return re(6,`State branch already exists: ${p}`);let I=await Pi({repoRoot:n,stateBranchName:p});if(a(I))return re(6,I.message);let N=_o();if(a(N))return re(7,N.message);let A=Ju.join(Bo(),e.projectId),w=await Ln({repoRoot:n,stateBranchRoot:A,stateBranchName:p});if(a(w))return re(8,w.message);let T=Ju.join(A,".epiq");Dy.mkdirSync(T,{recursive:!0});let M=hc({userId:u,userName:l});if(a(M))return re(9,M.message);for(let Zs of M.value){let Qa=Ko({event:Zs,rootDir:A});if(a(Qa))return re(9,Qa.message)}let U=await ns({stateBranchRoot:A,eventFileName:wn({userId:u,userName:l})});if(a(U))return re(10,U.message);let ne=await qn({cwd:A,message:"[epiq:init]"});if(a(ne))return re(10,ne.message);let be=await Yu(n);if(a(be))return re(11,be.message);let Q=bd({repoRoot:n,fileContents:e});if(a(Q))return re(12,Q.message);let q=await ye.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(q))return re(13,q.message);let z=await ye.commit({cwd:n,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(a(z))return re(13,z.message);let yn="Project initialized!",bn=await H({cwd:n,args:["push","-u","origin","HEAD"]});a(bn)&&(yn+=` Warn: [init:14] ${bn.message}`);let pr=await Hr({repoRoot:n,stateBranchRoot:A});a(pr)&&(yn+=` Warn: [init:15] ${pr.message}`);let Xa=_t(M.value).filter(a);if(Xa.length>0)return re(16,Xa.map(Zs=>Zs.message).join(`
72
- `));let Qs=Ge();if(a(Qs))return re(16,Qs.message);let{rootNodeId:sg,nodes:ig}=Qs.value,Ja=ig[sg];return Ja?(_.navigate({contextNode:Ja,selectedIndex:0}),E({hasProjectDefinition:!0,mode:h.DEFAULT}),c(yn,null)):re(16,"Unable to resolve initialized root node")}});import{ulid as Oy}from"ulid";function Da(e){let t=tm();if(a(t))return t;let{contextNode:n,nodes:r}=g();if(!n.parentNodeId)return i("Missing parent node id");let o=r[n.parentNodeId];if(!o)return i("Missing parent node");let s=me(o.id),d=s.findIndex(({id:m})=>m===n.id);if(d<0)return i("Current node not found among siblings");let l=s[d+e];if(!l)return i("Missing sibling node");let u=nm({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:rm(u.value)}function Fa(e){let t=tm();if(a(t))return t;let{contextNode:n,selectedIndex:r}=g(),s=me(n.id)[r+e];if(!s)return i("Missing sibling node");let d=nm({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return a(d)?d:rm(d.value)}var em,fn,go,tm,Pa,nm,rm,Oa=y(()=>{"use strict";Ut();gt();C();Rt();k();em=null,fn=()=>structuredClone(em),go=e=>{em=e},tm=()=>{let{contextNode:e,selectedIndex:t}=g(),r=me(e.id)[t];return r?c("Resolved selected child",r):i("Target node not found")},Pa=({id:e,parentId:t,position:n={at:"end"}})=>{let r=me(t).filter(o=>o.id!==e);return Yo(r,n)},nm=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ve();if(a(r))return i("Unable to resolve user ID");let o=Pa({parentId:t,id:e,position:n});return a(o)?o:c("Created pending move state",{id:Oy(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},rm=e=>{go(e);let t=tn(e,!0);return a(t)?t:c("Node moved successfully",t.value)}});import{ulid as By}from"ulid";var om,Bs,sm,im=y(()=>{"use strict";Ze();Oa();Mn();gt();ue();C();Rt();Re();k();pe();om=()=>{let e=fn();if(!e)return i("No pending move state");let t=e.payload.id,n=e.payload.parent,r=g().nodes[n];if(!r)return i("Move parent not found");let o=me(n).findIndex(s=>s.id===t);return o===-1?i("Moved node not found among rendered children"):(_.navigate({contextNode:r,selectedIndex:o}),c("Synchronized navigation to moved node",null))},Bs=(e,t="Moved preview")=>{if(a(e))return e;let n=om();return a(n)?n:(E({mode:h.MOVE}),c(t,null))},sm=async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{modifier:t}=de().commandMeta,{contextNode:n,selectedIndex:r}=g(),o=me(n.id)[r];if(!o)return E({mode:h.DEFAULT}),i("No move target");if(t==="start"){if(o.readonly)return i("Target node is read-only");if(r===-1)return i("No item selected");if(!o.parentNodeId)return i("Target has no parent");let s=me(o.parentNodeId),d=s.findIndex(({id:f})=>f===o.id);if(d===-1)return i("Target not found among siblings");let l=s[d-1],u=s[d+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},p=Pa({parentId:o.parentNodeId,id:o.id,position:m});return a(p)?p:(go({id:By(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),E({mode:h.MOVE}),c("Move initialized",null))}if(t==="next")return Bs(Fa(1));if(t==="previous")return Bs(Fa(-1));if(t==="to-next")return Bs(Da(1));if(t==="to-previous")return Bs(Da(-1));if(t==="confirm"){let s=fn();if(!s)return i("No pending move to confirm");let d=await Ct();if(a(d))return d;let l=O([s],d.value);if(a(l))return l;let u=om();return a(u)?u:(go(null),E({mode:h.DEFAULT}),c("Moved item",null))}return t==="cancel"?(go(null),E({mode:h.DEFAULT}),c("Cancelling move",null)):i("Invalid move modifier")}});import{monotonicFactory as _y,ulid as Uy}from"ulid";var $y,_s,Ba=y(()=>{"use strict";C();$y=_y(),_s=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=$y();return c("Created issue events",[{id:Uy(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])}});import{ulid as Us}from"ulid";var am,dm=y(()=>{"use strict";Ze();Ba();Mn();gt();xt();C();ge();Rt();k();pe();am=async(e,t)=>{let n=ve();if(a(n))return i("Unable to resolve user ID");let r=await Ct();if(a(r))return r;let o=r.value;if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:d,selectedIndex:l}=g(),u=m=>{let p=O([m],o);if(a(p))return p;let f=x.getNode(p.value[0].result.id);if(!f)return i("Created node not found");if(!f.parentNodeId)return p;let I=x.getNode(f.parentNodeId);return I?(_.navigate({contextNode:I,selectedIndex:x.getSiblings(f.parentNodeId).findIndex(({id:N})=>N===f.id)}),p):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=g(),p=x.getNode(m);if(!p)return i("Workspace not found");let f=kn(p.id,n.value,o);return a(f)?f:u({id:Us(),action:"add.board",payload:{id:Us(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=Xe(s,"BOARD");if(a(m))return i("Unable to add swimlane in this context");let p=kn(m.value.id,n.value,o);return a(p)?p:u({id:Us(),action:"add.swimlane",payload:{id:Us(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=ae(d.id)[l],p=d.context==="SWIMLANE"?d:d.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let U=Xe(s,"SWIMLANE");return a(U)?null:U.value})();if(!p)return i("Unable to add issue in this context");let f=kn(p.id,n.value,o);if(a(f))return f;let I=_s({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(a(I))return I;let N=I.value,A=O([...N],o);if(a(A))return A;if(!A.value[0])return i("Issue creation failed");let M=N.find(U=>U.action==="add.issue")?.payload.id;return M?(_.navigate({contextNode:p,selectedIndex:x.getSiblings(p.id).findIndex(({id:U})=>U===M)}),c("Issue created",null)):i("Unable to determine ticket id")}return c("Success",null)}});var cm,lm=y(()=>{"use strict";mt();lt();Wr();zr();_r();rn();C();Bt();k();ts();cm=async e=>{let t=Ce({repoRoot:e});if(a(t))return Ur(3,t.message);let n=await Ln({repoRoot:e,stateBranchRoot:t.value,stateBranchName:Mo().stateBranch});if(a(n))return Ur(3,n.message);let r=await H({cwd:t.value,args:["pull","--ff-only"]});a(r)&&logger.info(3,r.message);let o=$t(t.value);if(a(o))return Ur(3,o.message);let{events:s,unreadable:d}=o.value,l=sn(s,d);if(a(l))return Ur(4,l.message);E({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let u=Hi({root:e});return a(u)&&logger.info(u.message),c("Loaded project",void 0)}});import jy from"node:os";import um from"node:path";var Hy,Wy,mm,pm=y(()=>{"use strict";lm();zr();C();Re();k();pe();Hy=e=>e==="~"||e.startsWith("~/")?um.join(jy.homedir(),e.slice(1)):e,Wy=(e,t)=>{let n=e.trim();if(!n)return i("Provide a number from the list or a path to a project");if(/^\d+$/.test(n)){let o=t[Number(n)-1];return o?c("Resolved recent project",o.root):i(`No recent project #${n}`)}let r=Qe(um.resolve(Hy(n)));return a(r)?i(`No epiq project at ${n}`):c("Resolved project path",r.value)},mm=async()=>{let e=Ss();if(V(""),g().hasProjectDefinition)return i("Already in a project; run epiq from another directory");let t=ds({exclude:process.cwd()}),n=a(t)?[]:t.value,r=Wy(e,n);if(a(r))return i(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(l){return i(`Unable to enter ${o}: ${l instanceof Error?l.message:String(l)}`)}let d=await cm(o);return a(d)?(process.chdir(s),i(d.message)):c(`Opened ${qc(o)}`,null)}});var $s,_a=y(()=>{"use strict";Ze();rn();Ut();C();k();$s=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=g(),s=wi(n,t);if(a(s))return i(s.message);let{appliedEvents:d,unappliedEvents:l}=s.value,u=Vt();if(a(u))return u;let m=_t(d),{fatal:p,skipped:f}=Cn(m);if(p.length>0)return Vt(),E(o),i(p.map(N=>N.message).join(", "));An(f);let I=g().nodes[e];return I?(_.navigate({contextNode:I,selectedIndex:r}),c("",{unappliedEvents:l})):(Vt(),E(o),i("Board did not exist at that date"))}});var Gy,qy,Vy,js,Hs,jn,gm,zy,fm,Ua=y(()=>{"use strict";dt();fo();Ut();ue();C();k();Gy=20,qy=16,Vy=150,js=null,Hs=null,jn=()=>{js!==null&&(clearInterval(js),js=null),Hs!==null&&(clearTimeout(Hs),Hs=null)},gm=()=>{jn(),E({mode:h.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},zy=e=>{let t=[],n=0;for(let o=0;o<e.length;o++){let s=o===0?0:Math.max(0,e[o]-e[o-1]);n+=Math.sqrt(s),t[o]=n}let r=n;return t.map((o,s)=>r>0?o/r:(s+1)/e.length)},fm=({events:e,startTime:t,durationMs:n})=>{jn();let r=e.length,o=vr(e.map(f=>yr(f))).map(f=>f??t),s=o[r-1]??Date.now(),d=zy(o),l=Math.max(1,Math.round(n*Gy/1e3)),u=Math.max(Math.round(n/l),qy),m=0,p=0;E({mode:h.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),js=setInterval(()=>{m++;let f=m/l,I=[],N,A;for(;p<r&&d[p]<=f;){let T=e[p],M=tn(T);if(a(M)){if(Dr(M)){p++;continue}gm();return}I.push(...xi(T)),N=T,A=o[p],p++}if(p>=r||m>=l){for(;p<r;p++){let M=tn(e[p]);if(a(M)&&!Dr(M))break}let T=g().replay;E({unappliedEvents:[],replay:T&&{...T,progress:1,appliedCount:r}}),jn(),Hs=setTimeout(gm,Vy);return}let w=g().replay;E({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:N?A??w?.currentTime??t:w?.currentTime??t,currentLabel:N?$a(N):w?.currentLabel??"",flashNodeIds:N?[...new Set(I)]:w?.flashNodeIds??[]}})},u)}});var hm,vm=y(()=>{"use strict";mt();dt();rn();Ut();ue();xt();C();Re();k();Xr();_a();Ua();hm=async()=>{let e=Xe(g().breadCrumb,"BOARD");if(a(e))return e;let t=await ut(process.cwd());if(a(t))return i("Unable to locate repo root");let n=Ce({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=de().commandMeta;if(jn(),r==="now"){let l=Kn(n.value);if(a(l))return i(l.message);let u=Vt();if(a(u))return u;let m=_t(l.value),{fatal:p,skipped:f}=Cn(m);return p.length>0?i(p.map(I=>I.message).join(", ")):(An(f),E({mode:h.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),c("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let l=Mi(n.value);if(a(l))return l;let u=r==="prev"?g().eventLog.at(-1):g().unappliedEvents.at(0),m=u===void 0?null:yr(u),p=(u===void 0?null:l.value.get(u.id)??null)??(m===null?null:ni(m));if(p===null)return i(r==="prev"?"No previous event to peek":"No next event to peek");s=r==="prev"?p:p+1}else{let l=Dn(r||o.trim());if(!l)return i("Invalid peek date");s=l.getTime()}let d=$s({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return a(d)?d:(E({mode:h.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:d.value.unappliedEvents,replay:null}),c("Peeking",!0))}});var ym,bm=y(()=>{"use strict";mt();xt();C();Re();k();Xr();_a();Ua();ym=async()=>{let e=Xe(g().breadCrumb,"BOARD");if(a(e))return e;let t=await ut(process.cwd());if(a(t))return i("Unable to locate repo root");let n=Ce({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=de().commandMeta,{dateInput:s,durationInput:d}=gs(r,o);if(jn(),g().syncStatus.status==="syncing")return i("Cannot replay while syncing, try again in a moment");let l=Dn(s);if(!l)return i("Invalid replay date");let u=d?ps(d):15e3;if(u===null)return i("Invalid replay duration (try e.g. 30s or 2m)");let m=l.getTime(),p=g(),f=$s({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(a(f))return f;let{unappliedEvents:I}=f.value;return I.length===0?(Vt(),E(p),c("Nothing to replay from that point",!0)):(fm({events:I,startTime:m,durationMs:u}),c("Replaying board history",!0))}});import Yy from"zod";var xm,Im=y(()=>{"use strict";On();ue();C();Re();Ue();k();xm=()=>{let e=de().commandMeta.inputString,t=Yy.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return i("Auto sync duration must be a number of at least 3000 ms");let n=it({autoSyncDebounceMs:t.data});return a(n)?n:(nt({autoSyncIntervalMs:t.data}),E({mode:h.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))}});var Em,Rm=y(()=>{"use strict";Kr();On();ue();C();Re();Ue();k();Em=()=>{let e=de().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return i("Invalid response");let t=Jc(e),n=it({autoSync:t});return a(n)?n:(nt({autoSync:t}),E({mode:h.DEFAULT}),c(`Auto sync set to "${e}"`,null))}});var Nm,Sm=y(()=>{"use strict";On();ue();C();Re();Ue();k();Nm=()=>{let e=de().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return i("Invalid response");let n=it({logLevel:e});return a(n)?n:(nt({logLevel:e}),E({mode:h.DEFAULT}),c(`Auto sync set to "${e}"`,null))}});import{spawn as Xy}from"node:child_process";var Jy,Cm,Am=y(()=>{"use strict";C();Jy=()=>{switch(process.platform){case"darwin":return{command:"pbcopy",args:[]};case"win32":return{command:"clip",args:[]};default:return process.env.WAYLAND_DISPLAY?{command:"wl-copy",args:[]}:{command:"xclip",args:["-selection","clipboard"]}}},Cm=async e=>new Promise(t=>{let{command:n,args:r}=Jy();try{let o=Xy(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(i(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?c("Copied to clipboard",null):i(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(i(`Clipboard tool not available (${n})`))}})});var ho,Tm,wm=y(()=>{"use strict";C();k();Am();en();Yr();cn();ho=async(e,t)=>{if(!e.trim())return i(`Nothing to copy: ${t} is empty`);let n=await Cm(e);return a(n)?n:c(`Copied ${t} to clipboard`,null)},Tm=async e=>{let{breadCrumb:t,selectedNode:n}=g(),r=Jr({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return i("Nothing selected to copy from");switch(e.modifier){case Ne.REF:return ho(K(o.id),"ref");case Ne.TITLE:return ho(o.title,"title");case Ne.DESCRIPTION:return r?ho(r.props?.description??"","description"):i("No issue in scope");case Ne.TAGS:{if(!r)return i("No issue in scope");let s=an(r).map(({name:d})=>d);return ho(s.join(", "),"tags")}case Ne.ASSIGNEES:{if(!r)return i("No issue in scope");let s=dn(r).map(({name:d})=>d);return ho(s.join(", "),"assignees")}default:return i("Yank one of: ref, title, description, tags, assignees")}}});var Mm,km=y(()=>{"use strict";_i();ue();C();Re();k();Mm=async()=>{V(""),E({mode:h.DEFAULT});let e=Ge();if(a(e))return i(e.message);if(e.value.syncStatus.status==="syncing")return i("Sync already in progress");E({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await ss();return a(t)?(E({syncStatus:{msg:t.message,status:"failed"}}),t):(E({mode:h.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)}});import{ulid as _e}from"ulid";var Qy,Lm,zt,Pm,Dm=y(()=>{"use strict";ge();ju();Ze();hr();On();Mn();gt();Aa();zn();ue();xt();he();C();ge();Rt();Re();Ue();k();Os();pe();wa();Pn();da();cn();ro();Ku();Zu();im();dm();pm();vm();bm();Im();ea();Rm();Sm();wm();km();Qy=e=>e.action==="add.issue.comment",Lm=()=>{let{eventLog:e=[],contributors:t}=g(),n=new Map,r=new Set;for(let o of e)o.userId&&(n.set(o.userId,o.userName??""),r.add(o.userId));for(let o of Object.values(t))n.set(o.id,o.name);return[...n.entries()].map(([o,s])=>({id:o,name:s,isExternal:!r.has(o)}))},zt=async()=>{let e=await Ct();return a(e)?e:c("Resolved persist root",e.value)},Pm=[{systemOnly:!0,intent:F.Move,description:"Internal move-state command",mode:h.COMMAND_LINE,action:sm},{intent:F.Delete,description:"Delete the currently selected node",mode:h.COMMAND_LINE,action:async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=ae(t.id)[n];if(!r)return i("Unable to resolve child to delete");let o=await zt();if(a(o))return o;if(r.context==="COMMENT"){let s=r.id,d=P(t)?t.id:t.parentNodeId;if(!d)return i("Unable to resolve comment issue");let l=g().nodes[d];if(!l||!P(l))return i("Unable to resolve comment issue");let u=l.log?.filter(Qy).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?i("You can only delete your own comments"):O([{id:_e(),action:"delete.issue.comment",payload:{id:s,issue:d},...e.value}],o.value):i("Unable to resolve comment")}return O([{id:_e(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:h.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=de().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(d=>Ee(v.FILTER).map(l=>l.split(n)[0]).includes(d))(r))return i("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return ie(d=>({...d,filters:e==="clear"?[]:[...d.filters,s],mode:h.DEFAULT})),c("Filter updated",null)}},{intent:F.ViewHelp,description:"Open the help screen",mode:h.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=g();return gn({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),E({mode:h.HELP}),c("Viewing help",null)}},{intent:F.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:h.COMMAND_LINE,action:async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=ae(t.id)[n];if(!r)return i("Unable to close issue, no target found");if(!P(r))return i("Cannot close in this context");let o=g().nodes[Ie];if(!o)return i("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return i("Issue is already closed");let s=await zt();if(a(s))return s;let d=s.value,l=on(o.id,r.id,{at:"end"},e.value,d);if(a(l))return l;let u=O([{id:_e(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...e.value}],d);return a(u)?u:c("Issue closed",null)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:h.COMMAND_LINE,action:async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=ae(t.id)[n];if(!r)return i("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):Hn(r.id,"TICKET");if(a(o))return i("Cannot reopen in this context");let s=o.value,d=g().nodes[Ie];if(!d)return i("Unable to locate closed swimlane");if(s.parentNodeId!==d.id)return i("Issue is not closed");if(!P(s))return i("Target node is not issue");let l=Fs(s);if(!l)return i("Unable to resolve previous parent from issue history");if(l===d.id)return i("Previous parent resolves to closed swimlane");let u=g().nodes[l];if(!u)return i("Previous parent no longer exists");let m=await zt();if(a(m))return m;let p=m.value,f=on(u.id,s.id,{at:"end"},e.value,p);if(a(f))return f;let I=O([{id:_e(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:f.value},...e.value}],p);return a(I)?I:c("Issue reopened",null)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Init,description:"Initialize Epiq in the current git repository",mode:h.COMMAND_LINE,action:Qu},{intent:F.OpenProject,description:"Open a recently used epiq project, by number or path",mode:h.COMMAND_LINE,action:mm,onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.NewItem,description:"Create a new board, swimlane, or issue",mode:h.COMMAND_LINE,action:am,onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Rename,description:"Rename the currently selected node",mode:h.COMMAND_LINE,action:async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=ae(t.id)[n];if(!r)return i("Missing node");if(r.readonly)return i("Cannot rename readonly node");let o=Ss();if(!o)return i("Provide a title");let s=await zt();return a(s)?s:O([{id:_e(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.UntagTicket,description:"Remove a tag from the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=de().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let o=x.findTagByName(r);if(!o)return i(`Tag "${r}" does not exist`);let{selectedNode:s}=g();if(!s)return i("Invalid untag target");let d=Hn(s.id,"TICKET");if(a(d))return i("Unable to untag issue in this context");let l=d.value;if(!P(l))return i("Target node is not issue");if(!(l.props.tags??[]).includes(o.id))return i("Issue is not tagged with that tag");let m=await zt();return a(m)?m:O([{id:_e(),action:"remove.issue.tag",payload:{id:l.id,tag:o.id},...e.value}],m.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.TagTicket,description:"Add or create a tag on the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=de().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let{selectedNode:o}=g();if(!o)return i("Invalid tag target");let s=Hn(o.id,"TICKET");if(a(s))return i("Unable to tag issue in this context");let d=s.value;if(!P(d))return i("Target node is not issue");let l=await zt();if(a(l))return l;let u=x.findTagByName(r),m=u?.id??_e();return(d.props.tags??[]).includes(m)?i("Already tagged with that tag"):O([...u?[]:[{id:_e(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:_e(),action:"add.issue.tag",payload:{id:d.id,tag:m},...e.value}],l.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.AssignUserToTicket,description:"Assign a user to the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=de().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return i("Provide an assignee");let{selectedIndex:d,contextNode:l}=g(),u=ae(l.id)[d];if(!u)return i("Invalid assign target");let m=Hn(u.id,"TICKET");if(a(m))return i("Unable to assign issue in this context");let p=m.value;if(!P(p))return i("Target node is not issue");let f=await zt();if(a(f))return f;let I=Lm(),N=!o&&s.toLowerCase()==="me",A,w;if(N)A=e.value.userId,w=I.find(U=>U.id===A)?.name??e.value.userName;else{let U=I.filter(be=>be.name===s);if(U.length>1)return i(`"${s}" matches ${U.length} contributors (${U.map(be=>be.id).join(", ")}). Assign from the GUI to choose by id.`);let ne=U[0];if(!ne&&!o)return i(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);A=ne?.id??_e(),w=ne?.name??s}if((p.props.assignees??[]).includes(A))return i("Assignee already assigned");let M=!!g().contributors[A];return O([...M?[]:[{id:_e(),action:"create.contributor",payload:{id:A,name:w},...e.value}],{id:_e(),action:"add.issue.assignee",payload:{id:p.id,assignee:A},...e.value}],f.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=ve();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=de().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee to remove");let{selectedNode:o}=g();if(!o)return i("Invalid unassign target");let s=Hn(o.id,"TICKET");if(a(s))return i("Unable to unassign in this context");let d=s.value;if(!P(d))return i("Target node is not issue");let l=d.props.assignees??[],u=r.toLowerCase()==="me",m=u?l.filter(I=>I===e.value.userId):Lm().filter(I=>I.name===r&&l.includes(I.id)).map(I=>I.id);if(m.length>1)return i(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return i(u?"Issue is not assigned to you":`Issue is not assigned to "${r}"`);let f=await zt();return a(f)?f:O([{id:_e(),action:"remove.issue.assignee",payload:{id:d.id,assignee:p},...e.value}],f.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Comment,description:"Add a comment to the selected issue",mode:h.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return i("Provide a comment");if(n.length>4e3)return i(`Cannot exceed ${4e3} characters`);let r=ve();if(a(r))return i("Unable to resolve user ID");let{breadCrumb:o,selectedNode:s}=g(),d=Xe([...o,s],"TICKET");if(a(d))return i("Edit target must be an issue");let l=d.value;if(!l)return i("Invalid comment target");let u=l.context==="TICKET"?c("Resolved ticket",l):Hn(l.id,"TICKET");if(a(u))return i("Unable to comment on issue in this context");let m=u.value;if(!P(m))return i("Target node is not issue");let p=await zt();return a(p)?p:O([{id:_e(),action:"add.issue.comment",payload:{id:_e(),issue:m.id,author:r.value.userId,md:n},...r.value}],p.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Sync,description:"Pull, commit, and push Epiq state",mode:h.COMMAND_LINE,action:Mm},{intent:F.Peek,description:"View board state at another point in time",mode:h.COMMAND_LINE,action:hm},{intent:F.Replay,description:"Replay board history forward from a point in time",mode:h.COMMAND_LINE,action:ym},{intent:F.Export,description:"Export the current board layout to markdown",mode:h.COMMAND_LINE,action:async()=>{let e=await $u();return a(e)?e:(E({mode:h.DEFAULT}),c("Export successful",!0))}},{intent:F.Exit,description:"Exit the application",mode:h.COMMAND_LINE,action:async()=>(_.exit(),c("Exit successful",!0))},{intent:F.Edit,description:"Edit title or description",mode:h.COMMAND_LINE,action:async(e,t)=>zu(t),onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:h.COMMAND_LINE,action:async(e,t)=>Tm(t),onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:h.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case fe.USERNAME:{if(process.env[yt])return i(`Cannot change the configured user while ${yt} names this process`);let r=ys();if(a(r))return r;let{userId:o,preferredEditor:s,userName:d}=r.value,l=n||d,u=o||_e();if(!l||!u)return i("Unable to resolve user name or id");let m=it({userName:l,userId:u,preferredEditor:s??""});return a(m)?m:(nt({userName:l,userId:u}),E({mode:h.DEFAULT}),c(`Username set to "${l}"`,null))}case fe.EDITOR:{if(!n)return i("No editor provided");let r=it({preferredEditor:n});return a(r)?r:(nt({preferredEditor:n}),E({mode:h.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case fe.VIEW:{if(n!=="wide"&&n!=="dense")return i("Invalid view mode");let r=it({viewMode:n});return a(r)?r:(nt({viewMode:n}),E({mode:h.DEFAULT}),c(`View set to "${n}"`,null))}case fe.AUTOSYNC:return Em();case fe.LOG_LEVEL:return Nm();case fe.SYNC_DEBOUNCE_MS:return xm();case fe.ATTACHMENT_MAX_KB:return fl();default:return i("Unknown config command")}}},{intent:F.Coffee,description:"Sponsor the development of Epiq!",mode:h.COMMAND_LINE,action:()=>{let e=de().commandMeta.modifier;return e==="custom"?po("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):po(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),V(""),c("Thanks you!",null)}}]});var Zy,Dt,ja=y(()=>{"use strict";is();Is();da();Dm();C();Re();Ue();k();Zy=new Set(["peek","replay","filter","view-help","yank"]),Dt=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=de();if(!t)return i("No command to confirm");if(!e&&n===ln.Invalid)return i("Invalid command");let s=ql(t);jl();let{readOnly:d}=g();if(d&&!Zy.has(s))return oo({status:Ft.Fail,message:"Command not available in readonly state",value:null});let l=Pm.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!l)return oo({status:Ft.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return oo({status:Ft.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?oo(u):(Hl({addToHistory:!e}),l.onSuccess?.(),xe().autoSync&&Hc(),u)}});var Ws,Gs,Fm,Om=y(()=>{"use strict";C();ue();k();In();ja();Oa();Re();Ws=[{intent:D.Exit,mode:h.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(E({mode:h.COMMAND_LINE}),V("move cancel"),Dt({isForceExecutedBySystem:!0}))},{intent:D.InitMove,mode:h.DEFAULT,description:"[m] move (init/confirm)",action:()=>(E({mode:h.COMMAND_LINE}),V("move start"),Dt({isForceExecutedBySystem:!0}))},{intent:D.ConfirmMove,mode:h.MOVE,action:()=>(E({mode:h.COMMAND_LINE}),V("move confirm"),Dt({isForceExecutedBySystem:!0}))}],Gs=[{intent:D.MovePreviousItem,mode:h.MOVE,action:()=>fn()?(E({mode:h.COMMAND_LINE}),V("move previous"),Dt({isForceExecutedBySystem:!0})):i("No pending move")},{intent:D.MoveNextItem,mode:h.MOVE,action:()=>fn()?(E({mode:h.COMMAND_LINE}),V("move next"),Dt({isForceExecutedBySystem:!0})):i("No pending move")}],Fm=[{intent:D.MoveToNextContainer,mode:h.MOVE,action:()=>fn()?(E({mode:h.COMMAND_LINE}),V("move to-next"),Dt({isForceExecutedBySystem:!0})):i("No pending move")},{intent:D.MoveToPreviousContainer,mode:h.MOVE,action:()=>fn()?(E({mode:h.COMMAND_LINE}),V("move to-previous"),Dt({isForceExecutedBySystem:!0})):i("No pending move")}]});var Bm,_m=y(()=>{"use strict";he();Om();Bm={[B.WORKSPACE]:[...Ws,...Gs],[B.BOARD]:[...Ws,...Gs],[B.SWIMLANE]:[...Ws,...Gs,...Fm],[B.TICKET]:[],[B.FIELD]:[],[B.FIELD_LIST]:[],[B.TEXT]:[],[B.COMMENT]:[]}});import eb from"node:fs";import tb from"node:path";var Um,$m=y(()=>{"use strict";mt();Zr();C();pe();wa();Um=e=>{let t=Qe(process.cwd());if(a(t))return i("Unable to resolve project root");let n=Ce({repoRoot:t.value});if(a(n))return i(n.message);let r=Qr(e.hash,e.ext),o=tb.join(Uo(n.value),r);return eb.existsSync(o)?(po(o),c(`Opened ${e.name}`,null)):i("Attachment file not found \u2014 run :sync to fetch it")}});var jm,Hm,Wm=y(()=>{"use strict";ue();C();Re();k();Os();In();Ze();jm=()=>{V("");let{pendingNavTarget:e}=ur();E({mode:h.DEFAULT}),e&&_.navigate(e),gn({pendingNavTarget:void 0})},Hm=[{intent:D.ExitCommandLine,mode:h.HELP,action:()=>(jm(),c("Exiting help",null))},{intent:D.Exit,mode:h.HELP,action:()=>(jm(),c("Closed help",null))},{intent:D.NavPreviousItem,mode:h.HELP,description:"[arrows/hjkl] navigate",action:()=>(_.navigateToPreviousItem(),c("Navigating to previous help item",null))},{intent:D.NavNextItem,mode:h.HELP,action:()=>(_.navigateToNextItem(),c("Navigating to next help item",null))},{intent:D.NavToPreviousContainer,mode:h.HELP,action:()=>(_.navigateToPreviousContainer(),c("Navigating to previous help container",null))},{intent:D.NavToNextContainer,mode:h.HELP,action:()=>(_.navigateToNextContainer(),c("Navigating to next help container",null))}]});var nb,Gm,qm,Vm=y(()=>{"use strict";ue();he();C();Re();k();Os();In();Ze();nb=e=>{E({mode:h.COMMAND_LINE});let{pendingNavTarget:t}=ur();t&&_.navigate(t),gn({pendingNavTarget:void 0}),V(`${e} `)},Gm=()=>{V("");let{pendingNavTarget:e}=ur();e&&_.navigate(e),gn({pendingNavTarget:void 0}),E({mode:h.DEFAULT})},qm=[{intent:D.InitCommandPalette,mode:h.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{V("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=g();return gn({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),E({mode:h.PALETTE}),c("Opening command palette",null)}},{intent:D.Confirm,mode:h.PALETTE,action:()=>{let{selectedNode:e}=g();if(!e||!id(e))return i("Command only applicable on text nodes");if(e.props.disabled)return i("Command is not available in this context");let t=e.title;return t?(nb(t),c("Selected command",t)):c("No command selected",null)}},{intent:D.ExitCommandLine,mode:h.PALETTE,action:()=>(Gm(),c("Exiting palette",null))},{intent:D.Exit,mode:h.PALETTE,action:()=>(Gm(),c("Closed command palette",null))},{intent:D.NavPreviousItem,mode:h.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(_.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:D.NavNextItem,mode:h.PALETTE,action:()=>(_.navigateToNextItem(),c("Navigating to next item",null))},{intent:D.NavToPreviousContainer,mode:h.PALETTE,action:()=>(_.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:D.NavToNextContainer,mode:h.PALETTE,action:()=>(_.navigateToNextContainer(),c("Navigating to next container",null))}]});var zm,Km=y(()=>{"use strict";Pn();cn();ue();C();Vn();ge();Rt();Re();k();$m();In();Wm();Vm();Ze();zm=[...Hm,...qm,{intent:D.AddItem,mode:h.DEFAULT,description:"[n] new...",action:()=>(E({mode:h.COMMAND_LINE}),V(`${v.NEW} `),c("Adding new item",null))},{intent:D.Delete,mode:h.DEFAULT,description:"[d] delete",action:()=>(E({mode:h.COMMAND_LINE}),V(`${v.DELETE} `),c("Deleting item",null))},{intent:D.InitCommandLine,mode:h.DEFAULT,description:"[:] focus command line",action:()=>(E({mode:h.COMMAND_LINE}),V(""),c("Entering command line mode",null))},{intent:D.Confirm,mode:h.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=g();if(!me(e?.id??"")?.length){let r=e?x.getAttachment(e.id):void 0;if(r)return Um(r);if(e?.title===se.DESCRIPTION)return E({mode:h.COMMAND_LINE}),V(`${v.EDIT} description `),c("Propose command",!0);if(e?.title===se.ASSIGNEES)return E({mode:h.COMMAND_LINE}),V(`${v.ASSIGN} `),c("Propose command",!0);if(e?.title===se.TAGS)return E({mode:h.COMMAND_LINE}),V(`${v.TAG} `),c("Propose command",!0);if(t.title===se.DESCRIPTION&&e?.context==="TEXT")return E({mode:h.COMMAND_LINE}),V(`${v.EDIT} description `),c("Propose command",!0)}return _.enterChildNode(),c("Entering context",null)}},{intent:D.Yank,mode:h.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=g(),t=e?.title===se.DESCRIPTION?Ne.DESCRIPTION:e?.title===se.TAGS?Ne.TAGS:e?.title===se.ASSIGNEES?Ne.ASSIGNEES:Ne.REF,r=Ee(v.YANK).includes(t)?t:Ne.REF;return E({mode:h.COMMAND_LINE}),V(`${v.YANK} ${r}`),c("Propose command",!0)}},{intent:D.EditTitle,mode:h.DEFAULT,description:"[r] rename title",action:()=>(E({mode:h.COMMAND_LINE}),V(`${v.EDIT} title ${g().selectedNode?.title}`),c("Exiting context",null))},{intent:D.EditDescription,mode:h.DEFAULT,description:"[e] edit description",action:()=>(E({mode:h.COMMAND_LINE}),V(`${v.EDIT} description `),c("Exiting context",null))},{intent:D.Exit,mode:h.DEFAULT,description:"[q] exit context",action:()=>(_.enterParentNode(),c("Exiting context",null))},{intent:D.NavPreviousItem,mode:h.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(_.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:D.NavNextItem,mode:h.DEFAULT,action:()=>(_.navigateToNextItem(),c("Navigating to next item",null))},{intent:D.NavToPreviousContainer,mode:h.DEFAULT,action:()=>(_.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:D.NavToNextContainer,mode:h.DEFAULT,action:()=>(_.navigateToNextContainer(),c("Navigating to next container",null))}]});var rb,ob,Ym,Xm=y(()=>{"use strict";Re();rb=500,ob=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Ym=e=>{let t=ob(e);t&&Ns(n=>(n+t).slice(0,rb))}});var sb,ib,Jm,Qm=y(()=>{"use strict";Xm();ue();C();Re();k();In();ja();sb=[h.COMMAND_LINE,h.PALETTE],ib=e=>[{intent:D.MoveCursorLeft,mode:e,action:()=>(ia(-1),c("Moving cursor left",null))},{intent:D.MoveCursorRight,mode:e,action:()=>(ia(1),c("Moving cursor right",null))},{intent:D.MoveCursorLeftOfWord,mode:e,action:()=>(aa("left"),c("Moving cursor left of word",null))},{intent:D.MoveCursorRightOfWord,mode:e,action:()=>(aa("right"),c("Moving cursor right of word",null))},{intent:D.AutoCompleteCommand,mode:e,action:()=>(Ns((t,{remainder:n})=>{let r=n?t+n:t,o="";return r==="edit title "&&(o=g().selectedNode?.title??""),r+o}),c("Auto-completing command",null))},{intent:D.CaptureInput,mode:e,action:(t,{sequence:n})=>(Ym(n??""),c("Capturing input",null))},{intent:D.EraseInput,mode:e,action:()=>(Ul(),c("Erasing input",null))},{intent:D.EraseInputWord,mode:e,action:()=>($l(),c("Erasing input word",null))}],Jm=[{intent:D.Confirm,mode:h.COMMAND_LINE,action:()=>(Dt(),c("Executing command",null))},{intent:D.ViewHelp,mode:h.DEFAULT,action:()=>(E({mode:h.HELP}),c("Viewing help",null))},...sb.flatMap(ib),{intent:D.ExitCommandLine,mode:h.COMMAND_LINE,action:()=>(E({mode:h.DEFAULT}),c("Exiting command line",null))},{intent:D.GetLastCommandFromHistory,mode:h.COMMAND_LINE,action:()=>(Wl(),c("Getting last command from history",null))},{intent:D.GetNextCommandFromHistory,mode:h.COMMAND_LINE,action:()=>(Gl(),c("Getting next command from history",null))}]});import tp from"chalk";var qs,Zm,ep,Ha,np=y(()=>{"use strict";ue();he();Fe();qs=tp.dim.hex(S.secondary2)(": for command line"),Zm="q to exit",ep=`${tp.hex(S.accent)("m")} to confirm`,Ha={[B.WORKSPACE]:[qs],[B.BOARD]:[qs],[B.BOARD+h.COMMAND_LINE]:[qs],[B.SWIMLANE]:[qs],[B.TICKET+h.HELP]:[Zm],[B.SWIMLANE+h.HELP]:[Zm],[B.TICKET]:[],[B.FIELD]:[],[B.SWIMLANE+h.MOVE]:[ep],[B.TICKET+h.MOVE]:[ep]}});var mr,Wa,rp=y(()=>{"use strict";en();mr=e=>e.trim().toLocaleLowerCase(),Wa=(e,t)=>mr(e).includes(mr(t))});var ab,db,op,sp=y(()=>{"use strict";k();en();rp();ab=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},db=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},op=(e,t)=>{let n=mr(t.value);if(!n)return!0;switch(t.target){case"title":return Wa(e.title??"",n);case"description":return Wa(e.props.description??"",n);case"tag":return ab(e).map(mr).some(o=>o.includes(n));case"assignee":return db(e).map(mr).some(o=>o.includes(n));case"ref":return Lr(e.id,t.value);default:return!0}}});function ip(e,t,n){let r=t[e];if(!r)return i("buildBreadCrumb(): current node not found");let o=[],s=new Set,d=r;for(;d&&!s.has(d.id)&&(o.push(d),s.add(d.id),!(d.id===n||!d.parentNodeId));)d=t[d.parentNodeId];let l=o[o.length-1];return!l||l.id!==n?i("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var ap=y(()=>{"use strict";C()});var dp,cp=y(()=>{"use strict";dp=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t}});import{useSyncExternalStore as cb}from"react";function za(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return i("derive(): contextNodeId is missing");if(!r)return i("derive(): rootNode is missing");if(!o[r])return i("derive(): unable to find root node");let l=o[t];if(!l)return i("Unable to derive state, contextNode not found");let u=ip(t,o,r);if(a(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,f=Ha[p+n]??Ha[p]??[],I=[...zm,...Bm[p]??[],...Jm],N=dp(I),A=ub(o,s),w=A[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:f,availableActions:I,actionIndex:N,selectedNode:w,renderedChildrenIndex:A})}function Fr(e){Ga=e;let t=Qe(process.cwd()),n=!1;if(!a(t)){let s=Ot(t.value);if(a(s))return i(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:h.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],replay:null,timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{},attachments:{}},o=za(r);return a(o)?o:(Kt=o.value,Va(),c("State initialized",null))}function ie(e){let t=g(),n=e(t);if(vo)return Vs=n,Kt={...t,...n},c("State updated",null);let r=za(n);return a(r)?i(r.message??"Unable to update state"):(Kt=r.value,Va(),c("State updated",null))}function qd(e){if(vo)return c("Joined batch",e());vo=!0,Vs=null;let t=()=>{let n=Vs;if(vo=!1,Vs=null,n===null)return null;let r=za(n);return a(r)?i(r.message??"Unable to update state"):(Kt=r.value,Va(),c("State updated",null))};try{let n=e(),r=t();return r&&a(r)?i(r.message):c("State updated",n)}finally{vo&&t()}}var Kt,Ga,qa,Va,lb,g,Ge,vo,Vs,E,Ke,ub,ae,Vt,At,k=y(()=>{"use strict";_m();Km();Qm();np();Bt();ue();he();C();pe();sp();ap();cp();qa=new Set,Va=()=>{for(let e of qa)e()},lb=e=>(qa.add(e),()=>qa.delete(e));g=()=>{if(!Kt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Kt},Ge=()=>Kt?c("Retrieved state",Kt):i("State not initialized. Call initWorkspaceState() first.");vo=!1,Vs=null;E=e=>ie(t=>({...t,...e})),Ke=()=>cb(lb,g,g),ub=(e,t)=>{let n={};for(let r of Object.values(e))P(r)&&t.length>0&&!t.every(o=>op(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,s)=>{let d=e[o.id],l=e[s.id];return!d||!l?0:d.rank.localeCompare(l.rank)});return n},ae=e=>g()?.renderedChildrenIndex[e]??[],Vt=()=>Ga?Fr(Ga):i("Cannot reset state: no initial workspace found"),At=()=>Kt!==void 0});var Hn,mb,hn,x,ge=y(()=>{"use strict";xt();he();C();k();Rt();Hn=(e,t)=>{let{nodes:n}=g(),r=n[e];if(!r)return i("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=new Set([r.id]),s=r.parentNodeId?n[r.parentNodeId]:void 0;for(;s&&!o.has(s.id);){if(s.context===t)return c("Resolved ancestor node",s);o.add(s.id),s=s.parentNodeId?n[s.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},mb=(e,t)=>{let{nodes:n}=g(),r=new Set,o=n[e];for(;o?.parentNodeId&&!r.has(o.id);){if(o.parentNodeId===t)return!0;r.add(o.id),o=n[o.parentNodeId]}return!1},hn=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:i("Node not found"),x={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.userId&&n.userId!==t)return i("Contributor is already linked to another user");let r={...n,userId:t},o=ie(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?i("Unable to link contributor to user"):c("Linked contributor to user",r)},deleteNode(e){ie(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create comment, missing issue");if(!P(t))return i("Can only comment on issues");let n=ie(r=>({...r,comments:{...r.comments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?i("Unable to create comment"):c("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return i("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return i("Unable to edit comment, missing issue");if(!P(r))return i("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=ie(d=>({...d,comments:{...d.comments??{},[e]:o}}));return a(s)?i("Unable to edit comment"):c("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return i("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=ie(o=>({...o,comments:{...o.comments??{},[e]:n}}));return a(r)?i("Unable to delete comment"):c("Deleted comment",n)},getComment(e){return g().comments?.[e]},getCommentsByIssue(e){return Object.values(g().comments??{}).filter(t=>t.issue===e&&!t.deleted)},createAttachment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create attachment, missing issue");if(!P(t))return i("Can only attach to issues");let n=ie(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?i("Unable to create attachment"):c("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return i("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=ie(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return a(r)?i("Unable to delete attachment"):c("Deleted attachment",n)},getAttachment(e){return g().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(g().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},editValue(e,t){let{nodes:n}=g(),r=n[e];if(!r)return i("Edit target node not found");let o=hn(r,"edit");if(o)return o;let s={...r,props:{...r.props,description:t}};return this.updateNode(s),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return i("Rename target node not found");let r=hn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=g();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=g();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return me(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=g(),o=this.getNode(e),s=this.getNode(t);if(!o)return i("Node not found");if(!s)return i("Target parent not found");if(r===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let d=hn(o,"move");if(d)return d;if(mb(t,e))return i("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}=g(),o=this.getNode(e);if(!o)return i("Node not found");if(r===e)return i("Cannot delete root node");let s=hn(o,"delete");if(s)return s;let d=new Set,l=m=>{let p=t[m];if(!(!p||d.has(m))){d.add(m);for(let f of me(p.id))l(f.id)}};l(e);let u={...structuredClone(t)};for(let m of d){if(!u[m])return i("Unable to locate node to delete");u[m]={...u[m],isDeleted:!0}}return n?(E({nodes:u}),c("Successfully tomb stoned",o)):i("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return i("Contributor not found");let n={...t,name:So,tombstoned:!0},r=ie(o=>({...o,contributors:{...o.contributors,[e]:n}}));return a(r)?i("Unable to remove contributor"):c("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.tombstoned)return i("Cannot rename a removed contributor");let r={...n,name:t},o=ie(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?i("Unable to rename contributor"):c("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");let r={...n,name:t,tombstoned:!1},o=ie(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?i("Unable to restore contributor"):c("Restored contributor",r)},createContributor(e){let t=ie(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?i("Unable to create contributor"):c("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return i("Unable to assign contributor, missing contributor");if(!r)return i("Unable to assign contributor, missing target");let o=hn(r,"edit");if(o)return o;if(!P(r))return i("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return i("Contributor already assigned");let d={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(d),c("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!r)return i("Unable to unassign, missing target");let o=hn(r,"edit");if(o)return o;if(!P(r))return i("Target is not an issue");let s=r.props.assignees??[];if(!s.includes(t))return c("Issue is not assigned to that contributor",{assignee:t});let d={...r,props:{...r.props,assignees:s.filter(l=>l!==t)}};return this.updateNode(d),c("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return i("Unable to add tag, missing tag");if(!r)return i("Unable to add tag, missing target");let o=hn(r,"edit");if(o)return o;if(!P(r))return i("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return i("Tag already assigned");let d={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(d),c("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),r=this.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!r)return i("Unable to remove tag, missing target");let o=hn(r,"edit");if(o)return o;if(!P(r))return i("Target is not an issue");let s=r.props.tags??[];if(!s.includes(t))return c("Issue is not tagged with that tag",{tag:t});let d={...r,props:{...r.props,tags:s.filter(l=>l!==t)}};return this.updateNode(d),c("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return i("Tag not found");let n={...t,tombstoned:!0},r=ie(o=>({...o,tags:{...o.tags,[e]:n}}));return a(r)?i("Unable to delete tag"):c("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return i("Tag not found");let r={...n,name:t,tombstoned:!1},o=ie(s=>({...s,tags:{...s.tags,[e]:r}}));return a(o)?i("Unable to restore tag"):c("Restored tag",r)},createTag(e){let t=ie(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?i("Could not create tag"):c("Tag created",e)},createNode(e){let t=ie(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?i("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},r=ie(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?i(r.message):c("Locked node",n)},updateNode(e){let t=ie(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:c("Updated node",e)},getContributor(e){return g().contributors[e]},getTag(e){let t=g().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return g().tags[e]},getTags(){return Object.values(g().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return g().nodes[e]},getSiblings(e){return me(e)}}});import vn from"chalk";import lp from"string-width";var pb,gb,Ka,fb,hb,up,mp,vb,yb,bb,xb,Ib,$a,pp,fo=y(()=>{"use strict";dt();ge();k();kt();Ls();pb=(e,t)=>e+" ".repeat(Math.max(0,t-lp(e))),gb=(e,t)=>" ".repeat(Math.max(0,t-lp(e)))+e,Ka=e=>({"add.issue":"Created with title","add.issue.assignee":"Assigned to","remove.issue.assignee":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","add.issue.tag":"Tagged with","remove.issue.tag":"Removed tag","lock.node":"Locked node","move.node":"Moved issue","add.issue.comment":"Commented","delete.issue.comment":"Deleted comment","add.issue.attachment":"Attached","delete.issue.attachment":"Removed attachment","edit.issue.comment":"Edited comment","init.workspace":"Created workspace","add.workspace":"Created workspace","add.board":"Created board","add.swimlane":"Created swimlane","add.field":"Added field","create.tag":"Created tag","tombstone.tag":"Deleted tag","restore.tag":"Restored tag","create.contributor":"Added contributor","rename.contributor":"Renamed contributor","link.contributor.user":"Linked contributor","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),fb=(e,t)=>t?e<t?"up":e>t?"down":null:null,hb=(e,t)=>{let n=x.getNode(e.payload.parent),r=n?vn.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=fb(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},up=e=>`${Math.max(1,Math.round(e/1024))} KB`,mp=e=>x.getAttachment(e)?.name??"",vb=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?vn.bgHex(Oe(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?vn.bgHex(Oe(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=g().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?vn.hex(Oe(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?vn.hex(Oe(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;case"add.issue.attachment":return`"${e.payload.name}" ${vn.dim(`(${up(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=mp(e.payload.id);return t?`"${t}"`:""}default:return""}},yb=e=>{let t=cr(bt(e));return vn.gray(gb(t,8))},bb=12,xb=e=>pb(`${e}`,bb),Ib=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=g().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"edit.title":return"name"in e.payload?`"${e.payload.name}"`:"";case"move.node":{let t=x.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${up(e.payload.bytes)})`;case"delete.issue.attachment":{let t=mp(e.payload.id);return t?`"${t}"`:""}default:return""}},$a=e=>[Ka(e.action),Ib(e)].filter(Boolean).join(" "),pp=(e,t)=>{let n=yb(e.id),r=xb(e.userName),o=vn.dim("\u203A"),s=e.action==="move.node"?hb(e,t):[Ka(e.action),vb(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`}});var fp={};Eo(fp,{areVirtualNodesEnabled:()=>Wo,createOrUpdateVirtualField:()=>yo,createOrUpdateVirtualFieldList:()=>Ya,materializeTicketVirtualNodes:()=>Ho,materializeVirtualNodes:()=>Mb,setVirtualNodesEnabled:()=>wb});var Eb,Rb,Nb,Sb,Cb,Ab,yo,Ya,Ho,Tb,gp,wb,Wo,Mb,Ii=y(()=>{"use strict";fo();he();C();Vn();ge();Sn();k();Gn();er();Eb=e=>Te(e,"comments"),Rb=e=>Te(e,"description"),Nb=e=>Te(e,"assignees"),Sb=e=>Te(e,"tags"),Cb=e=>Te(e,"history"),Ab=e=>Te(e,"attachments"),yo=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:d="horizontal"})=>{let l=x.getNode(e);if(!l){let p=x.createNode({...Ae.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:d});return a(p)?p:c("Virtual field created",void 0)}if(!Je(l))return i(`Existing virtual node ${e} is not a field`);if(!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==s||l.childRenderAxis!==d))return c("Virtual field unchanged",void 0);let m=x.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:s,childRenderAxis:d});return a(m)?m:c("Virtual field updated",void 0)},Ya=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let d=x.getNode(e);if(!d){let m=x.createNode({...Ae.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return a(m)?m:c("Virtual field list created",void 0)}if(!br(d))return i(`Existing virtual node ${e} is not a field list`);if(!(d.title!==t||d.parentNodeId!==n||d.rank!==r||d.readonly!==o||d.childRenderAxis!==s))return c("Virtual field list unchanged",void 0);let u=x.updateNode({...d,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return a(u)?u:c("Virtual field list updated",void 0)},Ho=e=>{let t=rt(Et/4n),n=rt(Et/2n),r=rt(Et*3n/4n),o=rt(Et*7n/8n),s=rt(Et*15n/16n),d=rt(Et*13n/16n);if(a(t))return t;if(a(n))return n;if(a(r))return r;if(a(o))return o;if(a(s))return s;if(a(d))return d;let l=yo({id:Rb(e.id),name:se.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(a(l))return l;let u=Ya({id:Nb(e.id),name:se.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(a(u))return u;let m=Ya({id:Sb(e.id),name:se.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(a(m))return m;let p=yo({id:Eb(e.id),name:se.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(a(p))return p;let f=yo({id:Ab(e.id),name:se.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(a(f))return f;let I=yo({id:Cb(e.id),name:se.HISTORY,parentNodeId:e.id,rank:d.value,value:Tb(e),readonly:!0,childRenderAxis:"vertical"});return a(I)?I:c("Ticket virtual nodes materialized",void 0)},Tb=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=>pp(r,n.get(r.action)??[])).join(`
73
- `)},gp=!0,wb=e=>{gp=e},Wo=()=>gp,Mb=()=>{let{nodes:e}=g();for(let t of Object.values(e)){if(!P(t))continue;let n=Ho(t);if(a(n))return n}return c("Virtual nodes materialized",void 0)}});var hp=y(()=>{"use strict"});var kb,vp,yp,bp,xp,zs=y(()=>{"use strict";mt();lt();en();Ma();dt();fo();kt();rn();Ut();hp();C();Bt();vs();pe();k();kb=null,vp=Promise.resolve(),yp=e=>{let t=vp.then(e,e);return vp=t.then(()=>{},()=>{}),t},bp=()=>{if(!At())return{mode:"live",asOfTime:null};let{timeMode:e}=g();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:kb}},xp=(e,t)=>{let n=new Map,r=new Set,o=d=>{let l=new Set,u=d;for(;u&&!l.has(u);){if(r.has(u))return u;l.add(u),u=n.get(u)}return null},s=[];for(let d of e){let l=d.payload,u=l?.id;if(!u)continue;d.action==="add.board"&&r.add(u);let m=l.parent??l.issue;m&&n.set(u,m),(u===t||o(u)===t)&&s.push(d)}return s}});import Lb from"node:fs";import Pb from"node:path";import{ulid as G}from"ulid";var Db,Fb,Xs,te,le,oe,Ip,Ob,Ep,Rp,Np,Sp,Cp,Ap,Tp,wp,Mp,kp,Lp,Pp,Dp,Fp,Op,Bp,_p,Up,$p,jp,Hp,Wp,Gp,qp,Vp,Bb,zp,Kp,Yp,Xp,Jp,Qp,Zp,eg=y(()=>{"use strict";mt();lt();Sr();Wr();Bi();On();Ba();dt();_r();rn();Mn();gt();zs();Aa();zn();he();C();ge();Rt();k();es();zr();pe();xt();fo();kt();ro();en();Xt();Zr();Nt();zs();Db=e=>{if(e.filePath)try{return c("Read attachment file",{data:Lb.readFileSync(e.filePath),name:e.name??Pb.basename(e.filePath)})}catch(t){return i(`Unable to read ${e.filePath}: ${t instanceof Error?t.message:String(t)}`)}return e.dataBase64?c("Decoded attachment data",{data:Buffer.from(e.dataBase64,"base64"),name:e.name??"image"}):i("Provide either filePath or dataBase64")},Fb=()=>{let e=Ji();return a(e)?Wt:e.value.attachmentMaxKb??Wt},Xs=e=>{let t=Qe(e??process.cwd());return a(t)?i(t.message):c("Resolved Epiq repo root",t.value)},te=async(e,t)=>{let n=Xs(e);if(a(n))return n;let r=Ce({repoRoot:n.value});if(a(r))return i(r.message);let o=Jt(n.value);if(a(o))return i(o.message);let s=await Di({repoRoot:n.value,stateBranchName:o.value});if(a(s))return i(s.message);let d=await Ln({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(a(d))return i(d.message);if(t?.pull??!1){let m=await H({cwd:r.value,args:["pull","--ff-only"]});a(m)&&X.info(3,m.message)}let l=$t(r.value);if(a(l))return i(l.message);let u=sn(l.value.events,l.value.unreadable);return a(u)?i(u.message):c("Booted Epiq state",{repoRoot:n.value,stateBranchRoot:r.value})},le=()=>{let e=Ji();return a(e)?i(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},oe=()=>{let e=Ge();return a(e)?i(e.message):e},Ip=e=>(e.props.tags??[]).map(t=>x.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:Oe(t.name)})),Ob=()=>{let e=Ge(),t=a(e)?[]:e.value.eventLog??[],n=new Map;for(let r of t)r.userId&&r.userName&&n.set(r.userId,r.userName);return n},Ep=(e,t)=>{let n=new Map(e);for(let r of Object.values(t))n.set(r.id,r.name);return n},Rp=e=>(e.props.assignees??[]).map(t=>x.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:Oe(n)})),Np=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=oe();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="BOARD"&&!o.isDeleted).map(o=>({id:o.id,ref:K(o.id),title:o.title,parentId:o.parentNodeId,readonly:!!o.readonly}));return c("Listed boards",r)},Sp=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=oe();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="SWIMLANE"&&!o.isDeleted).filter(o=>!e.boardId||o.parentNodeId===e.boardId).map(o=>({id:o.id,title:o.title,boardId:o.parentNodeId,isClosed:o.id===Ie,readonly:!!o.readonly}));return c("Listed swimlanes",r)},Cp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=oe();if(a(n))return n;let r=e.idOrRef.trim();if(!r)return i("Provide an issue id or ref");let o=Object.values(n.value.nodes).filter(P).filter(u=>!u.isDeleted),s=o.find(u=>u.id===r),d=s?[s]:o.filter(u=>Lr(u.id,r));if(d.length===0)return i(`No issue matches "${r}"`);if(d.length>1)return i(`"${r}" matches ${d.length} issues: ${d.map(u=>`${K(u.id)} (${Le(u.title)})`).join(", ")}. Use a full ref or id.`);let l=d[0];return c("Found issue",{id:l.id,ref:K(l.id),title:Le(l.title),description:l.props.description??"",createdAt:bt(l.id),parentNodeId:l.parentNodeId,isClosed:l.parentNodeId===Ie,readonly:!!l.readonly,tags:Ip(l),assignees:Rp(l)})},Ap=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=oe();if(a(n))return n;let r=n.value.nodes,o=Object.values(r).filter(P).filter(s=>!s.isDeleted).filter(s=>e.includeClosed||s.parentNodeId!==Ie).filter(s=>e.boardId?(s.parentNodeId?r[s.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(s=>({id:s.id,ref:K(s.id),title:Le(s.title),description:s.props.description??"",createdAt:bt(s.id),parentNodeId:s.parentNodeId,isClosed:s.parentNodeId===Ie,readonly:!!s.readonly,tags:Ip(s),assignees:Rp(s)}));return c("Listed issues",o)},Tp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=Le(e.title);if(!o)return i("Issue title cannot be empty");let s=e.description??"",d=ft("Issue title",o,300)??ft("Issue description",s,2e4);if(d)return i(d);if((e.tagNames?.length??0)>20)return i(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return i(`Cannot set more than ${20} assignees at once`);let l=kn(e.parentId,n.value,t.value.stateBranchRoot);if(a(l))return l;let u=_s({name:o,parent:e.parentId,user:n.value,rank:l.value});if(a(u))return u;let m=[...u.value],p=m.find(A=>A.action==="add.issue")?.payload.id;if(!p)return i("Unable to determine created issue id");s&&m.push({id:G(),...n.value,action:"edit.description",payload:{id:p,md:s}});let f=[];for(let A of e.tagNames??[]){let w=Le(A).trim();if(!w||f.some(ne=>ne.name===w))continue;let T=ft("Tag name",w,60);if(T)return i(T);let M=x.findTagByName(w),U=M?.id??G();M||m.push({id:G(),...n.value,action:"create.tag",payload:{id:U,name:w}}),m.push({id:G(),...n.value,action:"add.issue.tag",payload:{id:p,tag:U}}),f.push({id:U,name:w})}let I=[];for(let A of e.assigneeNames??[]){let w=Le(A).trim();if(!w||I.some(ne=>ne.name===w))continue;let T=ft("Assignee name",w,80);if(T)return i(T);let M=Object.values(r.value.contributors).find(ne=>ne.name===w),U=M?.id??G();M||m.push({id:G(),...n.value,action:"create.contributor",payload:{id:U,name:w}}),m.push({id:G(),...n.value,action:"add.issue.assignee",payload:{id:p,assignee:U}}),I.push({id:U,name:w})}let N=O(m,t.value.stateBranchRoot);return a(N)?i(N.message):c("Created issue",{id:p,ref:K(p),title:o,parentId:e.parentId,description:s,tags:f,assignees:I})},wp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=on(Ie,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:G(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:Ie,rank:r.value}},s=O([o],t.value.stateBranchRoot);return a(s)?i(s.message):c("Closed issue",{id:e.issueId,ref:K(e.issueId)})},Mp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Target node is not issue");if(o.parentNodeId!==Ie)return i("Issue is not closed");let s=Fs(o);if(!s)return i("Unable to resolve previous parent from issue history");if(s===Ie)return i("Previous parent resolves to closed swimlane");let d=r.value.nodes[s];if(!d)return i("Previous parent no longer exists");let l=on(d.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(a(l))return l;let u={id:G(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:d.id,rank:l.value}},m=O([u],t.value.stateBranchRoot);return a(m)?i(m.message):c("Reopened issue",{id:o.id,ref:K(o.id),parentId:d.id})},kp=async e=>{let t=Xs(e.repoRoot);if(a(t))return t;let n=le();if(a(n))return n;let r=Ce({repoRoot:t.value});if(a(r))return r;let o=$t(r.value);if(a(o))return o;let s=sn(o.value.events,o.value.unreadable);if(a(s))return s;let d=on(e.parentId,e.issueId,e.position??{at:"end"},n.value,r.value);if(a(d))return d;let l={id:G(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:d.value}},u=O([l],r.value);return a(u)?i(u.message):c("Moved issue",{id:e.issueId,ref:K(e.issueId),parentId:e.parentId})},Lp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.boardId];if(!o)return i("Board not found");if(!Co(o))return i("Target parent must be a board");if(o.readonly)return i("Cannot add a swimlane to a readonly board");if(bp().mode!=="live")return i("Cannot add a swimlane while time travelling");let s=Le(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let d=ft("Swimlane title",s,300);if(d)return i(d);let l=kn(e.boardId,n.value,t.value.stateBranchRoot);if(a(l))return l;let u=G(),m={id:G(),...n.value,action:"add.swimlane",payload:{id:u,name:s,parent:e.boardId,rank:l.value}},p=O([m],t.value.stateBranchRoot);return a(p)?i(p.message):c("Created swimlane",{id:u,ref:K(u),title:s,boardId:e.boardId})},Pp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!xn(o))return i("Edit target must be a swimlane");if(o.readonly)return i("Cannot edit readonly swimlane");let s=Le(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let d=ft("Swimlane title",s,300);if(d)return i(d);if(o.title===s)return c("No changes made",{id:e.swimlaneId,ref:K(e.swimlaneId),title:s});let l={id:G(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},u=O([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Edited swimlane title",{id:e.swimlaneId,ref:K(e.swimlaneId),title:s})},Dp=async e=>{let t=Xs(e.repoRoot);if(a(t))return t;let n=le();if(a(n))return n;let r=Ce({repoRoot:t.value});if(a(r))return r;let o=$t(r.value);if(a(o))return o;let s=sn(o.value.events,o.value.unreadable);if(a(s))return s;let d=on(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(a(d))return d;let l={id:G(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:d.value}},u=O([l],r.value);return a(u)?i(u.message):c("Moved swimlane",{id:e.swimlaneId,ref:K(e.swimlaneId),boardId:e.boardId})},Fp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!xn(o))return i("Delete target must be a swimlane");let s={id:G(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},d=O([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Deleted swimlane",{id:e.swimlaneId,ref:K(e.swimlaneId)})},Op=async(e={})=>{Qo();let t=Xs(e.repoRoot);if(a(t))return i("Sync failed");let n=le();if(a(n))return n;let r=await os({cwd:t.value,ownEventFileName:wn(n.value)});return a(r)?(ki(r.message),r):(Zo(),c("Synced",r.value))},Bp=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=oe();return a(n)?n:c("Retrieved Epiq state",{root:t.value.repoRoot,stateBranchRoot:t.value.stateBranchRoot,nodes:n.value.nodes,rootNodeId:n.value.rootNodeId,contextNode:n.value.contextNode,selectedIndex:n.value.selectedIndex,eventLog:n.value.eventLog})},_p=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=ft("Issue description",e.description,2e4);if(s)return i(s);let d=o.props.description??"";if(d===e.description)return c("No changes made",{id:e.issueId,ref:K(e.issueId),description:d});let l={id:G(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},u=O([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Edited issue description",{id:e.issueId,ref:K(e.issueId),description:e.description})},Up=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=Le(e.title);if(!s.trim())return i("Issue title cannot be empty");let d=ft("Issue title",s,300);if(d)return i(d);if(o.title===s)return c("No changes made",{id:e.issueId,ref:K(e.issueId),title:s});let l={id:G(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},u=O([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Edited issue title",{id:e.issueId,ref:K(e.issueId),title:s})},$p=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Tag target must be an issue");if(o.readonly)return i("Cannot tag readonly issue");let s=Le(e.tagName).trim();if(!s)return i("Tag name cannot be empty");let d=ft("Tag name",s,60);if(d)return i(d);let l=x.findTagByName(s),u=l?.id??G(),m=[...l?[]:[{id:G(),...n.value,action:"create.tag",payload:{id:u,name:s}}],{id:G(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:u}}],p=O(m,t.value.stateBranchRoot);return a(p)?i(p.message):c("Added issue tag",{id:e.issueId,ref:K(e.issueId),tag:{id:u,name:s}})},jp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.tags[e.tagId];if(!o)return i("Tag not found");if(o.tombstoned)return i("Tag is already deleted");let s=[{id:G(),...n.value,action:"tombstone.tag",payload:{id:e.tagId}}],d=O(s,t.value.stateBranchRoot);return a(d)?i(d.message):c("Deleted tag",{id:o.id,name:o.name})},Hp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.tags[e.tagId];if(!o)return i("Tag not found");if(!o.tombstoned)return i("Tag is not deleted");if(x.findTagByName(o.name))return i(`Cannot restore: another tag is already named "${o.name}"`);let s=[{id:G(),...n.value,action:"restore.tag",payload:{id:e.tagId,name:o.name}}],d=O(s,t.value.stateBranchRoot);return a(d)?i(d.message):c("Restored tag",{id:o.id,name:o.name})},Wp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Untag target must be an issue");if(o.readonly)return i("Cannot untag readonly issue");if(!r.value.tags[e.tagId])return i("Tag not found");let s={id:G(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},d=O([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Removed issue tag",{id:e.issueId,ref:K(e.issueId),tagId:e.tagId})},Gp=async(e,t)=>{let n=Ti(e);if(a(n))return;let r;for(let o of n.value)o.userId===t&&(r=o.userName??r);return r===void 0?void 0:{id:t,name:r}},qp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Assign target must be an issue");if(o.readonly)return i("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let T=r.value.contributors[s],M=T?void 0:await Gp(t.value.stateBranchRoot,s);if(!T&&!M)return i("Unknown assignee id");let U=T??M,ne=[...T?[]:[{id:G(),...n.value,action:"create.contributor",payload:{id:U.id,name:U.name}}],{id:G(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:U.id}}],be=O(ne,t.value.stateBranchRoot);return a(be)?i(be.message):c("Added issue assignee",{id:e.issueId,ref:K(e.issueId),assignee:{id:U.id,name:U.name}})}let d=Le(e.assigneeName??"").trim();if(!d)return i("Provide assigneeId, self or assigneeName");let l=ft("Assignee name",d,80);if(l)return i(l);let m=[...Ep(Ob(),r.value.contributors).entries()].filter(([,T])=>T===d);if(m.length>1)return i(`"${d}" matches ${m.length} contributors (${m.map(([T])=>T).join(", ")}). Assign by assigneeId to choose.`);let p=m[0];if(!p&&!e.createUnlinked)return i(`No contributor named "${d}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[f=G(),I=d]=p??[],A=[...!!r.value.contributors[f]?[]:[{id:G(),...n.value,action:"create.contributor",payload:{id:f,name:I}}],{id:G(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:f}}],w=O(A,t.value.stateBranchRoot);return a(w)?i(w.message):c("Added issue assignee",{id:e.issueId,ref:K(e.issueId),assignee:{id:f,name:I}})},Vp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;if(!r.value.contributors[e.contributorId])return i("Contributor not found");if(await Gp(t.value.stateBranchRoot,e.contributorId))return i("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let d=[{id:G(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],l=O(d,t.value.stateBranchRoot);return a(l)?i(l.message):c("Tombstoned contributor",{id:e.contributorId,name:So})},Bb=async(e,t)=>{let n=Kn(e);if(a(n))return;let r;for(let o of n.value){if(o.action!=="create.contributor")continue;let s=o.payload;s.id===t&&s.name&&(r=s.name)}return r},zp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.contributors[e.contributorId];if(!o)return i("Contributor not found");if(!o.tombstoned)return i("Contributor is not tombstoned");let s=await Bb(t.value.stateBranchRoot,e.contributorId);if(!s)return i("Cannot restore this contributor \u2014 no original name found in the event log");let d=[{id:G(),...n.value,action:"restore.contributor",payload:{id:e.contributorId,name:s}}],l=O(d,t.value.stateBranchRoot);return a(l)?i(l.message):c("Restored contributor",{id:e.contributorId,name:s})},Kp=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=Kn(t.value.stateBranchRoot);if(a(o))return i(o.message);let s=e.boardId?xp(o.value,e.boardId):o.value,d=new Map,l=new Set,u=new Set,m=Ti(t.value.stateBranchRoot);if(a(m))return i(m.message);for(let N of m.value)N.userId&&u.add(N.userId);for(let N of s)N.userId&&(d.set(N.userId,N.userName??""),l.add(N.userId));let p=r.value.contributors,I=[...Ep(d,p).entries()].map(([N,A])=>({id:N,name:A,color:Oe(A),isSelf:N===n.value.userId,isExternal:!l.has(N),isRemoved:p[N]?.tombstoned===!0,hasAuthoredAnywhere:u.has(N)}));return c("Listed board contributors",I)},Yp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Unassign target must be an issue");if(o.readonly)return i("Cannot unassign readonly issue");if(!r.value.contributors[e.assigneeId])return i("Assignee not found");let s={id:G(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},d=O([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Removed issue assignee",{id:e.issueId,ref:K(e.issueId),assigneeId:e.assigneeId})},Xp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Comment target must be an issue");if(o.readonly)return i("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return i("Comment cannot be empty");if(s.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let d=G(),l={id:G(),...n.value,action:"add.issue.comment",payload:{id:d,issue:e.issueId,md:s,author:n.value.userId}},u=O([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Added issue comment",{id:d,issueId:e.issueId,body:s})},Jp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!o)return i("Unable to resolve comment");if(o.payload.author!==n.value.userId)return i("You can only delete your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!P(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot delete comment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return c("Comment already deleted",{id:e.commentId,issueId:o.payload.issue});let l={id:G(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},u=O([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},Qp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.eventLog.find(p=>p.action==="add.issue.comment"&&p.payload.id===e.commentId);if(!o)return i("Unable to resolve comment");if(o.payload.author!==n.value.userId)return i("You can only edit your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!P(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot edit comment on readonly issue");if(r.value.eventLog.some(p=>p.action==="delete.issue.comment"&&p.payload.id===e.commentId))return i("Comment was deleted");let l=e.body.trim();if(!l)return i("Comment cannot be empty");if(l.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${l.length})`);let u={id:G(),...n.value,action:"edit.issue.comment",payload:{id:e.commentId,issue:o.payload.issue,md:l}},m=O([u],t.value.stateBranchRoot);return a(m)?i(m.message):c("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:l})},Zp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=le();if(a(n))return n;let r=oe();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Attachment target must be an issue");if(o.readonly)return i("Cannot attach to readonly issue");let s=Db(e);if(a(s))return s;let d=gl(t.value.stateBranchRoot,s.value.data,Fb());if(a(d))return d;let l=Le(s.value.name).trim()||"image",u=G(),m={id:G(),...n.value,action:"add.issue.attachment",payload:{id:u,issue:e.issueId,author:n.value.userId,hash:d.value.hash,ext:d.value.ext,name:l,bytes:d.value.bytes}},p=O([m],t.value.stateBranchRoot);if(a(p))return i(p.message);let f=Qr(d.value.hash,d.value.ext);return c("Added issue attachment",{id:u,issueId:e.issueId,fileName:f,bytes:d.value.bytes,markdown:Qi(l,f)})}});var rg={};Eo(rg,{createMcpServer:()=>ng,resultJson:()=>tg,startMcpServer:()=>jb});import{McpServer as Ub}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as $b}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as b}from"zod";var tg,J,ng,jb,og=y(()=>{"use strict";C();ro();eg();zs();tg=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),J=e=>t=>yp(async()=>tg(await e(t))),ng=()=>{let e=new Ub({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:b.object({repoRoot:b.string().optional()})},J(Bp)),e.registerTool("epiq_issue_list",{description:"List Epiq issues. Pass boardId to scope results to a single board and reduce response size.",inputSchema:b.object({repoRoot:b.string().optional(),includeClosed:b.boolean().optional(),boardId:b.string().optional()})},J(Ap)),e.registerTool("epiq_issue_get",{description:"Get one Epiq issue by its full id or its 7-character ref. Use this rather than listing the whole board when you already know which issue you want.",inputSchema:b.object({idOrRef:b.string().min(1),repoRoot:b.string().optional()})},J(Cp)),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:b.object({repoRoot:b.string().optional()})},J(Np)),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:b.object({repoRoot:b.string().optional(),boardId:b.string().optional()})},J(Sp)),e.registerTool("epiq_swimlane_create",{description:"Create an Epiq swimlane on a board",inputSchema:b.object({repoRoot:b.string().optional(),boardId:b.string().min(1),title:b.string().min(1).max(300)})},J(Lp)),e.registerTool("epiq_swimlane_title_edit",{description:"Edit an Epiq swimlane title",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1),title:b.string().min(1).max(300)})},J(Pp)),e.registerTool("epiq_swimlane_move",{description:"Move/reorder an Epiq swimlane, optionally to another board",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1),boardId:b.string().min(1),position:b.discriminatedUnion("at",[b.object({at:b.literal("start")}),b.object({at:b.literal("end")}),b.object({at:b.literal("before"),sibling:b.string().min(1)}),b.object({at:b.literal("after"),sibling:b.string().min(1)})]).optional()})},J(Dp)),e.registerTool("epiq_swimlane_delete",{description:"Delete (archive) an Epiq swimlane. This also archives every issue contained in it.",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1)})},J(Fp)),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue. Optionally set description, tags, and assignees atomically in the same call instead of separate follow-up edits.",inputSchema:b.object({title:b.string().min(1).max(300),parentId:b.string().min(1),repoRoot:b.string().optional(),description:b.string().max(2e4).optional(),tagNames:b.array(b.string().max(60)).max(20).optional(),assigneeNames:b.array(b.string().max(80)).max(20).optional()})},J(Tp)),e.registerTool("epiq_issue_description_edit",{description:"Edit the markdown description of an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),description:b.string().max(2e4),repoRoot:b.string().optional()})},J(_p)),e.registerTool("epiq_issue_title_edit",{description:"Edit the title of an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),title:b.string().min(1).max(300),repoRoot:b.string().optional()})},J(Up)),e.registerTool("epiq_issue_tag_add",{description:"Add a tag to an Epiq issue, creating the tag if it does not exist",inputSchema:b.object({issueId:b.string().min(1),tagName:b.string().min(1).max(60),repoRoot:b.string().optional()})},J($p)),e.registerTool("epiq_issue_tag_remove",{description:"Remove a tag from an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),tagId:b.string().min(1),repoRoot:b.string().optional()})},J(Wp)),e.registerTool("epiq_contributor_list",{description:"List people who can be assigned: everyone who has authored an event (optionally scoped to one board) unioned with the contributor registry. Use these ids with epiq_issue_assignee_add rather than assigning by name.",inputSchema:b.object({boardId:b.string().min(1).optional(),repoRoot:b.string().optional()})},J(Kp)),e.registerTool("epiq_contributor_remove",{description:"Remove an external contributor from the assignee suggestion lists. Their id and every reference to it survive, so existing assignments stay intact and the event log is untouched. Refused for anyone who has authored events, since their name is in the log regardless.",inputSchema:b.object({contributorId:b.string().min(1),repoRoot:b.string().optional()})},J(Vp)),e.registerTool("epiq_tag_remove",{description:"Delete a tag from the whole workspace. It disappears from every ticket, picker and filter, but its id and history stay in the event log, and the name is free for a new tag.",inputSchema:b.object({tagId:b.string().min(1),repoRoot:b.string().optional()})},J(jp)),e.registerTool("epiq_tag_restore",{description:"Put back a tag deleted with epiq_tag_remove, on every ticket that still carried it.",inputSchema:b.object({tagId:b.string().min(1),repoRoot:b.string().optional()})},J(Hp)),e.registerTool("epiq_contributor_restore",{description:"Put a contributor removed with epiq_contributor_remove back into the suggestion lists, under the name they were created with.",inputSchema:b.object({contributorId:b.string().min(1),repoRoot:b.string().optional()})},J(zp)),e.registerTool("epiq_issue_assignee_add",{description:"Assign a contributor to an Epiq issue. Pass self:true to assign yourself. Prefer assigneeId otherwise, which assigns a known contributor (from the registry or the event log) and fails if the id is unknown. assigneeName matches an existing contributor by name; to create somebody new from a name you must also pass createUnlinked, which adds them as an external (non-contributor) assignee.",inputSchema:b.object({issueId:b.string().min(1),assigneeId:b.string().min(1).optional(),self:b.boolean().optional(),assigneeName:b.string().min(1).max(80).optional(),createUnlinked:b.boolean().optional(),repoRoot:b.string().optional()})},J(qp)),e.registerTool("epiq_issue_assignee_remove",{description:"Remove an assignee from an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),assigneeId:b.string().min(1),repoRoot:b.string().optional()})},J(Yp)),e.registerTool("epiq_issue_comment_add",{description:"Add a comment to an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),body:b.string().min(1).max(4e3),repoRoot:b.string().optional()})},J(Xp)),e.registerTool("epiq_issue_attachment_add",{description:"Attach an image file to an Epiq issue. Returns `markdown` \u2014 paste it into a comment or description body to render the image inline.",inputSchema:b.object({issueId:b.string().min(1),filePath:b.string().min(1),name:b.string().min(1).max(200).optional(),repoRoot:b.string().optional()})},J(Zp)),e.registerTool("epiq_issue_comment_delete",{description:"Delete a comment from an Epiq issue",inputSchema:b.object({commentId:b.string().min(1),repoRoot:b.string().optional()})},J(Jp)),e.registerTool("epiq_issue_comment_edit",{description:"Replace the body of one of your own comments on an Epiq issue",inputSchema:b.object({commentId:b.string().min(1),body:b.string().min(1).max(4e3),repoRoot:b.string().optional()})},J(Qp)),e.registerTool("epiq_issue_reopen",{description:"Reopen a closed Epiq issue, restoring it to its previous swimlane",inputSchema:b.object({issueId:b.string().min(1),repoRoot:b.string().optional()})},J(Mp)),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),repoRoot:b.string().optional()})},J(wp)),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:b.object({issueId:b.string().min(1),parentId:b.string().min(1),position:b.discriminatedUnion("at",[b.object({at:b.literal("start")}),b.object({at:b.literal("end")}),b.object({at:b.literal("before"),sibling:b.string().min(1)}),b.object({at:b.literal("after"),sibling:b.string().min(1)})]).optional(),repoRoot:b.string().optional()})},J(kp)),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote (pull remote changes and push local ones). Other Epiq MCP tools only read and write local state and never sync automatically \u2014 call this on demand when you need to see or publish the latest remote changes.",inputSchema:b.object({repoRoot:b.string().optional()})},J(Op)),e},jb=async()=>{let e=ng(),t=new $b;await e.connect(t)}});process.env.EPIQ_MCP="true";console.log=console.error;console.info=console.error;console.debug=console.error;console.warn=console.error;var{applyActorNameArgument:Hb}=await Promise.resolve().then(()=>(hr(),nd)),{isFail:Wb}=await Promise.resolve().then(()=>(C(),Za)),Js=process.argv.slice(2);Js.length>1&&(console.error(`Expected at most one name argument, got ${Js.length}`),process.exit(1));if(Js[0]!==void 0){let e=Hb(Js[0],"The name argument");Wb(e)&&(console.error(e.message),process.exit(1))}var{setVirtualNodesEnabled:Gb}=await Promise.resolve().then(()=>(Ii(),fp));Gb(!1);var{startMcpServer:qb}=await Promise.resolve().then(()=>(og(),rg));await qb();
71
+ ${c}
72
+ `,Xa.writeFileSync(t,n,"utf8"),X.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)}});import Ab from"node:fs";import Pm from"node:path";var Tb,oe,Dm,Om=v(()=>{"use strict";Lm();Uo();pt();ut();Jr();Je();no();Vr();Ut();ht();pe();N();Ft();be();Be();k();ne();Tb=async e=>{let t=await W({cwd:e,args:["status","--porcelain"]});return a(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},oe=(e,t)=>i(`[${e}] ${t}`),Dm=async()=>{Y("");let e=Bo(),t=await mt(process.cwd());if(a(t))return oe(1,t.message);let n=t.value,r=await $o(n);if(a(r))return oe(2,r.message);if(r.value)return oe(2,`Cannot initialize Epiq while a git operation is in progress: ${r.value}`);let o=await Tb(n);if(a(o))return oe(2.5,o.message);if(o.value)return oe(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(_r(n))return oe(4,"Epiq project already initialized");let s=fs();if(!s.isSetupDone||!s.userName)return oe(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=ve(),c=d.userName,u=d.userId;if(!u||!c)return oe(5,"Missing Epiq user id");let m=await dl(n);if(a(m))return oe(6,m.message);let p=e.stateBranch,g=await jo({repoRoot:n,branch:p});if(a(g))return oe(6,g.message);if(g.value)return oe(6,`State branch already exists: ${p}`);let x=await Ki({repoRoot:n,stateBranchName:p});if(a(x))return oe(6,x.message);let S=Go();if(a(S))return oe(7,S.message);let C=Pm.join(Wo(),e.projectId),M=await _n({repoRoot:n,stateBranchRoot:C,stateBranchName:p});if(a(M))return oe(8,M.message);let w=Pm.join(C,".epiq");Ab.mkdirSync(w,{recursive:!0});let T=Qc({userId:u,userName:c});if(a(T))return oe(9,T.message);for(let ii of T.value){let bd=es({event:ii,rootDir:C});if(a(bd))return oe(9,bd.message)}let _=await ds({stateBranchRoot:C,eventFileName:Dn({userId:u,userName:c})});if(a(_))return oe(10,_.message);let O=await er({cwd:C,message:"[epiq:init]"});if(a(O))return oe(10,O.message);let $=await km(n);if(a($))return oe(11,$.message);let Z=jd({repoRoot:n,fileContents:e});if(a(Z))return oe(12,Z.message);let Jt=await he.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(Jt))return oe(13,Jt.message);let Dt=await he.commit({cwd:n,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(a(Dt))return oe(13,Dt.message);let Xn="Project initialized!",Er=await W({cwd:n,args:["push","-u","origin","HEAD"]});a(Er)&&(Xn+=` Warn: [init:14] ${Er.message}`);let Rr=await Xr({repoRoot:n,stateBranchRoot:C});a(Rr)&&(Xn+=` Warn: [init:15] ${Rr.message}`);let vd=_t(T.value).filter(a);if(vd.length>0)return oe(16,vd.map(ii=>ii.message).join(`
73
+ `));let si=He();if(a(si))return oe(16,si.message);let{rootNodeId:jg,nodes:Hg}=si.value,yd=Hg[jg];return yd?(U.navigate({contextNode:yd,selectedIndex:0}),E({hasProjectDefinition:!0,mode:h.DEFAULT}),l(Xn,null)):oe(16,"Unable to resolve initialized root node")}});import{ulid as wb}from"ulid";function Qa(e){let t=Fm();if(a(t))return t;let{contextNode:n,nodes:r}=f();if(!n.parentNodeId)return i("Missing parent node id");let o=r[n.parentNodeId];if(!o)return i("Missing parent node");let s=ce(o.id),d=s.findIndex(({id:m})=>m===n.id);if(d<0)return i("Current node not found among siblings");let c=s[d+e];if(!c)return i("Missing sibling node");let u=_m({id:t.value.id,parentId:c.id,position:{at:"end"}});return a(u)?u:Um(u.value)}function Za(e){let t=Fm();if(a(t))return t;let{contextNode:n,selectedIndex:r}=f(),s=ce(n.id)[r+e];if(!s)return i("Missing sibling node");let d=_m({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return a(d)?d:Um(d.value)}var Bm,vn,Io,Fm,Ja,_m,Um,ed=v(()=>{"use strict";Ut();ht();N();Et();k();Bm=null,vn=()=>structuredClone(Bm),Io=e=>{Bm=e},Fm=()=>{let{contextNode:e,selectedIndex:t}=f(),r=ce(e.id)[t];return r?l("Resolved selected child",r):i("Target node not found")},Ja=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ce(t).filter(o=>o.id!==e);return ts(r,n)},_m=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ge();if(a(r))return i("Unable to resolve user ID");let o=Ja({parentId:t,id:e,position:n});return a(o)?o:l("Created pending move state",{id:wb(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Um=e=>{Io(e);let t=rn(e,!0);return a(t)?t:l("Node moved successfully",t.value)}});import{ulid as Mb}from"ulid";var $m,Ws,jm,Hm=v(()=>{"use strict";Je();ed();On();ht();pe();N();Et();be();k();ne();$m=()=>{let e=vn();if(!e)return i("No pending move state");let t=e.payload.id,n=e.payload.parent,r=f().nodes[n];if(!r)return i("Move parent not found");let o=ce(n).findIndex(s=>s.id===t);return o===-1?i("Moved node not found among rendered children"):(U.navigate({contextNode:r,selectedIndex:o}),l("Synchronized navigation to moved node",null))},Ws=(e,t="Moved preview")=>{if(a(e))return e;let n=$m();return a(n)?n:(E({mode:h.MOVE}),l(t,null))},jm=async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{modifier:t}=me().commandMeta,{contextNode:n,selectedIndex:r}=f(),o=ce(n.id)[r];if(!o)return E({mode:h.DEFAULT}),i("No move target");if(t==="start"){if(o.readonly)return i("Target node is read-only");if(r===-1)return i("No item selected");if(!o.parentNodeId)return i("Target has no parent");let s=ce(o.parentNodeId),d=s.findIndex(({id:g})=>g===o.id);if(d===-1)return i("Target not found among siblings");let c=s[d-1],u=s[d+1],m=u!=null?{at:"before",sibling:u.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=Ja({parentId:o.parentNodeId,id:o.id,position:m});return a(p)?p:(Io({id:Mb(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),E({mode:h.MOVE}),l("Move initialized",null))}if(t==="next")return Ws(Za(1));if(t==="previous")return Ws(Za(-1));if(t==="to-next")return Ws(Qa(1));if(t==="to-previous")return Ws(Qa(-1));if(t==="confirm"){let s=vn();if(!s)return i("No pending move to confirm");let d=await Nt();if(a(d))return d;let c=B([s],d.value);if(a(c))return c;let u=$m();return a(u)?u:(Io(null),E({mode:h.DEFAULT}),l("Moved item",null))}return t==="cancel"?(Io(null),E({mode:h.DEFAULT}),l("Cancelling move",null)):i("Invalid move modifier")}});import{monotonicFactory as kb,ulid as Lb}from"ulid";var Pb,Gs,td=v(()=>{"use strict";N();Pb=kb(),Gs=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=Pb();return l("Created issue events",[{id:Lb(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])}});import{ulid as qs}from"ulid";var Wm,Gm=v(()=>{"use strict";Je();td();On();ht();It();N();le();Et();k();ne();Wm=async(e,t)=>{let n=ge();if(a(n))return i("Unable to resolve user ID");let r=await Nt();if(a(r))return r;let o=r.value;if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:d,selectedIndex:c}=f(),u=m=>{let p=B([m],o);if(a(p))return p;let g=I.getNode(p.value[0].result.id);if(!g)return i("Created node not found");if(!g.parentNodeId)return p;let x=I.getNode(g.parentNodeId);return x?(U.navigate({contextNode:x,selectedIndex:I.getSiblings(g.parentNodeId).findIndex(({id:S})=>S===g.id)}),p):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=f(),p=I.getNode(m);if(!p)return i("Workspace not found");let g=Fn(p.id,n.value,o);return a(g)?g:u({id:qs(),action:"add.board",payload:{id:qs(),name:t.inputString,parent:p.id,rank:g.value},...n.value})}if(t.modifier==="swimlane"){let m=Ke(s,"BOARD");if(a(m))return i("Unable to add swimlane in this context");let p=Fn(m.value.id,n.value,o);return a(p)?p:u({id:qs(),action:"add.swimlane",payload:{id:qs(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=ae(d.id)[c],p=d.context==="SWIMLANE"?d:d.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let _=Ke(s,"SWIMLANE");return a(_)?null:_.value})();if(!p)return i("Unable to add issue in this context");let g=Fn(p.id,n.value,o);if(a(g))return g;let x=Gs({name:t.inputString,parent:p.id,rank:g.value,user:n.value});if(a(x))return x;let S=x.value,C=B([...S],o);if(a(C))return C;if(!C.value[0])return i("Issue creation failed");let T=S.find(_=>_.action==="add.issue")?.payload.id;return T?(U.navigate({contextNode:p,selectedIndex:I.getSiblings(p.id).findIndex(({id:_})=>_===T)}),l("Issue created",null)):i("Unable to determine ticket id")}return l("Success",null)}});var qm,Vm=v(()=>{"use strict";pt();ut();Jr();to();Vr();Ht();N();Ft();k();as();qm=async e=>{let t=Ne({repoRoot:e});if(a(t))return zr(3,t.message);let n=await _n({repoRoot:e,stateBranchRoot:t.value,stateBranchName:Bo().stateBranch});if(a(n))return zr(3,n.message);let r=await W({cwd:t.value,args:["pull","--ff-only"]});a(r)&&logger.info(3,r.message);let o=jt(t.value);if(a(o))return zr(3,o.message);let{events:s,unreadable:d}=o.value,c=dn(s,d);if(a(c))return zr(4,c.message);E({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let u=oa({root:e});return a(u)&&logger.info(u.message),l("Loaded project",void 0)}});import Db from"node:os";import zm from"node:path";var Ob,Bb,Km,Ym=v(()=>{"use strict";Vm();to();N();be();k();ne();Ob=e=>e==="~"||e.startsWith("~/")?zm.join(Db.homedir(),e.slice(1)):e,Bb=(e,t)=>{let n=e.trim();if(!n)return i("Provide a number from the list or a path to a project");if(/^\d+$/.test(n)){let o=t[Number(n)-1];return o?l("Resolved recent project",o.root):i(`No recent project #${n}`)}let r=Xe(zm.resolve(Ob(n)));return a(r)?i(`No epiq project at ${n}`):l("Resolved project path",r.value)},Km=async()=>{let e=ks();if(Y(""),f().hasProjectDefinition)return i("Already in a project; run epiq from another directory");let t=gs({exclude:process.cwd()}),n=a(t)?[]:t.value,r=Bb(e,n);if(a(r))return i(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(c){return i(`Unable to enter ${o}: ${c instanceof Error?c.message:String(c)}`)}let d=await qm(o);return a(d)?(process.chdir(s),i(d.message)):l(`Opened ${Cl(o)}`,null)}});var Vs,nd=v(()=>{"use strict";Je();Ht();Ut();N();k();Vs=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=f(),s=ji(n,t);if(a(s))return i(s.message);let{appliedEvents:d,unappliedEvents:c}=s.value,u=Kt();if(a(u))return u;let m=_t(d),{fatal:p,skipped:g}=wn(m);if(p.length>0)return Kt(),E(o),i(p.map(S=>S.message).join(", "));Mn(g);let x=f().nodes[e];return x?(U.navigate({contextNode:x,selectedIndex:r}),l("",{unappliedEvents:c})):(Kt(),E(o),i("Board did not exist at that date"))}});var Xm,Jm=v(()=>{"use strict";Xm=e=>{let t=[],n=0;for(let o=0;o<e.length;o++){let s=o===0?0:Math.max(0,e[o]-e[o-1]);n+=Math.sqrt(s),t[o]=n}let r=n;return t.map((o,s)=>r>0?o/r:(s+1)/e.length)}});var Fb,_b,Ub,zs,Ks,Vn,Qm,Zm,rd=v(()=>{"use strict";ct();xo();Ut();pe();N();Jm();k();Fb=20,_b=16,Ub=150,zs=null,Ks=null,Vn=()=>{zs!==null&&(clearInterval(zs),zs=null),Ks!==null&&(clearTimeout(Ks),Ks=null)},Qm=()=>{Vn(),E({mode:h.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Zm=({events:e,startTime:t,durationMs:n})=>{Vn();let r=e.length,o=Cr(e.map(g=>Ar(g))).map(g=>g??t),s=o[r-1]??Date.now(),d=Xm(o),c=Math.max(1,Math.round(n*Fb/1e3)),u=Math.max(Math.round(n/c),_b),m=0,p=0;E({mode:h.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),zs=setInterval(()=>{m++;let g=m/c,x=[],S,C;for(;p<r&&d[p]<=g;){let w=e[p],T=rn(w);if(a(T)){if(jr(T)){p++;continue}Qm();return}x.push(...ki(w)),S=w,C=o[p],p++}if(p>=r||m>=c){for(;p<r;p++){let T=rn(e[p]);if(a(T)&&!jr(T))break}let w=f().replay;E({unappliedEvents:[],replay:w&&{...w,progress:1,appliedCount:r}}),Vn(),Ks=setTimeout(Qm,Ub);return}let M=f().replay;E({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,g),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:S?C??M?.currentTime??t:M?.currentTime??t,currentLabel:S?od(S):M?.currentLabel??"",flashNodeIds:S?[...new Set(x)]:M?.flashNodeIds??[]}})},u)}});var ep,tp=v(()=>{"use strict";pt();ct();Ht();Ut();pe();It();N();be();k();oo();nd();rd();ep=async()=>{let e=Ke(f().breadCrumb,"BOARD");if(a(e))return e;let t=await mt(process.cwd());if(a(t))return i("Unable to locate repo root");let n=Ne({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=me().commandMeta;if(Vn(),r==="now"){let c=Ln(n.value);if(a(c))return i(c.message);let u=Kt();if(a(u))return u;let m=_t(c.value),{fatal:p,skipped:g}=wn(m);return p.length>0?i(p.map(x=>x.message).join(", ")):(Mn(g),E({mode:h.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),l("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let c=Hi(n.value);if(a(c))return c;let u=r==="prev"?f().eventLog.at(-1):f().unappliedEvents.at(0),m=u===void 0?null:Ar(u),p=(u===void 0?null:c.value.get(u.id)??null)??(m===null?null:li(m));if(p===null)return i(r==="prev"?"No previous event to peek":"No next event to peek");s=r==="prev"?p:p+1}else{let c=$n(r||o.trim());if(!c)return i("Invalid peek date");s=c.getTime()}let d=Vs({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return a(d)?d:(E({mode:h.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:d.value.unappliedEvents,replay:null}),l("Peeking",!0))}});var np,rp=v(()=>{"use strict";pt();It();N();be();k();oo();nd();rd();np=async()=>{let e=Ke(f().breadCrumb,"BOARD");if(a(e))return e;let t=await mt(process.cwd());if(a(t))return i("Unable to locate repo root");let n=Ne({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=me().commandMeta,{dateInput:s,durationInput:d}=Is(r,o);if(Vn(),f().syncStatus.status==="syncing")return i("Cannot replay while syncing, try again in a moment");let c=$n(s);if(!c)return i("Invalid replay date");let u=d?bs(d):15e3;if(u===null)return i("Invalid replay duration (try e.g. 30s or 2m)");let m=c.getTime(),p=f(),g=Vs({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(a(g))return g;let{unappliedEvents:x}=g.value;return x.length===0?(Kt(),E(p),l("Nothing to replay from that point",!0)):(Zm({events:x,startTime:m,durationMs:u}),l("Replaying board history",!0))}});import jb from"zod";var op,sp=v(()=>{"use strict";Hn();pe();N();be();Be();k();op=()=>{let e=me().commandMeta.inputString,t=jb.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return i("Auto sync duration must be a number of at least 3000 ms");let n=st({autoSyncDebounceMs:t.data});return a(n)?n:(et({autoSyncIntervalMs:t.data}),E({mode:h.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))}});var ip,ap=v(()=>{"use strict";no();Hn();pe();N();be();Be();k();ip=()=>{let e=me().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return i("Invalid response");let t=Ll(e),n=st({autoSync:t});return a(n)?n:(et({autoSync:t}),E({mode:h.DEFAULT}),l(`Auto sync set to "${e}"`,null))}});var dp,cp=v(()=>{"use strict";Hn();pe();N();be();Be();k();dp=()=>{let e=me().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return i("Invalid response");let n=st({logLevel:e});return a(n)?n:(et({logLevel:e}),E({mode:h.DEFAULT}),l(`Auto sync set to "${e}"`,null))}});import{spawn as Hb}from"node:child_process";var Wb,lp,up=v(()=>{"use strict";N();Wb=()=>{switch(process.platform){case"darwin":return{command:"pbcopy",args:[]};case"win32":return{command:"clip",args:[]};default:return process.env.WAYLAND_DISPLAY?{command:"wl-copy",args:[]}:{command:"xclip",args:["-selection","clipboard"]}}},lp=async e=>new Promise(t=>{let{command:n,args:r}=Wb();try{let o=Hb(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(i(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?l("Copied to clipboard",null):i(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(i(`Clipboard tool not available (${n})`))}})});var Eo,mp,pp=v(()=>{"use strict";N();k();up();nn();ro();un();Eo=async(e,t)=>{if(!e.trim())return i(`Nothing to copy: ${t} is empty`);let n=await lp(e);return a(n)?n:l(`Copied ${t} to clipboard`,null)},mp=async e=>{let{breadCrumb:t,selectedNode:n}=f(),r=so({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return i("Nothing selected to copy from");switch(e.modifier){case xe.REF:return Eo(z(o.id),"ref");case xe.TITLE:return Eo(o.title,"title");case xe.DESCRIPTION:return r?Eo(r.props?.description??"","description"):i("No issue in scope");case xe.TAGS:{if(!r)return i("No issue in scope");let s=cn(r).map(({name:d})=>d);return Eo(s.join(", "),"tags")}case xe.ASSIGNEES:{if(!r)return i("No issue in scope");let s=ln(r).map(({name:d})=>d);return Eo(s.join(", "),"assignees")}default:return i("Yank one of: ref, title, description, tags, assignees")}}});var gp,fp=v(()=>{"use strict";ea();pe();N();be();k();gp=async()=>{Y(""),E({mode:h.DEFAULT});let e=He();if(a(e))return i(e.message);if(e.value.syncStatus.status==="syncing")return i("Sync already in progress");E({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await us();return a(t)?(E({syncStatus:{msg:t.message,status:"failed"}}),t):(E({mode:h.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)}});import{ulid as Oe}from"ulid";var Gb,hp,Yt,vp,yp=v(()=>{"use strict";le();Rm();Je();Qn();Hn();On();ht();Va();nr();pe();It();fe();N();le();Et();be();Be();k();Hs();ne();Un();Sa();un();mo();Mm();Om();Hm();Gm();Ym();tp();rp();sp();ha();ap();cp();pp();fp();Gb=e=>e.action==="add.issue.comment",hp=()=>{let{eventLog:e=[],contributors:t}=f(),n=new Map,r=new Set;for(let o of e)o.userId&&(n.set(o.userId,o.userName??""),r.add(o.userId));for(let o of Object.values(t))n.set(o.id,o.name);return[...n.entries()].map(([o,s])=>({id:o,name:s,isExternal:!r.has(o)}))},Yt=async()=>{let e=await Nt();return a(e)?e:l("Resolved persist root",e.value)},vp=[{systemOnly:!0,intent:F.Move,description:"Internal move-state command",mode:h.COMMAND_LINE,action:jm},{intent:F.Delete,description:"Delete the currently selected node",mode:h.COMMAND_LINE,action:async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=f(),r=ae(t.id)[n];if(!r)return i("Unable to resolve child to delete");let o=await Yt();if(a(o))return o;if(r.context==="COMMENT"){let s=r.id,d=P(t)?t.id:t.parentNodeId;if(!d)return i("Unable to resolve comment issue");let c=f().nodes[d];if(!c||!P(c))return i("Unable to resolve comment issue");let u=c.log?.filter(Gb).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?i("You can only delete your own comments"):B([{id:Oe(),action:"delete.issue.comment",payload:{id:s,issue:d},...e.value}],o.value):i("Unable to resolve comment")}return B([{id:Oe(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:h.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=me().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(d=>Ee(b.FILTER).map(c=>c.split(n)[0]).includes(d))(r))return i("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return Ie(d=>({...d,filters:e==="clear"?[]:[...d.filters,s],mode:h.DEFAULT})),l("Filter updated",null)}},{intent:F.ViewHelp,description:"Open the help screen",mode:h.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=f();return hn({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),E({mode:h.HELP}),l("Viewing help",null)}},{intent:F.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:h.COMMAND_LINE,action:async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=f(),r=ae(t.id)[n];if(!r)return i("Unable to close issue, no target found");if(!P(r))return i("Cannot close in this context");let o=f().nodes[ye];if(!o)return i("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return i("Issue is already closed");let s=await Yt();if(a(s))return s;let d=s.value,c=an(o.id,r.id,{at:"end"},e.value,d);if(a(c))return c;let u=B([{id:Oe(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value}],d);return a(u)?u:l("Issue closed",null)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:h.COMMAND_LINE,action:async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=f(),r=ae(t.id)[n];if(!r)return i("Unable to reopen issue, no target found");let o=r.context==="TICKET"?l("Resolved ticket",r):zn(r.id,"TICKET");if(a(o))return i("Cannot reopen in this context");let s=o.value,d=f().nodes[ye];if(!d)return i("Unable to locate closed swimlane");if(s.parentNodeId!==d.id)return i("Issue is not closed");if(!P(s))return i("Target node is not issue");let c=js(s);if(!c)return i("Unable to resolve previous parent from issue history");if(c===d.id)return i("Previous parent resolves to closed swimlane");let u=f().nodes[c];if(!u)return i("Previous parent no longer exists");let m=await Yt();if(a(m))return m;let p=m.value,g=an(u.id,s.id,{at:"end"},e.value,p);if(a(g))return g;let x=B([{id:Oe(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:g.value},...e.value}],p);return a(x)?x:l("Issue reopened",null)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Init,description:"Initialize Epiq in the current git repository",mode:h.COMMAND_LINE,action:Dm},{intent:F.OpenProject,description:"Open a recently used epiq project, by number or path",mode:h.COMMAND_LINE,action:Km,onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.NewItem,description:"Create a new board, swimlane, or issue",mode:h.COMMAND_LINE,action:Wm,onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Rename,description:"Rename the currently selected node",mode:h.COMMAND_LINE,action:async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=f(),r=ae(t.id)[n];if(!r)return i("Missing node");if(r.readonly)return i("Cannot rename readonly node");let o=ks();if(!o)return i("Provide a title");let s=await Yt();return a(s)?s:B([{id:Oe(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.UntagTicket,description:"Remove a tag from the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=me().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let o=I.findTagByName(r);if(!o)return i(`Tag "${r}" does not exist`);let{selectedNode:s}=f();if(!s)return i("Invalid untag target");let d=zn(s.id,"TICKET");if(a(d))return i("Unable to untag issue in this context");let c=d.value;if(!P(c))return i("Target node is not issue");if(!(c.props.tags??[]).includes(o.id))return i("Issue is not tagged with that tag");let m=await Yt();return a(m)?m:B([{id:Oe(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}],m.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.TagTicket,description:"Add or create a tag on the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=me().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let{selectedNode:o}=f();if(!o)return i("Invalid tag target");let s=zn(o.id,"TICKET");if(a(s))return i("Unable to tag issue in this context");let d=s.value;if(!P(d))return i("Target node is not issue");let c=await Yt();if(a(c))return c;let u=I.findTagByName(r),m=u?.id??Oe();return(d.props.tags??[]).includes(m)?i("Already tagged with that tag"):B([...u?[]:[{id:Oe(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:Oe(),action:"add.issue.tag",payload:{id:d.id,tag:m},...e.value}],c.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.AssignUserToTicket,description:"Assign a user to the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=me().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return i("Provide an assignee");let{selectedIndex:d,contextNode:c}=f(),u=ae(c.id)[d];if(!u)return i("Invalid assign target");let m=zn(u.id,"TICKET");if(a(m))return i("Unable to assign issue in this context");let p=m.value;if(!P(p))return i("Target node is not issue");let g=await Yt();if(a(g))return g;let x=hp(),S=!o&&s.toLowerCase()==="me",C,M;if(S)C=e.value.userId,M=x.find(_=>_.id===C)?.name??e.value.userName;else{let _=x.filter($=>$.name===s);if(_.length>1)return i(`"${s}" matches ${_.length} contributors (${_.map($=>$.id).join(", ")}). Assign from the GUI to choose by id.`);let O=_[0];if(!O&&!o)return i(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);C=O?.id??Oe(),M=O?.name??s}if((p.props.assignees??[]).includes(C))return i("Assignee already assigned");let T=!!f().contributors[C];return B([...T?[]:[{id:Oe(),action:"create.contributor",payload:{id:C,name:M},...e.value}],{id:Oe(),action:"add.issue.assignee",payload:{id:p.id,assignee:C},...e.value}],g.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=ge();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=me().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee to remove");let{selectedNode:o}=f();if(!o)return i("Invalid unassign target");let s=zn(o.id,"TICKET");if(a(s))return i("Unable to unassign in this context");let d=s.value;if(!P(d))return i("Target node is not issue");let c=d.props.assignees??[],u=r.toLowerCase()==="me",m=u?c.filter(x=>x===e.value.userId):hp().filter(x=>x.name===r&&c.includes(x.id)).map(x=>x.id);if(m.length>1)return i(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return i(u?"Issue is not assigned to you":`Issue is not assigned to "${r}"`);let g=await Yt();return a(g)?g:B([{id:Oe(),action:"remove.issue.assignee",payload:{id:d.id,assignee:p},...e.value}],g.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Comment,description:"Add a comment to the selected issue",mode:h.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return i("Provide a comment");if(n.length>4e3)return i(`Cannot exceed ${4e3} characters`);let r=ge();if(a(r))return i("Unable to resolve user ID");let{breadCrumb:o,selectedNode:s}=f(),d=Ke([...o,s],"TICKET");if(a(d))return i("Edit target must be an issue");let c=d.value;if(!c)return i("Invalid comment target");let u=c.context==="TICKET"?l("Resolved ticket",c):zn(c.id,"TICKET");if(a(u))return i("Unable to comment on issue in this context");let m=u.value;if(!P(m))return i("Target node is not issue");let p=await Yt();return a(p)?p:B([{id:Oe(),action:"add.issue.comment",payload:{id:Oe(),issue:m.id,author:r.value.userId,md:n},...r.value}],p.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Sync,description:"Pull, commit, and push Epiq state",mode:h.COMMAND_LINE,action:gp},{intent:F.Peek,description:"View board state at another point in time",mode:h.COMMAND_LINE,action:ep},{intent:F.Replay,description:"Replay board history forward from a point in time",mode:h.COMMAND_LINE,action:np},{intent:F.Export,description:"Export the current board layout to markdown",mode:h.COMMAND_LINE,action:async()=>{let e=await Em();return a(e)?e:(E({mode:h.DEFAULT}),l("Export successful",!0))}},{intent:F.Exit,description:"Exit the application",mode:h.COMMAND_LINE,action:async()=>(U.exit(),l("Exit successful",!0))},{intent:F.Edit,description:"Edit title or description",mode:h.COMMAND_LINE,action:async(e,t)=>wm(t),onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:h.COMMAND_LINE,action:async(e,t)=>mp(t),onSuccess:()=>E({mode:h.DEFAULT})},{intent:F.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:h.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case ue.USERNAME:{if(process.env[bt])return i(`Cannot change the configured user while ${bt} names this process`);let r=Ss();if(a(r))return r;let{userId:o,preferredEditor:s,userName:d}=r.value,c=n||d,u=o||Oe();if(!c||!u)return i("Unable to resolve user name or id");let m=st({userName:c,userId:u,preferredEditor:s??""});return a(m)?m:(et({userName:c,userId:u}),E({mode:h.DEFAULT}),l(`Username set to "${c}"`,null))}case ue.EDITOR:{if(!n)return i("No editor provided");let r=st({preferredEditor:n});return a(r)?r:(et({preferredEditor:n}),E({mode:h.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case ue.VIEW:{if(n!=="wide"&&n!=="dense")return i("Invalid view mode");let r=st({viewMode:n});return a(r)?r:(et({viewMode:n}),E({mode:h.DEFAULT}),l(`View set to "${n}"`,null))}case ue.AUTOSYNC:return ip();case ue.LOG_LEVEL:return dp();case ue.SYNC_DEBOUNCE_MS:return op();case ue.ATTACHMENT_MAX_KB:return Xl();default:return i("Unknown config command")}}}]});var qb,Lt,sd=v(()=>{"use strict";ms();As();Sa();yp();N();be();Be();k();qb=new Set(["peek","replay","filter","view-help","yank"]),Lt=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=me();if(!t)return i("No command to confirm");if(!e&&n===mn.Invalid)return i("Invalid command");let s=Cu(t);Eu();let{readOnly:d}=f();if(d&&!qb.has(s))return po({status:Ot.Fail,message:"Command not available in readonly state",value:null});let c=vp.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return po({status:Ot.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return po({status:Ot.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?po(u):(Ru({addToHistory:!e}),c.onSuccess?.(),ve().autoSync&&Rl(),u)}});var Ys,Xs,bp,Ip=v(()=>{"use strict";N();pe();k();xn();sd();ed();be();Ys=[{intent:D.Exit,mode:h.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(E({mode:h.COMMAND_LINE}),Y("move cancel"),Lt({isForceExecutedBySystem:!0}))},{intent:D.InitMove,mode:h.DEFAULT,description:"[m] move",action:()=>(E({mode:h.COMMAND_LINE}),Y("move start"),Lt({isForceExecutedBySystem:!0}))},{intent:D.ConfirmMove,mode:h.MOVE,description:"[m] confirm move",action:()=>(E({mode:h.COMMAND_LINE}),Y("move confirm"),Lt({isForceExecutedBySystem:!0}))}],Xs=[{intent:D.MovePreviousItem,mode:h.MOVE,action:()=>vn()?(E({mode:h.COMMAND_LINE}),Y("move previous"),Lt({isForceExecutedBySystem:!0})):i("No pending move")},{intent:D.MoveNextItem,mode:h.MOVE,action:()=>vn()?(E({mode:h.COMMAND_LINE}),Y("move next"),Lt({isForceExecutedBySystem:!0})):i("No pending move")}],bp=[{intent:D.MoveToNextContainer,mode:h.MOVE,action:()=>vn()?(E({mode:h.COMMAND_LINE}),Y("move to-next"),Lt({isForceExecutedBySystem:!0})):i("No pending move")},{intent:D.MoveToPreviousContainer,mode:h.MOVE,action:()=>vn()?(E({mode:h.COMMAND_LINE}),Y("move to-previous"),Lt({isForceExecutedBySystem:!0})):i("No pending move")}]});var xp,Ep=v(()=>{"use strict";fe();Ip();xp={[V.WORKSPACE]:[...Ys,...Xs],[V.BOARD]:[...Ys,...Xs],[V.SWIMLANE]:[...Ys,...Xs,...bp],[V.TICKET]:[],[V.FIELD]:[],[V.FIELD_LIST]:[],[V.TEXT]:[],[V.COMMENT]:[]}});import{spawn as Vb}from"node:child_process";function Rp(e){let t=process.platform,o=Vb(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}var Sp=v(()=>{"use strict"});import zb from"node:fs";import Kb from"node:path";var Np,Cp=v(()=>{"use strict";pt();ao();N();ne();Sp();Np=e=>{let t=Xe(process.cwd());if(a(t))return i("Unable to resolve project root");let n=Ne({repoRoot:t.value});if(a(n))return i(n.message);let r=io(e.hash,e.ext),o=Kb.join(qo(n.value),r);return zb.existsSync(o)?(Rp(o),l(`Opened ${e.name}`,null)):i("Attachment file not found \u2014 run :sync to fetch it")}});var Ap,Tp,wp=v(()=>{"use strict";pe();N();be();k();Hs();xn();Je();Ap=()=>{Y("");let{pendingNavTarget:e}=xr();E({mode:h.DEFAULT}),e&&U.navigate(e),hn({pendingNavTarget:void 0})},Tp=[{intent:D.ExitCommandLine,mode:h.HELP,action:()=>(Ap(),l("Exiting help",null))},{intent:D.Exit,mode:h.HELP,action:()=>(Ap(),l("Closed help",null))},{intent:D.NavPreviousItem,mode:h.HELP,description:"[arrows/hjkl] navigate",action:()=>(U.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:D.NavNextItem,mode:h.HELP,action:()=>(U.navigateToNextItem(),l("Navigating to next help item",null))},{intent:D.NavToPreviousContainer,mode:h.HELP,action:()=>(U.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:D.NavToNextContainer,mode:h.HELP,action:()=>(U.navigateToNextContainer(),l("Navigating to next help container",null))}]});var Yb,Mp,kp,Lp=v(()=>{"use strict";pe();fe();N();be();k();Hs();xn();Je();Yb=e=>{E({mode:h.COMMAND_LINE});let{pendingNavTarget:t}=xr();t&&U.navigate(t),hn({pendingNavTarget:void 0}),Y(`${e} `)},Mp=()=>{Y("");let{pendingNavTarget:e}=xr();e&&U.navigate(e),hn({pendingNavTarget:void 0}),E({mode:h.DEFAULT})},kp=[{intent:D.InitCommandPalette,mode:h.DEFAULT,description:"[?] command palette",action:()=>{Y("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=f();return hn({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),E({mode:h.PALETTE}),l("Opening command palette",null)}},{intent:D.Confirm,mode:h.PALETTE,action:()=>{let{selectedNode:e}=f();if(!e||!Ad(e))return i("Command only applicable on text nodes");if(e.props.disabled)return i("Command is not available in this context");let t=e.title;return t?(Yb(t),l("Selected command",t)):l("No command selected",null)}},{intent:D.ExitCommandLine,mode:h.PALETTE,action:()=>(Mp(),l("Exiting palette",null))},{intent:D.Exit,mode:h.PALETTE,action:()=>(Mp(),l("Closed command palette",null))},{intent:D.NavPreviousItem,mode:h.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(U.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:D.NavNextItem,mode:h.PALETTE,action:()=>(U.navigateToNextItem(),l("Navigating to next item",null))},{intent:D.NavToPreviousContainer,mode:h.PALETTE,action:()=>(U.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:D.NavToNextContainer,mode:h.PALETTE,action:()=>(U.navigateToNextContainer(),l("Navigating to next container",null))}]});var Pp,Dp=v(()=>{"use strict";Un();un();pe();N();tr();le();Et();be();k();Cp();xn();wp();Lp();Je();Pp=[{intent:D.InitCommandLine,mode:h.DEFAULT,description:"[:] write command",action:()=>(E({mode:h.COMMAND_LINE}),Y(""),l("Entering command line mode",null))},...Tp,...kp,{intent:D.AddItem,mode:h.DEFAULT,description:"[n] new...",action:()=>(E({mode:h.COMMAND_LINE}),Y(`${b.NEW} `),l("Adding new item",null))},{intent:D.Delete,mode:h.DEFAULT,description:"[d] delete",action:()=>(E({mode:h.COMMAND_LINE}),Y(`${b.DELETE} `),l("Deleting item",null))},{intent:D.Confirm,mode:h.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=f();if(!ce(e?.id??"")?.length){let r=e?I.getAttachment(e.id):void 0;if(r)return Np(r);if(e?.title===ie.DESCRIPTION)return E({mode:h.COMMAND_LINE}),Y(`${b.EDIT} description `),l("Propose command",!0);if(e?.title===ie.ASSIGNEES)return E({mode:h.COMMAND_LINE}),Y(`${b.ASSIGN} `),l("Propose command",!0);if(e?.title===ie.TAGS)return E({mode:h.COMMAND_LINE}),Y(`${b.TAG} `),l("Propose command",!0);if(t.title===ie.DESCRIPTION&&e?.context==="TEXT")return E({mode:h.COMMAND_LINE}),Y(`${b.EDIT} description `),l("Propose command",!0)}return U.enterChildNode(),l("Entering context",null)}},{intent:D.Yank,mode:h.DEFAULT,description:"[y] yank",action:()=>{let{selectedNode:e}=f(),t=e?.title===ie.DESCRIPTION?xe.DESCRIPTION:e?.title===ie.TAGS?xe.TAGS:e?.title===ie.ASSIGNEES?xe.ASSIGNEES:xe.REF,r=Ee(b.YANK).includes(t)?t:xe.REF;return E({mode:h.COMMAND_LINE}),Y(`${b.YANK} ${r}`),l("Propose command",!0)}},{intent:D.EditTitle,mode:h.DEFAULT,description:"[r] rename title",action:()=>(E({mode:h.COMMAND_LINE}),Y(`${b.EDIT} title ${f().selectedNode?.title}`),l("Exiting context",null))},{intent:D.EditDescription,mode:h.DEFAULT,description:"[e] edit desc",action:()=>(E({mode:h.COMMAND_LINE}),Y(`${b.EDIT} description `),l("Exiting context",null))},{intent:D.Exit,mode:h.DEFAULT,description:"[q] exit context",action:()=>(U.enterParentNode(),l("Exiting context",null))},{intent:D.NavPreviousItem,mode:h.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(U.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:D.NavNextItem,mode:h.DEFAULT,action:()=>(U.navigateToNextItem(),l("Navigating to next item",null))},{intent:D.NavToPreviousContainer,mode:h.DEFAULT,action:()=>(U.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:D.NavToNextContainer,mode:h.DEFAULT,action:()=>(U.navigateToNextContainer(),l("Navigating to next container",null))}]});var Xb,Jb,Op,Bp=v(()=>{"use strict";be();Xb=500,Jb=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Op=e=>{let t=Jb(e);t&&Ms(n=>(n+t).slice(0,Xb))}});var Qb,Zb,Fp,_p=v(()=>{"use strict";Bp();pe();N();be();k();xn();sd();Qb=[h.COMMAND_LINE,h.PALETTE],Zb=e=>[{intent:D.MoveCursorLeft,mode:e,action:()=>(Ea(-1),l("Moving cursor left",null))},{intent:D.MoveCursorRight,mode:e,action:()=>(Ea(1),l("Moving cursor right",null))},{intent:D.MoveCursorLeftOfWord,mode:e,action:()=>(Ra("left"),l("Moving cursor left of word",null))},{intent:D.MoveCursorRightOfWord,mode:e,action:()=>(Ra("right"),l("Moving cursor right of word",null))},{intent:D.AutoCompleteCommand,mode:e,action:()=>(Ms((t,{remainder:n})=>{let r=n?t+n:t,o="";return r==="edit title "&&(o=f().selectedNode?.title??""),r+o}),l("Auto-completing command",null))},{intent:D.CaptureInput,mode:e,action:(t,{sequence:n})=>(Op(n??""),l("Capturing input",null))},{intent:D.EraseInput,mode:e,action:()=>(Iu(),l("Erasing input",null))},{intent:D.EraseInputWord,mode:e,action:()=>(xu(),l("Erasing input word",null))}],Fp=[{intent:D.Confirm,mode:h.COMMAND_LINE,action:()=>(Lt(),l("Executing command",null))},{intent:D.ViewHelp,mode:h.DEFAULT,action:()=>(E({mode:h.HELP}),l("Viewing help",null))},...Qb.flatMap(Zb),{intent:D.ExitCommandLine,mode:h.COMMAND_LINE,action:()=>(E({mode:h.DEFAULT}),l("Exiting command line",null))},{intent:D.GetLastCommandFromHistory,mode:h.COMMAND_LINE,action:()=>(Su(),l("Getting last command from history",null))},{intent:D.GetNextCommandFromHistory,mode:h.COMMAND_LINE,action:()=>(Nu(),l("Getting next command from history",null))}]});var eI,Up,$p,jp=v(()=>{"use strict";eI=e=>{let t=/^\[(.+?)\]\s*(.+)$/.exec(e);return t?{keys:t[1]??"",label:t[2]??""}:null},Up=({keys:e})=>e.length===1?0:1,$p=(e,t)=>{let n=new Set;for(let r of e)r.mode!==t||!r.description||n.add(r.description);return[...n].map(eI).filter(r=>r!==null).sort((r,o)=>Up(r)-Up(o))}});function Hp(e,t,n){let r=t[e];if(!r)return i("buildBreadCrumb(): current node not found");let o=[],s=new Set,d=r;for(;d&&!s.has(d.id)&&(o.push(d),s.add(d.id),!(d.id===n||!d.parentNodeId));)d=t[d.parentNodeId];let c=o[o.length-1];return!c||c.id!==n?i("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var Wp=v(()=>{"use strict";N()});var Gp,qp=v(()=>{"use strict";Gp=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t}});import{useSyncExternalStore as tI}from"react";function cd(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return i("derive(): contextNodeId is missing");if(!r)return i("derive(): rootNode is missing");if(!o[r])return i("derive(): unable to find root node");let c=o[t];if(!c)return i("Unable to derive state, contextNode not found");let u=Hp(t,o,r);if(a(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,g=[...Pp,...xp[p]??[],...Fp],x=$p(g,n),S=Gp(g),C=rI(o,s),M=C[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:x,availableActions:g,actionIndex:S,selectedNode:M,renderedChildrenIndex:C})}function Hr(e){id=e;let t=Xe(process.cwd()),n=!1;if(!a(t)){let s=Bt(t.value);if(a(s))return i(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:h.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],replay:null,timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{},attachments:{}},o=cd(r);return a(o)?o:(Pt=o.value,dd(),l("State initialized",null))}function Ie(e){let t=f(),n=e(t);if(Kn)return Ro=n,Pt={...t,...n},l("State updated",null);let r=cd(n);return a(r)?i(r.message??"Unable to update state"):(Pt=r.value,dd(),l("State updated",null))}function mc(e){if(Kn)return l("Joined batch",e());Kn=!0,Ro=null;let t=()=>{let n=Ro;if(Kn=!1,Ro=null,n===null)return null;let r=cd(n);return a(r)?i(r.message??"Unable to update state"):(Pt=r.value,dd(),l("State updated",null))};try{let n=e(),r=t();return r&&a(r)?i(r.message):l("State updated",n)}finally{Kn&&t()}}function Yn(e,t,n){if(!Kn)return Ie(d=>({...d,[e]:{...d[e]??{},[t]:n}}));let r=f(),o=r[e]??{};o[t]=n;let s={...r,[e]:o};return Ro=s,Pt={...r,...s},l("State updated",null)}var Pt,id,ad,dd,nI,f,He,Kn,Ro,Wc,E,Ve,rI,ae,Kt,ot,k=v(()=>{"use strict";Ep();Dp();_p();jp();Ft();pe();N();ne();qi();Wp();qp();ad=new Set,dd=()=>{for(let e of ad)e()},nI=e=>(ad.add(e),()=>ad.delete(e));f=()=>{if(!Pt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Pt},He=()=>Pt?l("Retrieved state",Pt):i("State not initialized. Call initWorkspaceState() first.");Kn=!1,Ro=null;Wc=()=>Kn,E=e=>Ie(t=>({...t,...e}));Ve=()=>tI(nI,f,f),rI=Uc,ae=e=>f()?.renderedChildrenIndex[e]??[],Kt=()=>id?Hr(id):i("Cannot reset state: no initial workspace found"),ot=()=>Pt!==void 0});var zn,oI,yn,I,le=v(()=>{"use strict";It();fe();N();k();Et();zn=(e,t)=>{let{nodes:n}=f(),r=n[e];if(!r)return i("Node not found");if(r.context===t)return l("Resolved ancestor node",r);let o=new Set([r.id]),s=r.parentNodeId?n[r.parentNodeId]:void 0;for(;s&&!o.has(s.id);){if(s.context===t)return l("Resolved ancestor node",s);o.add(s.id),s=s.parentNodeId?n[s.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},oI=(e,t)=>{let{nodes:n}=f(),r=new Set,o=n[e];for(;o?.parentNodeId&&!r.has(o.id);){if(o.parentNodeId===t)return!0;r.add(o.id),o=n[o.parentNodeId]}return!1},yn=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:i("Node not found"),I={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.userId&&n.userId!==t)return i("Contributor is already linked to another user");let r={...n,userId:t},o=Ie(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?i("Unable to link contributor to user"):l("Linked contributor to user",r)},deleteNode(e){Ie(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create comment, missing issue");if(!P(t))return i("Can only comment on issues");let n=Yn("comments",e.id,{...e,deleted:!1});return a(n)?i("Unable to create comment"):l("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return i("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return i("Unable to edit comment, missing issue");if(!P(r))return i("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=Yn("comments",e,o);return a(s)?i("Unable to edit comment"):l("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return i("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=Yn("comments",e,n);return a(r)?i("Unable to delete comment"):l("Deleted comment",n)},getComment(e){return f().comments?.[e]},getCommentsByIssue(e){return Object.values(f().comments??{}).filter(t=>t.issue===e&&!t.deleted)},getCommentsGroupedByIssue(){let e=new Map;for(let t of Object.values(f().comments??{})){if(t.deleted)continue;let n=e.get(t.issue);n?n.push(t):e.set(t.issue,[t])}return e},createAttachment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create attachment, missing issue");if(!P(t))return i("Can only attach to issues");let n=Ie(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?i("Unable to create attachment"):l("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return i("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=Ie(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return a(r)?i("Unable to delete attachment"):l("Deleted attachment",n)},getAttachment(e){return f().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(f().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},getAttachmentsGroupedByIssue(){let e=new Map;for(let t of Object.values(f().attachments??{})){if(t.deleted)continue;let n=e.get(t.issue);n?n.push(t):e.set(t.issue,[t])}return e},editValue(e,t){let{nodes:n}=f(),r=n[e];if(!r)return i("Edit target node not found");let o=yn(r,"edit");if(o)return o;let s={...r,props:{...r.props,description:t}};return this.updateNode(s),l("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return i("Rename target node not found");let r=yn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),l("Renamed node",o)},getExistingTags(){let{tags:e}=f();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=f();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return ce(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=f(),o=this.getNode(e),s=this.getNode(t);if(!o)return i("Node not found");if(!s)return i("Target parent not found");if(r===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let d=yn(o,"move");if(d)return d;if(oI(t,e))return i("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=f(),o=this.getNode(e);if(!o)return i("Node not found");if(r===e)return i("Cannot delete root node");let s=yn(o,"delete");if(s)return s;let d=new Set,c=m=>{let p=t[m];if(!(!p||d.has(m))){d.add(m);for(let g of ce(p.id))c(g.id)}};c(e);let u={...structuredClone(t)};for(let m of d){if(!u[m])return i("Unable to locate node to delete");u[m]={...u[m],isDeleted:!0}}return n?(E({nodes:u}),l("Successfully tomb stoned",o)):i("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return i("Contributor not found");let n={...t,name:ko,tombstoned:!0},r=Ie(o=>({...o,contributors:{...o.contributors,[e]:n}}));return a(r)?i("Unable to remove contributor"):l("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.tombstoned)return i("Cannot rename a removed contributor");let r={...n,name:t},o=Ie(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?i("Unable to rename contributor"):l("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");let r={...n,name:t,tombstoned:!1},o=Ie(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?i("Unable to restore contributor"):l("Restored contributor",r)},createContributor(e){let t=Ie(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?i("Unable to create contributor"):l("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return i("Unable to assign contributor, missing contributor");if(!r)return i("Unable to assign contributor, missing target");let o=yn(r,"edit");if(o)return o;if(!P(r))return i("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return i("Contributor already assigned");let d={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(d),l("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!r)return i("Unable to unassign, missing target");let o=yn(r,"edit");if(o)return o;if(!P(r))return i("Target is not an issue");let s=r.props.assignees??[];if(!s.includes(t))return l("Issue is not assigned to that contributor",{assignee:t});let d={...r,props:{...r.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(d),l("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return i("Unable to add tag, missing tag");if(!r)return i("Unable to add tag, missing target");let o=yn(r,"edit");if(o)return o;if(!P(r))return i("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return i("Tag already assigned");let d={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(d),l("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),r=this.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!r)return i("Unable to remove tag, missing target");let o=yn(r,"edit");if(o)return o;if(!P(r))return i("Target is not an issue");let s=r.props.tags??[];if(!s.includes(t))return l("Issue is not tagged with that tag",{tag:t});let d={...r,props:{...r.props,tags:s.filter(c=>c!==t)}};return this.updateNode(d),l("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return i("Tag not found");let n={...t,tombstoned:!0},r=Ie(o=>({...o,tags:{...o.tags,[e]:n}}));return a(r)?i("Unable to delete tag"):l("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return i("Tag not found");let r={...n,name:t,tombstoned:!1},o=Ie(s=>({...s,tags:{...s.tags,[e]:r}}));return a(o)?i("Unable to restore tag"):l("Restored tag",r)},createTag(e){let t=Ie(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?i("Could not create tag"):l("Tag created",e)},createNode(e){let t=Yn("nodes",e.id,e);return a(t)?i("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},r=Yn("nodes",e,n);return a(r)?i(r.message):l("Locked node",n)},updateNode(e){let t=Yn("nodes",e.id,e);return a(t)?t:l("Updated node",e)},getContributor(e){return f().contributors[e]},getTag(e){let t=f().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return f().tags[e]},getTags(){return Object.values(f().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return f().nodes[e]},getSiblings(e){return ce(e)}}});import bn from"chalk";import Vp from"string-width";var sI,iI,ld,aI,dI,zp,Kp,cI,lI,uI,mI,pI,od,Yp,xo=v(()=>{"use strict";ct();le();k();wt();_s();sI=(e,t)=>e+" ".repeat(Math.max(0,t-Vp(e))),iI=(e,t)=>" ".repeat(Math.max(0,t-Vp(e)))+e,ld=e=>({"add.issue":"Created with title","add.issue.assignee":"Assigned to","remove.issue.assignee":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","add.issue.tag":"Tagged with","remove.issue.tag":"Removed tag","lock.node":"Locked node","move.node":"Moved issue","add.issue.comment":"Commented","delete.issue.comment":"Deleted comment","add.issue.attachment":"Attached","delete.issue.attachment":"Removed attachment","edit.issue.comment":"Edited comment","init.workspace":"Created workspace","add.workspace":"Created workspace","add.board":"Created board","add.swimlane":"Created swimlane","add.field":"Added field","create.tag":"Created tag","tombstone.tag":"Deleted tag","restore.tag":"Restored tag","create.contributor":"Added contributor","rename.contributor":"Renamed contributor","link.contributor.user":"Linked contributor","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),aI=(e,t)=>t?e<t?"up":e>t?"down":null:null,dI=(e,t)=>{let n=I.getNode(e.payload.parent),r=n?bn.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=aI(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},zp=e=>`${Math.max(1,Math.round(e/1024))} KB`,Kp=e=>I.getAttachment(e)?.name??"",cI=e=>{switch(e.action){case"add.issue.tag":{let t=f().tags[e.payload.tag];return t?bn.bgHex(Pe(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=f().tags[e.payload.tag];return t?bn.bgHex(Pe(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=f().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=f().contributors[e.payload.assignee];return t?bn.hex(Pe(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=f().contributors[e.payload.assignee];return t?bn.hex(Pe(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;case"add.issue.attachment":return`"${e.payload.name}" ${bn.dim(`(${zp(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Kp(e.payload.id);return t?`"${t}"`:""}default:return""}},lI=e=>{let t=yr(dt(e));return bn.gray(iI(t,8))},uI=12,mI=e=>sI(`${e}`,uI),pI=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=f().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=f().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=f().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"edit.title":return"name"in e.payload?`"${e.payload.name}"`:"";case"move.node":{let t=I.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${zp(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Kp(e.payload.id);return t?`"${t}"`:""}default:return""}},od=e=>[ld(e.action),pI(e)].filter(Boolean).join(" "),Yp=(e,t)=>{let n=lI(e.id),r=mI(e.userName),o=bn.dim("\u203A"),s=e.action==="move.node"?dI(e,t):[ld(e.action),cI(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`}});var Jp={};To(Jp,{areVirtualNodesEnabled:()=>Yo,createOrUpdateVirtualField:()=>So,createOrUpdateVirtualFieldList:()=>ud,materializeTicketVirtualNodes:()=>Ko,materializeVirtualNodes:()=>EI,setVirtualNodesEnabled:()=>xI});var gI,fI,hI,vI,yI,bI,So,ud,Ko,II,Xp,xI,Yo,EI,Li=v(()=>{"use strict";xo();fe();N();tr();le();Tn();k();Zn();dr();gI=e=>Ae(e,"comments"),fI=e=>Ae(e,"description"),hI=e=>Ae(e,"assignees"),vI=e=>Ae(e,"tags"),yI=e=>Ae(e,"history"),bI=e=>Ae(e,"attachments"),So=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:d="horizontal"})=>{let c=I.getNode(e);if(!c){let p=I.createNode({...Ce.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:d});return a(p)?p:l("Virtual field created",void 0)}if(!Ye(c))return i(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==r||c.props.value!==o||c.readonly!==s||c.childRenderAxis!==d))return l("Virtual field unchanged",void 0);let m=I.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:d});return a(m)?m:l("Virtual field updated",void 0)},ud=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let d=I.getNode(e);if(!d){let m=I.createNode({...Ce.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return a(m)?m:l("Virtual field list created",void 0)}if(!Tr(d))return i(`Existing virtual node ${e} is not a field list`);if(!(d.title!==t||d.parentNodeId!==n||d.rank!==r||d.readonly!==o||d.childRenderAxis!==s))return l("Virtual field list unchanged",void 0);let u=I.updateNode({...d,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return a(u)?u:l("Virtual field list updated",void 0)},Ko=e=>{let t=tt(xt/4n),n=tt(xt/2n),r=tt(xt*3n/4n),o=tt(xt*7n/8n),s=tt(xt*15n/16n),d=tt(xt*13n/16n);if(a(t))return t;if(a(n))return n;if(a(r))return r;if(a(o))return o;if(a(s))return s;if(a(d))return d;let c=So({id:fI(e.id),name:ie.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(a(c))return c;let u=ud({id:hI(e.id),name:ie.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(a(u))return u;let m=ud({id:vI(e.id),name:ie.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(a(m))return m;let p=So({id:gI(e.id),name:ie.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(a(p))return p;let g=So({id:bI(e.id),name:ie.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(a(g))return g;let x=So({id:yI(e.id),name:ie.HISTORY,parentNodeId:e.id,rank:d.value,value:II(e),readonly:!0,childRenderAxis:"vertical"});return a(x)?x:l("Ticket virtual nodes materialized",void 0)},II=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=>Yp(r,n.get(r.action)??[])).join(`
74
+ `)},Xp=!0,xI=e=>{Xp=e},Yo=()=>Xp,EI=()=>{let{nodes:e}=f();for(let t of Object.values(e)){if(!P(t))continue;let n=Ko(t);if(a(n))return n}return l("Virtual nodes materialized",void 0)}});var RI,Qp,md=v(()=>{"use strict";ct();Ht();Wr();xo();N();wt();RI=e=>{let t=new Map,n=new Set,r=o=>{let s=new Set,d=o;for(;d&&!s.has(d);){if(n.has(d))return d;s.add(d),d=t.get(d)}return null};return e.map(o=>{let s=o.payload,d=s?.id;if(!d)return null;o.action==="add.board"&&n.add(d);let c=s.parent??s.issue;return c&&t.set(d,c),n.has(d)?d:r(d)})},Qp=(e,t)=>{let n=RI(e);return e.filter((r,o)=>n[o]===t)}});var SI,Zp,eg,pd,gd=v(()=>{"use strict";pt();ut();nn();Ka();Ht();Ut();N();Ft();Rs();ne();k();md();SI=null,Zp=Promise.resolve(),eg=e=>{let t=Zp.then(e,e);return Zp=t.then(()=>{},()=>{}),t},pd=()=>{if(!ot())return{mode:"live",asOfTime:null};let{timeMode:e}=f();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:SI}}});import ng from"node:fs";import NI from"node:path";import{ulid as G}from"ulid";async function dg(e){let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=n.value.nodes,o=e.query?.trim().toLowerCase(),s=Object.values(r).filter(P).filter(c=>!c.isDeleted).filter(c=>e.includeClosed||c.parentNodeId!==ye).filter(c=>e.boardId?(c.parentNodeId?r[c.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).filter(c=>!e.swimlaneId||c.parentNodeId===e.swimlaneId).filter(c=>!e.tag||Qs(c).some(u=>tg(u.name,e.tag))).filter(c=>!e.assignee||Zs(c).some(u=>tg(u.name,e.assignee))).filter(c=>!o||c.title.toLowerCase().includes(o)||(c.props.description??"").toLowerCase().includes(o)),d=c=>Se((c.parentNodeId?r[c.parentNodeId]?.title:void 0)??"");return e.brief?l("Listed issues",s.map(c=>({id:c.id,ref:z(c.id),title:Se(c.title),swimlane:d(c),tags:Qs(c).map(u=>u.name),assignees:Zs(c).map(u=>u.name)}))):l("Listed issues",s.map(c=>({id:c.id,ref:z(c.id),title:Se(c.title),description:c.props.description??"",createdAt:dt(c.id),parentNodeId:c.parentNodeId,isClosed:c.parentNodeId===ye,readonly:!!c.readonly,tags:Qs(c),assignees:Zs(c)})))}async function lg(e){let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=fd(e);if(a(r))return r;let o=s=>MI(s,n.value,t.value.stateBranchRoot);return e.issueIds?ni("Closed",og(r.value,o)):o(r.value[0])}async function mg(e){let t=ri(e.repoRoot);if(a(t))return t;let n=se();if(a(n))return n;let r=Ne({repoRoot:t.value});if(a(r))return r;let o=jt(r.value);if(a(o))return o;let s=dn(o.value.events,o.value.unreadable);if(a(s))return s;let d=fd(e);if(a(d))return d;let c=u=>kI(u,e,n.value,r.value);return e.issueIds?ni("Moved",og(d.value,c)):c(d.value[0])}async function xg(e){let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=fd(e);if(a(r))return r;let o=Se(e.tagName).trim();if(!o)return i("Tag name cannot be empty");let s=vt("Tag name",o,60);if(s)return i(s);let d={done:[],failed:[]};for(let S of r.value){let C=hd(S);a(C)?d.failed.push({id:S,ref:z(S),reason:C.message}):d.done.push({id:S,ref:z(S)})}if(!e.issueIds&&d.failed[0])return i(d.failed[0].reason);if(d.done.length===0)return i(ni("Tagged",d).message);let c=I.findTagByName(o),u=c?.id??G(),m=[...c?[]:[{id:G(),...n.value,action:"create.tag",payload:{id:u,name:o}}],...d.done.map(({id:S})=>({id:G(),...n.value,action:"add.issue.tag",payload:{id:S,tag:u}}))],p=B(m,t.value.stateBranchRoot);if(a(p))return i(p.message);let g={id:u,name:o};if(!e.issueIds)return l("Added issue tag",{...d.done[0],tag:g});let x=ni("Tagged",d);return a(x)?x:l(x.message,{...x.value,tag:g})}var CI,AI,ri,Js,ee,se,te,Qs,TI,rg,wI,Zs,fd,ni,og,hd,sg,ig,ag,tg,cg,MI,ug,kI,pg,gg,fg,hg,vg,yg,iU,bg,Ig,Eg,Rg,Sg,Ng,Cg,Ag,Tg,LI,wg,Mg,kg,Lg,Pg,Dg,Og,Bg=v(()=>{"use strict";pt();ut();Pr();Jr();Zi();Qn();Hn();td();ct();Vr();Wr();ne();Ht();On();ht();md();Va();nr();fe();N();le();Et();k();is();to();ne();It();xo();wt();mo();nn();Qt();ao();Rt();gd();CI=e=>{if(e.filePath)try{return l("Read attachment file",{data:ng.readFileSync(e.filePath),name:e.name??NI.basename(e.filePath)})}catch(t){return i(`Unable to read ${e.filePath}: ${t instanceof Error?t.message:String(t)}`)}return e.dataBase64?l("Decoded attachment data",{data:Buffer.from(e.dataBase64,"base64"),name:e.name??"image"}):i("Provide either filePath or dataBase64")},AI=()=>{let e=pa();return a(e)?qt:e.value.attachmentMaxKb??qt},ri=e=>{let t=Xe(e??process.cwd());return a(t)?i(t.message):l("Resolved Epiq repo root",t.value)},Js=null,ee=async(e,t)=>{let n=ri(e);if(a(n))return n;let r=Ne({repoRoot:n.value});if(a(r))return i(r.message);let o=Zt(n.value);if(a(o))return i(o.message);if(!(Js!==null&&Js.repoRoot===n.value&&Js.stateBranchRoot===r.value&&ng.existsSync(Rn(r.value)))){let p=await Yi({repoRoot:n.value,stateBranchName:o.value});if(a(p))return i(p.message);let g=await _n({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(a(g))return i(g.message);Js={repoRoot:n.value,stateBranchRoot:r.value}}if(t?.pull??!1){let p=await W({cwd:r.value,args:["pull","--ff-only"]});a(p)&&X.info(3,p.message)}let d={repoRoot:n.value,stateBranchRoot:r.value},c=kn(r.value);if(fc(r.value)===c&&ot()&&pd().mode==="live")return l("Booted Epiq state, unchanged",d);let u=jt(r.value);if(a(u))return i(u.message);let m=dn(u.value.events,u.value.unreadable);return a(m)?i(m.message):(hc(r.value,c),l("Booted Epiq state",d))},se=()=>{let e=pa();return a(e)?i(e.message):e.value.userId?e.value.userName?l("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},te=()=>{let e=He();return a(e)?i(e.message):e},Qs=e=>(e.props.tags??[]).map(t=>I.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:Pe(t.name)})),TI=()=>{let e=He(),t=a(e)?[]:e.value.eventLog??[],n=new Map;for(let r of t)r.userId&&r.userName&&n.set(r.userId,r.userName);return n},rg=(e,t)=>{let n=new Map(e);for(let r of Object.values(t))n.set(r.id,r.name);return n},wI=e=>I.getCommentsByIssue(e).sort((t,n)=>t.id<n.id?-1:t.id>n.id?1:0).map(t=>({id:t.id,author:I.getContributor(t.authorId)?.name??t.authorName??"Unknown",createdAt:dt(t.id),body:t.md})),Zs=e=>(e.props.assignees??[]).map(t=>I.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:Pe(n)})),fd=e=>{let t=[...new Set([...e.issueIds??[],...e.issueId?[e.issueId]:[]])];return t.length?l("Resolved targets",t):i("Provide issueId or issueIds")},ni=(e,t)=>{let n=t.done.length,r=`${e} ${n} issue${n===1?"":"s"}`+(t.failed.length?`, ${t.failed.length} failed`:"");return n?l(r,t):i(`${r}: ${t.failed.map(o=>`${o.ref} ${o.reason}`).join("; ")}`)},og=(e,t)=>{let n={done:[],failed:[]};for(let r of e){let o=t(r);a(o)?n.failed.push({id:r,ref:z(r),reason:o.message}):n.done.push({id:r,ref:z(r)})}return n},hd=e=>{let t=te();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?i("Issue not found"):P(n)?n.readonly?i("Issue is readonly"):l("Found issue",n):i("Target must be an issue")},sg=async(e={})=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="BOARD"&&!o.isDeleted).map(o=>({id:o.id,ref:z(o.id),title:o.title,parentId:o.parentNodeId,readonly:!!o.readonly}));return l("Listed boards",r)},ig=async(e={})=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="SWIMLANE"&&!o.isDeleted).filter(o=>!e.boardId||o.parentNodeId===e.boardId).map(o=>({id:o.id,title:o.title,boardId:o.parentNodeId,isClosed:o.id===ye,readonly:!!o.readonly}));return l("Listed swimlanes",r)},ag=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();if(a(n))return n;let r=e.idOrRef.trim();if(!r)return i("Provide an issue id or ref");let o=Object.values(n.value.nodes).filter(P).filter(u=>!u.isDeleted),s=o.find(u=>u.id===r),d=s?[s]:o.filter(u=>Ur(u.id,r));if(d.length===0)return i(`No issue matches "${r}"`);if(d.length>1)return i(`"${r}" matches ${d.length} issues: ${d.map(u=>`${z(u.id)} (${Se(u.title)})`).join(", ")}. Use a full ref or id.`);let c=d[0];return l("Found issue",{id:c.id,ref:z(c.id),title:Se(c.title),description:c.props.description??"",createdAt:dt(c.id),parentNodeId:c.parentNodeId,isClosed:c.parentNodeId===ye,readonly:!!c.readonly,tags:Qs(c),assignees:Zs(c),comments:wI(c.id)})},tg=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase();cg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=Se(e.title);if(!o)return i("Issue title cannot be empty");let s=e.description??"",d=vt("Issue title",o,300)??vt("Issue description",s,2e4);if(d)return i(d);if((e.tagNames?.length??0)>20)return i(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return i(`Cannot set more than ${20} assignees at once`);let c=Fn(e.parentId,n.value,t.value.stateBranchRoot);if(a(c))return c;let u=Gs({name:o,parent:e.parentId,user:n.value,rank:c.value});if(a(u))return u;let m=[...u.value],p=m.find(C=>C.action==="add.issue")?.payload.id;if(!p)return i("Unable to determine created issue id");s&&m.push({id:G(),...n.value,action:"edit.description",payload:{id:p,md:s}});let g=[];for(let C of e.tagNames??[]){let M=Se(C).trim();if(!M||g.some(O=>O.name===M))continue;let w=vt("Tag name",M,60);if(w)return i(w);let T=I.findTagByName(M),_=T?.id??G();T||m.push({id:G(),...n.value,action:"create.tag",payload:{id:_,name:M}}),m.push({id:G(),...n.value,action:"add.issue.tag",payload:{id:p,tag:_}}),g.push({id:_,name:M})}let x=[];for(let C of e.assigneeNames??[]){let M=Se(C).trim();if(!M||x.some(O=>O.name===M))continue;let w=vt("Assignee name",M,80);if(w)return i(w);let T=Object.values(r.value.contributors).find(O=>O.name===M),_=T?.id??G();T||m.push({id:G(),...n.value,action:"create.contributor",payload:{id:_,name:M}}),m.push({id:G(),...n.value,action:"add.issue.assignee",payload:{id:p,assignee:_}}),x.push({id:_,name:M})}let S=B(m,t.value.stateBranchRoot);return a(S)?i(S.message):l("Created issue",{id:p,ref:z(p),title:o,parentId:e.parentId,description:s,tags:g,assignees:x})},MI=(e,t,n)=>{let r=hd(e);if(a(r))return r;let o=an(ye,e,{at:"end"},t,n);if(a(o))return o;let s={id:G(),...t,action:"close.issue",payload:{id:e,parent:ye,rank:o.value}},d=B([s],n);return a(d)?i(d.message):l("Closed issue",{id:e,ref:z(e)})};ug=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Target node is not issue");if(o.parentNodeId!==ye)return i("Issue is not closed");let s=js(o);if(!s)return i("Unable to resolve previous parent from issue history");if(s===ye)return i("Previous parent resolves to closed swimlane");let d=r.value.nodes[s];if(!d)return i("Previous parent no longer exists");let c=an(d.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(a(c))return c;let u={id:G(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:d.id,rank:c.value}},m=B([u],t.value.stateBranchRoot);return a(m)?i(m.message):l("Reopened issue",{id:o.id,ref:z(o.id),parentId:d.id})},kI=(e,t,n,r)=>{let o=hd(e);if(a(o))return o;let s=an(t.parentId,e,t.position??{at:"end"},n,r);if(a(s))return s;let d={id:G(),...n,action:"move.node",payload:{id:e,parent:t.parentId,rank:s.value}},c=B([d],r);return a(c)?i(c.message):l("Moved issue",{id:e,ref:z(e),parentId:t.parentId})};pg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.boardId];if(!o)return i("Board not found");if(!Lo(o))return i("Target parent must be a board");if(o.readonly)return i("Cannot add a swimlane to a readonly board");if(pd().mode!=="live")return i("Cannot add a swimlane while time travelling");let s=Se(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let d=vt("Swimlane title",s,300);if(d)return i(d);let c=Fn(e.boardId,n.value,t.value.stateBranchRoot);if(a(c))return c;let u=G(),m={id:G(),...n.value,action:"add.swimlane",payload:{id:u,name:s,parent:e.boardId,rank:c.value}},p=B([m],t.value.stateBranchRoot);return a(p)?i(p.message):l("Created swimlane",{id:u,ref:z(u),title:s,boardId:e.boardId})},gg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!In(o))return i("Edit target must be a swimlane");if(o.readonly)return i("Cannot edit readonly swimlane");let s=Se(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let d=vt("Swimlane title",s,300);if(d)return i(d);if(o.title===s)return l("No changes made",{id:e.swimlaneId,ref:z(e.swimlaneId),title:s});let c={id:G(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},u=B([c],t.value.stateBranchRoot);return a(u)?i(u.message):l("Edited swimlane title",{id:e.swimlaneId,ref:z(e.swimlaneId),title:s})},fg=async e=>{let t=ri(e.repoRoot);if(a(t))return t;let n=se();if(a(n))return n;let r=Ne({repoRoot:t.value});if(a(r))return r;let o=jt(r.value);if(a(o))return o;let s=dn(o.value.events,o.value.unreadable);if(a(s))return s;let d=an(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(a(d))return d;let c={id:G(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:d.value}},u=B([c],r.value);return a(u)?i(u.message):l("Moved swimlane",{id:e.swimlaneId,ref:z(e.swimlaneId),boardId:e.boardId})},hg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!In(o))return i("Delete target must be a swimlane");let s={id:G(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):l("Deleted swimlane",{id:e.swimlaneId,ref:z(e.swimlaneId)})},vg=async(e={})=>{os();let t=ri(e.repoRoot);if(a(t))return i("Sync failed");let n=se();if(a(n))return n;let r=await ls({cwd:t.value,ownEventFileName:Dn(n.value)});return a(r)?(Vi(r.message),r):(ss(),l("Synced",r.value))},yg=async(e={})=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=te();return a(n)?n:l("Retrieved Epiq state",{root:t.value.repoRoot,stateBranchRoot:t.value.stateBranchRoot,nodes:n.value.nodes,rootNodeId:n.value.rootNodeId,contextNode:n.value.contextNode,selectedIndex:n.value.selectedIndex,eventLog:n.value.eventLog})},iU=365*24*60*60*1e3,bg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=vt("Issue description",e.description,2e4);if(s)return i(s);let d=o.props.description??"";if(d===e.description)return l("No changes made",{id:e.issueId,ref:z(e.issueId),description:d});let c={id:G(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},u=B([c],t.value.stateBranchRoot);return a(u)?i(u.message):l("Edited issue description",{id:e.issueId,ref:z(e.issueId),description:e.description})},Ig=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=Se(e.title);if(!s.trim())return i("Issue title cannot be empty");let d=vt("Issue title",s,300);if(d)return i(d);if(o.title===s)return l("No changes made",{id:e.issueId,ref:z(e.issueId),title:s});let c={id:G(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},u=B([c],t.value.stateBranchRoot);return a(u)?i(u.message):l("Edited issue title",{id:e.issueId,ref:z(e.issueId),title:s})};Eg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.tags[e.tagId];if(!o)return i("Tag not found");if(o.tombstoned)return i("Tag is already deleted");let s=[{id:G(),...n.value,action:"tombstone.tag",payload:{id:e.tagId}}],d=B(s,t.value.stateBranchRoot);return a(d)?i(d.message):l("Deleted tag",{id:o.id,name:o.name})},Rg=async e=>{let t=ci(e.name,"name");if(a(t))return i(t.message);let n=await ee(e.repoRoot,{pull:!1});if(a(n))return n;let r=se();if(a(r))return r;let o=te();if(a(o))return o;let s=r.value,d=!!o.value.contributors[s.userId];if(!d){let c=B([{id:G(),...s,action:"create.contributor",payload:{id:s.userId,name:s.userName}}],n.value.stateBranchRoot);if(a(c))return i(c.message)}return l(`Assumed ${s.userName}`,{...s,registered:!d})},Sg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.tags[e.tagId];if(!o)return i("Tag not found");if(!o.tombstoned)return i("Tag is not deleted");if(I.findTagByName(o.name))return i(`Cannot restore: another tag is already named "${o.name}"`);let s=[{id:G(),...n.value,action:"restore.tag",payload:{id:e.tagId,name:o.name}}],d=B(s,t.value.stateBranchRoot);return a(d)?i(d.message):l("Restored tag",{id:o.id,name:o.name})},Ng=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Untag target must be an issue");if(o.readonly)return i("Cannot untag readonly issue");if(!r.value.tags[e.tagId])return i("Tag not found");let s={id:G(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):l("Removed issue tag",{id:e.issueId,ref:z(e.issueId),tagId:e.tagId})},Cg=async(e,t)=>{let n=$i(e);if(a(n))return;let r;for(let o of n.value)o.userId===t&&(r=o.userName??r);return r===void 0?void 0:{id:t,name:r}},Ag=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Assign target must be an issue");if(o.readonly)return i("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let w=r.value.contributors[s],T=w?void 0:await Cg(t.value.stateBranchRoot,s);if(!w&&!T)return i("Unknown assignee id");let _=w??T,O=[...w?[]:[{id:G(),...n.value,action:"create.contributor",payload:{id:_.id,name:_.name}}],{id:G(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:_.id}}],$=B(O,t.value.stateBranchRoot);return a($)?i($.message):l("Added issue assignee",{id:e.issueId,ref:z(e.issueId),assignee:{id:_.id,name:_.name}})}let d=Se(e.assigneeName??"").trim();if(!d)return i("Provide assigneeId, self or assigneeName");let c=vt("Assignee name",d,80);if(c)return i(c);let m=[...rg(TI(),r.value.contributors).entries()].filter(([,w])=>w===d);if(m.length>1)return i(`"${d}" matches ${m.length} contributors (${m.map(([w])=>w).join(", ")}). Assign by assigneeId to choose.`);let p=m[0];if(!p&&!e.createUnlinked)return i(`No contributor named "${d}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[g=G(),x=d]=p??[],C=[...!!r.value.contributors[g]?[]:[{id:G(),...n.value,action:"create.contributor",payload:{id:g,name:x}}],{id:G(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:g}}],M=B(C,t.value.stateBranchRoot);return a(M)?i(M.message):l("Added issue assignee",{id:e.issueId,ref:z(e.issueId),assignee:{id:g,name:x}})},Tg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;if(!r.value.contributors[e.contributorId])return i("Contributor not found");if(await Cg(t.value.stateBranchRoot,e.contributorId))return i("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let d=[{id:G(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],c=B(d,t.value.stateBranchRoot);return a(c)?i(c.message):l("Tombstoned contributor",{id:e.contributorId,name:ko})},LI=async(e,t)=>{let n=Ln(e);if(a(n))return;let r;for(let o of n.value){if(o.action!=="create.contributor")continue;let s=o.payload;s.id===t&&s.name&&(r=s.name)}return r},wg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.contributors[e.contributorId];if(!o)return i("Contributor not found");if(!o.tombstoned)return i("Contributor is not tombstoned");let s=await LI(t.value.stateBranchRoot,e.contributorId);if(!s)return i("Cannot restore this contributor \u2014 no original name found in the event log");let d=[{id:G(),...n.value,action:"restore.contributor",payload:{id:e.contributorId,name:s}}],c=B(d,t.value.stateBranchRoot);return a(c)?i(c.message):l("Restored contributor",{id:e.contributorId,name:s})},Mg=async(e={})=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=Ln(t.value.stateBranchRoot);if(a(o))return i(o.message);let s=e.boardId?Qp(o.value,e.boardId):o.value,d=new Map,c=new Set,u=new Set,m=$i(t.value.stateBranchRoot);if(a(m))return i(m.message);for(let S of m.value)S.userId&&u.add(S.userId);for(let S of s)S.userId&&(d.set(S.userId,S.userName??""),c.add(S.userId));let p=r.value.contributors,x=[...rg(d,p).entries()].map(([S,C])=>({id:S,name:C,color:Pe(C),isSelf:S===n.value.userId,isExternal:!c.has(S),isRemoved:p[S]?.tombstoned===!0,hasAuthoredAnywhere:u.has(S)}));return l("Listed board contributors",x)},kg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Unassign target must be an issue");if(o.readonly)return i("Cannot unassign readonly issue");if(!r.value.contributors[e.assigneeId])return i("Assignee not found");let s={id:G(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):l("Removed issue assignee",{id:e.issueId,ref:z(e.issueId),assigneeId:e.assigneeId})},Lg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Comment target must be an issue");if(o.readonly)return i("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return i("Comment cannot be empty");if(s.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let d=G(),c={id:G(),...n.value,action:"add.issue.comment",payload:{id:d,issue:e.issueId,md:s,author:n.value.userId}},u=B([c],t.value.stateBranchRoot);return a(u)?i(u.message):l("Added issue comment",{id:d,issueId:e.issueId,body:s})},Pg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!o)return i("Unable to resolve comment");if(o.payload.author!==n.value.userId)return i("You can only delete your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!P(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot delete comment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return l("Comment already deleted",{id:e.commentId,issueId:o.payload.issue});let c={id:G(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},u=B([c],t.value.stateBranchRoot);return a(u)?i(u.message):l("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},Dg=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.eventLog.find(p=>p.action==="add.issue.comment"&&p.payload.id===e.commentId);if(!o)return i("Unable to resolve comment");if(o.payload.author!==n.value.userId)return i("You can only edit your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!P(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot edit comment on readonly issue");if(r.value.eventLog.some(p=>p.action==="delete.issue.comment"&&p.payload.id===e.commentId))return i("Comment was deleted");let c=e.body.trim();if(!c)return i("Comment cannot be empty");if(c.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${c.length})`);let u={id:G(),...n.value,action:"edit.issue.comment",payload:{id:e.commentId,issue:o.payload.issue,md:c}},m=B([u],t.value.stateBranchRoot);return a(m)?i(m.message):l("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:c})},Og=async e=>{let t=await ee(e.repoRoot,{pull:!1});if(a(t))return t;let n=se();if(a(n))return n;let r=te();if(a(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!P(o))return i("Attachment target must be an issue");if(o.readonly)return i("Cannot attach to readonly issue");let s=CI(e);if(a(s))return s;let d=Yl(t.value.stateBranchRoot,s.value.data,AI());if(a(d))return d;let c=Se(s.value.name).trim()||"image",u=G(),m={id:G(),...n.value,action:"add.issue.attachment",payload:{id:u,issue:e.issueId,author:n.value.userId,hash:d.value.hash,ext:d.value.ext,name:c,bytes:d.value.bytes}},p=B([m],t.value.stateBranchRoot);if(a(p))return i(p.message);let g=io(d.value.hash,d.value.ext);return l("Added issue attachment",{id:u,issueId:e.issueId,fileName:g,bytes:d.value.bytes,markdown:ga(c,g)})}});var Ug={};To(Ug,{createMcpServer:()=>_g,resultJson:()=>Fg,startMcpServer:()=>BI});import{McpServer as DI}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as OI}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as y}from"zod";var Fg,J,_g,BI,$g=v(()=>{"use strict";N();mo();Bg();gd();Fg=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),J=e=>t=>eg(async()=>Fg(await e(t))),_g=()=>{let e=new DI({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:y.object({repoRoot:y.string().optional()})},J(yg)),e.registerTool("epiq_issue_list",{description:"List Epiq issues. Narrow with boardId, swimlaneId, tag, assignee or query (matched against title and description), and pass brief to get id, ref, title, swimlane, tag names and assignee names only \u2014 descriptions are the bulk of a board. Read one ticket with epiq_issue_get.",inputSchema:y.object({repoRoot:y.string().optional(),includeClosed:y.boolean().optional(),boardId:y.string().optional(),swimlaneId:y.string().optional(),tag:y.string().optional(),assignee:y.string().optional(),query:y.string().optional(),brief:y.boolean().optional()})},J(dg)),e.registerTool("epiq_issue_get",{description:"Get one Epiq issue by its full id or its 7-character ref, with its comments in log order. Use this rather than listing the whole board when you already know which issue you want, and rather than epiq_state_get to read a thread.",inputSchema:y.object({idOrRef:y.string().min(1),repoRoot:y.string().optional()})},J(ag)),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:y.object({repoRoot:y.string().optional()})},J(sg)),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:y.object({repoRoot:y.string().optional(),boardId:y.string().optional()})},J(ig)),e.registerTool("epiq_swimlane_create",{description:"Create an Epiq swimlane on a board",inputSchema:y.object({repoRoot:y.string().optional(),boardId:y.string().min(1),title:y.string().min(1).max(300)})},J(pg)),e.registerTool("epiq_swimlane_title_edit",{description:"Edit an Epiq swimlane title",inputSchema:y.object({repoRoot:y.string().optional(),swimlaneId:y.string().min(1),title:y.string().min(1).max(300)})},J(gg)),e.registerTool("epiq_swimlane_move",{description:"Move/reorder an Epiq swimlane, optionally to another board",inputSchema:y.object({repoRoot:y.string().optional(),swimlaneId:y.string().min(1),boardId:y.string().min(1),position:y.discriminatedUnion("at",[y.object({at:y.literal("start")}),y.object({at:y.literal("end")}),y.object({at:y.literal("before"),sibling:y.string().min(1)}),y.object({at:y.literal("after"),sibling:y.string().min(1)})]).optional()})},J(fg)),e.registerTool("epiq_swimlane_delete",{description:"Delete (archive) an Epiq swimlane. This also archives every issue contained in it.",inputSchema:y.object({repoRoot:y.string().optional(),swimlaneId:y.string().min(1)})},J(hg)),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue. Optionally set description, tags, and assignees atomically in the same call instead of separate follow-up edits.",inputSchema:y.object({title:y.string().min(1).max(300),parentId:y.string().min(1),repoRoot:y.string().optional(),description:y.string().max(2e4).optional(),tagNames:y.array(y.string().max(60)).max(20).optional(),assigneeNames:y.array(y.string().max(80)).max(20).optional()})},J(cg)),e.registerTool("epiq_issue_description_edit",{description:"Edit the markdown description of an Epiq issue",inputSchema:y.object({issueId:y.string().min(1),description:y.string().max(2e4),repoRoot:y.string().optional()})},J(bg)),e.registerTool("epiq_issue_title_edit",{description:"Edit the title of an Epiq issue",inputSchema:y.object({issueId:y.string().min(1),title:y.string().min(1).max(300),repoRoot:y.string().optional()})},J(Ig)),e.registerTool("epiq_issue_tag_add",{description:"Add a tag to an Epiq issue, or to many at once with issueIds, creating the tag if it does not exist",inputSchema:y.object({issueId:y.string().min(1).optional(),issueIds:y.array(y.string().min(1)).min(1).max(200).optional(),tagName:y.string().min(1).max(60),repoRoot:y.string().optional()})},J(xg)),e.registerTool("epiq_issue_tag_remove",{description:"Remove a tag from an Epiq issue",inputSchema:y.object({issueId:y.string().min(1),tagId:y.string().min(1),repoRoot:y.string().optional()})},J(Ng)),e.registerTool("epiq_contributor_list",{description:"List people who can be assigned: everyone who has authored an event (optionally scoped to one board) unioned with the contributor registry. Use these ids with epiq_issue_assignee_add rather than assigning by name.",inputSchema:y.object({boardId:y.string().min(1).optional(),repoRoot:y.string().optional()})},J(Mg)),e.registerTool("epiq_contributor_remove",{description:"Remove an external contributor from the assignee suggestion lists. Their id and every reference to it survive, so existing assignments stay intact and the event log is untouched. Refused for anyone who has authored events, since their name is in the log regardless.",inputSchema:y.object({contributorId:y.string().min(1),repoRoot:y.string().optional()})},J(Tg)),e.registerTool("epiq_tag_remove",{description:"Delete a tag from the whole workspace. It disappears from every ticket, picker and filter, but its id and history stay in the event log, and the name is free for a new tag.",inputSchema:y.object({tagId:y.string().min(1),repoRoot:y.string().optional()})},J(Eg)),e.registerTool("epiq_tag_restore",{description:"Put back a tag deleted with epiq_tag_remove, on every ticket that still carried it.",inputSchema:y.object({tagId:y.string().min(1),repoRoot:y.string().optional()})},J(Sg)),e.registerTool("epiq_contributor_restore",{description:"Put a contributor removed with epiq_contributor_remove back into the suggestion lists, under the name they were created with.",inputSchema:y.object({contributorId:y.string().min(1),repoRoot:y.string().optional()})},J(wg)),e.registerTool("epiq_issue_assignee_add",{description:"Assign a contributor to an Epiq issue. Pass self:true to assign yourself. Prefer assigneeId otherwise, which assigns a known contributor (from the registry or the event log) and fails if the id is unknown. assigneeName matches an existing contributor by name; to create somebody new from a name you must also pass createUnlinked, which adds them as an external (non-contributor) assignee.",inputSchema:y.object({issueId:y.string().min(1),assigneeId:y.string().min(1).optional(),self:y.boolean().optional(),assigneeName:y.string().min(1).max(80).optional(),createUnlinked:y.boolean().optional(),repoRoot:y.string().optional()})},J(Ag)),e.registerTool("epiq_issue_assignee_remove",{description:"Remove an assignee from an Epiq issue",inputSchema:y.object({issueId:y.string().min(1),assigneeId:y.string().min(1),repoRoot:y.string().optional()})},J(kg)),e.registerTool("epiq_issue_comment_add",{description:"Add a comment to an Epiq issue",inputSchema:y.object({issueId:y.string().min(1),body:y.string().min(1).max(4e3),repoRoot:y.string().optional()})},J(Lg)),e.registerTool("epiq_issue_attachment_add",{description:"Attach an image file to an Epiq issue. Returns `markdown` \u2014 paste it into a comment or description body to render the image inline.",inputSchema:y.object({issueId:y.string().min(1),filePath:y.string().min(1),name:y.string().min(1).max(200).optional(),repoRoot:y.string().optional()})},J(Og)),e.registerTool("epiq_issue_comment_delete",{description:"Delete a comment from an Epiq issue",inputSchema:y.object({commentId:y.string().min(1),repoRoot:y.string().optional()})},J(Pg)),e.registerTool("epiq_issue_comment_edit",{description:"Replace the body of one of your own comments on an Epiq issue",inputSchema:y.object({commentId:y.string().min(1),body:y.string().min(1).max(4e3),repoRoot:y.string().optional()})},J(Dg)),e.registerTool("epiq_issue_reopen",{description:"Reopen a closed Epiq issue, restoring it to its previous swimlane",inputSchema:y.object({issueId:y.string().min(1),repoRoot:y.string().optional()})},J(ug)),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue, or many at once with issueIds \u2014 one call, an outcome per ticket",inputSchema:y.object({issueId:y.string().min(1).optional(),issueIds:y.array(y.string().min(1)).min(1).max(200).optional(),repoRoot:y.string().optional()})},J(lg)),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane, or many at once with issueIds \u2014 one call, an outcome per ticket",inputSchema:y.object({issueId:y.string().min(1).optional(),issueIds:y.array(y.string().min(1)).min(1).max(200).optional(),parentId:y.string().min(1),position:y.discriminatedUnion("at",[y.object({at:y.literal("start")}),y.object({at:y.literal("end")}),y.object({at:y.literal("before"),sibling:y.string().min(1)}),y.object({at:y.literal("after"),sibling:y.string().min(1)})]).optional(),repoRoot:y.string().optional()})},J(mg)),e.registerTool("epiq_actor_assume",{description:'Take a board identity for the rest of this session, so your writes are attributed to you rather than to the user. Pass the name you announced \u2014 the model provider, a slash, then a short human first name, e.g. "claude/peter". Takes effect on the very next write; no relaunch. A name the server was launched with wins, and re-assuming the same name is harmless. Reuse an existing agent identity (epiq_contributor_list) before inventing one: a name is permanent once it has authored anything.',inputSchema:y.object({name:y.string().min(1).max(80),repoRoot:y.string().optional()})},J(Rg)),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote (pull remote changes and push local ones). Other Epiq MCP tools only read and write local state and never sync automatically \u2014 call this on demand when you need to see or publish the latest remote changes.",inputSchema:y.object({repoRoot:y.string().optional()})},J(vg)),e},BI=async()=>{let e=_g(),t=new OI;await e.connect(t)}});process.env.EPIQ_MCP="true";console.log=console.error;console.info=console.error;console.debug=console.error;console.warn=console.error;var{applyActorNameArgument:FI}=await Promise.resolve().then(()=>(Qn(),Rd)),{isFail:_I}=await Promise.resolve().then(()=>(N(),Id)),oi=process.argv.slice(2);oi.length>1&&(console.error(`Expected at most one name argument, got ${oi.length}`),process.exit(1));if(oi[0]!==void 0){let e=FI(oi[0],"The name argument");_I(e)&&(console.error(e.message),process.exit(1))}var{setVirtualNodesEnabled:UI}=await Promise.resolve().then(()=>(Li(),Jp));UI(!1);var{startMcpServer:$I}=await Promise.resolve().then(()=>($g(),Ug));await $I();