epiq 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,87 +1,92 @@
1
1
  #!/usr/bin/env node
2
- import Nt from"chalk";import{render as dE}from"ink";import cE from"meow";import lE from"react";import af from"chalk";import eg from"node:crypto";var nn={Success:"success",Fail:"fail"},i=e=>({status:nn.Fail,message:e,value:null}),l=(e,t)=>({status:nn.Success,message:e,value:t}),d=e=>e.status==="fail",de=e=>e.status==="success";var Wt="EPIQ_USER_NAME",Io="EPIQ_USER_ID",Ad="0123456789ABCDEFGHJKMNPQRSTVWXYZ",tg=26,Ii=80,Ei=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Eo=e=>e.trim().length>0&&e.length<=Ii,Vn=e=>e.trim().toLowerCase(),ng=e=>{let t=eg.createHash("sha256").update(`epiq:actor:${Vn(e)}`).digest(),n="";for(let r=0;r<tg;r++)n+=Ad[(t[r]??0)%Ad.length];return n},Kn=(e,t=process.env)=>{let n=(t[Wt]??"").trim(),r=(t[Io]??"").trim();return n?Eo(n)?!r&&e.userId&&e.userName&&Vn(e.userName)===Vn(n)?l("Actor override names the configured user",{userId:e.userId,userName:e.userName}):r&&!Ei(r)?i(`${Io} must be 26 characters of Crockford base32`):r&&e.userId&&r===e.userId?i(`${Io} 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||ng(n),userName:r?n:Vn(n)}):i(`${Wt} must be 1-${Ii} characters of text`):r?i(`${Io} is set without ${Wt}`):l("No actor override",null)},Td=(e,t,n=process.env)=>{let r=e.trim();if(!Eo(r))return i(`${t} must be 1-${Ii} characters of text`);let o=(n[Wt]??"").trim();return o&&Vn(o)!==Vn(r)?i(`${t} names ${r}, but ${Wt} names ${o}`):(n[Wt]=r,l("Applied actor name argument",r))};import Ng from"node:path";import{z as Gt}from"zod";import Ar from"node:fs";import At from"node:path";import on from"node:fs";import ct from"node:path";import Ir from"node:fs";import{ulid as rg}from"ulid";import{z as So}from"zod";var og="__epiq_state__",sg=So.object({projectId:So.string().min(1),stateBranch:So.string().min(1),createdAt:So.iso.datetime()}),Co=()=>({projectId:rg(),stateBranch:og,createdAt:new Date().toISOString()}),Rt=e=>{let t=No(e);if(!Ir.existsSync(t))return i("Missing .epiq/project.json");try{let n=Ir.readFileSync(t,"utf8"),r=JSON.parse(n),o=sg.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")}},Er=e=>{let t=Rt(e);return d(t)?i(t.message):l("Read projectId",t.value.projectId)},wd=({repoRoot:e,fileContents:t})=>{let n=Sr(e),r=No(e);try{if(Ir.mkdirSync(n,{recursive:!0}),Ir.existsSync(r)){let o=Rt(e);return d(o)?i(o.message):l("Project already initialized",null)}return Ir.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 ig from"node:os";import ag from"node:path";var gt=".epiq-global",Rn=()=>process.env.EPIQ_GLOBAL_DIR??ag.join(ig.homedir(),gt);var Si=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let a=r(...s);if(!n.has(a)){let c=e(...s).then(u=>(d(u)&&n.delete(a),u));n.set(a,c)}return n.get(a)});return o.clear=()=>n.clear(),o};import Cr from"fs";import Ai from"path";import dg from"util";var Md=1e3,cg=50,Ci=0,Pd=()=>process.env.EPIQ_MCP==="true",Ld=()=>{let e=process.cwd(),t=Ro(e);return d(t)?Pd()?Ai.join(process.cwd(),".epiq-mcp.log"):void 0:Ai.join(t.value,nt,"log","epiq.log")};function lg(){let e=Ld();if(!e||!Cr.existsSync(e))return;let n=Cr.readFileSync(e,"utf8").split(`
4
- `);if(n[n.length-1]===""&&n.pop(),n.length<=Md)return;let r=n.slice(-Md).join(`
2
+ import At from"chalk";import{render as gS}from"ink";import hS from"meow";import vS from"react";import Yf from"chalk";import Hg from"node:crypto";var dn={Success:"success",Fail:"fail"},a=e=>({status:dn.Fail,message:e,value:null}),l=(e,t)=>({status:dn.Success,message:e,value:t}),d=e=>e.status==="fail",de=e=>e.status==="success";var zt="EPIQ_USER_NAME",Bo="EPIQ_USER_ID",zd="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Wg=26,Bi=80,Fi=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),Fo=e=>e.trim().length>0&&e.length<=Bi,or=e=>e.trim().toLowerCase(),Gg=e=>{let t=Hg.createHash("sha256").update(`epiq:actor:${or(e)}`).digest(),n="";for(let r=0;r<Wg;r++)n+=zd[(t[r]??0)%zd.length];return n},sr=(e,t=process.env)=>{let n=(t[zt]??"").trim(),r=(t[Bo]??"").trim();return n?Fo(n)?!r&&e.userId&&e.userName&&or(e.userName)===or(n)?l("Actor override names the configured user",{userId:e.userId,userName:e.userName}):r&&!Fi(r)?a(`${Bo} must be 26 characters of Crockford base32`):r&&e.userId&&r===e.userId?a(`${Bo} 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||Gg(n),userName:r?n:or(n)}):a(`${zt} must be 1-${Bi} characters of text`):r?a(`${Bo} is set without ${zt}`):l("No actor override",null)},Oi=(e,t,n=process.env)=>{let r=e.trim();if(!Fo(r))return a(`${t} must be 1-${Bi} characters of text`);let o=(n[zt]??"").trim();return o&&or(o)!==or(r)?a(`${t} names ${r}, but ${zt} names ${o}`):(n[zt]=r,l("Applied actor name argument",r))};import hh from"node:path";import{z as qt}from"zod";import _r from"node:fs";import wt from"node:path";import ln from"node:fs";import ut from"node:path";import Dr from"node:fs";import{ulid as Vg}from"ulid";import{z as Oo}from"zod";var Kg="__epiq_state__",zg=Oo.object({projectId:Oo.string().min(1),stateBranch:Oo.string().min(1),createdAt:Oo.iso.datetime()}),Uo=()=>({projectId:Vg(),stateBranch:Kg,createdAt:new Date().toISOString()}),Tt=e=>{let t=_o(e);if(!Dr.existsSync(t))return a("Missing .epiq/project.json");try{let n=Dr.readFileSync(t,"utf8"),r=JSON.parse(n),o=zg.safeParse(r);return o.success?l("Read project.json",o.data):a(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return a(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Br=e=>{let t=Tt(e);return d(t)?a(t.message):l("Read projectId",t.value.projectId)},qd=({repoRoot:e,fileContents:t})=>{let n=Fn(e),r=_o(e);try{if(Dr.mkdirSync(n,{recursive:!0}),Dr.existsSync(r)){let o=Tt(e);return d(o)?a(o.message):l("Project already initialized",null)}return Dr.writeFileSync(r,JSON.stringify(t,null,2)+`
3
+ `,"utf8"),l("Created project.json",null)}catch(o){return a(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};import qg from"node:os";import Yg from"node:path";var yt=".epiq-global",On=()=>process.env.EPIQ_GLOBAL_DIR??Yg.join(qg.homedir(),yt);var Ui=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let i=r(...s);if(!n.has(i)){let c=e(...s).then(u=>(d(u)&&n.delete(i),u));n.set(i,c)}return n.get(i)});return o.clear=()=>n.clear(),o};import Fr from"fs";import Hi from"path";import Xg from"util";var Yd=1e3,Jg=50,_i=0,Xd=()=>process.env.EPIQ_MCP==="true",Jd=()=>{let e=process.cwd(),t=$o(e);return d(t)?Xd()?Hi.join(process.cwd(),".epiq-mcp.log"):void 0:Hi.join(t.value,Ze,"log","epiq.log")};function Qg(){let e=Jd();if(!e||!Fr.existsSync(e))return;let n=Fr.readFileSync(e,"utf8").split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=Yd)return;let r=n.slice(-Yd).join(`
5
5
  `)+`
6
- `;Cr.writeFileSync(e,r,"utf8")}function Ni(e,t,n=!1){let r=Ld();if(!r)return;let o=dg.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
7
- `;Cr.mkdirSync(Ai.dirname(r),{recursive:!0}),Cr.appendFileSync(r,c,"utf8"),Ci++,Ci>=cg&&(Ci=0,lg())}var Ri=()=>Pd()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",K={info(...e){let t=Ri();(t==="info"||t==="debug")&&Ni("[Info]",e,!1)},debug(...e){Ri()==="debug"&&Ni("[Debug]",e,!0)},error(...e){let t=Ri();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;Ni("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=K;import{spawn as Dd}from"node:child_process";import An from"node:fs";import Tn from"node:path";var Ie={stage:({cwd:e,pathspec:t})=>_({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:r})=>_({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...r?.length?["--",...r]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>_({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>_({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>_({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 _({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>_({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>_({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>_({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>_({args:["worktree","prune"],cwd:e})};var rn=e=>{let t=_e(e);if(d(t))return i("Unable to resolve epiq project root");let n=Rt(t.value);return d(n)?i("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},dt="origin";var Ao=1e4,ug=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(Tn.delimiter))if(t)for(let n of e){let r=Tn.join(t,n);try{if(!An.statSync(r).isFile())continue;return An.accessSync(r,An.constants.X_OK),r}catch{continue}}return"git"},Bd=ug(),Fd={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},Od=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!An.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(i(p));return}let o=Dd(Bd,e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Fd}),s=!1,a="",c="",u=p=>{s||(s=!0,clearTimeout(m),r(p))},m=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Ao}ms`].join(`
8
- `);u(n?{stdout:a,stderr:p,exitCode:124}:i(p))},Ao);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{a+=p}),o.stderr.on("data",p=>{c+=p}),o.on("error",p=>{if(n){u({stdout:a,stderr:p.message,exitCode:1});return}u(i([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
9
- `)))}),o.on("close",p=>{let f=p??1;if(n){u({stdout:a,stderr:c,exitCode:f});return}if(f!==0){u(i([`git ${e.join(" ")}`,c.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
10
- `)));return}u(l("Git command succeeded",{stdout:a,stderr:c,exitCode:f}))})}),_=({args:e,cwd:t})=>Od({args:e,cwd:t,allowFail:!1}),Je=({args:e,cwd:t})=>Od({args:e,cwd:t,allowFail:!0}),Ud=(e,t)=>new Promise(n=>{if(e.length===0){n(l("No blobs to read",new Map));return}let r=Dd(Bd,["cat-file","--batch"],{cwd:t,stdio:["pipe","pipe","pipe"],env:Fd}),o=[],s="",a=!1,c=m=>{a||(a=!0,clearTimeout(u),n(m))},u=setTimeout(()=>{r.kill("SIGTERM"),c(i(`git cat-file --batch timed out after ${Ao}ms`))},Ao);r.stdout.on("data",m=>o.push(m)),r.stderr.setEncoding("utf8"),r.stderr.on("data",m=>{s+=m}),r.on("error",m=>c(i(m.message))),r.on("close",m=>{if(m!==0){c(i(`git cat-file --batch exited ${m}${s?`
11
- ${s}`:""}`));return}let p=Buffer.concat(o),f=new Map,g=0;for(let x of e){let S=p.indexOf(10,g);if(S===-1){c(i(`git cat-file --batch output ended before a header for ${x}`));return}let T=p.toString("utf8",g,S);g=S+1;let C=/^[0-9a-f]{4,64} \S+ (\d+)$/.exec(T);if(!C||!C[1]){c(i(`Unexpected git cat-file --batch header: "${T}"`));return}let R=Number(C[1]);f.set(x,p.toString("utf8",g,g+R)),g+=R+1}c(l("Read blobs",f))}),r.stdin.write(e.join(`
6
+ `;Fr.writeFileSync(e,r,"utf8")}function $i(e,t,n=!1){let r=Jd();if(!r)return;let o=Xg.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
7
+ `;Fr.mkdirSync(Hi.dirname(r),{recursive:!0}),Fr.appendFileSync(r,c,"utf8"),_i++,_i>=Jg&&(_i=0,Qg())}var ji=()=>Xd()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",K={info(...e){let t=ji();(t==="info"||t==="debug")&&$i("[Info]",e,!1)},debug(...e){ji()==="debug"&&$i("[Debug]",e,!0)},error(...e){let t=ji();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;$i("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=K;import{spawn as Zd}from"node:child_process";import Un from"node:fs";import _n from"node:path";var xe={stage:({cwd:e,pathspec:t,ignoreRemoval:n=!1})=>$({args:["add",...n?["--ignore-removal"]:[],...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:r})=>$({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...r?.length?["--",...r]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>$({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>$({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>$({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 $({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>$({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>$({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>$({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>$({args:["worktree","prune"],cwd:e})};var cn=e=>{let t=$e(e);if(d(t))return a("Unable to resolve epiq project root");let n=Tt(t.value);return d(n)?a("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},lt="origin";var Wi=1e4,Zg=12e4,eh=new Set(["fetch","push","pull","clone","ls-remote","rebase","checkout","worktree"]),th=e=>{let t=e.find((n,r)=>!n.startsWith("-")&&e[r-1]!=="-c");return t&&eh.has(t)?Zg:Wi},nh=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(_n.delimiter))if(t)for(let n of e){let r=_n.join(t,n);try{if(!Un.statSync(r).isFile())continue;return Un.accessSync(r,Un.constants.X_OK),r}catch{continue}}return"git"},ec=nh(),tc={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},nc=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Un.existsSync(t)){let f=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:f,exitCode:1});return}r(a(f));return}let o=Zd(ec,e,{cwd:t,stdio:["ignore","pipe","pipe"],env:tc}),s=!1,i="",c="",u=f=>{s||(s=!0,clearTimeout(p),r(f))},m=th(e),p=setTimeout(()=>{o.kill("SIGTERM");let f=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${m}ms`].join(`
8
+ `);u(n?{stdout:i,stderr:f,exitCode:124}:a(f))},m);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",f=>{i+=f}),o.stderr.on("data",f=>{c+=f}),o.on("error",f=>{if(n){u({stdout:i,stderr:f.message,exitCode:1});return}u(a([`git ${e.join(" ")}`,`cwd=${t}`,f.message].join(`
9
+ `)))}),o.on("close",f=>{let v=f??1;if(n){u({stdout:i,stderr:c,exitCode:v});return}if(v!==0){u(a([`git ${e.join(" ")}`,c.trim()||i.trim()||"Git command failed"].filter(Boolean).join(`
10
+ `)));return}u(l("Git command succeeded",{stdout:i,stderr:c,exitCode:v}))})}),$=({args:e,cwd:t})=>nc({args:e,cwd:t,allowFail:!1}),et=({args:e,cwd:t})=>nc({args:e,cwd:t,allowFail:!0}),rc=(e,t)=>new Promise(n=>{if(e.length===0){n(l("No blobs to read",new Map));return}let r=Zd(ec,["cat-file","--batch"],{cwd:t,stdio:["pipe","pipe","pipe"],env:tc}),o=[],s="",i=!1,c=m=>{i||(i=!0,clearTimeout(u),n(m))},u=setTimeout(()=>{r.kill("SIGTERM"),c(a(`git cat-file --batch timed out after ${Wi}ms`))},Wi);r.stdout.on("data",m=>o.push(m)),r.stderr.setEncoding("utf8"),r.stderr.on("data",m=>{s+=m}),r.on("error",m=>c(a(m.message))),r.on("close",m=>{if(m!==0){c(a(`git cat-file --batch exited ${m}${s?`
11
+ ${s}`:""}`));return}let p=Buffer.concat(o),f=new Map,v=0;for(let N of e){let C=p.indexOf(10,v);if(C===-1){c(a(`git cat-file --batch output ended before a header for ${N}`));return}let I=p.toString("utf8",v,C);v=C+1;let S=/^[0-9a-f]{4,64} \S+ (\d+)$/.exec(I);if(!S||!S[1]){c(a(`Unexpected git cat-file --batch header: "${I}"`));return}let A=Number(S[1]);f.set(N,p.toString("utf8",v,v+A)),v+=A+1}c(l("Read blobs",f))}),r.stdin.write(e.join(`
12
12
  `)+`
13
- `),r.stdin.end()}),zn=async({cwd:e,message:t,pathspec:n})=>{let r=await Ie.commit({cwd:e,message:t,pathspec:n});if(d(r))return i(`Failed to create commit
14
- ${r.message}`);let o=await _({args:["rev-parse","HEAD"],cwd:e});return d(o)?i(`Commit created, but failed to read HEAD SHA
15
- ${o.message}`):l("Created commit and resolved SHA",o.value.stdout.trim())},Ti=async e=>{let t=await _({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return i(t.message);let n=t.value.stdout.trim();return l("Resolved git dir",Tn.isAbsolute(n)?n:Tn.resolve(e,n))},mg=async e=>{let t=await Ti(e);if(d(t))return i(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,a]of Object.entries(r))if(An.existsSync(Tn.join(n,s)))return l("Checked for in-progress Git operation",a);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,a]of Object.entries(o))if(An.existsSync(Tn.join(n,s)))return l("Checked for in-progress Git operation",a);return l("Checked for in-progress Git operation",null)},To=async e=>{let t=await mg(e);return d(t)?i(t.message):l("Checked for in-progress Git operation",t.value!==null)},wi=async({repoRoot:e})=>{let n=(await Je({args:["remote","get-url",dt],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},Mi=async({repoRoot:e,branch:t})=>{let n=await Je({args:["ls-remote","--heads",dt,t],cwd:e});return n.exitCode!==0?i(n.stderr.trim()||`Unable to inspect remote branch ${dt}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},wo=async({repoRoot:e,branch:t})=>{let n=await Je({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}`)},Nr=e=>{try{return An.realpathSync.native(e)}catch{return Tn.resolve(e)}},_d=async({repoRoot:e,worktreeRoot:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return i(n.message);let r=Nr(t),o=n.value.stdout.split(`
16
- `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Nr).includes(r);return l("Checked worktree registration",o)},Pi=async e=>{let t=await Je({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Mo=async e=>{let t=await _({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?i(t.message):l("Resolved current branch",t.value.stdout.trim())},$d=async e=>{let t=await _({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?i(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},jd=e=>e.includes("fetch first")||e.includes("non-fast-forward"),pg=async e=>(await Je({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1),kd=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)||/git command timed out after/i.test(e),fg=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),ki=async({cwd:e,branch:t})=>{let n=await pg(e);if(d(n))return i(n.message);let r=await kd(e),o=await Ie.fetch({cwd:e,remote:dt,branch:t});if(d(o))return fg(o.message)?l("Remote branch missing, skipped pull",!1):i(`Failed to fetch ${t}
17
- ${o.message}`);let s=await Ie.rebaseOnto({cwd:e,ref:`${dt}/${t}`});if(d(s))return i(`Failed during rebase
18
- ${s.message}`);let a=await kd(e),c=r!==null&&a!==null&&r!==a;return l(c?"Pulled with rebase":"Already up to date",c)},Hd=async e=>{let t=await Je({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)},Wd=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"):l("Inspected worktree for changes",t.stdout.trim().length>0)},Gd=async(e,t)=>{let n=await Je({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")};var Vd=async e=>{let t=await Mo(e);return d(t)?i(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var zd="4b825dc642cb6eb9a060e54bf8d69288fbee4904",qd=e=>ct.join(nt,wn,e),Yd=()=>ct.join(nt,Fi),Xd=Rn,Po=()=>ct.join(Xd(),"worktrees"),Se=({repoRoot:e})=>{let t=Er(e);return d(t)?i(t.message):l("Resolved state branch root",ct.join(Po(),t.value))},gg=e=>ct.join(e,nt),Kd=e=>ct.join(gg(e),wn);var Rr=e=>{try{return on.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return i(t instanceof Error?t.message:String(t))}},Lo=()=>{let e=Xd(),t=Po(),n=!on.existsSync(e)||!on.existsSync(t),r=Rr(e);if(d(r))return i(`Ensure epiq home failed.
19
- `+r.message);let o=Rr(t);return d(o)?i(`Ensure worktrees dir failed.
20
- `+o.message):l("Ensured epiq storage",n)},Jd=e=>{on.existsSync(e)&&(K.debug("[sync] remove path",e),on.rmSync(e,{recursive:!0,force:!0}))};var Di=`*.jsonl merge=union
21
- `,Bi=()=>ct.join(nt,wn,".gitattributes"),Qd=(e,t)=>{for(let r of[Kd(e),Kd(t)]){let o=Rr(r);if(d(o))return i(o.message)}let n=ct.join(t,Bi());try{on.readFileSync(n,"utf8")!==Di&&on.writeFileSync(n,Di)}catch{on.writeFileSync(n,Di)}return l("Ensured state branch",void 0)},Zd=async e=>{let t=await _({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return i(`ensure state branch is storage only failed
13
+ `),r.stdin.end()}),ir=async({cwd:e,message:t,pathspec:n})=>{let r=await xe.commit({cwd:e,message:t,pathspec:n});if(d(r))return a(`Failed to create commit
14
+ ${r.message}`);let o=await $({args:["rev-parse","HEAD"],cwd:e});return d(o)?a(`Commit created, but failed to read HEAD SHA
15
+ ${o.message}`):l("Created commit and resolved SHA",o.value.stdout.trim())},Gi=async e=>{let t=await $({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return a(t.message);let n=t.value.stdout.trim();return l("Resolved git dir",_n.isAbsolute(n)?n:_n.resolve(e,n))},rh=async e=>{let t=await Gi(e);if(d(t))return a(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(r))if(Un.existsSync(_n.join(n,s)))return l("Checked for in-progress Git operation",i);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(o))if(Un.existsSync(_n.join(n,s)))return l("Checked for in-progress Git operation",i);return l("Checked for in-progress Git operation",null)},jo=async e=>{let t=await rh(e);return d(t)?a(t.message):l("Checked for in-progress Git operation",t.value!==null)},Vi=async({repoRoot:e})=>{let n=(await et({args:["remote","get-url",lt],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},Ki=async({repoRoot:e,branch:t})=>{let n=await et({args:["ls-remote","--heads",lt,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${lt}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},Ho=async({repoRoot:e,branch:t})=>{let n=await et({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?l("Local branch exists",!0):n.exitCode===1?l("Local branch missing",!1):a(n.stderr.trim()||`Unable to inspect branch ${t}`)},Or=e=>{try{return Un.realpathSync.native(e)}catch{return _n.resolve(e)}},oc=async({repoRoot:e,worktreeRoot:t})=>{let n=await $({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=Or(t),o=n.value.stdout.split(`
16
+ `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Or).includes(r);return l("Checked worktree registration",o)},zi=async e=>{let t=await et({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Wo=async e=>{let t=await $({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved current branch",t.value.stdout.trim())},sc=async e=>{let t=await $({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?a(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},ic=e=>e.includes("fetch first")||e.includes("non-fast-forward"),oh=async e=>(await et({cwd:e,args:["rebase","--abort"]})).exitCode===0?l("Aborted stale rebase",!0):l("No rebase to abort",!1),Qd=async e=>{let t=await et({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},qi=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),sh=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),Yi=async({cwd:e,branch:t})=>{let n=await oh(e);if(d(n))return a(n.message);let r=await Qd(e),o=await xe.fetch({cwd:e,remote:lt,branch:t});if(d(o))return sh(o.message)?l("Remote branch missing, skipped pull",!1):a(`Failed to fetch ${t}
17
+ ${o.message}`);let s=await xe.rebaseOnto({cwd:e,ref:`${lt}/${t}`});if(d(s))return a(`Failed during rebase
18
+ ${s.message}`);let i=await Qd(e),c=r!==null&&i!==null&&r!==i;return l(c?"Pulled with rebase":"Already up to date",c)},ac=async e=>{let t=await et({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)},dc=async e=>{let t=await et({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?a(t.stderr.trim()||"Unable to inspect the worktree for changes"):l("Inspected worktree for changes",t.stdout.trim().length>0)},cc=async(e,t)=>{let n=await et({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):a(n.stderr.trim()||"Unable to inspect staged changes")};var lc=async e=>{let t=await Wo(e);return d(t)?a(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var mc="4b825dc642cb6eb9a060e54bf8d69288fbee4904",pc=e=>ut.join(Ze,un,e),fc=()=>ut.join(Ze,Qi),gc=On,Go=()=>ut.join(gc(),"worktrees"),Ce=({repoRoot:e})=>{let t=Br(e);return d(t)?a(t.message):l("Resolved state branch root",ut.join(Go(),t.value))},ih=e=>ut.join(e,Ze),uc=e=>ut.join(ih(e),un);var Ur=e=>{try{return ln.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},Vo=()=>{let e=gc(),t=Go(),n=!ln.existsSync(e)||!ln.existsSync(t),r=Ur(e);if(d(r))return a(`Ensure epiq home failed.
19
+ `+r.message);let o=Ur(t);return d(o)?a(`Ensure worktrees dir failed.
20
+ `+o.message):l("Ensured epiq storage",n)},hc=e=>{ln.existsSync(e)&&(K.debug("[sync] remove path",e),ln.rmSync(e,{recursive:!0,force:!0}))};var Xi=`*.jsonl merge=union
21
+ `,Ji=()=>ut.join(Ze,un,".gitattributes"),vc=(e,t)=>{for(let r of[uc(e),uc(t)]){let o=Ur(r);if(d(o))return a(o.message)}let n=ut.join(t,Ji());try{ln.readFileSync(n,"utf8")!==Xi&&ln.writeFileSync(n,Xi)}catch{ln.writeFileSync(n,Xi)}return l("Ensured state branch",void 0)},yc=async e=>{let t=await $({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return a(`ensure state branch is storage only failed
22
22
  `+t.message);let r=t.value.stdout.trim().split(`
23
- `).filter(Boolean).filter(a=>a!==nt);if(r.length===0)return l("State branch is storage-only",!1);let o=await _({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return i(`Failed to clean storage branch
24
- ${o.message}`);let s=await zn({cwd:e,message:"[epiq:repair-storage-branch]"});return d(s)?i(s.message):l("Cleaned storage branch",!0)},ht=Si(async(e=process.cwd())=>{let t=await _({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?i("Not inside a Git repository"):l("Resolved repo root",t.value.stdout.trim())},e=>ct.resolve(e)),dS=Si(async e=>{let t=await _({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return i(t.message);let n=t.value.stdout.trim(),r=ct.isAbsolute(n)?n:ct.join(e,n);return l("Resolved git dir",r)},e=>ct.resolve(e));var gS=process.env.IS_LOCAL==="true",nt=".epiq",wn="events",Fi="media",hg="project.json",Sr=e=>At.join(e,nt),No=e=>At.join(Sr(e),hg),Tr=e=>At.join(Sr(e),wn),wr=e=>At.join(Sr(e),Fi),ec=e=>At.join(e,nt),vg=e=>{let t=At.join(e,nt);return Ar.existsSync(t)&&Ar.statSync(t).isDirectory()},Mr=e=>{let t=No(e);return Ar.existsSync(t)&&Ar.statSync(t).isFile()},Ro=e=>{let t=At.resolve(e);for(;;){if(vg(t))return l("Resolved closest .epiq root",t);let n=At.dirname(t);if(n===t)return i("No .epiq directory found in any parent");t=n}},Oi="No .epiq/project.json found in any parent",_e=e=>{let t=At.resolve(e);for(;;){if(Mr(t))return l("Resolved closest epiq project root",t);let n=At.dirname(t);if(n===t)return i(Oi);t=n}},tc=e=>{let t=Tr(e);try{return Ar.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")}},Tt=async()=>{let e=await ht(process.cwd());if(d(e))return e;let t=Se({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};import{accessSync as yg,copyFileSync as bg,existsSync as ko,mkdirSync as nc,readdirSync as rc,readFileSync as xg,renameSync as Ig,rmSync as Eg,statSync as oc,unlinkSync as Sg,writeFileSync as Cg}from"node:fs";import qn from"node:path";var Ui=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",Te={writeToFile:(e,t)=>{try{let n=qn.dirname(e);ko(n)||nc(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Cg(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return xg(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Te.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 ko(e)&&oc(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await yg(e),!0}catch{return!1}},mkDir:e=>nc(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=qn.parse(t);for(;;){let r=qn.join(t,e);try{if(ko(r)&&oc(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=qn.dirname(t)}return null},readFirstJSON(e){try{if(!Te.dirExists(e))return null;let t=rc(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=qn.join(e,t);return Te.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Te.dirExists(e)?rc(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Sg(e)}catch(t){(!Ui(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Eg(e,{recursive:!0,force:!0})}catch(t){(!Ui(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(qn.dirname(t)),!n?.overwrite&&ko(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ig(e,t)}catch(r){if(Ui(r)&&r.code==="EXDEV"){bg(e,t),this.rmFile(e);return}throw r}}};var Rg={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},sc=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(),Ag="config.json",ic=Rn,_i=()=>Ng.join(ic(),Ag),$i=()=>{try{return Te.mkDir(ic()),l(`Ensured ~/${gt} exists`,null)}catch{return i(`Unable to create ~/${gt}`)}},Tg=e=>{let t;try{t=JSON.parse(e)}catch{return i(`Invalid ~/${gt}/config.json JSON`)}let n=sc.safeParse(t??{});return n.success?l("Parsed config",n.data):i(`Invalid ~/${gt}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Yn=()=>{let e=$i();if(d(e))return i(e.message);let t=_i(),n=Te.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Tg(n)},ac=e=>{let t=$i();if(d(t))return i(t.message);let n=sc.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=_i();try{return Te.writeToFile(r,JSON.stringify(n.data,null,2)+`
25
- `),l("Config written",null)}catch{return i(`Unable to write ~/${gt}/config.json`)}},lt=e=>{let t=Yn();if(d(t))return i("Failed to read existing config");let n={...t.value,...e};return ac(n)},wt=()=>{let e=_i(),t=$i();if(d(t))return i(`Unable to create ~/${gt}`);if(!(Te.readFile(e)!==null)){let S=ac(Rg);if(d(S))throw new Error(`Unable to create ~/${gt}/config.json`)}let r=Yn();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:a,autoSync:c,autoSyncDebounceMs:u,attachmentMaxKb:m,logLevel:p,viewMode:f}=r.value,g=Kn({userId:a,userName:s});if(d(g))return i(g.message);let x=g.value??{userId:a,userName:s};return!x.userName||!x.userId?i(`User name or ID not configured in ~/${gt}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,l("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:x.userName,userId:x.userId,autoSync:c??!1,autoSyncIntervalMs:u??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))};import{useSyncExternalStore as wg}from"react";var Pr={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},ji=new Set,Mg=()=>{for(let e of ji)e()},Z=()=>Pr,dc=()=>wg(e=>(ji.add(e),()=>{ji.delete(e)}),()=>Pr),$e=e=>(Pr={...Pr,...e},Mg(),Pr);import{spawn as Pg}from"node:child_process";import Hi from"node:process";var Wi=e=>{let t=Hi.platform==="darwin"?"open":Hi.platform==="win32"?"cmd":"xdg-open",n=Hi.platform==="win32"?["/c","start","",e]:[e];Pg(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as of}from"node:fs/promises";import bn from"chalk";import jm from"string-width";import{decodeTime as cc}from"ulid";var Do=1440*60*1e3,Gi=(e,t=Date.now())=>e>t+Do?t:e,rt=e=>Gi(cc(e)),Xn=e=>{let t=Date.now()+Do,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})},Bo=e=>{try{return l("Decoded date",new Date(rt(e)))}catch(t){return i("Decoding failed + "+t.message)}},Jn=e=>{if(!e?.id)return null;try{return cc(e.id)}catch{return null}};var Fo="removed",ze=(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")},lc=["png","jpg","gif","webp"];var F={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Vi(e){return e.context===F.WORKSPACE}function M(e){return e.context===F.TICKET}function sn(e){return e.context===F.TEXT}function ot(e){return e.context===F.FIELD}function Lr(e){return e.context===F.FIELD_LIST}var Mt=e=>e.context===F.SWIMLANE,kr=e=>e.context===F.BOARD,Dr=e=>e.context===F.COMMENT;import{useSyncExternalStore as qb}from"react";var y={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var uc=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",mc=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",pc=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",fc=(e,t)=>{if(mc(e,e.sequence))return I.MoveCursorLeftOfWord;if(pc(e,e.sequence))return I.MoveCursorRightOfWord;if(uc(e,e.sequence))return I.EraseInputWord;switch(e.name){case"tab":return I.AutoCompleteCommand;case"up":return I.GetLastCommandFromHistory;case"down":return I.GetNextCommandFromHistory;case"left":return I.MoveCursorLeft;case"right":return I.MoveCursorRight;case"return":return I.Confirm;case"backspace":return t?I.EraseInput:I.ExitCommandLine;case"escape":return I.ExitCommandLine;default:return I.CaptureInput}},gc=(e,t)=>{if(mc(e,e.sequence))return I.MoveCursorLeftOfWord;if(pc(e,e.sequence))return I.MoveCursorRightOfWord;if(uc(e,e.sequence))return I.EraseInputWord;switch(e.name){case"tab":return I.AutoCompleteCommand;case"up":return I.NavPreviousItem;case"down":return I.NavNextItem;case"left":return I.MoveCursorLeft;case"right":return I.MoveCursorRight;case"return":return I.Confirm;case"backspace":return t?I.EraseInput:I.ExitCommandLine;case"escape":return I.ExitCommandLine;default:return I.CaptureInput}};function Oo(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var ut=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",qe=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),hc=e=>e.charAt(0).toUpperCase()+e.slice(1);var vc=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},yc=(e,t)=>t?e.get(t)??[]:[];var bc=new WeakMap,Lg=e=>{let t=bc.get(e);return t||(t=vc(e),bc.set(e,t)),t};var xc=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return yc(Lg(e),r).filter(s=>Oo(r,s)>=n)};var kg={hint:"",hints:[],overlap:0,remainder:""},Ic=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return kg;let o=xc({wordList:r,inputToMatch:e,overlapThreshold:1});return Dg(t,o)},Dg=(e,t)=>{let n=t[0]??"",r=Oo(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),a=r<(o??"").length,c=!!s,p=(c&&a?o:n)+(c&&a?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}};import{ulid as Og}from"ulid";var Qn=24n,Bg=Qn*4n,vt=(1n<<Bg)-1n,Fg=/^[0-9a-f]+$/;function Ec(e){return!e||!Fg.test(e)?i(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function st(e,t=Qn){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 Ye(e,t){if(!e&&!t)return st(vt/2n,Qn);let n=e?Ec(e):l("Resolved lower bound",0n);if(d(n))return n;let r=t?Ec(t):l("Resolved upper bound",vt);if(d(r))return r;let o=n.value,s=r.value;if(s<=o)return st(vt/2n,Qn);let a=(o+s)/2n;return a===o||a===s?i("No rank space available between neighbors"):st(a,Qn)}function Sc(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=vt*BigInt(r+1)/(t+1n),s=st(o,Qn);if(d(s))return s;n.push(s.value)}return l("Resolved evenly spaced ranks",n)}var Ki=(e,t)=>{let n=ee(e),r=Sc(n.length);if(d(r))return r;let o={};for(let s=0;s<n.length;s++){let a=n[s],c=r.value[s];if(!a||!c)return i("Unable to assign rebalance rank");o[a.id]=c}return l("Created rebalance event",{id:Og(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import{ulid as Ih}from"ulid";var ce={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var V=e=>e.slice(-7).toUpperCase(),Uo=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?V(e).includes(n):!0};var le={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:F.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:V(e)},context:F.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:F.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:a=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:F.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:a}),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:F.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:V(e)},context:F.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:F.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:a=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:F.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:a})};var Ug=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ce,_o]=Ug;var zi=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),k=(e,t)=>({...zi(e,t),convergence:!0}),Br=e=>d(e)&&e.convergence===!0,Vt=e=>{let t=e.filter(d);return{fatal:t.filter(n=>!Br(n)),skipped:t.filter(Br)}},Kt=e=>{e.length!==0&&K.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},Cc=e=>{let t=E.getNode(e);if(!t||!M(t)||t.isDeleted)return null;let n=Ac(t);return d(n)?n:null},Nc=e=>{if(!Yi())return null;for(let t of e){let n=Cc(t);if(n)return n;let r=h().nodes[t]?.parentNodeId;if(!r)continue;let o=Cc(r);if(o)return o}return null},_g=(e,t)=>{let n=E.getNode(e);n&&E.updateNode({...n,log:[...n.log??[],t]})},$g=e=>{let t=[e],n=h().nodes[e]?.parentNodeId;return n&&t.push(n),t},qi=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 $g(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[]}},jg=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},Hg=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?zi("Invalid user ID format",e):l("Valid user",null)},Qe=null,Wg=e=>{for(let[t,n]of e.nodeLog){let r=E.getNode(t);r&&E.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&ue(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),Nc([...e.virtualNodeIds])},Gg=(e,t)=>{let n=Hg(e);if(d(n))return n;let r=[...new Set(qi(e))];if(Qe){for(let s of r){if(!t){let a=Qe.nodeLog.get(s);a?a.push(e):Qe.nodeLog.set(s,[e])}if(Yi()){Qe.virtualNodeIds.add(s);let a=h().nodes[s]?.parentNodeId;a&&Qe.virtualNodeIds.add(a)}}return t||Qe.appLog.push(e),null}t||(r.forEach(s=>_g(s,e)),jg(e));let o=Nc(r);return o||null},Vg={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=le.workspace(t,n,r),s=Fr(o);if(d(s))return zi(s.message,e);let a=E.createNode(o);return d(a)?k(a.message??"Failed to initialize workspace",e):Vi(a.value)?l("Workspace initialized",{action:e.action,result:a.value}):i("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=E.createNode(le.workspace(t,n,r));return d(o)?k(o.message??"Failed to add workspace",e):Vi(o.value)?l("Added workspace",{action:e.action,result:o.value}):i("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=E.createNode(le.board(t,n,r,o));return d(s)?k(s.message??"Unable to create board",e):kr(s.value)?l("Added board",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=E.createNode(le.swimlane(t,n,r,o));return d(s)?k(s.message??"Unable to create swimlane",e):Mt(s.value)?l("Added swimlane",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=E.createNode(le.ticket(t,n,r,o));return d(s)?k(s.message??"Unable to create issue",e):M(s.value)?l("Added issue",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,a=E.createNode(le.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(ce.DESCRIPTION)?"vertical":"horizontal"}));return d(a)?k(a.message??`Unable to create field: ${n}`,e):ot(a.value)?l("Added field",{action:e.action,result:a.value}):i("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!E.getNode(t))return k(`Unable to locate node with id ${t}`,e);let o=E.renameNode(t,n);return d(o)?k(o.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=E.tombstoneNode(t);return d(n)?k(n.message??"Unable to delete node",e):l("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=E.createTag({id:t,name:n});return d(r)?k(r.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:r.value})},"tombstone.tag":e=>{let{id:t}=e.payload,n=E.tombstoneTag(t);return d(n)?k(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=E.restoreTag(t,n);return d(r)?k(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=E.createContributor({id:t,name:n});return d(r)?k(r.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:r.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,r=E.renameContributor(t,n);return d(r)?k(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=E.tombstoneContributor(t);return d(n)?k(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=E.restoreContributor(t,n);return d(r)?k(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=E.tag(t,n);return d(r)?k(r.message??"Unable to tag issue",e):l("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=E.untag(t,n);return d(r)?k(r.message??"Unable to untag issue",e):l("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=E.assign(t,n);return d(r)?k(r.message??"Unable to assign issue",e):l("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=E.unassign(t,n);return d(r)?k(r.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?k(o.message??"Failed to move node",e):l("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=E.editValue(t,n);return d(r)?k(r.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return k("Unable to locate issue",e);if(!M(o))return k("Can only close issues",e);let s=E.getNode(Ce);if(!s)return k("Unable to locate target swimlane",e);if(n!==s.id)return k("Close target must be closed swimlane",e);let a=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(a)?k(a.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=E.getNode(t);if(!o)return k("Unable to locate issue",e);if(!M(o))return k("Can only reopen issues",e);let s=E.getNode(Ce);if(!s)return k("Unable to locate closed swimlane",e);if(n===s.id)return k("Cannot reopen issue into closed swimlane",e);if(!E.getNode(n))return k("Reopen parent no longer exists",e);let c=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?k(c.message??"Unable to reopen issue",e):l("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=E.lockNode(t);return d(n)?k(n.message??"Unable to lock node",e):l("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let s=E.getNode(r);if(!s)return k(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return k(`Node ${r} is not child of ${t}`,e);let a=E.updateNode({...s,rank:o});if(d(a))return k(a.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=E.createComment({id:t,issue:n,authorId:r,authorName:E.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return d(s)?k(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=E.getComment(t);if(!o)return k("Unable to locate comment",e);if(o.issue!==n)return k("Comment does not belong to issue",e);let s=E.editComment(t,r);return d(s)?k(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=E.getComment(t);if(!r)return k("Unable to locate comment",e);if(r.issue!==n)return k("Comment does not belong to issue",e);let o=E.deleteComment(t);return d(o)?k(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:a}=e.payload,c=E.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:a,deleted:!1});return d(c)?k(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=E.getAttachment(t);if(!r)return k("Unable to locate attachment",e);if(r.issue!==n)return k("Attachment does not belong to issue",e);let o=E.deleteAttachment(t);return d(o)?k(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=E.linkUserId({contributorId:t,userId:e.userId});return d(n)?k(n.message??"Unable to link contributor",e):l("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function an(e,t=!1){let n=Vg[e.action];if(!n)return i(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);if(!Pt()&&e.action!=="init.workspace")return k(`${e.action} arrived before the workspace was initialized`,e);if(e.action==="init.workspace"&&Qe){if(Qe.genesisApplied)return k("the workspace is already initialized",e);Qe.genesisApplied=!0}let r=n(e);if(d(r))return r;let o=Gg(e,t);return o||r}var yt=e=>{let t=Rc(()=>{let n=Qe===null;n&&(Qe={appLog:[],nodeLog:new Map,virtualNodeIds:new Set,genesisApplied:!1});try{let r=e.map(o=>an(o));if(n&&Qe){let o=Wg(Qe);if(o)return e.map(()=>o)}return r}finally{n&&(Qe=null)}});return d(t)?e.map(()=>i(t.message)):t.value};import ah from"node:fs";import dh from"node:path";import{decodeTime as ch,monotonicFactory as lh}from"ulid";import{z as Pn}from"zod";var Xi=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";import $o from"node:fs";import jo from"node:path";import{decodeTime as qg}from"ulid";import{z as Ji}from"zod";var Kg=["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"];var zg=new Set(Kg),Tc=e=>zg.has(e),wc=e=>({action:e.action,payload:e.payload});var Yg=Ji.object({userId:Ji.string().min(1).default("unknown"),userName:Ji.string().min(1).default("unknown")}),Qi=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},Xg=/^[0-9a-hjkmnp-tv-z]{26}$/i,Jg=e=>Xg.test(e)?e.toUpperCase():e,Qg=e=>{let t=jo.basename(e,".jsonl"),n=t.indexOf("."),r=n===-1?t:t.slice(0,n),o=n===-1?void 0:t.slice(n+1),s=Yg.safeParse({userId:Jg(r),userName:o});return s.success?l("Parsed event file actor",s.data):i(`Invalid event file name ${jo.basename(e)}: ${s.error.issues.map(a=>a.path.join(".")||a.message).join(", ")}`)},Zg=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])},eh=(e,t)=>t in e,th=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),nh=e=>{let{userId:t,userName:n,...r}=e,o=Zg(r);if(d(o))return i(o.message);let s=o.value,a=e.id?.[0];return a?eh(r,s)?l("Decoded persisted event",th({id:a,action:s,payload:r[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},ea=(e,t)=>{let n=[],r=new Map,o=new Map;for(let s of e){if(!kc(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:Qi(s)});continue}let a=nh(s);if(d(a)){t?.push({eventId:s.id[0],reason:"invalid-payload",detail:a.message,targetNodeId:Qi(s)});continue}let c=a.value.action;if(!Tc(c)){r.set(c,(r.get(c)??0)+1),t?.push({eventId:s.id[0],reason:"unknown-action",detail:c,targetNodeId:Qi(s)});continue}n.push(a.value)}if(r.size>0){let s=[...r.entries()].map(([a,c])=>`${a} (x${c})`).join(", ");K.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(([a,c])=>`v${a} (x${c})`).join(", ");K.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${s}. Upgrade to apply them.`)}return l("Decoded reconstructed events",n)},rh=(e,t)=>{if(!$o.existsSync(e))return l("Event file missing",[]);let n=Qg(e);if(d(n))return i(n.message);let r=$o.readFileSync(e,"utf8"),o=[],s=jo.basename(e),a=(c,u)=>{t?.push({eventId:null,reason:"corrupt-line",detail:`${s}:${c} (${u})`,targetNodeId:null})};for(let[c,u]of r.split(`
26
- `).entries()){let m=u.trim();if(!m)continue;let p;try{p=JSON.parse(m)}catch{a(c+1,"invalid JSON");continue}let f=Lc(p);if(d(f)){a(c+1,f.message);continue}o.push({...f.value,userId:n.value.userId,userName:n.value.userName})}return l("Parsed persisted events file",o)};function Or(e,t){let n=Tr(e);if(!$o.existsSync(n))return l("No events found",[]);let r=$o.readdirSync(n).filter(s=>s.endsWith(".jsonl")).map(s=>jo.join(n,s)),o=[];for(let s of r){let a=rh(s,t);if(d(a))return i(a.message);o.push(...a.value)}return l("All events loaded",sh(o))}var oh=[];function zt(e){let t=[],n=Or(e,t);if(d(n))return i(n.message);let r=ea(n.value,t);return d(r)?i(r.message):(oh=t,l("Loaded merged events",{events:r.value,unreadable:t}))}function ta(e){let t=Or(e);return d(t)?i(t.message):l("Loaded event actors",t.value.map(({userId:n,userName:r})=>({userId:n,userName:r})))}function Mn(e){let t=zt(e);return d(t)?i(t.message):l("Loaded merged events",t.value.events)}function Ho(e,t){let n=Or(e);if(d(n))return i(n.message);let{appliedEvents:r,unappliedEvents:o}=ih(n.value,t),s=ea(r);if(d(s))return i(s.message);let a=ea(o);return d(a)?i(a.message):l("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:a.value})}function Mc(e=process.cwd()){let t=Or(e);return d(t)?i(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var Zi=(e,t)=>{let n=e.id[0].localeCompare(t.id[0]);return n!==0?n:JSON.stringify(e).localeCompare(JSON.stringify(t))},sh=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 g=n.get(f)??[];g.push(m),n.set(f,g)}for(let m of n.values())m.sort(Zi);let r=[],o=new Set,s=m=>{let p=[m];for(;p.length>0;){let f=p.pop(),g=f.id[0];if(o.has(g))continue;r.push(f),o.add(g);let x=n.get(g)??[];for(let S=x.length-1;S>=0;S--)p.push(x[S])}},a=(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 a)s(m);let c=e.filter(m=>{let p=m.id[0],f=m.id[1]??null;return o.has(p)?!1:f===null||!t.has(f)}).sort(Zi);for(let m of c)s(m);let u=e.filter(m=>!o.has(m.id[0])).sort(Zi);for(let m of u)s(m);return r},Pc=e=>Xn(e.map(t=>{try{return qg(t.id[0])}catch{return null}}));function Wo(e){let t=Or(e);if(d(t))return i(t.message);let n=Pc(t.value);return l("Loaded effective event times",new Map(t.value.map((r,o)=>[r.id[0],n[o]??null])))}var ih=(e,t)=>{let n=new Set,r=[],o=[],s=Pc(e);for(let a=0;a<e.length;a++){let c=e[a],u=c.id[0],m=c.id[1],p=s[a]??null;!(p!==null&&p<t)||m&&n.has(m)?(n.add(u),o.push(c)):r.push(c)}return{appliedEvents:r,unappliedEvents:o}};var Bc=1,Dc=lh(),uh=0xffffffffffff,mh=Do,ph=e=>{let t=Date.now(),n;try{n=ch(e)}catch{return t}return n>=uh?t:n>t+mh?(K.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)},Fc=Pn.tuple([Pn.string().min(1),Pn.string().min(1).nullable()]),fh=Pn.looseObject({v:Pn.literal(Bc),id:Fc}),gh=Pn.looseObject({v:Pn.number().int().positive(),id:Fc}),Lc=e=>{let t=gh.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(", ")}`)},hh=[1];var vh=new Set(hh),kc=e=>vh.has(e),yh=e=>{let t=fh.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(", ")}`)},he=()=>{let{userName:e,userId:t}=Z();return e?t?Ei(t)?Eo(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")},Ln=({userId:e,userName:t})=>`${Xi(e)}.${Xi(t)}.jsonl`,bh=(e,{userId:t,userName:n})=>{let r=Ln({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return i(`Invalid event log file name: ${r}`);let s=dh.join(Tr(e),r);return l("Successfully resolved event log path",s)},xh=(e,t)=>{let n={[e.action]:e.payload,v:Bc,id:t};return yh(n)};function Go({event:e,rootDir:t,edge:n}){try{let r=tc(t);if(d(r))return r;let o=bh(t,{userId:e.userId,userName:e.userName});if(d(o))return o;let s;if(n&&n.current!==void 0)s=n.current;else{let u=Mc(t);if(d(u))return i(u.message);s=u.value}let a=s?Dc(ph(s)):Dc(),c=xh(wc(e),[a,s]);return d(c)?i(c.message):(ah.appendFileSync(o.value,`${JSON.stringify(c.value)}
27
- `,"utf8"),n&&(n.current=a),l("Event persisted",{path:o.value,entry:c.value}))}catch(r){let o=r instanceof Error?r.message:"Unknown persist error";return i(`Failed to persist event: ${o}`)}}function Oc(e,t,n){let r=an(e);if(r.status!==nn.Success)return r;let o=Go({event:e,rootDir:t,edge:n});return d(o)?o:r}function O(e,t){if(e.length===0||!e[0])return i("No events provided");if(h().readOnly)return i(h().readOnlyReason??"Cannot change the board while time travelling");let n={},r=Eh(e[0],t,n);if(d(r))return r;let o=e.map(a=>Oc(a,t,n)),s=o.filter(d);return s.length>0?i("Materialize and persist failed: "+s.map(a=>a.message).join(", ")):l("Materialization succeeded",o.map(a=>a.value))}var Eh=(e,t,n)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return l("Contributor write already in flight",void 0);let r=E.getContributor(e.userId),o={id:Ih(),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=Oc(o,t,n);return d(s)?i(s.message):l("Contributor name recorded",void 0)};var Uc=e=>Vo(ee(e),{at:"end"}),Vo=(e,t={at:"end"})=>{let n=o=>d(o)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(Ye(void 0,void 0));let r=()=>n(Ye(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Ye(void 0,o.rank)):i("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Ye(o.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let o=_c(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let a=o>0?e[o-1]:void 0;return n(Ye(a?.rank,s.rank))}case"after":{let o=_c(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let a=o<e.length-1?e[o+1]:void 0;return n(Ye(s.rank,a?.rank))}}},ee=e=>Object.values(h().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),_c=(e,t)=>e.findIndex(n=>n.id===t),$c=(e,t,n={at:"end"})=>Vo(ee(t).filter(r=>r.id!==e),n),dn=(e,t,n,r,o)=>{let s=$c(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return l("Resolved rank",s.value.rank);let a=Ki(e,r);if(d(a))return a;let c=O([a.value],o);if(d(c))return c;let u=$c(t,e,n);return d(u)?u:u.value.needsRebalance?i("Rank rebalance failed to create space"):l("Resolved rank after rebalance",u.value.rank)},kn=(e,t,n)=>{let r=Uc(e);if(d(r))return r;if(!r.value.needsRebalance)return l("Resolved rank",r.value.rank);let o=Ki(e,t);if(d(o))return o;let s=O([o.value],n);if(d(s))return s;let a=Uc(e);return d(a)?a:a.value.needsRebalance?i("Rank rebalance failed to create space"):l("Resolved rank after rebalance",a.value.rank)};var D={exit(){process.exit(0)},enterChildNode(){let e=h(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=J(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||D.navigate({contextNode:o,selectedIndex:J(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=h();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=J(n.id),o=r.findIndex(({id:a})=>a===e.id),s=r.length===0?-1:o>=0?o:0;D.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>jc(1),navigateToPreviousItem:()=>jc(-1),navigateToNextContainer:()=>Hc(1),navigateToPreviousContainer:()=>Hc(-1),navigate:({contextNode:e,selectedIndex:t})=>{N({contextNodeId:e.id,selectedIndex:t})}},jc=e=>{let{selectedIndex:t,contextNode:n}=h(),r=J(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;D.navigate({selectedIndex:s,contextNode:n})},Hc=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=h();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=J(o.id),a=s.findIndex(g=>g.id===t.id);if(a<0)return;let c=s.at(a+e)??s.at(0);if(!c)return;let u=J(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),f=u.length?p:-1;D.navigate({contextNode:c,selectedIndex:f})};var Gc=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Vc=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=h();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},Sh=e=>{let t=h().nodes[e];return!!t&&!t.isDeleted&&ot(t)&&t.childRenderAxis==="vertical"},Ko=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r||r.isDeleted)return!1;let o=ee(r.id);return D.navigate({contextNode:r,selectedIndex:Gc(t,o.length)}),!0},Kc=e=>{let{nodes:t}=h(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Ko(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let a=ee(o.id).findIndex(c=>c.id===n.id);return a>=0?(D.navigate({contextNode:o,selectedIndex:a}),!0):Kc(o.id)},Wc=e=>{let{nodes:t}=h(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Kc(n))return!0;n=t[n]?.parentNodeId}return!1},Ch=e=>{if(!e)return!1;let t=h().nodes[e];return!!t&&!t.isDeleted},zc=e=>{let{nodes:t,rootNodeId:n}=h();if(Sh(e.contextNodeId)&&Ko(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Ch(e.selectedNodeId)&&e.selectedNodeId&&Wc(e.selectedNodeId))return l("Restored navigation to selected node or ancestor",null);if(Ko(e.contextNodeId,e.selectedIndex))return l("Restored navigation to previous container",null);if(e.parentNodeId&&Ko(e.parentNodeId,e.selectedIndex))return l("Restored navigation to previous parent",null);if(Wc(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=ee(r.id);return D.navigate({contextNode:r,selectedIndex:Gc(e.selectedIndex,o.length)}),l("Restored navigation to root",null)};import{monotonicFactory as Nh,ulid as Lt}from"ulid";var Ur=Nh();function Rh(){let e=Ze();if(d(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]=J(n.id),[o]=r?J(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=Rh();return d(e)?e:D.navigate(e.value)}function qc({userId:e,userName:t}){let n=Ur(),r=Ur(),o=Ur(),s=Ur(),a=Ur(),c=Ye(void 0,void 0);if(d(c))return c;let u=Ye(void 0,void 0);if(d(u))return u;let m=Ye(u.value,void 0);if(d(m))return m;let p=Ye(void 0,void 0);if(d(p))return p;let f=Ye(p.value,void 0);if(d(f))return f;let g=Ye(f.value,void 0);if(d(g))return g;let x=Ye(void 0,void 0);return d(x)?x:l("Created default events",[{id:Lt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:Lt(),userId:e,userName:t,action:"create.contributor",payload:{id:e,name:t}},{id:Lt(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Lt(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Lt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:Lt(),userId:e,userName:t,action:"add.swimlane",payload:{id:a,name:"Done",parent:r,rank:g.value}},{id:Lt(),userId:e,userName:t,action:"add.board",payload:{id:_o,name:"Closed",parent:n,rank:m.value}},{id:Lt(),userId:e,userName:t,action:"add.swimlane",payload:{id:Ce,name:"Closed",parent:_o,rank:x.value}},{id:Lt(),userId:e,userName:t,action:"lock.node",payload:{id:_o}},{id:Lt(),userId:e,userName:t,action:"lock.node",payload:{id:Ce}}])}var Th=()=>{let e=Ze();if(d(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(", ");K.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(", ");K.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}};function qt(e,t=[]){if(Th())return l("Skipped boot while checked out at a historical point",null);if(!e.length){let s=le.workspace("temporary-uninitialized-workspace","Workspace","a0"),a=Fr(s);return d(a)?a:(N({hasProjectDefinition:!1,mode:y.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=yt(e),{fatal:r,skipped:o}=Vt(n);return r.length>0?i(`Materializing failed:
23
+ `).filter(Boolean).filter(i=>i!==Ze);if(r.length===0)return l("State branch is storage-only",!1);let o=await $({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return a(`Failed to clean storage branch
24
+ ${o.message}`);let s=await ir({cwd:e,message:"[epiq:repair-storage-branch]",pathspec:r});return d(s)?a(s.message):l("Cleaned storage branch",!0)},bt=Ui(async(e=process.cwd())=>{let t=await $({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?a("Not inside a Git repository"):l("Resolved repo root",t.value.stdout.trim())},e=>ut.resolve(e)),gC=Ui(async e=>{let t=await $({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return a(t.message);let n=t.value.stdout.trim(),r=ut.isAbsolute(n)?n:ut.join(e,n);return l("Resolved git dir",r)},e=>ut.resolve(e));var EC=process.env.IS_LOCAL==="true",Ze=".epiq",un="events",Qi="media",ah="project.json",Fn=e=>wt.join(e,Ze),_o=e=>wt.join(Fn(e),ah),$n=e=>wt.join(Fn(e),un),$r=e=>wt.join(Fn(e),Qi),bc=e=>wt.join(e,Ze),dh=e=>{let t=wt.join(e,Ze);return _r.existsSync(t)&&_r.statSync(t).isDirectory()},jr=e=>{let t=_o(e);return _r.existsSync(t)&&_r.statSync(t).isFile()},$o=e=>{let t=wt.resolve(e);for(;;){if(dh(t))return l("Resolved closest .epiq root",t);let n=wt.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},Zi="No .epiq/project.json found in any parent",$e=e=>{let t=wt.resolve(e);for(;;){if(jr(t))return l("Resolved closest epiq project root",t);let n=wt.dirname(t);if(n===t)return a(Zi);t=n}},xc=e=>{let t=$n(e);try{return _r.mkdirSync(t,{recursive:!0}),l("Resolved events dir",t)}catch(n){return a(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},Mt=async()=>{let e=await bt(process.cwd());if(d(e))return e;let t=Ce({repoRoot:e.value});return d(t)?t:l("Resolved persist root",t.value)};import{accessSync as ch,copyFileSync as lh,existsSync as Ko,mkdirSync as Ic,readdirSync as Ec,readFileSync as uh,renameSync as mh,rmSync as ph,statSync as Sc,unlinkSync as fh,writeFileSync as gh}from"node:fs";import ar from"node:path";var ea=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",we={writeToFile:(e,t)=>{try{let n=ar.dirname(e);Ko(n)||Ic(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);gh(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return uh(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 Ko(e)&&Sc(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await ch(e),!0}catch{return!1}},mkDir:e=>Ic(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=ar.parse(t);for(;;){let r=ar.join(t,e);try{if(Ko(r)&&Sc(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=Ec(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)?Ec(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{fh(e)}catch(t){(!ea(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{ph(e,{recursive:!0,force:!0})}catch(t){(!ea(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(ar.dirname(t)),!n?.overwrite&&Ko(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{mh(e,t)}catch(r){if(ea(r)&&r.code==="EXDEV"){lh(e,t),this.rmFile(e);return}throw r}}};var vh={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Cc=qt.object({logLevel:qt.enum(["info","error","debug"]),preferredEditor:qt.string().optional(),userName:qt.string().optional(),userId:qt.string().optional(),autoSync:qt.boolean().nullable().optional(),autoSyncDebounceMs:qt.number().optional(),attachmentMaxKb:qt.number().optional(),viewMode:qt.enum(["dense","wide"]).optional()}).partial(),yh="config.json",Nc=On,ta=()=>hh.join(Nc(),yh),na=()=>{try{return we.mkDir(Nc()),l(`Ensured ~/${yt} exists`,null)}catch{return a(`Unable to create ~/${yt}`)}},bh=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${yt}/config.json JSON`)}let n=Cc.safeParse(t??{});return n.success?l("Parsed config",n.data):a(`Invalid ~/${yt}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},dr=()=>{let e=na();if(d(e))return a(e.message);let t=ta(),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}):bh(n)},Rc=e=>{let t=na();if(d(t))return a(t.message);let n=Cc.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=ta();try{return we.writeToFile(r,JSON.stringify(n.data,null,2)+`
25
+ `),l("Config written",null)}catch{return a(`Unable to write ~/${yt}/config.json`)}},mt=e=>{let t=dr();if(d(t))return a("Failed to read existing config");let n={...t.value,...e};return Rc(n)},Pt=()=>{let e=ta(),t=na();if(d(t))return a(`Unable to create ~/${yt}`);if(!(we.readFile(e)!==null)){let C=Rc(vh);if(d(C))throw new Error(`Unable to create ~/${yt}/config.json`)}let r=dr();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:i,autoSync:c,autoSyncDebounceMs:u,attachmentMaxKb:m,logLevel:p,viewMode:f}=r.value,v=sr({userId:i,userName:s});if(d(v))return a(v.message);let N=v.value??{userId:i,userName:s};return!N.userName||!N.userId?a(`User name or ID not configured in ~/${yt}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,l("successfully loaded settings",{logLevel:p??"debug",preferredEditor:o??"",userName:N.userName,userId:N.userId,autoSync:c??!1,autoSyncIntervalMs:u??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))};import{useSyncExternalStore as xh}from"react";var Hr={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},ra=new Set,Ih=()=>{for(let e of ra)e()},Z=()=>Hr,Ac=()=>xh(e=>(ra.add(e),()=>{ra.delete(e)}),()=>Hr),je=e=>(Hr={...Hr,...e},Ih(),Hr);import{spawn as Eh}from"node:child_process";import oa from"node:process";var sa=e=>{let t=oa.platform==="darwin"?"open":oa.platform==="win32"?"cmd":"xdg-open",n=oa.platform==="win32"?["/c","start","",e]:[e];Eh(t,n,{detached:!0,stdio:"ignore"}).unref()};import{readFile as zf}from"node:fs/promises";import wn from"chalk";import Cp from"string-width";import{decodeTime as Tc}from"ulid";var zo=1440*60*1e3,ia=(e,t=Date.now())=>e>t+zo?t:e,tt=e=>ia(Tc(e)),cr=e=>{let t=Date.now()+zo,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})},qo=e=>{try{return l("Decoded date",new Date(tt(e)))}catch(t){return a("Decoding failed + "+t.message)}},lr=e=>{if(!e?.id)return null;try{return Tc(e.id)}catch{return null}};var Yo="removed",qe=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?l("Found node",n):a("Unable to find node in breadcrumb")},wc=["png","jpg","gif","webp"];var U={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function aa(e){return e.context===U.WORKSPACE}function P(e){return e.context===U.TICKET}function mn(e){return e.context===U.TEXT}function st(e){return e.context===U.FIELD}function Wr(e){return e.context===U.FIELD_LIST}var Lt=e=>e.context===U.SWIMLANE,Gr=e=>e.context===U.BOARD,Vr=e=>e.context===U.COMMENT;import{useSyncExternalStore as Yx}from"react";var y={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};var Mc=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Pc=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Lc=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",kc=(e,t)=>{if(Pc(e,e.sequence))return x.MoveCursorLeftOfWord;if(Lc(e,e.sequence))return x.MoveCursorRightOfWord;if(Mc(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.GetLastCommandFromHistory;case"down":return x.GetNextCommandFromHistory;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}},Dc=(e,t)=>{if(Pc(e,e.sequence))return x.MoveCursorLeftOfWord;if(Lc(e,e.sequence))return x.MoveCursorRightOfWord;if(Mc(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.NavPreviousItem;case"down":return x.NavNextItem;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}};import Bc from"string-width";function Xo(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Yt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Sh=/\u001B\[[0-9;]*m/,da="\x1B[0m",Ch=e=>[...new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)].map(({segment:t})=>t),ca=(e,t)=>{if(t<=0)return"";if(Bc(e)<=t)return e;if(t<=3)return"...".slice(0,t);let r=t-3,o="",s=0,i=!1;for(let c of e.split(/(\u001B\[[0-9;]*m)/))if(c!==""){if(Sh.test(c)){o+=c,i=c!==da&&c!=="\x1B[m";continue}for(let u of Ch(c)){let m=Bc(u);if(s+m>r)return`${o}...${i?da:""}`;o+=u,s+=m}}return`${o}...${i?da:""}`},Ye=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),Fc=e=>e.charAt(0).toUpperCase()+e.slice(1);var Oc=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},Uc=(e,t)=>t?e.get(t)??[]:[];var _c=new WeakMap,Nh=e=>{let t=_c.get(e);return t||(t=Oc(e),_c.set(e,t)),t};var $c=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Uc(Nh(e),r).filter(s=>Xo(r,s)>=n)};var Rh={hint:"",hints:[],overlap:0,remainder:""},jc=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Rh;let o=$c({wordList:r,inputToMatch:e,overlapThreshold:1});return Ah(t,o)},Ah=(e,t)=>{let n=t[0]??"",r=Xo(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),i=r<(o??"").length,c=!!s,p=(c&&i?o:n)+(c&&i?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}};import{ulid as Mh}from"ulid";var Kr=24n,Th=Kr*4n,kt=(1n<<Th)-1n,wh=/^[0-9a-f]+$/;function Hc(e){return!e||!wh.test(e)?a(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function pt(e,t=Kr){if(e<0n)return a("Negative rank not allowed");let n=e.toString(16);return l("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Xe(e,t){if(!e&&!t)return pt(kt/2n,Kr);let n=e?Hc(e):l("Resolved lower bound",0n);if(d(n))return n;let r=t?Hc(t):l("Resolved upper bound",kt);if(d(r))return r;let o=n.value,s=r.value;if(s<=o)return a("Neighbouring ranks leave no space between them");let i=(o+s)/2n;return i===o||i===s?a("No rank space available between neighbors"):pt(i,Kr)}function Wc(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=kt*BigInt(r+1)/(t+1n),s=pt(o,Kr);if(d(s))return s;n.push(s.value)}return l("Resolved evenly spaced ranks",n)}var la=(e,t)=>{let n=ee(e),r=Wc(n.length);if(d(r))return r;let o={};for(let s=0;s<n.length;s++){let i=n[s],c=r.value[s];if(!i||!c)return a("Unable to assign rebalance rank");o[i.id]=c}return l("Created rebalance event",{id:Mh(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import{ulid as yv}from"ulid";var ce={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var V=e=>e.slice(-7).toUpperCase(),Jo=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?V(e).includes(n):!0};var le={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:U.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:V(e)},context:U.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:U.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:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:U.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),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:U.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:V(e)},context:U.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:U.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:i=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:U.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};var Ph=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ee,Qo]=Ph;var ua=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),D=(e,t)=>({...ua(e,t),convergence:!0}),qr=e=>d(e)&&e.convergence===!0,Xt=e=>{let t=e.filter(d);return{fatal:t.filter(n=>!qr(n)),skipped:t.filter(qr)}},Jt=e=>{e.length!==0&&K.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},Gc=e=>{let t=E.getNode(e);if(!t||!P(t)||t.isDeleted)return null;let n=zc(t);return d(n)?n:null},Vc=e=>{if(!pa())return null;for(let t of e){let n=Gc(t);if(n)return n;let r=g().nodes[t]?.parentNodeId;if(!r)continue;let o=Gc(r);if(o)return o}return null},Lh=(e,t)=>{let n=E.getNode(e);n&&E.updateNode({...n,log:[...n.log??[],t]})},kh=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},ma=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 kh(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[]}},Dh=e=>{Ne(t=>({...t,eventLog:[...t.eventLog,e]}))},Bh=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?ua("Invalid user ID format",e):l("Valid user",null)},nt=null,Fh=e=>{for(let[t,n]of e.nodeLog){let r=E.getNode(t);r&&E.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&Ne(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),Vc([...e.virtualNodeIds])},Oh=(e,t)=>{let n=Bh(e);if(d(n))return n;let r=[...new Set(ma(e))];if(nt){for(let s of r){if(!t){let i=nt.nodeLog.get(s);i?i.push(e):nt.nodeLog.set(s,[e])}if(pa()){nt.virtualNodeIds.add(s);let i=g().nodes[s]?.parentNodeId;i&&nt.virtualNodeIds.add(i)}}return t||nt.appLog.push(e),null}t||(r.forEach(s=>Lh(s,e)),Dh(e));let o=Vc(r);return o||null},zr=(e,t,n)=>E.getNode(e)?D(`a node with id ${e} already exists`,n):t===e?D("a node cannot be its own parent",n):null,Uh={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=le.workspace(t,n,r),s=Yr(o);if(d(s))return ua(s.message,e);let i=E.createNode(o);return d(i)?D(i.message??"Failed to initialize workspace",e):aa(i.value)?l("Workspace initialized",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=zr(t,void 0,e);if(o)return o;let s=E.createNode(le.workspace(t,n,r));return d(s)?D(s.message??"Failed to add workspace",e):aa(s.value)?l("Added workspace",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=zr(t,r,e);if(s)return s;let i=E.createNode(le.board(t,n,r,o));return d(i)?D(i.message??"Unable to create board",e):Gr(i.value)?l("Added board",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=zr(t,r,e);if(s)return s;let i=E.createNode(le.swimlane(t,n,r,o));return d(i)?D(i.message??"Unable to create swimlane",e):Lt(i.value)?l("Added swimlane",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=zr(t,r,e);if(s)return s;let i=E.createNode(le.ticket(t,n,r,o));return d(i)?D(i.message??"Unable to create issue",e):P(i.value)?l("Added issue",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,i=zr(t,r,e);if(i)return i;let c=E.createNode(le.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(ce.DESCRIPTION)?"vertical":"horizontal"}));return d(c)?D(c.message??`Unable to create field: ${n}`,e):st(c.value)?l("Added field",{action:e.action,result:c.value}):a("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!E.getNode(t))return D(`Unable to locate node with id ${t}`,e);let o=E.renameNode(t,n);return d(o)?D(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=E.tombstoneNode(t);return d(n)?D(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=E.createTag({id:t,name:n});return d(r)?D(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=E.tombstoneTag(t);return d(n)?D(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=E.restoreTag(t,n);return d(r)?D(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=E.createContributor({id:t,name:n});return d(r)?D(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=E.renameContributor(t,n);return d(r)?D(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=E.tombstoneContributor(t);return d(n)?D(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=E.restoreContributor(t,n);return d(r)?D(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=E.tag(t,n);return d(r)?D(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=E.untag(t,n);return d(r)?D(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=E.assign(t,n);return d(r)?D(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=E.unassign(t,n);return d(r)?D(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=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?D(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=E.editValue(t,n);return d(r)?D(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=E.getNode(t);if(!o)return D("Unable to locate issue",e);if(!P(o))return D("Can only close issues",e);let s=E.getNode(Ee);if(!s)return D("Unable to locate target swimlane",e);if(n!==s.id)return D("Close target must be closed swimlane",e);let i=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(i)?D(i.message??"Unable to close issue",e):l("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return D("Unable to locate issue",e);if(!P(o))return D("Can only reopen issues",e);let s=E.getNode(Ee);if(!s)return D("Unable to locate closed swimlane",e);if(n===s.id)return D("Cannot reopen issue into closed swimlane",e);if(!E.getNode(n))return D("Reopen parent no longer exists",e);let c=E.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?D(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=E.lockNode(t);return d(n)?D(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=E.getNode(r);if(!s)return D(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return D(`Node ${r} is not child of ${t}`,e);let i=E.updateNode({...s,rank:o});if(d(i))return D(i.message??"Unable to rebalance child",e)}return l("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:r,md:o}=e.payload,s=E.createComment({id:t,issue:n,authorId:r,authorName:E.getContributor(r)?.name??"Unknown",md:o,deleted:!1});return d(s)?D(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=E.getComment(t);if(!o)return D("Unable to locate comment",e);if(o.issue!==n)return D("Comment does not belong to issue",e);let s=E.editComment(t,r);return d(s)?D(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=E.getComment(t);if(!r)return D("Unable to locate comment",e);if(r.issue!==n)return D("Comment does not belong to issue",e);let o=E.deleteComment(t);return d(o)?D(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:i}=e.payload,c=E.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:i,deleted:!1});return d(c)?D(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=E.getAttachment(t);if(!r)return D("Unable to locate attachment",e);if(r.issue!==n)return D("Attachment does not belong to issue",e);let o=E.deleteAttachment(t);return d(o)?D(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=E.linkUserId({contributorId:t,userId:e.userId});return d(n)?D(n.message??"Unable to link contributor",e):l("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};function pn(e,t=!1){let n=Uh[e.action];if(!n)return a(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);if(!ft()&&e.action!=="init.workspace")return D(`${e.action} arrived before the workspace was initialized`,e);if(e.action==="init.workspace"&&nt){if(nt.genesisApplied)return D("the workspace is already initialized",e);nt.genesisApplied=!0}let r;try{r=n(e)}catch(s){return D(`threw while materializing (${s instanceof Error?s.message:String(s)})`,e)}if(d(r))return r;let o=Oh(e,t);return o||r}var xt=e=>{let t=Kc(()=>{let n=nt===null;n&&(nt={appLog:[],nodeLog:new Map,virtualNodeIds:new Set,genesisApplied:!1});try{let r=e.map(o=>pn(o));if(n&&nt){let o=Fh(nt);if(o)return e.map(()=>o)}return r}finally{n&&(nt=null)}});return d(t)?e.map(()=>a(t.message)):t.value};import sv from"node:fs";import al from"node:path";import{decodeTime as iv,monotonicFactory as av}from"ulid";import{z as jn}from"zod";var fa=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";import ts from"node:fs";import ns from"node:path";import{decodeTime as Kh}from"ulid";import{z as va}from"zod";import{existsSync as _h,readdirSync as $h,statSync as jh}from"node:fs";import Hh from"node:path";var gn=e=>{let t=$n(e);return _h(t)?$h(t).filter(n=>n.endsWith(".jsonl")).sort().map(n=>{let{size:r,mtimeMs:o}=jh(Hh.join(t,n));return`${n}:${r}:${o}`}).join("|"):"none"},qc=e=>new Map(e.split("|").filter(Boolean).map(t=>{let n=t.indexOf(":");return[t.slice(0,n),t.slice(n+1)]})),ga=(e,t,n)=>{let r=qc(t),o=gn(e),s=qc(o);for(let[i,c]of s)if(i!==n&&r.get(i)!==c)return null;for(let i of r.keys())if(i!==n&&!s.has(i))return null;return o},fn=null,Yc=e=>fn&&fn.root===e?fn.signature:null,Xc=(e,t)=>{fn={root:e,signature:t}},Jc=(e,t)=>{if(!fn||fn.root!==e)return;let n=ga(e,fn.signature,t);fn=n===null?null:{root:e,signature:n}};var Wh=["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"];var Gh=new Set(Wh),Qc=e=>Gh.has(e),Zc=e=>({action:e.action,payload:e.payload});import{z as W}from"zod";var H=W.string().min(1),It=W.string(),hn=W.string(),Zo=W.looseObject({id:H}),ha=W.looseObject({id:H,name:It,parent:H,rank:hn}),Vh={"init.workspace":W.looseObject({id:H,name:It,rank:hn}),"add.workspace":W.looseObject({id:H,name:It,rank:hn}),"add.board":ha,"add.swimlane":ha,"add.issue":ha,"add.field":W.looseObject({id:H,name:It,parent:H,rank:hn}),"edit.title":W.looseObject({id:H,name:It}),"delete.node":Zo,"lock.node":Zo,"move.node":W.looseObject({id:H,parent:H,rank:hn}),"edit.description":W.looseObject({id:H,md:W.string()}),"close.issue":W.looseObject({id:H,parent:H,rank:hn}),"reopen.issue":W.looseObject({id:H,parent:H,rank:hn}),"create.tag":W.looseObject({id:H,name:It}),"tombstone.tag":Zo,"restore.tag":W.looseObject({id:H,name:It}),"create.contributor":W.looseObject({id:H,name:It}),"rename.contributor":W.looseObject({id:H,name:It}),"tombstone.contributor":Zo,"restore.contributor":W.looseObject({id:H,name:It}),"link.contributor.user":W.looseObject({contributor:H}),"add.issue.assignee":W.looseObject({id:H,assignee:H}),"remove.issue.assignee":W.looseObject({id:H,assignee:H}),"add.issue.tag":W.looseObject({id:H,tag:H}),"remove.issue.tag":W.looseObject({id:H,tag:H}),"add.issue.comment":W.looseObject({id:H,issue:H,md:W.string()}),"edit.issue.comment":W.looseObject({id:H,issue:H,md:W.string()}),"delete.issue.comment":W.looseObject({id:H,issue:H}),"add.issue.attachment":W.looseObject({id:H,issue:H,hash:W.string().min(1),ext:W.string().min(1),name:It,bytes:W.number()}),"delete.issue.attachment":W.looseObject({id:H,issue:H}),"rebalance.children":W.looseObject({parent:H,ranks:W.record(W.string(),hn)})},el=(e,t)=>{let r=Vh[e].safeParse(t);return r.success?l("Payload is readable",void 0):a(`${e}: ${r.error.issues.map(o=>`${o.path.join(".")||"payload"} ${o.message}`).join(", ")}`)};var zh=va.object({userId:va.string().min(1).default("unknown"),userName:va.string().min(1).default("unknown")}),es=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},qh=/^[0-9a-hjkmnp-tv-z]{26}$/i,Yh=e=>qh.test(e)?e.toUpperCase():e,Xh=e=>{let t=ns.basename(e,".jsonl"),n=t.indexOf("."),r=n===-1?t:t.slice(0,n),o=n===-1?void 0:t.slice(n+1),s=zh.safeParse({userId:Yh(r),userName:o});return s.success?l("Parsed event file actor",s.data):a(`Invalid event file name ${ns.basename(e)}: ${s.error.issues.map(i=>i.path.join(".")||i.message).join(", ")}`)},Jh=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?a(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?a("Invalid persisted event: action key is missing or invalid"):l("Resolved persisted action",t[0])},Qh=(e,t)=>t in e,Zh=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),ev=e=>{let{userId:t,userName:n,...r}=e,o=Jh(r);if(d(o))return a(o.message);let s=o.value,i=e.id?.[0];return i?Qh(r,s)?l("Decoded persisted event",Zh({id:i,action:s,payload:r[s],userId:t,userName:n})):a(`Persisted event is missing payload for action: ${s}`):a("Persisted event is missing id")},ba=(e,t)=>{let n=[],r=new Map,o=new Map;for(let s of e){if(!sl(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:es(s)});continue}let i=ev(s);if(d(i)){t?.push({eventId:s.id[0],reason:"invalid-payload",detail:i.message,targetNodeId:es(s)});continue}let c=i.value.action;if(!Qc(c)){r.set(c,(r.get(c)??0)+1),t?.push({eventId:s.id[0],reason:"unknown-action",detail:c,targetNodeId:es(s)});continue}let u=el(c,i.value.payload);if(d(u)){t?.push({eventId:s.id[0],reason:"invalid-payload",detail:u.message,targetNodeId:es(s)});continue}n.push(i.value)}if(r.size>0){let s=[...r.entries()].map(([i,c])=>`${i} (x${c})`).join(", ");K.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(([i,c])=>`v${i} (x${c})`).join(", ");K.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${s}. Upgrade to apply them.`)}return l("Decoded reconstructed events",n)},tv=(e,t)=>{if(!ts.existsSync(e))return l("Event file missing",[]);let n=Xh(e);if(d(n))return a(n.message);let r=ts.readFileSync(e,"utf8"),o=[],s=ns.basename(e),i=(c,u)=>{t?.push({eventId:null,reason:"corrupt-line",detail:`${s}:${c} (${u})`,targetNodeId:null})};for(let[c,u]of r.split(`
26
+ `).entries()){let m=u.trim();if(!m)continue;let p;try{p=JSON.parse(m)}catch{i(c+1,"invalid JSON");continue}let f=ol(p);if(d(f)){i(c+1,f.message);continue}o.push({...f.value,userId:n.value.userId,userName:n.value.userName})}return l("Parsed persisted events file",o)};function Xr(e,t){let n=$n(e),r=gn(e);if(!ts.existsSync(n))return l("No events found",[]);let o=ts.readdirSync(n).filter(c=>c.endsWith(".jsonl")).map(c=>ns.join(n,c)),s=[];for(let c of o){let u=tv(c,t);if(d(u))return a(u.message);s.push(...u.value)}let i=rv(s);return Qt={root:e,signature:r,edge:i.at(-1)?.id?.[0]??null},l("All events loaded",i)}var nv=[];function Zt(e){let t=[],n=Xr(e,t);if(d(n))return a(n.message);let r=ba(n.value,t);return d(r)?a(r.message):(nv=t,l("Loaded merged events",{events:r.value,unreadable:t}))}function xa(e){let t=Xr(e);return d(t)?a(t.message):l("Loaded event actors",t.value.map(({userId:n,userName:r})=>({userId:n,userName:r})))}function vn(e){let t=Zt(e);return d(t)?a(t.message):l("Loaded merged events",t.value.events)}function rs(e,t){let n=Xr(e);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=ov(n.value,t),s=ba(r);if(d(s))return a(s.message);let i=ba(o);return d(i)?a(i.message):l("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:i.value})}var Qt=null;function tl(e=process.cwd()){let t=gn(e);if(Qt&&Qt.root===e&&Qt.signature===t)return l("Loaded edge reference, unchanged",Qt.edge);let n=Xr(e);return d(n)?a(n.message):l("Loaded edge reference",n.value.at(-1)?.id?.[0]??null)}function nl(e,t,n){if(!Qt||Qt.root!==e)return;let r=ga(e,Qt.signature,t);Qt=r===null?null:{root:e,signature:r,edge:n}}var ya=(e,t)=>{let n=e.id[0].localeCompare(t.id[0]);return n!==0?n:JSON.stringify(e).localeCompare(JSON.stringify(t))},rv=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 v=n.get(f)??[];v.push(m),n.set(f,v)}for(let m of n.values())m.sort(ya);let r=[],o=new Set,s=m=>{let p=[m];for(;p.length>0;){let f=p.pop(),v=f.id[0];if(o.has(v))continue;r.push(f),o.add(v);let N=n.get(v)??[];for(let C=N.length-1;C>=0;C--)p.push(N[C])}},i=(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 i)s(m);let c=e.filter(m=>{let p=m.id[0],f=m.id[1]??null;return o.has(p)?!1:f===null||!t.has(f)}).sort(ya);for(let m of c)s(m);let u=e.filter(m=>!o.has(m.id[0])).sort(ya);for(let m of u)s(m);return r},rl=e=>cr(e.map(t=>{try{return Kh(t.id[0])}catch{return null}}));function os(e){let t=Xr(e);if(d(t))return a(t.message);let n=rl(t.value);return l("Loaded effective event times",new Map(t.value.map((r,o)=>[r.id[0],n[o]??null])))}var ov=(e,t)=>{let n=new Set,r=[],o=[],s=rl(e);for(let i=0;i<e.length;i++){let c=e[i],u=c.id[0],m=c.id[1],p=s[i]??null;!(p!==null&&p<t)||m&&n.has(m)?(n.add(u),o.push(c)):r.push(c)}return{appliedEvents:r,unappliedEvents:o}};var dl=1,il=av(),dv=0xffffffffffff,cv=zo,lv=e=>{let t=Date.now(),n;try{n=iv(e)}catch{return t}return n>=dv?t:n>t+cv?(K.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)},cl=jn.tuple([jn.string().min(1),jn.string().min(1).nullable()]),uv=jn.looseObject({v:jn.literal(dl),id:cl}),mv=jn.looseObject({v:jn.number().int().positive(),id:cl}),ol=e=>{let t=mv.safeParse(e);return t.success?l("Parsed persisted event envelope",t.data):a(`Invalid persisted event envelope: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},pv=[1];var fv=new Set(pv),sl=e=>fv.has(e),gv=e=>{let t=uv.safeParse(e);return t.success?l("Parsed persisted event",t.data):a(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ge=()=>{let{userName:e,userId:t}=Z();return e?t?Fi(t)?Fo(e)?l("Successfully resolved actor ID",{userId:t,userName:e}):a("Invalid user name in config"):a("Invalid user ID in config"):a("User ID not configured"):a("User name not configured")},Hn=({userId:e,userName:t})=>`${fa(e)}.${fa(t)}.jsonl`,hv=(e,{userId:t,userName:n})=>{let r=Hn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return a(`Invalid event log file name: ${r}`);let s=al.join($n(e),r);return l("Successfully resolved event log path",s)},vv=(e,t)=>{let n={[e.action]:e.payload,v:dl,id:t};return gv(n)};function Ia(e,t){let n;if(t&&t.current!==void 0)n=t.current;else{let o=tl(e);if(d(o))return a(o.message);n=o.value}let r=n?il(lv(n)):il();return l("Minted event id",[r,n])}function ss({event:e,rootDir:t,edge:n,id:r}){try{let o=xc(t);if(d(o))return o;let s=hv(t,{userId:e.userId,userName:e.userName});if(d(s))return s;let i=r?l("Minted event id",r):Ia(t,n);if(d(i))return a(i.message);let[c,u]=i.value,m=vv(Zc(e),[c,u]);if(d(m))return a(m.message);sv.appendFileSync(s.value,`${JSON.stringify(m.value)}
27
+ `,"utf8"),n&&(n.current=c);let p=al.basename(s.value);return nl(t,p,c),Jc(t,p),l("Event persisted",{path:s.value,entry:m.value})}catch(o){let s=o instanceof Error?o.message:"Unknown persist error";return a(`Failed to persist event: ${s}`)}}function ll(e,t,n){let r=Ia(t,n);if(d(r))return a(r.message);let o={...e,id:r.value[0]},s=pn(o);if(s.status!==dn.Success)return s;let i=ss({event:o,rootDir:t,edge:n,id:r.value});return d(i)?i:s}function _(e,t){if(e.length===0||!e[0])return a("No events provided");if(g().readOnly)return a(g().readOnlyReason??"Cannot change the board while time travelling");let n={},r=bv(e[0],t,n);if(d(r))return r;let o=e.map(i=>ll(i,t,n)),s=o.filter(d);return s.length>0?a("Materialize and persist failed: "+s.map(i=>i.message).join(", ")):l("Materialization succeeded",o.map(i=>i.value))}var bv=(e,t,n)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return l("Contributor write already in flight",void 0);let r=E.getContributor(e.userId),o={id:yv(),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=ll(o,t,n);return d(s)?a(s.message):l("Contributor name recorded",void 0)};var Wn=e=>e.trim().toLocaleLowerCase(),Ea=(e,t)=>Wn(e).includes(Wn(t));var xv=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},Iv=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},ul=null,ml=new Map,Ev=()=>{let e=g().eventLog??[];if(e===ul)return ml;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 ul=e,ml=t,t},Sv=e=>{let{contributors:t}=g(),n=Ev().get(e.id);return n?[...n].map(r=>t[r]?.name).filter(r=>!!r):[]},pl=(e,t)=>{let n=Wn(t.value);if(!n)return!0;switch(t.target){case"title":return Ea(e.title??"",n);case"description":return Ea(e.props.description??"",n);case"tag":return xv(e).map(Wn).some(o=>o.includes(n));case"assignee":return Iv(e).map(Wn).some(o=>o.includes(n));case"actor":return Sv(e).map(Wn).some(o=>o.includes(n));case"ref":return Jo(e.id,t.value);default:return!0}};var fl=(e,t)=>e.rank.localeCompare(t.rank),Cv=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,gl=(e,t)=>Object.values(e).filter(n=>Cv(n,t)).sort(fl),hl=(e,t)=>{let n={};for(let r of Object.values(e)){if(P(r)&&t.length>0&&!t.every(s=>pl(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(fl);return n};var vl=e=>is(ee(e),{at:"end"}),is=(e,t={at:"end"})=>{let n=o=>d(o)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(Xe(void 0,void 0));let r=()=>n(Xe(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Xe(void 0,o.rank)):a("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Xe(o.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let o=yl(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let i=o>0?e[o-1]:void 0;return n(Xe(i?.rank,s.rank))}case"after":{let o=yl(e,t.sibling),s=o<0?void 0:e[o];if(!s)return r();let i=o<e.length-1?e[o+1]:void 0;return n(Xe(s.rank,i?.rank))}}},ee=e=>{let t=g();if(!xl()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return gl(t.nodes,e)},yl=(e,t)=>e.findIndex(n=>n.id===t),bl=(e,t,n={at:"end"})=>is(ee(t).filter(r=>r.id!==e),n),yn=(e,t,n,r,o)=>{let s=bl(t,e,n);if(d(s))return s;if(!s.value.needsRebalance)return l("Resolved rank",s.value.rank);let i=la(e,r);if(d(i))return i;let c=_([i.value],o);if(d(c))return c;let u=bl(t,e,n);return d(u)?u:u.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",u.value.rank)},Gn=(e,t,n)=>{let r=vl(e);if(d(r))return r;if(!r.value.needsRebalance)return l("Resolved rank",r.value.rank);let o=la(e,t);if(d(o))return o;let s=_([o.value],n);if(d(s))return s;let i=vl(e);return d(i)?i:i.value.needsRebalance?a("Rank rebalance failed to create space"):l("Resolved rank after rebalance",i.value.rank)};var F={exit(){process.exit(0)},enterChildNode(){let e=g(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=J(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||F.navigate({contextNode:o,selectedIndex:J(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=J(n.id),o=r.findIndex(({id:i})=>i===e.id),s=r.length===0?-1:o>=0?o:0;F.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Il(1),navigateToPreviousItem:()=>Il(-1),navigateToNextContainer:()=>El(1),navigateToPreviousContainer:()=>El(-1),navigate:({contextNode:e,selectedIndex:t})=>{R({contextNodeId:e.id,selectedIndex:t})}},Il=e=>{let{selectedIndex:t,contextNode:n}=g(),r=J(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;F.navigate({selectedIndex:s,contextNode:n})},El=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=J(o.id),i=s.findIndex(v=>v.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let u=J(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),f=u.length?p:-1;F.navigate({contextNode:c,selectedIndex:f})};var Cl=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Nl=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=g();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},Nv=e=>{let t=g().nodes[e];return!!t&&!t.isDeleted&&st(t)&&t.childRenderAxis==="vertical"},as=(e,t)=>{let{nodes:n}=g(),r=n[e];if(!r||r.isDeleted)return!1;let o=ee(r.id);return F.navigate({contextNode:r,selectedIndex:Cl(t,o.length)}),!0},Rl=e=>{let{nodes:t}=g(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return as(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let i=ee(o.id).findIndex(c=>c.id===n.id);return i>=0?(F.navigate({contextNode:o,selectedIndex:i}),!0):Rl(o.id)},Sl=e=>{let{nodes:t}=g(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Rl(n))return!0;n=t[n]?.parentNodeId}return!1},Rv=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},Al=e=>{let{nodes:t,rootNodeId:n}=g();if(Nv(e.contextNodeId)&&as(e.contextNodeId,e.selectedIndex))return l("Restored navigation inside text container",null);if(Rv(e.selectedNodeId)&&e.selectedNodeId&&Sl(e.selectedNodeId))return l("Restored navigation to selected node or ancestor",null);if(as(e.contextNodeId,e.selectedIndex))return l("Restored navigation to previous container",null);if(e.parentNodeId&&as(e.parentNodeId,e.selectedIndex))return l("Restored navigation to previous parent",null);if(Sl(e.contextNodeId))return l("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return a("Unable to restore navigation");let o=ee(r.id);return F.navigate({contextNode:r,selectedIndex:Cl(e.selectedIndex,o.length)}),l("Restored navigation to root",null)};import{monotonicFactory as Av,ulid as Dt}from"ulid";var Jr=Av();function Tv(){let e=rt();if(d(e))return a("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return a("No workspace found in event log");let[r]=J(n.id),[o]=r?J(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 wv(){let e=Tv();return d(e)?e:F.navigate(e.value)}function Tl({userId:e,userName:t}){let n=Jr(),r=Jr(),o=Jr(),s=Jr(),i=Jr(),c=Xe(void 0,void 0);if(d(c))return c;let u=Xe(void 0,void 0);if(d(u))return u;let m=Xe(u.value,void 0);if(d(m))return m;let p=Xe(void 0,void 0);if(d(p))return p;let f=Xe(p.value,void 0);if(d(f))return f;let v=Xe(f.value,void 0);if(d(v))return v;let N=Xe(void 0,void 0);return d(N)?N:l("Created default events",[{id:Dt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:Dt(),userId:e,userName:t,action:"create.contributor",payload:{id:e,name:t}},{id:Dt(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:Dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"Done",parent:r,rank:v.value}},{id:Dt(),userId:e,userName:t,action:"add.board",payload:{id:Qo,name:"Closed",parent:n,rank:m.value}},{id:Dt(),userId:e,userName:t,action:"add.swimlane",payload:{id:Ee,name:"Closed",parent:Qo,rank:N.value}},{id:Dt(),userId:e,userName:t,action:"lock.node",payload:{id:Qo}},{id:Dt(),userId:e,userName:t,action:"lock.node",payload:{id:Ee}}])}var Mv=()=>{let e=rt();if(d(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},Pv=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(", ");K.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(", ");K.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}};function en(e,t=[]){if(Mv())return l("Skipped boot while checked out at a historical point",null);if(!e.length){let s=le.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=Yr(s);return d(i)?i:(R({hasProjectDefinition:!1,mode:y.DEFAULT}),l("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=xt(e),{fatal:r,skipped:o}=Xt(n);return r.length>0?a(`Materializing failed:
28
28
  ${r.map(s=>s.message).join(`
29
- `)}`):(Kt(o),Ah(),N({hasProjectDefinition:!0}),wh(t),l("State booted successfully",null))}import{WebSocket as Mh}from"ws";var zo=new Set,Yc=e=>{zo.add(e),e.on("close",()=>{zo.delete(e)}),e.on("error",()=>{zo.delete(e)})},Dn=e=>{let t=JSON.stringify(e);for(let n of zo)n.readyState===Mh.OPEN&&n.send(t)};var qo=e=>{Pt()&&(N({syncStatus:e}),Dn({type:"sync-status",payload:e}))},Yo=(e="Syncing...")=>{qo({status:"syncing",msg:e})},Xo=(e="Synced")=>{qo({status:"synced",msg:e})},na=e=>{qo({status:"failed",msg:e})},Xc=e=>{qo({status:"offline",msg:e})},je=e=>(na(e),i(e));var kt=(e,t)=>(logger.error(`[boot:${e}] ${t}`),i(`[boot:${e}] ${t}`)),Jo=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}},te=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);import Vh from"node:fs";import Yt from"node:fs";import _r from"node:path";import ra from"node:fs";import Jc from"node:path";var Qo=e=>e.split(`
30
- `).filter(t=>t.trim().length>0),Qc=e=>{let t=Jc.join(e,nt,wn);try{if(!ra.existsSync(t))return l("No events directory",[]);let n=ra.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>Qo(ra.readFileSync(Jc.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)}`)}},Ph=(e,t)=>{let n=new Set(Qo(t));return Qo(e).filter(r=>!n.has(r))},Lh=(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
- `),Zc=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let r=await Je({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(Lh(t,o,Qo(r.stdout).length)):l("Event log only grew",void 0)};var kh="[epiq:init-repo]",tl=async e=>{let t=await Je({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(`
32
- `));K.info("Creating initial commit");let r=await _({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(d(r))return i(r.message);let o=await _({args:["commit-tree",r.value.stdout.trim(),"-m",kh],cwd:e});if(d(o))return i(o.message);let s=await _({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return d(s)?i(s.message):l("Created initial commit",!0)},el=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Dh=async e=>{let t=await Mo(e);if(d(t))return i(t.message);let n=await $d(e);return d(n)?i(n.message):l("Built sync commit message",`[sync|branch:${el(t.value)}:sha:${el(n.value)}]`)},oa=async({repoRoot:e,stateBranchName:t})=>{K.info(`Creating ${t}`);let n=await _({args:["commit-tree",zd,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return i(`Failed to create state branch commit
33
- ${n.message}`);let r=n.value.stdout.trim(),o=await _({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?i(`Failed to create ${t}
34
- ${o.message}`):l("Created state branch",!0)},sa=async({repoRoot:e,stateBranchName:t})=>{let n=await wo({repoRoot:e,branch:t});if(d(n))return i(`Ensure local state branch failed
35
- `+n.message);if(n.value)return l("Local state branch already exists",!1);let r=await wi({repoRoot:e});if(d(r))return i(`Ensure local state branch failed
36
- `+r.message);let o=r.value,s=o?await Mi({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(d(s))return i(`Ensure local state branch failed
37
- `+s.message);let a=s.value;if(o&&a){let c=await Ie.fetch({cwd:e,remote:dt,branch:t});if(d(c))return i(`Failed to fetch ${t} from remote
38
- ${c.message}`)}if(a){let c=await _({args:["branch","--track",t,`${dt}/${t}`],cwd:e});return d(c)?i(`Failed to create local ${t} from remote
39
- ${c.message}`):l("Created local state branch from remote",!0)}return oa({repoRoot:e,stateBranchName:t})},Bh=async({repoRoot:e,branch:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(d(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 l("Found worktree for branch",o)}return l("No worktree found for branch",null)},Fh=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Rr(_r.dirname(t));if(d(r))return i(`Failed to create state branch worktree
41
- `+r.message);if(Yt.existsSync(t)&&!Yt.existsSync(_r.join(t,".git"))){let s=Qc(t);if(d(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(a=>` ${a}`),"","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
- `));K.info("Removing broken state branch worktree path"),Jd(t)}K.info("Creating state branch worktree");let o=await Ie.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?i(`Failed to create state branch worktree
43
- ${o.message}`):l("Created state branch worktree",!0)},Bn=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Bh({repoRoot:e,branch:n});if(d(r))return i(r.message);let o=Nr(t),s=r.value?Nr(r.value):null;if(s&&s===o&&Yt.existsSync(s))return l("State branch already checked out in expected worktree",!1);if(s&&s!==o){let u=await Wd(s);if(d(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
- `));K.info("Moving state branch worktree to expected location");let m=await Ie.worktreeRemove({cwd:e,worktreeRoot:s});if(d(m))return i(`Failed to remove existing state branch worktree
45
- ${m.message}`)}if(s&&!Yt.existsSync(s)){K.info("Pruning stale state branch worktree");let u=await Ie.worktreePrune({cwd:e});if(d(u))return i(`Failed to prune stale worktrees
46
- ${u.message}`)}let a=await _d({repoRoot:e,worktreeRoot:t});if(d(a))return i(a.message);let c=Yt.existsSync(t);if(a.value&&c)return l("State branch worktree already exists",!1);if(a.value&&!c){K.info("Pruning missing registered state branch worktree");let u=await Ie.worktreePrune({cwd:e});if(d(u))return i(`Failed to prune stale worktrees
47
- ${u.message}`)}return Fh({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Oh=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Mo(e);if(d(n))return i(n.message);if(n.value===t)return l("State branch already checked out",!1);(await Je({cwd:e,args:["rebase","--abort"]})).exitCode===0&&K.info("Aborted stale state branch rebase");let o=await Ie.checkout({cwd:e,branch:t});return d(o)?i(`Failed to checkout ${t}
48
- ${o.message}`):l("Checked out state branch",!0)},Uh=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Pi(t);if(d(n))return i(n.message);if(n.value)return l("State branch upstream already configured",!1);let r=await wi({repoRoot:t});if(d(r))return i(r.message);if(!r.value)return l("No remote available for state branch upstream",!1);let o=rn(e);if(d(o))return o;let s=o.value,a=await Mi({repoRoot:t,branch:s});if(d(a))return i(a.message);if(!a.value)return l("Remote state branch missing; upstream will be configured on first push",!1);K.info(`Configuring ${s} upstream`);let c=await Ie.fetch({cwd:t,remote:dt,branch:s});if(d(c))return i(`Failed to fetch ${s}
49
- ${c.message}`);let u=await Ie.setUpstream({cwd:t,branch:s,upstream:`${dt}/${s}`});return d(u)?i(`Failed to set state branch upstream
50
- ${u.message}`):l("Configured state branch upstream",!0)},Zo=async({stateBranchRoot:e,eventFileName:t})=>{let n=qd(t),r=_r.join(e,n);if(!Yt.existsSync(r))return l("No event file to stage",null);let o=await Zc({stateBranchRoot:e,relativePath:n,workingContent:Yt.readFileSync(r,"utf8")});if(d(o))return i(o.message);let s=await Ie.stage({cwd:e,pathspec:[n]});return d(s)?i(`Failed to stage state branch event file
51
- ${s.message}`):l("Staged state branch event file",n)},nl=async({stateBranchRoot:e})=>{let t=Yd(),n=_r.join(e,t);if(!Yt.existsSync(n))return l("No media directory to stage",null);let r=await Ie.stage({cwd:e,pathspec:[t]});return d(r)?i(`Failed to stage state branch media files
52
- ${r.message}`):l("Staged state branch media files",t)},rl=async({stateBranchRoot:e})=>{let t=Bi();if(!Yt.existsSync(_r.join(e,t)))return l("No event log attributes to stage",null);let n=await Ie.stage({cwd:e,pathspec:[t]});return d(n)?i(`Failed to stage event log attributes
53
- ${n.message}`):l("Staged event log attributes",t)},ol=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await Dh(e);return d(r)?i(`Create state branch sync commit failed
54
- `+r.message):zn({cwd:t,message:r.value,pathspec:n})},$r=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Pi(t);if(d(n))return i(n.message);let r=rn(e);if(d(r))return r;let o=r.value,s=n.value?await Ie.push({cwd:t}):await Ie.push({cwd:t,remote:dt,branch:o,setUpstream:!0});if(d(s))return i(`Failed during state branch push
55
- ${s.message}`);let a=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return l(a?"Pushed state branch":"Remote already up to date",a)},sl=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=rn(e);if(d(o))return o;let s=o.value,a=[Lo(),await sa({repoRoot:e,stateBranchName:s}),await Bn({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await Oh({stateBranchRoot:t,stateBranchName:s}),await Zd(t),n?await Uh({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of a){if(d(c))return i(c.message);r=r||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import es from"node:fs";import aa from"node:os";import _h from"node:path";var $h="epiq-sync.lock",il=600*1e3,jh=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}},Hh=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Wh=e=>e&&(e.hostname!==aa.hostname()||Hh(e.pid))?Date.now()-e.startedAt>il:!0,dl=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,ia=e=>{try{return jh(es.readFileSync(e,"utf8"))}catch{return null}},al=(e,t)=>{let n={pid:process.pid,hostname:aa.hostname(),startedAt:Date.now(),operation:t};try{return es.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},Gh=async({worktreeRoot:e,operation:t})=>{let n=await Ti(e);if(d(n))return i(n.message);let r=_h.join(n.value,$h),o=()=>{try{let c=ia(r);c&&c.pid===process.pid&&es.rmSync(r)}catch{}};if(al(r,t))return l("Acquired sync lock",{acquired:!0,release:o});let s=ia(r);if(!Wh(s))return l("Sync lock is held",{acquired:!1,heldBy:s});K.info(`Breaking an abandoned sync lock: ${s?dl(s):"unreadable lock file"}`);try{es.rmSync(r,{force:!0})}catch{}if(al(r,t))return l("Acquired sync lock after breaking a stale one",{acquired:!0,release:o});let a=ia(r);return l("Sync lock taken by another process",{acquired:!1,heldBy:a??{pid:-1,hostname:aa.hostname(),startedAt:Date.now(),operation:"unknown"}})},cl=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await Gh({worktreeRoot:e,operation:t});if(d(r))return i(r.message);if(!r.value.acquired)return K.info(`Skipping ${t}: the state worktree is held by ${dl(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()}};var Kh=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=te("getRepoRootDir",await ht(e));if(d(n))return i(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=te("getStateBranchRoot",Se({repoRoot:r}));if(d(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 a=te("bootstrapStateBranchStorage",await sl({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(d(a))return i(a.message);logger.debug("[sync] bootstrap result",{bootstrapped:a.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let c=te("hasInProgressGitOperation(stateBranchRoot)",await To(s));if(d(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=te("ensureStateBranchLayout",Qd(r,s));return d(u)?i(u.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:a.value}),l("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:a.value}))},zh=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=te("stageStateBranchOwnEventFile",await Zo({stateBranchRoot:t,eventFileName:n}));if(d(r))return i(r.message);let o=te("stageStateBranchMediaFiles",await nl({stateBranchRoot:t}));if(d(o))return i(o.message);let s=te("stageStateBranchEventAttributes",await rl({stateBranchRoot:t}));if(d(s))return i(s.message);let a=[r.value,o.value,s.value].filter(m=>m!==null);if(a.length===0)return l("Nothing to stage",{createdCommit:!1});let c=te("hasStagedChanges(after stage)",await Gd(t,a));if(d(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=te("createStateBranchSyncCommit",await ol({repoRoot:e,stateBranchRoot:t,pathspec:a}));return d(u)?i(u.message):(logger.debug("[sync] created sync commit",u.value),l("Committed own event file",{createdCommit:!0,commitSha:u.value}))},ll=e=>{let t=e.createdCommit?"Committed locally, offline":"Offline";return Xc(t),l(t,{...e,pulled:!1,pushed:!1,offline:!0})},ul=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");Yo();let n=te("ensureSyncReady",await Kh({cwd:e,ensureUpstream:!0}));if(d(n))return je(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,a=te("isDetachedHead(stateBranchRoot)",await Vd(o));if(d(a))return je(a.message);if(logger.debug("[sync] detached state branch check result",{detached:a.value}),a.value)return je("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,f=te("getStateBranch",rn(r));if(d(f))return je(f.message);let g=f.value;logger.debug("[sync] resolved state branch",{stateBranch:g,stateBranchRoot:o});let x=te("commitOwnEventFileToStateBranch",await zh({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(x))return je(x.message);c=x.value.createdCommit,u=x.value.commitSha;let S=te("pullBranchRebaseIfPresent",await ki({cwd:o,branch:g}));if(d(S))return Li(S.message)?ll({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,bootstrapped:s}):je(S.message);m=S.value;let T=te("isAheadOfUpstream",await Hd(o));if(d(T))return je(T.message);if(c||s||T.value){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:o});let C=te("pushStateBranch",await $r({stateBranchRoot:o,repoRoot:r}));if(d(C)&&jd(C.message)){let R=te("pullBranchRebaseIfPresent(retry)",await ki({cwd:o,branch:g}));if(d(R))return je(R.message);m=m||R.value,C=te("pushStateBranch(retry)",await $r({stateBranchRoot:o,repoRoot:r}))}if(d(C))return Li(C.message)?ll({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,bootstrapped:s}):je(C.message);p=C.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let C=te("git rev-parse HEAD",await _({args:["rev-parse","HEAD"],cwd:o}));if(d(C))return je(C.message);u=C.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return Xo(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})},ts=async e=>{let t=e.cwd??process.cwd(),n=await ht(t);if(d(n))return je(n.message);let r=Se({repoRoot:n.value});if(d(r))return je(r.message);let o=r.value;if(!Vh.existsSync(o))return ul(e);let s=await cl({worktreeRoot:o,operation:"sync",fn:()=>ul(e)});return d(s)?je(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 Dt=null,ns=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Dt,currentStatus:h().syncStatus?.status,currentMessage:h().syncStatus?.msg}),Dt)return logger.debug("[sync] syncAndReloadState joining existing promise"),Dt;logger.debug("[sync] syncAndReloadState creating promise"),Dt=qh();try{let e=await Dt;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!d(e),message:(d(e),e.message),statusAfterResolve:h().syncStatus?.status,statusMessageAfterResolve:h().syncStatus?.msg}),d(e)&&h().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),N({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),Dt||i(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:h().syncStatus?.status,statusMessageBeforeClear:h().syncStatus?.msg}),Dt=null}},qh=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:h().mode,syncStatus:h().syncStatus});let e=ml();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:h().mode,message:e.message,syncStatus:h().syncStatus}),e;if(Dt)return Dt;logger.debug("[sync] syncAndReloadState:start");let t=te("resolveActorId",he());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),i("Unable to resolve event log path");N({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:h().syncStatus});let n=Ln(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=te("syncEpiqWithRemote",await ts({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!d(r),message:(d(r),r.message)}),d(r))return logger.error("[sync] syncAndReloadState:sync failed",r.message),N({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:h().syncStatus}),je(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let a=te("loadMergedEvents",zt(o));if(logger.debug("[sync] loadMergedEvents:result",{success:!d(a),message:(d(a),a.message),count:d(a)?void 0:a.value.events.length}),d(a))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:h().syncStatus}),i(`Unable to load events. ${a.message}`);logger.debug("[sync] loaded merged events after sync",{count:a.value.events.length});let c=ml();if(c)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:h().mode,message:c.message,syncStatus:h().syncStatus}),c;let u=Vc(),m=h().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:u,selectedNodeId:h().selectedNode?.id,contextNodeId:h().contextNode?.id,selectedNodeIsVirtual:h().selectedNode?.isVirtual,contextNodeIsVirtual:h().contextNode?.isVirtual}),!h().selectedNode?.isVirtual&&!h().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:a.value.events.length});let f=te("bootStateFromEventLog",qt(a.value.events,a.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(f),message:(d(f),f.message)}),d(f))return N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:h().syncStatus}),i(`Unable to boot synced state. ${f.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:h().selectedNode?.isVirtual,contextNodeIsVirtual:h().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),N({filters:m}),logger.debug("[sync] restoreNavigationAnchor:start");let p=te("restoreNavigationAnchor",zc(u));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(p),message:d(p)?p.message:"Navigation restored",selectedNodeId:h().selectedNode?.id,contextNodeId:h().contextNode?.id}),d(p)?(N({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:h().syncStatus}),p):(N({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:h().syncStatus}),l("Synced",!0))},ml=()=>h().mode===y.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:h().mode,syncStatus:h().syncStatus}),N({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),i("Will not re-materialize if not in default mode, to not lose edit data"));var Zn=3e3,pl=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Zn?null:t},fl=0,da,ca=!1,jr=!1,la=()=>{if(ca)return!0;let e=Ze();return d(e)?!1:e.value.syncStatus.status==="syncing"},Yh=()=>{let e=Z().autoSyncIntervalMs??1e4,t=Date.now()-fl;return Math.max(0,e-t)},gl=()=>{da||(da=setTimeout(async()=>{if(da=void 0,!!Pt()){if(la()){jr=!0;return}jr=!1,await Xh()}},Yh()))},Xh=async()=>{if(h().readOnly||h().timeMode==="peek"||h().timeMode==="replay")return i("Cannot auto-sync while peeking");if(!Pt())return i("Cannot auto-sync before state is initialized");if(la())return jr=!0,i("Sync already in progress");ca=!0,fl=Date.now(),N({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await ns()}finally{ca=!1,jr&&gl()}},rs=()=>{Pt()&&(jr=!0,!la()&&gl())};import Hr from"node:fs";import Wr from"node:path";import{z as er}from"zod";var os="recent-projects.json",Jh=20,Qh=er.object({projectId:er.string().min(1),root:er.string().min(1),lastOpenedAt:er.number().finite()}),Zh=er.object({projects:er.array(Qh)}),vl=()=>Wr.join(Rn(),os),tr=e=>Wr.basename(e)||e,hl=e=>{let t=Wr.resolve(e);try{return Hr.realpathSync(t)}catch{return t}},yl=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,bl=e=>{if(!Mr(e.root))return!1;let t=Er(e.root);return!d(t)&&t.value===e.projectId},xl=()=>{let e=vl();if(!Hr.existsSync(e))return l("No recent projects recorded",[]);let t;try{t=JSON.parse(Hr.readFileSync(e,"utf8"))}catch(r){return i(`Invalid ${os}: ${r instanceof Error?r.message:String(r)}`)}let n=Zh.safeParse(t);return n.success?l("Read recent projects",n.data.projects):i(`Invalid ${os} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ev=e=>{let t=vl();try{Hr.mkdirSync(Wr.dirname(t),{recursive:!0}),Hr.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
56
- `,"utf8")}catch(n){return i(`Unable to write ${os}: ${n instanceof Error?n.message:String(n)}`)}return l("Recorded recent project",e)},Xt=({exclude:e}={})=>{let t=xl();if(d(t))return t;let n=e===void 0?null:hl(e);return l("Listed recent projects",t.value.filter(r=>n===null||hl(r.root)!==n).filter(bl).sort(yl))},ss=({root:e,now:t=Date.now()})=>{let n=Wr.resolve(e),r=Er(n);if(d(r))return i(r.message);let o=r.value,s=xl(),a=d(s)?[]:s.value,c=[{projectId:o,root:n,lastOpenedAt:t},...a.filter(u=>u.projectId!==o&&u.root!==n)].filter(bl).sort(yl).slice(0,Jh);return ev(c)};var cn=()=>{let e=Z(),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}},Il=()=>{let e=_e(process.cwd());if(d(e))return!1;let t=Rt(e.value);return de(t)},El=e=>e===!0?"on":e===!1?"off":null,Sl=e=>e==="on"?!0:e==="off"?!1:null;var He={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"},v={accent:He.cyan,accent2:He.magenta,primary:He.white,secondary:He.grayDark,secondary2:He.grayLight,gray:He.gray,green:He.green,yellow:He.yellow,red:He.red};var A={red:He.red,yellow:He.yellow,green:He.green,blue:He.blue,magenta:He.magenta,cyan:He.cyan},nr={urgent:A.red,critical:A.red,important:A.red,blocker:A.red,asap:A.red,immediate:A.red,fail:A.red,failure:A.red,broken:A.red,bug:A.red,error:A.red,incident:A.red,outage:A.red,production:A.red,crash:A.red,security:A.red,warning:A.yellow,warn:A.yellow,risky:A.yellow,risk:A.yellow,attention:A.yellow,pending:A.yellow,review:A.yellow,"needs-review":A.yellow,qa:A.yellow,testing:A.yellow,test:A.yellow,validate:A.yellow,verification:A.yellow,staging:A.yellow,check:A.yellow,"follow-up":A.yellow,followup:A.yellow,waiting:A.yellow,blocked:A.yellow,hold:A.yellow,done:A.green,complete:A.green,completed:A.green,success:A.green,ok:A.green,stable:A.green,resolved:A.green,fixed:A.green,closed:A.green,merged:A.green,released:A.green,deployed:A.green,approved:A.green,verified:A.green,working:A.green,healthy:A.green,pass:A.green,passing:A.green,info:A.blue,information:A.blue,note:A.blue,docs:A.blue,documentation:A.blue,doc:A.blue,guide:A.blue,help:A.blue,explanation:A.blue,detail:A.blue,details:A.blue,context:A.blue,design:A.blue,discussion:A.blue,proposal:A.blue,idea:A.blue,feature:A.magenta,enhancement:A.magenta,improvement:A.magenta,refactor:A.magenta,refactoring:A.magenta,cleanup:A.magenta,optimize:A.magenta,optimization:A.magenta,perf:A.magenta,performance:A.magenta,upgrade:A.magenta,migration:A.magenta,modernize:A.magenta,debt:A.magenta,todo:A.cyan,next:A.cyan,planned:A.cyan,plan:A.cyan,future:A.cyan,backlog:A.cyan,investigate:A.cyan,explore:A.cyan,prototype:A.cyan};var tv=e=>e.props.tags??[],nv=e=>e.props.assignees??[],ln=e=>tv(e).map(t=>E.getTag(t)).filter(t=>!!t),un=e=>nv(e).map(t=>E.getContributor(t)).filter(t=>!!t),is=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!M(n)?i("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",ln(n))},as=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!M(n)?i("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",un(n))};var 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",COFFEE:"coffee",NONE:""};var rv=/^(\d+)(h|d|w|mo|y)$/,ov=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,sv=({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},iv=(e,t=new Date)=>{let n=e.match(rv);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-s),a;case"d":return a.setDate(a.getDate()-s),a;case"w":return a.setDate(a.getDate()-s*7),a;case"mo":return a.setMonth(a.getMonth()-s),a;case"y":return a.setFullYear(a.getFullYear()-s),a;default:return null}},av=e=>{let t=e.match(ov);if(!t)return null;let[,n,r,o,s,a]=t,c=Number(n),u=Number(r),m=Number(o),p=s?Number(s):0,f=a?Number(a):0;return sv({year:c,month:u,day:m,hour:p,minute:f})?new Date(c,u-1,m,p,f):null},Fn=e=>{let t=e.trim().toLowerCase();return iv(t)??av(t)};var Cl=/^(\d+)(s|m)?$/,ds=e=>{let t=e.trim().toLowerCase().match(Cl);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},cs=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&Cl.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},Nl=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,dv=[{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}],ua=(e=dv)=>{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 cv=["BOARD","TICKET","SWIMLANE","COMMENT"],pe={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},it={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Ne={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},lv=[pe.EDITOR,pe.VIEW,pe.USERNAME,pe.AUTOSYNC,pe.SYNC_DEBOUNCE_MS,pe.ATTACHMENT_MAX_KB,pe.LOG_LEVEL],uv=(e=h().selectedNode?.context)=>{switch(e){case"TICKET":return[it.TITLE,it.DESCRIPTION];case"BOARD":case"SWIMLANE":return[it.TITLE];case"COMMENT":return[it.COMMENT];default:return[]}},pa=[String(Zn),"5000","15000","30000","60000"],fa=["250","500","1000"],Tl=["10s","20s","30s","45s"],On=[b.COFFEE,b.EXIT,b.SYNC,b.HELP,b.EXPORT,b.CONFIG,b.YANK],ls=[b.NEW,b.EDIT,b.DELETE,b.MOVE],ma=[b.TAG,b.UNTAG,b.ASSIGN,b.UNASSIGN,b.CLOSE_ISSUE,b.RE_OPEN_ISSUE,b.EDIT,b.COMMENT],Rl=[b.FILTER,b.PEEK,b.REPLAY],mv={WORKSPACE:[...On,...ls],BOARD:[...Rl,...On,...ls],SWIMLANE:[...Rl,...On,...ls],TICKET:[...On,...ls,...ma],FIELD:[...On,...ma],FIELD_LIST:[...On,...ma],TEXT:[...On],COMMENT:[b.EDIT,b.DELETE,b.YANK]},pv=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Gr=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&M(n)),Al=e=>e.parentNodeId===Ce,fv=({selectedNode:e,breadCrumb:t})=>{let n=uv(e?.context);return Gr({breadCrumb:t,selectedNode:e})?n.includes(it.DESCRIPTION)?n:[...n,it.DESCRIPTION]:n},gv=({selectedNode:e,breadCrumb:t})=>{let n=Gr({breadCrumb:t,selectedNode:e});return n?[Ne.REF,Ne.TITLE,...n.props?.description?.trim()?[Ne.DESCRIPTION]:[],...ln(n).length>0?[Ne.TAGS]:[],...un(n).length>0?[Ne.ASSIGNEES]:[]]:e?[Ne.REF,Ne.TITLE]:[]},ga=()=>{let e=Xt({exclude:process.cwd()});return d(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},hv=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=cn();if(!r)return[b.HELP,b.CONFIG];if(!Il())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&&cv.includes(o),a=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?mv[u]:[]))],c=Gr({breadCrumb:n,selectedNode:e});return a.filter(u=>u===b.MOVE?!1:u===b.YANK?!!(c??e):u===b.EDIT?s||!!c:u===b.DELETE?s:u===b.UNTAG?!!(c&&ln(c).length>0):u===b.UNASSIGN?!!(c&&un(c).length>0):u===b.RE_OPEN_ISSUE?!!(c&&Al(c)):u===b.CLOSE_ISSUE?!!(c&&!Al(c)):!0)},ve=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=h())=>{let s=t.context??"WORKSPACE";return{[b.NONE]:hv({breadCrumb:o,readOnly:r,selectedNode:n}),[b.EXIT]:["confirm"],[b.EXPORT]:[],[b.SYNC]:[],[b.INIT]:[],[b.OPEN]:e===b.OPEN?ga():[],[b.HELP]:[],[b.PEEK]:[...ua(),"now","prev","next"],[b.REPLAY]:[...ua()],[b.EDIT]:fv({selectedNode:n,breadCrumb:o}),[b.YANK]:gv({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","description","title","ref","clear"],[b.TAG]:[...new Set([...Object.keys(nr),...E.getExistingTags()])],[b.UNTAG]:[...is()?.value?.map(({name:c})=>c)??[]],[b.UNASSIGN]:[...as()?.value?.map(({name:c})=>c)??[]],[b.ASSIGN]:E.getExistingAssignees(),[b.NEW]:pv(s),[b.CONFIG]:[...lv],[b.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import Kl from"chalk";var wl=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import Iv from"zod";import vv from"node:crypto";import Vr from"node:fs";import Ll from"node:path";var Ml="/media/",Pl=e=>`${Ml}${e}`,ha=(e,t)=>`![${e}](${Pl(t)})`;var Bt=500,yv=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,rr=(e,t)=>`${e}.${t}`,bv=e=>yv.test(e),kl=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: ${lc.join(", ")}`),Dl=e=>vv.createHash("sha256").update(e).digest("hex"),xv=(e,t=Bt)=>{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=kl(e);return d(n)?n:l("Validated attachment data",{hash:Dl(e),ext:n.value,bytes:e.length})},Bl=(e,t,n=Bt)=>{let r=xv(t,n);if(d(r))return r;let o=wr(e),s=Ll.join(o,rr(r.value.hash,r.value.ext));try{Vr.existsSync(s)||(Vr.mkdirSync(o,{recursive:!0}),Vr.writeFileSync(s,t))}catch(a){return i(`Unable to write attachment blob: ${a instanceof Error?a.message:String(a)}`)}return l("Wrote attachment blob",r.value)},Fl=(e,t,n=Bt)=>{if(!bv(t))return i("Invalid attachment file name");let r=Ll.join(wr(e),t);if(!Vr.existsSync(r))return i("Attachment blob not found");let o;try{o=Vr.readFileSync(r)}catch(u){return i(`Unable to read attachment blob: ${u instanceof Error?u.message:String(u)}`)}if(o.length>n*1024)return i(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,a]=t.split(".");if(Dl(o)!==s)return i("Attachment blob does not match its content hash");let c=kl(o);return d(c)?c:c.value!==a?i("Attachment blob content does not match its extension"):l("Resolved attachment blob",{filePath:r,ext:a,bytes:o.length})};var Kr=50,zr=5e3,Ol=()=>{let e=ne().commandMeta.inputString,t=Iv.coerce.number().int().min(Kr).max(zr).safeParse(e);if(!t.success)return i(`Attachment size cap must be ${Kr}-${zr} KB (default ${Bt})`);let n=lt({attachmentMaxKb:t.data});return d(n)?n:($e({attachmentMaxKb:t.data}),N({mode:y.DEFAULT}),l(`Attachment size cap set to ${t.data} KB`,null))};import or from"chalk";var ya={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Ul=(e,t,n)=>Math.max(t,Math.min(n,e)),va=(e,t,n)=>e+(t-e)*n,_l=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Ev=e=>e.toLowerCase().trim(),Sv=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,a=e/60,c=s*(1-Math.abs(a%2-1)),u=0,m=0,p=0;a>=0&&a<1?(u=s,m=c):a>=1&&a<2?(u=c,m=s):a>=2&&a<3?(m=s,p=c):a>=3&&a<4?(m=c,p=s):a>=4&&a<5?(u=c,p=s):(u=s,p=c);let f=o-s/2;return[Math.round((u+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},$l=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var Cv=(e,t,n)=>{let r=Ul(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))]};var Nv=(e,t,n)=>Cv(e,t,n),qr=e=>{let t=_l(e)%360,n=Sv(t,ya.stringColor.saturation,ya.stringColor.lightness);return $l(n)},se=(e,t=nr)=>{let n=Ev(e);return n&&t[n]?t[n]:qr(n)};var jl=e=>{let t=ya.gradient.stops,n=Ul(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),a=o-s;return Nv(t[s],t[s+1],a)},us=e=>$l(jl(e)),ms=e=>_l(e.toLowerCase().trim())/4294967295,Hl=e=>{let t=ms(e);return jl(t)},Rv=e=>{let[t,n,r]=Hl(e);return{normal:o=>or.bgRgb(t,n,r).black(o),cursor:o=>or.bgRgb(t,n,r).white.bold(o)}},ba=e=>{let[t,n,r]=Hl(e);return{fg:o=>or.rgb(t,n,r)(o),fgCursor:o=>or.rgb(t,n,r).inverse(o),bg:o=>or.bgRgb(t,n,r).black(o),bgCursor:o=>or.bgRgb(t,n,r).white.bold(o)}},ps=e=>Rv(e).normal(` ${e} `);var bt=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as Av}from"node:crypto";var Tv="0123456789ABCDEFGHJKMNPQRSTVWXYZ",wv=e=>{let t=Av("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+=Tv[Number(n>>s&31n)]}return r},we=(e,t)=>wv(`${e}:virtual:${t}`);import Wl from"chalk";var re=e=>Wl.dim(e),Me=e=>Wl.hex(v.primary)(e),Pe=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let a=o.trim();if(a.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(a))].sort((f,g)=>ms(f)-ms(g)).slice(0,r).map(f=>ps(f)).join(" ");return p?`${re(e)}${p}${re(n)}`:""};var Ft={None:"none",Invalid:"invalid",Valid:"valid"};var Mv=["BOARD","TICKET","SWIMLANE"],Gl=()=>{let e=h().selectedNode;if(!e?.context)return j({message:re("Missing target context")});if(Mv.includes(e.context))return X();if(e.parentNodeId){let t=h().nodes[e.parentNodeId];if(t?.id===we(t?.parentNodeId??"","comments"))return X()}return j({message:re("Command not available in this context")})},me="<ENTER> to confirm",X=(e="",t=[])=>({message:re(e),validity:Ft.Valid,completionWordList:t}),j=({message:e,completionWordList:t=[]})=>({validity:Ft.Invalid,message:e,completionWordList:t}),sr=e=>e.length===0,Vl=(e,t)=>{let n=ze(h().breadCrumb,"BOARD");if(d(n))return j({message:Me("Command is not applicable in this context")});let r=Bo(n.value.id);return d(r)?j({message:Me(`Unable to ${t}: board id is not a valid ULID`)}):Nl({date:e,horizonDate:r.value})?null:j({message:Me(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},fs=e=>` ${Kl.hex("#000").bgHex(se(e))(` ${e} `)} `,xa=({modifier:e})=>{let t="confirm";return e===t?X(me):j({message:sr(e)?re("if you are certain, enter ")+ps(t):"",completionWordList:[t]})},Pv=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?j({message:re(n)}):X():j({message:sr(r)?t:"",completionWordList:[...e]}),Un=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>sr(n)&&sr(r)?j({message:e,completionWordList:[]}):X(t??me),Lv=({modifier:e,inputString:t})=>{let n=ga();return!sr(e)||!sr(t)?X(me):j({message:n.length?re("number from the list, or a path"):re("path to an epiq project"),completionWordList:n})},kv=({modifier:e,inputString:t})=>{let n=ve(b.CONFIG);if(!n.includes(e))return j({message:Pe({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case pe.EDITOR:{let r=[...wl];return t.trim()?r.includes(t.trim())?X(me):j({message:Pe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):j({message:Pe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case pe.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?X(me):j({message:Pe({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case pe.USERNAME:return t.trim()?X(me):j({message:Me("Enter a user name. Saved in ")+Kl.bgBlack("~/.epiq-global/config.json")});case pe.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?X(me):j({message:Pe({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case pe.AUTOSYNC:{let r=["on","off"],o=Z().autoSync;if(!r.includes(t.trim())){let s=El(o);return j({message:Pe({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return X(me)}case pe.ATTACHMENT_MAX_KB:{let r=Z().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<Kr||o>zr){let s=Pe({prefix:" examples: ",wordList:fa,minLengthForHints:0,inputString:t});return j({message:Me(`provide a size cap in KB (${Kr}-${zr}). current: ${r??Bt} KB.`)+s,completionWordList:fa})}return X(me)}case pe.SYNC_DEBOUNCE_MS:{let r=Z().autoSyncIntervalMs,o=pl(t);if(!t.trim()||o===null||o<Zn){let s=Pe({prefix:" examples: ",wordList:pa,minLengthForHints:0,inputString:t});return j({message:Me(`provide duration above ${Zn}ms. current duration: ${r}ms.`)+s,completionWordList:pa})}return X(me)}default:return j({message:Me("Unknown config option"),completionWordList:n})}},Dv=({modifier:e,inputString:t})=>{let n=ve(b.EDIT);if(!n.length)return j({message:Me("Command not available in this context")});if(!n.includes(e)){let r=Pe({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return j({message:r||Me("Unknown edit option"),completionWordList:n})}switch(e){case it.COMMENT:return t.trim()?X(me):j({message:re("write a comment...")});case it.TITLE:return X(me);case it.DESCRIPTION:{let{preferredEditor:r}=Z();return r?X(re("<ENTER> to edit in ")+r):j({message:"No editor selected"})}default:return j({message:Me("Unknown edit option"),completionWordList:n})}},Bv=({modifier:e})=>{let t=ve(b.YANK);return t.length?t.includes(e)?X(me+re(" and copy to clipboard")):j({message:Pe({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):j({message:Me("Nothing selected to copy from")})},Fv={[b.EXPORT]:()=>X(me+re(", and create export markdown file")),[b.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return X(me);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=Fn(r);if(!r||!o)return j(n);let s=Vl(o,"peek");return s||X(me)},[b.REPLAY]:e=>{let{dateInput:t,durationInput:n}=cs(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=Fn(t);if(!t||!o)return j(r);let s=Vl(o,"replay");return s||(n&&ds(n)===null?j({message:Me("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):X("<ENTER> to replay board history",n?Tl:[]))},[b.EXIT]:()=>X(me+re(" and exit the application")),[b.INIT]:()=>X(me),[b.OPEN]:Lv,[b.PALETTE]:()=>X(me),[b.FILTER]:e=>{if(e.modifier==="clear")return X(me);let t=s=>ve(b.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return j({message:Pe({wordList:ve(b.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ve(b.FILTER)});let n=Object.values(h().tags).map(s=>s.name),r=Object.values(h().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?j({message:Pe({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):X():j({message:Pe({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[b.NONE]:e=>{let t=ve(b.NONE);return j({message:Pe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[b.NEW]:e=>Pv({list:ve(b.NEW),hint:Pe({wordList:ve(b.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[b.HELP]:()=>X(me),[b.EDIT]:Dv,[b.COMMENT]:e=>{let t=Un({hint:re(`write a comment (max ${4e3} char)...`),onOk:re(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===Ft.Invalid?t:e.inputString.length>4e3?X(Me("max input exceeded")):t},[b.CONFIG]:kv,[b.YANK]:Bv,[b.DELETE]:e=>{let t=Gl();return t.validity==="invalid"?t:xa(e)},[b.CLOSE_ISSUE]:e=>xa(e),[b.RE_OPEN_ISSUE]:e=>xa(e),[b.MOVE]:e=>{let t=Gl();return t.validity==="invalid"?t:Un({hint:Pe({prefix:"hey hacker! These commands are blocked for you... ",wordList:ve(b.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[b.TAG]:e=>{let n=E.getExistingTags().slice(0,10).map(fs).join("");return Un({hint:n.length?re("create tag or reuse:")+n+re(""):re("create tag ...")})(e)},[b.UNTAG]:e=>{let t=is();if(d(t))return j({message:Me("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(fs).slice(0,10);return n.length?Un({hint:re(" ... ")+n.join("")})(e):j({message:Me("Issue has no tags"),completionWordList:[]})},[b.ASSIGN]:e=>{let t=E.getExistingAssignees().map(fs).slice(0,10);return Un({hint:re("assignees... ")+t.join("")})(e)},[b.UNASSIGN]:e=>{let t=as();if(d(t))return j({message:Me("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(fs).slice(0,10);return n.length?Un({hint:re("remove assignee... ")+n.join("")})(e):j({message:Me("Issue has no assignees"),completionWordList:[]})},[b.SYNC]:()=>X(me),[b.COFFEE]:e=>{let{modifier:t}=e,n=ve(b.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?j({message:re("enter an amount ... "),completionWordList:n.filter(r=>r.startsWith(t))}):Un({hint:Pe({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},zl=Object.fromEntries(Object.entries(Fv).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var gs=["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 Ov=3,Uv=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"]),_v=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},$v=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=Ov&&!Uv.has(t)&&!/^\d+$/.test(t)),jv=e=>{let t=new Map;for(let s of _v(e))for(let a of $v(s))t.set(a,(t.get(a)??0)+1);let n=[...t.entries()].sort((s,a)=>a[1]-s[1]||s[0].localeCompare(a[0])).map(([s])=>s),r=new Set(n),o=gs.filter(s=>!r.has(s));return[...n,...o]},ql=gs,Yl=-1,Xl=()=>{let e=Ze();if(d(e))return gs;let t=e.value,n=t.eventLog.length;return n!==Yl&&(ql=jv(t),Yl=n),ql};var Jl=e=>Object.values(b).includes(e),Ql=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:a,validity:c,completionWordList:u}=zl[n].validate(n,r,s),m=n!==b.PEEK&&n!==b.REPLAY,p=o==="command"||o==="modifier"?ve(n):m?Xl():[],{mode:f}=h(),g=f===y.COMMAND_LINE?a??"":"",x=[...u,...p];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?Ic(e,x):{hint:"",hints:[],remainder:"",overlap:0}}};var Zl=e=>{let t=e.trimStart(),n=Wv(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),a=Gv(e),c=Jl(r)?r:null,u=c!==null,m=r!=="",p=c?ve(c)??[]:[],f=c&&p.includes(o)?o:"",g="word";n.length===0||n.length===1&&!s?g="command":(n.length===1&&s||n.length===2&&!s)&&(g="modifier");let x=s?"":a,S=Hv(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:a,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:x,inputString:S}},Hv=(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},Wv=e=>e.trim()?e.trim().split(/\s+/):[],Gv=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Vv}from"react";var ir=e=>e===Ia||e===":",Ia=" ",We={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ft.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Ea=new Set,eu=()=>{for(let e of Ea)e()},Sa=e=>(Ea.add(e),()=>Ea.delete(e)),Ot=e=>{let n=e(We),r=Zl(n.value),o=n.cursorPosition===n.value.length;We={...n,commandMeta:Ql(r,o)},eu()},Yr=({message:e,status:t})=>{let n=structuredClone(We);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,We=n,eu(),l(e,null)},Ca=e=>{Ot(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Na=e=>{Ot(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&ir(n[o-1]);)o--;for(;o>0&&!ir(n[o-1]);)o--}else{for(;o<n.length&&!ir(n[o]);)o++;for(;o<n.length&&ir(n[o]);)o++}return{...t,cursorPosition:o}})},tu=()=>{Ot(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}})},nu=()=>{Ot(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&ir(t[r-1]);)r--;for(;r>0&&!ir(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},hs=e=>{Ot(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),a=s+o,c=Math.max(0,Math.min(s.length,a.length));return{...t,value:a,cursorPosition:c,commandIsPending:!1}})},ru=()=>{Ot(e=>({...e,commandIsPending:!0}))},z=e=>{Ot(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},ou=({addToHistory:e=!0})=>{Ot(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},su=()=>{Ot(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}})},iu=()=>{Ot(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ne=()=>We,au=()=>Vv(Sa,ne,ne),vs=()=>{let[e,...t]=We.value.split(Ia);return t.join(Ia).trim()};var I={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"};function Kv(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function zv(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function qv(e,t,n){let r=h().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function du(e,t){let n=ne();if(e.sequence==="?"&&t!==y.PALETTE)return I.InitCommandPalette;if(e.sequence===":"&&t!==y.COMMAND_LINE)return I.InitCommandLine;if(t===y.MOVE)switch(e.name){case"m":case"return":return I.ConfirmMove}if(t===y.COMMAND_LINE)return fc(e,n.value);if(t===y.PALETTE)return gc(e,n.value);let r=Kv(e)||zv(e);if(r)return Yv(r,t);if(e.ctrl&&e.name==="c")return I.Exit;switch(e.name){case"r":return I.EditTitle;case"e":return I.EditDescription;case"n":return I.AddItem;case"m":return I.InitMove;case"d":return I.Delete;case"y":return I.Yank;case"return":return I.Confirm;case"space":return I.Confirm;case"v":return Z().viewMode==="wide"?I.SetViewDense:I.SetViewWide;case"q":case"escape":return I.Exit;default:return null}}function Yv(e,t){let n=t===y.MOVE?{prevItem:I.MovePreviousItem,nextItem:I.MoveNextItem,prevContainer:I.MoveToPreviousContainer,nextContainer:I.MoveToNextContainer}:{prevItem:I.NavPreviousItem,nextItem:I.NavNextItem,prevContainer:I.NavToPreviousContainer,nextContainer:I.NavToNextContainer};return qv(h().contextNode.childRenderAxis,e,n)}var ys=e=>{let{context:t}=h().contextNode;if(!t)return B.None;switch(e){case b.EXIT:return B.Exit;case b.EXPORT:return B.Export;case b.COFFEE:return B.Coffee;case b.INIT:return B.Init;case b.OPEN:return B.OpenProject;case b.DELETE:return B.Delete;case b.EDIT:return B.Edit;case b.COMMENT:return B.Comment;case b.HELP:return B.ViewHelp;case b.RE_OPEN_ISSUE:return B.ReopenIssue;case b.CLOSE_ISSUE:return B.CloseIssue;case b.TAG:return B.TagTicket;case b.UNTAG:return B.UntagTicket;case b.ASSIGN:return B.AssignUserToTicket;case b.UNASSIGN:return B.UnassignUserFromTicket;case b.NEW:return B.NewItem;case b.FILTER:return B.Filter;case b.MOVE:return B.Move;case b.PEEK:return B.Peek;case b.REPLAY:return B.Replay;case b.CONFIG:return B.Config;case b.YANK:return B.Yank;case b.SYNC:return B.Sync;default:return B.None}},B={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{ulid as Ke}from"ulid";import Gu from"node:fs";import Yy from"node:path";import Xy from"react";import{Box as zy}from"ink";import Rs from"react";import gy from"chalk";import{Box as Ta,Text as hy}from"ink";import Ut from"react";import{Text as cu}from"ink";import lu,{useEffect as uu,useState as Xv}from"react";var mu={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},Ge=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=q(),r=mu[n]??mu.default,[o,s]=Xv(0);if(uu(()=>{s(0)},[r]),uu(()=>{if(!e)return;let c=setInterval(()=>{s(u=>(u+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return lu.createElement(cu,null,t);let a=r[o]??r[0]??t;return lu.createElement(cu,{color:v.accent,dimColor:o===1},a)};import{Box as Ra,Text as Jv}from"ink";import bs from"react";var Qv=(e,t,n,r)=>{let o=u=>Math.max(1,e[u]??1),s=n,a=n+1,c=o(n);for(;a<t&&c+o(a)<=r;)c+=o(a),a++;for(;s>0&&c+o(s-1)<=r;)s--,c+=o(s);return{start:s,end:a}},mt=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,itemHeights:o,scrollByOne:s=!1})=>{if(e.length===0)return null;let a=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(a/c)),p=Math.max(0,e.length-m),{start:f,end:g}=o?Qv(o,e.length,u,a):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},x=Math.max(1,g-f),S=e.slice(f,g),T=e.length>x,C=a,R=T?Math.max(1,Math.floor(x/e.length*C)):C,L=Math.max(0,C-R),$=Math.max(1,e.length-x),G=T?Math.floor(f/$*L):0;return bs.createElement(Ra,{flexDirection:"row",height:a,width:"100%"},bs.createElement(Ra,{flexDirection:"column",flexGrow:1,height:a},S),bs.createElement(Ra,{flexDirection:"column",width:1,height:C},Array.from({length:C}).map((P,U)=>bs.createElement(Jv,{key:U,color:T&&U>=G&&U<G+R?v.accent:v.secondary},T?"\u2502":" "))))};import{Box as cr,Text as lr}from"ink";import et from"react";var pu,Aa,Zv=()=>{let{eventLog:e=[]}=h();if(Aa&&pu===e)return Aa;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return pu=e,Aa=t,t},xs=e=>Zv().has(e);import{Text as ey}from"ink";import ty from"react";var ny=e=>e.toLowerCase().trim(),ry=(e,t=nr)=>{let n=ny(e);return t[n]?t[n]:qr(n)},mn=({id:e,isSelected:t,maxWidth:n})=>{let r=E.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:ut(o,n);return ty.createElement(ey,{underline:t,color:ry(o)},"@"+s,xs(e)?"":"\u2197")};import{Text as oy}from"ink";import sy from"react";var ar=({id:e,isSelected:t,maxWidth:n})=>{let r=E.getTag(e);if(!r)return;let o=n===void 0?r.name:ut(r.name,n);return sy.createElement(oy,{underline:t,backgroundColor:se(r.name),color:v.secondary}," "+o+" ")};import{useEffect as iy,useState as ay}from"react";var dy=80,fu=1400,Is=new Set,Xr=null,cy=e=>(Is.add(e),Xr||(Xr=setInterval(()=>{for(let t of Is)t()},dy)),()=>{Is.delete(e),Is.size===0&&Xr&&(clearInterval(Xr),Xr=null)}),ly=()=>{let e=Date.now()%fu/fu;return e<.5?e*2:(1-e)*2},dr=e=>{let[,t]=ay(0);return iy(()=>{if(e)return cy(()=>t(n=>n+1))},[e]),us(ly())};var uy=(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),ut(e.slice(o).trim(),n)]},gu=3,my=2,py=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let a=e.length-o-1,c=a>0?String(a).length+1:0;if(r+s.width+c>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},hu=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=dr(r),s=e-4,a=s-7-1,[c,u]=uy(qe(t.title),a,s),m=u?null:ut(qe(t.props.description),s)||null,p=ln(t),f=un(t).map(R=>({...R,name:R.name})),g=Math.max(1,s-gu),x=E.getCommentsByIssue(t.id),S=x.length?String(x.length).length+2+1:0,{shown:T,hidden:C}=py([...p.map(R=>({id:R.id,isTag:!0,width:Math.min(R.name.length,g)+gu})),...f.map(R=>({id:R.id,isTag:!1,width:Math.min(R.name.length,g)+my+(xs(R.id)?0:1)}))],s-S);return et.createElement(cr,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?v.accent:v.secondary,justifyContent:"space-between"},et.createElement(cr,{paddingLeft:1,paddingRight:1,flexDirection:"column"},et.createElement(cr,{justifyContent:"space-between"},et.createElement(lr,{color:v.primary},c),et.createElement(lr,{color:v.secondary2,dimColor:!0},V(t.id))),u&&et.createElement(lr,{color:v.primary},u),m&&et.createElement(lr,{color:v.secondary2,dimColor:!0},m)),et.createElement(cr,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},et.createElement(cr,{flexDirection:"row"},T.map(R=>et.createElement(cr,{paddingRight:1,key:R.id},R.isTag?et.createElement(ar,{id:R.id,maxWidth:g}):et.createElement(mn,{id:R.id,maxWidth:g}))),C>0&&et.createElement(lr,{color:v.secondary2,dimColor:!0},"+",C)),x.length>0&&et.createElement(lr,{color:v.accent},"[",x.length,"]")))};import{Box as _n,Text as Jr}from"ink";import at from"react";var fy=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,vu=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:a})=>{let c=dr(s),u=(r.props.tags??[]).map(P=>E.getTag(P)).filter(P=>!!P),m=(r.props.assignees??[]).map(P=>E.getContributor(P)).map(P=>P&&{...P,name:P.name}).filter(P=>!!P),p=1,f=u.length*(1+p),g=m.length*(2+p),x=u.map(P=>at.createElement(_n,{key:P.id,paddingRight:p},at.createElement(Jr,{color:se(P.name)},"\u25A0"))),S=m.map(P=>at.createElement(_n,{key:P.id,paddingRight:p},at.createElement(Jr,{color:qr(P.name)},"@"+P.name.at(0)))),T=s?c:o?v.accent:a===y.MOVE?v.secondary:v.primary,C=E.getCommentsByIssue(r.id),R=C.length?String(C.length).length+2+p:0,L=C.length?at.createElement(_n,{paddingRight:p},at.createElement(Jr,{color:v.accent},"[",C.length,"]")):null,$=f+g+R,G=Math.max(1,n-t-$-($>0?1:0));return at.createElement(_n,{justifyContent:"space-between"},at.createElement(_n,null,at.createElement(_n,{width:t},o?at.createElement(Ge,{isSelected:!0}):at.createElement(Jr,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),at.createElement(Jr,{wrap:"truncate",color:T},fy(r.title,G))),at.createElement(_n,null,x,S,L))};var vy=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:a,mode:c})=>{let{renderedChildrenIndex:u,replay:m}=q(),p=u[e.id]??[],f=m?new Set(m.flashNodeIds):null,g=f?.has(e.id)??!1,x=dr(g),S=`${e.title} ${gy.hex(v.secondary2).dim("("+p.length+")")}`,T=3,C=o?1:5,R=s&&a===-1,L=n-3-(o?1:0)-(R?2:0),$=Math.max(2,String(p.length).length+1),G=r-T-1,P=Ut.createElement(Ta,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},Ut.createElement(Ge,{isSelected:t}),Ut.createElement(hy,{bold:!0,color:g?x:t?v.accent:v.primary},S," ",e.readonly?"\u{1F512}":"")),U=(H,tt)=>{let Ue=s&&a===tt;if(!M(H))return null;let De=f?.has(H.id)??!1;return o?Ut.createElement(vu,{key:H.id,index:tt,labelWidth:$,width:L,ticket:H,isSelected:Ue,isFlashing:De,mode:c}):Ut.createElement(hu,{key:H.id,width:L,ticket:H,isSelected:Ue,isFlashing:De})};return Ut.createElement(Ta,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},P,Ut.createElement(Ta,null,p.length>0&&Ut.createElement(mt,{selectedIndex:a,height:G,itemHeight:C},p.map(U)),R&&Ut.createElement(Ge,{isSelected:!0})))},yu=Ut.memo(vy);import{Box as jn,Text as Ua}from"ink";import Le,{useMemo as eo}from"react";var bu=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},xu=(e,t,n)=>le.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});import{Box as mr,Text as Jt}from"ink";import Ve,{useEffect as yy,useMemo as by,useRef as xy}from"react";import{decodeTime as Iu}from"ulid";var ur=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"},Ss=e=>String(e).padStart(2,"0"),Cs=e=>`${e.getFullYear()}-${Ss(e.getMonth()+1)}-${Ss(e.getDate())} ${Ss(e.getHours())}:${Ss(e.getMinutes())}`;var Iy=e=>we(e,"attachments"),Ey=e=>E.getAttachmentsByIssue(e.id).sort((t,n)=>Iu(t.id)-Iu(n.id)),Eu=e=>{for(let t of e)E.deleteNode(t.id)},Sy=(e,t,n)=>le.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),Cy=(e,t)=>{let n=E.getNode(Iy(e.id));if(!n||!ot(n))return[];let r=t.map((o,s)=>Sy(o,s,n.id)).map(o=>E.createNode(o)).filter(de).map(({value:o})=>o).filter(ot);return t.length>0&&h().selectedIndex<0&&D.navigate({contextNode:n,selectedIndex:0}),r},Ny=e=>`${Math.max(1,Math.round(e/1024))} KB`;function Su({ticket:e,width:t,height:n}){let r=by(()=>Ey(e),[e]),o=xy([]);yy(()=>(Eu(o.current),o.current=Cy(e,r),()=>{Eu(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=q(),c=Math.max(1,n-4),u=Math.max(12,t-32);return r.length===0?Ve.createElement(mr,{flexDirection:"column",width:t,height:n,padding:1},Ve.createElement(Jt,{color:v.primary},"No attachments yet."),Ve.createElement(mr,{paddingTop:1},Ve.createElement(Jt,{color:v.primary},"Attach images from the browser GUI"),Ve.createElement(Jt,{color:v.accent}," epiq gui "),Ve.createElement(Jt,{color:v.primary},"by dropping or pasting them."))):Ve.createElement(mr,{flexDirection:"column",width:t,height:n},Ve.createElement(mr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:v.secondary,borderStyle:"single",paddingBottom:1},Ve.createElement(Jt,{color:v.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),Ve.createElement(mt,{height:c,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let f=p===s,g=m.name.length>u?m.name.slice(0,u-1)+"\u2026":m.name;return Ve.createElement(mr,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Ve.createElement(Jt,{color:v.accent},f?"\u276F ":" "),Ve.createElement(mr,{paddingLeft:1},Ve.createElement(Jt,{color:v.secondary2},`#${p+1} `),Ve.createElement(Jt,{color:f?v.accent:v.primary},g),Ve.createElement(Jt,{color:v.secondary2}," "+Ny(m.bytes)+" "+ur(rt(m.id)))))})))}import{Box as pn,Text as fn}from"ink";import Re,{useEffect as ky,useMemo as Fu,useRef as Dy}from"react";import{decodeTime as Ou}from"ulid";var Nu=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,wa=e=>e.replace(Nu,"");var Cu=e=>e==="additions"||e==="deletions",Ma=e=>{let t=Nu.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"||!Cu(r.side)||!Cu(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var Ru=/```\n([\s\S]*?)\n?```\s*$/,Au=e=>Ru.exec(e)?.[1]??null,Ry=/`[^`\n]+`[^\n]*\n?$/,Tu=e=>wa(e).replace(Ru,"").replace(Ry,"").trim(),Ay=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} ${Ay(e)}`;var Ty=(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 a of r){let c=a;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},Qr=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)},wy=/!\[([^\]]*)\]\([^)]*\)/g,My=e=>e.replace(wy,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),Py=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),Ly=4,Mu=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(Ly)),La=e=>{let t=!1;return e.map(Mu).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=Ma(n);if(r)return{kind:"caption",text:Pa(r)};let o=My(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:Qr(s[1]??"")}:{kind:"text",spans:Qr(o)}})},Pu=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],wu=(e,t)=>{let n=[];for(let r of La(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 Pu(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of Ty(Py(r.spans),t))n.push({kind:r.kind,spans:Qr(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},Lu=(e,t)=>{let n=Ma(e),r=n?Au(e):null;if(!n||r===null)return wu(wa(e).split(`
57
- `),t);let o=Tu(e),s=r.split(`
58
- `).map(Mu),a=n.side===n.endSide?n.start:void 0,c=a===void 0?0:String(a+s.length-1).length+3;return[...o?[...wu(o.split(`
59
- `),t),{kind:"blank"}]:[],{kind:"caption",text:Pa(n)},...s.flatMap((u,m)=>Pu(u,Math.max(1,t-c)).map((p,f)=>({kind:"code",text:p,number:a===void 0||f>0?void 0:a+m})))]};import{Box as ku,Text as $n}from"ink";import pt from"react";var Du=({spans:e,bold:t})=>pt.createElement($n,{color:v.primary,bold:t},e.map((n,r)=>n.code?pt.createElement($n,{key:r,color:v.yellow},n.text):pt.createElement($n,{key:r},n.text))),ka=({line:e,width:t,gutter:n=0})=>{switch(e.kind){case"blank":return pt.createElement($n,null," ");case"fence":return pt.createElement($n,{color:v.secondary2},"```");case"caption":return pt.createElement($n,{color:v.accent},e.text);case"heading":return pt.createElement(Du,{spans:e.spans,bold:!0});case"text":return pt.createElement(Du,{spans:e.spans});case"code":{let r=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return pt.createElement($n,{backgroundColor:v.secondary,color:v.primary},r,e.text.padEnd(Math.max(0,t-r.length)))}}},Bu=({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 pt.createElement(ku,{flexDirection:"column"},e.map((o,s)=>pt.createElement(ku,{key:s},pt.createElement(ka,{line:o,width:t,gutter:r}))))};var By=4,Fy=e=>we(e,"comments"),Oy=e=>E.getCommentsByIssue(e.id).sort((t,n)=>Ou(t.id)-Ou(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Uu=e=>{for(let t of e)E.deleteNode(t.id)},Uy=(e,t)=>{let n=E.getNode(Fy(e.id));if(!n||!ot(n))return[];let r=t.map((o,s)=>xu(o,s,n.id)).map(E.createNode).filter(de).map(({value:o})=>o).filter(Dr);return t.length>0&&h().selectedIndex<0&&D.navigate({contextNode:n,selectedIndex:0}),r};function _u({ticket:e,width:t,height:n}){let r=Fu(()=>Oy(e),[e]),o=Dy([]);ky(()=>(Uu(o.current),o.current=Uy(e,r),()=>{Uu(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=q(),c=Math.max(1,n-4),u=Math.max(20,t-8),m=Fu(()=>r.map(f=>{let g=Lu(f.md,u);return g.length>0?g:[{kind:"blank"}]}),[r,u]),p=m.map(f=>f.length+By);return r.length===0?Re.createElement(pn,{flexDirection:"column",width:t,height:n,padding:1},Re.createElement(fn,{color:v.primary},"No comments yet."),Re.createElement(pn,{paddingTop:1},Re.createElement(fn,{color:v.primary},"Use"),Re.createElement(fn,{color:v.accent}," :comment "),Re.createElement(fn,{color:v.primary},"to add the first one."))):Re.createElement(pn,{flexDirection:"column",width:t,height:n},Re.createElement(pn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:v.secondary,borderStyle:"single",paddingBottom:1},Re.createElement(fn,{color:v.secondary2},"Comments (",r.length,") ")),Re.createElement(mt,{height:c,itemHeights:p,selectedIndex:s},r.map((f,g)=>{let x=g===s;return Re.createElement(pn,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:v.secondary,borderStyle:"single"},Re.createElement(pn,{flexDirection:"row",paddingBottom:1},Re.createElement(fn,{color:v.accent},x?"\u276F ":" "),Re.createElement(pn,{paddingLeft:1},Re.createElement(fn,{color:v.secondary2},`#${g+1} `),Re.createElement(mn,{id:f.authorId}),Re.createElement(fn,{color:v.secondary2}," "+ur(rt(f.id))))),Re.createElement(pn,{paddingLeft:3,paddingBottom:1},Re.createElement(Bu,{lines:m[g]??[],width:u})))})))}import{Box as Ns,Text as _y}from"ink";import Qt from"react";var $u=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=q(),{title:o}=t,s=t.parentNodeId?E.getNode(t.parentNodeId):void 0,a=s&&M(s)?o===ce.ASSIGNEES?s.props.assignees??[]:o===ce.TAGS?(s.props.tags??[]).filter(c=>E.getTag(c)):[]:[];return Qt.createElement(Ns,{alignItems:"center",paddingTop:1},Qt.createElement(Ns,{minWidth:12},Qt.createElement(Ge,{isSelected:n}),Qt.createElement(_y,{color:n?v.accent:v.secondary2},o,":")),Qt.createElement(Ns,{flexDirection:"row",marginLeft:1,paddingRight:1},a.map((c,u)=>{let m=r.id===t.id&&u===e;return Qt.createElement(Ns,{key:`${o}-${c}`,paddingRight:2,minHeight:1},Qt.createElement(Ge,{isSelected:m}),o===ce.ASSIGNEES?Qt.createElement(mn,{isSelected:m,id:c}):o===ce.TAGS?Qt.createElement(ar,{isSelected:m,id:c}):null)})))};import{Box as Zr,Text as Da}from"ink";import It,{useEffect as $y,useMemo as Ba}from"react";var jy="\u2029",ju=(e,t)=>`${e}::inline-line::${t}`,Fa=new Map,Hu=e=>{let t=Fa.get(e)??[];Fa.delete(e);for(let n of t)E.deleteNode(n)},Hy=(e,t)=>{Hu(e);let n=[];t.forEach((r,o)=>{let s=st(BigInt(o+1));if(!de(s))return;let a=E.createNode(le.text({id:ju(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));de(a)&&n.push(a.value.id)}),Fa.set(e,n)},Oa=({id:e,label:t,text:n,height:r,selected:o,maxWidth:s})=>{let{selectedIndex:a,contextNode:c}=q(),u=Ba(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=Ba(()=>u.join("\0"),[u]);$y(()=>(Hy(e,u),()=>{Hu(e)}),[e,m]);let p=s-10,g=Ba(()=>La(u).map(x=>{if(x.kind==="code")return{...x,text:ut(x.text,p)};if(x.kind==="text"||x.kind==="heading"){let S=x.spans.map(T=>T.code?`\`${T.text}\``:T.text).join("");return{...x,spans:Qr(ut(S,p))}}return x}),[u,p]).map((x,S)=>{let T=c.id===e&&a===S;return It.createElement(Zr,{key:ju(e,S)},It.createElement(Da,{color:T?v.primary:v.secondary2,dimColor:!T},`${S+1} `.padStart(5,"\xA0")),x.kind==="blank"?It.createElement(Da,{backgroundColor:T?"gray":void 0},jy):It.createElement(Zr,null,It.createElement(ka,{line:x,width:x.kind==="code"?p:0})))});return It.createElement(Zr,{flexDirection:"column",paddingTop:1},It.createElement(Zr,null,It.createElement(Ge,{isSelected:o}),It.createElement(Da,{color:o?v.accent:v.secondary2},t)),It.createElement(Zr,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,marginLeft:1},It.createElement(mt,{scrollByOne:!0,height:r-3,selectedIndex:a,itemHeight:1},g)))};var Wy=e=>we(e,"description"),Gy=e=>we(e,"comments"),Vy=e=>we(e,"history"),Ky=e=>we(e,"attachments"),Wu=({ticket:e,height:t})=>{let n=eo(()=>bu(e),[e]),{selectedIndex:r,contextNode:o}=q(),s=process.stdout.columns||120,a=eo(()=>Wy(e.id),[e.id]),c=eo(()=>Gy(e.id),[e.id]),u=eo(()=>Vy(e.id),[e.id]),m=eo(()=>Ky(e.id),[e.id]),p=E.getAttachmentsByIssue(e.id).length,f=o.id===e.id,g=o.id===c||o.parentNodeId===c,x=o.id===u||o.parentNodeId===u,S=o.id===m||o.parentNodeId===m,T=J(e.id);if(g){let H=t-3;return Le.createElement(jn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Le.createElement(_u,{ticket:e,width:s,height:H}))}if(S){let H=t-3;return Le.createElement(jn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Le.createElement(Su,{ticket:e,width:s,height:H}))}if(x){let U=E.getNode(u),H=U&&ot(U)?U.props.value??"":"",Ue=t-3;return Le.createElement(jn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},U?Le.createElement(Oa,{id:U.id,label:"Event log",text:H,selected:!1,maxWidth:s,height:Ue}):null)}let C=T.reduce((U,H)=>Lr(H)||H.id===c||H.id===m||H.id===u?U+1:U,0),R=2,L=3,$=C,G=t-L-$-R,P=(U,H)=>U.id===a?Le.createElement(Oa,{key:U.id,id:a,label:"Description (press e to edit)",text:e.props.description??"",selected:H,maxWidth:s,height:G}):Lr(U)?Le.createElement($u,{key:U.id,parent:U,selected:H,selectedIndex:r}):U.id===c?Le.createElement(jn,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(Ua,{backgroundColor:v.secondary,color:H?v.accent:v.primary},` Comments (${n}) \u203A\u203A `)):U.id===m?Le.createElement(jn,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(Ua,{backgroundColor:v.secondary,color:H?v.accent:v.primary},` Attachments (${p}) \u203A\u203A `)):U.id===u?Le.createElement(jn,{key:U.id,paddingTop:1},Le.createElement(Ge,{isSelected:H}),Le.createElement(Ua,{backgroundColor:v.secondary,color:H?v.accent:v.primary}," History \u203A\u203A ")):null;return Le.createElement(jn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},T.map((U,H)=>P(U,f&&r===H)))};var qy=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:a,width:c})=>{let u=t.context,m=u===F.TICKET||u===F.FIELD_LIST||u===F.FIELD,p=u===F.BOARD||u===F.SWIMLANE,f=u===F.TICKET?t:r.find(C=>C.context===F.TICKET),g=Math.floor(c/3),x=Math.floor(c/Math.max(e.length,1)),S=Math.min(x,g),T=s==="dense";return Rs.createElement(zy,{flexDirection:"row",height:a},p&&e.map((C,R)=>{let L=t.id===C.id,$=L?n:-1,G=t.context===F.BOARD&&n===R;return Rs.createElement(yu,{key:C.id,height:a,width:S,swimlane:C,isSelected:G,isDense:T,isFocused:L,listSelectedIndex:$,mode:o})}),m&&f&&Rs.createElement(Wu,{height:a,ticket:f}))},As=Rs.memo(qy);import{render as Jy}from"ink";import{Writable as Qy}from"node:stream";var to=e=>String(e).padStart(2,"0"),Zy=e=>{let t=e.getUTCFullYear(),n=to(e.getUTCMonth()+1),r=to(e.getUTCDate()),o=to(e.getUTCHours()),s=to(e.getUTCMinutes()),a=to(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${a}`},eb=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",tb=async(e,{width:t,height:n})=>{let r="",o=new Qy({write(a,c,u){let m=nb(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=Jy(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),s.unmount(),r},nb=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Vu=async()=>{let{viewMode:e}=Z(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=h(),a=r.find(R=>R.context==="BOARD");if(!a)return i("No board found to export");let c=120,u=40,m=await tb(Xy.createElement(As,{height:u,width:c,swimlanes:(s[a.id]??[]).filter(R=>R!==void 0&&Mt(R)),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=Ro(process.cwd());if(d(p))return i("Unable to export, epiq root not found");let f=new Date,g=Zy(f),x=`board_${eb(a.title)}_${g}.md`,S=ec(p.value);Gu.mkdirSync(S,{recursive:!0});let T=Yy.join(S,x),C=`# Board - ${a.title}
29
+ `)}`):(Jt(o),wv(),R({hasProjectDefinition:!0}),Pv(t),l("State booted successfully",null))}import{WebSocket as Lv}from"ws";var ds=new Set,wl=e=>{ds.add(e),e.on("close",()=>{ds.delete(e)}),e.on("error",()=>{ds.delete(e)})},Vn=e=>{let t=JSON.stringify(e);for(let n of ds)n.readyState===Lv.OPEN&&n.send(t)};var cs=e=>{ft()&&(R({syncStatus:e}),Vn({type:"sync-status",payload:e}))},ls=(e="Syncing...")=>{cs({status:"syncing",msg:e})},us=(e="Synced")=>{cs({status:"synced",msg:e})},Sa=e=>{cs({status:"failed",msg:e})},Ml=e=>{cs({status:"offline",msg:e})},He=e=>(Sa(e),a(e));var Bt=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),ms=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}},te=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);import qv from"node:fs";import tn from"node:fs";import Zr from"node:path";import Ft from"node:fs";import Qr from"node:path";var ur=e=>e.split(`
30
+ `).filter(t=>t.trim().length>0),Pl=e=>{let t=Qr.join(e,Ze,un);try{if(!Ft.existsSync(t))return l("No events directory",[]);let n=Ft.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>ur(Ft.readFileSync(Qr.join(t,r),"utf8")).length>0);return l("Looked for stranded event logs",n)}catch(n){return a(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},Ll=e=>Qr.join(e,Ze,un),kl=e=>{let t=Ll(e),n=new Map;try{if(!Ft.existsSync(t))return n;for(let r of Ft.readdirSync(t))r.endsWith(".jsonl")&&n.set(r,ur(Ft.readFileSync(Qr.join(t,r),"utf8")))}catch{return n}return n},kv=e=>{try{let t=JSON.parse(e);return typeof t=="object"&&t!==null}catch{return!1}},Dl=(e,t)=>{if(t.size===0)return[];let n=Ll(e),r=[];for(let[o,s]of t){if(s.length===0)continue;let i=Qr.join(n,o);try{let c=Ft.existsSync(i)?Ft.readFileSync(i,"utf8"):null,u=new Set(c===null?[]:ur(c)),m=s.filter(f=>!u.has(f)).filter(kv);if(m.length===0)continue;Ft.mkdirSync(n,{recursive:!0});let p=c!==null&&c.length>0&&!c.endsWith(`
31
+ `);Ft.appendFileSync(i,`${p?`
32
+ `:""}${m.join(`
33
+ `)}
34
+ `,"utf8"),r.push(`${o} (${m.length})`)}catch{continue}}return r},Dv=(e,t)=>{let n=new Set(ur(t));return ur(e).filter(r=>!n.has(r))},Bv=(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(`
35
+ `),Bl=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let r=await et({args:["show",`HEAD:${t}`],cwd:e});if(r.exitCode!==0)return l("No committed log to compare against",void 0);let o=Dv(r.stdout,n);return o.length>0?a(Bv(t,o,ur(r.stdout).length)):l("Event log only grew",void 0)};var Fv="[epiq:init-repo]",Ol=async e=>{let t=await et({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 a(["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(`
36
+ `));K.info("Creating initial commit");let r=await $({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(d(r))return a(r.message);let o=await $({args:["commit-tree",r.value.stdout.trim(),"-m",Fv],cwd:e});if(d(o))return a(o.message);let s=await $({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return d(s)?a(s.message):l("Created initial commit",!0)},Fl=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Ov=async e=>{let t=await Wo(e);if(d(t))return a(t.message);let n=await sc(e);return d(n)?a(n.message):l("Built sync commit message",`[sync|branch:${Fl(t.value)}:sha:${Fl(n.value)}]`)},Ca=async({repoRoot:e,stateBranchName:t})=>{K.info(`Creating ${t}`);let n=await $({args:["commit-tree",mc,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return a(`Failed to create state branch commit
37
+ ${n.message}`);let r=n.value.stdout.trim(),o=await $({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?a(`Failed to create ${t}
38
+ ${o.message}`):l("Created state branch",!0)},Na=async({repoRoot:e,stateBranchName:t})=>{let n=await Ho({repoRoot:e,branch:t});if(d(n))return a(`Ensure local state branch failed
39
+ `+n.message);if(n.value)return l("Local state branch already exists",!1);let r=await Vi({repoRoot:e});if(d(r))return a(`Ensure local state branch failed
40
+ `+r.message);let o=r.value,s=o?await Ki({repoRoot:e,branch:t}):l("No remote, no remote state branch",!1);if(d(s))return a(`Ensure local state branch failed
41
+ `+s.message);let i=s.value;if(o&&i){let c=await xe.fetch({cwd:e,remote:lt,branch:t});if(d(c))return a(`Failed to fetch ${t} from remote
42
+ ${c.message}`)}if(i){let c=await $({args:["branch","--track",t,`${lt}/${t}`],cwd:e});return d(c)?a(`Failed to create local ${t} from remote
43
+ ${c.message}`):l("Created local state branch from remote",!0)}return Ca({repoRoot:e,stateBranchName:t})},Uv=async({repoRoot:e,branch:t})=>{let n=await $({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return a(n.message);let r=n.value.stdout.split(`
44
+ `),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)},_v=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Ur(Zr.dirname(t));if(d(r))return a(`Failed to create state branch worktree
45
+ `+r.message);if(tn.existsSync(t)&&!tn.existsSync(Zr.join(t,".git"))){let s=Pl(t);if(d(s))return a(s.message);if(s.value.length>0)return a([`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(i=>` ${i}`),"","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(`
46
+ `));K.info("Removing broken state branch worktree path"),hc(t)}K.info("Creating state branch worktree");let o=await xe.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?a(`Failed to create state branch worktree
47
+ ${o.message}`):l("Created state branch worktree",!0)},Kn=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Uv({repoRoot:e,branch:n});if(d(r))return a(r.message);let o=Or(t),s=r.value?Or(r.value):null;if(s&&s===o&&tn.existsSync(s))return l("State branch already checked out in expected worktree",!1);if(s&&s!==o){let u=await dc(s);if(d(u))return a(u.message);if(u.value)return a([`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(`
48
+ `));K.info("Moving state branch worktree to expected location");let m=await xe.worktreeRemove({cwd:e,worktreeRoot:s});if(d(m))return a(`Failed to remove existing state branch worktree
49
+ ${m.message}`)}if(s&&!tn.existsSync(s)){K.info("Pruning stale state branch worktree");let u=await xe.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
50
+ ${u.message}`)}let i=await oc({repoRoot:e,worktreeRoot:t});if(d(i))return a(i.message);let c=tn.existsSync(t);if(i.value&&c)return l("State branch worktree already exists",!1);if(i.value&&!c){K.info("Pruning missing registered state branch worktree");let u=await xe.worktreePrune({cwd:e});if(d(u))return a(`Failed to prune stale worktrees
51
+ ${u.message}`)}return _v({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},$v=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Wo(e);if(d(n))return a(n.message);if(n.value===t)return l("State branch already checked out",!1);(await et({cwd:e,args:["rebase","--abort"]})).exitCode===0&&K.info("Aborted stale state branch rebase");let o=await xe.checkout({cwd:e,branch:t});return d(o)?a(`Failed to checkout ${t}
52
+ ${o.message}`):l("Checked out state branch",!0)},jv=async({repoRoot:e,stateBranchRoot:t})=>{let n=await zi(t);if(d(n))return a(n.message);if(n.value)return l("State branch upstream already configured",!1);let r=await Vi({repoRoot:t});if(d(r))return a(r.message);if(!r.value)return l("No remote available for state branch upstream",!1);let o=cn(e);if(d(o))return o;let s=o.value,i=await Ki({repoRoot:t,branch:s});if(d(i))return a(i.message);if(!i.value)return l("Remote state branch missing; upstream will be configured on first push",!1);K.info(`Configuring ${s} upstream`);let c=await xe.fetch({cwd:t,remote:lt,branch:s});if(d(c))return a(`Failed to fetch ${s}
53
+ ${c.message}`);let u=await xe.setUpstream({cwd:t,branch:s,upstream:`${lt}/${s}`});return d(u)?a(`Failed to set state branch upstream
54
+ ${u.message}`):l("Configured state branch upstream",!0)},ps=async({stateBranchRoot:e,eventFileName:t})=>{let n=pc(t),r=Zr.join(e,n);if(!tn.existsSync(r))return l("No event file to stage",null);let o=await Bl({stateBranchRoot:e,relativePath:n,workingContent:tn.readFileSync(r,"utf8")});if(d(o))return a(o.message);let s=await xe.stage({cwd:e,pathspec:[n]});return d(s)?a(`Failed to stage state branch event file
55
+ ${s.message}`):l("Staged state branch event file",n)},Ul=async({stateBranchRoot:e})=>{let t=fc(),n=Zr.join(e,t);if(!tn.existsSync(n))return l("No media directory to stage",null);let r=await xe.stage({cwd:e,pathspec:[t],ignoreRemoval:!0});return d(r)?a(`Failed to stage state branch media files
56
+ ${r.message}`):l("Staged state branch media files",t)},_l=async({stateBranchRoot:e})=>{let t=Ji();if(!tn.existsSync(Zr.join(e,t)))return l("No event log attributes to stage",null);let n=await xe.stage({cwd:e,pathspec:[t]});return d(n)?a(`Failed to stage event log attributes
57
+ ${n.message}`):l("Staged event log attributes",t)},$l=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await Ov(e);return d(r)?a(`Create state branch sync commit failed
58
+ `+r.message):ir({cwd:t,message:r.value,pathspec:n})},eo=async({repoRoot:e,stateBranchRoot:t})=>{let n=await zi(t);if(d(n))return a(n.message);let r=cn(e);if(d(r))return r;let o=r.value,s=n.value?await xe.push({cwd:t}):await xe.push({cwd:t,remote:lt,branch:o,setUpstream:!0});if(d(s))return a(`Failed during state branch push
59
+ ${s.message}`);let i=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return l(i?"Pushed state branch":"Remote already up to date",i)},jl=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=cn(e);if(d(o))return o;let s=o.value,i=[Vo(),await Na({repoRoot:e,stateBranchName:s}),await Kn({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await $v({stateBranchRoot:t,stateBranchName:s}),await yc(t),n?await jv({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(d(c))return a(c.message);r=r||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import fs from"node:fs";import Aa from"node:os";import Hv from"node:path";var Wv="epiq-sync.lock",Hl=600*1e3,Gv=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}},Vv=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Kv=e=>e&&(e.hostname!==Aa.hostname()||Vv(e.pid))?Date.now()-e.startedAt>Hl:!0,Gl=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Ra=e=>{try{return Gv(fs.readFileSync(e,"utf8"))}catch{return null}},Wl=(e,t)=>{let n={pid:process.pid,hostname:Aa.hostname(),startedAt:Date.now(),operation:t};try{return fs.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},zv=async({worktreeRoot:e,operation:t})=>{let n=await Gi(e);if(d(n))return a(n.message);let r=Hv.join(n.value,Wv),o=()=>{try{let c=Ra(r);c&&c.pid===process.pid&&fs.rmSync(r)}catch{}};if(Wl(r,t))return l("Acquired sync lock",{acquired:!0,release:o});let s=Ra(r);if(!Kv(s))return l("Sync lock is held",{acquired:!1,heldBy:s});K.info(`Breaking an abandoned sync lock: ${s?Gl(s):"unreadable lock file"}`);try{fs.rmSync(r,{force:!0})}catch{}if(Wl(r,t))return l("Acquired sync lock after breaking a stale one",{acquired:!0,release:o});let i=Ra(r);return l("Sync lock taken by another process",{acquired:!1,heldBy:i??{pid:-1,hostname:Aa.hostname(),startedAt:Date.now(),operation:"unknown"}})},Vl=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await zv({worktreeRoot:e,operation:t});if(d(r))return a(r.message);if(!r.value.acquired)return K.info(`Skipping ${t}: the state worktree is held by ${Gl(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()}};var Yv=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=te("getRepoRootDir",await bt(e));if(d(n))return a(n.message);let r=n.value;logger.debug("[sync] repo root",r);let o=te("getStateBranchRoot",Ce({repoRoot:r}));if(d(o))return a(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 i=te("bootstrapStateBranchStorage",await jl({repoRoot:r,stateBranchRoot:s,ensureUpstream:t}));if(d(i))return a(i.message);logger.debug("[sync] bootstrap result",{bootstrapped:i.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let c=te("hasInProgressGitOperation(stateBranchRoot)",await jo(s));if(d(c))return a(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"),a("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=te("ensureStateBranchLayout",vc(r,s));return d(u)?a(u.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:s,bootstrapped:i.value}),l("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:s,bootstrapped:i.value}))},Xv=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=te("stageStateBranchOwnEventFile",await ps({stateBranchRoot:t,eventFileName:n}));if(d(r))return a(r.message);let o=te("stageStateBranchMediaFiles",await Ul({stateBranchRoot:t}));if(d(o))return a(o.message);let s=te("stageStateBranchEventAttributes",await _l({stateBranchRoot:t}));if(d(s))return a(s.message);let i=[r.value,o.value,s.value].filter(m=>m!==null);if(i.length===0)return l("Nothing to stage",{createdCommit:!1});let c=te("hasStagedChanges(after stage)",await cc(t,i));if(d(c))return a(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=te("createStateBranchSyncCommit",await $l({repoRoot:e,stateBranchRoot:t,pathspec:i}));return d(u)?a(u.message):(logger.debug("[sync] created sync commit",u.value),l("Committed own event file",{createdCommit:!0,commitSha:u.value}))},Kl=e=>{let t=e.createdCommit?"Committed locally, offline":"Offline";return Ml(t),l(t,{...e,pulled:!1,pushed:!1,offline:!0})},zl=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.debug("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.error("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),a("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),a("Own event file must end with .jsonl");ls();let n=te("ensureSyncReady",await Yv({cwd:e,ensureUpstream:!0}));if(d(n))return He(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,i=te("isDetachedHead(stateBranchRoot)",await lc(o));if(d(i))return He(i.message);if(logger.debug("[sync] detached state branch check result",{detached:i.value}),i.value)return He("Cannot run :sync while the state branch is in detached HEAD state");let c=!1,u,m=!1,p=!1,f=te("getStateBranch",cn(r));if(d(f))return He(f.message);let v=f.value;logger.debug("[sync] resolved state branch",{stateBranch:v,stateBranchRoot:o});let N=te("commitOwnEventFileToStateBranch",await Xv({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(N))return He(N.message);c=N.value.createdCommit,u=N.value.commitSha;let C=te("pullBranchRebaseIfPresent",await Yi({cwd:o,branch:v}));if(d(C))return qi(C.message)?Kl({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,bootstrapped:s}):He(C.message);m=C.value;let I=te("isAheadOfUpstream",await ac(o));if(d(I))return He(I.message);if(c||s||I.value){logger.info("[sync] pushing state branch",{createdCommit:c,bootstrapped:s,stateBranchRoot:o});let S=te("pushStateBranch",await eo({stateBranchRoot:o,repoRoot:r}));if(d(S)&&ic(S.message)){let A=te("pullBranchRebaseIfPresent(retry)",await Yi({cwd:o,branch:v}));if(d(A))return He(A.message);m=m||A.value,S=te("pushStateBranch(retry)",await eo({stateBranchRoot:o,repoRoot:r}))}if(d(S))return qi(S.message)?Kl({repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,bootstrapped:s}):He(S.message);p=S.value}if(c){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:o});let S=te("git rev-parse HEAD",await $({args:["rev-parse","HEAD"],cwd:o}));if(d(S))return He(S.message);u=S.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return us(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})},Jv=async(e,t)=>{let n=kl(e);try{return await t()}finally{let r=Dl(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},gs=async e=>{let t=e.cwd??process.cwd(),n=await bt(t);if(d(n))return He(n.message);let r=Ce({repoRoot:n.value});if(d(r))return He(r.message);let o=r.value;if(!qv.existsSync(o))return zl(e);let s=await Vl({worktreeRoot:o,operation:"sync",fn:()=>Jv(o,()=>zl(e))});return d(s)?He(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 Ot=null,hs=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Ot,currentStatus:g().syncStatus?.status,currentMessage:g().syncStatus?.msg}),Ot)return logger.debug("[sync] syncAndReloadState joining existing promise"),Ot;logger.debug("[sync] syncAndReloadState creating promise"),Ot=Qv();try{let e=await Ot;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!d(e),message:(d(e),e.message),statusAfterResolve:g().syncStatus?.status,statusMessageAfterResolve:g().syncStatus?.msg}),d(e)&&g().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),R({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}),Ot||a(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:g().syncStatus?.status,statusMessageBeforeClear:g().syncStatus?.msg}),Ot=null}},Qv=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:g().mode,syncStatus:g().syncStatus});let e=ql();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:g().mode,message:e.message,syncStatus:g().syncStatus}),e;if(Ot)return Ot;logger.debug("[sync] syncAndReloadState:start");let t=te("resolveActorId",ge());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:d(t)?t.message:"Missing actor id"}),a("Unable to resolve event log path");R({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:g().syncStatus});let n=Hn(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=te("syncEpiqWithRemote",await gs({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!d(r),message:(d(r),r.message)}),d(r))return logger.error("[sync] syncAndReloadState:sync failed",r.message),R({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:g().syncStatus}),He(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:o});let i=te("loadMergedEvents",Zt(o));if(logger.debug("[sync] loadMergedEvents:result",{success:!d(i),message:(d(i),i.message),count:d(i)?void 0:i.value.events.length}),d(i))return R({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:g().syncStatus}),a(`Unable to load events. ${i.message}`);logger.debug("[sync] loaded merged events after sync",{count:i.value.events.length});let c=ql();if(c)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:g().mode,message:c.message,syncStatus:g().syncStatus}),c;let u=Nl(),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:i.value.events.length});let f=te("bootStateFromEventLog",en(i.value.events,i.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!d(f),message:(d(f),f.message)}),d(f))return R({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:g().syncStatus}),a(`Unable to boot synced state. ${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"),R({filters:m}),logger.debug("[sync] restoreNavigationAnchor:start");let p=te("restoreNavigationAnchor",Al(u));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!d(p),message:d(p)?p.message:"Navigation restored",selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id}),d(p)?(R({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:g().syncStatus}),p):(R({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:g().syncStatus}),l("Synced",!0))},ql=()=>g().mode===y.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:g().mode,syncStatus:g().syncStatus}),R({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var mr=3e3,Yl=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<mr?null:t},Xl=0,Ta,wa=!1,to=!1,Ma=()=>{if(wa)return!0;let e=rt();return d(e)?!1:e.value.syncStatus.status==="syncing"},Zv=()=>{let e=Z().autoSyncIntervalMs??1e4,t=Date.now()-Xl;return Math.max(0,e-t)},Jl=()=>{Ta||(Ta=setTimeout(async()=>{if(Ta=void 0,!!ft()){if(Ma()){to=!0;return}to=!1,await ey()}},Zv()))},ey=async()=>{if(g().readOnly||g().timeMode==="peek"||g().timeMode==="replay")return a("Cannot auto-sync while peeking");if(!ft())return a("Cannot auto-sync before state is initialized");if(Ma())return to=!0,a("Sync already in progress");wa=!0,Xl=Date.now(),R({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await hs()}finally{wa=!1,to&&Jl()}},vs=()=>{ft()&&(to=!0,!Ma()&&Jl())};import no from"node:fs";import ro from"node:path";import{z as pr}from"zod";var ys="recent-projects.json",ty=20,ny=pr.object({projectId:pr.string().min(1),root:pr.string().min(1),lastOpenedAt:pr.number().finite()}),ry=pr.object({projects:pr.array(ny)}),Zl=()=>ro.join(On(),ys),fr=e=>ro.basename(e)||e,Ql=e=>{let t=ro.resolve(e);try{return no.realpathSync(t)}catch{return t}},eu=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,tu=e=>{if(!jr(e.root))return!1;let t=Br(e.root);return!d(t)&&t.value===e.projectId},nu=()=>{let e=Zl();if(!no.existsSync(e))return l("No recent projects recorded",[]);let t;try{t=JSON.parse(no.readFileSync(e,"utf8"))}catch(r){return a(`Invalid ${ys}: ${r instanceof Error?r.message:String(r)}`)}let n=ry.safeParse(t);return n.success?l("Read recent projects",n.data.projects):a(`Invalid ${ys} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},oy=e=>{let t=Zl();try{no.mkdirSync(ro.dirname(t),{recursive:!0}),no.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
60
+ `,"utf8")}catch(n){return a(`Unable to write ${ys}: ${n instanceof Error?n.message:String(n)}`)}return l("Recorded recent project",e)},nn=({exclude:e}={})=>{let t=nu();if(d(t))return t;let n=e===void 0?null:Ql(e);return l("Listed recent projects",t.value.filter(r=>n===null||Ql(r.root)!==n).filter(tu).sort(eu))},bs=({root:e,now:t=Date.now()})=>{let n=ro.resolve(e),r=Br(n);if(d(r))return a(r.message);let o=r.value,s=nu(),i=d(s)?[]:s.value,c=[{projectId:o,root:n,lastOpenedAt:t},...i.filter(u=>u.projectId!==o&&u.root!==n)].filter(tu).sort(eu).slice(0,ty);return oy(c)};var bn=()=>{let e=Z(),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}},ru=()=>{let e=$e(process.cwd());if(d(e))return!1;let t=Tt(e.value);return de(t)},ou=e=>e===!0?"on":e===!1?"off":null,su=e=>e==="on"?!0:e==="off"?!1:null;var We={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"},h={accent:We.cyan,accent2:We.magenta,primary:We.white,secondary:We.grayDark,secondary2:We.grayLight,gray:We.gray,green:We.green,yellow:We.yellow,red:We.red};var T={red:We.red,yellow:We.yellow,green:We.green,blue:We.blue,magenta:We.magenta,cyan:We.cyan},gr={urgent:T.red,critical:T.red,important:T.red,blocker:T.red,asap:T.red,immediate:T.red,fail:T.red,failure:T.red,broken:T.red,bug:T.red,error:T.red,incident:T.red,outage:T.red,production:T.red,crash:T.red,security:T.red,warning:T.yellow,warn:T.yellow,risky:T.yellow,risk:T.yellow,attention:T.yellow,pending:T.yellow,review:T.yellow,"needs-review":T.yellow,qa:T.yellow,testing:T.yellow,test:T.yellow,validate:T.yellow,verification:T.yellow,staging:T.yellow,check:T.yellow,"follow-up":T.yellow,followup:T.yellow,waiting:T.yellow,blocked:T.yellow,hold:T.yellow,done:T.green,complete:T.green,completed:T.green,success:T.green,ok:T.green,stable:T.green,resolved:T.green,fixed:T.green,closed:T.green,merged:T.green,released:T.green,deployed:T.green,approved:T.green,verified:T.green,working:T.green,healthy:T.green,pass:T.green,passing:T.green,info:T.blue,information:T.blue,note:T.blue,docs:T.blue,documentation:T.blue,doc:T.blue,guide:T.blue,help:T.blue,explanation:T.blue,detail:T.blue,details:T.blue,context:T.blue,design:T.blue,discussion:T.blue,proposal:T.blue,idea:T.blue,feature:T.magenta,enhancement:T.magenta,improvement:T.magenta,refactor:T.magenta,refactoring:T.magenta,cleanup:T.magenta,optimize:T.magenta,optimization:T.magenta,perf:T.magenta,performance:T.magenta,upgrade:T.magenta,migration:T.magenta,modernize:T.magenta,debt:T.magenta,todo:T.cyan,next:T.cyan,planned:T.cyan,plan:T.cyan,future:T.cyan,backlog:T.cyan,investigate:T.cyan,explore:T.cyan,prototype:T.cyan};var sy=e=>e.props.tags??[],iy=e=>e.props.assignees??[],xn=e=>sy(e).map(t=>E.getTag(t)).filter(t=>!!t),In=e=>iy(e).map(t=>E.getContributor(t)).filter(t=>!!t),xs=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!P(n)?a("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",xn(n))},Is=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!P(n)?a("Invalid unassign target"):l("Retrieved assignees from ticket in breadcrumb",In(n))};var 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",COFFEE:"coffee",NONE:""};var ay=/^(\d+)(h|d|w|mo|y)$/,dy=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,cy=({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},ly=(e,t=new Date)=>{let n=e.match(ay);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let i=new Date(t);switch(o){case"h":return i.setHours(i.getHours()-s),i;case"d":return i.setDate(i.getDate()-s),i;case"w":return i.setDate(i.getDate()-s*7),i;case"mo":return i.setMonth(i.getMonth()-s),i;case"y":return i.setFullYear(i.getFullYear()-s),i;default:return null}},uy=e=>{let t=e.match(dy);if(!t)return null;let[,n,r,o,s,i]=t,c=Number(n),u=Number(r),m=Number(o),p=s?Number(s):0,f=i?Number(i):0;return cy({year:c,month:u,day:m,hour:p,minute:f})?new Date(c,u-1,m,p,f):null},zn=e=>{let t=e.trim().toLowerCase();return ly(t)??uy(t)};var iu=/^(\d+)(s|m)?$/,Es=e=>{let t=e.trim().toLowerCase().match(iu);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},Ss=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&iu.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},au=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,my=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],Pa=(e=my)=>{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 py=["BOARD","TICKET","SWIMLANE","COMMENT"],me={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},it={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Re={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},fy=[me.EDITOR,me.VIEW,me.USERNAME,me.AUTOSYNC,me.SYNC_DEBOUNCE_MS,me.ATTACHMENT_MAX_KB,me.LOG_LEVEL],gy=(e=g().selectedNode?.context)=>{switch(e){case"TICKET":return[it.TITLE,it.DESCRIPTION];case"BOARD":case"SWIMLANE":return[it.TITLE];case"COMMENT":return[it.COMMENT];default:return[]}},ka=[String(mr),"5000","15000","30000","60000"],Da=["250","500","1000"],lu=["10s","20s","30s","45s"],qn=[b.COFFEE,b.EXIT,b.SYNC,b.HELP,b.EXPORT,b.CONFIG,b.YANK],Cs=[b.NEW,b.EDIT,b.DELETE,b.MOVE],La=[b.TAG,b.UNTAG,b.ASSIGN,b.UNASSIGN,b.CLOSE_ISSUE,b.RE_OPEN_ISSUE,b.EDIT,b.COMMENT],du=[b.FILTER,b.PEEK,b.REPLAY],hy={WORKSPACE:[...qn,...Cs],BOARD:[...du,...qn,...Cs],SWIMLANE:[...du,...qn,...Cs],TICKET:[...qn,...Cs,...La],FIELD:[...qn,...La],FIELD_LIST:[...qn,...La],TEXT:[...qn],COMMENT:[b.EDIT,b.DELETE,b.YANK]},vy=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],oo=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&P(n)),cu=e=>e.parentNodeId===Ee,yy=({selectedNode:e,breadCrumb:t})=>{let n=gy(e?.context);return oo({breadCrumb:t,selectedNode:e})?n.includes(it.DESCRIPTION)?n:[...n,it.DESCRIPTION]:n},by=({selectedNode:e,breadCrumb:t})=>{let n=oo({breadCrumb:t,selectedNode:e});return n?[Re.REF,Re.TITLE,...n.props?.description?.trim()?[Re.DESCRIPTION]:[],...xn(n).length>0?[Re.TAGS]:[],...In(n).length>0?[Re.ASSIGNEES]:[]]:e?[Re.REF,Re.TITLE]:[]},Ba=()=>{let e=nn({exclude:process.cwd()});return d(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},xy=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=bn();if(!r)return[b.HELP,b.CONFIG];if(!ru())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&&py.includes(o),i=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?hy[u]:[]))],c=oo({breadCrumb:n,selectedNode:e});return i.filter(u=>u===b.MOVE?!1:u===b.YANK?!!(c??e):u===b.EDIT?s||!!c:u===b.DELETE?s:u===b.UNTAG?!!(c&&xn(c).length>0):u===b.UNASSIGN?!!(c&&In(c).length>0):u===b.RE_OPEN_ISSUE?!!(c&&cu(c)):u===b.CLOSE_ISSUE?!!(c&&!cu(c)):!0)},he=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=g())=>{let s=t.context??"WORKSPACE";return{[b.NONE]:xy({breadCrumb:o,readOnly:r,selectedNode:n}),[b.EXIT]:["confirm"],[b.EXPORT]:[],[b.SYNC]:[],[b.INIT]:[],[b.OPEN]:e===b.OPEN?Ba():[],[b.HELP]:[],[b.PEEK]:[...Pa(),"now","prev","next"],[b.REPLAY]:[...Pa()],[b.EDIT]:yy({selectedNode:n,breadCrumb:o}),[b.YANK]:by({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(gr),...E.getExistingTags()])],[b.UNTAG]:[...xs()?.value?.map(({name:c})=>c)??[]],[b.UNASSIGN]:[...Is()?.value?.map(({name:c})=>c)??[]],[b.ASSIGN]:E.getExistingAssignees(),[b.NEW]:vy(s),[b.CONFIG]:[...fy],[b.COFFEE]:["1","3","5","20","custom"]}[e]??[]};import Tu from"chalk";var uu=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import Ny from"zod";import Iy from"node:crypto";import so from"node:fs";import fu from"node:path";var mu="/media/",pu=e=>`${mu}${e}`,Fa=(e,t)=>`![${e}](${pu(t)})`;var Ut=500,Ey=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,hr=(e,t)=>`${e}.${t}`,Sy=e=>Ey.test(e),gu=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"):a(`Unsupported image format. Allowed: ${wc.join(", ")}`),hu=e=>Iy.createHash("sha256").update(e).digest("hex"),Cy=(e,t=Ut)=>{if(e.length===0)return a("Attachment is empty");if(e.length>t*1024)return a(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=gu(e);return d(n)?n:l("Validated attachment data",{hash:hu(e),ext:n.value,bytes:e.length})},vu=(e,t,n=Ut)=>{let r=Cy(t,n);if(d(r))return r;let o=$r(e),s=fu.join(o,hr(r.value.hash,r.value.ext));try{so.existsSync(s)||(so.mkdirSync(o,{recursive:!0}),so.writeFileSync(s,t))}catch(i){return a(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return l("Wrote attachment blob",r.value)},yu=(e,t,n=Ut)=>{if(!Sy(t))return a("Invalid attachment file name");let r=fu.join($r(e),t);if(!so.existsSync(r))return a("Attachment blob not found");let o;try{o=so.readFileSync(r)}catch(u){return a(`Unable to read attachment blob: ${u instanceof Error?u.message:String(u)}`)}if(o.length>n*1024)return a(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(hu(o)!==s)return a("Attachment blob does not match its content hash");let c=gu(o);return d(c)?c:c.value!==i?a("Attachment blob content does not match its extension"):l("Resolved attachment blob",{filePath:r,ext:i,bytes:o.length})};var io=50,ao=5e3,bu=()=>{let e=ne().commandMeta.inputString,t=Ny.coerce.number().int().min(io).max(ao).safeParse(e);if(!t.success)return a(`Attachment size cap must be ${io}-${ao} KB (default ${Ut})`);let n=mt({attachmentMaxKb:t.data});return d(n)?n:(je({attachmentMaxKb:t.data}),R({mode:y.DEFAULT}),l(`Attachment size cap set to ${t.data} KB`,null))};import vr from"chalk";var Ua={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},xu=(e,t,n)=>Math.max(t,Math.min(n,e)),Oa=(e,t,n)=>e+(t-e)*n,Iu=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Ry=e=>e.toLowerCase().trim(),Ay=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,i=e/60,c=s*(1-Math.abs(i%2-1)),u=0,m=0,p=0;i>=0&&i<1?(u=s,m=c):i>=1&&i<2?(u=c,m=s):i>=2&&i<3?(m=s,p=c):i>=3&&i<4?(m=c,p=s):i>=4&&i<5?(u=c,p=s):(u=s,p=c);let f=o-s/2;return[Math.round((u+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},Eu=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`;var Ty=(e,t,n)=>{let r=xu(n,0,1);return[Math.round(Oa(e[0],t[0],r)),Math.round(Oa(e[1],t[1],r)),Math.round(Oa(e[2],t[2],r))]};var wy=(e,t,n)=>Ty(e,t,n),co=e=>{let t=Iu(e)%360,n=Ay(t,Ua.stringColor.saturation,Ua.stringColor.lightness);return Eu(n)},se=(e,t=gr)=>{let n=Ry(e??"");return n&&t[n]?t[n]:co(n)};var Su=e=>{let t=Ua.gradient.stops,n=xu(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),i=o-s;return wy(t[s],t[s+1],i)},Ns=e=>Eu(Su(e)),Rs=e=>Iu(e.toLowerCase().trim())/4294967295,Cu=e=>{let t=Rs(e);return Su(t)},My=e=>{let[t,n,r]=Cu(e);return{normal:o=>vr.bgRgb(t,n,r).black(o),cursor:o=>vr.bgRgb(t,n,r).white.bold(o)}},_a=e=>{let[t,n,r]=Cu(e);return{fg:o=>vr.rgb(t,n,r)(o),fgCursor:o=>vr.rgb(t,n,r).inverse(o),bg:o=>vr.bgRgb(t,n,r).black(o),bgCursor:o=>vr.bgRgb(t,n,r).white.bold(o)}},As=e=>My(e).normal(` ${e} `);var Et=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as Py}from"node:crypto";var Ly="0123456789ABCDEFGHJKMNPQRSTVWXYZ",ky=e=>{let t=Py("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+=Ly[Number(n>>s&31n)]}return r},Me=(e,t)=>ky(`${e}:virtual:${t}`);import Nu from"chalk";var re=e=>Nu.dim(e),Pe=e=>Nu.hex(h.primary)(e),Le=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let i=o.trim();if(i.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(i))].sort((f,v)=>Rs(f)-Rs(v)).slice(0,r).map(f=>As(f)).join(" ");return p?`${re(e)}${p}${re(n)}`:""};var _t={None:"none",Invalid:"invalid",Valid:"valid"};var Dy=["BOARD","TICKET","SWIMLANE"],Ru=()=>{let e=g().selectedNode;if(!e?.context)return j({message:re("Missing target context")});if(Dy.includes(e.context))return X();if(e.parentNodeId){let t=g().nodes[e.parentNodeId];if(t?.id===Me(t?.parentNodeId??"","comments"))return X()}return j({message:re("Command not available in this context")})},ue="<ENTER> to confirm",X=(e="",t=[])=>({message:re(e),validity:_t.Valid,completionWordList:t}),j=({message:e,completionWordList:t=[]})=>({validity:_t.Invalid,message:e,completionWordList:t}),yr=e=>e.length===0,Au=(e,t)=>{let n=qe(g().breadCrumb,"BOARD");if(d(n))return j({message:Pe("Command is not applicable in this context")});let r=qo(n.value.id);return d(r)?j({message:Pe(`Unable to ${t}: board id is not a valid ULID`)}):au({date:e,horizonDate:r.value})?null:j({message:Pe(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},Ts=e=>` ${Tu.hex("#000").bgHex(se(e))(` ${e} `)} `,$a=({modifier:e})=>{let t="confirm";return e===t?X(ue):j({message:yr(e)?re("if you are certain, enter ")+As(t):"",completionWordList:[t]})},By=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?j({message:re(n)}):X():j({message:yr(r)?t:"",completionWordList:[...e]}),Yn=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>yr(n)&&yr(r)?j({message:e,completionWordList:[]}):X(t??ue),Fy=({modifier:e,inputString:t})=>{let n=Ba();return!yr(e)||!yr(t)?X(ue):j({message:n.length?re("number from the list, or a path"):re("path to an epiq project"),completionWordList:n})},Oy=({modifier:e,inputString:t})=>{let n=he(b.CONFIG);if(!n.includes(e))return j({message:Le({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case me.EDITOR:{let r=[...uu];return t.trim()?r.includes(t.trim())?X(ue):j({message:Le({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):j({message:Le({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case me.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?X(ue):j({message:Le({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case me.USERNAME:return t.trim()?X(ue):j({message:Pe("Enter a user name. Saved in ")+Tu.bgBlack("~/.epiq-global/config.json")});case me.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?X(ue):j({message:Le({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case me.AUTOSYNC:{let r=["on","off"],o=Z().autoSync;if(!r.includes(t.trim())){let s=ou(o);return j({message:Le({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return X(ue)}case me.ATTACHMENT_MAX_KB:{let r=Z().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<io||o>ao){let s=Le({prefix:" examples: ",wordList:Da,minLengthForHints:0,inputString:t});return j({message:Pe(`provide a size cap in KB (${io}-${ao}). current: ${r??Ut} KB.`)+s,completionWordList:Da})}return X(ue)}case me.SYNC_DEBOUNCE_MS:{let r=Z().autoSyncIntervalMs,o=Yl(t);if(!t.trim()||o===null||o<mr){let s=Le({prefix:" examples: ",wordList:ka,minLengthForHints:0,inputString:t});return j({message:Pe(`provide duration above ${mr}ms. current duration: ${r}ms.`)+s,completionWordList:ka})}return X(ue)}default:return j({message:Pe("Unknown config option"),completionWordList:n})}},Uy=({modifier:e,inputString:t})=>{let n=he(b.EDIT);if(!n.length)return j({message:Pe("Command not available in this context")});if(!n.includes(e)){let r=Le({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return j({message:r||Pe("Unknown edit option"),completionWordList:n})}switch(e){case it.COMMENT:return t.trim()?X(ue):j({message:re("write a comment...")});case it.TITLE:return X(ue);case it.DESCRIPTION:{let{preferredEditor:r}=Z();return r?X(re("<ENTER> to edit in ")+r):j({message:"No editor selected"})}default:return j({message:Pe("Unknown edit option"),completionWordList:n})}},_y=({modifier:e})=>{let t=he(b.YANK);return t.length?t.includes(e)?X(ue+re(" and copy to clipboard")):j({message:Le({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):j({message:Pe("Nothing selected to copy from")})},$y={[b.EXPORT]:()=>X(ue+re(", and create export markdown file")),[b.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return X(ue);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=zn(r);if(!r||!o)return j(n);let s=Au(o,"peek");return s||X(ue)},[b.REPLAY]:e=>{let{dateInput:t,durationInput:n}=Ss(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=zn(t);if(!t||!o)return j(r);let s=Au(o,"replay");return s||(n&&Es(n)===null?j({message:Pe("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):X("<ENTER> to replay board history",n?lu:[]))},[b.EXIT]:()=>X(ue+re(" and exit the application")),[b.INIT]:()=>X(ue),[b.OPEN]:Fy,[b.PALETTE]:()=>X(ue),[b.FILTER]:e=>{if(e.modifier==="clear")return X(ue);let t=s=>he(b.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return j({message:Le({wordList:he(b.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:he(b.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())?j({message:Le({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):X():j({message:Le({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[b.NONE]:e=>{let t=he(b.NONE);return j({message:Le({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[b.NEW]:e=>By({list:he(b.NEW),hint:Le({wordList:he(b.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[b.HELP]:()=>X(ue),[b.EDIT]:Uy,[b.COMMENT]:e=>{let t=Yn({hint:re(`write a comment (max ${4e3} char)...`),onOk:re(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===_t.Invalid?t:e.inputString.length>4e3?X(Pe("max input exceeded")):t},[b.CONFIG]:Oy,[b.YANK]:_y,[b.DELETE]:e=>{let t=Ru();return t.validity==="invalid"?t:$a(e)},[b.CLOSE_ISSUE]:e=>$a(e),[b.RE_OPEN_ISSUE]:e=>$a(e),[b.MOVE]:e=>{let t=Ru();return t.validity==="invalid"?t:Yn({hint:Le({prefix:"hey hacker! These commands are blocked for you... ",wordList:he(b.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[b.TAG]:e=>{let n=E.getExistingTags().slice(0,10).map(Ts).join("");return Yn({hint:n.length?re("create tag or reuse:")+n+re(""):re("create tag ...")})(e)},[b.UNTAG]:e=>{let t=xs();if(d(t))return j({message:Pe("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Ts).slice(0,10);return n.length?Yn({hint:re(" ... ")+n.join("")})(e):j({message:Pe("Issue has no tags"),completionWordList:[]})},[b.ASSIGN]:e=>{let t=E.getExistingAssignees().map(Ts).slice(0,10);return Yn({hint:re("assignees... ")+t.join("")})(e)},[b.UNASSIGN]:e=>{let t=Is();if(d(t))return j({message:Pe("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Ts).slice(0,10);return n.length?Yn({hint:re("remove assignee... ")+n.join("")})(e):j({message:Pe("Issue has no assignees"),completionWordList:[]})},[b.SYNC]:()=>X(ue),[b.COFFEE]:e=>{let{modifier:t}=e,n=he(b.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?j({message:re("enter an amount ... "),completionWordList:n.filter(r=>r.startsWith(t))}):Yn({hint:Le({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},wu=Object.fromEntries(Object.entries($y).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var 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 jy=3,Hy=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"]),Wy=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},Gy=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=jy&&!Hy.has(t)&&!/^\d+$/.test(t)),Vy=e=>{let t=new Map;for(let s of Wy(e))for(let i of Gy(s))t.set(i,(t.get(i)??0)+1);let n=[...t.entries()].sort((s,i)=>i[1]-s[1]||s[0].localeCompare(i[0])).map(([s])=>s),r=new Set(n),o=ws.filter(s=>!r.has(s));return[...n,...o]},Mu=ws,Pu=-1,Lu=()=>{let e=rt();if(d(e))return ws;let t=e.value,n=t.eventLog.length;return n!==Pu&&(Mu=Vy(t),Pu=n),Mu};var ku=e=>Object.values(b).includes(e),Du=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:c,completionWordList:u}=wu[n].validate(n,r,s),m=n!==b.PEEK&&n!==b.REPLAY,p=o==="command"||o==="modifier"?he(n):m?Lu():[],{mode:f}=g(),v=f===y.COMMAND_LINE?i??"":"",N=[...u,...p];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:v,autoCompletion:t?jc(e,N):{hint:"",hints:[],remainder:"",overlap:0}}};var Bu=e=>{let t=e.trimStart(),n=zy(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=qy(e),c=ku(r)?r:null,u=c!==null,m=r!=="",p=c?he(c)??[]:[],f=c&&p.includes(o)?o:"",v="word";n.length===0||n.length===1&&!s?v="command":(n.length===1&&s||n.length===2&&!s)&&(v="modifier");let N=s?"":i,C=Ky(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:s,modifier:f,target:v,inputToMatch:N,inputString:C}},Ky=(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},zy=e=>e.trim()?e.trim().split(/\s+/):[],qy=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Yy}from"react";var br=e=>e===ja||e===":",ja=" ",Ge={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:_t.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Ha=new Set,Fu=()=>{for(let e of Ha)e()},Wa=e=>(Ha.add(e),()=>Ha.delete(e)),$t=e=>{let n=e(Ge),r=Bu(n.value),o=n.cursorPosition===n.value.length;Ge={...n,commandMeta:Du(r,o)},Fu()},lo=({message:e,status:t})=>{let n=structuredClone(Ge);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Ge=n,Fu(),l(e,null)},Ga=e=>{$t(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Va=e=>{$t(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&br(n[o-1]);)o--;for(;o>0&&!br(n[o-1]);)o--}else{for(;o<n.length&&!br(n[o]);)o++;for(;o<n.length&&br(n[o]);)o++}return{...t,cursorPosition:o}})},Ou=()=>{$t(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}})},Uu=()=>{$t(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&br(t[r-1]);)r--;for(;r>0&&!br(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},Ms=e=>{$t(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),i=s+o,c=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:c,commandIsPending:!1}})},_u=()=>{$t(e=>({...e,commandIsPending:!0}))},z=e=>{$t(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},$u=({addToHistory:e=!0})=>{$t(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},ju=()=>{$t(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}})},Hu=()=>{$t(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ne=()=>Ge,Wu=()=>Yy(Wa,ne,ne),Ps=()=>{let[e,...t]=Ge.value.split(ja);return t.join(ja).trim()};var x={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",EditTitle:"editTitle",EditDescription:"editDescription",Yank:"yank",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function Xy(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function Jy(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function Qy(e,t,n){let r=g().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function Gu(e,t){let n=ne();if(e.sequence==="?"&&t!==y.PALETTE)return x.InitCommandPalette;if(e.sequence===":"&&t!==y.COMMAND_LINE)return x.InitCommandLine;if(t===y.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===y.COMMAND_LINE)return kc(e,n.value);if(t===y.PALETTE)return Dc(e,n.value);let r=Xy(e)||Jy(e);if(r)return Zy(r,t);if(e.ctrl&&e.name==="c")return x.Exit;switch(e.name){case"r":return x.EditTitle;case"e":return x.EditDescription;case"n":return x.AddItem;case"m":return x.InitMove;case"d":return x.Delete;case"y":return x.Yank;case"return":return x.Confirm;case"space":return x.Confirm;case"v":return Z().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;default:return null}}function Zy(e,t){let n=t===y.MOVE?{prevItem:x.MovePreviousItem,nextItem:x.MoveNextItem,prevContainer:x.MoveToPreviousContainer,nextContainer:x.MoveToNextContainer}:{prevItem:x.NavPreviousItem,nextItem:x.NavNextItem,prevContainer:x.NavToPreviousContainer,nextContainer:x.NavToNextContainer};return Qy(g().contextNode.childRenderAxis,e,n)}var Ls=e=>{let{context:t}=g().contextNode;if(!t)return O.None;switch(e){case b.EXIT:return O.Exit;case b.EXPORT:return O.Export;case b.COFFEE:return O.Coffee;case b.INIT:return O.Init;case b.OPEN:return O.OpenProject;case b.DELETE:return O.Delete;case b.EDIT:return O.Edit;case b.COMMENT:return O.Comment;case b.HELP:return O.ViewHelp;case b.RE_OPEN_ISSUE:return O.ReopenIssue;case b.CLOSE_ISSUE:return O.CloseIssue;case b.TAG:return O.TagTicket;case b.UNTAG:return O.UntagTicket;case b.ASSIGN:return O.AssignUserToTicket;case b.UNASSIGN:return O.UnassignUserFromTicket;case b.NEW:return O.NewItem;case b.FILTER:return O.Filter;case b.MOVE:return O.Move;case b.PEEK:return O.Peek;case b.REPLAY:return O.Replay;case b.CONFIG:return O.Config;case b.YANK:return O.Yank;case b.SYNC:return O.Sync;default:return O.None}},O={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{ulid as ze}from"ulid";import Am from"node:fs";import Zb from"node:path";import ex from"react";import{Box as Jb}from"ink";import $s from"react";import bb from"chalk";import{Box as qa,Text as xb}from"ink";import jt from"react";import{Text as Vu}from"ink";import Ku,{useEffect as zu,useState as eb}from"react";var qu={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},Ve=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=q(),r=qu[n]??qu.default,[o,s]=eb(0);if(zu(()=>{s(0)},[r]),zu(()=>{if(!e)return;let c=setInterval(()=>{s(u=>(u+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return Ku.createElement(Vu,null,t);let i=r[o]??r[0]??t;return Ku.createElement(Vu,{color:h.accent,dimColor:o===1},i)};import{Box as Ka,Text as tb}from"ink";import ks from"react";var nb=(e,t,n,r)=>{let o=u=>Math.max(1,e[u]??1),s=n,i=n+1,c=o(n);for(;i<t&&c+o(i)<=r;)c+=o(i),i++;for(;s>0&&c+o(s-1)<=r;)s--,c+=o(s);return{start:s,end:i}},gt=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,itemHeights:o,scrollByOne:s=!1})=>{if(e.length===0)return null;let i=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(i/c)),p=Math.max(0,e.length-m),{start:f,end:v}=o?nb(o,e.length,u,i):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,v-f),C=e.slice(f,v),I=e.length>N,S=i,A=I?Math.max(1,Math.floor(N/e.length*S)):S,B=Math.max(0,S-A),M=Math.max(1,e.length-N),L=I?Math.floor(f/M*B):0;return ks.createElement(Ka,{flexDirection:"row",height:i,width:"100%"},ks.createElement(Ka,{flexDirection:"column",flexGrow:1,height:i},C),ks.createElement(Ka,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((k,Ie)=>ks.createElement(tb,{key:Ie,color:I&&Ie>=L&&Ie<L+A?h.accent:h.secondary},I?"\u2502":" "))))};import{Box as Er,Text as Sr}from"ink";import ot from"react";var Yu,za,rb=()=>{let{eventLog:e=[]}=g();if(za&&Yu===e)return za;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return Yu=e,za=t,t},Ds=e=>rb().has(e);import{Text as ob}from"ink";import sb from"react";var ib=e=>e.toLowerCase().trim(),ab=(e,t=gr)=>{let n=ib(e);return t[n]?t[n]:co(n)},En=({id:e,isSelected:t,maxWidth:n})=>{let r=E.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:Yt(o,n);return sb.createElement(ob,{underline:t,color:ab(o)},"@"+s,Ds(e)?"":"\u2197")};import{Text as db}from"ink";import cb from"react";var xr=({id:e,isSelected:t,maxWidth:n})=>{let r=E.getTag(e);if(!r)return;let o=n===void 0?r.name:Yt(r.name,n);return cb.createElement(db,{underline:t,backgroundColor:se(r.name),color:h.secondary}," "+o+" ")};import{useEffect as lb,useState as ub}from"react";var mb=80,Xu=1400,Bs=new Set,uo=null,pb=e=>(Bs.add(e),uo||(uo=setInterval(()=>{for(let t of Bs)t()},mb)),()=>{Bs.delete(e),Bs.size===0&&uo&&(clearInterval(uo),uo=null)}),fb=()=>{let e=Date.now()%Xu/Xu;return e<.5?e*2:(1-e)*2},Ir=e=>{let[,t]=ub(0);return lb(()=>{if(e)return pb(()=>t(n=>n+1))},[e]),Ns(fb())};var gb=(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),Yt(e.slice(o).trim(),n)]},Ju=3,hb=2,vb=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let i=e.length-o-1,c=i>0?String(i).length+1:0;if(r+s.width+c>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},Qu=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=Ir(r),s=e-4,i=s-7-1,[c,u]=gb(Ye(t.title),i,s),m=u?null:Yt(Ye(t.props.description),s)||null,p=xn(t),f=In(t).map(A=>({...A,name:A.name})),v=Math.max(1,s-Ju),N=E.getCommentsByIssue(t.id),C=N.length?String(N.length).length+2+1:0,{shown:I,hidden:S}=vb([...p.map(A=>({id:A.id,isTag:!0,width:Math.min(A.name.length,v)+Ju})),...f.map(A=>({id:A.id,isTag:!1,width:Math.min(A.name.length,v)+hb+(Ds(A.id)?0:1)}))],s-C);return ot.createElement(Er,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?h.accent:h.secondary,justifyContent:"space-between"},ot.createElement(Er,{paddingLeft:1,paddingRight:1,flexDirection:"column"},ot.createElement(Er,{justifyContent:"space-between"},ot.createElement(Sr,{color:h.primary},c),ot.createElement(Sr,{color:h.secondary2,dimColor:!0},V(t.id))),u&&ot.createElement(Sr,{color:h.primary},u),m&&ot.createElement(Sr,{color:h.secondary2,dimColor:!0},m)),ot.createElement(Er,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},ot.createElement(Er,{flexDirection:"row"},I.map(A=>ot.createElement(Er,{paddingRight:1,key:A.id},A.isTag?ot.createElement(xr,{id:A.id,maxWidth:v}):ot.createElement(En,{id:A.id,maxWidth:v}))),S>0&&ot.createElement(Sr,{color:h.secondary2,dimColor:!0},"+",S)),N.length>0&&ot.createElement(Sr,{color:h.accent},"[",N.length,"]")))};import{Box as Xn,Text as mo}from"ink";import at from"react";var yb=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Zu=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:i})=>{let c=Ir(s),u=(r.props.tags??[]).map(k=>E.getTag(k)).filter(k=>!!k),m=(r.props.assignees??[]).map(k=>E.getContributor(k)).map(k=>k&&{...k,name:k.name}).filter(k=>!!k),p=1,f=u.length*(1+p),v=m.length*(2+p),N=u.map(k=>at.createElement(Xn,{key:k.id,paddingRight:p},at.createElement(mo,{color:se(k.name)},"\u25A0"))),C=m.map(k=>at.createElement(Xn,{key:k.id,paddingRight:p},at.createElement(mo,{color:co(k.name)},"@"+k.name.at(0)))),I=s?c:o?h.accent:i===y.MOVE?h.secondary:h.primary,S=E.getCommentsByIssue(r.id),A=S.length?String(S.length).length+2+p:0,B=S.length?at.createElement(Xn,{paddingRight:p},at.createElement(mo,{color:h.accent},"[",S.length,"]")):null,M=f+v+A,L=Math.max(1,n-t-M-(M>0?1:0));return at.createElement(Xn,{justifyContent:"space-between"},at.createElement(Xn,null,at.createElement(Xn,{width:t},o?at.createElement(Ve,{isSelected:!0}):at.createElement(mo,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),at.createElement(mo,{wrap:"truncate",color:I},yb(r.title,L))),at.createElement(Xn,null,N,C,B))};var Ib=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:u,replay:m}=q(),p=u[e.id]??[],f=m?new Set(m.flashNodeIds):null,v=f?.has(e.id)??!1,N=Ir(v),C=`${e.title} ${bb.hex(h.secondary2).dim("("+p.length+")")}`,I=3,S=o?1:5,A=s&&i===-1,B=n-3-(o?1:0)-(A?2:0),M=Math.max(2,String(p.length).length+1),L=r-I-1,k=jt.createElement(qa,{borderStyle:"round",borderColor:h.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},jt.createElement(Ve,{isSelected:t}),jt.createElement(xb,{bold:!0,color:v?N:t?h.accent:h.primary},C," ",e.readonly?"\u{1F512}":"")),Ie=(_e,ct)=>{let Qe=s&&i===ct;if(!P(_e))return null;let Be=f?.has(_e.id)??!1;return o?jt.createElement(Zu,{key:_e.id,index:ct,labelWidth:M,width:B,ticket:_e,isSelected:Qe,isFlashing:Be,mode:c}):jt.createElement(Qu,{key:_e.id,width:B,ticket:_e,isSelected:Qe,isFlashing:Be})};return jt.createElement(qa,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?h.accent:h.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},k,jt.createElement(qa,null,p.length>0&&jt.createElement(gt,{selectedIndex:i,height:L,itemHeight:S},p.map(Ie)),A&&jt.createElement(Ve,{isSelected:!0})))},em=jt.memo(Ib);import{Box as Qn,Text as id}from"ink";import ke,{useMemo as fo}from"react";var tm=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},nm=(e,t,n)=>le.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});import{Box as Nr,Text as rn}from"ink";import Ke,{useEffect as Eb,useMemo as Sb,useRef as Cb}from"react";import{decodeTime as rm}from"ulid";var 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"},Os=e=>String(e).padStart(2,"0"),Us=e=>`${e.getFullYear()}-${Os(e.getMonth()+1)}-${Os(e.getDate())} ${Os(e.getHours())}:${Os(e.getMinutes())}`;var Nb=e=>Me(e,"attachments"),Rb=e=>E.getAttachmentsByIssue(e.id).sort((t,n)=>rm(t.id)-rm(n.id)),om=e=>{for(let t of e)E.deleteNode(t.id)},Ab=(e,t,n)=>le.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),Tb=(e,t)=>{let n=E.getNode(Nb(e.id));if(!n||!st(n))return[];let r=t.map((o,s)=>Ab(o,s,n.id)).map(o=>E.createNode(o)).filter(de).map(({value:o})=>o).filter(st);return t.length>0&&g().selectedIndex<0&&F.navigate({contextNode:n,selectedIndex:0}),r},wb=e=>`${Math.max(1,Math.round(e/1024))} KB`;function sm({ticket:e,width:t,height:n}){let r=Sb(()=>Rb(e),[e]),o=Cb([]);Eb(()=>(om(o.current),o.current=Tb(e,r),()=>{om(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=q(),c=Math.max(1,n-4),u=Math.max(12,t-32);return r.length===0?Ke.createElement(Nr,{flexDirection:"column",width:t,height:n,padding:1},Ke.createElement(rn,{color:h.primary},"No attachments yet."),Ke.createElement(Nr,{paddingTop:1},Ke.createElement(rn,{color:h.primary},"Attach images from the browser GUI"),Ke.createElement(rn,{color:h.accent}," epiq gui "),Ke.createElement(rn,{color:h.primary},"by dropping or pasting them."))):Ke.createElement(Nr,{flexDirection:"column",width:t,height:n},Ke.createElement(Nr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:h.secondary,borderStyle:"single",paddingBottom:1},Ke.createElement(rn,{color:h.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),Ke.createElement(gt,{height:c,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let f=p===s,v=m.name.length>u?m.name.slice(0,u-1)+"\u2026":m.name;return Ke.createElement(Nr,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Ke.createElement(rn,{color:h.accent},f?"\u276F ":" "),Ke.createElement(Nr,{paddingLeft:1},Ke.createElement(rn,{color:h.secondary2},`#${p+1} `),Ke.createElement(rn,{color:f?h.accent:h.primary},v),Ke.createElement(rn,{color:h.secondary2}," "+wb(m.bytes)+" "+Cr(tt(m.id)))))})))}import{Box as Sn,Text as Cn}from"ink";import Ae,{useEffect as Ob,useMemo as ym,useRef as Ub}from"react";import{decodeTime as bm}from"ulid";var am=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,Ya=e=>e.replace(am,"");var im=e=>e==="additions"||e==="deletions",Xa=e=>{let t=am.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"||!im(r.side)||!im(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var dm=/```\n([\s\S]*?)\n?```\s*$/,cm=e=>dm.exec(e)?.[1]??null,Mb=/`[^`\n]+`[^\n]*\n?$/,lm=e=>Ya(e).replace(dm,"").replace(Mb,"").trim(),Pb=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})`},Ja=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${Pb(e)}`;var Lb=(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 i of r){let c=i;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},po=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)},kb=/!\[([^\]]*)\]\([^)]*\)/g,Db=e=>e.replace(kb,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),Bb=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),Fb=4,mm=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(Fb)),Qa=e=>{let t=!1;return e.map(mm).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=Xa(n);if(r)return{kind:"caption",text:Ja(r)};let o=Db(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:po(s[1]??"")}:{kind:"text",spans:po(o)}})},pm=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],um=(e,t)=>{let n=[];for(let r of Qa(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 pm(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of Lb(Bb(r.spans),t))n.push({kind:r.kind,spans:po(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},fm=(e,t)=>{let n=Xa(e),r=n?cm(e):null;if(!n||r===null)return um(Ya(e).split(`
61
+ `),t);let o=lm(e),s=r.split(`
62
+ `).map(mm),i=n.side===n.endSide?n.start:void 0,c=i===void 0?0:String(i+s.length-1).length+3;return[...o?[...um(o.split(`
63
+ `),t),{kind:"blank"}]:[],{kind:"caption",text:Ja(n)},...s.flatMap((u,m)=>pm(u,Math.max(1,t-c)).map((p,f)=>({kind:"code",text:p,number:i===void 0||f>0?void 0:i+m})))]};import{Box as gm,Text as Jn}from"ink";import ht from"react";var hm=({spans:e,bold:t,wrap:n})=>ht.createElement(Jn,{color:h.primary,bold:t,wrap:n},e.map((r,o)=>r.code?ht.createElement(Jn,{key:o,color:h.yellow},r.text):ht.createElement(Jn,{key:o},r.text))),Za=({line:e,width:t,gutter:n=0,wrap:r})=>{switch(e.kind){case"blank":return ht.createElement(Jn,null," ");case"fence":return ht.createElement(Jn,{color:h.secondary2},"```");case"caption":return ht.createElement(Jn,{color:h.accent,wrap:r},e.text);case"heading":return ht.createElement(hm,{spans:e.spans,bold:!0,wrap:r});case"text":return ht.createElement(hm,{spans:e.spans,wrap:r});case"code":{let o=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return ht.createElement(Jn,{backgroundColor:h.secondary,color:h.primary,wrap:r},o,e.text.padEnd(Math.max(0,t-o.length)))}}},vm=({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 ht.createElement(gm,{flexDirection:"column"},e.map((o,s)=>ht.createElement(gm,{key:s},ht.createElement(Za,{line:o,width:t,gutter:r}))))};var _b=4,$b=e=>Me(e,"comments"),jb=e=>E.getCommentsByIssue(e.id).sort((t,n)=>bm(t.id)-bm(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),xm=e=>{for(let t of e)E.deleteNode(t.id)},Hb=(e,t)=>{let n=E.getNode($b(e.id));if(!n||!st(n))return[];let r=t.map((o,s)=>nm(o,s,n.id)).map(E.createNode).filter(de).map(({value:o})=>o).filter(Vr);return t.length>0&&g().selectedIndex<0&&F.navigate({contextNode:n,selectedIndex:0}),r};function Im({ticket:e,width:t,height:n}){let r=ym(()=>jb(e),[e]),o=Ub([]);Ob(()=>(xm(o.current),o.current=Hb(e,r),()=>{xm(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=q(),c=Math.max(1,n-4),u=Math.max(20,t-8),m=ym(()=>r.map(f=>{let v=fm(f.md,u);return v.length>0?v:[{kind:"blank"}]}),[r,u]),p=m.map(f=>f.length+_b);return r.length===0?Ae.createElement(Sn,{flexDirection:"column",width:t,height:n,padding:1},Ae.createElement(Cn,{color:h.primary},"No comments yet."),Ae.createElement(Sn,{paddingTop:1},Ae.createElement(Cn,{color:h.primary},"Use"),Ae.createElement(Cn,{color:h.accent}," :comment "),Ae.createElement(Cn,{color:h.primary},"to add the first one."))):Ae.createElement(Sn,{flexDirection:"column",width:t,height:n},Ae.createElement(Sn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:h.secondary,borderStyle:"single",paddingBottom:1},Ae.createElement(Cn,{color:h.secondary2},"Comments (",r.length,") ")),Ae.createElement(gt,{height:c,itemHeights:p,selectedIndex:s},r.map((f,v)=>{let N=v===s;return Ae.createElement(Sn,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:h.secondary,borderStyle:"single"},Ae.createElement(Sn,{flexDirection:"row",paddingBottom:1},Ae.createElement(Cn,{color:h.accent},N?"\u276F ":" "),Ae.createElement(Sn,{paddingLeft:1},Ae.createElement(Cn,{color:h.secondary2},`#${v+1} `),Ae.createElement(En,{id:f.authorId}),Ae.createElement(Cn,{color:h.secondary2}," "+Cr(tt(f.id))))),Ae.createElement(Sn,{paddingLeft:3,paddingBottom:1},Ae.createElement(vm,{lines:m[v]??[],width:u})))})))}import{Box as _s,Text as Wb}from"ink";import on from"react";var Em=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=q(),{title:o}=t,s=t.parentNodeId?E.getNode(t.parentNodeId):void 0,i=s&&P(s)?o===ce.ASSIGNEES?s.props.assignees??[]:o===ce.TAGS?(s.props.tags??[]).filter(c=>E.getTag(c)):[]:[];return on.createElement(_s,{alignItems:"center",paddingTop:1},on.createElement(_s,{minWidth:12},on.createElement(Ve,{isSelected:n}),on.createElement(Wb,{color:n?h.accent:h.secondary2},o,":")),on.createElement(_s,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,u)=>{let m=r.id===t.id&&u===e;return on.createElement(_s,{key:`${o}-${c}`,paddingRight:2,minHeight:1},on.createElement(Ve,{isSelected:m}),o===ce.ASSIGNEES?on.createElement(En,{isSelected:m,id:c}):o===ce.TAGS?on.createElement(xr,{isSelected:m,id:c}):null)})))};import{Box as Rr,Text as nd}from"ink";import vt,{useEffect as Gb,useMemo as rd}from"react";var ed=e=>Math.max(5,String(Math.max(e,1)).length+3),Sm=(e,t)=>Math.max(0,e-6-ed(t));var td=(e,t=0)=>Math.max(1,e-5-2*t);var Vb="\u2029",Cm=(e,t)=>`${e}::inline-line::${t}`,od=new Map,Nm=e=>{let t=od.get(e)??[];od.delete(e);for(let n of t)E.deleteNode(n)},Kb=(e,t)=>{Nm(e);let n=[];t.forEach((r,o)=>{let s=pt(BigInt(o+1));if(!de(s))return;let i=E.createNode(le.text({id:Cm(e,o),name:`Line ${o+1}`,parentNodeId:e,rank:s.value,props:{value:r},readonly:!0,isVirtual:!0}));de(i)&&n.push(i.value.id)}),od.set(e,n)},sd=({id:e,label:t,text:n,rows:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=q(),u=rd(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=rd(()=>u.join("\0"),[u]);Gb(()=>(Kb(e,u),()=>{Nm(e)}),[e,m]);let p=ed(u.length),f=Sm(s,u.length),N=rd(()=>Qa(u).map(C=>{if(C.kind==="code"||C.kind==="caption")return{...C,text:ca(C.text,f)};if(C.kind==="text"||C.kind==="heading"){let I=C.spans.map(S=>S.code?`\`${S.text}\``:S.text).join("");return{...C,spans:po(ca(I,f))}}return C}),[u,f]).map((C,I)=>{let S=c.id===e&&i===I;return vt.createElement(Rr,{key:Cm(e,I)},vt.createElement(Rr,{flexShrink:0},vt.createElement(nd,{color:S?h.primary:h.secondary2,dimColor:!S},`${I+1} `.padStart(p,"\xA0"))),C.kind==="blank"?vt.createElement(nd,{backgroundColor:S?"gray":void 0},Vb):vt.createElement(Rr,null,vt.createElement(Za,{line:C,width:C.kind==="code"?f:0,wrap:"truncate-end"})))});return vt.createElement(Rr,{flexDirection:"column",paddingTop:1},vt.createElement(Rr,null,vt.createElement(Ve,{isSelected:o}),vt.createElement(nd,{color:o?h.accent:h.secondary2},t)),vt.createElement(Rr,{flexDirection:"row",borderStyle:"round",borderColor:h.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},vt.createElement(gt,{scrollByOne:!0,height:r,selectedIndex:i,itemHeight:1},N)))};var zb=e=>Me(e,"description"),qb=e=>Me(e,"comments"),Yb=e=>Me(e,"history"),Xb=e=>Me(e,"attachments"),Rm=({ticket:e,height:t})=>{let n=fo(()=>tm(e),[e]),{selectedIndex:r,contextNode:o}=q(),s=process.stdout.columns||120,i=fo(()=>zb(e.id),[e.id]),c=fo(()=>qb(e.id),[e.id]),u=fo(()=>Yb(e.id),[e.id]),m=fo(()=>Xb(e.id),[e.id]),p=E.getAttachmentsByIssue(e.id).length,f=o.id===e.id,v=o.id===c||o.parentNodeId===c,N=o.id===u||o.parentNodeId===u,C=o.id===m||o.parentNodeId===m,I=J(e.id);if(v){let L=t-3;return ke.createElement(Qn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},ke.createElement(Im,{ticket:e,width:s,height:L}))}if(C){let L=t-3;return ke.createElement(Qn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},ke.createElement(sm,{ticket:e,width:s,height:L}))}if(N){let M=E.getNode(u),L=M&&st(M)?M.props.value??"":"",k=td(t);return ke.createElement(Qn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},M?ke.createElement(sd,{id:M.id,label:"Event log",text:L,selected:!1,maxWidth:s,rows:k}):null)}let S=I.reduce((M,L)=>Wr(L)||L.id===c||L.id===m||L.id===u?M+1:M,0),A=td(t,S),B=(M,L)=>M.id===i?ke.createElement(sd,{key:M.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:L,maxWidth:s,rows:A}):Wr(M)?ke.createElement(Em,{key:M.id,parent:M,selected:L,selectedIndex:r}):M.id===c?ke.createElement(Qn,{key:M.id,paddingTop:1},ke.createElement(Ve,{isSelected:L}),ke.createElement(id,{backgroundColor:h.secondary,color:L?h.accent:h.primary},` Comments (${n}) \u203A\u203A `)):M.id===m?ke.createElement(Qn,{key:M.id,paddingTop:1},ke.createElement(Ve,{isSelected:L}),ke.createElement(id,{backgroundColor:h.secondary,color:L?h.accent:h.primary},` Attachments (${p}) \u203A\u203A `)):M.id===u?ke.createElement(Qn,{key:M.id,paddingTop:1},ke.createElement(Ve,{isSelected:L}),ke.createElement(id,{backgroundColor:h.secondary,color:L?h.accent:h.primary}," History \u203A\u203A ")):null;return ke.createElement(Qn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},I.map((M,L)=>B(M,f&&r===L)))};var Qb=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:i,width:c})=>{let u=t.context,m=u===U.TICKET||u===U.FIELD_LIST||u===U.FIELD,p=u===U.BOARD||u===U.SWIMLANE,f=u===U.TICKET?t:r.find(S=>S.context===U.TICKET),v=Math.floor(c/3),N=Math.floor(c/Math.max(e.length,1)),C=Math.min(N,v),I=s==="dense";return $s.createElement(Jb,{flexDirection:"row",height:i},p&&e.map((S,A)=>{let B=t.id===S.id,M=B?n:-1,L=t.context===U.BOARD&&n===A;return $s.createElement(em,{key:S.id,height:i,width:C,swimlane:S,isSelected:L,isDense:I,isFocused:B,listSelectedIndex:M,mode:o})}),m&&f&&$s.createElement(Rm,{height:i,ticket:f}))},js=$s.memo(Qb);import{render as tx}from"ink";import{Writable as nx}from"node:stream";var go=e=>String(e).padStart(2,"0"),rx=e=>{let t=e.getUTCFullYear(),n=go(e.getUTCMonth()+1),r=go(e.getUTCDate()),o=go(e.getUTCHours()),s=go(e.getUTCMinutes()),i=go(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},ox=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",sx=async(e,{width:t,height:n})=>{let r="",o=new nx({write(i,c,u){let m=ix(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=tx(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},ix=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Tm=async()=>{let{viewMode:e}=Z(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=g(),i=r.find(A=>A.context==="BOARD");if(!i)return a("No board found to export");let c=120,u=40,m=await sx(ex.createElement(js,{height:u,width:c,swimlanes:(s[i.id]??[]).filter(A=>A!==void 0&&Lt(A)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:u});if(!m)return a("Failed to render board export");let p=$o(process.cwd());if(d(p))return a("Unable to export, epiq root not found");let f=new Date,v=rx(f),N=`board_${ox(i.title)}_${v}.md`,C=bc(p.value);Am.mkdirSync(C,{recursive:!0});let I=Zb.join(C,N),S=`# Board - ${i.title}
60
64
  Date: ${f.toISOString()}
61
65
 
62
66
  \`\`\`text
63
67
  ${m}
64
68
  \`\`\`
65
- `;return Gu.writeFileSync(T,C,"utf8"),l("Exported board layout",T)};var Ts=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 XL}from"react";var ws,rb=new Set,Ku=()=>{for(let e of rb)e()};var gn=()=>{if(!ws)throw new Error("Ui state not initialized. Call initUiState() first.");return ws};var zu=(e={})=>(ws=e,Ku(),l("UX state initialized",null)),ob=e=>{let t=gn();return ws=e(t),Ku(),l("UX state updated",null)},hn=e=>ob(t=>({...t,...e}));import{spawn as sb}from"node:child_process";function no(e){let t=process.platform,o=sb(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return o.unref(),o.on("error",()=>{}),!0}import{ulid as Ha}from"ulid";import{spawn as ib,spawnSync as ab}from"node:child_process";import db from"node:os";import qu from"node:path";import{ulid as cb}from"ulid";function _a(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 lb(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function Ms(){let{preferredEditor:e}=Z(),t=[e?lb(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function $a(e){let[t=""]=_a(e);return/(^|\/)code(-insiders)?$/.test(t)}function Yu(e,t){let[n="",...r]=_a(e);return{command:n,args:[...r,...t]}}function Xu(e,t){return Yu(e,$a(e)?["--wait",t]:[t])}function ub(e,t,n,r="new"){return Yu(e,[r==="new"?"--new-window":"--reuse-window","--diff",t,n])}function Ju(e){let t=qu.join(db.tmpdir(),"epiq");Te.mkDir(t);let n=qu.join(t,cb());Te.writeToFile(n,e??"");let r=Ms();for(let o of r){let{command:s,args:a}=Xu(o,n);if(!s)continue;let c=ab(s,a,{stdio:"inherit"});if(!c.error&&c.status===0){let u=Te.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 mb=new Set(["vim","vi","nvim","nano","pico","ed"]);function pb(e){let[t=""]=_a(e),n=t.split("/").pop()??t;return mb.has(n)}var fb=600;function Qu({command:e,args:t},n){return new Promise(r=>{if(!e){r(i(`"${n}" is not a usable editor command`));return}let o=ib(e,t,{stdio:"ignore",detached:!0}),s=!1,a=u=>{s||(s=!0,clearTimeout(c),r(u))};o.on("error",u=>a(i(u.message))),o.on("exit",u=>{a(u===0?l("Opened editor",!0):i(`"${n}" exited with code ${u}`))});let c=setTimeout(()=>{o.unref(),a(l("Opened editor",!0))},fb)})}function gb(e,t){return pb(e)?Promise.resolve(i(`"${e}" is a terminal editor and can't open from the GUI (no terminal attached). Set preferredEditor to a GUI editor (e.g. "code"), or open the file yourself: ${t}`)):Qu(Xu(e,t),e)}function ja(e,t,n,r="new"){return Qu(ub(e,t,n,r),e)}async function Zu(e){let t=Ms();if(t.length===0)return i("No editor configured (preferredEditor, VISUAL, or EDITOR)");let n=i("Unable to open editor");for(let r of t){let o=await gb(r,e);if(!d(o))return o;n=o,logger.error(`Failed to open editor "${r}" for ${e}: ${o.message}`)}return n}var em=async e=>{let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(e.modifier===it.DESCRIPTION)return vb();if(r&&Dr(r))return hb(e);if(e.modifier===it.TITLE){let o=he();if(d(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 a=e.inputString.trim();if(!a)return i("Provide a title");let c=await Tt();return d(c)?c:O([{id:Ha(),action:"edit.title",payload:{id:s.id,name:a},...o.value}],c.value)}return i("Unknown edit command")},hb=async e=>{let t=he();if(d(t))return i("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=h(),o=J(n.id)[r];if(!o||!Dr(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 a=h().nodes[s];if(!a||!M(a))return i("Unable to resolve comment issue");if(a.readonly)return i("Cannot edit readonly issue");let c=o.id.split(":").at(0)??"",u=E.getComment(c);if(!u||u.deleted)return i("Unable to resolve comment");if(u.issue!==a.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 Tt();if(d(p))return p;let f=p.value;return O([{id:Ha(),action:"edit.issue.comment",payload:{id:u.id,issue:a.id,md:m},...t.value}],f)},vb=async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let t=await Tt();if(d(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=h(),s=ze([...r,o],"TICKET");if(d(s))return i("Edit target must be an issue");let a=s.value;if(!M(a))return i("Edit target must be an issue");if(a.readonly)return i("Cannot edit readonly issue");let c=J(a.id).find(f=>f.title===ce.DESCRIPTION);if(!c)return i("No target found");if(c.readonly)return i("Cannot edit readonly field");let u=a.props.description??"";if(typeof u!="string")return i("Selected field is not editable text");let m=Ju(u);if(d(m))return i("Failed to edit field");let p=m.value;return p===u?l("No changes made",null):O([{id:Ha(),action:"edit.description",payload:{id:a.id,md:p},...e.value}],n)};import bb from"node:fs";import nm from"node:path";import Wa from"node:fs";import yb from"node:path";var tm=async e=>{let t=yb.join(e,".gitignore"),n=Wa.existsSync(t)?Wa.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
69
+ `;return Am.writeFileSync(I,S,"utf8"),l("Exported board layout",I)};var Hs=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 M0}from"react";var Ws,ax=new Set,wm=()=>{for(let e of ax)e()};var Nn=()=>{if(!Ws)throw new Error("Ui state not initialized. Call initUiState() first.");return Ws};var Mm=(e={})=>(Ws=e,wm(),l("UX state initialized",null)),dx=e=>{let t=Nn();return Ws=e(t),wm(),l("UX state updated",null)},Rn=e=>dx(t=>({...t,...e}));import{spawn as cx}from"node:child_process";function ho(e){let t=process.platform,o=cx(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return o.unref(),o.on("error",()=>{}),!0}import{ulid as ld}from"ulid";import{spawn as lx,spawnSync as ux}from"node:child_process";import mx from"node:os";import Pm from"node:path";import{ulid as px}from"ulid";function ad(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 fx(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function Gs(){let{preferredEditor:e}=Z(),t=[e?fx(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function dd(e){let[t=""]=ad(e);return/(^|\/)code(-insiders)?$/.test(t)}function Lm(e,t){let[n="",...r]=ad(e);return{command:n,args:[...r,...t]}}function km(e,t){return Lm(e,dd(e)?["--wait",t]:[t])}function gx(e,t,n,r="new"){return Lm(e,[r==="new"?"--new-window":"--reuse-window","--diff",t,n])}function Dm(e){let t=Pm.join(mx.tmpdir(),"epiq");we.mkDir(t);let n=Pm.join(t,px());we.writeToFile(n,e??"");let r=Gs();for(let o of r){let{command:s,args:i}=km(o,n);if(!s)continue;let c=ux(s,i,{stdio:"inherit"});if(!c.error&&c.status===0){let u=we.readFile(n);if(u==null)return a("Unable to read edited file");let m=u.replace(/\r?\n$/,"");return l("Successfully edited",m)}}return a("Unable to open editor")}var hx=new Set(["vim","vi","nvim","nano","pico","ed"]);function vx(e){let[t=""]=ad(e),n=t.split("/").pop()??t;return hx.has(n)}var yx=600;function Bm({command:e,args:t},n){return new Promise(r=>{if(!e){r(a(`"${n}" is not a usable editor command`));return}let o=lx(e,t,{stdio:"ignore",detached:!0}),s=!1,i=u=>{s||(s=!0,clearTimeout(c),r(u))};o.on("error",u=>i(a(u.message))),o.on("exit",u=>{i(u===0?l("Opened editor",!0):a(`"${n}" exited with code ${u}`))});let c=setTimeout(()=>{o.unref(),i(l("Opened editor",!0))},yx)})}function bx(e,t){return vx(e)?Promise.resolve(a(`"${e}" is a terminal editor and can't open from the GUI (no terminal attached). Set preferredEditor to a GUI editor (e.g. "code"), or open the file yourself: ${t}`)):Bm(km(e,t),e)}function cd(e,t,n,r="new"){return Bm(gx(e,t,n,r),e)}async function Fm(e){let t=Gs();if(t.length===0)return a("No editor configured (preferredEditor, VISUAL, or EDITOR)");let n=a("Unable to open editor");for(let r of t){let o=await bx(r,e);if(!d(o))return o;n=o,logger.error(`Failed to open editor "${r}" for ${e}: ${o.message}`)}return n}var Om=async e=>{let{contextNode:t,selectedIndex:n}=g(),r=J(t.id)[n];if(e.modifier===it.DESCRIPTION)return Ix();if(r&&Vr(r))return xx(e);if(e.modifier===it.TITLE){let o=ge();if(d(o))return a("Unable to resolve user ID");let s=r;if(!s)return a("Missing node");if(s.readonly)return a("Cannot rename readonly node");let i=e.inputString.trim();if(!i)return a("Provide a title");let c=await Mt();return d(c)?c:_([{id:ld(),action:"edit.title",payload:{id:s.id,name:i},...o.value}],c.value)}return a("Unknown edit command")},xx=async e=>{let t=ge();if(d(t))return a("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=g(),o=J(n.id)[r];if(!o||!Vr(o))return a("Select a comment first");if(o.readonly)return a("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return a("Unable to resolve comment issue");let i=g().nodes[s];if(!i||!P(i))return a("Unable to resolve comment issue");if(i.readonly)return a("Cannot edit readonly issue");let c=o.id.split(":").at(0)??"",u=E.getComment(c);if(!u||u.deleted)return a("Unable to resolve comment");if(u.issue!==i.id)return a("Comment does not belong to selected issue");if(u.authorId!==t.value.userId)return a("You can only edit your own comments"+u.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return a("Provide a comment");let p=await Mt();if(d(p))return p;let f=p.value;return _([{id:ld(),action:"edit.issue.comment",payload:{id:u.id,issue:i.id,md:m},...t.value}],f)},Ix=async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let t=await Mt();if(d(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=g(),s=qe([...r,o],"TICKET");if(d(s))return a("Edit target must be an issue");let i=s.value;if(!P(i))return a("Edit target must be an issue");if(i.readonly)return a("Cannot edit readonly issue");let c=J(i.id).find(f=>f.title===ce.DESCRIPTION);if(!c)return a("No target found");if(c.readonly)return a("Cannot edit readonly field");let u=i.props.description??"";if(typeof u!="string")return a("Selected field is not editable text");let m=Dm(u);if(d(m))return a("Failed to edit field");let p=m.value;return p===u?l("No changes made",null):_([{id:ld(),action:"edit.description",payload:{id:i.id,md:p},...e.value}],n)};import Sx from"node:fs";import _m from"node:path";import ud from"node:fs";import Ex from"node:path";var Um=async e=>{let t=Ex.join(e,".gitignore"),n=ud.existsSync(t)?ud.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
66
70
  `).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(`
67
71
  `);return n=n.trimEnd()+`
68
72
 
69
73
  ${c}
70
- `,Wa.writeFileSync(t,n,"utf8"),K.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var xb=async e=>{let t=await _({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},ie=(e,t)=>i(`[${e}] ${t}`),rm=async()=>{z("");let e=Co(),t=await ht(process.cwd());if(d(t))return ie(1,t.message);let n=t.value,r=await To(n);if(d(r))return ie(2,r.message);if(r.value)return ie(2,`Cannot initialize Epiq while a git operation is in progress: ${r.value}`);let o=await xb(n);if(d(o))return ie(2.5,o.message);if(o.value)return ie(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Mr(n))return ie(4,"Epiq project already initialized");let s=cn();if(!s.isSetupDone||!s.userName)return ie(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let a=Z(),c=a.userName,u=a.userId;if(!u||!c)return ie(5,"Missing Epiq user id");let m=await tl(n);if(d(m))return ie(6,m.message);let p=e.stateBranch,f=await wo({repoRoot:n,branch:p});if(d(f))return ie(6,f.message);if(f.value)return ie(6,`State branch already exists: ${p}`);let g=await oa({repoRoot:n,stateBranchName:p});if(d(g))return ie(6,g.message);let x=Lo();if(d(x))return ie(7,x.message);let S=nm.join(Po(),e.projectId),T=await Bn({repoRoot:n,stateBranchRoot:S,stateBranchName:p});if(d(T))return ie(8,T.message);let C=nm.join(S,".epiq");bb.mkdirSync(C,{recursive:!0});let R=qc({userId:u,userName:c});if(d(R))return ie(9,R.message);for(let xi of R.value){let Rd=Go({event:xi,rootDir:S});if(d(Rd))return ie(9,Rd.message)}let L=await Zo({stateBranchRoot:S,eventFileName:Ln({userId:u,userName:c})});if(d(L))return ie(10,L.message);let $=await zn({cwd:S,message:"[epiq:init]"});if(d($))return ie(10,$.message);let G=await tm(n);if(d(G))return ie(11,G.message);let P=wd({repoRoot:n,fileContents:e});if(d(P))return ie(12,P.message);let U=await Ie.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(U))return ie(13,U.message);let H=await Ie.commit({cwd:n,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(d(H))return ie(13,H.message);let tt="Project initialized!",Ue=await _({cwd:n,args:["push","-u","origin","HEAD"]});d(Ue)&&(tt+=` Warn: [init:14] ${Ue.message}`);let De=await $r({repoRoot:n,stateBranchRoot:S});d(De)&&(tt+=` Warn: [init:15] ${De.message}`);let Ee=yt(R.value).filter(d);if(Ee.length>0)return ie(16,Ee.map(xi=>xi.message).join(`
71
- `));let Nn=Ze();if(d(Nn))return ie(16,Nn.message);let{rootNodeId:xr,nodes:Zf}=Nn.value,Nd=Zf[xr];return Nd?(D.navigate({contextNode:Nd,selectedIndex:0}),N({hasProjectDefinition:!0,mode:y.DEFAULT}),l(tt,null)):ie(16,"Unable to resolve initialized root node")};import{ulid as Eb}from"ulid";import{ulid as Ib}from"ulid";var om=null,vn=()=>structuredClone(om),ro=e=>{om=e},sm=()=>{let{contextNode:e,selectedIndex:t}=h(),r=ee(e.id)[t];return r?l("Resolved selected child",r):i("Target node not found")},Ga=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ee(t).filter(o=>o.id!==e);return Vo(r,n)},im=({id:e,parentId:t,position:n={at:"end"}})=>{let r=he();if(d(r))return i("Unable to resolve user ID");let o=Ga({parentId:t,id:e,position:n});return d(o)?o:l("Created pending move state",{id:Ib(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},am=e=>{ro(e);let t=an(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function Va(e){let t=sm();if(d(t))return t;let{contextNode:n,nodes:r}=h();if(!n.parentNodeId)return i("Missing parent node id");let o=r[n.parentNodeId];if(!o)return i("Missing parent node");let s=ee(o.id),a=s.findIndex(({id:m})=>m===n.id);if(a<0)return i("Current node not found among siblings");let c=s[a+e];if(!c)return i("Missing sibling node");let u=im({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:am(u.value)}function Ka(e){let t=sm();if(d(t))return t;let{contextNode:n,selectedIndex:r}=h(),s=ee(n.id)[r+e];if(!s)return i("Missing sibling node");let a=im({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(a)?a:am(a.value)}var dm=()=>{let e=vn();if(!e)return i("No pending move state");let t=e.payload.id,n=e.payload.parent,r=h().nodes[n];if(!r)return i("Move parent not found");let o=ee(n).findIndex(s=>s.id===t);return o===-1?i("Moved node not found among rendered children"):(D.navigate({contextNode:r,selectedIndex:o}),l("Synchronized navigation to moved node",null))},Ps=(e,t="Moved preview")=>{if(d(e))return e;let n=dm();return d(n)?n:(N({mode:y.MOVE}),l(t,null))},cm=async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t}=ne().commandMeta,{contextNode:n,selectedIndex:r}=h(),o=ee(n.id)[r];if(!o)return N({mode:y.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=ee(o.parentNodeId),a=s.findIndex(({id:f})=>f===o.id);if(a===-1)return i("Target not found among siblings");let c=s[a-1],u=s[a+1],m=u!=null?{at:"before",sibling:u.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=Ga({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(ro({id:Eb(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),N({mode:y.MOVE}),l("Move initialized",null))}if(t==="next")return Ps(Ka(1));if(t==="previous")return Ps(Ka(-1));if(t==="to-next")return Ps(Va(1));if(t==="to-previous")return Ps(Va(-1));if(t==="confirm"){let s=vn();if(!s)return i("No pending move to confirm");let a=await Tt();if(d(a))return a;let c=O([s],a.value);if(d(c))return c;let u=dm();return d(u)?u:(ro(null),N({mode:y.DEFAULT}),l("Moved item",null))}return t==="cancel"?(ro(null),N({mode:y.DEFAULT}),l("Cancelling move",null)):i("Invalid move modifier")};import{ulid as ks}from"ulid";import{monotonicFactory as Sb,ulid as Cb}from"ulid";var Nb=Sb(),Ls=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=Nb();return l("Created issue events",[{id:Cb(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var lm=async(e,t)=>{let n=he();if(d(n))return i("Unable to resolve user ID");let r=await Tt();if(d(r))return r;let o=r.value;if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:a,selectedIndex:c}=h(),u=m=>{let p=O([m],o);if(d(p))return p;let f=E.getNode(p.value[0].result.id);if(!f)return i("Created node not found");if(!f.parentNodeId)return p;let g=E.getNode(f.parentNodeId);return g?(D.navigate({contextNode:g,selectedIndex:E.getSiblings(f.parentNodeId).findIndex(({id:x})=>x===f.id)}),p):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=h(),p=E.getNode(m);if(!p)return i("Workspace not found");let f=kn(p.id,n.value,o);return d(f)?f:u({id:ks(),action:"add.board",payload:{id:ks(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=ze(s,"BOARD");if(d(m))return i("Unable to add swimlane in this context");let p=kn(m.value.id,n.value,o);return d(p)?p:u({id:ks(),action:"add.swimlane",payload:{id:ks(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=J(a.id)[c],p=a.context==="SWIMLANE"?a:a.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let L=ze(s,"SWIMLANE");return d(L)?null:L.value})();if(!p)return i("Unable to add issue in this context");let f=kn(p.id,n.value,o);if(d(f))return f;let g=Ls({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(d(g))return g;let x=g.value,S=O([...x],o);if(d(S))return S;if(!S.value[0])return i("Issue creation failed");let R=x.find(L=>L.action==="add.issue")?.payload.id;return R?(D.navigate({contextNode:p,selectedIndex:E.getSiblings(p.id).findIndex(({id:L})=>L===R)}),l("Issue created",null)):i("Unable to determine ticket id")}return l("Success",null)};import Rb from"node:os";import mm from"node:path";var Ds=async e=>{let t=Se({repoRoot:e});if(d(t))return kt(3,t.message);let n=await Bn({repoRoot:e,stateBranchRoot:t.value,stateBranchName:Co().stateBranch});if(d(n))return kt(3,n.message);let r=await _({cwd:t.value,args:["pull","--ff-only"]});d(r)&&logger.info(3,r.message);let o=zt(t.value);if(d(o))return kt(3,o.message);let{events:s,unreadable:a}=o.value,c=qt(s,a);if(d(c))return kt(4,c.message);N({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let u=ss({root:e});return d(u)&&logger.info(u.message),l("Loaded project",void 0)},um=()=>{let e=qt([]);return d(e)?kt(4,e.message):(N({hasProjectDefinition:!1,hasInitializingEvents:!1}),l("Booted without a project",void 0))};var Ab=e=>e==="~"||e.startsWith("~/")?mm.join(Rb.homedir(),e.slice(1)):e,Tb=(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=_e(mm.resolve(Ab(n)));return d(r)?i(`No epiq project at ${n}`):l("Resolved project path",r.value)},pm=async()=>{let e=vs();if(z(""),h().hasProjectDefinition)return i("Already in a project; run epiq from another directory");let t=Xt({exclude:process.cwd()}),n=d(t)?[]:t.value,r=Tb(e,n);if(d(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 a=await Ds(o);return d(a)?(process.chdir(s),i(a.message)):l(`Opened ${tr(o)}`,null)};var Bs=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=h(),s=Ho(n,t);if(d(s))return i(s.message);let{appliedEvents:a,unappliedEvents:c}=s.value,u=Et();if(d(u))return u;let m=yt(a),{fatal:p,skipped:f}=Vt(m);if(p.length>0)return Et(),N(o),i(p.map(x=>x.message).join(", "));Kt(f);let g=h().nodes[e];return g?(D.navigate({contextNode:g,selectedIndex:r}),l("",{unappliedEvents:c})):(Et(),N(o),i("Board did not exist at that date"))};var wb=20,Mb=16,Pb=150,Fs=null,Os=null;var Hn=()=>{Fs!==null&&(clearInterval(Fs),Fs=null),Os!==null&&(clearTimeout(Os),Os=null)},fm=()=>{Hn(),N({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Lb=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)},gm=({events:e,startTime:t,durationMs:n})=>{Hn();let r=e.length,o=Xn(e.map(f=>Jn(f))).map(f=>f??t),s=o[r-1]??Date.now(),a=Lb(o),c=Math.max(1,Math.round(n*wb/1e3)),u=Math.max(Math.round(n/c),Mb),m=0,p=0;N({mode:y.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Fs=setInterval(()=>{m++;let f=m/c,g=[],x,S;for(;p<r&&a[p]<=f;){let C=e[p],R=an(C);if(d(R)){if(Br(R)){p++;continue}fm();return}g.push(...qi(C)),x=C,S=o[p],p++}if(p>=r||m>=c){for(;p<r;p++){let R=an(e[p]);if(d(R)&&!Br(R))break}let C=h().replay;N({unappliedEvents:[],replay:C&&{...C,progress:1,appliedCount:r}}),Hn(),Os=setTimeout(fm,Pb);return}let T=h().replay;N({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:x?S??T?.currentTime??t:T?.currentTime??t,currentLabel:x?Us(x):T?.currentLabel??"",flashNodeIds:x?[...new Set(g)]:T?.flashNodeIds??[]}})},u)};var hm=async()=>{let e=ze(h().breadCrumb,"BOARD");if(d(e))return e;let t=await ht(process.cwd());if(d(t))return i("Unable to locate repo root");let n=Se({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=ne().commandMeta;if(Hn(),r==="now"){let c=Mn(n.value);if(d(c))return i(c.message);let u=Et();if(d(u))return u;let m=yt(c.value),{fatal:p,skipped:f}=Vt(m);return p.length>0?i(p.map(g=>g.message).join(", ")):(Kt(f),N({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),l("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let c=Wo(n.value);if(d(c))return c;let u=r==="prev"?h().eventLog.at(-1):h().unappliedEvents.at(0),m=u===void 0?null:Jn(u),p=(u===void 0?null:c.value.get(u.id)??null)??(m===null?null:Gi(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=Fn(r||o.trim());if(!c)return i("Invalid peek date");s=c.getTime()}let a=Bs({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return d(a)?a:(N({mode:y.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:a.value.unappliedEvents,replay:null}),l("Peeking",!0))};var vm=async()=>{let e=ze(h().breadCrumb,"BOARD");if(d(e))return e;let t=await ht(process.cwd());if(d(t))return i("Unable to locate repo root");let n=Se({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=ne().commandMeta,{dateInput:s,durationInput:a}=cs(r,o);if(Hn(),h().syncStatus.status==="syncing")return i("Cannot replay while syncing, try again in a moment");let c=Fn(s);if(!c)return i("Invalid replay date");let u=a?ds(a):15e3;if(u===null)return i("Invalid replay duration (try e.g. 30s or 2m)");let m=c.getTime(),p=h(),f=Bs({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(d(f))return f;let{unappliedEvents:g}=f.value;return g.length===0?(Et(),N(p),l("Nothing to replay from that point",!0)):(gm({events:g,startTime:m,durationMs:u}),l("Replaying board history",!0))};import Db from"zod";var ym=()=>{let e=ne().commandMeta.inputString,t=Db.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=lt({autoSyncDebounceMs:t.data});return d(n)?n:($e({autoSyncIntervalMs:t.data}),N({mode:y.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var bm=()=>{let e=ne().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return i("Invalid response");let t=Sl(e),n=lt({autoSync:t});return d(n)?n:($e({autoSync:t}),N({mode:y.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var xm=()=>{let e=ne().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return i("Invalid response");let n=lt({logLevel:e});return d(n)?n:($e({logLevel:e}),N({mode:y.DEFAULT}),l(`Auto sync set to "${e}"`,null))};import{spawn as Bb}from"node:child_process";var Fb=()=>{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"]}}},Im=async e=>new Promise(t=>{let{command:n,args:r}=Fb();try{let o=Bb(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 oo=async(e,t)=>{if(!e.trim())return i(`Nothing to copy: ${t} is empty`);let n=await Im(e);return d(n)?n:l(`Copied ${t} to clipboard`,null)},Em=async e=>{let{breadCrumb:t,selectedNode:n}=h(),r=Gr({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return i("Nothing selected to copy from");switch(e.modifier){case Ne.REF:return oo(V(o.id),"ref");case Ne.TITLE:return oo(o.title,"title");case Ne.DESCRIPTION:return r?oo(r.props?.description??"","description"):i("No issue in scope");case Ne.TAGS:{if(!r)return i("No issue in scope");let s=ln(r).map(({name:a})=>a);return oo(s.join(", "),"tags")}case Ne.ASSIGNEES:{if(!r)return i("No issue in scope");let s=un(r).map(({name:a})=>a);return oo(s.join(", "),"assignees")}default:return i("Yank one of: ref, title, description, tags, assignees")}};var Sm=async()=>{z(""),N({mode:y.DEFAULT});let e=Ze();if(d(e))return i(e.message);if(e.value.syncStatus.status==="syncing")return i("Sync already in progress");N({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await ns();return d(t)?(N({syncStatus:{msg:t.message,status:"failed"}}),t):(N({mode:y.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var Ob=e=>e.action==="add.issue.comment",Cm=()=>{let{eventLog:e=[],contributors:t}=h(),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 Tt();return d(e)?e:l("Resolved persist root",e.value)},_s=[{systemOnly:!0,intent:B.Move,description:"Internal move-state command",mode:y.COMMAND_LINE,action:cm},{intent:B.Delete,description:"Delete the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to resolve child to delete");let o=await Zt();if(d(o))return o;if(r.context==="COMMENT"){let s=r.id,a=M(t)?t.id:t.parentNodeId;if(!a)return i("Unable to resolve comment issue");let c=h().nodes[a];if(!c||!M(c))return i("Unable to resolve comment issue");let u=c.log?.filter(Ob).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?i("You can only delete your own comments"):O([{id:Ke(),action:"delete.issue.comment",payload:{id:s,issue:a},...e.value}],o.value):i("Unable to resolve comment")}return O([{id:Ke(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:y.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ne().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(a=>ve(b.FILTER).map(c=>c.split(n)[0]).includes(a))(r))return i("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return ue(a=>({...a,filters:e==="clear"?[]:[...a.filters,s],mode:y.DEFAULT})),l("Filter updated",null)}},{intent:B.ViewHelp,description:"Open the help screen",mode:y.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return hn({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),N({mode:y.HELP}),l("Viewing help",null)}},{intent:B.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to close issue, no target found");if(!M(r))return i("Cannot close in this context");let o=h().nodes[Ce];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(d(s))return s;let a=s.value,c=dn(o.id,r.id,{at:"end"},e.value,a);if(d(c))return c;let u=O([{id:Ke(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value}],a);return d(u)?u:l("Issue closed",null)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Unable to reopen issue, no target found");let o=r.context==="TICKET"?l("Resolved ticket",r):en(r.id,"TICKET");if(d(o))return i("Cannot reopen in this context");let s=o.value,a=h().nodes[Ce];if(!a)return i("Unable to locate closed swimlane");if(s.parentNodeId!==a.id)return i("Issue is not closed");if(!M(s))return i("Target node is not issue");let c=Ts(s);if(!c)return i("Unable to resolve previous parent from issue history");if(c===a.id)return i("Previous parent resolves to closed swimlane");let u=h().nodes[c];if(!u)return i("Previous parent no longer exists");let m=await Zt();if(d(m))return m;let p=m.value,f=dn(u.id,s.id,{at:"end"},e.value,p);if(d(f))return f;let g=O([{id:Ke(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:f.value},...e.value}],p);return d(g)?g:l("Issue reopened",null)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Init,description:"Initialize Epiq in the current git repository",mode:y.COMMAND_LINE,action:rm},{intent:B.OpenProject,description:"Open a recently used epiq project, by number or path",mode:y.COMMAND_LINE,action:pm,onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.NewItem,description:"Create a new board, swimlane, or issue",mode:y.COMMAND_LINE,action:lm,onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Rename,description:"Rename the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=J(t.id)[n];if(!r)return i("Missing node");if(r.readonly)return i("Cannot rename readonly node");let o=vs();if(!o)return i("Provide a title");let s=await Zt();return d(s)?s:O([{id:Ke(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.UntagTicket,description:"Remove a tag from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let o=E.findTagByName(r);if(!o)return i(`Tag "${r}" does not exist`);let{selectedNode:s}=h();if(!s)return i("Invalid untag target");let a=en(s.id,"TICKET");if(d(a))return i("Unable to untag issue in this context");let c=a.value;if(!M(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 Zt();return d(m)?m:O([{id:Ke(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}],m.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.TagTicket,description:"Add or create a tag on the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let{selectedNode:o}=h();if(!o)return i("Invalid tag target");let s=en(o.id,"TICKET");if(d(s))return i("Unable to tag issue in this context");let a=s.value;if(!M(a))return i("Target node is not issue");let c=await Zt();if(d(c))return c;let u=E.findTagByName(r),m=u?.id??Ke();return(a.props.tags??[]).includes(m)?i("Already tagged with that tag"):O([...u?[]:[{id:Ke(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:Ke(),action:"add.issue.tag",payload:{id:a.id,tag:m},...e.value}],c.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.AssignUserToTicket,description:"Assign a user to the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().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:a,contextNode:c}=h(),u=J(c.id)[a];if(!u)return i("Invalid assign target");let m=en(u.id,"TICKET");if(d(m))return i("Unable to assign issue in this context");let p=m.value;if(!M(p))return i("Target node is not issue");let f=await Zt();if(d(f))return f;let g=Cm(),x=!o&&s.toLowerCase()==="me",S,T;if(x)S=e.value.userId,T=g.find(L=>L.id===S)?.name??e.value.userName;else{let L=g.filter(G=>G.name===s);if(L.length>1)return i(`"${s}" matches ${L.length} contributors (${L.map(G=>G.id).join(", ")}). Assign from the GUI to choose by id.`);let $=L[0];if(!$&&!o)return i(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);S=$?.id??Ke(),T=$?.name??s}if((p.props.assignees??[]).includes(S))return i("Assignee already assigned");let R=!!h().contributors[S];return O([...R?[]:[{id:Ke(),action:"create.contributor",payload:{id:S,name:T},...e.value}],{id:Ke(),action:"add.issue.assignee",payload:{id:p.id,assignee:S},...e.value}],f.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=he();if(d(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee to remove");let{selectedNode:o}=h();if(!o)return i("Invalid unassign target");let s=en(o.id,"TICKET");if(d(s))return i("Unable to unassign in this context");let a=s.value;if(!M(a))return i("Target node is not issue");let c=a.props.assignees??[],u=r.toLowerCase()==="me",m=u?c.filter(g=>g===e.value.userId):Cm().filter(g=>g.name===r&&c.includes(g.id)).map(g=>g.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 d(f)?f:O([{id:Ke(),action:"remove.issue.assignee",payload:{id:a.id,assignee:p},...e.value}],f.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Comment,description:"Add a comment to the selected issue",mode:y.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=he();if(d(r))return i("Unable to resolve user ID");let{breadCrumb:o,selectedNode:s}=h(),a=ze([...o,s],"TICKET");if(d(a))return i("Edit target must be an issue");let c=a.value;if(!c)return i("Invalid comment target");let u=c.context==="TICKET"?l("Resolved ticket",c):en(c.id,"TICKET");if(d(u))return i("Unable to comment on issue in this context");let m=u.value;if(!M(m))return i("Target node is not issue");let p=await Zt();return d(p)?p:O([{id:Ke(),action:"add.issue.comment",payload:{id:Ke(),issue:m.id,author:r.value.userId,md:n},...r.value}],p.value)},onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Sync,description:"Pull, commit, and push Epiq state",mode:y.COMMAND_LINE,action:Sm},{intent:B.Peek,description:"View board state at another point in time",mode:y.COMMAND_LINE,action:hm},{intent:B.Replay,description:"Replay board history forward from a point in time",mode:y.COMMAND_LINE,action:vm},{intent:B.Export,description:"Export the current board layout to markdown",mode:y.COMMAND_LINE,action:async()=>{let e=await Vu();return d(e)?e:(N({mode:y.DEFAULT}),l("Export successful",!0))}},{intent:B.Exit,description:"Exit the application",mode:y.COMMAND_LINE,action:async()=>(D.exit(),l("Exit successful",!0))},{intent:B.Edit,description:"Edit title or description",mode:y.COMMAND_LINE,action:async(e,t)=>em(t),onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:y.COMMAND_LINE,action:async(e,t)=>Em(t),onSuccess:()=>N({mode:y.DEFAULT})},{intent:B.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:y.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case pe.USERNAME:{if(process.env[Wt])return i(`Cannot change the configured user while ${Wt} names this process`);let r=Yn();if(d(r))return r;let{userId:o,preferredEditor:s,userName:a}=r.value,c=n||a,u=o||Ke();if(!c||!u)return i("Unable to resolve user name or id");let m=lt({userName:c,userId:u,preferredEditor:s??""});return d(m)?m:($e({userName:c,userId:u}),N({mode:y.DEFAULT}),l(`Username set to "${c}"`,null))}case pe.EDITOR:{if(!n)return i("No editor provided");let r=lt({preferredEditor:n});return d(r)?r:($e({preferredEditor:n}),N({mode:y.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case pe.VIEW:{if(n!=="wide"&&n!=="dense")return i("Invalid view mode");let r=lt({viewMode:n});return d(r)?r:($e({viewMode:n}),N({mode:y.DEFAULT}),l(`View set to "${n}"`,null))}case pe.AUTOSYNC:return bm();case pe.LOG_LEVEL:return xm();case pe.SYNC_DEBOUNCE_MS:return ym();case pe.ATTACHMENT_MAX_KB:return Ol();default:return i("Unknown config command")}}},{intent:B.Coffee,description:"Sponsor the development of Epiq!",mode:y.COMMAND_LINE,action:()=>{let e=ne().commandMeta.modifier;return e==="custom"?no("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):no(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),z(""),l("Thanks you!",null)}}];var Ub=new Set(["peek","replay","filter","view-help","yank"]),_t=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ne();if(!t)return i("No command to confirm");if(!e&&n===Ft.Invalid)return i("Invalid command");let s=ys(t);ru();let{readOnly:a}=h();if(a&&!Ub.has(s))return Yr({status:nn.Fail,message:"Command not available in readonly state",value:null});let c=_s.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return Yr({status:nn.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return Yr({status:nn.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?Yr(u):(ou({addToHistory:!e}),c.onSuccess?.(),Z().autoSync&&rs(),u)};var $s=[{intent:I.Exit,mode:y.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(N({mode:y.COMMAND_LINE}),z("move cancel"),_t({isForceExecutedBySystem:!0}))},{intent:I.InitMove,mode:y.DEFAULT,description:"[m] move (init/confirm)",action:()=>(N({mode:y.COMMAND_LINE}),z("move start"),_t({isForceExecutedBySystem:!0}))},{intent:I.ConfirmMove,mode:y.MOVE,action:()=>(N({mode:y.COMMAND_LINE}),z("move confirm"),_t({isForceExecutedBySystem:!0}))}],js=[{intent:I.MovePreviousItem,mode:y.MOVE,action:()=>vn()?(N({mode:y.COMMAND_LINE}),z("move previous"),_t({isForceExecutedBySystem:!0})):i("No pending move")},{intent:I.MoveNextItem,mode:y.MOVE,action:()=>vn()?(N({mode:y.COMMAND_LINE}),z("move next"),_t({isForceExecutedBySystem:!0})):i("No pending move")}],Nm=[{intent:I.MoveToNextContainer,mode:y.MOVE,action:()=>vn()?(N({mode:y.COMMAND_LINE}),z("move to-next"),_t({isForceExecutedBySystem:!0})):i("No pending move")},{intent:I.MoveToPreviousContainer,mode:y.MOVE,action:()=>vn()?(N({mode:y.COMMAND_LINE}),z("move to-previous"),_t({isForceExecutedBySystem:!0})):i("No pending move")}];var Rm={[F.WORKSPACE]:[...$s,...js],[F.BOARD]:[...$s,...js],[F.SWIMLANE]:[...$s,...js,...Nm],[F.TICKET]:[],[F.FIELD]:[],[F.FIELD_LIST]:[],[F.TEXT]:[],[F.COMMENT]:[]};import _b from"node:fs";import $b from"node:path";var Am=e=>{let t=_e(process.cwd());if(d(t))return i("Unable to resolve project root");let n=Se({repoRoot:t.value});if(d(n))return i(n.message);let r=rr(e.hash,e.ext),o=$b.join(wr(n.value),r);return _b.existsSync(o)?(no(o),l(`Opened ${e.name}`,null)):i("Attachment file not found \u2014 run :sync to fetch it")};var Tm=()=>{z("");let{pendingNavTarget:e}=gn();N({mode:y.DEFAULT}),e&&D.navigate(e),hn({pendingNavTarget:void 0})},wm=[{intent:I.ExitCommandLine,mode:y.HELP,action:()=>(Tm(),l("Exiting help",null))},{intent:I.Exit,mode:y.HELP,action:()=>(Tm(),l("Closed help",null))},{intent:I.NavPreviousItem,mode:y.HELP,description:"[arrows/hjkl] navigate",action:()=>(D.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:I.NavNextItem,mode:y.HELP,action:()=>(D.navigateToNextItem(),l("Navigating to next help item",null))},{intent:I.NavToPreviousContainer,mode:y.HELP,action:()=>(D.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:I.NavToNextContainer,mode:y.HELP,action:()=>(D.navigateToNextContainer(),l("Navigating to next help container",null))}];var jb=e=>{N({mode:y.COMMAND_LINE});let{pendingNavTarget:t}=gn();t&&D.navigate(t),hn({pendingNavTarget:void 0}),z(`${e} `)},Mm=()=>{z("");let{pendingNavTarget:e}=gn();e&&D.navigate(e),hn({pendingNavTarget:void 0}),N({mode:y.DEFAULT})},Pm=[{intent:I.InitCommandPalette,mode:y.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{z("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return hn({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),N({mode:y.PALETTE}),l("Opening command palette",null)}},{intent:I.Confirm,mode:y.PALETTE,action:()=>{let{selectedNode:e}=h();if(!e||!sn(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?(jb(t),l("Selected command",t)):l("No command selected",null)}},{intent:I.ExitCommandLine,mode:y.PALETTE,action:()=>(Mm(),l("Exiting palette",null))},{intent:I.Exit,mode:y.PALETTE,action:()=>(Mm(),l("Closed command palette",null))},{intent:I.NavPreviousItem,mode:y.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(D.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:I.NavNextItem,mode:y.PALETTE,action:()=>(D.navigateToNextItem(),l("Navigating to next item",null))},{intent:I.NavToPreviousContainer,mode:y.PALETTE,action:()=>(D.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:I.NavToNextContainer,mode:y.PALETTE,action:()=>(D.navigateToNextContainer(),l("Navigating to next container",null))}];var Lm=[...wm,...Pm,{intent:I.AddItem,mode:y.DEFAULT,description:"[n] new...",action:()=>(N({mode:y.COMMAND_LINE}),z(`${b.NEW} `),l("Adding new item",null))},{intent:I.Delete,mode:y.DEFAULT,description:"[d] delete",action:()=>(N({mode:y.COMMAND_LINE}),z(`${b.DELETE} `),l("Deleting item",null))},{intent:I.InitCommandLine,mode:y.DEFAULT,description:"[:] focus command line",action:()=>(N({mode:y.COMMAND_LINE}),z(""),l("Entering command line mode",null))},{intent:I.Confirm,mode:y.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=h();if(!ee(e?.id??"")?.length){let r=e?E.getAttachment(e.id):void 0;if(r)return Am(r);if(e?.title===ce.DESCRIPTION)return N({mode:y.COMMAND_LINE}),z(`${b.EDIT} description `),l("Propose command",!0);if(e?.title===ce.ASSIGNEES)return N({mode:y.COMMAND_LINE}),z(`${b.ASSIGN} `),l("Propose command",!0);if(e?.title===ce.TAGS)return N({mode:y.COMMAND_LINE}),z(`${b.TAG} `),l("Propose command",!0);if(t.title===ce.DESCRIPTION&&e?.context==="TEXT")return N({mode:y.COMMAND_LINE}),z(`${b.EDIT} description `),l("Propose command",!0)}return D.enterChildNode(),l("Entering context",null)}},{intent:I.Yank,mode:y.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=h(),t=e?.title===ce.DESCRIPTION?Ne.DESCRIPTION:e?.title===ce.TAGS?Ne.TAGS:e?.title===ce.ASSIGNEES?Ne.ASSIGNEES:Ne.REF,r=ve(b.YANK).includes(t)?t:Ne.REF;return N({mode:y.COMMAND_LINE}),z(`${b.YANK} ${r}`),l("Propose command",!0)}},{intent:I.EditTitle,mode:y.DEFAULT,description:"[r] rename title",action:()=>(N({mode:y.COMMAND_LINE}),z(`${b.EDIT} title ${h().selectedNode?.title}`),l("Exiting context",null))},{intent:I.EditDescription,mode:y.DEFAULT,description:"[e] edit description",action:()=>(N({mode:y.COMMAND_LINE}),z(`${b.EDIT} description `),l("Exiting context",null))},{intent:I.Exit,mode:y.DEFAULT,description:"[q] exit context",action:()=>(D.enterParentNode(),l("Exiting context",null))},{intent:I.NavPreviousItem,mode:y.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(D.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:I.NavNextItem,mode:y.DEFAULT,action:()=>(D.navigateToNextItem(),l("Navigating to next item",null))},{intent:I.NavToPreviousContainer,mode:y.DEFAULT,action:()=>(D.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:I.NavToNextContainer,mode:y.DEFAULT,action:()=>(D.navigateToNextContainer(),l("Navigating to next container",null))}];var Hb=500,Wb=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),km=e=>{let t=Wb(e);t&&hs(n=>(n+t).slice(0,Hb))};var Gb=[y.COMMAND_LINE,y.PALETTE],Vb=e=>[{intent:I.MoveCursorLeft,mode:e,action:()=>(Ca(-1),l("Moving cursor left",null))},{intent:I.MoveCursorRight,mode:e,action:()=>(Ca(1),l("Moving cursor right",null))},{intent:I.MoveCursorLeftOfWord,mode:e,action:()=>(Na("left"),l("Moving cursor left of word",null))},{intent:I.MoveCursorRightOfWord,mode:e,action:()=>(Na("right"),l("Moving cursor right of word",null))},{intent:I.AutoCompleteCommand,mode:e,action:()=>(hs((t,{remainder:n})=>{let r=n?t+n:t,o="";return r==="edit title "&&(o=h().selectedNode?.title??""),r+o}),l("Auto-completing command",null))},{intent:I.CaptureInput,mode:e,action:(t,{sequence:n})=>(km(n??""),l("Capturing input",null))},{intent:I.EraseInput,mode:e,action:()=>(tu(),l("Erasing input",null))},{intent:I.EraseInputWord,mode:e,action:()=>(nu(),l("Erasing input word",null))}],Dm=[{intent:I.Confirm,mode:y.COMMAND_LINE,action:()=>(_t(),l("Executing command",null))},{intent:I.ViewHelp,mode:y.DEFAULT,action:()=>(N({mode:y.HELP}),l("Viewing help",null))},...Gb.flatMap(Vb),{intent:I.ExitCommandLine,mode:y.COMMAND_LINE,action:()=>(N({mode:y.DEFAULT}),l("Exiting command line",null))},{intent:I.GetLastCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(su(),l("Getting last command from history",null))},{intent:I.GetNextCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(iu(),l("Getting next command from history",null))}];import Om from"chalk";var Hs=Om.dim.hex(v.secondary2)(": for command line"),Bm="q to exit",Fm=`${Om.hex(v.accent)("m")} to confirm`,za={[F.WORKSPACE]:[Hs],[F.BOARD]:[Hs],[F.BOARD+y.COMMAND_LINE]:[Hs],[F.SWIMLANE]:[Hs],[F.TICKET+y.HELP]:[Bm],[F.SWIMLANE+y.HELP]:[Bm],[F.TICKET]:[],[F.FIELD]:[],[F.SWIMLANE+y.MOVE]:[Fm],[F.TICKET+y.MOVE]:[Fm]};var pr=e=>e.trim().toLocaleLowerCase(),qa=(e,t)=>pr(e).includes(pr(t));var Kb=e=>{let{tags:t}=h();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},zb=e=>{let{contributors:t}=h();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},Um=(e,t)=>{let n=pr(t.value);if(!n)return!0;switch(t.target){case"title":return qa(e.title??"",n);case"description":return qa(e.props.description??"",n);case"tag":return Kb(e).map(pr).some(o=>o.includes(n));case"assignee":return zb(e).map(pr).some(o=>o.includes(n));case"ref":return Uo(e.id,t.value);default:return!0}};function _m(e,t,n){let r=t[e];if(!r)return i("buildBreadCrumb(): current node not found");let o=[],s=r;for(;s&&(o.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?i("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var $m=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t};var tn,Ya,Xa=new Set,Ja=()=>{for(let e of Xa)e()},Yb=e=>(Xa.add(e),()=>Xa.delete(e));function Qa(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=_m(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,f=za[p+n]??za[p]??[],g=[...Lm,...Rm[p]??[],...Dm],x=$m(g),S=Xb(o,s),T=S[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:f,availableActions:g,actionIndex:x,selectedNode:T,renderedChildrenIndex:S})}var h=()=>{if(!tn)throw new Error("State not initialized. Call initWorkspaceState() first.");return tn},Ze=()=>tn?l("Retrieved state",tn):i("State not initialized. Call initWorkspaceState() first.");function Fr(e){Ya=e;let t=_e(process.cwd()),n=!1;if(!d(t)){let s=Rt(t.value);if(d(s))return i(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:y.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=Qa(r);return d(o)?o:(tn=o.value,Ja(),l("State initialized",null))}var so=!1,Ws=null;function ue(e){let t=h(),n=e(t);if(so)return Ws=n,tn={...t,...n},l("State updated",null);let r=Qa(n);return d(r)?i(r.message??"Unable to update state"):(tn=r.value,Ja(),l("State updated",null))}function Rc(e){if(so)return l("Joined batch",e());so=!0,Ws=null;let t=()=>{let n=Ws;if(so=!1,Ws=null,n===null)return null;let r=Qa(n);return d(r)?i(r.message??"Unable to update state"):(tn=r.value,Ja(),l("State updated",null))};try{let n=e(),r=t();return r&&d(r)?i(r.message):l("State updated",n)}finally{so&&t()}}var N=e=>ue(t=>({...t,...e}));var q=()=>qb(Yb,h,h),Xb=(e,t)=>{let n={};for(let r of Object.values(e))M(r)&&t.length>0&&!t.every(o=>Um(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 a=e[o.id],c=e[s.id];return!a||!c?0:a.rank.localeCompare(c.rank)});return n},J=e=>h()?.renderedChildrenIndex[e]??[],Et=()=>Ya?Fr(Ya):i("Cannot reset state: no initial workspace found"),Pt=()=>tn!==void 0;var en=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r)return i("Node not found");if(r.context===t)return l("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return l("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},Za=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.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"),E={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=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?i("Unable to link contributor to user"):l("Linked contributor to user",r)},deleteNode(e){ue(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create comment, missing issue");if(!M(t))return i("Can only comment on issues");let n=ue(r=>({...r,comments:{...r.comments??{},[e.id]:{...e,deleted:!1}}}));return d(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(!M(r))return i("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=ue(a=>({...a,comments:{...a.comments??{},[e]:o}}));return d(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=ue(o=>({...o,comments:{...o.comments??{},[e]:n}}));return d(r)?i("Unable to delete comment"):l("Deleted comment",n)},getComment(e){return h().comments?.[e]},getCommentsByIssue(e){return Object.values(h().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(!M(t))return i("Can only attach to issues");let n=ue(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return d(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=ue(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return d(r)?i("Unable to delete attachment"):l("Deleted attachment",n)},getAttachment(e){return h().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(h().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},editValue(e,t){let{nodes:n}=h(),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}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=h();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return ee(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=h(),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 a=yn(o,"move");if(a)return a;if(Za(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}=h(),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 a=new Set,c=m=>{let p=t[m];if(!(!p||a.has(m))){a.add(m);for(let f of ee(p.id))c(f.id)}};c(e);let u={...structuredClone(t)};for(let m of a){if(!u[m])return i("Unable to locate node to delete");u[m]={...u[m],isDeleted:!0}}return n?(N({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:Fo,tombstoned:!0},r=ue(o=>({...o,contributors:{...o.contributors,[e]:n}}));return d(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=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(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=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?i("Unable to restore contributor"):l("Restored contributor",r)},createContributor(e){let t=ue(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(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(!M(r))return i("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return i("Contributor already assigned");let a={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(a),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(!M(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 a={...r,props:{...r.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(a),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(!M(r))return i("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return i("Tag already assigned");let a={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(a),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(!M(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 a={...r,props:{...r.props,tags:s.filter(c=>c!==t)}};return this.updateNode(a),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=ue(o=>({...o,tags:{...o.tags,[e]:n}}));return d(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=ue(s=>({...s,tags:{...s.tags,[e]:r}}));return d(o)?i("Unable to restore tag"):l("Restored tag",r)},createTag(e){let t=ue(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?i("Could not create tag"):l("Tag created",e)},createNode(e){let t=ue(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(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=ue(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?i(r.message):l("Locked node",n)},updateNode(e){let t=ue(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:l("Updated node",e)},getContributor(e){return h().contributors[e]},getTag(e){let t=h().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return h().tags[e]},getTags(){return Object.values(h().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return h().nodes[e]},getSiblings(e){return ee(e)}};var Jb=(e,t)=>e+" ".repeat(Math.max(0,t-jm(e))),Qb=(e,t)=>" ".repeat(Math.max(0,t-jm(e)))+e,Gs=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`),Zb=(e,t)=>t?e<t?"up":e>t?"down":null:null,ex=(e,t)=>{let n=E.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=Zb(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},Hm=e=>`${Math.max(1,Math.round(e/1024))} KB`,Wm=e=>E.getAttachment(e)?.name??"",tx=e=>{switch(e.action){case"add.issue.tag":{let t=h().tags[e.payload.tag];return t?bn.bgHex(se(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=h().tags[e.payload.tag];return t?bn.bgHex(se(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=h().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?bn.hex(se(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?bn.hex(se(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(`(${Hm(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Wm(e.payload.id);return t?`"${t}"`:""}default:return""}},nx=e=>{let t=ur(rt(e));return bn.gray(Qb(t,8))},rx=12,ox=e=>Jb(`${e}`,rx),sx=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=h().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=h().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=E.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${Hm(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Wm(e.payload.id);return t?`"${t}"`:""}default:return""}},Us=e=>[Gs(e.action),sx(e)].filter(Boolean).join(" "),Gm=(e,t)=>{let n=nx(e.id),r=ox(e.userName),o=bn.dim("\u203A"),s=e.action==="move.node"?ex(e,t):[Gs(e.action),tx(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var ix=e=>we(e,"comments"),ax=e=>we(e,"description"),dx=e=>we(e,"assignees"),cx=e=>we(e,"tags"),lx=e=>we(e,"history"),ux=e=>we(e,"attachments"),Vs=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:a="horizontal"})=>{let c=E.getNode(e);if(!c){let p=E.createNode({...le.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:a});return d(p)?p:l("Virtual field created",void 0)}if(!ot(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!==a))return l("Virtual field unchanged",void 0);let m=E.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:a});return d(m)?m:l("Virtual field updated",void 0)},Vm=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let a=E.getNode(e);if(!a){let m=E.createNode({...le.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return d(m)?m:l("Virtual field list created",void 0)}if(!Lr(a))return i(`Existing virtual node ${e} is not a field list`);if(!(a.title!==t||a.parentNodeId!==n||a.rank!==r||a.readonly!==o||a.childRenderAxis!==s))return l("Virtual field list unchanged",void 0);let u=E.updateNode({...a,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return d(u)?u:l("Virtual field list updated",void 0)},Ac=e=>{let t=st(vt/4n),n=st(vt/2n),r=st(vt*3n/4n),o=st(vt*7n/8n),s=st(vt*15n/16n),a=st(vt*13n/16n);if(d(t))return t;if(d(n))return n;if(d(r))return r;if(d(o))return o;if(d(s))return s;if(d(a))return a;let c=Vs({id:ax(e.id),name:ce.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(c))return c;let u=Vm({id:dx(e.id),name:ce.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(u))return u;let m=Vm({id:cx(e.id),name:ce.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(d(m))return m;let p=Vs({id:ix(e.id),name:ce.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(p))return p;let f=Vs({id:ux(e.id),name:ce.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(d(f))return f;let g=Vs({id:lx(e.id),name:ce.HISTORY,parentNodeId:e.id,rank:a.value,value:mx(e),readonly:!0,childRenderAxis:"vertical"});return d(g)?g:l("Ticket virtual nodes materialized",void 0)},mx=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=>Gm(r,n.get(r.action)??[])).join(`
72
- `)},Km=!0,zm=e=>{Km=e},Yi=()=>Km;import _x from"node:http";import Wn from"node:path";import{fileURLToPath as $x}from"node:url";import Rx from"node:fs";import Ax from"node:path";import{ulid as W}from"ulid";import{existsSync as ed}from"node:fs";import{chmod as td}from"node:fs/promises";import np from"node:os";import gr from"node:path";var qm=(e,t)=>e.reduce((n,r)=>r<n?r:n,t);var Ym=1e5,px=2e4,Ks=null,Xm=Promise.resolve(),xn=e=>{let t=Xm.then(e,e);return Xm=t.then(()=>{},()=>{}),t},zs=e=>{let t=_e(e??process.cwd());return d(t)?i(t.message):l("Resolved Epiq repo root",t.value)},qs=e=>{let t=zs(e);return d(t)?t:Se({repoRoot:t.value})},ft=()=>{if(!Pt())return{mode:"live",asOfTime:null};let{timeMode:e}=h();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:Ks}},fx=e=>{let t=new Map;for(let n of e){if(n.action!=="create.tag"&&n.action!=="create.contributor")continue;let r=n.payload;r?.id&&r.name&&t.set(r.id,r.name)}return t},rp=e=>{let t=e.payload;return e.action==="tombstone.tag"||e.action==="restore.tag"?t?.id:t?.tag},gx=(e,t)=>{let n=e.payload,r=rp(e),o=r!==void 0?t.get(r)??"":n?.assignee!==void 0?t.get(n.assignee)??"":n?.name!==void 0?`"${n.name}"`:"";return[e.action?Gs(e.action):"",o].filter(Boolean).join(" ")},Jm=(e,t)=>{if(!e)return null;let n=t.get(e)??e;return{id:e,name:n,color:se(n)}},hx=(e,t)=>{let n=e.payload;return{actor:e.userId?{id:e.userId,name:e.userName??e.userId,color:se(e.userName??e.userId)}:null,tag:Jm(rp(e),t),assignee:Jm(n?.assignee,t)}},nd=(e,t)=>{let n=new Map,r=new Set,o=a=>{let c=new Set,u=a;for(;u&&!c.has(u);){if(r.has(u))return u;c.add(u),u=n.get(u)}return null},s=[];for(let a of e){let c=a.payload,u=c?.id;if(!u)continue;a.action==="add.board"&&r.add(u);let m=c.parent??c.issue;m&&n.set(u,m),(u===t||o(u)===t)&&s.push(a)}return s},op=async(e={})=>{let t=qs(e.repoRoot);if(d(t))return i(t.message);let n=Mn(t.value);if(d(n))return i(n.message);let r=e.boardId?nd(n.value,e.boardId):n.value,o=fx(n.value),s=Xn(n.value.map(C=>Jn(C))),a=new Map(n.value.map((C,R)=>[C.id,s[R]??null])),c=r.flatMap(C=>{let R=a.get(C.id)??null;return R===null?[]:[{id:C.id,t:R,action:C.action,label:gx(C,o),...hx(C,o)}]}),u=Date.now(),m=e.end??u,p=e.start??qm(c.map(C=>C.t),m);if(m<=p)return l("Empty time window",{bucketMs:0,buckets:[],events:[],earliest:p,latest:m});let f=c.filter(C=>C.t>=p&&C.t<m).sort((C,R)=>C.t-R.t),g=f.map(C=>C.t),x=Math.max(1,Math.ceil((m-p)/Ym)),S=new Map;for(let C of g){let R=Math.min(Ym-1,Math.floor((C-p)/x)),L=p+R*x;S.set(L,(S.get(L)??0)+1)}let T=[...S.entries()].sort(([C],[R])=>C-R).map(([C,R])=>({t:C,count:R}));return l("Computed event timeline",{bucketMs:x,buckets:T,events:f.length>px?[]:f,earliest:p,latest:m})},io="",Qm="",vx=5e3,fr=null;var rd=async(e={})=>{let t=zs(e.repoRoot);if(d(t))return i(t.message);let n=Rt(t.value);if(d(n))return i(n.message);let r=e.start===void 0&&e.end===void 0;if(r&&fr&&fr.repoRoot===t.value&&fr.stateBranch===n.value.stateBranch&&Date.now()-fr.fetchedAt<vx)return l("Computed commit timeline",fr.result);let o=await _({cwd:t.value,args:["log","--branches","--not",n.value.stateBranch,...e.start!==void 0?[`--since=@${Math.floor(e.start/1e3)}`]:[],...e.end!==void 0?[`--until=@${Math.floor(e.end/1e3)}`]:[],"--shortstat",`--format=${Qm}%H${io}%at${io}%an${io}%s`]});if(d(o))return i(o.message);let s=o.value.stdout.split(Qm).filter(a=>a.trim().length>0).map(a=>{let[c,...u]=a.split(`
73
- `),[m,p,f,...g]=(c??"").split(io);if(!m||!p)return null;let x=u.join(" "),S=Number(/(\d+) insertion/.exec(x)?.[1]??0),T=Number(/(\d+) deletion/.exec(x)?.[1]??0);return{sha:m,time:Number(p)*1e3,author:f??"unknown",subject:g.join(io),linesChanged:S+T,insertions:S,deletions:T}}).filter(a=>a!==null).filter(a=>(e.start===void 0||a.time>=e.start)&&(e.end===void 0||a.time<=e.end));return r&&(fr={repoRoot:t.value,stateBranch:n.value.stateBranch,fetchedAt:Date.now(),result:s}),l("Computed commit timeline",s)},sp=async e=>{let t=e.ref.trim();if(!t)return i("ref must not be empty");if(t.length!==7)return i(`"${t}" is ${t.length} characters; a ref is ${7}. Read it off the issue rather than slicing the id by hand.`);let n=await rd({repoRoot:e.repoRoot});if(d(n))return i(n.message);let r=`${t.toUpperCase()} `,o=c=>c.subject.toUpperCase().startsWith(r),s=n.value,a=[];for(let[c,u]of s.entries()){if(!o(u))continue;let m=s[c+1];a.push({...u,precedingSha:m&&o(m)?m.sha:null})}return l("Matched commits by ref",a)},ip=e=>/^[0-9a-f]{7,40}$/i.test(e),yx=async(e,t)=>{let n=await _({cwd:e,args:["show",t]});if(d(n))return i(n.message);let r=gr.join(np.tmpdir(),"epiq","commit-diffs");Te.mkDir(r);let o=gr.join(r,`${t}.diff`);return ed(o)||(Te.writeToFile(o,n.value.stdout),await td(o,292)),Zu(o)},bx=12,xx=800,Zm=async(e,t,n)=>{let r=await _({cwd:e,args:["show",`${t}:${n}`]});return d(r)?"":r.value.stdout},Ix=async(e,t)=>{let n=await _({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(d(n))return i(n.message);let r=n.value.stdout.split(`
74
- `).map(o=>o.trim()).filter(Boolean);return r.length===0?i("No changed files found for this commit"):l("Listed changed files",r)},Ex=async(e,t,n)=>{let r=await Ix(e,t);if(d(r))return i(r.message);let o=r.value;if(o.length>bx)return i(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=gr.join(np.tmpdir(),"epiq","commit-diffs",t),a=await Promise.all(o.map(async(f,g)=>{let[x,S]=await Promise.all([Zm(e,`${t}~1`,f),Zm(e,t,f)]),T=gr.basename(f),C=gr.join(s,String(g),"before",T),R=gr.join(s,String(g),"after",T);return ed(C)||(Te.writeToFile(C,x),await td(C,292)),ed(R)||(Te.writeToFile(R,S),await td(R,292)),{beforePath:C,afterPath:R}})),[c,...u]=a;if(!c)return i("No changed files found for this commit");let m=await ja(n,c.beforePath,c.afterPath,"new");if(d(m)||u.length===0)return m;await new Promise(f=>setTimeout(f,xx));let p=await Promise.all(u.map(({beforePath:f,afterPath:g})=>ja(n,f,g,"reuse")));for(let f of p)d(f)&&logger.error(`Failed to open an additional diff tab for ${t}: ${f.message}`);return m},ap=async e=>{if(!ip(e.sha))return i("Invalid commit sha");let t=zs(e.repoRoot);if(d(t))return i(t.message);let n=t.value,r=Ms()[0];if(r&&$a(r)){let o=await Ex(n,e.sha,r);if(!d(o))return o;logger.error(`Side-by-side diff failed for ${e.sha}, falling back to unified diff: ${o.message}`)}return yx(n,e.sha)},Sx=200,ep=e=>/^0+$/.test(e),tp=/^:\d{6} \d{6} ([0-9a-f]{40}) ([0-9a-f]{40}) [A-Z]\d*\t(.+)$/,Cx=async(e,t)=>{let n=await _({cwd:e,args:["diff","--raw","--no-renames","--abbrev=40",`${t}~1`,t]});if(d(n))return i(n.message);let r=n.value.stdout.split(`
75
- `).filter(a=>a!==""),o=r.filter(a=>!tp.test(a));if(o.length>0)return i(`Could not parse ${o.length} line(s) of "git diff --raw" output, e.g. "${o[0]}"`);let s=r.map(a=>{let c=tp.exec(a),u=c?.[1]??"",m=c?.[2]??"";return{path:c?.[3]??"",beforeBlob:ep(u)?null:u,afterBlob:ep(m)?null:m}});return s.length===0?i("No changed files found for this commit"):l("Listed changed files with blob hashes",s)},dp=async e=>{if(!ip(e.sha))return i("Invalid commit sha");let t=zs(e.repoRoot);if(d(t))return i(t.message);let n=t.value,r=await Cx(n,e.sha);if(d(r))return i(r.message);let o=r.value;if(o.length>Sx)return i(`Commit touches ${o.length} files \u2014 too many to show as a diff`);let s=o.flatMap(m=>[m.beforeBlob,m.afterBlob].filter(p=>p!==null)),a=await Ud(s,n);if(d(a))return i(a.message);let c=a.value,u=o.map(m=>({path:m.path,before:m.beforeBlob?c.get(m.beforeBlob)??"":"",after:m.afterBlob?c.get(m.afterBlob)??"":""}));return l("Loaded commit diff",{sha:e.sha,files:u})},cp=e=>{let t=Mn(e);if(d(t))return i(t.message);let n=Et();if(d(n))return i(n.message);Ks=null;let r=yt(t.value),{fatal:o,skipped:s}=Vt(r);return o.length>0?i(o.map(a=>a.message).join(", ")):(Kt(s),N({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),l("Restored live state",!0))},Nx=(e,t)=>{Ks=null;let n=cp(e);return d(n)?i(`${t} (recovery to live also failed: ${n.message})`):i(t)},od=e=>xn(async()=>{let t=qs(e.repoRoot);if(d(t))return i(t.message);let n=Ho(t.value,e.targetTime);if(d(n))return i(n.message);let{appliedEvents:r,unappliedEvents:o}=n.value,s=Et();if(d(s))return s;let a=yt(r),{fatal:c,skipped:u}=Vt(a);return c.length>0?Nx(t.value,c.map(m=>m.message).join(", ")):(Kt(u),N({readOnly:!0,timeMode:"peek",unappliedEvents:o,replay:null}),Ks=e.targetTime,l("Checked out historical state",{asOfTime:e.targetTime}))}),lp=async e=>{let t=qs(e.repoRoot);if(d(t))return i(t.message);let n=Wo(t.value);if(d(n))return i(n.message);let r=n.value.get(e.eventId)??null;return r===null?i("Event not found in the log"):od({repoRoot:e.repoRoot,targetTime:r+1})},up=(e={})=>xn(async()=>{let t=qs(e.repoRoot);if(d(t))return i(t.message);let n=cp(t.value);return d(n)?i(n.message):l("Returned to live state",!0)});var Tx=e=>{if(e.filePath)try{return l("Read attachment file",{data:Rx.readFileSync(e.filePath),name:e.name??Ax.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")},sd=()=>{let e=wt();return d(e)?Bt:e.value.attachmentMaxKb??Bt},Xs=e=>{let t=_e(e??process.cwd());return d(t)?i(t.message):l("Resolved Epiq repo root",t.value)},fe=async(e,t)=>{let n=Xs(e);if(d(n))return n;let r=Se({repoRoot:n.value});if(d(r))return i(r.message);let o=rn(n.value);if(d(o))return i(o.message);let s=await sa({repoRoot:n.value,stateBranchName:o.value});if(d(s))return i(s.message);let a=await Bn({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(d(a))return i(a.message);if(t?.pull??!1){let m=await _({cwd:r.value,args:["pull","--ff-only"]});d(m)&&K.info(3,m.message)}let c=zt(r.value);if(d(c))return i(c.message);let u=qt(c.value.events,c.value.unreadable);return d(u)?i(u.message):l("Booted Epiq state",{repoRoot:n.value,stateBranchRoot:r.value})},ge=()=>{let e=wt();return d(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")},ye=()=>{let e=Ze();return d(e)?i(e.message):e},yp=e=>(e.props.tags??[]).map(t=>E.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:se(t.name)})),wx=()=>{let e=Ze(),t=d(e)?[]:e.value.eventLog??[],n=new Map;for(let r of t)r.userId&&r.userName&&n.set(r.userId,r.userName);return n},bp=(e,t)=>{let n=new Map(e);for(let r of Object.values(t))n.set(r.id,r.name);return n},xp=e=>(e.props.assignees??[]).map(t=>E.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:se(n)}));var Ip=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ye();if(d(n))return n;let r=n.value.nodes,o=Object.values(r).filter(M).filter(s=>!s.isDeleted).filter(s=>e.includeClosed||s.parentNodeId!==Ce).filter(s=>e.boardId?(s.parentNodeId?r[s.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(s=>({id:s.id,ref:V(s.id),title:qe(s.title),description:s.props.description??"",createdAt:rt(s.id),parentNodeId:s.parentNodeId,isClosed:s.parentNodeId===Ce,readonly:!!s.readonly,tags:yp(s),assignees:xp(s)}));return l("Listed issues",o)},Ep=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=qe(e.title);if(!o)return i("Issue title cannot be empty");let s=e.description??"",a=bt("Issue title",o,300)??bt("Issue description",s,2e4);if(a)return i(a);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=kn(e.parentId,n.value,t.value.stateBranchRoot);if(d(c))return c;let u=Ls({name:o,parent:e.parentId,user:n.value,rank:c.value});if(d(u))return u;let m=[...u.value],p=m.find(S=>S.action==="add.issue")?.payload.id;if(!p)return i("Unable to determine created issue id");s&&m.push({id:W(),...n.value,action:"edit.description",payload:{id:p,md:s}});let f=[];for(let S of e.tagNames??[]){let T=qe(S).trim();if(!T||f.some($=>$.name===T))continue;let C=bt("Tag name",T,60);if(C)return i(C);let R=E.findTagByName(T),L=R?.id??W();R||m.push({id:W(),...n.value,action:"create.tag",payload:{id:L,name:T}}),m.push({id:W(),...n.value,action:"add.issue.tag",payload:{id:p,tag:L}}),f.push({id:L,name:T})}let g=[];for(let S of e.assigneeNames??[]){let T=qe(S).trim();if(!T||g.some($=>$.name===T))continue;let C=bt("Assignee name",T,80);if(C)return i(C);let R=Object.values(r.value.contributors).find($=>$.name===T),L=R?.id??W();R||m.push({id:W(),...n.value,action:"create.contributor",payload:{id:L,name:T}}),m.push({id:W(),...n.value,action:"add.issue.assignee",payload:{id:p,assignee:L}}),g.push({id:L,name:T})}let x=O(m,t.value.stateBranchRoot);return d(x)?i(x.message):l("Created issue",{id:p,ref:V(p),title:o,parentId:e.parentId,description:s,tags:f,assignees:g})},Sp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=dn(Ce,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(r))return r;let o={id:W(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:Ce,rank:r.value}},s=O([o],t.value.stateBranchRoot);return d(s)?i(s.message):l("Closed issue",{id:e.issueId,ref:V(e.issueId)})},Cp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Target node is not issue");if(o.parentNodeId!==Ce)return i("Issue is not closed");let s=Ts(o);if(!s)return i("Unable to resolve previous parent from issue history");if(s===Ce)return i("Previous parent resolves to closed swimlane");let a=r.value.nodes[s];if(!a)return i("Previous parent no longer exists");let c=dn(a.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let u={id:W(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:a.id,rank:c.value}},m=O([u],t.value.stateBranchRoot);return d(m)?i(m.message):l("Reopened issue",{id:o.id,ref:V(o.id),parentId:a.id})},Np=async e=>{let t=Xs(e.repoRoot);if(d(t))return t;let n=ge();if(d(n))return n;let r=Se({repoRoot:t.value});if(d(r))return r;let o=zt(r.value);if(d(o))return o;let s=qt(o.value.events,o.value.unreadable);if(d(s))return s;let a=dn(e.parentId,e.issueId,e.position??{at:"end"},n.value,r.value);if(d(a))return a;let c={id:W(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:a.value}},u=O([c],r.value);return d(u)?i(u.message):l("Moved issue",{id:e.issueId,ref:V(e.issueId),parentId:e.parentId})},Rp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.boardId];if(!o)return i("Board not found");if(!kr(o))return i("Target parent must be a board");if(o.readonly)return i("Cannot add a swimlane to a readonly board");if(ft().mode!=="live")return i("Cannot add a swimlane while time travelling");let s=qe(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let a=bt("Swimlane title",s,300);if(a)return i(a);let c=kn(e.boardId,n.value,t.value.stateBranchRoot);if(d(c))return c;let u=W(),m={id:W(),...n.value,action:"add.swimlane",payload:{id:u,name:s,parent:e.boardId,rank:c.value}},p=O([m],t.value.stateBranchRoot);return d(p)?i(p.message):l("Created swimlane",{id:u,ref:V(u),title:s,boardId:e.boardId})},Ap=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!Mt(o))return i("Edit target must be a swimlane");if(o.readonly)return i("Cannot edit readonly swimlane");let s=qe(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let a=bt("Swimlane title",s,300);if(a)return i(a);if(o.title===s)return l("No changes made",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s});let c={id:W(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},u=O([c],t.value.stateBranchRoot);return d(u)?i(u.message):l("Edited swimlane title",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s})},Tp=async e=>{let t=Xs(e.repoRoot);if(d(t))return t;let n=ge();if(d(n))return n;let r=Se({repoRoot:t.value});if(d(r))return r;let o=zt(r.value);if(d(o))return o;let s=qt(o.value.events,o.value.unreadable);if(d(s))return s;let a=dn(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(d(a))return a;let c={id:W(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:a.value}},u=O([c],r.value);return d(u)?i(u.message):l("Moved swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId),boardId:e.boardId})},wp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return i("Swimlane not found");if(!Mt(o))return i("Delete target must be a swimlane");let s={id:W(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):l("Deleted swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId)})},Js=async(e={})=>{Yo();let t=Xs(e.repoRoot);if(d(t))return i("Sync failed");let n=ge();if(d(n))return n;let r=await ts({cwd:t.value,ownEventFileName:Ln(n.value)});return d(r)?(na(r.message),r):(Xo(),l("Synced",r.value))},Mp=e=>{let t=ye();if(d(t))return t;let n=t.value.nodes[e];return n?l("Read issue history",(n.log??[]).map(r=>({id:r.id,t:rt(r.id),action:r.action,label:Us(r),actor:{id:r.userId,name:r.userName,color:se(r.userName)}}))):i("Issue not found")};var hr=()=>{let e=ye();if(d(e))return e;let t=ft(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(f=>kr(f)&&!f.isDeleted),s=new Map,a=new Map;for(let f of r)if(!f.isDeleted){if(Mt(f)&&f.parentNodeId){let g=s.get(f.parentNodeId)??[];g.push(f),s.set(f.parentNodeId,g)}if(M(f)&&f.parentNodeId){let g=a.get(f.parentNodeId)??[];g.push(f),a.set(f.parentNodeId,g)}}let c=wt();if(d(c))return c;let u={};for(let f of r.filter(M))f.isDeleted||(u[f.id]=E.getCommentsByIssue(f.id).map(g=>{let x=E.getContributor(g.authorId);return{id:g.id,issueId:g.issue,body:g.md,author:{id:g.authorId,name:x?.name??"Unknown",color:se(x?.name??g.authorId)},createdAt:rt(g.id)}}));let m=new Map;for(let f of e.value.eventLog)f.action==="add.issue.attachment"&&m.set(f.payload.id,f.payload.author);let p={};for(let f of r.filter(M))f.isDeleted||(p[f.id]=E.getAttachmentsByIssue(f.id).map(g=>({id:g.id,issueId:g.issue,name:g.name,fileName:rr(g.hash,g.ext),bytes:g.bytes,createdAt:rt(g.id),canDelete:m.get(g.id)===c.value.userId})));return l("Retrieved Epiq GUI state",{boards:o.sort((f,g)=>f.rank.localeCompare(g.rank)).map(f=>({id:f.id,ref:V(f.id),title:f.title,readonly:!!f.readonly||n,swimlanes:(s.get(f.id)??[]).sort((g,x)=>g.rank.localeCompare(x.rank)).map(g=>({id:g.id,title:g.title,readonly:!!g.readonly||n,issues:(a.get(g.id)??[]).sort((x,S)=>x.rank.localeCompare(S.rank)).map(x=>({id:x.id,ref:V(x.id),title:qe(x.title),description:x.props.description??"",createdAt:rt(x.id),readonly:!!x.readonly||n,tags:yp(x),assignees:xp(x),parentNodeId:x.parentNodeId,isClosed:x.parentNodeId===Ce})),parentNodeId:g.parentNodeId}))})),tags:E.getTags().map(f=>({...f,color:se(f.name)})),contributors:Object.values(e.value.contributors).map(f=>({...f,color:se(f.name)})),user:{name:c.value.userName??"",id:c.value.userId??"",color:se(c.value.userName??"")},commentsByIssueId:u,attachmentsByIssueId:p,attachmentMaxKb:sd(),timeTravel:t})},fp=null,Mx=e=>{if(e===fp)return;let t=ss({root:e});if(d(t)){K.info(t.message);return}fp=e},St=async(e={})=>{if(ft().mode!=="live")return hr();let t=await fe(e.repoRoot,{pull:!1});return d(t)?t:(Mx(t.value.repoRoot),hr())},Pp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=bt("Issue description",e.description,2e4);if(s)return i(s);let a=o.props.description??"";if(a===e.description)return l("No changes made",{id:e.issueId,ref:V(e.issueId),description:a});let c={id:W(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},u=O([c],t.value.stateBranchRoot);return d(u)?i(u.message):l("Edited issue description",{id:e.issueId,ref:V(e.issueId),description:e.description})},Lp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Edit target must be an issue");if(o.readonly)return i("Cannot edit readonly issue");let s=qe(e.title);if(!s.trim())return i("Issue title cannot be empty");let a=bt("Issue title",s,300);if(a)return i(a);if(o.title===s)return l("No changes made",{id:e.issueId,ref:V(e.issueId),title:s});let c={id:W(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},u=O([c],t.value.stateBranchRoot);return d(u)?i(u.message):l("Edited issue title",{id:e.issueId,ref:V(e.issueId),title:s})},kp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Tag target must be an issue");if(o.readonly)return i("Cannot tag readonly issue");let s=qe(e.tagName).trim();if(!s)return i("Tag name cannot be empty");let a=bt("Tag name",s,60);if(a)return i(a);let c=E.findTagByName(s),u=c?.id??W(),m=[...c?[]:[{id:W(),...n.value,action:"create.tag",payload:{id:u,name:s}}],{id:W(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:u}}],p=O(m,t.value.stateBranchRoot);return d(p)?i(p.message):l("Added issue tag",{id:e.issueId,ref:V(e.issueId),tag:{id:u,name:s}})},Dp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(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:W(),...n.value,action:"tombstone.tag",payload:{id:e.tagId}}],a=O(s,t.value.stateBranchRoot);return d(a)?i(a.message):l("Deleted tag",{id:o.id,name:o.name})};var Bp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(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:W(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):l("Removed issue tag",{id:e.issueId,ref:V(e.issueId),tagId:e.tagId})},Fp=async(e,t)=>{let n=ta(e);if(d(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}},Op=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(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 C=r.value.contributors[s],R=C?void 0:await Fp(t.value.stateBranchRoot,s);if(!C&&!R)return i("Unknown assignee id");let L=C??R,$=[...C?[]:[{id:W(),...n.value,action:"create.contributor",payload:{id:L.id,name:L.name}}],{id:W(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:L.id}}],G=O($,t.value.stateBranchRoot);return d(G)?i(G.message):l("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:L.id,name:L.name}})}let a=qe(e.assigneeName??"").trim();if(!a)return i("Provide assigneeId, self or assigneeName");let c=bt("Assignee name",a,80);if(c)return i(c);let m=[...bp(wx(),r.value.contributors).entries()].filter(([,C])=>C===a);if(m.length>1)return i(`"${a}" matches ${m.length} contributors (${m.map(([C])=>C).join(", ")}). Assign by assigneeId to choose.`);let p=m[0];if(!p&&!e.createUnlinked)return i(`No contributor named "${a}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[f=W(),g=a]=p??[],S=[...!!r.value.contributors[f]?[]:[{id:W(),...n.value,action:"create.contributor",payload:{id:f,name:g}}],{id:W(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:f}}],T=O(S,t.value.stateBranchRoot);return d(T)?i(T.message):l("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:f,name:g}})},Up=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;if(!r.value.contributors[e.contributorId])return i("Contributor not found");if(await Fp(t.value.stateBranchRoot,e.contributorId))return i("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let a=[{id:W(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],c=O(a,t.value.stateBranchRoot);return d(c)?i(c.message):l("Tombstoned contributor",{id:e.contributorId,name:Fo})};var _p=async(e={})=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=Mn(t.value.stateBranchRoot);if(d(o))return i(o.message);let s=e.boardId?nd(o.value,e.boardId):o.value,a=new Map,c=new Set,u=new Set,m=ta(t.value.stateBranchRoot);if(d(m))return i(m.message);for(let x of m.value)x.userId&&u.add(x.userId);for(let x of s)x.userId&&(a.set(x.userId,x.userName??""),c.add(x.userId));let p=r.value.contributors,g=[...bp(a,p).entries()].map(([x,S])=>({id:x,name:S,color:se(S),isSelf:x===n.value.userId,isExternal:!c.has(x),isRemoved:p[x]?.tombstoned===!0,hasAuthoredAnywhere:u.has(x)}));return l("Listed board contributors",g)},$p=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(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:W(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},a=O([s],t.value.stateBranchRoot);return d(a)?i(a.message):l("Removed issue assignee",{id:e.issueId,ref:V(e.issueId),assigneeId:e.assigneeId})},Qs=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(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 a=W(),c={id:W(),...n.value,action:"add.issue.comment",payload:{id:a,issue:e.issueId,md:s,author:n.value.userId}},u=O([c],t.value.stateBranchRoot);return d(u)?i(u.message):l("Added issue comment",{id:a,issueId:e.issueId,body:s})},Zs=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(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(!M(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:W(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:o.payload.issue}},u=O([c],t.value.stateBranchRoot);return d(u)?i(u.message):l("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},jp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(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(!M(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:W(),...n.value,action:"edit.issue.comment",payload:{id:e.commentId,issue:o.payload.issue,md:c}},m=O([u],t.value.stateBranchRoot);return d(m)?i(m.message):l("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:c})},Hp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return i("Issue not found");if(!M(o))return i("Attachment target must be an issue");if(o.readonly)return i("Cannot attach to readonly issue");let s=Tx(e);if(d(s))return s;let a=Bl(t.value.stateBranchRoot,s.value.data,sd());if(d(a))return a;let c=qe(s.value.name).trim()||"image",u=W(),m={id:W(),...n.value,action:"add.issue.attachment",payload:{id:u,issue:e.issueId,author:n.value.userId,hash:a.value.hash,ext:a.value.ext,name:c,bytes:a.value.bytes}},p=O([m],t.value.stateBranchRoot);if(d(p))return i(p.message);let f=rr(a.value.hash,a.value.ext);return l("Added issue attachment",{id:u,issueId:e.issueId,fileName:f,bytes:a.value.bytes,markdown:ha(c,f)})},Wp=async e=>{let t=await fe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ge();if(d(n))return n;let r=ye();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.attachment"&&m.payload.id===e.attachmentId);if(!o)return i("Unable to resolve attachment");if(o.payload.author!==n.value.userId)return i("You can only delete your own attachments");let s=r.value.nodes[o.payload.issue];if(!s)return i("Issue not found");if(!M(s))return i("Attachment target must be an issue");if(s.readonly)return i("Cannot delete attachment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.attachment"&&m.payload.id===e.attachmentId))return l("Attachment already deleted",{id:e.attachmentId,issueId:o.payload.issue});let c={id:W(),...n.value,action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},u=O([c],t.value.stateBranchRoot);return d(u)?i(u.message):l("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},Gp=async e=>{let t=await fe(e.repoRoot,{pull:!1});return d(t)?t:Fl(t.value.stateBranchRoot,e.fileName,sd())};var $t="1.7.0";import Px from"node:fs";import Vp from"node:path";var ao=3710,id="/api/instance",ad="epiq",ei=e=>{try{return Px.realpathSync(Vp.resolve(e))}catch{return Vp.resolve(e)}},Lx=e=>{let t=e;return typeof t=="object"&&t!==null&&t.app===ad&&typeof t.repoRoot=="string"&&typeof t.version=="string"&&typeof t.pid=="number"},Kp=async(e,t=500)=>{let n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let o=await fetch(`http://127.0.0.1:${e}${id}`,{signal:n.signal});if(!o.ok)return null;let s=await o.json();return Lx(s)?s:null}catch{return null}finally{clearTimeout(r)}};var kx=15e3,zp=e=>{let t,n=!1,r=!1,o=0,s=()=>{let p=Yn();return d(p)?(K.error(p.message),null):p.value},a=()=>{let p=s();if(!p)return!1;let{autoSync:f,preferredEditor:g}=p,x=wt(),S=d(x)?null:x.value.userName;return!!(f&&S&&g)},c=()=>{let p=s()?.autoSyncDebounceMs??kx;return Math.max(0,p-(Date.now()-o))},u=async()=>{if(!(n||r)){r=!0,o=Date.now();try{await xn(async()=>{if(ft().mode!=="live")return;let p=await Js({repoRoot:e.project.repoRoot});if(d(p))return;let{pulled:f,createdCommit:g,bootstrapped:x}=p.value;!f&&!g&&!x||Dn({type:"state",payload:await St({repoRoot:e.project.repoRoot})})})}finally{r=!1,m()}}};function m(){n||!a()||r||t||(t=setTimeout(()=>{t=void 0,u()},c()))}return m(),{queueSync:m,dispose:()=>{n=!0,t&&clearTimeout(t)}}};var Dx=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),dd=(e,t)=>{if(!e)return!1;if(e==="null")return!0;let n;try{n=new URL(e)}catch{return!0}return n.protocol!=="http:"||n.port!==String(t)?!0:!Dx.has(n.hostname)},qp=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:dd(e.origin,t)?{status:403,message:"Cross-origin request"}:e.method==="POST"&&!(e.contentType??"").toLowerCase().startsWith("application/json")?{status:415,message:"Expected content-type: application/json"}:null;import{WebSocketServer as Ox}from"ws";var Yp=new Set(["sync","issues:create","swimlane:create","swimlane:edit:title","swimlane:delete","swimlane:move","issues:move","issue:close","issue:reopen","issue:edit:title","issue:edit:description","issue:tag:add","issue:tag:remove","contributor:remove","tag:remove","issue:assignee:add","issue:assignee:remove","issue:comment:add","issue:comment:delete"]);var Xp=e=>{let t=Xt({exclude:e});return d(t)?[]:t.value.map(n=>({projectId:n.projectId,name:tr(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},Jp=e=>{let t=Xt();if(d(t))return i(t.message);let n=t.value.find(r=>r.root===e);return n?l("Resolved recent project",n.root):i(`Not a recent project: ${e}`)};import{z as w}from"zod";var Y=w.string().min(1),Qp=w.discriminatedUnion("at",[w.object({at:w.literal("start")}),w.object({at:w.literal("end")}),w.object({at:w.literal("before"),sibling:Y}),w.object({at:w.literal("after"),sibling:Y})]),co=w.number().finite(),oe=(e,t)=>w.object({type:w.literal(e),payload:t}),ti=e=>w.object({type:w.literal(e)}),Bx=w.discriminatedUnion("type",[ti("state:get"),ti("issues:list"),ti("sync"),ti("time-travel:live"),oe("project:open",w.object({root:w.string().min(1)})),oe("issues:create",w.object({title:w.string(),parentId:Y,description:w.string().optional(),tagNames:w.array(w.string()).optional()})),oe("swimlane:create",w.object({title:w.string(),boardId:Y})),oe("swimlane:edit:title",w.object({swimlaneId:Y,title:w.string()})),oe("swimlane:delete",w.object({swimlaneId:Y})),oe("swimlane:move",w.object({swimlaneId:Y,boardId:Y,position:Qp.optional()})),oe("issues:move",w.object({issueId:Y,parentId:Y,position:Qp.optional()})),oe("issue:edit:title",w.object({issueId:Y,title:w.string()})),oe("issue:edit:description",w.object({issueId:Y,description:w.string()})),oe("issue:tag:add",w.object({issueId:Y,tagName:w.string()})),oe("issue:tag:remove",w.object({issueId:Y,tagId:Y})),oe("contributor:remove",w.object({contributorId:Y})),oe("tag:remove",w.object({tagId:Y})),w.object({type:w.literal("contributors:get"),payload:w.object({boardId:Y.optional()}).optional()}),oe("issue:assignee:add",w.object({issueId:Y,assigneeId:Y.optional(),assigneeName:w.string().optional(),createUnlinked:w.boolean().optional()})),oe("issue:assignee:remove",w.object({issueId:Y,assigneeId:Y})),oe("issue:close",w.object({issueId:Y})),oe("issue:reopen",w.object({issueId:Y})),oe("issue:comment:add",w.object({issueId:Y,body:w.string()})),oe("issue:comment:delete",w.object({issueId:Y,commentId:Y})),oe("issue:comment:edit",w.object({issueId:Y,commentId:Y,body:w.string()})),oe("issue:get",w.object({issueId:Y})),w.object({type:w.literal("timeline:get"),payload:w.object({start:co.optional(),end:co.optional(),boardId:Y.optional(),requestId:w.number().finite().optional()}).optional()}),w.object({type:w.literal("commits:get"),payload:w.object({start:co.optional(),end:co.optional(),requestId:w.number().finite().optional()}).optional()}),oe("time-travel:scrub",w.object({targetTime:co})),oe("time-travel:checkout-event",w.object({eventId:w.string().min(1)})),oe("commit:inspect",w.object({sha:w.string()})),oe("commit:diff:get",w.object({sha:w.string()})),oe("issue:commits:get",w.object({issueId:Y}))]);var Zp=e=>{let t=Bx.safeParse(e);return t.success?{ok:!0,message:t.data}:{ok:!1,error:`Invalid message: ${t.error.issues.map(r=>`${r.path.join(".")||"<root>"}: ${r.message}`).join(", ")}`}};var Fx=e=>({...e,boards:(e.boards??[]).map(t=>({...t,swimlanes:(t.swimlanes??[]).map(n=>({...n,issues:(n.issues??[]).map(r=>({...r,description:""}))}))})),commentsByIssueId:Object.fromEntries(Object.entries(e.commentsByIssueId??{}).filter(([,t])=>t.length>0).map(([t,n])=>[t,n.map(r=>({...r,body:""}))])),attachmentsByIssueId:Object.fromEntries(Object.entries(e.attachmentsByIssueId??{}).filter(([,t])=>t.length>0))}),lo=e=>d(e)?e:l(e.message,Fx(e.value)),ef=(e,t)=>{let n=(e.boards??[]).flatMap(r=>r.swimlanes??[]).flatMap(r=>r.issues??[]).find(r=>r.id===t);return{issueId:t,description:n?.description??"",comments:e.commentsByIssueId?.[t]??[]}};var cd=()=>{Dn({type:"state",payload:lo(hr())})},Q=(e,t)=>{e.send(JSON.stringify(t))},uo=async(e,t)=>{let n=lo(await St({repoRoot:t}));return d(n)&&n.message===Oi?Q(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:Xp(t)}}):Q(e,{type:"state",payload:n})},Ux=async(e,t)=>{let n=()=>Q(e,{type:"state",payload:lo(hr())});if(ft().mode!=="live")return n();let r=await St({repoRoot:t});return ft().mode!=="live"?n():Q(e,{type:"state",payload:lo(r)})},Fe=async(e,t,n,r,o)=>{if(Q(e,{type:r,payload:o}),d(o))return Q(e,{type:"failed",payload:o.message});n(),Ux(e,t)},tf=(e,t,{onStateChanged:n,getPort:r})=>{new Ox({server:e,path:"/ws",verifyClient:s=>!dd(s.origin,r())}).on("connection",s=>{Yc(s),s.on("message",async a=>{let c=async u=>{let{type:m}=u,p=t.repoRoot;if(m==="project:open"){let f=Jp(u.payload.root);return Q(s,{type:"project:open:result",payload:f}),d(f)?void 0:(t.repoRoot=f.value,uo(s,f.value))}if(m==="timeline:get"){let{requestId:f,...g}=u.payload??{};return Q(s,{type:"timeline",requestId:f,payload:await op({repoRoot:p,...g})})}if(m==="issue:get"){let f=u.payload?.issueId,g=hr(),x=Mp(f);return Q(s,{type:"issue",payload:d(g)?g:l("Issue detail",{...ef(g.value,f),history:d(x)?[]:x.value})})}if(m==="commits:get"){let{requestId:f,...g}=u.payload??{};return Q(s,{type:"commits",requestId:f,payload:await rd({repoRoot:p,...g})})}if(m==="commit:inspect")return Q(s,{type:"commit:inspect:result",payload:await ap({repoRoot:p,sha:u.payload.sha})});if(m==="commit:diff:get"){let{sha:f}=u.payload;return Q(s,{type:"commit:diff:result",payload:{sha:f,result:await dp({repoRoot:p,sha:f})}})}if(m==="issue:commits:get"){let{issueId:f}=u.payload;return Q(s,{type:"issue:commits:result",payload:{issueId:f,result:await sp({repoRoot:p,ref:V(f)})}})}if(m==="time-travel:scrub"){let f=await od({repoRoot:p,targetTime:u.payload.targetTime});return Q(s,{type:"time-travel:result",payload:f}),d(f)?void 0:cd()}if(m==="time-travel:checkout-event"){let f=await lp({repoRoot:p,eventId:u.payload.eventId});return Q(s,{type:"time-travel:result",payload:f}),d(f)?void 0:cd()}if(m==="time-travel:live"){let f=await up({repoRoot:p});return Q(s,{type:"time-travel:result",payload:f}),d(f)?void 0:cd()}if(m==="state:get")return uo(s,p);if(m==="sync"){let f=await Js({repoRoot:p});return Q(s,{type:"sync:result",payload:f}),n(),uo(s,p)}if(m==="issue:comment:add"){let f=await Qs({repoRoot:p,...u.payload});return Fe(s,p,n,"issue:comment:add:result",f)}if(m==="issue:comment:edit"){let f=await jp({repoRoot:p,...u.payload});return Fe(s,p,n,"issue:comment:edit:result",f)}if(m==="issue:comment:delete"){let f=await Zs({repoRoot:p,...u.payload});return Q(s,{type:"issue:comment:delete:result",payload:f}),d(f)?Q(s,{type:"failed",payload:f.message}):(n(),uo(s,p))}if(m==="issue:edit:description"){let f=await Pp({repoRoot:p,...u.payload});return Fe(s,p,n,"issue:edit:description:result",f)}if(m==="issue:edit:title"){let f=await Lp({repoRoot:p,...u.payload});return Fe(s,p,n,"issue:edit:title:result",f)}if(m==="issue:tag:add"){let f=await kp({repoRoot:p,...u.payload});return Fe(s,p,n,"issue:tag:add:result",f)}if(m==="issue:tag:remove"){let f=await Bp({repoRoot:p,...u.payload});return Fe(s,p,n,"issue:tag:remove:result",f)}if(m==="contributor:remove"){let f=await Up({repoRoot:p,...u.payload});return Fe(s,p,n,"contributor:remove:result",f)}if(m==="tag:remove"){let f=await Dp({repoRoot:p,...u.payload});return Fe(s,p,n,"tag:remove:result",f)}if(m==="contributors:get")return Q(s,{type:"contributors",payload:await _p({repoRoot:p,...u.payload})});if(m==="issue:assignee:add"){let f=await Op({repoRoot:p,...u.payload});return Fe(s,p,n,"issue:assignee:add:result",f)}if(m==="issue:assignee:remove"){let f=await $p({repoRoot:p,...u.payload});return Fe(s,p,n,"issue:assignee:remove:result",f)}if(m==="issues:list")return Q(s,{type:"issues",payload:await Ip({repoRoot:p})});if(m==="issues:create"){let f=await Ep({...u.payload,repoRoot:p});return Q(s,{type:"issues:create:result",payload:f}),d(f)?Dn({type:"failed",payload:f.message}):(n(),uo(s,p))}if(m==="swimlane:create"){let f=await Rp({...u.payload,repoRoot:p});return Fe(s,p,n,"swimlane:create:result",f)}if(m==="swimlane:edit:title"){let f=await Ap({...u.payload,repoRoot:p});return Fe(s,p,n,"swimlane:edit:title:result",f)}if(m==="swimlane:delete"){let f=await wp({...u.payload,repoRoot:p});return Fe(s,p,n,"swimlane:delete:result",f)}if(m==="swimlane:move"){if(!u.payload.position)return Q(s,{type:"error",message:"Missing move position"});let f=await Tp({...u.payload,repoRoot:p});return Fe(s,p,n,"swimlane:move:result",f)}if(m==="issues:move"){if(!u.payload.position)return Q(s,{type:"error",message:"Missing move position"});let f=await Np({...u.payload,repoRoot:p});return Fe(s,p,n,"issues:move:result",f)}if(m==="issue:close"){let f=await Sp({repoRoot:p,issueId:u.payload.issueId});return Fe(s,p,n,"issue:close:result",f)}if(m==="issue:reopen"){let f=await Cp({repoRoot:p,issueId:u.payload.issueId});return Fe(s,p,n,"issue:reopen:result",f)}return Q(s,{type:"error",message:"Unknown message type"})};try{let u=Zp(JSON.parse(a.toString()));if(!u.ok)return Q(s,{type:"error",message:u.error});let m=u.message;return Yp.has(m.type)?await xn(async()=>ft().mode!=="live"?Q(s,{type:"failed",payload:"Read-only while viewing history"}):c(m)):await c(m)}catch(u){return Q(s,{type:"error",message:u instanceof Error?u.message:String(u)})}})})};var jx=Wn.dirname($x(import.meta.url)),Hx=process.env.IS_LOCAL==="true"?Wn.resolve(process.cwd(),"dist/gui"):Wn.join(jx,"gui"),ni,Wx=async()=>(ni===void 0&&(ni=await import("node:sea").catch(()=>null)),ni?.isSea()?ni:null),be=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},Gx=e=>be(e,409,{isError:!0,message:"Read-only while viewing history"}),ri=(e,t)=>xn(async()=>ft().mode!=="live"?Gx(e):t()),nf=async(e,t=1024*1024)=>new Promise((n,r)=>{let o=[],s=0;e.on("data",a=>{if(s+=a.length,s>t){e.destroy(),r(new Error("Request body too large"));return}o.push(a)}),e.on("end",()=>{let a=Buffer.concat(o).toString("utf8");try{n(a?JSON.parse(a):{})}catch{r(new Error("Invalid JSON body"))}}),e.on("error",r)}),Vx=2*1024*1024,Kx={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},zx=e=>e.endsWith(".html")?"text/html; charset=utf-8":e.endsWith(".js")?"text/javascript; charset=utf-8":e.endsWith(".css")?"text/css; charset=utf-8":e.endsWith(".json")?"application/json; charset=utf-8":e.endsWith(".ico")?"image/x-icon":"application/octet-stream",rf=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),r=Wn.resolve(Hx),o=Wn.resolve(r,n),s=Wn.relative(r,o);if(s.startsWith("..")||Wn.isAbsolute(s))return be(t,403,{isError:!0,message:"Forbidden"});let a=await Wx();try{let c=a?Buffer.from(a.getAsset(`gui/${s}`)):await of(o);return t.writeHead(200,{"content-type":zx(o)}),t.end(c)}catch{return be(t,404,{isError:!0,message:`Not found: ${n}`})}},qx=async(e,t=ao)=>new Promise((n,r)=>{let o=s=>{let a=u=>{if(e.off("listening",c),u.code==="EADDRINUSE"&&s===t){e.removeListener("error",a),o(0);return}r(u)},c=()=>{e.off("error",a);let u=e.address();if(!u||typeof u=="string"){r(new Error("Unable to resolve address"));return}n(u.port)};e.once("error",a),e.once("listening",c),e.listen(s,"127.0.0.1")};o(t)}),sf=async e=>{zm(!1);let t=0,n={repoRoot:e.repoRoot},r=_x.createServer(async(a,c)=>{let u=new URL(a.url??"/","http://127.0.0.1"),m=qp({method:a.method,origin:a.headers.origin,contentType:a.headers["content-type"]},t);if(m)return be(c,m.status,{isError:!0,message:m.message});if(a.method==="GET"&&u.pathname===id)return be(c,200,{app:ad,repoRoot:ei(n.repoRoot),version:$t,pid:process.pid});if(u.pathname==="/api/state")return be(c,200,await St({repoRoot:n.repoRoot}));if(a.method==="POST"&&u.pathname==="/api/comments")try{let p=await nf(a);if(!p.issueId||!p.body?.trim())return be(c,400,{isError:!0,message:"Missing issueId or body"});let f=p.issueId,g=p.body;return await ri(c,async()=>{let x=await Qs({repoRoot:n.repoRoot,issueId:f,body:g});return d(x)?be(c,400,{isError:!0,message:x.message}):be(c,200,await St({repoRoot:n.repoRoot}))})}catch(p){return be(c,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add comment"})}if(a.method==="POST"&&u.pathname==="/api/attachments")try{let p=await nf(a,Vx);if(!p.issueId||!p.dataBase64)return be(c,400,{isError:!0,message:"Missing issueId or dataBase64"});let f=p.issueId,g=p.dataBase64,x=p.name??"";return await ri(c,async()=>{let S=await Hp({repoRoot:n.repoRoot,issueId:f,name:x,dataBase64:g});return d(S)?be(c,400,{isError:!0,message:S.message}):be(c,200,{...await St({repoRoot:n.repoRoot}),attachment:S.value})})}catch(p){return be(c,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add attachment"})}if(a.method==="DELETE"&&u.pathname.startsWith("/api/attachments/")){let p=decodeURIComponent(u.pathname.replace("/api/attachments/",""));return p?ri(c,async()=>{let f=await Wp({repoRoot:n.repoRoot,attachmentId:p});return d(f)?be(c,400,{isError:!0,message:f.message}):be(c,200,await St({repoRoot:n.repoRoot}))}):be(c,400,{isError:!0,message:"Missing attachment id"})}if(a.method==="GET"&&u.pathname.startsWith("/media/")){let p=decodeURIComponent(u.pathname.replace("/media/","")),f=await Gp({repoRoot:n.repoRoot,fileName:p});if(d(f))return be(c,404,{isError:!0,message:f.message});try{let g=await of(f.value.filePath);return c.writeHead(200,{"content-type":Kx[f.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),c.end(g)}catch{return be(c,404,{isError:!0,message:"Attachment blob not found"})}}if(a.method==="DELETE"&&u.pathname.startsWith("/api/comments/")){let p=decodeURIComponent(u.pathname.replace("/api/comments/",""));return p?ri(c,async()=>{let f=await Zs({repoRoot:n.repoRoot,commentId:p});return d(f)?be(c,400,{isError:!0,message:f.message}):be(c,200,await St({repoRoot:n.repoRoot}))}):be(c,400,{isError:!0,message:"Missing comment id"})}return u.pathname.startsWith("/board/")?rf("/",c):rf(u.pathname,c)});try{t=await qx(r)}catch(a){return i(a instanceof Error?`Unable to start GUI server: ${a.message}`:`Unable to start GUI server: ${String(a)}`)}let o=zp({project:n});tf(r,n,{onStateChanged:()=>o.queueSync(),getPort:()=>t}),r.on("close",o.dispose);let s=r.address();return!s||typeof s=="string"?(r.close(),i("Unable to resolve GUI server address")):l("Started GUI server",{url:`http://epiq.localhost:${s.port}${e.boardId?`/board/${e.boardId}`:""}`,server:r})};var df=async e=>{let t=Kn({});if(d(t))return i(t.message);let n=wt();de(n)&&$e(n.value);let r=await Kp(ao);if(r&&r.repoRoot===ei(e.repoRoot)){let a=`http://127.0.0.1:${ao}`;return console.log(`Epiq GUI already running for this project at ${af.cyan(a)}`),Wi(a),l("Reused running GUI",{url:a})}let o=await sf({...e,boardId:""});if(d(o))return o;let{url:s}=o.value;return console.log(`Epiq GUI running at ${af.cyan(s)}`),Wi(s),l("Started GUI",{url:s})};import{Box as Cn}from"ink";import xe from"react";import{Box as ld,Text as mo}from"ink";import Ct,{useEffect as Yx,useMemo as Xx}from"react";import{ulid as Jx}from"ulid";var cf=({text:e,match:t,color:n,highlightColor:r=v.secondary,dimColor:o=!1})=>{if(!t)return Ct.createElement(mo,{color:n,dimColor:o},e);let s=e.toLowerCase(),a=t.toLowerCase(),c=s.indexOf(a);return c===-1?Ct.createElement(mo,{color:n,dimColor:o},e):Ct.createElement(mo,{color:n,dimColor:o},e.slice(0,c),Ct.createElement(mo,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},lf=Jx(),Qx=e=>`${e}`,Zx=e=>{let{pendingNavTarget:t}=gn();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(ve(b.NONE,{breadCrumb:n,contextNode:r,readOnly:h().readOnly,selectedNode:o}));return[...new Set(Object.values(b))].filter(a=>a!=="move").filter(a=>a.length>0).filter(a=>a!==b.PALETTE).map(a=>{let c=ys(a),u=_s.find(m=>m.intent===c);return{command:a,description:u?.description??`[${a}] Run command`,isAvailable:s.has(a)}}).filter(a=>a.command.toLowerCase().startsWith(e)||e.length>=2&&a.description.toLowerCase().includes(e)).sort((a,c)=>a.isAvailable!==c.isAvailable?a.isAvailable?-1:1:a.command.localeCompare(c.command))},eI=e=>le.text({id:lf,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),tI=(e,t,n)=>le.text({id:Qx(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),ud=[],nI=e=>{uf();let t=E.createNode(eI(h().rootNodeId));d(t)||!sn(t.value)||(ud=[t.value,...e.map((n,r)=>tI(n,r,lf)).map(E.createNode).filter(de).map(({value:n})=>n).filter(sn)],D.navigate({contextNode:t.value,selectedIndex:0}))},uf=()=>{let e=ud.map(t=>t.id);ud=[];for(let t of e)E.deleteNode(t)};function mf({width:e,height:t}){let r=au().value.trim().toLowerCase(),o=Xx(()=>Zx(r),[r]);Yx(()=>(nI(o),()=>{uf()}),[o]);let s=h().selectedIndex;return Ct.createElement(ld,{flexDirection:"column",width:e,height:t-2},Ct.createElement(mt,{height:t-4,itemHeight:3,selectedIndex:s},o.map((a,c)=>{let u=c===s,m=a.isAvailable?v.accent:v.secondary2,p=a.isAvailable?"":"[unavailable] ";return Ct.createElement(ld,{key:a.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:v.secondary,borderStyle:"single"},Ct.createElement(mo,{color:m,dimColor:!a.isAvailable},u?"\u276F ":" ",Ct.createElement(cf,{text:hc(a.command),match:r,color:m,dimColor:!a.isAvailable})),Ct.createElement(ld,{paddingLeft:2},Ct.createElement(cf,{text:p+a.description,match:r.length>=2?r:"",color:u&&a.isAvailable?v.primary:v.secondary2,dimColor:!a.isAvailable})))})))}import{Box as bI}from"ink";import ii from"react";import fo from"chalk";import{Box as md,Text as pf}from"ink";import po,{useEffect as rI,useMemo as oI,useState as sI}from"react";var ff=fo.hex(v.secondary),iI=fo.inverse,aI=fo.inverse.hex(v.secondary2),dI={hint:"",hints:[],overlap:0,remainder:""},hf=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},cI=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=se(t);return{bg:r=>fo.bgHex(n).black(r),bgCursor:r=>fo.bgHex(n).inverse.black(r)}}return ba(t)},lI=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=hf({value:e,command:t});if(!r)return null;let s=e.slice(r.end).match(/^\s*/)?.[0].length??0,a=r.end+s;return e.slice(a,a+n.length)!==n?null:{start:a,end:a+n.length}},gf=()=>({value:We.value,cursorPosition:We.cursorPosition,commandIsPending:We.commandIsPending,autoCompletion:We.commandMeta.autoCompletion??dI,infoMessage:We.commandMeta.infoMessage,validationStatus:We.commandMeta.validity,command:We.commandMeta.command,inputString:We.commandMeta.inputString,modifier:We.commandMeta.modifier}),uI=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,vf=({width:e,mode:t})=>{let[n,r]=sI(gf());rI(()=>{let S=()=>{let C=gf();r(R=>uI(R,C)?R:C)},T=Sa(S);return S(),()=>{T()}},[]);let{value:o,cursorPosition:s,infoMessage:a,commandIsPending:c,autoCompletion:u,command:m,modifier:p,validationStatus:f}=n,g=c&&f===Ft.Invalid,x=oI(()=>{let S=Math.max(0,Math.min(s,o.length)),T=hf({value:o,command:m}),C=lI({value:o,command:m,modifier:p}),R=m?ba(m):null,L=cI({command:m,modifier:p}),$=(Be,Ee)=>{let Nn=T&&Ee>=T.start&&Ee<T.end,xr=C&&Ee>=C.start&&Ee<C.end;return Nn&&R?R.fg(Be):xr&&L?L.bg(Be):Be},G=(Be,Ee)=>{let Nn=T&&Ee>=T.start&&Ee<T.end,xr=C&&Ee>=C.start&&Ee<C.end;return Nn&&R?R.fgCursor(Be):xr&&L?L.bgCursor(Be):iI(Be)},P=o.slice(0,S),U=o[S]??" ",H=S<o.length?o.slice(S+1):"",tt=Array.from(P).map((Be,Ee)=>$(Be,Ee)).join(""),Ue=G(U,S),De=Array.from(H).map((Be,Ee)=>$(Be,S+1+Ee)).join("");if(u.hint){let Be=u.hint[u.overlap]??U;Ue=aI(Be),De=ff(u.remainder.slice(1)+H)}return ff(t===y.PALETTE?"?":":")+tt+Ue+De},[o,s,u,m,p]);return po.createElement(md,{flexDirection:"column",justifyContent:"flex-start"},po.createElement(md,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},po.createElement(md,null,po.createElement(pf,null,x),a&&po.createElement(pf,{wrap:"truncate",color:g?v.red:v.secondary2},` ${a} `))))};import{Box as mI,Text as pI}from"ink";import yf from"react";var fI=(e,t)=>{let n=[],r=0;for(let o of e){let a=(n.length>0?" | ":"").length+o.length;if(r+a>t-4)break;n.push(o),r+=a}return n},bf=({width:e,availableHints:t})=>{let n=fI(t,e).join(" | ");return yf.createElement(mI,{width:e,borderStyle:"round",borderColor:v.secondary,paddingX:1},yf.createElement(pI,{color:v.secondary2},n.length?n:"\xA0"))};import{Box as gI,Text as oi}from"ink";import go,{useEffect as hI,useRef as vr,useState as vI}from"react";var yI=40,si=.3,pd="\u2500",xf=1,If=16,Ef=({width:e})=>{let{replay:t}=q(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),a=s*xf,[c,u]=vI(0),m=vr(r);m.current=r;let p=vr(0),f=vr(0),g=vr(0),x=vr(0),S=vr(0);if(hI(()=>{if(!n){p.current=0,g.current=0,x.current=0,S.current=0,u(0);return}p.current=m.current,f.current=Date.now(),g.current=m.current;let $=setInterval(()=>{let G=Date.now(),P=m.current;if(P!==g.current){let De=P-g.current,Be=G-f.current;if(De<0)x.current=0,S.current=0;else if(De>0&&Be>0){let Ee=De/Be;x.current=x.current===0?Ee:x.current*(1-si)+Ee*si,S.current=S.current===0?De:S.current*(1-si)+De*si}p.current=P,f.current=G,g.current=P}let U=G-f.current,H=Math.min(S.current,x.current*U),tt=Math.min(1,p.current+H),Ue=Math.round(tt*a);u(De=>De===Ue?De:Ue)},yI);return()=>clearInterval($)},[n,a]),!t)return null;let T=$=>{let G=s>1?$/(s-1):0,P=Math.round(G*(If-1))/(If-1);return us(P)},C=Math.min(s,Math.floor(c/xf)),R=[];for(let $=0;$<C;$++){let G=T($),P=R[R.length-1];P&&P.color===G?P.text+=pd:R.push({text:pd,color:G})}let L=pd.repeat(Math.max(0,s-C));return go.createElement(gI,{width:e,borderStyle:"round",borderColor:v.secondary,paddingX:1,columnGap:1},go.createElement(oi,{color:v.secondary2},"\u25B6"),go.createElement(oi,null,R.map(($,G)=>go.createElement(oi,{key:G,color:$.color},$.text)),go.createElement(oi,{color:v.secondary,dimColor:!0},L)))};var ho=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=q(),o=t===y.COMMAND_LINE||t===y.PALETTE;return ii.createElement(bI,null,o?ii.createElement(vf,{width:e,mode:t}):r==="replay"?ii.createElement(Ef,{width:e}):ii.createElement(bf,{width:e,mode:t,availableHints:n}))};import{Box as In,Text as yr}from"ink";import Xe,{useEffect as xI,useMemo as II}from"react";import{ulid as Sf}from"ulid";var di=Sf(),EI=()=>[...new Set([...h().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),r=t?.replace("[",""),o=n?.trim();return[r,o]}).filter(e=>e[0]!==void 0&&e[1]!==void 0).sort(([e],[t])=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(([e,t])=>({keys:e,action:t})),SI=e=>le.text({id:di,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),CI=(e,t,n)=>le.text({id:Sf(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),ai=[],Cf=()=>{let e=ai.filter(n=>n.id!==di).map(n=>n.id),t=ai.filter(n=>n.id===di).map(n=>n.id);ai=[];for(let n of[...e,...t])E.deleteNode(n)},NI=e=>{Cf();let t=E.createNode(SI(h().rootNodeId));if(d(t)||!sn(t.value))return logger.error("Could not attach help nodes");ai=[t.value,...e.map((n,r)=>CI(n,r,di)).map(E.createNode).filter(de).map(({value:n})=>n).filter(sn)],D.navigate({contextNode:t.value,selectedIndex:0})},Nf=({width:e,height:t})=>{let n=II(()=>EI(),[]);xI(()=>(NI(n),()=>{Cf()}),[n]);let r=h().selectedIndex;return Xe.createElement(In,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,height:t-2},Xe.createElement(In,{paddingX:1,justifyContent:"center"},Xe.createElement(yr,{color:v.accent},"Help"),Xe.createElement(yr,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Xe.createElement(In,{paddingX:1,marginTop:1},Xe.createElement(In,{width:20,justifyContent:"flex-end"},Xe.createElement(yr,{color:v.secondary},"Key(s)")),Xe.createElement(In,{flexGrow:1,width:40,paddingLeft:2},Xe.createElement(yr,{color:v.secondary},"Action"))),Xe.createElement(mt,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},a)=>{let c=a===r;return Xe.createElement(In,{paddingX:1,key:`${o}-${s}-${a}`,flexDirection:"row"},Xe.createElement(In,{width:20,justifyContent:"flex-end"},Xe.createElement(yr,{color:v.accent},o)),Xe.createElement(In,{flexGrow:1,width:40,paddingLeft:2},Xe.createElement(yr,{color:c?v.primary:v.secondary2},s)))})))};import RI from"chalk";import{Box as Gn,Text as ke}from"ink";import ae from"react";var AI=8,TI=()=>{let e=Xt({exclude:process.cwd()});return d(e)?[]:e.value.slice(0,AI)},Rf=({width:e,height:t})=>{let n=TI();return ae.createElement(Gn,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},ae.createElement(ke,{color:v.accent,bold:!0},"Initialize project"),ae.createElement(ke,null,`This folder is not an ${RI.hex(v.accent)("epiq")} project yet.`),ae.createElement(ke,{color:v.primary},"To start tracking issues here, we need to initialize a new",ae.createElement(ke,{color:v.primary,backgroundColor:v.secondary}," .epiq/project.json "),"file in this repository."),ae.createElement(Gn,{marginTop:1,flexDirection:"column"},ae.createElement(Gn,null,ae.createElement(ke,{color:v.accent}," "),ae.createElement(ke,{color:v.primary},"Type "),ae.createElement(ke,{backgroundColor:v.secondary}," :init "))),ae.createElement(Gn,{marginTop:1},ae.createElement(ke,{color:v.secondary2},"This will create, commit and push "),ae.createElement(ke,{color:v.primary,backgroundColor:v.secondary}," .epiq/project.json ")),n.length>0&&ae.createElement(Gn,{marginTop:1,flexDirection:"column"},ae.createElement(ke,{color:v.accent,bold:!0},"Or open a recent project"),n.map((r,o)=>ae.createElement(Gn,{key:r.projectId},ae.createElement(ke,{color:v.accent},` ${o+1} `),ae.createElement(ke,{color:v.primary},tr(r.root)),ae.createElement(ke,{color:v.secondary2},` ${r.root}`))),ae.createElement(Gn,{marginTop:1},ae.createElement(ke,{color:v.accent}," "),ae.createElement(ke,{color:v.primary},"Type "),ae.createElement(ke,{backgroundColor:v.secondary}," :open 1 "),ae.createElement(ke,{color:v.secondary2}," or "),ae.createElement(ke,{backgroundColor:v.secondary}," :open <path> "))))};import{Box as ci,Text as jt}from"ink";import Oe from"react";var wI=({isDone:e,command:t,value:n})=>Oe.createElement(ci,null,Oe.createElement(jt,{color:v.accent,dimColor:e},e?" \u2714 ":" "),Oe.createElement(jt,{dimColor:e},"Type "),Oe.createElement(jt,{backgroundColor:v.secondary,dimColor:e}," "+t+" "),n!==void 0&&Oe.createElement(Oe.Fragment,null,Oe.createElement(jt,{dimColor:e}," "),Oe.createElement(jt,{color:v.secondary,dimColor:e},"<"+n+">"))),MI=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function fd({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:a,isSetAutoSync:c}=cn(),u=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:s,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:a,message:"Almost there. Configure auto sync."}],m=u.findIndex(f=>!f.done),p=m===-1?void 0:u[m];return Oe.createElement(ci,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},Oe.createElement(jt,{color:v.accent,bold:!0},"Welcome! \u{1F539}"),Oe.createElement(jt,null,"Let's get you started - it's a breeze."),Oe.createElement(jt,{color:v.secondary2},"Remember - you can always search available commands by typing:",Oe.createElement(jt,{color:v.accent}," ? ")),p&&Oe.createElement(jt,{color:v.secondary2},p.message),Oe.createElement(ci,{flexDirection:"column"},u.map((f,g)=>m===-1||g<=m?Oe.createElement(ci,{key:f.key,marginBottom:1},Oe.createElement(wI,{isDone:f.done,command:f.command,value:f.done?MI(f.value):void 0})):null)))}import fi from"chalk";import{Box as yo,Text as br}from"ink";import Ae from"react";import{Box as li,Text as Af}from"ink";import En from"react";import PI from"chalk";var LI=e=>(E.getTag(e)?.name??"").length+3,kI=e=>{let t=E.getContributor(e);return(t?t.name:"").length+3},Tf=({width:e})=>{let{viewMode:t}=Z(),n=q(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:a}=n,c=a[o.id]?.[s],u=en(c?.id??o.id,"TICKET"),m=de(u)?u.value:void 0,p=(m?.props.tags??[]).filter(P=>E.getTag(P)),f=m?.props.assignees??[],g=m?.parentNodeId?!Za(o.id,m.parentNodeId)&&t==="dense":!1,x=r.map((P,U)=>{let H=U===r.length-1,tt=ee(P.id),Ue=H?tt?.[s]?.title:void 0;return`${U?" / ":""}${P.title??""}${Ue?` \u25B8 ${Ue}`:""}`}).join(""),S=m?E.getCommentsByIssue(m.id):[],T=S.length?String(S.length).length+11:0,C=g?p.reduce((P,U)=>P+LI(U),0)+f.reduce((P,U)=>P+kI(U),0)+T:0,R=c?.id!=null&&!(t==="wide"&&M(c)),L=Math.max(0,e-C),$=x.substring(0,L)+(R?PI.hex(v.secondary2).dim(` ${V(c.id)}`):""),G=g?[...p.map(P=>En.createElement(li,{key:`tag-${P}`,paddingLeft:1},En.createElement(ar,{id:P}))),...f.map(P=>En.createElement(li,{key:`assignee-${P}`,paddingLeft:1},En.createElement(mn,{id:P}))),S.length?En.createElement(li,{key:"comments",paddingLeft:1},En.createElement(Af,{color:v.accent},"[",S.length," comment",S.length===1?"":"s","]")):null]:[];return En.createElement(li,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},En.createElement(Af,{color:v.secondary2},$),G)};import{Box as DI,Text as wf}from"ink";import ui from"react";var BI=({filters:e})=>ui.createElement(DI,{columnGap:1},ui.createElement(wf,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>ui.createElement(wf,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Mf=ui.memo(BI);import{Box as FI,Text as mi}from"ink";import vo from"react";function Pf(){let{eventLog:e,unappliedEvents:t}=q(),n=e.at(-1)?.id,r=Bo(n??""),o=de(r)?Cs(r.value):"INVALID DATE";return vo.createElement(FI,{paddingLeft:1},vo.createElement(mi,{backgroundColor:v.accent,color:v.secondary}," Readonly "),vo.createElement(mi,{color:v.accent}," "+t.length+" edits ago at "+o+"."),vo.createElement(mi,{color:v.accent}," Resume with "),vo.createElement(mi,{backgroundColor:v.accent,color:v.secondary}," ",":peek now"," "))}import{Box as OI,Text as gd}from"ink";import pi from"react";function Lf(){let{replay:e}=q();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return pi.createElement(OI,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},pi.createElement(gd,{backgroundColor:v.accent,color:v.secondary}," \u25B6 REPLAY "),pi.createElement(gd,{color:v.secondary2},Cs(new Date(r))),pi.createElement(gd,{color:v.accent},`${t}/${n} edits`))}import hd from"chalk";import{Box as UI,Text as kf}from"ink";import vd,{useEffect as _I,useState as $I}from"react";var jI=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],HI=150,Df=12,WI=.36,Bf=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},GI=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},VI=(e,t,n)=>{let r=Bf(e),o=Bf(t);return GI({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},KI=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,s=e[r],a=e[Math.min(r+1,e.length-1)];return VI(s,a,o)};function Ff({syncStatus:e,autoSync:t}){let[n,r]=$I(0);_I(()=>{if(e.status!=="syncing"){r(0);return}let c=0,u=setInterval(()=>{c+=1;let m=(Math.sin(c*WI)+1)/2,p=Math.round(m*(Df-1));r(f=>f===p?f:p)},HI);return()=>clearInterval(u)},[e.status]);let o={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},a={synced:v.secondary2,failed:v.yellow,offline:v.secondary2,pending:v.secondary2,syncing:KI(jI,n/(Df-1))??""}[e.status];return vd.createElement(UI,null,vd.createElement(kf,null,hd.hex(v.secondary2).dim(t?"Sync (auto): ":"Sync: ")),vd.createElement(kf,null,hd.hex(a)("\u25CF")+hd.hex(v.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import jf from"chalk";import{Text as Hf}from"ink";import Wf,{useEffect as XI,useState as JI}from"react";import yd from"chalk";var zI="https://registry.npmjs.org/epiq/latest",bd=null,Of=0,qI=1e3*60*60*24,Uf=e=>e.replace(/^v/,""),YI=(e,t)=>{let n=Uf(e).split(".").map(Number),r=Uf(t).split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let s=n[o]??0,a=r[o]??0;if(s>a)return 1;if(s<a)return-1}return 0},_f=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(bd&&Date.now()-Of<qI)return bd;try{let t=await fetch(zI);if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.status}`);let r=(await t.json()).version??null,o={current:e,latest:r,updateAvailable:r?YI(r,e)>0:!1};return bd=o,Of=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},$f=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,a)=>s!=n[a]);return r.map((s,a)=>a>=o?yd.hex(v.accent).dim(s):yd.hex(v.secondary).dim(s)).join(yd.hex(v.secondary2).dim("."))};function Gf(){let[e,t]=JI({current:$t,latest:null,updateAvailable:!1});return XI(()=>{let n=!0;return _f($t).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?Wf.createElement(Hf,{dimColor:!0,color:v.secondary2},$t+" "):Wf.createElement(Hf,null,jf.hex(v.secondary2).dim($t),jf.hex(v.accent).dim(" \u2197 "),$f($t,e.latest))}function bo({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=q(),{userName:a,preferredEditor:c,autoSync:u}=Z(),m=64,p=process.stdout.columns-m-8,f=t||n==="replay",g=s?ut(s.currentLabel,Math.max(0,p)):"";return Ae.createElement(yo,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?Ae.createElement(yo,{paddingLeft:1},Ae.createElement(br,{color:v.secondary2},g)):f?Ae.createElement(br,null," "):o===y.PALETTE?Ae.createElement(yo,null,Ae.createElement(br,{color:v.accent},"Command Palette"),Ae.createElement(br,{dimColor:!0,color:v.secondary2}," ","- search, select and press enter")):Ae.createElement(yo,{paddingLeft:1},e.length>0?Ae.createElement(Mf,{filters:e}):Ae.createElement(Tf,{width:p})),n==="live"?Ae.createElement(yo,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},Ae.createElement(Ff,{autoSync:!!u,syncStatus:r}),Ae.createElement(br,null,fi.hex(v.secondary2).dim("Mode: ")+fi.hex(v.secondary2).dim(o.padEnd(8," "))," "),Ae.createElement(Vf,{icon:"@",value:a}),Ae.createElement(Vf,{icon:"\u276F",value:c}),Ae.createElement(Gf,null)):"",n==="peek"?Ae.createElement(Pf,null):"",n==="replay"?Ae.createElement(Lf,null):"")}function Vf({icon:e,value:t}){return Ae.createElement(br,null,fi.dim(e)+fi.hex(v.accent)(` ${t??"-"} `))}import{Box as QI,Text as ZI}from"ink";import xo from"react";import{Box as gi,Text as xd}from"ink";import Sn from"react";function Id(){let e=q(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,a=t?.id?J(t?.id):[];return Sn.createElement(gi,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:s},Sn.createElement(gi,{padding:1,paddingTop:0,paddingBottom:0},Sn.createElement(xd,null,"Select a board:")),Sn.createElement(gi,{padding:1,flexDirection:"column"},a.map((c,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,f=J(c.id).flatMap(({id:g})=>ee(g)).length;return Sn.createElement(gi,{key:c.id??u},Sn.createElement(xd,{color:m?v.accent:v.secondary2},Sn.createElement(Ge,{isSelected:m})),Sn.createElement(xd,{color:m?v.accent:v.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var eE=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:a})=>{let{renderedChildrenIndex:c}=q(),u=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return xo.createElement(QI,{flexDirection:"row"},e.context==="WORKSPACE"?xo.createElement(Id,null):u?xo.createElement(As,{height:f,width:a,swimlanes:(c[u.id]??[]).filter(g=>g!==void 0&&Mt(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):xo.createElement(ZI,null))},Kf=xo.memo(eE);import{useEffect as tE}from"react";var nE=e=>{tE(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:a}=Z();a&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:u}=h();u==="default"&&!c&&rs(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},zf=({autoSync:e})=>(nE(e),null);function Ed({width:e,height:t}){let n=q(),{autoSync:r,viewMode:o}=dc(),s=n.filters;if(n.mode===y.HELP)return xe.createElement(Cn,{flexDirection:"column"},xe.createElement(Nf,{width:e,height:t}));if(n.mode===y.PALETTE)return xe.createElement(Cn,{flexDirection:"column"},xe.createElement(bo,{filters:s}),xe.createElement(mf,{width:e,height:t-2}),xe.createElement(ho,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:a}=cn(),c=!a,u=a&&!n.hasProjectDefinition;if(c)return xe.createElement(Cn,{flexDirection:"column"},xe.createElement(Cn,{flexDirection:"column"},xe.createElement(bo,{hideBreadCrumb:!0,filters:s}),xe.createElement(fd,{height:t,width:e})),xe.createElement(ho,{width:e,mode:n.mode,availableHints:n.availableHints}));if(u)return xe.createElement(Cn,{flexDirection:"column"},xe.createElement(Cn,{flexDirection:"column"},xe.createElement(bo,{hideBreadCrumb:!0,filters:s}),xe.createElement(Rf,{height:t,width:e})),xe.createElement(ho,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=ze(n.breadCrumb??[],"BOARD");if(de(m)){let p=m.value.id,f=J(p).length,g=3,x=Math.floor(e/g),S=Math.floor(e/Math.max(f,1));e=Math.min(S,x)*Math.max(f,g)}return xe.createElement(Cn,{flexDirection:"column"},xe.createElement(zf,{autoSync:r}),xe.createElement(Cn,{flexDirection:"column"},xe.createElement(bo,{filters:s}),xe.createElement(Kf,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),xe.createElement(ho,{width:e,mode:n.mode,availableHints:n.availableHints}))}import rE from"readline";var hi,vi,Ht,oE=new Set([I.MoveCursorLeft,I.EraseInputWord,I.MoveCursorLeftOfWord,I.MoveCursorRight,I.MoveCursorRightOfWord,I.NavToPreviousContainer,I.NavToNextContainer,I.NavPreviousItem,I.NavNextItem,I.SetViewDense,I.SetViewWide,I.Confirm,I.Exit,I.Yank,I.InitCommandLine,I.InitCommandPalette,I.ExitCommandLine,I.CaptureInput,I.EraseInput,I.EraseInputWord,I.HideHelp,I.ViewHelp,I.SetViewDense,I.SetViewWide,I.GetLastCommandFromHistory,I.GetNextCommandFromHistory,I.AutoCompleteCommand]),sE=new Set([I.NavPreviousItem,I.NavNextItem,I.NavToPreviousContainer,I.NavToNextContainer,I.Confirm,I.Exit,I.InitCommandPalette,I.InitMove,I.MoveNextItem,I.MovePreviousItem,I.MoveToNextContainer,I.MoveToPreviousContainer,I.Delete,I.AddItem,I.EditTitle,I.EditDescription,I.ConfirmMove,I.Edit,I.ViewHelp,I.Yank]),qf=async e=>{if(e.ctrl&&e.name==="c")return D.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=h(),s=du(e,n);if(!s||r&&!oE.has(s)||o==="replay"&&n===y.DEFAULT&&sE.has(s))return;let a=t[n]?.[s];if(a?.action)try{await a.action(a,e)}catch(c){logger.error(c)}},iE=()=>async function(t,n){n.name!=="escape"&&(Ht&&(clearTimeout(Ht),Ht=void 0),await qf(n))},aE=()=>async function(t){if(t.length===1&&t[0]===27){Ht&&clearTimeout(Ht),Ht=setTimeout(()=>{qf({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Ht=void 0},25);return}Ht&&(clearTimeout(Ht),Ht=void 0)};function Yf(){hi&&process.stdin.removeListener("keypress",hi),vi&&process.stdin.removeListener("data",vi),hi=iE(),vi=aE(),rE.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",vi),process.stdin.on("keypress",hi)}async function Xf(){try{let e=Kn({});if(d(e))return kt(0,e.message);let t=wt();de(t)&&$e(t.value);let n=_e(process.cwd()),r=de(n)?await Ds(n.value):um();if(d(r))return r;let o=Sd();return d(o)?kt(6,o.message):(Yf(),l("Booted Epiq",void 0))}catch(e){return kt(0,Jo(e))}}zu();var uE=`${Nt.bold("Epiq CLI")}
74
+ `,ud.writeFileSync(t,n,"utf8"),K.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var Cx=async e=>{let t=await $({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},ie=(e,t)=>a(`[${e}] ${t}`),$m=async()=>{z("");let e=Uo(),t=await bt(process.cwd());if(d(t))return ie(1,t.message);let n=t.value,r=await jo(n);if(d(r))return ie(2,r.message);if(r.value)return ie(2,`Cannot initialize Epiq while a git operation is in progress: ${r.value}`);let o=await Cx(n);if(d(o))return ie(2.5,o.message);if(o.value)return ie(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(jr(n))return ie(4,"Epiq project already initialized");let s=bn();if(!s.isSetupDone||!s.userName)return ie(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let i=Z(),c=i.userName,u=i.userId;if(!u||!c)return ie(5,"Missing Epiq user id");let m=await Ol(n);if(d(m))return ie(6,m.message);let p=e.stateBranch,f=await Ho({repoRoot:n,branch:p});if(d(f))return ie(6,f.message);if(f.value)return ie(6,`State branch already exists: ${p}`);let v=await Ca({repoRoot:n,stateBranchName:p});if(d(v))return ie(6,v.message);let N=Vo();if(d(N))return ie(7,N.message);let C=_m.join(Go(),e.projectId),I=await Kn({repoRoot:n,stateBranchRoot:C,stateBranchName:p});if(d(I))return ie(8,I.message);let S=_m.join(C,".epiq");Sx.mkdirSync(S,{recursive:!0});let A=Tl({userId:u,userName:c});if(d(A))return ie(9,A.message);for(let Di of A.value){let Kd=ss({event:Di,rootDir:C});if(d(Kd))return ie(9,Kd.message)}let B=await ps({stateBranchRoot:C,eventFileName:Hn({userId:u,userName:c})});if(d(B))return ie(10,B.message);let M=await ir({cwd:C,message:"[epiq:init]"});if(d(M))return ie(10,M.message);let L=await Um(n);if(d(L))return ie(11,L.message);let k=qd({repoRoot:n,fileContents:e});if(d(k))return ie(12,k.message);let Ie=await xe.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(Ie))return ie(13,Ie.message);let _e=await xe.commit({cwd:n,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(d(_e))return ie(13,_e.message);let ct="Project initialized!",Qe=await $({cwd:n,args:["push","-u","origin","HEAD"]});d(Qe)&&(ct+=` Warn: [init:14] ${Qe.message}`);let Be=await eo({repoRoot:n,stateBranchRoot:C});d(Be)&&(ct+=` Warn: [init:15] ${Be.message}`);let Se=xt(A.value).filter(d);if(Se.length>0)return ie(16,Se.map(Di=>Di.message).join(`
75
+ `));let Bn=rt();if(d(Bn))return ie(16,Bn.message);let{rootNodeId:kr,nodes:jg}=Bn.value,Vd=jg[kr];return Vd?(F.navigate({contextNode:Vd,selectedIndex:0}),R({hasProjectDefinition:!0,mode:y.DEFAULT}),l(ct,null)):ie(16,"Unable to resolve initialized root node")};import{ulid as Rx}from"ulid";import{ulid as Nx}from"ulid";var jm=null,An=()=>structuredClone(jm),vo=e=>{jm=e},Hm=()=>{let{contextNode:e,selectedIndex:t}=g(),r=ee(e.id)[t];return r?l("Resolved selected child",r):a("Target node not found")},md=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ee(t).filter(o=>o.id!==e);return is(r,n)},Wm=({id:e,parentId:t,position:n={at:"end"}})=>{let r=ge();if(d(r))return a("Unable to resolve user ID");let o=md({parentId:t,id:e,position:n});return d(o)?o:l("Created pending move state",{id:Nx(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Gm=e=>{vo(e);let t=pn(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function pd(e){let t=Hm();if(d(t))return t;let{contextNode:n,nodes:r}=g();if(!n.parentNodeId)return a("Missing parent node id");let o=r[n.parentNodeId];if(!o)return a("Missing parent node");let s=ee(o.id),i=s.findIndex(({id:m})=>m===n.id);if(i<0)return a("Current node not found among siblings");let c=s[i+e];if(!c)return a("Missing sibling node");let u=Wm({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:Gm(u.value)}function fd(e){let t=Hm();if(d(t))return t;let{contextNode:n,selectedIndex:r}=g(),s=ee(n.id)[r+e];if(!s)return a("Missing sibling node");let i=Wm({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return d(i)?i:Gm(i.value)}var Vm=()=>{let e=An();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,r=g().nodes[n];if(!r)return a("Move parent not found");let o=ee(n).findIndex(s=>s.id===t);return o===-1?a("Moved node not found among rendered children"):(F.navigate({contextNode:r,selectedIndex:o}),l("Synchronized navigation to moved node",null))},Vs=(e,t="Moved preview")=>{if(d(e))return e;let n=Vm();return d(n)?n:(R({mode:y.MOVE}),l(t,null))},Km=async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{modifier:t}=ne().commandMeta,{contextNode:n,selectedIndex:r}=g(),o=ee(n.id)[r];if(!o)return R({mode:y.DEFAULT}),a("No move target");if(t==="start"){if(o.readonly)return a("Target node is read-only");if(r===-1)return a("No item selected");if(!o.parentNodeId)return a("Target has no parent");let s=ee(o.parentNodeId),i=s.findIndex(({id:f})=>f===o.id);if(i===-1)return a("Target not found among siblings");let c=s[i-1],u=s[i+1],m=u!=null?{at:"before",sibling:u.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},p=md({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(vo({id:Rx(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),R({mode:y.MOVE}),l("Move initialized",null))}if(t==="next")return Vs(fd(1));if(t==="previous")return Vs(fd(-1));if(t==="to-next")return Vs(pd(1));if(t==="to-previous")return Vs(pd(-1));if(t==="confirm"){let s=An();if(!s)return a("No pending move to confirm");let i=await Mt();if(d(i))return i;let c=_([s],i.value);if(d(c))return c;let u=Vm();return d(u)?u:(vo(null),R({mode:y.DEFAULT}),l("Moved item",null))}return t==="cancel"?(vo(null),R({mode:y.DEFAULT}),l("Cancelling move",null)):a("Invalid move modifier")};import{ulid as zs}from"ulid";import{monotonicFactory as Ax,ulid as Tx}from"ulid";var wx=Ax(),Ks=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let s=wx();return l("Created issue events",[{id:Tx(),userId:r,userName:o,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])};var zm=async(e,t)=>{let n=ge();if(d(n))return a("Unable to resolve user ID");let r=await Mt();if(d(r))return r;let o=r.value;if(!t.inputString)return a(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:c}=g(),u=m=>{let p=_([m],o);if(d(p))return p;let f=E.getNode(p.value[0].result.id);if(!f)return a("Created node not found");if(!f.parentNodeId)return p;let v=E.getNode(f.parentNodeId);return v?(F.navigate({contextNode:v,selectedIndex:E.getSiblings(f.parentNodeId).findIndex(({id:N})=>N===f.id)}),p):a("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=g(),p=E.getNode(m);if(!p)return a("Workspace not found");let f=Gn(p.id,n.value,o);return d(f)?f:u({id:zs(),action:"add.board",payload:{id:zs(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=qe(s,"BOARD");if(d(m))return a("Unable to add swimlane in this context");let p=Gn(m.value.id,n.value,o);return d(p)?p:u({id:zs(),action:"add.swimlane",payload:{id:zs(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=J(i.id)[c],p=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let B=qe(s,"SWIMLANE");return d(B)?null:B.value})();if(!p)return a("Unable to add issue in this context");let f=Gn(p.id,n.value,o);if(d(f))return f;let v=Ks({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(d(v))return v;let N=v.value,C=_([...N],o);if(d(C))return C;if(!C.value[0])return a("Issue creation failed");let A=N.find(B=>B.action==="add.issue")?.payload.id;return A?(F.navigate({contextNode:p,selectedIndex:E.getSiblings(p.id).findIndex(({id:B})=>B===A)}),l("Issue created",null)):a("Unable to determine ticket id")}return l("Success",null)};import Mx from"node:os";import Ym from"node:path";var qs=async e=>{let t=Ce({repoRoot:e});if(d(t))return Bt(3,t.message);let n=await Kn({repoRoot:e,stateBranchRoot:t.value,stateBranchName:Uo().stateBranch});if(d(n))return Bt(3,n.message);let r=await $({cwd:t.value,args:["pull","--ff-only"]});d(r)&&logger.info(3,r.message);let o=Zt(t.value);if(d(o))return Bt(3,o.message);let{events:s,unreadable:i}=o.value,c=en(s,i);if(d(c))return Bt(4,c.message);R({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let u=bs({root:e});return d(u)&&logger.info(u.message),l("Loaded project",void 0)},qm=()=>{let e=en([]);return d(e)?Bt(4,e.message):(R({hasProjectDefinition:!1,hasInitializingEvents:!1}),l("Booted without a project",void 0))};var Px=e=>e==="~"||e.startsWith("~/")?Ym.join(Mx.homedir(),e.slice(1)):e,Lx=(e,t)=>{let n=e.trim();if(!n)return a("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):a(`No recent project #${n}`)}let r=$e(Ym.resolve(Px(n)));return d(r)?a(`No epiq project at ${n}`):l("Resolved project path",r.value)},Xm=async()=>{let e=Ps();if(z(""),g().hasProjectDefinition)return a("Already in a project; run epiq from another directory");let t=nn({exclude:process.cwd()}),n=d(t)?[]:t.value,r=Lx(e,n);if(d(r))return a(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(c){return a(`Unable to enter ${o}: ${c instanceof Error?c.message:String(c)}`)}let i=await qs(o);return d(i)?(process.chdir(s),a(i.message)):l(`Opened ${fr(o)}`,null)};var Ys=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=g(),s=rs(n,t);if(d(s))return a(s.message);let{appliedEvents:i,unappliedEvents:c}=s.value,u=Ct();if(d(u))return u;let m=xt(i),{fatal:p,skipped:f}=Xt(m);if(p.length>0)return Ct(),R(o),a(p.map(N=>N.message).join(", "));Jt(f);let v=g().nodes[e];return v?(F.navigate({contextNode:v,selectedIndex:r}),l("",{unappliedEvents:c})):(Ct(),R(o),a("Board did not exist at that date"))};var Jm=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 kx=20,Dx=16,Bx=150,Xs=null,Js=null;var Zn=()=>{Xs!==null&&(clearInterval(Xs),Xs=null),Js!==null&&(clearTimeout(Js),Js=null)},Qm=()=>{Zn(),R({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Zm=({events:e,startTime:t,durationMs:n})=>{Zn();let r=e.length,o=cr(e.map(f=>lr(f))).map(f=>f??t),s=o[r-1]??Date.now(),i=Jm(o),c=Math.max(1,Math.round(n*kx/1e3)),u=Math.max(Math.round(n/c),Dx),m=0,p=0;R({mode:y.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Xs=setInterval(()=>{m++;let f=m/c,v=[],N,C;for(;p<r&&i[p]<=f;){let S=e[p],A=pn(S);if(d(A)){if(qr(A)){p++;continue}Qm();return}v.push(...ma(S)),N=S,C=o[p],p++}if(p>=r||m>=c){for(;p<r;p++){let A=pn(e[p]);if(d(A)&&!qr(A))break}let S=g().replay;R({unappliedEvents:[],replay:S&&{...S,progress:1,appliedCount:r}}),Zn(),Js=setTimeout(Qm,Bx);return}let I=g().replay;R({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:N?C??I?.currentTime??t:I?.currentTime??t,currentLabel:N?Qs(N):I?.currentLabel??"",flashNodeIds:N?[...new Set(v)]:I?.flashNodeIds??[]}})},u)};var ep=async()=>{let e=qe(g().breadCrumb,"BOARD");if(d(e))return e;let t=await bt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Ce({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=ne().commandMeta;if(Zn(),r==="now"){let c=vn(n.value);if(d(c))return a(c.message);let u=Ct();if(d(u))return u;let m=xt(c.value),{fatal:p,skipped:f}=Xt(m);return p.length>0?a(p.map(v=>v.message).join(", ")):(Jt(f),R({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),l("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let c=os(n.value);if(d(c))return c;let u=r==="prev"?g().eventLog.at(-1):g().unappliedEvents.at(0),m=u===void 0?null:lr(u),p=(u===void 0?null:c.value.get(u.id)??null)??(m===null?null:ia(m));if(p===null)return a(r==="prev"?"No previous event to peek":"No next event to peek");s=r==="prev"?p:p+1}else{let c=zn(r||o.trim());if(!c)return a("Invalid peek date");s=c.getTime()}let i=Ys({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return d(i)?i:(R({mode:y.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),l("Peeking",!0))};var tp=async()=>{let e=qe(g().breadCrumb,"BOARD");if(d(e))return e;let t=await bt(process.cwd());if(d(t))return a("Unable to locate repo root");let n=Ce({repoRoot:t.value});if(d(n))return n;let{modifier:r,inputString:o}=ne().commandMeta,{dateInput:s,durationInput:i}=Ss(r,o);if(Zn(),g().syncStatus.status==="syncing")return a("Cannot replay while syncing, try again in a moment");let c=zn(s);if(!c)return a("Invalid replay date");let u=i?Es(i):15e3;if(u===null)return a("Invalid replay duration (try e.g. 30s or 2m)");let m=c.getTime(),p=g(),f=Ys({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(d(f))return f;let{unappliedEvents:v}=f.value;return v.length===0?(Ct(),R(p),l("Nothing to replay from that point",!0)):(Zm({events:v,startTime:m,durationMs:u}),l("Replaying board history",!0))};import Ox from"zod";var np=()=>{let e=ne().commandMeta.inputString,t=Ox.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return a("Auto sync duration must be a number of at least 3000 ms");let n=mt({autoSyncDebounceMs:t.data});return d(n)?n:(je({autoSyncIntervalMs:t.data}),R({mode:y.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var rp=()=>{let e=ne().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=su(e),n=mt({autoSync:t});return d(n)?n:(je({autoSync:t}),R({mode:y.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var op=()=>{let e=ne().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=mt({logLevel:e});return d(n)?n:(je({logLevel:e}),R({mode:y.DEFAULT}),l(`Auto sync set to "${e}"`,null))};import{spawn as Ux}from"node:child_process";var _x=()=>{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"]}}},sp=async e=>new Promise(t=>{let{command:n,args:r}=_x();try{let o=Ux(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(a(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?l("Copied to clipboard",null):a(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(a(`Clipboard tool not available (${n})`))}});var yo=async(e,t)=>{if(!e.trim())return a(`Nothing to copy: ${t} is empty`);let n=await sp(e);return d(n)?n:l(`Copied ${t} to clipboard`,null)},ip=async e=>{let{breadCrumb:t,selectedNode:n}=g(),r=oo({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return a("Nothing selected to copy from");switch(e.modifier){case Re.REF:return yo(V(o.id),"ref");case Re.TITLE:return yo(o.title,"title");case Re.DESCRIPTION:return r?yo(r.props?.description??"","description"):a("No issue in scope");case Re.TAGS:{if(!r)return a("No issue in scope");let s=xn(r).map(({name:i})=>i);return yo(s.join(", "),"tags")}case Re.ASSIGNEES:{if(!r)return a("No issue in scope");let s=In(r).map(({name:i})=>i);return yo(s.join(", "),"assignees")}default:return a("Yank one of: ref, title, description, tags, assignees")}};var ap=async()=>{z(""),R({mode:y.DEFAULT});let e=rt();if(d(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");R({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await hs();return d(t)?(R({syncStatus:{msg:t.message,status:"failed"}}),t):(R({mode:y.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var $x=e=>e.action==="add.issue.comment",dp=()=>{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)}))},sn=async()=>{let e=await Mt();return d(e)?e:l("Resolved persist root",e.value)},Zs=[{systemOnly:!0,intent:O.Move,description:"Internal move-state command",mode:y.COMMAND_LINE,action:Km},{intent:O.Delete,description:"Delete the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=J(t.id)[n];if(!r)return a("Unable to resolve child to delete");let o=await sn();if(d(o))return o;if(r.context==="COMMENT"){let s=r.id,i=P(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let c=g().nodes[i];if(!c||!P(c))return a("Unable to resolve comment issue");let u=c.log?.filter($x).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?a("You can only delete your own comments"):_([{id:ze(),action:"delete.issue.comment",payload:{id:s,issue:i},...e.value}],o.value):a("Unable to resolve comment")}return _([{id:ze(),action:"delete.node",payload:{id:r.id},...e.value}],o.value)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:y.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ne().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(i=>he(b.FILTER).map(c=>c.split(n)[0]).includes(i))(r))return a("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return Ne(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:y.DEFAULT})),l("Filter updated",null)}},{intent:O.ViewHelp,description:"Open the help screen",mode:y.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=g();return Rn({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),R({mode:y.HELP}),l("Viewing help",null)}},{intent:O.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=J(t.id)[n];if(!r)return a("Unable to close issue, no target found");if(!P(r))return a("Cannot close in this context");let o=g().nodes[Ee];if(!o)return a("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return a("Issue is already closed");let s=await sn();if(d(s))return s;let i=s.value,c=yn(o.id,r.id,{at:"end"},e.value,i);if(d(c))return c;let u=_([{id:ze(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...e.value}],i);return d(u)?u:l("Issue closed",null)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:y.COMMAND_LINE,action:async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=J(t.id)[n];if(!r)return a("Unable to reopen issue, no target found");let o=r.context==="TICKET"?l("Resolved ticket",r):an(r.id,"TICKET");if(d(o))return a("Cannot reopen in this context");let s=o.value,i=g().nodes[Ee];if(!i)return a("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return a("Issue is not closed");if(!P(s))return a("Target node is not issue");let c=Hs(s);if(!c)return a("Unable to resolve previous parent from issue history");if(c===i.id)return a("Previous parent resolves to closed swimlane");let u=g().nodes[c];if(!u)return a("Previous parent no longer exists");let m=await sn();if(d(m))return m;let p=m.value,f=yn(u.id,s.id,{at:"end"},e.value,p);if(d(f))return f;let v=_([{id:ze(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:f.value},...e.value}],p);return d(v)?v:l("Issue reopened",null)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.Init,description:"Initialize Epiq in the current git repository",mode:y.COMMAND_LINE,action:$m},{intent:O.OpenProject,description:"Open a recently used epiq project, by number or path",mode:y.COMMAND_LINE,action:Xm,onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.NewItem,description:"Create a new board, swimlane, or issue",mode:y.COMMAND_LINE,action:zm,onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.Rename,description:"Rename the currently selected node",mode:y.COMMAND_LINE,action:async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),r=J(t.id)[n];if(!r)return a("Missing node");if(r.readonly)return a("Cannot rename readonly node");let o=Ps();if(!o)return a("Provide a title");let s=await sn();return d(s)?s:_([{id:ze(),action:"edit.title",payload:{id:r.id,name:o},...e.value}],s.value)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.UntagTicket,description:"Remove a tag from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let o=E.findTagByName(r);if(!o)return a(`Tag "${r}" does not exist`);let{selectedNode:s}=g();if(!s)return a("Invalid untag target");let i=an(s.id,"TICKET");if(d(i))return a("Unable to untag issue in this context");let c=i.value;if(!P(c))return a("Target node is not issue");if(!(c.props.tags??[]).includes(o.id))return a("Issue is not tagged with that tag");let m=await sn();return d(m)?m:_([{id:ze(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...e.value}],m.value)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.TagTicket,description:"Add or create a tag on the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let{selectedNode:o}=g();if(!o)return a("Invalid tag target");let s=an(o.id,"TICKET");if(d(s))return a("Unable to tag issue in this context");let i=s.value;if(!P(i))return a("Target node is not issue");let c=await sn();if(d(c))return c;let u=E.findTagByName(r),m=u?.id??ze();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):_([...u?[]:[{id:ze(),action:"create.tag",payload:{id:m,name:r},...e.value}],{id:ze(),action:"add.issue.tag",payload:{id:i.id,tag:m},...e.value}],c.value)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.AssignUserToTicket,description:"Assign a user to the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return a("Provide an assignee");let{selectedIndex:i,contextNode:c}=g(),u=J(c.id)[i];if(!u)return a("Invalid assign target");let m=an(u.id,"TICKET");if(d(m))return a("Unable to assign issue in this context");let p=m.value;if(!P(p))return a("Target node is not issue");let f=await sn();if(d(f))return f;let v=dp(),N=!o&&s.toLowerCase()==="me",C,I;if(N)C=e.value.userId,I=v.find(B=>B.id===C)?.name??e.value.userName;else{let B=v.filter(L=>L.name===s);if(B.length>1)return a(`"${s}" matches ${B.length} contributors (${B.map(L=>L.id).join(", ")}). Assign from the GUI to choose by id.`);let M=B[0];if(!M&&!o)return a(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);C=M?.id??ze(),I=M?.name??s}if((p.props.assignees??[]).includes(C))return a("Assignee already assigned");let A=!!g().contributors[C];return _([...A?[]:[{id:ze(),action:"create.contributor",payload:{id:C,name:I},...e.value}],{id:ze(),action:"add.issue.assignee",payload:{id:p.id,assignee:C},...e.value}],f.value)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:y.COMMAND_LINE,action:async()=>{let e=ge();if(d(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=ne().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee to remove");let{selectedNode:o}=g();if(!o)return a("Invalid unassign target");let s=an(o.id,"TICKET");if(d(s))return a("Unable to unassign in this context");let i=s.value;if(!P(i))return a("Target node is not issue");let c=i.props.assignees??[],u=r.toLowerCase()==="me",m=u?c.filter(v=>v===e.value.userId):dp().filter(v=>v.name===r&&c.includes(v.id)).map(v=>v.id);if(m.length>1)return a(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return a(u?"Issue is not assigned to you":`Issue is not assigned to "${r}"`);let f=await sn();return d(f)?f:_([{id:ze(),action:"remove.issue.assignee",payload:{id:i.id,assignee:p},...e.value}],f.value)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.Comment,description:"Add a comment to the selected issue",mode:y.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return a("Provide a comment");if(n.length>4e3)return a(`Cannot exceed ${4e3} characters`);let r=ge();if(d(r))return a("Unable to resolve user ID");let{breadCrumb:o,selectedNode:s}=g(),i=qe([...o,s],"TICKET");if(d(i))return a("Edit target must be an issue");let c=i.value;if(!c)return a("Invalid comment target");let u=c.context==="TICKET"?l("Resolved ticket",c):an(c.id,"TICKET");if(d(u))return a("Unable to comment on issue in this context");let m=u.value;if(!P(m))return a("Target node is not issue");let p=await sn();return d(p)?p:_([{id:ze(),action:"add.issue.comment",payload:{id:ze(),issue:m.id,author:r.value.userId,md:n},...r.value}],p.value)},onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.Sync,description:"Pull, commit, and push Epiq state",mode:y.COMMAND_LINE,action:ap},{intent:O.Peek,description:"View board state at another point in time",mode:y.COMMAND_LINE,action:ep},{intent:O.Replay,description:"Replay board history forward from a point in time",mode:y.COMMAND_LINE,action:tp},{intent:O.Export,description:"Export the current board layout to markdown",mode:y.COMMAND_LINE,action:async()=>{let e=await Tm();return d(e)?e:(R({mode:y.DEFAULT}),l("Export successful",!0))}},{intent:O.Exit,description:"Exit the application",mode:y.COMMAND_LINE,action:async()=>(F.exit(),l("Exit successful",!0))},{intent:O.Edit,description:"Edit title or description",mode:y.COMMAND_LINE,action:async(e,t)=>Om(t),onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:y.COMMAND_LINE,action:async(e,t)=>ip(t),onSuccess:()=>R({mode:y.DEFAULT})},{intent:O.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:y.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case me.USERNAME:{if(process.env[zt])return a(`Cannot change the configured user while ${zt} names this process`);let r=dr();if(d(r))return r;let{userId:o,preferredEditor:s,userName:i}=r.value,c=n||i,u=o||ze();if(!c||!u)return a("Unable to resolve user name or id");let m=mt({userName:c,userId:u,preferredEditor:s??""});return d(m)?m:(je({userName:c,userId:u}),R({mode:y.DEFAULT}),l(`Username set to "${c}"`,null))}case me.EDITOR:{if(!n)return a("No editor provided");let r=mt({preferredEditor:n});return d(r)?r:(je({preferredEditor:n}),R({mode:y.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case me.VIEW:{if(n!=="wide"&&n!=="dense")return a("Invalid view mode");let r=mt({viewMode:n});return d(r)?r:(je({viewMode:n}),R({mode:y.DEFAULT}),l(`View set to "${n}"`,null))}case me.AUTOSYNC:return rp();case me.LOG_LEVEL:return op();case me.SYNC_DEBOUNCE_MS:return np();case me.ATTACHMENT_MAX_KB:return bu();default:return a("Unknown config command")}}},{intent:O.Coffee,description:"Sponsor the development of Epiq!",mode:y.COMMAND_LINE,action:()=>{let e=ne().commandMeta.modifier;return e==="custom"?ho("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):ho(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),z(""),l("Thanks you!",null)}}];var jx=new Set(["peek","replay","filter","view-help","yank"]),Ht=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ne();if(!t)return a("No command to confirm");if(!e&&n===_t.Invalid)return a("Invalid command");let s=Ls(t);_u();let{readOnly:i}=g();if(i&&!jx.has(s))return lo({status:dn.Fail,message:"Command not available in readonly state",value:null});let c=Zs.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!c)return lo({status:dn.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return lo({status:dn.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?lo(u):($u({addToHistory:!e}),c.onSuccess?.(),Z().autoSync&&vs(),u)};var ei=[{intent:x.Exit,mode:y.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(R({mode:y.COMMAND_LINE}),z("move cancel"),Ht({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:y.DEFAULT,description:"[m] move (init/confirm)",action:()=>(R({mode:y.COMMAND_LINE}),z("move start"),Ht({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:y.MOVE,action:()=>(R({mode:y.COMMAND_LINE}),z("move confirm"),Ht({isForceExecutedBySystem:!0}))}],ti=[{intent:x.MovePreviousItem,mode:y.MOVE,action:()=>An()?(R({mode:y.COMMAND_LINE}),z("move previous"),Ht({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveNextItem,mode:y.MOVE,action:()=>An()?(R({mode:y.COMMAND_LINE}),z("move next"),Ht({isForceExecutedBySystem:!0})):a("No pending move")}],cp=[{intent:x.MoveToNextContainer,mode:y.MOVE,action:()=>An()?(R({mode:y.COMMAND_LINE}),z("move to-next"),Ht({isForceExecutedBySystem:!0})):a("No pending move")},{intent:x.MoveToPreviousContainer,mode:y.MOVE,action:()=>An()?(R({mode:y.COMMAND_LINE}),z("move to-previous"),Ht({isForceExecutedBySystem:!0})):a("No pending move")}];var lp={[U.WORKSPACE]:[...ei,...ti],[U.BOARD]:[...ei,...ti],[U.SWIMLANE]:[...ei,...ti,...cp],[U.TICKET]:[],[U.FIELD]:[],[U.FIELD_LIST]:[],[U.TEXT]:[],[U.COMMENT]:[]};import Hx from"node:fs";import Wx from"node:path";var up=e=>{let t=$e(process.cwd());if(d(t))return a("Unable to resolve project root");let n=Ce({repoRoot:t.value});if(d(n))return a(n.message);let r=hr(e.hash,e.ext),o=Wx.join($r(n.value),r);return Hx.existsSync(o)?(ho(o),l(`Opened ${e.name}`,null)):a("Attachment file not found \u2014 run :sync to fetch it")};var mp=()=>{z("");let{pendingNavTarget:e}=Nn();R({mode:y.DEFAULT}),e&&F.navigate(e),Rn({pendingNavTarget:void 0})},pp=[{intent:x.ExitCommandLine,mode:y.HELP,action:()=>(mp(),l("Exiting help",null))},{intent:x.Exit,mode:y.HELP,action:()=>(mp(),l("Closed help",null))},{intent:x.NavPreviousItem,mode:y.HELP,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),l("Navigating to previous help item",null))},{intent:x.NavNextItem,mode:y.HELP,action:()=>(F.navigateToNextItem(),l("Navigating to next help item",null))},{intent:x.NavToPreviousContainer,mode:y.HELP,action:()=>(F.navigateToPreviousContainer(),l("Navigating to previous help container",null))},{intent:x.NavToNextContainer,mode:y.HELP,action:()=>(F.navigateToNextContainer(),l("Navigating to next help container",null))}];var Gx=e=>{R({mode:y.COMMAND_LINE});let{pendingNavTarget:t}=Nn();t&&F.navigate(t),Rn({pendingNavTarget:void 0}),z(`${e} `)},fp=()=>{z("");let{pendingNavTarget:e}=Nn();e&&F.navigate(e),Rn({pendingNavTarget:void 0}),R({mode:y.DEFAULT})},gp=[{intent:x.InitCommandPalette,mode:y.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{z("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=g();return Rn({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),R({mode:y.PALETTE}),l("Opening command palette",null)}},{intent:x.Confirm,mode:y.PALETTE,action:()=>{let{selectedNode:e}=g();if(!e||!mn(e))return a("Command only applicable on text nodes");if(e.props.disabled)return a("Command is not available in this context");let t=e.title;return t?(Gx(t),l("Selected command",t)):l("No command selected",null)}},{intent:x.ExitCommandLine,mode:y.PALETTE,action:()=>(fp(),l("Exiting palette",null))},{intent:x.Exit,mode:y.PALETTE,action:()=>(fp(),l("Closed command palette",null))},{intent:x.NavPreviousItem,mode:y.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:x.NavNextItem,mode:y.PALETTE,action:()=>(F.navigateToNextItem(),l("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:y.PALETTE,action:()=>(F.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:y.PALETTE,action:()=>(F.navigateToNextContainer(),l("Navigating to next container",null))}];var hp=[...pp,...gp,{intent:x.AddItem,mode:y.DEFAULT,description:"[n] new...",action:()=>(R({mode:y.COMMAND_LINE}),z(`${b.NEW} `),l("Adding new item",null))},{intent:x.Delete,mode:y.DEFAULT,description:"[d] delete",action:()=>(R({mode:y.COMMAND_LINE}),z(`${b.DELETE} `),l("Deleting item",null))},{intent:x.InitCommandLine,mode:y.DEFAULT,description:"[:] focus command line",action:()=>(R({mode:y.COMMAND_LINE}),z(""),l("Entering command line mode",null))},{intent:x.Confirm,mode:y.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=g();if(!ee(e?.id??"")?.length){let r=e?E.getAttachment(e.id):void 0;if(r)return up(r);if(e?.title===ce.DESCRIPTION)return R({mode:y.COMMAND_LINE}),z(`${b.EDIT} description `),l("Propose command",!0);if(e?.title===ce.ASSIGNEES)return R({mode:y.COMMAND_LINE}),z(`${b.ASSIGN} `),l("Propose command",!0);if(e?.title===ce.TAGS)return R({mode:y.COMMAND_LINE}),z(`${b.TAG} `),l("Propose command",!0);if(t.title===ce.DESCRIPTION&&e?.context==="TEXT")return R({mode:y.COMMAND_LINE}),z(`${b.EDIT} description `),l("Propose command",!0)}return F.enterChildNode(),l("Entering context",null)}},{intent:x.Yank,mode:y.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=g(),t=e?.title===ce.DESCRIPTION?Re.DESCRIPTION:e?.title===ce.TAGS?Re.TAGS:e?.title===ce.ASSIGNEES?Re.ASSIGNEES:Re.REF,r=he(b.YANK).includes(t)?t:Re.REF;return R({mode:y.COMMAND_LINE}),z(`${b.YANK} ${r}`),l("Propose command",!0)}},{intent:x.EditTitle,mode:y.DEFAULT,description:"[r] rename title",action:()=>(R({mode:y.COMMAND_LINE}),z(`${b.EDIT} title ${g().selectedNode?.title}`),l("Exiting context",null))},{intent:x.EditDescription,mode:y.DEFAULT,description:"[e] edit description",action:()=>(R({mode:y.COMMAND_LINE}),z(`${b.EDIT} description `),l("Exiting context",null))},{intent:x.Exit,mode:y.DEFAULT,description:"[q] exit context",action:()=>(F.enterParentNode(),l("Exiting context",null))},{intent:x.NavPreviousItem,mode:y.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:x.NavNextItem,mode:y.DEFAULT,action:()=>(F.navigateToNextItem(),l("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:y.DEFAULT,action:()=>(F.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:y.DEFAULT,action:()=>(F.navigateToNextContainer(),l("Navigating to next container",null))}];var Vx=500,Kx=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),vp=e=>{let t=Kx(e);t&&Ms(n=>(n+t).slice(0,Vx))};var zx=[y.COMMAND_LINE,y.PALETTE],qx=e=>[{intent:x.MoveCursorLeft,mode:e,action:()=>(Ga(-1),l("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:e,action:()=>(Ga(1),l("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:e,action:()=>(Va("left"),l("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:e,action:()=>(Va("right"),l("Moving cursor right of word",null))},{intent:x.AutoCompleteCommand,mode:e,action:()=>(Ms((t,{remainder:n})=>{let r=n?t+n:t,o="";return r==="edit title "&&(o=g().selectedNode?.title??""),r+o}),l("Auto-completing command",null))},{intent:x.CaptureInput,mode:e,action:(t,{sequence:n})=>(vp(n??""),l("Capturing input",null))},{intent:x.EraseInput,mode:e,action:()=>(Ou(),l("Erasing input",null))},{intent:x.EraseInputWord,mode:e,action:()=>(Uu(),l("Erasing input word",null))}],yp=[{intent:x.Confirm,mode:y.COMMAND_LINE,action:()=>(Ht(),l("Executing command",null))},{intent:x.ViewHelp,mode:y.DEFAULT,action:()=>(R({mode:y.HELP}),l("Viewing help",null))},...zx.flatMap(qx),{intent:x.ExitCommandLine,mode:y.COMMAND_LINE,action:()=>(R({mode:y.DEFAULT}),l("Exiting command line",null))},{intent:x.GetLastCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(ju(),l("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(Hu(),l("Getting next command from history",null))}];import Ip from"chalk";var ni=Ip.dim.hex(h.secondary2)(": for command line"),bp="q to exit",xp=`${Ip.hex(h.accent)("m")} to confirm`,gd={[U.WORKSPACE]:[ni],[U.BOARD]:[ni],[U.BOARD+y.COMMAND_LINE]:[ni],[U.SWIMLANE]:[ni],[U.TICKET+y.HELP]:[bp],[U.SWIMLANE+y.HELP]:[bp],[U.TICKET]:[],[U.FIELD]:[],[U.SWIMLANE+y.MOVE]:[xp],[U.TICKET+y.MOVE]:[xp]};function Ep(e,t,n){let r=t[e];if(!r)return a("buildBreadCrumb(): current node not found");let o=[],s=new Set,i=r;for(;i&&!s.has(i.id)&&(o.push(i),s.add(i.id),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let c=o[o.length-1];return!c||c.id!==n?a("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var Sp=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t};var Wt,hd,vd=new Set,yd=()=>{for(let e of vd)e()},Xx=e=>(vd.add(e),()=>vd.delete(e));function bd(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return a("derive(): contextNodeId is missing");if(!r)return a("derive(): rootNode is missing");if(!o[r])return a("derive(): unable to find root node");let c=o[t];if(!c)return a("Unable to derive state, contextNode not found");let u=Ep(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,f=gd[p+n]??gd[p]??[],v=[...hp,...lp[p]??[],...yp],N=Sp(v),C=Jx(o,s),I=C[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,contextNode:c,breadCrumb:m,availableHints:f,availableActions:v,actionIndex:N,selectedNode:I,renderedChildrenIndex:C})}var g=()=>{if(!Wt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Wt},rt=()=>Wt?l("Retrieved state",Wt):a("State not initialized. Call initWorkspaceState() first.");function Yr(e){hd=e;let t=$e(process.cwd()),n=!1;if(!d(t)){let s=Tt(t.value);if(d(s))return a(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:y.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=bd(r);return d(o)?o:(Wt=o.value,yd(),l("State initialized",null))}var er=!1,bo=null;function Ne(e){let t=g(),n=e(t);if(er)return bo=n,Wt={...t,...n},l("State updated",null);let r=bd(n);return d(r)?a(r.message??"Unable to update state"):(Wt=r.value,yd(),l("State updated",null))}function Kc(e){if(er)return l("Joined batch",e());er=!0,bo=null;let t=()=>{let n=bo;if(er=!1,bo=null,n===null)return null;let r=bd(n);return d(r)?a(r.message??"Unable to update state"):(Wt=r.value,yd(),l("State updated",null))};try{let n=e(),r=t();return r&&d(r)?a(r.message):l("State updated",n)}finally{er&&t()}}var xl=()=>er,R=e=>Ne(t=>({...t,...e}));function tr(e,t,n){if(!er)return Ne(i=>({...i,[e]:{...i[e]??{},[t]:n}}));let r=g(),o=r[e]??{};o[t]=n;let s={...r,[e]:o};return bo=s,Wt={...r,...s},l("State updated",null)}var q=()=>Yx(Xx,g,g),Jx=hl,J=e=>g()?.renderedChildrenIndex[e]??[],Ct=()=>hd?Yr(hd):a("Cannot reset state: no initial workspace found"),ft=()=>Wt!==void 0;var an=(e,t)=>{let{nodes:n}=g(),r=n[e];if(!r)return a("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 a(`No ancestor found for context: ${t}`)},xd=(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},Tn=(e,t)=>e?e.readonly?a({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:a("Node not found"),E={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.userId&&n.userId!==t)return a("Contributor is already linked to another user");let r={...n,userId:t},o=Ne(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to link contributor to user"):l("Linked contributor to user",r)},deleteNode(e){Ne(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create comment, missing issue");if(!P(t))return a("Can only comment on issues");let n=tr("comments",e.id,{...e,deleted:!1});return d(n)?a("Unable to create comment"):l("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return a("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return a("Unable to edit comment, missing issue");if(!P(r))return a("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=tr("comments",e,o);return d(s)?a("Unable to edit comment"):l("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return a("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=tr("comments",e,n);return d(r)?a("Unable to delete comment"):l("Deleted comment",n)},getComment(e){return g().comments?.[e]},getCommentsByIssue(e){return Object.values(g().comments??{}).filter(t=>t.issue===e&&!t.deleted)},getCommentsGroupedByIssue(){let e=new Map;for(let t of Object.values(g().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 a("Unable to create attachment, missing issue");if(!P(t))return a("Can only attach to issues");let n=Ne(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return d(n)?a("Unable to create attachment"):l("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return a("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=Ne(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return d(r)?a("Unable to delete attachment"):l("Deleted attachment",n)},getAttachment(e){return g().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(g().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},getAttachmentsGroupedByIssue(){let e=new Map;for(let t of Object.values(g().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}=g(),r=n[e];if(!r)return a("Edit target node not found");let o=Tn(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 a("Rename target node not found");let r=Tn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),l("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 ee(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 a("Node not found");if(!s)return a("Target parent not found");if(r===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let i=Tn(o,"move");if(i)return i;if(xd(t,e))return a("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=g(),o=this.getNode(e);if(!o)return a("Node not found");if(r===e)return a("Cannot delete root node");let s=Tn(o,"delete");if(s)return s;let i=new Set,c=m=>{let p=t[m];if(!(!p||i.has(m))){i.add(m);for(let f of ee(p.id))c(f.id)}};c(e);let u={...structuredClone(t)};for(let m of i){if(!u[m])return a("Unable to locate node to delete");u[m]={...u[m],isDeleted:!0}}return n?(R({nodes:u}),l("Successfully tomb stoned",o)):a("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return a("Contributor not found");let n={...t,name:Yo,tombstoned:!0},r=Ne(o=>({...o,contributors:{...o.contributors,[e]:n}}));return d(r)?a("Unable to remove contributor"):l("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.tombstoned)return a("Cannot rename a removed contributor");let r={...n,name:t},o=Ne(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to rename contributor"):l("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return a("Contributor not found");let r={...n,name:t,tombstoned:!1},o=Ne(s=>({...s,contributors:{...s.contributors,[e]:r}}));return d(o)?a("Unable to restore contributor"):l("Restored contributor",r)},createContributor(e){let t=Ne(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?a("Unable to create contributor"):l("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!r)return a("Unable to assign contributor, missing target");let o=Tn(r,"edit");if(o)return o;if(!P(r))return a("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return a("Contributor already assigned");let i={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(i),l("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!r)return a("Unable to unassign, missing target");let o=Tn(r,"edit");if(o)return o;if(!P(r))return a("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 i={...r,props:{...r.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(i),l("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!r)return a("Unable to add tag, missing target");let o=Tn(r,"edit");if(o)return o;if(!P(r))return a("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return a("Tag already assigned");let i={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(i),l("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),r=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!r)return a("Unable to remove tag, missing target");let o=Tn(r,"edit");if(o)return o;if(!P(r))return a("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 i={...r,props:{...r.props,tags:s.filter(c=>c!==t)}};return this.updateNode(i),l("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return a("Tag not found");let n={...t,tombstoned:!0},r=Ne(o=>({...o,tags:{...o.tags,[e]:n}}));return d(r)?a("Unable to delete tag"):l("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return a("Tag not found");let r={...n,name:t,tombstoned:!1},o=Ne(s=>({...s,tags:{...s.tags,[e]:r}}));return d(o)?a("Unable to restore tag"):l("Restored tag",r)},createTag(e){let t=Ne(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?a("Could not create tag"):l("Tag created",e)},createNode(e){let t=tr("nodes",e.id,e);return d(t)?a("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return a("Failed to locate node");let n={...t,readonly:!0},r=tr("nodes",e,n);return d(r)?a(r.message):l("Locked node",n)},updateNode(e){let t=tr("nodes",e.id,e);return d(t)?t:l("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 ee(e)}};var Qx=(e,t)=>e+" ".repeat(Math.max(0,t-Cp(e))),Zx=(e,t)=>" ".repeat(Math.max(0,t-Cp(e)))+e,ri=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`),eI=(e,t)=>t?e<t?"up":e>t?"down":null:null,tI=(e,t)=>{let n=E.getNode(e.payload.parent),r=n?wn.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=eI(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},Np=e=>`${Math.max(1,Math.round(e/1024))} KB`,Rp=e=>E.getAttachment(e)?.name??"",nI=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?wn.bgHex(se(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?wn.bgHex(se(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?wn.hex(se(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?wn.hex(se(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}" ${wn.dim(`(${Np(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Rp(e.payload.id);return t?`"${t}"`:""}default:return""}},rI=e=>{let t=Cr(tt(e));return wn.gray(Zx(t,8))},oI=12,sI=e=>Qx(`${e}`,oI),iI=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=E.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${Np(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Rp(e.payload.id);return t?`"${t}"`:""}default:return""}},Qs=e=>[ri(e.action),iI(e)].filter(Boolean).join(" "),Ap=(e,t)=>{let n=rI(e.id),r=sI(e.userName),o=wn.dim("\u203A"),s=e.action==="move.node"?tI(e,t):[ri(e.action),nI(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var aI=e=>Me(e,"comments"),dI=e=>Me(e,"description"),cI=e=>Me(e,"assignees"),lI=e=>Me(e,"tags"),uI=e=>Me(e,"history"),mI=e=>Me(e,"attachments"),oi=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=E.getNode(e);if(!c){let p=E.createNode({...le.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:i});return d(p)?p:l("Virtual field created",void 0)}if(!st(c))return a(`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!==i))return l("Virtual field unchanged",void 0);let m=E.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:i});return d(m)?m:l("Virtual field updated",void 0)},Tp=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let i=E.getNode(e);if(!i){let m=E.createNode({...le.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return d(m)?m:l("Virtual field list created",void 0)}if(!Wr(i))return a(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==r||i.readonly!==o||i.childRenderAxis!==s))return l("Virtual field list unchanged",void 0);let u=E.updateNode({...i,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return d(u)?u:l("Virtual field list updated",void 0)},zc=e=>{let t=pt(kt/4n),n=pt(kt/2n),r=pt(kt*3n/4n),o=pt(kt*7n/8n),s=pt(kt*15n/16n),i=pt(kt*13n/16n);if(d(t))return t;if(d(n))return n;if(d(r))return r;if(d(o))return o;if(d(s))return s;if(d(i))return i;let c=oi({id:dI(e.id),name:ce.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(d(c))return c;let u=Tp({id:cI(e.id),name:ce.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(d(u))return u;let m=Tp({id:lI(e.id),name:ce.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(d(m))return m;let p=oi({id:aI(e.id),name:ce.COMMENTS,parentNodeId:e.id,rank:o.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(d(p))return p;let f=oi({id:mI(e.id),name:ce.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(d(f))return f;let v=oi({id:uI(e.id),name:ce.HISTORY,parentNodeId:e.id,rank:i.value,value:pI(e),readonly:!0,childRenderAxis:"vertical"});return d(v)?v:l("Ticket virtual nodes materialized",void 0)},pI=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=>Ap(r,n.get(r.action)??[])).join(`
76
+ `)},wp=!0,Mp=e=>{wp=e},pa=()=>wp;import KI from"node:http";import nr from"node:path";import{fileURLToPath as zI}from"node:url";import sf from"node:fs";import kI from"node:path";import{ulid as G}from"ulid";var fI=new Set(["create.tag","create.contributor","add.swimlane"]),gI=e=>{let t=new Map;for(let n of e){if(!fI.has(n.action))continue;let r=n.payload;r?.id&&r.name&&t.set(r.id,r.name)}return t},hI=e=>{let t=new Map,n=new Map;for(let r of e){let o=r.payload;!o?.id||!o.parent||(r.action==="move.node"&&t.set(r.id,n.get(o.id)),n.set(o.id,o.parent))}return t},kp=e=>{let t=e.payload;return e.action==="tombstone.tag"||e.action==="restore.tag"?t?.id:t?.tag},vI=e=>{let t=new Set,n=new Map;for(let r of e){let o=r.payload,s=o?.id;s&&(r.action==="add.issue"&&t.add(s),o.parent&&n.set(s,o.parent))}return{issueIds:t,parentById:n}},yI=(e,{issueIds:t,parentById:n})=>{let r=e.payload;if(r?.issue)return r.issue;let o=new Set,s=r?.id;for(;s!==void 0&&!o.has(s);){if(t.has(s))return s;o.add(s),s=n.get(s)}return null},Pp=90,bI=e=>{let t=e.trim().split(`
77
+ `)[0]?.trim()??"";return t.length>Pp?`${t.slice(0,Pp).trimEnd()}\u2026`:t},xI=(e,t,n)=>{let r=e.payload,o=kp(e),s=e.action?ri(e.action):"";if(r?.md!==void 0){let c=bI(r.md);return c?`${s}: ${c}`:s}if(e.action==="move.node"&&r?.parent){let c=t.get(r.parent);return c?n.get(e.id)===r.parent?`Moved within ${c}`:`Moved to ${c}`:s}let i=o!==void 0?t.get(o)??"":r?.assignee!==void 0?t.get(r.assignee)??"":r?.name!==void 0?`"${r.name}"`:"";return[s,i].filter(Boolean).join(" ")},Lp=(e,t)=>{if(!e)return null;let n=t.get(e)??e;return{id:e,name:n,color:se(n)}},II=(e,t)=>{let n=e.payload;return{actor:e.userId?{id:e.userId,name:e.userName??e.userId,color:se(e.userName??e.userId)}:null,tag:Lp(kp(e),t),assignee:Lp(n?.assignee,t)}},Dp=e=>{let t=new Map,n=new Set,r=o=>{let s=new Set,i=o;for(;i&&!s.has(i);){if(n.has(i))return i;s.add(i),i=t.get(i)}return null};return e.map(o=>{let s=o.payload,i=s?.id;if(!i)return null;o.action==="add.board"&&n.add(i);let c=s.parent??s.issue;return c&&t.set(i,c),n.has(i)?i:r(i)})},Bp=(e,t)=>{let n=Dp(e);return e.filter((r,o)=>n[o]===t)},EI=e=>{let t=gI(e),n=hI(e),r=vI(e),o=Dp(e),s=cr(e.map(c=>lr(c)));return e.flatMap((c,u)=>{let m=s[u]??null;return m===null?[]:[{id:c.id,t:m,action:c.action,label:xI(c,t,n),issue:yI(c,r),board:o[u]??null,...II(c,t)}]}).sort((c,u)=>c.t-u.t)},xo=null,Fp=e=>{let t=gn(e);if(xo&&xo.root===e&&xo.signature===t)return l("Timeline entries, cached",xo.entries);let n=vn(e);if(d(n))return a(n.message);let r=EI(n.value);return xo={root:e,signature:t,entries:r},l("Timeline entries, built",r)};import{existsSync as Id}from"node:fs";import{chmod as Ed}from"node:fs/promises";import Gp from"node:os";import Tr from"node:path";var Op=1e5,SI=2e4,si=null,Up=Promise.resolve(),Mn=e=>{let t=Up.then(e,e);return Up=t.then(()=>{},()=>{}),t},ii=e=>{let t=$e(e??process.cwd());return d(t)?a(t.message):l("Resolved Epiq repo root",t.value)},ai=e=>{let t=ii(e);return d(t)?t:Ce({repoRoot:t.value})},dt=()=>{if(!ft())return{mode:"live",asOfTime:null};let{timeMode:e}=g();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:si}},_p=(e,t)=>{let n=0,r=e.length;for(;n<r;){let o=n+r>>1;e[o].t<t?n=o+1:r=o}return n},Vp=async(e={})=>{let t=ai(e.repoRoot);if(d(t))return a(t.message);let n=Fp(t.value);if(d(n))return a(n.message);let r=n.value,o=Date.now(),s=e.end??o,i=e.start??r[0]?.t??s;if(s<=i)return l("Empty time window",{bucketMs:0,buckets:[],events:[],earliest:i,latest:s});let c=_p(r,i),u=_p(r,s),m=r.slice(c,u).filter(C=>!e.boardId||C.board===e.boardId).map(({board:C,...I})=>I),p=m.map(C=>C.t),f=Math.max(1,Math.ceil((s-i)/Op)),v=new Map;for(let C of p){let I=Math.min(Op-1,Math.floor((C-i)/f)),S=i+I*f;v.set(S,(v.get(S)??0)+1)}let N=[...v.entries()].sort(([C],[I])=>C-I).map(([C,I])=>({t:C,count:I}));return l("Computed event timeline",{bucketMs:f,buckets:N,events:m.length>SI?[]:m,earliest:i,latest:s})},Io="",$p="",CI=5e3,Ar=null;var Sd=async(e={})=>{let t=ii(e.repoRoot);if(d(t))return a(t.message);let n=Tt(t.value);if(d(n))return a(n.message);let r=e.start===void 0&&e.end===void 0;if(r&&Ar&&Ar.repoRoot===t.value&&Ar.stateBranch===n.value.stateBranch&&Date.now()-Ar.fetchedAt<CI)return l("Computed commit timeline",Ar.result);let o=await $({cwd:t.value,args:["log","--branches","--not",n.value.stateBranch,...e.start!==void 0?[`--since=@${Math.floor(e.start/1e3)}`]:[],...e.end!==void 0?[`--until=@${Math.floor(e.end/1e3)}`]:[],"--shortstat",`--format=${$p}%H${Io}%at${Io}%an${Io}%s`]});if(d(o))return a(o.message);let s=o.value.stdout.split($p).filter(i=>i.trim().length>0).map(i=>{let[c,...u]=i.split(`
78
+ `),[m,p,f,...v]=(c??"").split(Io);if(!m||!p)return null;let N=u.join(" "),C=Number(/(\d+) insertion/.exec(N)?.[1]??0),I=Number(/(\d+) deletion/.exec(N)?.[1]??0);return{sha:m,time:Number(p)*1e3,author:f??"unknown",subject:v.join(Io),linesChanged:C+I,insertions:C,deletions:I}}).filter(i=>i!==null).filter(i=>(e.start===void 0||i.time>=e.start)&&(e.end===void 0||i.time<=e.end));return r&&(Ar={repoRoot:t.value,stateBranch:n.value.stateBranch,fetchedAt:Date.now(),result:s}),l("Computed commit timeline",s)},Kp=async e=>{let t=e.ref.trim();if(!t)return a("ref must not be empty");if(t.length!==7)return a(`"${t}" is ${t.length} characters; a ref is ${7}. Read it off the issue rather than slicing the id by hand.`);let n=await Sd({repoRoot:e.repoRoot});if(d(n))return a(n.message);let r=`${t.toUpperCase()} `,o=c=>c.subject.toUpperCase().startsWith(r),s=n.value,i=[];for(let[c,u]of s.entries()){if(!o(u))continue;let m=s[c+1];i.push({...u,precedingSha:m&&o(m)?m.sha:null})}return l("Matched commits by ref",i)},zp=e=>/^[0-9a-f]{7,40}$/i.test(e),NI=async(e,t)=>{let n=await $({cwd:e,args:["show",t]});if(d(n))return a(n.message);let r=Tr.join(Gp.tmpdir(),"epiq","commit-diffs");we.mkDir(r);let o=Tr.join(r,`${t}.diff`);return Id(o)||(we.writeToFile(o,n.value.stdout),await Ed(o,292)),Fm(o)},RI=12,AI=800,jp=async(e,t,n)=>{let r=await $({cwd:e,args:["show",`${t}:${n}`]});return d(r)?"":r.value.stdout},TI=async(e,t)=>{let n=await $({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(d(n))return a(n.message);let r=n.value.stdout.split(`
79
+ `).map(o=>o.trim()).filter(Boolean);return r.length===0?a("No changed files found for this commit"):l("Listed changed files",r)},wI=async(e,t,n)=>{let r=await TI(e,t);if(d(r))return a(r.message);let o=r.value;if(o.length>RI)return a(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=Tr.join(Gp.tmpdir(),"epiq","commit-diffs",t),i=await Promise.all(o.map(async(f,v)=>{let[N,C]=await Promise.all([jp(e,`${t}~1`,f),jp(e,t,f)]),I=Tr.basename(f),S=Tr.join(s,String(v),"before",I),A=Tr.join(s,String(v),"after",I);return Id(S)||(we.writeToFile(S,N),await Ed(S,292)),Id(A)||(we.writeToFile(A,C),await Ed(A,292)),{beforePath:S,afterPath:A}})),[c,...u]=i;if(!c)return a("No changed files found for this commit");let m=await cd(n,c.beforePath,c.afterPath,"new");if(d(m)||u.length===0)return m;await new Promise(f=>setTimeout(f,AI));let p=await Promise.all(u.map(({beforePath:f,afterPath:v})=>cd(n,f,v,"reuse")));for(let f of p)d(f)&&logger.error(`Failed to open an additional diff tab for ${t}: ${f.message}`);return m},qp=async e=>{if(!zp(e.sha))return a("Invalid commit sha");let t=ii(e.repoRoot);if(d(t))return a(t.message);let n=t.value,r=Gs()[0];if(r&&dd(r)){let o=await wI(n,e.sha,r);if(!d(o))return o;logger.error(`Side-by-side diff failed for ${e.sha}, falling back to unified diff: ${o.message}`)}return NI(n,e.sha)},MI=200,Hp=e=>/^0+$/.test(e),Wp=/^:\d{6} \d{6} ([0-9a-f]{40}) ([0-9a-f]{40}) [A-Z]\d*\t(.+)$/,PI=async(e,t)=>{let n=await $({cwd:e,args:["diff","--raw","--no-renames","--abbrev=40",`${t}~1`,t]});if(d(n))return a(n.message);let r=n.value.stdout.split(`
80
+ `).filter(i=>i!==""),o=r.filter(i=>!Wp.test(i));if(o.length>0)return a(`Could not parse ${o.length} line(s) of "git diff --raw" output, e.g. "${o[0]}"`);let s=r.map(i=>{let c=Wp.exec(i),u=c?.[1]??"",m=c?.[2]??"";return{path:c?.[3]??"",beforeBlob:Hp(u)?null:u,afterBlob:Hp(m)?null:m}});return s.length===0?a("No changed files found for this commit"):l("Listed changed files with blob hashes",s)},Yp=async e=>{if(!zp(e.sha))return a("Invalid commit sha");let t=ii(e.repoRoot);if(d(t))return a(t.message);let n=t.value,r=await PI(n,e.sha);if(d(r))return a(r.message);let o=r.value;if(o.length>MI)return a(`Commit touches ${o.length} files \u2014 too many to show as a diff`);let s=o.flatMap(m=>[m.beforeBlob,m.afterBlob].filter(p=>p!==null)),i=await rc(s,n);if(d(i))return a(i.message);let c=i.value,u=o.map(m=>({path:m.path,before:m.beforeBlob?c.get(m.beforeBlob)??"":"",after:m.afterBlob?c.get(m.afterBlob)??"":""}));return l("Loaded commit diff",{sha:e.sha,files:u})},Xp=e=>{let t=vn(e);if(d(t))return a(t.message);let n=Ct();if(d(n))return a(n.message);si=null;let r=xt(t.value),{fatal:o,skipped:s}=Xt(r);return o.length>0?a(o.map(i=>i.message).join(", ")):(Jt(s),R({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),l("Restored live state",!0))},LI=(e,t)=>{si=null;let n=Xp(e);return d(n)?a(`${t} (recovery to live also failed: ${n.message})`):a(t)},Cd=e=>Mn(async()=>{let t=ai(e.repoRoot);if(d(t))return a(t.message);let n=rs(t.value,e.targetTime);if(d(n))return a(n.message);let{appliedEvents:r,unappliedEvents:o}=n.value,s=Ct();if(d(s))return s;let i=xt(r),{fatal:c,skipped:u}=Xt(i);return c.length>0?LI(t.value,c.map(m=>m.message).join(", ")):(Jt(u),R({readOnly:!0,timeMode:"peek",unappliedEvents:o,replay:null}),si=e.targetTime,l("Checked out historical state",{asOfTime:e.targetTime}))}),Jp=async e=>{let t=ai(e.repoRoot);if(d(t))return a(t.message);let n=os(t.value);if(d(n))return a(n.message);let r=n.value.get(e.eventId)??null;return r===null?a("Event not found in the log"):Cd({repoRoot:e.repoRoot,targetTime:r+1})},Qp=(e={})=>Mn(async()=>{let t=ai(e.repoRoot);if(d(t))return a(t.message);let n=Xp(t.value);return d(n)?a(n.message):l("Returned to live state",!0)});var DI=e=>{if(e.filePath)try{return l("Read attachment file",{data:sf.readFileSync(e.filePath),name:e.name??kI.basename(e.filePath)})}catch(t){return a(`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"}):a("Provide either filePath or dataBase64")},Nd=()=>{let e=Pt();return d(e)?Ut:e.value.attachmentMaxKb??Ut},li=e=>{let t=$e(e??process.cwd());return d(t)?a(t.message):l("Resolved Epiq repo root",t.value)},di=null,pe=async(e,t)=>{let n=li(e);if(d(n))return n;let r=Ce({repoRoot:n.value});if(d(r))return a(r.message);let o=cn(n.value);if(d(o))return a(o.message);if(!(di!==null&&di.repoRoot===n.value&&di.stateBranchRoot===r.value&&sf.existsSync(Fn(r.value)))){let p=await Na({repoRoot:n.value,stateBranchName:o.value});if(d(p))return a(p.message);let f=await Kn({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(d(f))return a(f.message);di={repoRoot:n.value,stateBranchRoot:r.value}}if(t?.pull??!1){let p=await $({cwd:r.value,args:["pull","--ff-only"]});d(p)&&K.info(3,p.message)}let i={repoRoot:n.value,stateBranchRoot:r.value},c=gn(r.value);if(Yc(r.value)===c&&ft()&&dt().mode==="live")return l("Booted Epiq state, unchanged",i);let u=Zt(r.value);if(d(u))return a(u.message);let m=en(u.value.events,u.value.unreadable);return d(m)?a(m.message):(Xc(r.value,c),l("Booted Epiq state",i))},fe=()=>{let e=Pt();return d(e)?a(e.message):e.value.userId?e.value.userName?l("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):a("Unable to retrieve user name"):a("Unable to retrieve user id")},ve=()=>{let e=rt();return d(e)?a(e.message):e},af=e=>(e.props.tags??[]).map(t=>E.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:se(t.name)})),BI=()=>{let e=rt(),t=d(e)?[]:e.value.eventLog??[],n=new Map;for(let r of t)r.userId&&r.userName&&n.set(r.userId,r.userName);return n},df=(e,t)=>{let n=new Map(e);for(let r of Object.values(t))n.set(r.id,r.name);return n},cf=e=>(e.props.assignees??[]).map(t=>E.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:se(n)}));var lf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=ve();if(d(n))return n;let r=n.value.nodes,o=Object.values(r).filter(P).filter(s=>!s.isDeleted).filter(s=>e.includeClosed||s.parentNodeId!==Ee).filter(s=>e.boardId?(s.parentNodeId?r[s.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(s=>({id:s.id,ref:V(s.id),title:Ye(s.title),description:s.props.description??"",createdAt:tt(s.id),parentNodeId:s.parentNodeId,isClosed:s.parentNodeId===Ee,readonly:!!s.readonly,tags:af(s),assignees:cf(s)}));return l("Listed issues",o)},uf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=Ye(e.title);if(!o)return a("Issue title cannot be empty");let s=e.description??"",i=Et("Issue title",o,300)??Et("Issue description",s,2e4);if(i)return a(i);if((e.tagNames?.length??0)>20)return a(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return a(`Cannot set more than ${20} assignees at once`);let c=Gn(e.parentId,n.value,t.value.stateBranchRoot);if(d(c))return c;let u=Ks({name:o,parent:e.parentId,user:n.value,rank:c.value});if(d(u))return u;let m=[...u.value],p=m.find(C=>C.action==="add.issue")?.payload.id;if(!p)return a("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 C of e.tagNames??[]){let I=Ye(C).trim();if(!I||f.some(M=>M.name===I))continue;let S=Et("Tag name",I,60);if(S)return a(S);let A=E.findTagByName(I),B=A?.id??G();A||m.push({id:G(),...n.value,action:"create.tag",payload:{id:B,name:I}}),m.push({id:G(),...n.value,action:"add.issue.tag",payload:{id:p,tag:B}}),f.push({id:B,name:I})}let v=[];for(let C of e.assigneeNames??[]){let I=Ye(C).trim();if(!I||v.some(M=>M.name===I))continue;let S=Et("Assignee name",I,80);if(S)return a(S);let A=Object.values(r.value.contributors).find(M=>M.name===I),B=A?.id??G();A||m.push({id:G(),...n.value,action:"create.contributor",payload:{id:B,name:I}}),m.push({id:G(),...n.value,action:"add.issue.assignee",payload:{id:p,assignee:B}}),v.push({id:B,name:I})}let N=_(m,t.value.stateBranchRoot);return d(N)?a(N.message):l("Created issue",{id:p,ref:V(p),title:o,parentId:e.parentId,description:s,tags:f,assignees:v})},mf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=yn(Ee,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(d(r))return r;let o={id:G(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:Ee,rank:r.value}},s=_([o],t.value.stateBranchRoot);return d(s)?a(s.message):l("Closed issue",{id:e.issueId,ref:V(e.issueId)})},pf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Target node is not issue");if(o.parentNodeId!==Ee)return a("Issue is not closed");let s=Hs(o);if(!s)return a("Unable to resolve previous parent from issue history");if(s===Ee)return a("Previous parent resolves to closed swimlane");let i=r.value.nodes[s];if(!i)return a("Previous parent no longer exists");let c=yn(i.id,o.id,{at:"end"},n.value,t.value.stateBranchRoot);if(d(c))return c;let u={id:G(),...n.value,action:"reopen.issue",payload:{id:o.id,parent:i.id,rank:c.value}},m=_([u],t.value.stateBranchRoot);return d(m)?a(m.message):l("Reopened issue",{id:o.id,ref:V(o.id),parentId:i.id})},ff=async e=>{let t=li(e.repoRoot);if(d(t))return t;let n=fe();if(d(n))return n;let r=Ce({repoRoot:t.value});if(d(r))return r;let o=Zt(r.value);if(d(o))return o;let s=en(o.value.events,o.value.unreadable);if(d(s))return s;let i=yn(e.parentId,e.issueId,e.position??{at:"end"},n.value,r.value);if(d(i))return i;let c={id:G(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:i.value}},u=_([c],r.value);return d(u)?a(u.message):l("Moved issue",{id:e.issueId,ref:V(e.issueId),parentId:e.parentId})},gf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.boardId];if(!o)return a("Board not found");if(!Gr(o))return a("Target parent must be a board");if(o.readonly)return a("Cannot add a swimlane to a readonly board");if(dt().mode!=="live")return a("Cannot add a swimlane while time travelling");let s=Ye(e.title);if(!s.trim())return a("Swimlane title cannot be empty");let i=Et("Swimlane title",s,300);if(i)return a(i);let c=Gn(e.boardId,n.value,t.value.stateBranchRoot);if(d(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=_([m],t.value.stateBranchRoot);return d(p)?a(p.message):l("Created swimlane",{id:u,ref:V(u),title:s,boardId:e.boardId})},hf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return a("Swimlane not found");if(!Lt(o))return a("Edit target must be a swimlane");if(o.readonly)return a("Cannot edit readonly swimlane");let s=Ye(e.title);if(!s.trim())return a("Swimlane title cannot be empty");let i=Et("Swimlane title",s,300);if(i)return a(i);if(o.title===s)return l("No changes made",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s});let c={id:G(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},u=_([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Edited swimlane title",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s})},vf=async e=>{let t=li(e.repoRoot);if(d(t))return t;let n=fe();if(d(n))return n;let r=Ce({repoRoot:t.value});if(d(r))return r;let o=Zt(r.value);if(d(o))return o;let s=en(o.value.events,o.value.unreadable);if(d(s))return s;let i=yn(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(d(i))return i;let c={id:G(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:i.value}},u=_([c],r.value);return d(u)?a(u.message):l("Moved swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId),boardId:e.boardId})},yf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.swimlaneId];if(!o)return a("Swimlane not found");if(!Lt(o))return a("Delete target must be a swimlane");let s={id:G(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},i=_([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Deleted swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId)})},ui=async(e={})=>{ls();let t=li(e.repoRoot);if(d(t))return a("Sync failed");let n=fe();if(d(n))return n;let r=await gs({cwd:t.value,ownEventFileName:Hn(n.value)});return d(r)?(Sa(r.message),r):(us(),l("Synced",r.value))},bf=e=>{let t=ve();if(d(t))return t;let n=t.value.nodes[e];return n?l("Read issue history",(n.log??[]).map(r=>({id:r.id,t:tt(r.id),action:r.action,label:Qs(r),actor:{id:r.userId,name:r.userName,color:se(r.userName)}}))):a("Issue not found")};var FI=365*24*60*60*1e3,wr=()=>{let e=ve();if(d(e))return e;let t=dt(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(I=>Gr(I)&&!I.isDeleted),s=Date.now()-FI,i=new Map,c=new Map;for(let I of r)if(!I.isDeleted){if(Lt(I)&&I.parentNodeId){let S=i.get(I.parentNodeId)??[];S.push(I),i.set(I.parentNodeId,S)}if(P(I)&&I.parentNodeId){if(I.parentNodeId===Ee&&tt(I.id)<s)continue;let S=c.get(I.parentNodeId)??[];S.push(I),c.set(I.parentNodeId,S)}}let u=new Set;for(let I of c.values())for(let S of I)u.add(S.id);let m=Pt();if(d(m))return m;let p={},f=E.getCommentsGroupedByIssue();for(let I of r.filter(P))I.isDeleted||!u.has(I.id)||(p[I.id]=(f.get(I.id)??[]).map(S=>{let A=E.getContributor(S.authorId);return{id:S.id,issueId:S.issue,body:S.md,author:{id:S.authorId,name:A?.name??"Unknown",color:se(A?.name??S.authorId??"Unknown")},createdAt:tt(S.id)}}));let v=new Map;for(let I of e.value.eventLog)I.action==="add.issue.attachment"&&v.set(I.payload.id,I.payload.author);let N={},C=E.getAttachmentsGroupedByIssue();for(let I of r.filter(P))I.isDeleted||!u.has(I.id)||(N[I.id]=(C.get(I.id)??[]).map(S=>({id:S.id,issueId:S.issue,name:S.name,fileName:hr(S.hash,S.ext),bytes:S.bytes,createdAt:tt(S.id),canDelete:v.get(S.id)===m.value.userId})));return l("Retrieved Epiq GUI state",{boards:o.sort((I,S)=>I.rank.localeCompare(S.rank)).map(I=>({id:I.id,ref:V(I.id),title:I.title,readonly:!!I.readonly||n,swimlanes:(i.get(I.id)??[]).sort((S,A)=>S.rank.localeCompare(A.rank)).map(S=>({id:S.id,title:S.title,readonly:!!S.readonly||n,issues:(c.get(S.id)??[]).sort((A,B)=>A.rank.localeCompare(B.rank)).map(A=>({id:A.id,ref:V(A.id),title:Ye(A.title),description:A.props.description??"",createdAt:tt(A.id),readonly:!!A.readonly||n,tags:af(A),assignees:cf(A),parentNodeId:A.parentNodeId,isClosed:A.parentNodeId===Ee})),parentNodeId:S.parentNodeId}))})),tags:E.getTags().map(I=>({...I,color:se(I.name)})),contributors:Object.values(e.value.contributors).map(I=>({...I,color:se(I.name)})),user:{name:m.value.userName??"",id:m.value.userId??"",color:se(m.value.userName??"")},commentsByIssueId:p,attachmentsByIssueId:N,attachmentMaxKb:Nd(),timeTravel:t})},tf=null,OI=e=>{if(e===tf)return;let t=bs({root:e});if(d(t)){K.info(t.message);return}tf=e},Nt=async(e={})=>{if(dt().mode!=="live")return wr();let t=await pe(e.repoRoot,{pull:!1});return d(t)?t:(OI(t.value.repoRoot),wr())},xf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Edit target must be an issue");if(o.readonly)return a("Cannot edit readonly issue");let s=Et("Issue description",e.description,2e4);if(s)return a(s);let i=o.props.description??"";if(i===e.description)return l("No changes made",{id:e.issueId,ref:V(e.issueId),description:i});let c={id:G(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},u=_([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Edited issue description",{id:e.issueId,ref:V(e.issueId),description:e.description})},If=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Edit target must be an issue");if(o.readonly)return a("Cannot edit readonly issue");let s=Ye(e.title);if(!s.trim())return a("Issue title cannot be empty");let i=Et("Issue title",s,300);if(i)return a(i);if(o.title===s)return l("No changes made",{id:e.issueId,ref:V(e.issueId),title:s});let c={id:G(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},u=_([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Edited issue title",{id:e.issueId,ref:V(e.issueId),title:s})},Ef=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Tag target must be an issue");if(o.readonly)return a("Cannot tag readonly issue");let s=Ye(e.tagName).trim();if(!s)return a("Tag name cannot be empty");let i=Et("Tag name",s,60);if(i)return a(i);let c=E.findTagByName(s),u=c?.id??G(),m=[...c?[]:[{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=_(m,t.value.stateBranchRoot);return d(p)?a(p.message):l("Added issue tag",{id:e.issueId,ref:V(e.issueId),tag:{id:u,name:s}})},Sf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.tags[e.tagId];if(!o)return a("Tag not found");if(o.tombstoned)return a("Tag is already deleted");let s=[{id:G(),...n.value,action:"tombstone.tag",payload:{id:e.tagId}}],i=_(s,t.value.stateBranchRoot);return d(i)?a(i.message):l("Deleted tag",{id:o.id,name:o.name})};var Cf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Untag target must be an issue");if(o.readonly)return a("Cannot untag readonly issue");if(!r.value.tags[e.tagId])return a("Tag not found");let s={id:G(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},i=_([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue tag",{id:e.issueId,ref:V(e.issueId),tagId:e.tagId})},Nf=async(e,t)=>{let n=xa(e);if(d(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}},Rf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Assign target must be an issue");if(o.readonly)return a("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let S=r.value.contributors[s],A=S?void 0:await Nf(t.value.stateBranchRoot,s);if(!S&&!A)return a("Unknown assignee id");let B=S??A,M=[...S?[]:[{id:G(),...n.value,action:"create.contributor",payload:{id:B.id,name:B.name}}],{id:G(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:B.id}}],L=_(M,t.value.stateBranchRoot);return d(L)?a(L.message):l("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:B.id,name:B.name}})}let i=Ye(e.assigneeName??"").trim();if(!i)return a("Provide assigneeId, self or assigneeName");let c=Et("Assignee name",i,80);if(c)return a(c);let m=[...df(BI(),r.value.contributors).entries()].filter(([,S])=>S===i);if(m.length>1)return a(`"${i}" matches ${m.length} contributors (${m.map(([S])=>S).join(", ")}). Assign by assigneeId to choose.`);let p=m[0];if(!p&&!e.createUnlinked)return a(`No contributor named "${i}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[f=G(),v=i]=p??[],C=[...!!r.value.contributors[f]?[]:[{id:G(),...n.value,action:"create.contributor",payload:{id:f,name:v}}],{id:G(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:f}}],I=_(C,t.value.stateBranchRoot);return d(I)?a(I.message):l("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:f,name:v}})},Af=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;if(!r.value.contributors[e.contributorId])return a("Contributor not found");if(await Nf(t.value.stateBranchRoot,e.contributorId))return a("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let i=[{id:G(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],c=_(i,t.value.stateBranchRoot);return d(c)?a(c.message):l("Tombstoned contributor",{id:e.contributorId,name:Yo})};var Tf=async(e={})=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=vn(t.value.stateBranchRoot);if(d(o))return a(o.message);let s=e.boardId?Bp(o.value,e.boardId):o.value,i=new Map,c=new Set,u=new Set,m=xa(t.value.stateBranchRoot);if(d(m))return a(m.message);for(let N of m.value)N.userId&&u.add(N.userId);for(let N of s)N.userId&&(i.set(N.userId,N.userName??""),c.add(N.userId));let p=r.value.contributors,v=[...df(i,p).entries()].map(([N,C])=>({id:N,name:C,color:se(C),isSelf:N===n.value.userId,isExternal:!c.has(N),isRemoved:p[N]?.tombstoned===!0,hasAuthoredAnywhere:u.has(N)}));return l("Listed board contributors",v)},wf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Unassign target must be an issue");if(o.readonly)return a("Cannot unassign readonly issue");if(!r.value.contributors[e.assigneeId])return a("Assignee not found");let s={id:G(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},i=_([s],t.value.stateBranchRoot);return d(i)?a(i.message):l("Removed issue assignee",{id:e.issueId,ref:V(e.issueId),assigneeId:e.assigneeId})},mi=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Comment target must be an issue");if(o.readonly)return a("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return a("Comment cannot be empty");if(s.length>4e3)return a(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let i=G(),c={id:G(),...n.value,action:"add.issue.comment",payload:{id:i,issue:e.issueId,md:s,author:n.value.userId}},u=_([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Added issue comment",{id:i,issueId:e.issueId,body:s})},pi=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!o)return a("Unable to resolve comment");if(o.payload.author!==n.value.userId)return a("You can only delete your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!P(s))return a("Comment target must be an issue");if(s.readonly)return a("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=_([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Deleted issue comment",{id:e.commentId,issueId:o.payload.issue})},Mf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.eventLog.find(p=>p.action==="add.issue.comment"&&p.payload.id===e.commentId);if(!o)return a("Unable to resolve comment");if(o.payload.author!==n.value.userId)return a("You can only edit your own comments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!P(s))return a("Comment target must be an issue");if(s.readonly)return a("Cannot edit comment on readonly issue");if(r.value.eventLog.some(p=>p.action==="delete.issue.comment"&&p.payload.id===e.commentId))return a("Comment was deleted");let c=e.body.trim();if(!c)return a("Comment cannot be empty");if(c.length>4e3)return a(`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=_([u],t.value.stateBranchRoot);return d(m)?a(m.message):l("Edited issue comment",{id:e.commentId,issueId:o.payload.issue,body:c})},Pf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.nodes[e.issueId];if(!o)return a("Issue not found");if(!P(o))return a("Attachment target must be an issue");if(o.readonly)return a("Cannot attach to readonly issue");let s=DI(e);if(d(s))return s;let i=vu(t.value.stateBranchRoot,s.value.data,Nd());if(d(i))return i;let c=Ye(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:i.value.hash,ext:i.value.ext,name:c,bytes:i.value.bytes}},p=_([m],t.value.stateBranchRoot);if(d(p))return a(p.message);let f=hr(i.value.hash,i.value.ext);return l("Added issue attachment",{id:u,issueId:e.issueId,fileName:f,bytes:i.value.bytes,markdown:Fa(c,f)})},Lf=async e=>{let t=await pe(e.repoRoot,{pull:!1});if(d(t))return t;let n=fe();if(d(n))return n;let r=ve();if(d(r))return r;let o=r.value.eventLog.find(m=>m.action==="add.issue.attachment"&&m.payload.id===e.attachmentId);if(!o)return a("Unable to resolve attachment");if(o.payload.author!==n.value.userId)return a("You can only delete your own attachments");let s=r.value.nodes[o.payload.issue];if(!s)return a("Issue not found");if(!P(s))return a("Attachment target must be an issue");if(s.readonly)return a("Cannot delete attachment on readonly issue");if(r.value.eventLog.some(m=>m.action==="delete.issue.attachment"&&m.payload.id===e.attachmentId))return l("Attachment already deleted",{id:e.attachmentId,issueId:o.payload.issue});let c={id:G(),...n.value,action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:o.payload.issue}},u=_([c],t.value.stateBranchRoot);return d(u)?a(u.message):l("Deleted issue attachment",{id:e.attachmentId,issueId:o.payload.issue})},kf=async e=>{let t=await pe(e.repoRoot,{pull:!1});return d(t)?t:yu(t.value.stateBranchRoot,e.fileName,Nd())};var Gt="1.8.0";import UI from"node:fs";import Df from"node:path";var Eo=Number(process.env.EPIQ_GUI_PORT)||3710,Rd="/api/instance",Ad="epiq",fi=e=>{try{return UI.realpathSync(Df.resolve(e))}catch{return Df.resolve(e)}},_I=e=>{let t=e;return typeof t=="object"&&t!==null&&t.app===Ad&&typeof t.repoRoot=="string"&&typeof t.version=="string"&&typeof t.pid=="number"},Bf=async(e,t=500)=>{let n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let o=await fetch(`http://127.0.0.1:${e}${Rd}`,{signal:n.signal});if(!o.ok)return null;let s=await o.json();return _I(s)?s:null}catch{return null}finally{clearTimeout(r)}};var $I=15e3,Ff=e=>{let t,n=!1,r=!1,o=0,s=()=>{let p=dr();return d(p)?(K.error(p.message),null):p.value},i=()=>{let p=s();if(!p)return!1;let{autoSync:f,preferredEditor:v}=p,N=Pt(),C=d(N)?null:N.value.userName;return!!(f&&C&&v)},c=()=>{let p=s()?.autoSyncDebounceMs??$I;return Math.max(0,p-(Date.now()-o))},u=async()=>{if(!(n||r)){r=!0,o=Date.now();try{await Mn(async()=>{if(dt().mode!=="live")return;let p=await ui({repoRoot:e.project.repoRoot});if(d(p))return;let{pulled:f,createdCommit:v,bootstrapped:N}=p.value;!f&&!v&&!N||Vn({type:"state",payload:await Nt({repoRoot:e.project.repoRoot})})})}finally{r=!1,m()}}};function m(){n||!i()||r||t||(t=setTimeout(()=>{t=void 0,u()},c()))}return m(),{queueSync:m,dispose:()=>{n=!0,t&&clearTimeout(t)}}};var jI=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),Td=(e,t)=>{if(!e)return!1;if(e==="null")return!0;let n;try{n=new URL(e)}catch{return!0}return n.protocol!=="http:"||n.port!==String(t)?!0:!jI.has(n.hostname)},Of=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:Td(e.origin,t)?{status:403,message:"Cross-origin request"}:e.method==="POST"&&!(e.contentType??"").toLowerCase().startsWith("application/json")?{status:415,message:"Expected content-type: application/json"}:null;import{WebSocketServer as GI}from"ws";var Uf=new Set(["sync","issues:create","swimlane:create","swimlane:edit:title","swimlane:delete","swimlane:move","issues:move","issue:close","issue:reopen","issue:edit:title","issue:edit:description","issue:tag:add","issue:tag:remove","contributor:remove","tag:remove","issue:assignee:add","issue:assignee:remove","issue:comment:add","issue:comment:delete"]);var _f=e=>{let t=nn({exclude:e});return d(t)?[]:t.value.map(n=>({projectId:n.projectId,name:fr(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},$f=e=>{let t=nn();if(d(t))return a(t.message);let n=t.value.find(r=>r.root===e);return n?l("Resolved recent project",n.root):a(`Not a recent project: ${e}`)};import{z as w}from"zod";var Y=w.string().min(1),jf=w.discriminatedUnion("at",[w.object({at:w.literal("start")}),w.object({at:w.literal("end")}),w.object({at:w.literal("before"),sibling:Y}),w.object({at:w.literal("after"),sibling:Y})]),So=w.number().finite(),oe=(e,t)=>w.object({type:w.literal(e),payload:t}),gi=e=>w.object({type:w.literal(e)}),HI=w.discriminatedUnion("type",[gi("state:get"),gi("issues:list"),gi("sync"),gi("time-travel:live"),oe("project:open",w.object({root:w.string().min(1)})),oe("issues:create",w.object({title:w.string(),parentId:Y,description:w.string().optional(),tagNames:w.array(w.string()).optional()})),oe("swimlane:create",w.object({title:w.string(),boardId:Y})),oe("swimlane:edit:title",w.object({swimlaneId:Y,title:w.string()})),oe("swimlane:delete",w.object({swimlaneId:Y})),oe("swimlane:move",w.object({swimlaneId:Y,boardId:Y,position:jf.optional()})),oe("issues:move",w.object({issueId:Y,parentId:Y,position:jf.optional()})),oe("issue:edit:title",w.object({issueId:Y,title:w.string()})),oe("issue:edit:description",w.object({issueId:Y,description:w.string()})),oe("issue:tag:add",w.object({issueId:Y,tagName:w.string()})),oe("issue:tag:remove",w.object({issueId:Y,tagId:Y})),oe("contributor:remove",w.object({contributorId:Y})),oe("tag:remove",w.object({tagId:Y})),w.object({type:w.literal("contributors:get"),payload:w.object({boardId:Y.optional()}).optional()}),oe("issue:assignee:add",w.object({issueId:Y,assigneeId:Y.optional(),assigneeName:w.string().optional(),createUnlinked:w.boolean().optional()})),oe("issue:assignee:remove",w.object({issueId:Y,assigneeId:Y})),oe("issue:close",w.object({issueId:Y})),oe("issue:reopen",w.object({issueId:Y})),oe("issue:comment:add",w.object({issueId:Y,body:w.string()})),oe("issue:comment:delete",w.object({issueId:Y,commentId:Y})),oe("issue:comment:edit",w.object({issueId:Y,commentId:Y,body:w.string()})),oe("issue:get",w.object({issueId:Y})),w.object({type:w.literal("timeline:get"),payload:w.object({start:So.optional(),end:So.optional(),boardId:Y.optional(),requestId:w.number().finite().optional()}).optional()}),w.object({type:w.literal("commits:get"),payload:w.object({start:So.optional(),end:So.optional(),requestId:w.number().finite().optional()}).optional()}),oe("time-travel:scrub",w.object({targetTime:So})),oe("time-travel:checkout-event",w.object({eventId:w.string().min(1)})),oe("commit:inspect",w.object({sha:w.string()})),oe("commit:diff:get",w.object({sha:w.string()})),oe("issue:commits:get",w.object({issueId:Y}))]);var Hf=e=>{let t=HI.safeParse(e);return t.success?{ok:!0,message:t.data}:{ok:!1,error:`Invalid message: ${t.error.issues.map(r=>`${r.path.join(".")||"<root>"}: ${r.message}`).join(", ")}`}};var WI=e=>({...e,boards:(e.boards??[]).map(t=>({...t,swimlanes:(t.swimlanes??[]).map(n=>({...n,issues:(n.issues??[]).map(r=>({...r,description:""}))}))})),commentsByIssueId:Object.fromEntries(Object.entries(e.commentsByIssueId??{}).filter(([,t])=>t.length>0).map(([t,n])=>[t,n.map(r=>({...r,body:""}))])),attachmentsByIssueId:Object.fromEntries(Object.entries(e.attachmentsByIssueId??{}).filter(([,t])=>t.length>0))}),Co=e=>d(e)?e:l(e.message,WI(e.value)),Wf=(e,t)=>{let n=(e.boards??[]).flatMap(r=>r.swimlanes??[]).flatMap(r=>r.issues??[]).find(r=>r.id===t);return{issueId:t,description:n?.description??"",comments:e.commentsByIssueId?.[t]??[]}};var wd=()=>{Vn({type:"state",payload:Co(wr())})},Q=(e,t)=>{e.send(JSON.stringify(t))},No=async(e,t)=>{let n=Co(await Nt({repoRoot:t}));return d(n)&&n.message===Zi?Q(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:_f(t)}}):Q(e,{type:"state",payload:n})},VI=async(e,t)=>{let n=()=>Q(e,{type:"state",payload:Co(wr())});if(dt().mode!=="live")return n();let r=await Nt({repoRoot:t});return dt().mode!=="live"?n():Q(e,{type:"state",payload:Co(r)})},Oe=async(e,t,n,r,o)=>{if(Q(e,{type:r,payload:o}),d(o))return Q(e,{type:"failed",payload:o.message});n(),VI(e,t)},Gf=(e,t,{onStateChanged:n,getPort:r})=>{new GI({server:e,path:"/ws",verifyClient:s=>!Td(s.origin,r())}).on("connection",s=>{wl(s),s.on("message",async i=>{let c=async u=>{let{type:m}=u,p=t.repoRoot;if(m==="project:open"){let f=$f(u.payload.root);return Q(s,{type:"project:open:result",payload:f}),d(f)?void 0:(t.repoRoot=f.value,No(s,f.value))}if(m==="timeline:get"){let{requestId:f,...v}=u.payload??{};return Q(s,{type:"timeline",requestId:f,payload:await Vp({repoRoot:p,...v})})}if(m==="issue:get"){let f=u.payload?.issueId,v=wr(),N=bf(f);return Q(s,{type:"issue",payload:d(v)?v:l("Issue detail",{...Wf(v.value,f),history:d(N)?[]:N.value})})}if(m==="commits:get"){let{requestId:f,...v}=u.payload??{};return Q(s,{type:"commits",requestId:f,payload:await Sd({repoRoot:p,...v})})}if(m==="commit:inspect")return Q(s,{type:"commit:inspect:result",payload:await qp({repoRoot:p,sha:u.payload.sha})});if(m==="commit:diff:get"){let{sha:f}=u.payload;return Q(s,{type:"commit:diff:result",payload:{sha:f,result:await Yp({repoRoot:p,sha:f})}})}if(m==="issue:commits:get"){let{issueId:f}=u.payload;return Q(s,{type:"issue:commits:result",payload:{issueId:f,result:await Kp({repoRoot:p,ref:V(f)})}})}if(m==="time-travel:scrub"){let f=await Cd({repoRoot:p,targetTime:u.payload.targetTime});return Q(s,{type:"time-travel:result",payload:f}),d(f)?void 0:wd()}if(m==="time-travel:checkout-event"){let f=await Jp({repoRoot:p,eventId:u.payload.eventId});return Q(s,{type:"time-travel:result",payload:f}),d(f)?void 0:wd()}if(m==="time-travel:live"){let f=await Qp({repoRoot:p});return Q(s,{type:"time-travel:result",payload:f}),d(f)?void 0:wd()}if(m==="state:get")return No(s,p);if(m==="sync"){let f=await ui({repoRoot:p});return Q(s,{type:"sync:result",payload:f}),n(),No(s,p)}if(m==="issue:comment:add"){let f=await mi({repoRoot:p,...u.payload});return Oe(s,p,n,"issue:comment:add:result",f)}if(m==="issue:comment:edit"){let f=await Mf({repoRoot:p,...u.payload});return Oe(s,p,n,"issue:comment:edit:result",f)}if(m==="issue:comment:delete"){let f=await pi({repoRoot:p,...u.payload});return Q(s,{type:"issue:comment:delete:result",payload:f}),d(f)?Q(s,{type:"failed",payload:f.message}):(n(),No(s,p))}if(m==="issue:edit:description"){let f=await xf({repoRoot:p,...u.payload});return Oe(s,p,n,"issue:edit:description:result",f)}if(m==="issue:edit:title"){let f=await If({repoRoot:p,...u.payload});return Oe(s,p,n,"issue:edit:title:result",f)}if(m==="issue:tag:add"){let f=await Ef({repoRoot:p,...u.payload});return Oe(s,p,n,"issue:tag:add:result",f)}if(m==="issue:tag:remove"){let f=await Cf({repoRoot:p,...u.payload});return Oe(s,p,n,"issue:tag:remove:result",f)}if(m==="contributor:remove"){let f=await Af({repoRoot:p,...u.payload});return Oe(s,p,n,"contributor:remove:result",f)}if(m==="tag:remove"){let f=await Sf({repoRoot:p,...u.payload});return Oe(s,p,n,"tag:remove:result",f)}if(m==="contributors:get")return Q(s,{type:"contributors",payload:await Tf({repoRoot:p,...u.payload})});if(m==="issue:assignee:add"){let f=await Rf({repoRoot:p,...u.payload});return Oe(s,p,n,"issue:assignee:add:result",f)}if(m==="issue:assignee:remove"){let f=await wf({repoRoot:p,...u.payload});return Oe(s,p,n,"issue:assignee:remove:result",f)}if(m==="issues:list")return Q(s,{type:"issues",payload:await lf({repoRoot:p})});if(m==="issues:create"){let f=await uf({...u.payload,repoRoot:p});return Q(s,{type:"issues:create:result",payload:f}),d(f)?Vn({type:"failed",payload:f.message}):(n(),No(s,p))}if(m==="swimlane:create"){let f=await gf({...u.payload,repoRoot:p});return Oe(s,p,n,"swimlane:create:result",f)}if(m==="swimlane:edit:title"){let f=await hf({...u.payload,repoRoot:p});return Oe(s,p,n,"swimlane:edit:title:result",f)}if(m==="swimlane:delete"){let f=await yf({...u.payload,repoRoot:p});return Oe(s,p,n,"swimlane:delete:result",f)}if(m==="swimlane:move"){if(!u.payload.position)return Q(s,{type:"error",message:"Missing move position"});let f=await vf({...u.payload,repoRoot:p});return Oe(s,p,n,"swimlane:move:result",f)}if(m==="issues:move"){if(!u.payload.position)return Q(s,{type:"error",message:"Missing move position"});let f=await ff({...u.payload,repoRoot:p});return Oe(s,p,n,"issues:move:result",f)}if(m==="issue:close"){let f=await mf({repoRoot:p,issueId:u.payload.issueId});return Oe(s,p,n,"issue:close:result",f)}if(m==="issue:reopen"){let f=await pf({repoRoot:p,issueId:u.payload.issueId});return Oe(s,p,n,"issue:reopen:result",f)}return Q(s,{type:"error",message:"Unknown message type"})};try{let u=Hf(JSON.parse(i.toString()));if(!u.ok)return Q(s,{type:"error",message:u.error});let m=u.message;return Uf.has(m.type)?await Mn(async()=>dt().mode!=="live"?Q(s,{type:"failed",payload:"Read-only while viewing history"}):c(m)):await c(m)}catch(u){return Q(s,{type:"error",message:u instanceof Error?u.message:String(u)})}})})};var qI=nr.dirname(zI(import.meta.url)),YI=process.env.IS_LOCAL==="true"?nr.resolve(process.cwd(),"dist/gui"):nr.join(qI,"gui"),hi,XI=async()=>(hi===void 0&&(hi=await import("node:sea").catch(()=>null)),hi?.isSea()?hi:null),ye=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},JI=e=>ye(e,409,{isError:!0,message:"Read-only while viewing history"}),vi=(e,t)=>Mn(async()=>dt().mode!=="live"?JI(e):t()),Vf=async(e,t=1024*1024)=>new Promise((n,r)=>{let o=[],s=0;e.on("data",i=>{if(s+=i.length,s>t){e.destroy(),r(new Error("Request body too large"));return}o.push(i)}),e.on("end",()=>{let i=Buffer.concat(o).toString("utf8");try{n(i?JSON.parse(i):{})}catch{r(new Error("Invalid JSON body"))}}),e.on("error",r)}),QI=2*1024*1024,ZI={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},eE=e=>e.endsWith(".html")?"text/html; charset=utf-8":e.endsWith(".js")?"text/javascript; charset=utf-8":e.endsWith(".css")?"text/css; charset=utf-8":e.endsWith(".json")?"application/json; charset=utf-8":e.endsWith(".ico")?"image/x-icon":"application/octet-stream",Kf=async(e,t)=>{let n=e==="/"?"index.html":decodeURIComponent(e).replace(/^\/+/,""),r=nr.resolve(YI),o=nr.resolve(r,n),s=nr.relative(r,o);if(s.startsWith("..")||nr.isAbsolute(s))return ye(t,403,{isError:!0,message:"Forbidden"});let i=await XI();try{let c=i?Buffer.from(i.getAsset(`gui/${s}`)):await zf(o);return t.writeHead(200,{"content-type":eE(o)}),t.end(c)}catch{return ye(t,404,{isError:!0,message:`Not found: ${n}`})}},tE=async(e,t=Eo)=>new Promise((n,r)=>{let o=s=>{let i=u=>{if(e.off("listening",c),u.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),o(0);return}r(u)},c=()=>{e.off("error",i);let u=e.address();if(!u||typeof u=="string"){r(new Error("Unable to resolve address"));return}n(u.port)};e.once("error",i),e.once("listening",c),e.listen(s,"127.0.0.1")};o(t)}),qf=async e=>{Mp(!1);let t=0,n={repoRoot:e.repoRoot},r=KI.createServer(async(i,c)=>{let u=new URL(i.url??"/","http://127.0.0.1"),m=Of({method:i.method,origin:i.headers.origin,contentType:i.headers["content-type"]},t);if(m)return ye(c,m.status,{isError:!0,message:m.message});if(i.method==="GET"&&u.pathname===Rd)return ye(c,200,{app:Ad,repoRoot:fi(n.repoRoot),version:Gt,pid:process.pid});if(u.pathname==="/api/state")return ye(c,200,await Nt({repoRoot:n.repoRoot}));if(i.method==="POST"&&u.pathname==="/api/comments")try{let p=await Vf(i);if(!p.issueId||!p.body?.trim())return ye(c,400,{isError:!0,message:"Missing issueId or body"});let f=p.issueId,v=p.body;return await vi(c,async()=>{let N=await mi({repoRoot:n.repoRoot,issueId:f,body:v});return d(N)?ye(c,400,{isError:!0,message:N.message}):ye(c,200,await Nt({repoRoot:n.repoRoot}))})}catch(p){return ye(c,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add comment"})}if(i.method==="POST"&&u.pathname==="/api/attachments")try{let p=await Vf(i,QI);if(!p.issueId||!p.dataBase64)return ye(c,400,{isError:!0,message:"Missing issueId or dataBase64"});let f=p.issueId,v=p.dataBase64,N=p.name??"";return await vi(c,async()=>{let C=await Pf({repoRoot:n.repoRoot,issueId:f,name:N,dataBase64:v});return d(C)?ye(c,400,{isError:!0,message:C.message}):ye(c,200,{...await Nt({repoRoot:n.repoRoot}),attachment:C.value})})}catch(p){return ye(c,400,{isError:!0,message:p instanceof Error?p.message:"Unable to add attachment"})}if(i.method==="DELETE"&&u.pathname.startsWith("/api/attachments/")){let p=decodeURIComponent(u.pathname.replace("/api/attachments/",""));return p?vi(c,async()=>{let f=await Lf({repoRoot:n.repoRoot,attachmentId:p});return d(f)?ye(c,400,{isError:!0,message:f.message}):ye(c,200,await Nt({repoRoot:n.repoRoot}))}):ye(c,400,{isError:!0,message:"Missing attachment id"})}if(i.method==="GET"&&u.pathname.startsWith("/media/")){let p=decodeURIComponent(u.pathname.replace("/media/","")),f=await kf({repoRoot:n.repoRoot,fileName:p});if(d(f))return ye(c,404,{isError:!0,message:f.message});try{let v=await zf(f.value.filePath);return c.writeHead(200,{"content-type":ZI[f.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),c.end(v)}catch{return ye(c,404,{isError:!0,message:"Attachment blob not found"})}}if(i.method==="DELETE"&&u.pathname.startsWith("/api/comments/")){let p=decodeURIComponent(u.pathname.replace("/api/comments/",""));return p?vi(c,async()=>{let f=await pi({repoRoot:n.repoRoot,commentId:p});return d(f)?ye(c,400,{isError:!0,message:f.message}):ye(c,200,await Nt({repoRoot:n.repoRoot}))}):ye(c,400,{isError:!0,message:"Missing comment id"})}return u.pathname.startsWith("/board/")?Kf("/",c):Kf(u.pathname,c)});try{t=await tE(r)}catch(i){return a(i instanceof Error?`Unable to start GUI server: ${i.message}`:`Unable to start GUI server: ${String(i)}`)}let o=Ff({project:n});Gf(r,n,{onStateChanged:()=>o.queueSync(),getPort:()=>t}),r.on("close",o.dispose);let s=r.address();return!s||typeof s=="string"?(r.close(),a("Unable to resolve GUI server address")):l("Started GUI server",{url:`http://epiq.localhost:${s.port}${e.boardId?`/board/${e.boardId}`:""}`,server:r})};var Xf=async e=>{let t=sr({});if(d(t))return a(t.message);let n=Pt();de(n)&&je(n.value);let r=await Bf(Eo);if(r&&r.repoRoot===fi(e.repoRoot)){let i=`http://127.0.0.1:${Eo}`;return console.log(`Epiq GUI already running for this project at ${Yf.cyan(i)}`),sa(i),l("Reused running GUI",{url:i})}let o=await qf({...e,boardId:""});if(d(o))return o;let{url:s}=o.value;return console.log(`Epiq GUI running at ${Yf.cyan(s)}`),sa(s),l("Started GUI",{url:s})};import{Box as Dn}from"ink";import be from"react";import{Box as Md,Text as Ro}from"ink";import Rt,{useEffect as nE,useMemo as rE}from"react";import{ulid as oE}from"ulid";var Jf=({text:e,match:t,color:n,highlightColor:r=h.secondary,dimColor:o=!1})=>{if(!t)return Rt.createElement(Ro,{color:n,dimColor:o},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?Rt.createElement(Ro,{color:n,dimColor:o},e):Rt.createElement(Ro,{color:n,dimColor:o},e.slice(0,c),Rt.createElement(Ro,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},Qf=oE(),sE=e=>`${e}`,iE=e=>{let{pendingNavTarget:t}=Nn();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(he(b.NONE,{breadCrumb:n,contextNode:r,readOnly:g().readOnly,selectedNode:o}));return[...new Set(Object.values(b))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==b.PALETTE).map(i=>{let c=Ls(i),u=Zs.find(m=>m.intent===c);return{command:i,description:u?.description??`[${i}] Run command`,isAvailable:s.has(i)}}).filter(i=>i.command.toLowerCase().startsWith(e)||e.length>=2&&i.description.toLowerCase().includes(e)).sort((i,c)=>i.isAvailable!==c.isAvailable?i.isAvailable?-1:1:i.command.localeCompare(c.command))},aE=e=>le.text({id:Qf,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),dE=(e,t,n)=>le.text({id:sE(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),Pd=[],cE=e=>{Zf();let t=E.createNode(aE(g().rootNodeId));d(t)||!mn(t.value)||(Pd=[t.value,...e.map((n,r)=>dE(n,r,Qf)).map(E.createNode).filter(de).map(({value:n})=>n).filter(mn)],F.navigate({contextNode:t.value,selectedIndex:0}))},Zf=()=>{let e=Pd.map(t=>t.id);Pd=[];for(let t of e)E.deleteNode(t)};function eg({width:e,height:t}){let r=Wu().value.trim().toLowerCase(),o=rE(()=>iE(r),[r]);nE(()=>(cE(o),()=>{Zf()}),[o]);let s=g().selectedIndex;return Rt.createElement(Md,{flexDirection:"column",width:e,height:t-2},Rt.createElement(gt,{height:t-4,itemHeight:3,selectedIndex:s},o.map((i,c)=>{let u=c===s,m=i.isAvailable?h.accent:h.secondary2,p=i.isAvailable?"":"[unavailable] ";return Rt.createElement(Md,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:h.secondary,borderStyle:"single"},Rt.createElement(Ro,{color:m,dimColor:!i.isAvailable},u?"\u276F ":" ",Rt.createElement(Jf,{text:Fc(i.command),match:r,color:m,dimColor:!i.isAvailable})),Rt.createElement(Md,{paddingLeft:2},Rt.createElement(Jf,{text:p+i.description,match:r.length>=2?r:"",color:u&&i.isAvailable?h.primary:h.secondary2,dimColor:!i.isAvailable})))})))}import{Box as RE}from"ink";import xi from"react";import To from"chalk";import{Box as Ld,Text as tg}from"ink";import Ao,{useEffect as lE,useMemo as uE,useState as mE}from"react";var ng=To.hex(h.secondary),pE=To.inverse,fE=To.inverse.hex(h.secondary2),gE={hint:"",hints:[],overlap:0,remainder:""},og=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},hE=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=se(t);return{bg:r=>To.bgHex(n).black(r),bgCursor:r=>To.bgHex(n).inverse.black(r)}}return _a(t)},vE=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=og({value:e,command:t});if(!r)return null;let s=e.slice(r.end).match(/^\s*/)?.[0].length??0,i=r.end+s;return e.slice(i,i+n.length)!==n?null:{start:i,end:i+n.length}},rg=()=>({value:Ge.value,cursorPosition:Ge.cursorPosition,commandIsPending:Ge.commandIsPending,autoCompletion:Ge.commandMeta.autoCompletion??gE,infoMessage:Ge.commandMeta.infoMessage,validationStatus:Ge.commandMeta.validity,command:Ge.commandMeta.command,inputString:Ge.commandMeta.inputString,modifier:Ge.commandMeta.modifier}),yE=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,sg=({width:e,mode:t})=>{let[n,r]=mE(rg());lE(()=>{let C=()=>{let S=rg();r(A=>yE(A,S)?A:S)},I=Wa(C);return C(),()=>{I()}},[]);let{value:o,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:u,command:m,modifier:p,validationStatus:f}=n,v=c&&f===_t.Invalid,N=uE(()=>{let C=Math.max(0,Math.min(s,o.length)),I=og({value:o,command:m}),S=vE({value:o,command:m,modifier:p}),A=m?_a(m):null,B=hE({command:m,modifier:p}),M=(Fe,Se)=>{let Bn=I&&Se>=I.start&&Se<I.end,kr=S&&Se>=S.start&&Se<S.end;return Bn&&A?A.fg(Fe):kr&&B?B.bg(Fe):Fe},L=(Fe,Se)=>{let Bn=I&&Se>=I.start&&Se<I.end,kr=S&&Se>=S.start&&Se<S.end;return Bn&&A?A.fgCursor(Fe):kr&&B?B.bgCursor(Fe):pE(Fe)},k=o.slice(0,C),Ie=o[C]??" ",_e=C<o.length?o.slice(C+1):"",ct=Array.from(k).map((Fe,Se)=>M(Fe,Se)).join(""),Qe=L(Ie,C),Be=Array.from(_e).map((Fe,Se)=>M(Fe,C+1+Se)).join("");if(u.hint){let Fe=u.hint[u.overlap]??Ie;Qe=fE(Fe),Be=ng(u.remainder.slice(1)+_e)}return ng(t===y.PALETTE?"?":":")+ct+Qe+Be},[o,s,u,m,p]);return Ao.createElement(Ld,{flexDirection:"column",justifyContent:"flex-start"},Ao.createElement(Ld,{flexDirection:"column",paddingX:1,borderColor:h.secondary,borderStyle:"round",width:e},Ao.createElement(Ld,null,Ao.createElement(tg,null,N),i&&Ao.createElement(tg,{wrap:"truncate",color:v?h.red:h.secondary2},` ${i} `))))};import{Box as bE,Text as xE}from"ink";import ig from"react";var IE=(e,t)=>{let n=[],r=0;for(let o of e){let i=(n.length>0?" | ":"").length+o.length;if(r+i>t-4)break;n.push(o),r+=i}return n},ag=({width:e,availableHints:t})=>{let n=IE(t,e).join(" | ");return ig.createElement(bE,{width:e,borderStyle:"round",borderColor:h.secondary,paddingX:1},ig.createElement(xE,{color:h.secondary2},n.length?n:"\xA0"))};import{Box as EE,Text as yi}from"ink";import wo,{useEffect as SE,useRef as Mr,useState as CE}from"react";var NE=40,bi=.3,kd="\u2500",dg=1,cg=16,lg=({width:e})=>{let{replay:t}=q(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),i=s*dg,[c,u]=CE(0),m=Mr(r);m.current=r;let p=Mr(0),f=Mr(0),v=Mr(0),N=Mr(0),C=Mr(0);if(SE(()=>{if(!n){p.current=0,v.current=0,N.current=0,C.current=0,u(0);return}p.current=m.current,f.current=Date.now(),v.current=m.current;let M=setInterval(()=>{let L=Date.now(),k=m.current;if(k!==v.current){let Be=k-v.current,Fe=L-f.current;if(Be<0)N.current=0,C.current=0;else if(Be>0&&Fe>0){let Se=Be/Fe;N.current=N.current===0?Se:N.current*(1-bi)+Se*bi,C.current=C.current===0?Be:C.current*(1-bi)+Be*bi}p.current=k,f.current=L,v.current=k}let Ie=L-f.current,_e=Math.min(C.current,N.current*Ie),ct=Math.min(1,p.current+_e),Qe=Math.round(ct*i);u(Be=>Be===Qe?Be:Qe)},NE);return()=>clearInterval(M)},[n,i]),!t)return null;let I=M=>{let L=s>1?M/(s-1):0,k=Math.round(L*(cg-1))/(cg-1);return Ns(k)},S=Math.min(s,Math.floor(c/dg)),A=[];for(let M=0;M<S;M++){let L=I(M),k=A[A.length-1];k&&k.color===L?k.text+=kd:A.push({text:kd,color:L})}let B=kd.repeat(Math.max(0,s-S));return wo.createElement(EE,{width:e,borderStyle:"round",borderColor:h.secondary,paddingX:1,columnGap:1},wo.createElement(yi,{color:h.secondary2},"\u25B6"),wo.createElement(yi,null,A.map((M,L)=>wo.createElement(yi,{key:L,color:M.color},M.text)),wo.createElement(yi,{color:h.secondary,dimColor:!0},B)))};var Mo=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=q(),o=t===y.COMMAND_LINE||t===y.PALETTE;return xi.createElement(RE,null,o?xi.createElement(sg,{width:e,mode:t}):r==="replay"?xi.createElement(lg,{width:e}):xi.createElement(ag,{width:e,mode:t,availableHints:n}))};import{Box as Pn,Text as Pr}from"ink";import Je,{useEffect as AE,useMemo as TE}from"react";import{ulid as ug}from"ulid";var Ei=ug(),wE=()=>[...new Set([...g().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(e=>{let[t,n]=e.split("]"),r=t?.replace("[",""),o=n?.trim();return[r,o]}).filter(e=>e[0]!==void 0&&e[1]!==void 0).sort(([e],[t])=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(([e,t])=>({keys:e,action:t})),ME=e=>le.text({id:Ei,parentNodeId:e,rank:"000000",name:"Help",props:{},isVirtual:!0,readonly:!0}),PE=(e,t,n)=>le.text({id:ug(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,props:{value:e.action},readonly:!0,isVirtual:!0}),Ii=[],mg=()=>{let e=Ii.filter(n=>n.id!==Ei).map(n=>n.id),t=Ii.filter(n=>n.id===Ei).map(n=>n.id);Ii=[];for(let n of[...e,...t])E.deleteNode(n)},LE=e=>{mg();let t=E.createNode(ME(g().rootNodeId));if(d(t)||!mn(t.value))return logger.error("Could not attach help nodes");Ii=[t.value,...e.map((n,r)=>PE(n,r,Ei)).map(E.createNode).filter(de).map(({value:n})=>n).filter(mn)],F.navigate({contextNode:t.value,selectedIndex:0})},pg=({width:e,height:t})=>{let n=TE(()=>wE(),[]);AE(()=>(LE(n),()=>{mg()}),[n]);let r=g().selectedIndex;return Je.createElement(Pn,{flexDirection:"column",marginTop:3,borderColor:h.secondary,borderStyle:"round",width:e,height:t-2},Je.createElement(Pn,{paddingX:1,justifyContent:"center"},Je.createElement(Pr,{color:h.accent},"Help"),Je.createElement(Pr,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),Je.createElement(Pn,{paddingX:1,marginTop:1},Je.createElement(Pn,{width:20,justifyContent:"flex-end"},Je.createElement(Pr,{color:h.secondary},"Key(s)")),Je.createElement(Pn,{flexGrow:1,width:40,paddingLeft:2},Je.createElement(Pr,{color:h.secondary},"Action"))),Je.createElement(gt,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},i)=>{let c=i===r;return Je.createElement(Pn,{paddingX:1,key:`${o}-${s}-${i}`,flexDirection:"row"},Je.createElement(Pn,{width:20,justifyContent:"flex-end"},Je.createElement(Pr,{color:h.accent},o)),Je.createElement(Pn,{flexGrow:1,width:40,paddingLeft:2},Je.createElement(Pr,{color:c?h.primary:h.secondary2},s)))})))};import kE from"chalk";import{Box as rr,Text as De}from"ink";import ae from"react";var DE=8,BE=()=>{let e=nn({exclude:process.cwd()});return d(e)?[]:e.value.slice(0,DE)},fg=({width:e,height:t})=>{let n=BE();return ae.createElement(rr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},ae.createElement(De,{color:h.accent,bold:!0},"Initialize project"),ae.createElement(De,null,`This folder is not an ${kE.hex(h.accent)("epiq")} project yet.`),ae.createElement(De,{color:h.primary},"To start tracking issues here, we need to initialize a new",ae.createElement(De,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json "),"file in this repository."),ae.createElement(rr,{marginTop:1,flexDirection:"column"},ae.createElement(rr,null,ae.createElement(De,{color:h.accent}," "),ae.createElement(De,{color:h.primary},"Type "),ae.createElement(De,{backgroundColor:h.secondary}," :init "))),ae.createElement(rr,{marginTop:1},ae.createElement(De,{color:h.secondary2},"This will create, commit and push "),ae.createElement(De,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json ")),n.length>0&&ae.createElement(rr,{marginTop:1,flexDirection:"column"},ae.createElement(De,{color:h.accent,bold:!0},"Or open a recent project"),n.map((r,o)=>ae.createElement(rr,{key:r.projectId},ae.createElement(De,{color:h.accent},` ${o+1} `),ae.createElement(De,{color:h.primary},fr(r.root)),ae.createElement(De,{color:h.secondary2},` ${r.root}`))),ae.createElement(rr,{marginTop:1},ae.createElement(De,{color:h.accent}," "),ae.createElement(De,{color:h.primary},"Type "),ae.createElement(De,{backgroundColor:h.secondary}," :open 1 "),ae.createElement(De,{color:h.secondary2}," or "),ae.createElement(De,{backgroundColor:h.secondary}," :open <path> "))))};import{Box as Si,Text as Vt}from"ink";import Ue from"react";var FE=({isDone:e,command:t,value:n})=>Ue.createElement(Si,null,Ue.createElement(Vt,{color:h.accent,dimColor:e},e?" \u2714 ":" "),Ue.createElement(Vt,{dimColor:e},"Type "),Ue.createElement(Vt,{backgroundColor:h.secondary,dimColor:e}," "+t+" "),n!==void 0&&Ue.createElement(Ue.Fragment,null,Ue.createElement(Vt,{dimColor:e}," "),Ue.createElement(Vt,{color:h.secondary,dimColor:e},"<"+n+">"))),OE=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function Dd({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:i,isSetAutoSync:c}=bn(),u=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:s,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:i,message:"Almost there. Configure auto sync."}],m=u.findIndex(f=>!f.done),p=m===-1?void 0:u[m];return Ue.createElement(Si,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},Ue.createElement(Vt,{color:h.accent,bold:!0},"Welcome! \u{1F539}"),Ue.createElement(Vt,null,"Let's get you started - it's a breeze."),Ue.createElement(Vt,{color:h.secondary2},"Remember - you can always search available commands by typing:",Ue.createElement(Vt,{color:h.accent}," ? ")),p&&Ue.createElement(Vt,{color:h.secondary2},p.message),Ue.createElement(Si,{flexDirection:"column"},u.map((f,v)=>m===-1||v<=m?Ue.createElement(Si,{key:f.key,marginBottom:1},Ue.createElement(FE,{isDone:f.done,command:f.command,value:f.done?OE(f.value):void 0})):null)))}import Ti from"chalk";import{Box as Lo,Text as Lr}from"ink";import Te from"react";import{Box as Ci,Text as gg}from"ink";import Ln from"react";import UE from"chalk";var _E=e=>(E.getTag(e)?.name??"").length+3,$E=e=>{let t=E.getContributor(e);return(t?t.name:"").length+3},hg=({width:e})=>{let{viewMode:t}=Z(),n=q(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[o.id]?.[s],u=an(c?.id??o.id,"TICKET"),m=de(u)?u.value:void 0,p=(m?.props.tags??[]).filter(k=>E.getTag(k)),f=m?.props.assignees??[],v=m?.parentNodeId?!xd(o.id,m.parentNodeId)&&t==="dense":!1,N=r.map((k,Ie)=>{let _e=Ie===r.length-1,ct=ee(k.id),Qe=_e?ct?.[s]?.title:void 0;return`${Ie?" / ":""}${k.title??""}${Qe?` \u25B8 ${Qe}`:""}`}).join(""),C=m?E.getCommentsByIssue(m.id):[],I=C.length?String(C.length).length+11:0,S=v?p.reduce((k,Ie)=>k+_E(Ie),0)+f.reduce((k,Ie)=>k+$E(Ie),0)+I:0,A=c?.id!=null&&!(t==="wide"&&P(c)),B=Math.max(0,e-S),M=N.substring(0,B)+(A?UE.hex(h.secondary2).dim(` ${V(c.id)}`):""),L=v?[...p.map(k=>Ln.createElement(Ci,{key:`tag-${k}`,paddingLeft:1},Ln.createElement(xr,{id:k}))),...f.map(k=>Ln.createElement(Ci,{key:`assignee-${k}`,paddingLeft:1},Ln.createElement(En,{id:k}))),C.length?Ln.createElement(Ci,{key:"comments",paddingLeft:1},Ln.createElement(gg,{color:h.accent},"[",C.length," comment",C.length===1?"":"s","]")):null]:[];return Ln.createElement(Ci,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Ln.createElement(gg,{color:h.secondary2},M),L)};import{Box as jE,Text as vg}from"ink";import Ni from"react";var HE=({filters:e})=>Ni.createElement(jE,{columnGap:1},Ni.createElement(vg,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Ni.createElement(vg,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),yg=Ni.memo(HE);import{Box as WE,Text as Ri}from"ink";import Po from"react";function bg(){let{eventLog:e,unappliedEvents:t}=q(),n=e.at(-1)?.id,r=qo(n??""),o=de(r)?Us(r.value):"INVALID DATE";return Po.createElement(WE,{paddingLeft:1},Po.createElement(Ri,{backgroundColor:h.accent,color:h.secondary}," Readonly "),Po.createElement(Ri,{color:h.accent}," "+t.length+" edits ago at "+o+"."),Po.createElement(Ri,{color:h.accent}," Resume with "),Po.createElement(Ri,{backgroundColor:h.accent,color:h.secondary}," ",":peek now"," "))}import{Box as GE,Text as Bd}from"ink";import Ai from"react";function xg(){let{replay:e}=q();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return Ai.createElement(GE,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},Ai.createElement(Bd,{backgroundColor:h.accent,color:h.secondary}," \u25B6 REPLAY "),Ai.createElement(Bd,{color:h.secondary2},Us(new Date(r))),Ai.createElement(Bd,{color:h.accent},`${t}/${n} edits`))}import Fd from"chalk";import{Box as VE,Text as Ig}from"ink";import Od,{useEffect as KE,useState as zE}from"react";var qE=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],YE=150,Eg=12,XE=.36,Sg=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},JE=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},QE=(e,t,n)=>{let r=Sg(e),o=Sg(t);return JE({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},ZE=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,s=e[r],i=e[Math.min(r+1,e.length-1)];return QE(s,i,o)};function Cg({syncStatus:e,autoSync:t}){let[n,r]=zE(0);KE(()=>{if(e.status!=="syncing"){r(0);return}let c=0,u=setInterval(()=>{c+=1;let m=(Math.sin(c*XE)+1)/2,p=Math.round(m*(Eg-1));r(f=>f===p?f:p)},YE);return()=>clearInterval(u)},[e.status]);let o={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},i={synced:h.secondary2,failed:h.yellow,offline:h.secondary2,pending:h.secondary2,syncing:ZE(qE,n/(Eg-1))??""}[e.status];return Od.createElement(VE,null,Od.createElement(Ig,null,Fd.hex(h.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Od.createElement(Ig,null,Fd.hex(i)("\u25CF")+Fd.hex(h.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import wg from"chalk";import{Text as Mg}from"ink";import Pg,{useEffect as rS,useState as oS}from"react";import Ud from"chalk";var eS="https://registry.npmjs.org/epiq/latest",_d=null,Ng=0,tS=1e3*60*60*24,Rg=e=>e.replace(/^v/,""),nS=(e,t)=>{let n=Rg(e).split(".").map(Number),r=Rg(t).split(".").map(Number);for(let o=0;o<Math.max(n.length,r.length);o++){let s=n[o]??0,i=r[o]??0;if(s>i)return 1;if(s<i)return-1}return 0},Ag=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(_d&&Date.now()-Ng<tS)return _d;try{let t=await fetch(eS);if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.status}`);let r=(await t.json()).version??null,o={current:e,latest:r,updateAvailable:r?nS(r,e)>0:!1};return _d=o,Ng=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},Tg=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,i)=>s!=n[i]);return r.map((s,i)=>i>=o?Ud.hex(h.accent).dim(s):Ud.hex(h.secondary).dim(s)).join(Ud.hex(h.secondary2).dim("."))};function Lg(){let[e,t]=oS({current:Gt,latest:null,updateAvailable:!1});return rS(()=>{let n=!0;return Ag(Gt).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?Pg.createElement(Mg,{dimColor:!0,color:h.secondary2},Gt+" "):Pg.createElement(Mg,null,wg.hex(h.secondary2).dim(Gt),wg.hex(h.accent).dim(" \u2197 "),Tg(Gt,e.latest))}function ko({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=q(),{userName:i,preferredEditor:c,autoSync:u}=Z(),m=64,p=process.stdout.columns-m-8,f=t||n==="replay",v=s?Yt(s.currentLabel,Math.max(0,p)):"";return Te.createElement(Lo,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?Te.createElement(Lo,{paddingLeft:1},Te.createElement(Lr,{color:h.secondary2},v)):f?Te.createElement(Lr,null," "):o===y.PALETTE?Te.createElement(Lo,null,Te.createElement(Lr,{color:h.accent},"Command Palette"),Te.createElement(Lr,{dimColor:!0,color:h.secondary2}," ","- search, select and press enter")):Te.createElement(Lo,{paddingLeft:1},e.length>0?Te.createElement(yg,{filters:e}):Te.createElement(hg,{width:p})),n==="live"?Te.createElement(Lo,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},Te.createElement(Cg,{autoSync:!!u,syncStatus:r}),Te.createElement(Lr,null,Ti.hex(h.secondary2).dim("Mode: ")+Ti.hex(h.secondary2).dim(o.padEnd(8," "))," "),Te.createElement(kg,{icon:"@",value:i}),Te.createElement(kg,{icon:"\u276F",value:c}),Te.createElement(Lg,null)):"",n==="peek"?Te.createElement(bg,null):"",n==="replay"?Te.createElement(xg,null):"")}function kg({icon:e,value:t}){return Te.createElement(Lr,null,Ti.dim(e)+Ti.hex(h.accent)(` ${t??"-"} `))}import{Box as sS,Text as iS}from"ink";import Do from"react";import{Box as wi,Text as $d}from"ink";import kn from"react";function jd(){let e=q(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?J(t?.id):[];return kn.createElement(wi,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:h.secondary,width:s},kn.createElement(wi,{padding:1,paddingTop:0,paddingBottom:0},kn.createElement($d,null,"Select a board:")),kn.createElement(wi,{padding:1,flexDirection:"column"},i.map((c,u)=>{let m=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===u,f=J(c.id).flatMap(({id:v})=>ee(v)).length;return kn.createElement(wi,{key:c.id??u},kn.createElement($d,{color:m?h.accent:h.secondary2},kn.createElement(Ve,{isSelected:m})),kn.createElement($d,{color:m?h.accent:h.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var aS=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:i})=>{let{renderedChildrenIndex:c}=q(),u=n.find(({context:v})=>v==="BOARD"),f=s-1-3;return Do.createElement(sS,{flexDirection:"row"},e.context==="WORKSPACE"?Do.createElement(jd,null):u?Do.createElement(js,{height:f,width:i,swimlanes:(c[u.id]??[]).filter(v=>v!==void 0&&Lt(v)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Do.createElement(iS,null))},Dg=Do.memo(aS);import{useEffect as dS}from"react";var cS=e=>{dS(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:i}=Z();i&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:u}=g();u==="default"&&!c&&vs(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},Bg=({autoSync:e})=>(cS(e),null);function Hd({width:e,height:t}){let n=q(),{autoSync:r,viewMode:o}=Ac(),s=n.filters;if(n.mode===y.HELP)return be.createElement(Dn,{flexDirection:"column"},be.createElement(pg,{width:e,height:t}));if(n.mode===y.PALETTE)return be.createElement(Dn,{flexDirection:"column"},be.createElement(ko,{filters:s}),be.createElement(eg,{width:e,height:t-2}),be.createElement(Mo,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=bn(),c=!i,u=i&&!n.hasProjectDefinition;if(c)return be.createElement(Dn,{flexDirection:"column"},be.createElement(Dn,{flexDirection:"column"},be.createElement(ko,{hideBreadCrumb:!0,filters:s}),be.createElement(Dd,{height:t,width:e})),be.createElement(Mo,{width:e,mode:n.mode,availableHints:n.availableHints}));if(u)return be.createElement(Dn,{flexDirection:"column"},be.createElement(Dn,{flexDirection:"column"},be.createElement(ko,{hideBreadCrumb:!0,filters:s}),be.createElement(fg,{height:t,width:e})),be.createElement(Mo,{width:e,mode:n.mode,availableHints:n.availableHints}));let m=qe(n.breadCrumb??[],"BOARD");if(de(m)){let p=m.value.id,f=J(p).length,v=3,N=Math.floor(e/v),C=Math.floor(e/Math.max(f,1));e=Math.min(C,N)*Math.max(f,v)}return be.createElement(Dn,{flexDirection:"column"},be.createElement(Bg,{autoSync:r}),be.createElement(Dn,{flexDirection:"column"},be.createElement(ko,{filters:s}),be.createElement(Dg,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),be.createElement(Mo,{width:e,mode:n.mode,availableHints:n.availableHints}))}import lS from"readline";var Mi,Pi,Kt,uS=new Set([x.MoveCursorLeft,x.EraseInputWord,x.MoveCursorLeftOfWord,x.MoveCursorRight,x.MoveCursorRightOfWord,x.NavToPreviousContainer,x.NavToNextContainer,x.NavPreviousItem,x.NavNextItem,x.SetViewDense,x.SetViewWide,x.Confirm,x.Exit,x.Yank,x.InitCommandLine,x.InitCommandPalette,x.ExitCommandLine,x.CaptureInput,x.EraseInput,x.EraseInputWord,x.HideHelp,x.ViewHelp,x.SetViewDense,x.SetViewWide,x.GetLastCommandFromHistory,x.GetNextCommandFromHistory,x.AutoCompleteCommand]),mS=new Set([x.NavPreviousItem,x.NavNextItem,x.NavToPreviousContainer,x.NavToNextContainer,x.Confirm,x.Exit,x.InitCommandPalette,x.InitMove,x.MoveNextItem,x.MovePreviousItem,x.MoveToNextContainer,x.MoveToPreviousContainer,x.Delete,x.AddItem,x.EditTitle,x.EditDescription,x.ConfirmMove,x.Edit,x.ViewHelp,x.Yank]),Fg=async e=>{if(e.ctrl&&e.name==="c")return F.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=g(),s=Gu(e,n);if(!s||r&&!uS.has(s)||o==="replay"&&n===y.DEFAULT&&mS.has(s))return;let i=t[n]?.[s];if(i?.action)try{await i.action(i,e)}catch(c){logger.error(c)}},pS=()=>async function(t,n){n.name!=="escape"&&(Kt&&(clearTimeout(Kt),Kt=void 0),await Fg(n))},fS=()=>async function(t){if(t.length===1&&t[0]===27){Kt&&clearTimeout(Kt),Kt=setTimeout(()=>{Fg({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Kt=void 0},25);return}Kt&&(clearTimeout(Kt),Kt=void 0)};function Og(){Mi&&process.stdin.removeListener("keypress",Mi),Pi&&process.stdin.removeListener("data",Pi),Mi=pS(),Pi=fS(),lS.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Pi),process.stdin.on("keypress",Mi)}async function Ug(){try{let e=sr({});if(d(e))return Bt(0,e.message);let t=Pt();de(t)&&je(t.value);let n=$e(process.cwd()),r=de(n)?await qs(n.value):qm();if(d(r))return r;let o=Wd();return d(o)?Bt(6,o.message):(Og(),l("Booted Epiq",void 0))}catch(e){return Bt(0,ms(e))}}Mm();var yS=`${At.bold("Epiq CLI")}
76
81
 
77
- ${Nt.dim("Boot in directory:")}
78
- ${Nt.cyan("$ epiq")}
82
+ ${At.dim("Boot in directory:")}
83
+ ${At.cyan("$ epiq")}
79
84
 
80
- ${Nt.dim("Launch GUI:")}
81
- ${Nt.cyan("$ epiq gui")}
85
+ ${At.dim("Launch GUI:")}
86
+ ${At.cyan("$ epiq gui")}
82
87
 
83
- ${Nt.dim("Act as somebody other than the configured user:")}
84
- ${Nt.cyan("$ epiq --as claude")}
85
- `,Cd=cE(uE,{importMeta:import.meta,version:$t,flags:{init:{type:"boolean",default:!1},as:{type:"string"}}}),yi=Cd.input[0];yi&&yi!=="gui"&&(console.error(Nt.red(`Unknown command: ${yi}`)),process.exit(1));if(Cd.flags.as!==void 0){let e=Td(Cd.flags.as,"--as");d(e)&&(console.error(Nt.red(e.message)),process.exit(1))}var Jf=process.stdout.columns||120,Qf=process.stdout.rows||20,bi=null,mE=e=>{try{return bi?(bi.rerender(e),l("Rerendered app",void 0)):(bi=dE(e),l("Rendered app",void 0))}catch(t){return i(`Unable to render app: ${Jo(t)}`)}},Sd=()=>mE(lE.createElement(Ed,{width:Jf,height:Qf}));process.stdout.on("resize",()=>{if(Jf=process.stdout.columns||120,Qf=process.stdout.rows||20,!bi)return;let e=Sd();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(yi==="gui"){let e=await df({repoRoot:process.cwd()});d(e)&&(console.error(Nt.red(`Failed to start Epiq GUI:
86
- ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await Xf();d(e)&&(logger.info(e.message),console.error(Nt.red(`Failed to boot Epiq:
87
- ${e.message}`)),process.exitCode=1)}export{Sd as renderApp};
88
+ ${At.dim("Act as somebody other than the configured user:")}
89
+ ${At.cyan("$ epiq --as claude")}
90
+ `,Gd=hS(yS,{importMeta:import.meta,version:Gt,flags:{init:{type:"boolean",default:!1},as:{type:"string"}}}),Li=Gd.input[0];Li&&Li!=="gui"&&(console.error(At.red(`Unknown command: ${Li}`)),process.exit(1));if(Gd.flags.as!==void 0){let e=Oi(Gd.flags.as,"--as");d(e)&&(console.error(At.red(e.message)),process.exit(1))}var _g=process.stdout.columns||120,$g=process.stdout.rows||20,ki=null,bS=e=>{try{return ki?(ki.rerender(e),l("Rerendered app",void 0)):(ki=gS(e),l("Rendered app",void 0))}catch(t){return a(`Unable to render app: ${ms(t)}`)}},Wd=()=>bS(vS.createElement(Hd,{width:_g,height:$g}));process.stdout.on("resize",()=>{if(_g=process.stdout.columns||120,$g=process.stdout.rows||20,!ki)return;let e=Wd();d(e)&&logger.info(`[boot:resize] ${e.message}`)});if(Li==="gui"){let e=await Xf({repoRoot:process.cwd()});d(e)&&(console.error(At.red(`Failed to start Epiq GUI:
91
+ ${e.message}`)),process.exitCode=1)}else{console.clear();let e=await Ug();d(e)&&(logger.info(e.message),console.error(At.red(`Failed to boot Epiq:
92
+ ${e.message}`)),process.exitCode=1)}export{Wd as renderApp};