epiq 1.12.1 → 1.12.3
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/gui/main.js +117 -117
- package/dist/index.js +96 -95
- package/dist/mcp.js +1 -1
- package/package.json +3 -3
- package/readme.md +9 -14
package/dist/index.js
CHANGED
|
@@ -1,117 +1,118 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
`,"utf8"),u("Created project.json",null)}catch(
|
|
4
|
-
`);return i===-1?"":s.slice(i+1)}finally{
|
|
5
|
-
`);if(n[n.length-1]===""&&n.pop(),t<=
|
|
2
|
+
import $t from"chalk";import{render as yP}from"ink";import vP from"meow";import bP from"react";import hI from"node:crypto";var Zn={Success:"success",Fail:"fail"},l=e=>({status:Zn.Fail,message:e,value:null}),u=(e,t)=>({status:Zn.Success,message:e,value:t}),a=e=>e.status==="fail",ve=e=>e.status==="success";var Dn="EPIQ_USER_NAME",_i="EPIQ_USER_ID",Pm="0123456789ABCDEFGHJKMNPQRSTVWXYZ",yI=26,uc=80,mc=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),ji=e=>e.trim().length>0&&e.length<=uc,cr=e=>e.trim().toLowerCase(),vI=e=>{let t=hI.createHash("sha256").update(`epiq:actor:${cr(e)}`).digest(),n="";for(let o=0;o<yI;o++)n+=Pm[(t[o]??0)%Pm.length];return n},dr=(e,t=process.env)=>{let n=(t[Dn]??"").trim(),o=(t[_i]??"").trim();return n?ji(n)?!o&&e.userId&&e.userName&&cr(e.userName)===cr(n)?u("Actor override names the configured user",{userId:e.userId,userName:e.userName}):o&&!mc(o)?l(`${_i} must be 26 characters of Crockford base32`):o&&e.userId&&o===e.userId?l(`${_i} is the configured user's own id; using it under a different name would rename them on the board`):u("Resolved actor from environment",{userId:o||vI(n),userName:o?n:cr(n)}):l(`${Dn} must be 1-${uc} characters of text`):o?l(`${_i} is set without ${Dn}`):u("No actor override",null)},pc=(e,t,n=process.env)=>{let o=e.trim();if(!ji(o))return l(`${t} must be 1-${uc} characters of text`);let r=(n[Dn]??"").trim();return r&&cr(r)!==cr(o)?l(`${t} names ${o}, but ${Dn} names ${r}`):(r||(n[Dn]=o),u("Applied actor name argument",r||o))};import JI from"node:path";import{z as en}from"zod";var ur=e=>{let t=typeof e=="number"?e:Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<3e3||t>864e5?null:t},mr=e=>e==null||!Number.isFinite(e)?1e4:Math.min(864e5,Math.max(1,e));import fs from"node:fs";import gn from"node:path";import eo from"node:fs";import Et from"node:path";import as from"node:fs";import{ulid as bI}from"ulid";import{z as $i}from"zod";var xI="__epiq_state__",II=$i.object({projectId:$i.string().min(1),stateBranch:$i.string().min(1),createdAt:$i.iso.datetime()}),Ui=()=>({projectId:bI(),stateBranch:xI,createdAt:new Date().toISOString()}),Mt=e=>{let t=pr(e);if(!as.existsSync(t))return l("Missing .epiq/project.json");try{let n=as.readFileSync(t,"utf8"),o=JSON.parse(n),r=II.safeParse(o);return r.success?u("Read project.json",r.data):l(`Invalid .epiq/project.json: ${r.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return l(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},fn=e=>{let t=Mt(e);return a(t)?l(t.message):u("Read projectId",t.value.projectId)},fc=({repoRoot:e,fileContents:t})=>{let n=Po(e),o=pr(e);try{if(as.mkdirSync(n,{recursive:!0}),as.existsSync(o)){let r=Mt(e);return a(r)?l(r.message):u("Project already initialized",null)}return as.writeFileSync(o,JSON.stringify(t,null,2)+`
|
|
3
|
+
`,"utf8"),u("Created project.json",null)}catch(r){return l(r instanceof Error?`Failed to initialize project: ${r.message}`:"Failed to initialize project")}};import EI from"node:os";import SI from"node:path";var Jt=".epiq-global",Bn=()=>process.env.EPIQ_GLOBAL_DIR??SI.join(EI.homedir(),Jt);var gc=(e,t)=>{let n=new Map,o=t??((...s)=>JSON.stringify(s)),r=((...s)=>{let i=o(...s);if(!n.has(i)){let c=e(...s).then(d=>(a(d)&&n.delete(i),d));n.set(i,c)}return n.get(i)});return r.clear=()=>n.clear(),r};import Qt from"fs";import xc from"path";import RI from"util";var Lm=500,Ic=4*1024*1024,hc=16*1024,CI=50,yc=0,km=()=>process.env.EPIQ_MCP==="true",NI=()=>{let e=process.cwd(),t=Hi(e);return a(t)?km()?xc.join(Bn(),"epiq-mcp.log"):void 0:xc.join(t.value,gt,"log","epiq.log")},AI=(e,t)=>{let n=Qt.statSync(e).size;if(n<=t)return Qt.readFileSync(e,"utf8");let o=Qt.openSync(e,"r");try{let r=Buffer.alloc(t);Qt.readSync(o,r,0,t,n-t);let s=r.toString("utf8"),i=s.indexOf(`
|
|
4
|
+
`);return i===-1?"":s.slice(i+1)}finally{Qt.closeSync(o)}};function wI(e){if(!Qt.existsSync(e))return;let t=Qt.statSync(e).size,n=AI(e,Ic).split(`
|
|
5
|
+
`);if(n[n.length-1]===""&&n.pop(),t<=Ic&&n.length<=Lm)return;let o=n.slice(-Lm).join(`
|
|
6
6
|
`)+`
|
|
7
|
-
`;
|
|
8
|
-
`;try{
|
|
9
|
-
`);d(n?{stdout:i,stderr:f,exitCode:124}:l(f))},p);
|
|
10
|
-
`)))}),
|
|
11
|
-
`)));return}d(u("Git command succeeded",{stdout:i,stderr:c,exitCode:g}))})}),U=({args:e,cwd:t})=>
|
|
12
|
-
${s}`:""}`));return}let m=Buffer.concat(
|
|
7
|
+
`;Qt.writeFileSync(e,o,"utf8")}var TI=e=>{if(e.length<=hc)return e;let t=e.length-hc;return`${e.slice(0,hc)} \u2026 [${t} more chars]`};function vc(e,t,n=!1){let o=NI();if(!o)return;let r=TI(RI.format(...t)),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${r}
|
|
8
|
+
`;try{Qt.mkdirSync(xc.dirname(o),{recursive:!0}),Qt.appendFileSync(o,c,"utf8"),yc++,(yc>=CI||Qt.statSync(o).size>Ic)&&(yc=0,wI(o))}catch{}}var bc=()=>km()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",ee={info(...e){let t=bc();(t==="info"||t==="debug")&&vc("[Info]",e,!1)},debug(...e){bc()==="debug"&&vc("[Debug]",e,!0)},error(...e){let t=bc();if(t==="error"||t==="info"||t==="debug"){let o=e.some(r=>r instanceof Error)?void 0:new Error().stack;vc("[Error]",[...e,o].filter(Boolean),!1)}}};globalThis.logger=ee;import{spawn as Bm}from"node:child_process";import Lt from"node:fs";import It from"node:path";var Ce={stage:({cwd:e,pathspec:t,ignoreRemoval:n=!1})=>U({args:["add",...n?["--ignore-removal"]:[],...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:o})=>U({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...o?.length?["--",...o]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>U({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>U({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>U({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:o=!1})=>{let r=t&&n?["push","--no-verify",...o?["-u"]:[],t,n]:["push","--no-verify"];return U({args:r,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>U({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>U({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>U({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>U({args:["worktree","prune"],cwd:e})};var ke=e=>{let t=oe(e);if(a(t))return l("Unable to resolve epiq project root");let n=Mt(t.value);return a(n)?l("Unable to read project.json"):u("Resolved state branch",n.value.stateBranch)},Pt="origin";var Ec=1e4,MI=12e4,PI=new Set(["fetch","push","pull","clone","ls-remote","rebase","checkout","worktree"]),LI=e=>{let t=e.find((n,o)=>!n.startsWith("-")&&e[o-1]!=="-c");return t&&PI.has(t)?MI:Ec},kI=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(It.delimiter))if(t)for(let n of e){let o=It.join(t,n);try{if(!Lt.statSync(o).isFile())continue;return Lt.accessSync(o,Lt.constants.X_OK),o}catch{continue}}return"git"},Om=kI(),Fm={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},_m=({args:e,cwd:t,allowFail:n})=>new Promise(o=>{if(!Lt.existsSync(t)){let f=`Git cwd does not exist: ${t}`;if(n){o({stdout:"",stderr:f,exitCode:1});return}o(l(f));return}let r=Bm(Om,e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Fm}),s=!1,i="",c="",d=f=>{s||(s=!0,clearTimeout(m),o(f))},p=LI(e),m=setTimeout(()=>{r.kill("SIGTERM");let f=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${p}ms`].join(`
|
|
9
|
+
`);d(n?{stdout:i,stderr:f,exitCode:124}:l(f))},p);r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",f=>{i+=f}),r.stderr.on("data",f=>{c+=f}),r.on("error",f=>{if(n){d({stdout:i,stderr:f.message,exitCode:1});return}d(l([`git ${e.join(" ")}`,`cwd=${t}`,f.message].join(`
|
|
10
|
+
`)))}),r.on("close",f=>{let g=f??1;if(n){d({stdout:i,stderr:c,exitCode:g});return}if(g!==0){d(l([`git ${e.join(" ")}`,c.trim()||i.trim()||"Git command failed"].filter(Boolean).join(`
|
|
11
|
+
`)));return}d(u("Git command succeeded",{stdout:i,stderr:c,exitCode:g}))})}),U=({args:e,cwd:t})=>_m({args:e,cwd:t,allowFail:!1}),Le=({args:e,cwd:t})=>_m({args:e,cwd:t,allowFail:!0}),Wi=(e,t)=>new Promise(n=>{if(e.length===0){n(u("No blobs to read",new Map));return}let o=Bm(Om,["cat-file","--batch"],{cwd:t,stdio:["pipe","pipe","pipe"],env:Fm}),r=[],s="",i=!1,c=p=>{i||(i=!0,clearTimeout(d),n(p))},d=setTimeout(()=>{o.kill("SIGTERM"),c(l(`git cat-file --batch timed out after ${Ec}ms`))},Ec);o.stdout.on("data",p=>r.push(p)),o.stderr.setEncoding("utf8"),o.stderr.on("data",p=>{s+=p}),o.on("error",p=>c(l(p.message))),o.on("close",p=>{if(p!==0){c(l(`git cat-file --batch exited ${p}${s?`
|
|
12
|
+
${s}`:""}`));return}let m=Buffer.concat(r),f=new Map,g=0;for(let h of e){let x=m.indexOf(10,g);if(x===-1){c(l(`git cat-file --batch output ended before a header for ${h}`));return}let b=m.toString("utf8",g,x);g=x+1;let R=/^[0-9a-f]{4,64} \S+ (\d+)$/.exec(b);if(!R||!R[1]){c(l(`Unexpected git cat-file --batch header: "${b}"`));return}let S=Number(R[1]);f.set(h,m.toString("utf8",g,g+S)),g+=S+1}c(u("Read blobs",f))}),o.stdin.write(e.join(`
|
|
13
13
|
`)+`
|
|
14
|
-
`),
|
|
15
|
-
${
|
|
16
|
-
${
|
|
17
|
-
`).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(
|
|
18
|
-
${t.stderr.trim()}`):u("Aborted stale rebase",!0)},
|
|
19
|
-
${
|
|
20
|
-
${s.message}`);let i=await
|
|
21
|
-
`+
|
|
22
|
-
`+
|
|
23
|
-
|
|
24
|
-
`,
|
|
25
|
-
`+t.message);let
|
|
26
|
-
`).filter(Boolean).filter(i=>i!==gt);if(
|
|
27
|
-
${
|
|
28
|
-
`),u("Config written",null)}catch{return l(`Unable to write ~/${
|
|
29
|
-
`);import{spawn as
|
|
30
|
-
`,"utf8")}catch(n){return l(`Unable to write ${ra}: ${n instanceof Error?n.message:String(n)}`)}return u("Recorded recent project",e)},$n=({exclude:e}={})=>{let t=Gp();if(a(t))return t;let n=e===void 0?null:$p(e);return u("Listed recent projects",t.value.filter(r=>n===null||$p(r.root)!==n).filter(Wp).sort(Hp))},oa=({root:e,now:t=Date.now()})=>{let n=Cs.resolve(e),r=fn(n);if(a(r))return l(r.message);let o=r.value,s=Gp(),i=a(s)?[]:s.value,c=[{projectId:o,root:n,lastOpenedAt:t},...i.filter(d=>d.projectId!==o&&d.root!==n)].filter(Wp).sort(Hp).slice(0,hE);return bE(c)};var Gc=null,Vp=e=>{Gc=e},zp=e=>Gc?Gc(e):[];var Kp=[],So=e=>{Kp=e},Ro=()=>Kp;var Un=()=>{let e=V(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1,o=qp(),s=o.length>0?null:Vc(),i=s!==null&&(e.declinedEmailBoards??[]).includes(s),c=o.length>0||i||s===null;return{isSetupDone:n&&t&&r&&c,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r,isSetEmails:c,claimedEmails:o,emailSetupDeclined:i}},Vc=()=>{let e=re(process.cwd());if(a(e))return null;let t=fn(e.value);return a(t)?null:t.value||null},qp=()=>{let{userId:e}=V();return e?zp(e):[]},Yp=()=>qp().length>0;var zc=()=>{let e=re(process.cwd());if(a(e))return!1;let t=Mt(e.value);return ve(t)},Xp=e=>e===!0?"on":e===!1?"off":null,Jp=e=>e==="on"?!0:e==="off"?!1:null,Qp=()=>{let e=Un();if(!e.isSetUserName)return"config username ";if(!e.isSetPreferredEditor)return"config editor ";if(!e.isSetAutoSync)return"config autoSync ";if(!zc())return"init";if(!e.isSetEmails){let{gitEmail:t}=V(),n=Ro()[0]??t;return n&&nr(n)?`config emails ${n}`:"config emails "}return null};var xE=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[he,sa]=xE;var IE=e=>e.props.tags??[],EE=e=>e.props.assignees??[],bn=e=>IE(e).map(t=>N.getTag(t)).filter(t=>!!t),xn=e=>EE(e).map(t=>N.getContributor(t)).filter(t=>!!t),ia=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!_(n)?l("Invalid untag target"):u("Retrieved tags from ticket in breadcrumb",bn(n))},aa=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!_(n)?l("Invalid unassign target"):u("Retrieved assignees from ticket in breadcrumb",xn(n))};var C={PALETTE:"?",EXIT:"exit",INIT:"init",OPEN:"open",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",REPLAY:"replay",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",YANK:"yank",SYNC:"sync",EXPORT:"export",NONE:""};var SE=/^(\d+)(h|d|w|mo|y)$/,RE=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,CE=({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},NE=(e,t=new Date)=>{let n=e.match(SE);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}},AE=e=>{let t=e.match(RE);if(!t)return null;let[,n,r,o,s,i]=t,c=Number(n),d=Number(r),p=Number(o),m=s?Number(s):0,f=i?Number(i):0;return CE({year:c,month:d,day:p,hour:m,minute:f})?new Date(c,d-1,p,m,f):null},Lr=e=>{let t=e.trim().toLowerCase();return NE(t)??AE(t)};var Zp=/^(\d+)(s|m)?$/,la=e=>{let t=e.trim().toLowerCase().match(Zp);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},ca=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&Zp.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},ef=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,TE=[{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}],Kc=(e=TE)=>{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 wE=["BOARD","TICKET","SWIMLANE","COMMENT"],ye={EDITOR:"editor",VIEW:"view",USERNAME:"username",EMAILS:"emails",EMAILS_UNCLAIM:"emails-unclaim",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},Dt={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},qe={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},ME=[ye.EDITOR,ye.VIEW,ye.USERNAME,ye.EMAILS,ye.EMAILS_UNCLAIM,ye.AUTOSYNC,ye.SYNC_DEBOUNCE_MS,ye.ATTACHMENT_MAX_KB,ye.LOG_LEVEL],PE=(e=v().selectedNode?.context)=>{switch(e){case"TICKET":return[Dt.TITLE,Dt.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Dt.TITLE];case"COMMENT":return[Dt.COMMENT];default:return[]}},Yc=[String(3e3),"5000","15000","30000","60000"],Xc=["250","500","1000"],rf=["10s","20s","30s","45s"],kr=[C.EXIT,C.SYNC,C.HELP,C.EXPORT,C.CONFIG,C.YANK],da=[C.NEW,C.EDIT,C.DELETE,C.MOVE],qc=[C.TAG,C.UNTAG,C.ASSIGN,C.UNASSIGN,C.CLOSE_ISSUE,C.RE_OPEN_ISSUE,C.EDIT,C.COMMENT],tf=[C.FILTER,C.PEEK,C.REPLAY],LE={WORKSPACE:[...kr,...da],BOARD:[...tf,...kr,...da],SWIMLANE:[...tf,...kr,...da],TICKET:[...kr,...da,...qc],FIELD:[...kr,...qc],FIELD_LIST:[...kr,...qc],TEXT:[...kr],COMMENT:[C.EDIT,C.DELETE,C.YANK]},kE=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ns=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&_(n)),nf=e=>e.parentNodeId===he,DE=({selectedNode:e,breadCrumb:t})=>{let n=PE(e?.context);return Ns({breadCrumb:t,selectedNode:e})?n.includes(Dt.DESCRIPTION)?n:[...n,Dt.DESCRIPTION]:n},BE=({selectedNode:e,breadCrumb:t})=>{let n=Ns({breadCrumb:t,selectedNode:e});return n?[qe.REF,qe.TITLE,...n.props?.description?.trim()?[qe.DESCRIPTION]:[],...bn(n).length>0?[qe.TAGS]:[],...xn(n).length>0?[qe.ASSIGNEES]:[]]:e?[qe.REF,qe.TITLE]:[]},Jc=()=>{let e=$n({exclude:process.cwd()});return a(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},OE=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=Un();if(!r)return[C.HELP,C.CONFIG];if(!zc())return[C.HELP,C.INIT,C.OPEN];if(t)return[C.HELP,C.PEEK,C.REPLAY,C.EXPORT,C.CONFIG,C.YANK];let o=e?.context,s=o&&wE.includes(o),i=[...new Set([...n,e].map(d=>d?.context).flatMap(d=>d?LE[d]:[]))],c=Ns({breadCrumb:n,selectedNode:e});return i.filter(d=>d===C.MOVE?!1:d===C.YANK?!!(c??e):d===C.EDIT?s||!!c:d===C.DELETE?s:d===C.UNTAG?!!(c&&bn(c).length>0):d===C.UNASSIGN?!!(c&&xn(c).length>0):d===C.RE_OPEN_ISSUE?!!(c&&nf(c)):d===C.CLOSE_ISSUE?!!(c&&!nf(c)):!0)},Be=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=v())=>{let s=t.context??"WORKSPACE";return{[C.NONE]:OE({breadCrumb:o,readOnly:r,selectedNode:n}),[C.EXIT]:["confirm"],[C.EXPORT]:[],[C.SYNC]:[],[C.INIT]:[],[C.OPEN]:e===C.OPEN?Jc():[],[C.HELP]:[],[C.PEEK]:[...Kc(),"now","prev","next"],[C.REPLAY]:[...Kc()],[C.EDIT]:DE({selectedNode:n,breadCrumb:o}),[C.YANK]:BE({selectedNode:n,breadCrumb:o}),[C.COMMENT]:[],[C.DELETE]:["confirm"],[C.RE_OPEN_ISSUE]:["confirm"],[C.CLOSE_ISSUE]:["confirm"],[C.MOVE]:["start","confirm","next","previous","jump-next","jump-previous","to-next","to-previous","cancel"],[C.FILTER]:["tag","assignee","actor","description","title","ref","clear"],[C.TAG]:[...new Set([...Object.keys(Ki),...N.getExistingTags()])],[C.UNTAG]:[...ia()?.value?.map(({name:c})=>c)??[]],[C.UNASSIGN]:[...aa()?.value?.map(({name:c})=>c)??[]],[C.ASSIGN]:N.getExistingAssignees(),[C.NEW]:kE(s),[C.CONFIG]:[...ME]}[e]??[]};import vf from"chalk";var of=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import UE from"zod";import FE from"node:crypto";import As from"node:fs";import lf from"node:path";var sf="/media/",af=e=>`${sf}${e}`,Qc=(e,t)=>`})`;var In=500,_E=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,Br=(e,t)=>`${e}.${t}`,jE=e=>_E.test(e),cf=e=>e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?u("Sniffed image type","png"):e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?u("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")))?u("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"))?u("Sniffed image type","webp"):l(`Unsupported image format. Allowed: ${Cp.join(", ")}`),df=e=>FE.createHash("sha256").update(e).digest("hex"),$E=(e,t=In)=>{if(e.length===0)return l("Attachment is empty");if(e.length>t*1024)return l(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=cf(e);return a(n)?n:u("Validated attachment data",{hash:df(e),ext:n.value,bytes:e.length})},uf=(e,t,n=In)=>{let r=$E(t,n);if(a(r))return r;let o=gs(e),s=lf.join(o,Br(r.value.hash,r.value.ext));try{As.existsSync(s)||(As.mkdirSync(o,{recursive:!0}),As.writeFileSync(s,t))}catch(i){return l(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return u("Wrote attachment blob",r.value)},mf=(e,t,n=In)=>{if(!jE(t))return l("Invalid attachment file name");let r=lf.join(gs(e),t);if(!As.existsSync(r))return l("Attachment blob not found");let o;try{o=As.readFileSync(r)}catch(d){return l(`Unable to read attachment blob: ${d instanceof Error?d.message:String(d)}`)}if(o.length>n*1024)return l(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(df(o)!==s)return l("Attachment blob does not match its content hash");let c=cf(o);return a(c)?c:c.value!==i?l("Attachment blob content does not match its extension"):u("Resolved attachment blob",{filePath:r,ext:i,bytes:o.length})};var Ts=50,ws=5e3,pf=()=>{let e=se().commandMeta.inputString,t=UE.coerce.number().int().min(Ts).max(ws).safeParse(e);if(!t.success)return l(`Attachment size cap must be ${Ts}-${ws} KB (default ${In})`);let n=$t({attachmentMaxKb:t.data});return a(n)?n:(je({attachmentMaxKb:t.data}),u(`Attachment size cap set to ${t.data} KB`,null))};var lt=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as HE}from"node:crypto";var WE="0123456789ABCDEFGHJKMNPQRSTVWXYZ",GE=e=>{let t=HE("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+=WE[Number(n>>s&31n)]}return r},ff=new Map,Me=(e,t)=>{let n=`${e}:virtual:${t}`,r=ff.get(n);if(r!==void 0)return r;let o=GE(n);return ff.set(n,o),o};import gf from"chalk";var Se=e=>gf.dim(e),$e=e=>gf.hex(y.primary)(e),Ue=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let i=o.trim();if(i.length<s)return"";let m=[...t.filter(Boolean).filter(f=>f.startsWith(i))].sort((f,g)=>Xi(f)-Xi(g)).slice(0,r).map(f=>Ji(f)).join(" ");return m?`${Se(e)}${m}${Se(n)}`:""};var En={None:"none",Invalid:"invalid",Valid:"valid"};var VE=["BOARD","TICKET","SWIMLANE"],hf=()=>{let e=v().selectedNode;if(!e?.context)return z({message:Se("Missing target context")});if(VE.includes(e.context))return ie();if(e.parentNodeId){let t=v().nodes[e.parentNodeId];if(t?.id===Me(t?.parentNodeId??"","comments"))return ie()}return z({message:Se("Command not available in this context")})},fe="<ENTER> to confirm",zE=()=>{let{userId:e}=V(),t=de();return!e||a(t)?[]:yn(t.value.emailLinks,e)},ie=(e="",t=[],n=!0)=>({message:n?Se(e):e,validity:En.Valid,completionWordList:t}),z=({message:e,completionWordList:t=[]})=>({validity:En.Invalid,message:e,completionWordList:t}),No=e=>e.length===0,yf=(e,t)=>{let n=yt(v().breadCrumb,"BOARD");if(a(n))return z({message:$e("Command is not applicable in this context")});let r=bo(n.value.id);return a(r)?z({message:$e(`Unable to ${t}: board id is not a valid ULID`)}):ef({date:e,horizonDate:r.value})?null:z({message:$e(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},ua=e=>` ${vf.hex("#000").bgHex(ze(e))(` ${e} `)} `,Zc=({modifier:e})=>{let t="confirm";return e===t?ie(fe):z({message:No(e)?Se("if you are certain, enter ")+Ji(t):"",completionWordList:[t]})},KE=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?z({message:Se(n)}):ie():z({message:No(r)?t:"",completionWordList:[...e]}),Co=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>No(n)&&No(r)?z({message:e,completionWordList:[]}):ie(t??fe),qE=({modifier:e,inputString:t})=>{let n=Jc();return!No(e)||!No(t)?ie(fe):z({message:n.length?Se("number from the list, or a path"):Se("path to an epiq project"),completionWordList:n})},YE=({modifier:e,inputString:t})=>{let n=Be(C.CONFIG);if(!n.includes(e))return z({message:Ue({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ye.EDITOR:{let r=[...of];return t.trim()?r.includes(t.trim())?ie(fe):z({message:Ue({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):z({message:Ue({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ye.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?ie(fe):z({message:Ue({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ye.USERNAME:{let r=V().gitName,o=r?[r]:[],s=t.trim(),i=o.filter(p=>p.startsWith(s)),d=i.length===1&&i[0]===s?"":Ue({prefix:"name: ",wordList:o,inputString:s,minLengthForHints:0});return s?d?ie(`${d} ${Se(fe)}`,o,!1):ie(fe,o):z({message:d||$e("Enter a user name. Saved in ")+vf.bgBlack("~/.epiq-global/config.json"),completionWordList:o})}case ye.EMAILS:{let r=V().gitEmail,o=Ro(),s=o.length>0||!r?o:[r],i=[...s,"none"],c=t.trim(),d=(x,b)=>z({message:Ue({prefix:x,wordList:i,noOfHints:3,inputString:b,minLengthForHints:0}),completionWordList:i});if(!c)return ie(`${fe} to see your addresses, or name one`,i);let p=c.split(/[,\s]+/).filter(Boolean),m=p[p.length-1]??"",f=x=>x==="none"||s.includes(x.toLowerCase()),g=x=>i.some(b=>b.startsWith(x.toLowerCase())),h=p.filter(x=>!f(x)&&!g(x));return h.length>0?z({message:$e(`no address here matches ${h.join(", ")} \u2014 pick one from the list, or its number`),completionWordList:i}):f(m)?ie(fe):d("",m)}case ye.EMAILS_UNCLAIM:{let r=zE(),o=t.trim();return r.length===0?z({message:$e("you have not claimed any addresses"),completionWordList:[]}):o&&r.includes(o.toLowerCase())?ie(fe):z({message:Ue({prefix:"give an address back ",wordList:r,noOfHints:3,inputString:o,minLengthForHints:0}),completionWordList:r})}case ye.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?ie(fe):z({message:Ue({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case ye.AUTOSYNC:{let r=["on","off"],o=V().autoSync;if(!r.includes(t.trim())){let s=Xp(o);return z({message:Ue({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return ie(fe)}case ye.ATTACHMENT_MAX_KB:{let r=V().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<Ts||o>ws){let s=Ue({prefix:" examples: ",wordList:Xc,minLengthForHints:0,inputString:t});return z({message:$e(`provide a size cap in KB (${Ts}-${ws}). current: ${r??In} KB.`)+s,completionWordList:Xc})}return ie(fe)}case ye.SYNC_DEBOUNCE_MS:{let r=V().autoSyncIntervalMs,o=uo(t);if(!t.trim()||o===null){let s=Ue({prefix:" examples: ",wordList:Yc,minLengthForHints:0,inputString:t});return z({message:$e(`provide a duration between ${3e3}ms and ${864e5}ms. current duration: ${r}ms.`)+s,completionWordList:Yc})}return ie(fe)}default:return z({message:$e("Unknown config option"),completionWordList:n})}},XE=({modifier:e,inputString:t})=>{let n=Be(C.EDIT);if(!n.length)return z({message:$e("Command not available in this context")});if(!n.includes(e)){let r=Ue({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return z({message:r||$e("Unknown edit option"),completionWordList:n})}switch(e){case Dt.COMMENT:return t.trim()?ie(fe):z({message:Se("write a comment...")});case Dt.TITLE:return ie(fe);case Dt.DESCRIPTION:{let{preferredEditor:r}=V();return r?ie(Se("<ENTER> to edit in ")+r):z({message:"No editor selected"})}default:return z({message:$e("Unknown edit option"),completionWordList:n})}},JE=({modifier:e})=>{let t=Be(C.YANK);return t.length?t.includes(e)?ie(fe+Se(" and copy to clipboard")):z({message:Ue({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):z({message:$e("Nothing selected to copy from")})},QE={[C.EXPORT]:()=>ie(fe+Se(", and create export markdown file")),[C.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return ie(fe);let n={message:Se("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=Lr(r);if(!r||!o)return z(n);let s=yf(o,"peek");return s||ie(fe)},[C.REPLAY]:e=>{let{dateInput:t,durationInput:n}=ca(e.modifier,e.inputString),r={message:Se("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=Lr(t);if(!t||!o)return z(r);let s=yf(o,"replay");return s||(n&&la(n)===null?z({message:$e("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):ie("<ENTER> to replay board history",n?rf:[]))},[C.EXIT]:()=>ie(fe+Se(" and exit the application")),[C.INIT]:()=>ie(fe),[C.OPEN]:qE,[C.PALETTE]:()=>ie(fe),[C.FILTER]:e=>{if(e.modifier==="clear")return ie(fe);let t=s=>Be(C.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return z({message:Ue({wordList:Be(C.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Be(C.FILTER)});let n=Object.values(v().tags).map(s=>s.name),r=Object.values(v().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?z({message:Ue({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):ie():z({message:Ue({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[C.NONE]:e=>{let t=Be(C.NONE);return z({message:Ue({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[C.NEW]:e=>KE({list:Be(C.NEW),hint:Ue({wordList:Be(C.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[C.HELP]:()=>ie(fe),[C.EDIT]:XE,[C.COMMENT]:e=>{let t=Co({hint:Se(`write a comment (max ${4e3} char)...`),onOk:Se(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===En.Invalid?t:e.inputString.length>4e3?ie($e("max input exceeded")):t},[C.CONFIG]:YE,[C.YANK]:JE,[C.DELETE]:e=>{let t=hf();return t.validity==="invalid"?t:Zc(e)},[C.CLOSE_ISSUE]:e=>Zc(e),[C.RE_OPEN_ISSUE]:e=>Zc(e),[C.MOVE]:e=>{let t=hf();return t.validity==="invalid"?t:Co({hint:Ue({prefix:"hey hacker! These commands are blocked for you... ",wordList:Be(C.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[C.TAG]:e=>{let n=N.getExistingTags().slice(0,10).map(ua).join("");return Co({hint:n.length?Se("create tag or reuse:")+n+Se(""):Se("create tag ...")})(e)},[C.UNTAG]:e=>{let t=ia();if(a(t))return z({message:$e("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(ua).slice(0,10);return n.length?Co({hint:Se(" ... ")+n.join("")})(e):z({message:$e("Issue has no tags"),completionWordList:[]})},[C.ASSIGN]:e=>{let t=N.getExistingAssignees().map(ua).slice(0,10);return Co({hint:Se("assignees... ")+t.join("")})(e)},[C.UNASSIGN]:e=>{let t=aa();if(a(t))return z({message:$e("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(ua).slice(0,10);return n.length?Co({hint:Se("remove assignee... ")+n.join("")})(e):z({message:$e("Issue has no assignees"),completionWordList:[]})},[C.SYNC]:()=>ie(fe)},bf=Object.fromEntries(Object.entries(QE).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ma=["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 ZE=3,eS=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"]),tS=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},nS=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=ZE&&!eS.has(t)&&!/^\d+$/.test(t)),rS=e=>{let t=new Map;for(let s of tS(e))for(let i of nS(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=ma.filter(s=>!r.has(s));return[...n,...o]},xf=ma,If=-1,Ef=()=>{let e=de();if(a(e))return ma;let t=e.value,n=t.eventLog.length;return n!==If&&(xf=rS(t),If=n),xf};var Sf=e=>Object.values(C).includes(e),Rf=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:c,completionWordList:d}=bf[n].validate(n,r,s),p=n!==C.PEEK&&n!==C.REPLAY,m=o==="command"||o==="modifier"?Be(n):p?Ef():[],{mode:f}=v(),g=f===I.COMMAND_LINE?i??"":"",h=[...d,...m];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?jp(e,h,d):{hint:"",hints:[],remainder:"",overlap:0}}};var Cf=e=>{let t=e.trimStart(),n=sS(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=iS(e),c=Sf(r)?r:null,d=c!==null,p=r!=="",m=c?Be(c)??[]:[],f=c&&m.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 h=s?"":i,x=oS(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:p,command:c,isCommandKeyword:d,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:h,inputString:x}},oS=(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},sS=e=>e.trim()?e.trim().split(/\s+/):[],iS=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as aS}from"react";var Ao=e=>e===ed||e===":",ed=" ",Ps=40,ct={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:En.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},td=new Set,Nf=()=>{for(let e of td)e()},nd=e=>(td.add(e),()=>td.delete(e)),Ht=e=>{let n=e(ct),r=Cf(n.value),o=n.cursorPosition===n.value.length;ct={...n,commandMeta:Rf(r,o)},Nf()},Ls=({message:e,status:t})=>{let n=structuredClone(ct);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,ct=n,Nf(),u(e,null)},rd=e=>{Ht(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},od=e=>{Ht(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Ao(n[o-1]);)o--;for(;o>0&&!Ao(n[o-1]);)o--}else{for(;o<n.length&&!Ao(n[o]);)o++;for(;o<n.length&&Ao(n[o]);)o++}return{...t,cursorPosition:o}})},Af=()=>{Ht(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}})},Tf=()=>{Ht(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Ao(t[r-1]);)r--;for(;r>0&&!Ao(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},pa=e=>{Ht(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}})},wf=()=>{Ht(e=>({...e,commandIsPending:!0}))},J=e=>{Ht(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Mf=({addToHistory:e=!0,line:t})=>{Ht(n=>{let r=t??n.value;return{...n,commandHistory:e&&r.trim()?[r,...n.commandHistory].slice(0,Ps):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}})},Pf=e=>{Ht(t=>({...t,commandHistory:e.slice(0,Ps),commandHistoryIndex:-1}))},Lf=()=>{Ht(e=>e.commandHistoryIndex===-1?e:{...e,commandHistoryIndex:-1})},kf=()=>{Ht(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}})},Df=()=>{Ht(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},se=()=>ct,Bf=()=>aS(nd,se,se),fa=()=>{let[e,...t]=ct.value.split(ed);return t.join(ed).trim()};var E={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavPreviousItemJump:"navPreviousItemJump",NavNextItemJump:"navNextItemJump",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MovePreviousItemJump:"movePreviousItemJump",MoveNextItemJump:"moveNextItemJump",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",OpenInEditor:"openInEditor",MarkDiffLine:"markDiffLine",CommentOnDiffLine:"commentOnDiffLine",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"},lS=e=>e.shift===!0,cS={[E.NavPreviousItem]:E.NavPreviousItemJump,[E.NavNextItem]:E.NavNextItemJump,[E.MovePreviousItem]:E.MovePreviousItemJump,[E.MoveNextItem]:E.MoveNextItemJump};function dS(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function uS(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function mS(e,t,n){let r=v().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function Of(e,t){let n=se();if(e.sequence==="?"&&t!==I.PALETTE)return E.InitCommandPalette;if(e.sequence===":"&&t!==I.COMMAND_LINE)return E.InitCommandLine;if(t===I.MOVE)switch(e.name){case"m":case"return":return E.ConfirmMove}if(t===I.COMMAND_LINE)return Mp(e,n.value);if(t===I.PALETTE)return Pp(e,n.value);let r=dS(e)||uS(e);if(r)return pS(r,t,lS(e));if(e.ctrl&&e.name==="c")return E.Exit;switch(e.name){case"r":return E.EditTitle;case"e":return E.EditDescription;case"n":return E.AddItem;case"m":return E.InitMove;case"d":return E.Delete;case"y":return E.Yank;case"o":return E.OpenInEditor;case"s":return E.MarkDiffLine;case"c":return E.CommentOnDiffLine;case"return":return E.Confirm;case"space":return E.Confirm;case"v":return V().viewMode==="wide"?E.SetViewDense:E.SetViewWide;case"q":case"escape":return E.Exit;default:return null}}function pS(e,t,n=!1){let r=t===I.MOVE?{prevItem:E.MovePreviousItem,nextItem:E.MoveNextItem,prevContainer:E.MoveToPreviousContainer,nextContainer:E.MoveToNextContainer}:{prevItem:E.NavPreviousItem,nextItem:E.NavNextItem,prevContainer:E.NavToPreviousContainer,nextContainer:E.NavToNextContainer},o=mS(v().contextNode.childRenderAxis,e,r);return!o||!n?o:cS[o]??o}import{ulid as hS}from"ulid";var ks=24n,fS=ks*4n,en=(1n<<fS)-1n,gS=/^[0-9a-f]+$/;function Ff(e){return!e||!gS.test(e)?l(`Invalid hex rank: ${e}`):u("Converted rank to bigint",BigInt("0x"+e))}function Bt(e,t=ks){if(e<0n)return l("Negative rank not allowed");let n=e.toString(16);return u("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function vt(e,t){if(!e&&!t)return Bt(en/2n,ks);let n=e?Ff(e):u("Resolved lower bound",0n);if(a(n))return n;let r=t?Ff(t):u("Resolved upper bound",en);if(a(r))return r;let o=n.value,s=r.value;if(s<=o)return l("Neighbouring ranks leave no space between them");let i=(o+s)/2n;return i===o||i===s?l("No rank space available between neighbors"):Bt(i,ks)}function _f(e){if(e<=0)return u("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=en*BigInt(r+1)/(t+1n),s=Bt(o,ks);if(a(s))return s;n.push(s.value)}return u("Resolved evenly spaced ranks",n)}var D=({userId:e})=>({userId:e}),jf=e=>({action:e.action,payload:e.payload});var sd=["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","link.contributor.email","unlink.contributor.email"];var cB=new Set(sd);var id=(e,t)=>{let n=be(e),r=_f(n.length);if(a(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 l("Unable to assign rebalance rank");o[i.id]=c}return u("Created rebalance event",{id:hS(),action:"rebalance.children",payload:{parent:e,ranks:o},...D(t)})};import{z as Or}from"zod";var $f=1,Uf=Or.tuple([Or.string().min(1),Or.string().min(1).nullable()]),yS=Or.looseObject({v:Or.literal($f),id:Uf}),SB=Or.looseObject({v:Or.number().int().positive(),id:Uf}),vS=e=>Object.prototype.hasOwnProperty.call(e,"__proto__"),bS=e=>{let t={};for(let n of Object.keys(e))n!=="__proto__"&&(t[n]=e[n]);return t},Hf=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return l("Invalid persisted event envelope: expected an object");let{v:t,id:n}=e;if(typeof t!="number"||!Number.isSafeInteger(t)||t<=0)return l("Invalid persisted event envelope: v");if(!Array.isArray(n)||n.length!==2)return l("Invalid persisted event envelope: id");let[r,o]=n;return typeof r!="string"||r.length===0?l("Invalid persisted event envelope: id.0"):o!==null&&(typeof o!="string"||o.length===0)?l("Invalid persisted event envelope: id.1"):u("Parsed persisted event envelope",vS(e)?bS(e):e)};var xS=[1];var IS=new Set(xS),ad=e=>IS.has(e),Wf=e=>{let t=yS.safeParse(e);return t.success?u("Parsed persisted event",t.data):l(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ld=(e,t)=>{let n={[e.action]:e.payload,v:$f,id:t};return Wf(n)};import Fs from"node:fs";import Ia from"node:path";import{decodeTime as MS}from"ulid";import{z as gd}from"zod";import cd from"node:fs";import ES from"node:path";var Ds=e=>e?.code==="ENOENT",dd=3,ud=e=>cd.readdirSync(e).filter(t=>t.endsWith(".jsonl")).sort(),et=e=>{let t=St(e);for(let n=1;;n++){if(!cd.existsSync(t))return"none";let r=[],o=!1;for(let s of ud(t))try{let{size:i,mtimeMs:c}=cd.statSync(ES.join(t,s));r.push(`${s}:${i}:${c}`)}catch(i){if(!Ds(i))throw i;if(n<dd){o=!0;break}}if(!o)return r.join("|")}},Gf=e=>new Map(e.split("|").filter(Boolean).map(t=>{let n=t.indexOf(":");return[t.slice(0,n),t.slice(n+1)]})),md=(e,t,n)=>{let r=Gf(t),o=et(e),s=Gf(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},sr=null,ga=e=>sr&&sr.root===e?sr.signature:null,To=(e,t)=>{sr={root:e,signature:t}},Vf=(e,t)=>{if(!sr||sr.root!==e)return;let n=md(e,sr.signature,t);sr=n===null?null:{root:e,signature:n}};import He from"node:fs";import Fr from"node:path";import{ulid as SS}from"ulid";var ya="~pending",pd=/~pending(-[0-9a-z]+)*$/i,Kf=/-f(\d+)$/,qf=e=>{let t=e.indexOf(".");return t===-1?`${e}${ya}`:e.slice(0,t)+ya+e.slice(t)},va=e=>{let t=e.indexOf(".");return t===-1?[e,""]:[e.slice(0,t),e.slice(t)]},RS=e=>{let[t,n]=va(e);return pd.test(t)?t.replace(pd,"")+n:null},fd=e=>e.replace(pd,""),_r=e=>e.endsWith(".jsonl")&&RS(e)!==null,Bs=e=>fd(va(e)[0]),Yf=e=>{let[t]=va(e),n=Kf.exec(t);return n&&_r(e)?Number(n[1]):null},CS=e=>qf(e).replace(ya,`${ya}-${SS().toLowerCase()}`),NS=(e,t)=>{let[n,r]=va(e);return`${n.replace(Kf,"")}-f${t}${r}`},Xf=(e,t)=>Fr.join(St(e),qf(t)),AS=(e,t)=>Math.max(0,He.statSync(e).size-(Yf(t)??0)),Jf=e=>{let t=St(e);try{return He.existsSync(t)?He.readdirSync(t).filter(_r).some(n=>AS(Fr.join(t,n),n)>0):!1}catch{return!0}},TS=3,Qf=(e,t)=>{for(let n=1;;n++){let r=He.openSync(e,"a"),o;try{He.writeSync(r,t),o=He.fstatSync(r).ino}finally{He.closeSync(r)}let s;try{s=He.statSync(e).ino}catch{s=null}if(s===o||n>=TS)return}},wS=e=>{let t;try{t=He.openSync(e,"r")}catch{return!0}try{let{size:n}=He.fstatSync(t);if(n===0)return!0;let r=Buffer.alloc(1);return He.readSync(t,r,0,1,n-1),r[0]===10}finally{He.closeSync(t)}},ha=10,zf=(e,t,n=!1)=>{let r=n?t.length:t.lastIndexOf(ha)+1;if(r===0)return{bytes:0,lines:0};let o=t.subarray(0,r);if(o.toString("utf8").trim().length===0)return{bytes:r,lines:0};He.appendFileSync(e,Buffer.concat([Buffer.from(wS(e)?"":`
|
|
31
|
-
`),
|
|
32
|
-
`)]));let s=0;for(let i of
|
|
33
|
-
`).entries()){let g=f.trim();if(!g)continue;let h;try{h=JSON.parse(g)}catch{p(m+1,"invalid JSON");continue}let x=
|
|
34
|
-
`),i&&(i.current=g);let b=bd.basename(m);return e.advanceEdgeRef(s,b,g),Vf(s,b),u("Event persisted",{path:m,entry:x.value})}catch(d){let p=d instanceof Error?d.message:"Unknown persist error";return l(`Failed to persist event: ${p}`)}}return{mintEventId:n,persist:r}};var pg=(e,t,n)=>{function r(s,i,c){let d=n.mintEventId(i,c);if(a(d))return l(d.message);let p={...s,id:d.value[0]},m=t.materialize(p);if(m.status!==Zn.Success)return m;let f=n.persist({event:p,rootDir:i,edge:c,id:d.value});return a(f)?f:m}function o(s,i){if(s.length===0||!s[0])return l("No events provided");let c=e.write.readOnlyReason();if(c)return l(c);let d=e.replay.batch(()=>{let p={},m=e.write.beforeWrite(s[0],h=>r(h,i,p));if(a(m))return l(m.message);let f=s.map(h=>r(h,i,p)),g=f.filter(a);return g.length>0?l("Materialize and persist failed: "+g.map(h=>h.message).join(", ")):u("Materialization succeeded",f.map(h=>h.value))});return a(d)?l(d.message):d.value??l("Materialize and persist produced nothing")}return{materializeAndPersist:r,materializeAndPersistAll:o}};var fg=e=>{let t=ag(e),n=ig(e),r=mg(n),o=pg(e,t,r);return{...t,...n,...r,...o}};import{z as Q}from"zod";var K=Q.string().min(1),tn=Q.string(),lr=Q.string(),Ra=Q.looseObject({id:K}),xd=Q.looseObject({id:K,name:tn,parent:K,rank:lr}),qS={"init.workspace":Q.looseObject({id:K,name:tn,rank:lr}),"add.workspace":Q.looseObject({id:K,name:tn,rank:lr}),"add.board":xd,"add.swimlane":xd,"add.issue":xd,"add.field":Q.looseObject({id:K,name:tn,parent:K,rank:lr}),"edit.title":Q.looseObject({id:K,name:tn}),"delete.node":Ra,"lock.node":Ra,"move.node":Q.looseObject({id:K,parent:K,rank:lr}),"edit.description":Q.looseObject({id:K,md:Q.string()}),"close.issue":Q.looseObject({id:K,parent:K,rank:lr}),"reopen.issue":Q.looseObject({id:K,parent:K,rank:lr}),"create.tag":Q.looseObject({id:K,name:tn}),"tombstone.tag":Ra,"restore.tag":Q.looseObject({id:K,name:tn}),"create.contributor":Q.looseObject({id:K,name:tn}),"rename.contributor":Q.looseObject({id:K,name:tn}),"tombstone.contributor":Ra,"restore.contributor":Q.looseObject({id:K,name:tn}),"link.contributor.user":Q.looseObject({contributor:K}),"link.contributor.email":Q.looseObject({contributor:K,email:K}),"unlink.contributor.email":Q.looseObject({contributor:K,email:K}),"add.issue.assignee":Q.looseObject({id:K,assignee:K}),"remove.issue.assignee":Q.looseObject({id:K,assignee:K}),"add.issue.tag":Q.looseObject({id:K,tag:K}),"remove.issue.tag":Q.looseObject({id:K,tag:K}),"add.issue.comment":Q.looseObject({id:K,issue:K,md:Q.string()}),"edit.issue.comment":Q.looseObject({id:K,issue:K,md:Q.string()}),"delete.issue.comment":Q.looseObject({id:K,issue:K}),"add.issue.attachment":Q.looseObject({id:K,issue:K,hash:Q.string().min(1),ext:Q.string().min(1),name:tn,bytes:Q.number()}),"delete.issue.attachment":Q.looseObject({id:K,issue:K}),"rebalance.children":Q.looseObject({parent:K,ranks:Q.record(Q.string(),lr)})},gg=(e,t)=>{let r=qS[e].safeParse(t);return r.success?u("Payload is readable",void 0):l(`${e}: ${r.error.issues.map(o=>`${o.path.join(".")||"payload"} ${o.message}`).join(", ")}`)};import{ulid as YS}from"ulid";var hg=(e,t)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return u("Contributor write already in flight",void 0);let{userId:n,userName:r}=V();if(!r||n!==e.userId)return u("Not this actor own write",void 0);let o=N.getContributor(e.userId),s={id:YS(),action:o?"rename.contributor":"create.contributor",payload:{id:e.userId,name:r},userId:e.userId};if(o&&(o.tombstoned||o.name===r))return u("Contributor name is current",void 0);let i=t(s);return a(i)?l(i.message):u("Contributor name recorded",void 0)};var Ne={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",DIFF:"Diff",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var H=e=>e.slice(-7).toUpperCase(),Ca=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?H(e).includes(n):!0};var Re={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:oe.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:H(e)},context:oe.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:oe.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:oe.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:oe.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:H(e)},context:oe.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!0,isVirtual:s=!0,disabled:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:i?{disabled:!0}:{},context:oe.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:oe.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};var _s=(e,t,n)=>N.getNode(e)?j(`a node with id ${e} already exists`,n):t===e?j("a node cannot be its own parent",n):null,yg={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Re.workspace(t,n,r),s=js(o);if(a(s))return Sa(s.message,e);let i=N.createNode(o);return a(i)?j(i.message??"Failed to initialize workspace",e):Hc(i.value)?u("Workspace initialized",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=_s(t,void 0,e);if(o)return o;let s=N.createNode(Re.workspace(t,n,r));return a(s)?j(s.message??"Failed to add workspace",e):Hc(s.value)?u("Added workspace",{action:e.action,result:s.value}):l("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=_s(t,r,e);if(s)return s;let i=N.createNode(Re.board(t,n,r,o));return a(i)?j(i.message??"Unable to create board",e):or(i.value)?u("Added board",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=_s(t,r,e);if(s)return s;let i=N.createNode(Re.swimlane(t,n,r,o));return a(i)?j(i.message??"Unable to create swimlane",e):vn(i.value)?u("Added swimlane",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=_s(t,r,e);if(s)return s;let i=N.createNode(Re.ticket(t,n,r,o));return a(i)?j(i.message??"Unable to create issue",e):_(i.value)?u("Added issue",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,i=_s(t,r,e);if(i)return i;let c=N.createNode(Re.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(Ne.DESCRIPTION)?"vertical":"horizontal"}));return a(c)?j(c.message??`Unable to create field: ${n}`,e):at(c.value)?u("Added field",{action:e.action,result:c.value}):l("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!N.getNode(t))return j(`Unable to locate node with id ${t}`,e);let o=N.renameNode(t,n);return a(o)?j(o.message??"Unable to edit title",e):u("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=N.tombstoneNode(t);return a(n)?j(n.message??"Unable to delete node",e):u("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=N.createTag({id:t,name:n});return a(r)?j(r.message??"Unable to create tag",e):u("Tag added",{action:e.action,result:r.value})},"tombstone.tag":e=>{let{id:t}=e.payload,n=N.tombstoneTag(t);return a(n)?j(n.message??"Unable to delete tag",e):u("Tag tombstoned",{action:e.action,result:n.value})},"restore.tag":e=>{let{id:t,name:n}=e.payload,r=N.restoreTag(t,n);return a(r)?j(r.message??"Unable to restore tag",e):u("Tag restored",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=N.createContributor({id:t,name:n});return a(r)?j(r.message??"Unable to create contributor",e):u("Contributor created",{action:e.action,result:r.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,r=N.renameContributor(t,n);return a(r)?j(r.message??"Unable to rename contributor",e):u("Contributor renamed",{action:e.action,result:r.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=N.tombstoneContributor(t);return a(n)?j(n.message??"Unable to remove contributor",e):u("Contributor tombstoned",{action:e.action,result:n.value})},"restore.contributor":e=>{let{id:t,name:n}=e.payload,r=N.restoreContributor(t,n);return a(r)?j(r.message??"Unable to restore contributor",e):u("Contributor restored",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=N.tag(t,n);return a(r)?j(r.message??"Unable to tag issue",e):u("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=N.untag(t,n);return a(r)?j(r.message??"Unable to untag issue",e):u("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=N.assign(t,n);return a(r)?j(r.message??"Unable to assign issue",e):u("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=N.unassign(t,n);return a(r)?j(r.message??"Unable to unassign issue",e):u("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(o)?j(o.message??"Failed to move node",e):u("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=N.editValue(t,n);return a(r)?j(r.message??"Unable to edit description",e):u("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.getNode(t);if(!o)return j("Unable to locate issue",e);if(!_(o))return j("Can only close issues",e);let s=N.getNode(he);if(!s)return j("Unable to locate target swimlane",e);if(n!==s.id)return j("Close target must be closed swimlane",e);let i=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(i)?j(i.message??"Unable to close issue",e):u("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.getNode(t);if(!o)return j("Unable to locate issue",e);if(!_(o))return j("Can only reopen issues",e);let s=N.getNode(he);if(!s)return j("Unable to locate closed swimlane",e);if(n===s.id)return j("Cannot reopen issue into closed swimlane",e);if(!N.getNode(n))return j("Reopen parent no longer exists",e);let c=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(c)?j(c.message??"Unable to reopen issue",e):u("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=N.lockNode(t);return a(n)?j(n.message??"Unable to lock node",e):u("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=N.getNode(r);if(!s)return j(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return j(`Node ${r} is not child of ${t}`,e);let i=N.updateNode({...s,rank:o});if(a(i))return j(i.message??"Unable to rebalance child",e)}return u("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:r,md:o}=e.payload,s=N.createComment({id:t,issue:n,authorId:r,md:o,deleted:!1});return a(s)?j(s.message??"Unable to add comment",e):u("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=N.getComment(t);if(!o)return j("Unable to locate comment",e);if(o.issue!==n)return j("Comment does not belong to issue",e);let s=N.editComment(t,r);return a(s)?j(s.message??"Unable to edit comment",e):u("Comment edited",{action:e.action,result:{id:t,issue:n,md:r}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,r=N.getComment(t);if(!r)return j("Unable to locate comment",e);if(r.issue!==n)return j("Comment does not belong to issue",e);let o=N.deleteComment(t);return a(o)?j(o.message??"Unable to delete comment",e):u("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=N.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:i,deleted:!1});return a(c)?j(c.message??"Unable to add attachment",e):u("Attachment added",{action:e.action,result:{id:t,issue:n,hash:r}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,r=N.getAttachment(t);if(!r)return j("Unable to locate attachment",e);if(r.issue!==n)return j("Attachment does not belong to issue",e);let o=N.deleteAttachment(t);return a(o)?j(o.message??"Unable to delete attachment",e):u("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.email":e=>{let{contributor:t,email:n}=e.payload;if(!nr(n))return j(`not an email address: ${n}`,e);let r=N.linkContributorEmail({email:n,contributor:t,authorId:e.userId});return a(r)?j(r.message??"Unable to link email",e):u("Email linked to contributor",{action:e.action,result:r.value})},"unlink.contributor.email":e=>{let{contributor:t,email:n}=e.payload,r=N.unlinkContributorEmail(n,t,e.userId);return a(r)?j(r.message??"Unable to unlink email",e):u("Email unlinked from contributor",{action:e.action,result:r.value})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=N.linkUserId({contributorId:t,userId:e.userId});return a(n)?j(n.message??"Unable to link contributor",e):u("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};var vg=e=>{let t=N.getNode(e);if(!t||!_(t)||t.isDeleted)return null;let n=Ig(t);return a(n)?n:null},bg=e=>{if(!Ed())return null;for(let t of e){let n=vg(t);if(n)return n;let r=v().nodes[t]?.parentNodeId;if(!r)continue;let o=vg(r);if(o)return o}return null},XS=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},JS=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},Id=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 JS(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":case"link.contributor.email":case"unlink.contributor.email":default:return[]}},QS=e=>{Oe(t=>({...t,eventLog:[...t.eventLog,e]}))},Hn=null,ZS=e=>{for(let[t,n]of e.nodeLog){let r=N.getNode(t);r&&N.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&Oe(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),bg([...e.virtualNodeIds])},xg={isInitialized:()=>Rt(),batch:e=>Na(e),afterApply(e,{batched:t,bypassLogging:n}){let r=[...new Set(Id(e))];if(t){Hn??={appLog:[],nodeLog:new Map,virtualNodeIds:new Set};for(let o of r){if(!n){let s=Hn.nodeLog.get(o);s?s.push(e):Hn.nodeLog.set(o,[e])}if(Ed()){Hn.virtualNodeIds.add(o);let s=v().nodes[o]?.parentNodeId;s&&Hn.virtualNodeIds.add(s)}}return n||Hn.appLog.push(e),null}return n||(r.forEach(o=>XS(o,e)),QS(e)),bg(r)},flush(){if(!Hn)return null;let e=Hn;return Hn=null,ZS(e)}};var pe=()=>{let{userName:e,userId:t}=V();return e?t?dc(t)?_i(e)?u("Successfully resolved actor ID",{userId:t,userName:e}):l("Invalid user name in config"):l("Invalid user ID in config"):l("User ID not configured"):l("User name not configured")};var eR={genesis:"init.workspace",actions:sd,readPayload:gg,apply:yg,replay:xg,write:{readOnlyReason:()=>{let e=v();return e.readOnly?e.readOnlyReason??"Cannot change the board while time travelling":null},beforeWrite:hg}},tR=fg(eR),{materialize:$s,materializeAll:nn,fromPersistedEvent:wF,decodeReconstructedEvents:MF,loadMergedEventsWithUnreadable:rn,loadEventActors:Eg,loadActorNames:cr,loadMergedEvents:dr,loadMergedEventsBefore:Aa,getEdgeRef:PF,advanceEdgeRef:LF,clearEdgeCache:kF,getSortedEvents:DF,loadEffectiveEventTimes:Ta,mintEventId:BF,persist:Sg,materializeAndPersist:OF,materializeAndPersistAll:B}=tR;var jr=e=>e.trim().toLocaleLowerCase(),Sd=(e,t)=>jr(e).includes(jr(t));var nR=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},rR=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},Rg=null,Cg=new Map,oR=()=>{let e=v().eventLog??[];if(e===Rg)return Cg;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 Rg=e,Cg=t,t},sR=e=>{let{contributors:t}=v(),n=oR().get(e.id);return n?[...n].map(r=>t[r]?.name).filter(r=>!!r):[]},Ng=(e,t)=>{let n=jr(t.value);if(!n)return!0;switch(t.target){case"title":return Sd(e.title??"",n);case"description":return Sd(e.props.description??"",n);case"tag":return nR(e).map(jr).some(o=>o.includes(n));case"assignee":return rR(e).map(jr).some(o=>o.includes(n));case"actor":return sR(e).map(jr).some(o=>o.includes(n));case"ref":return Ca(e.id,t.value);default:return!0}};var Rd=(e,t)=>e.rank<t.rank?-1:e.rank>t.rank?1:0,iR=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,Ag=(e,t)=>Object.values(e).filter(n=>iR(n,t)).sort(Rd),Tg=(e,t)=>{let n={};for(let r of Object.values(e)){if(_(r)&&t.length>0&&!t.every(s=>Ng(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(Rd);return n},wg=(e,t)=>{let n={};for(let r of Object.values(e)){if(!r.parentNodeId||r.isDeleted||!t.has(r.parentNodeId))continue;let o=n[r.parentNodeId];o?o.push(r):n[r.parentNodeId]=[r]}for(let r of Object.keys(n))n[r].sort(Rd);return n};var Mg=e=>wa(be(e),{at:"end"}),wa=(e,t={at:"end"})=>{let n=o=>a(o)?u("Rank space exhausted",{rank:"",needsRebalance:!0}):u("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(vt(void 0,void 0));let r=()=>n(vt(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(vt(void 0,o.rank)):l("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(vt(o.rank,void 0)):l("Unable to resolve last sibling")}case"before":{let o=Pg(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(vt(i?.rank,s.rank))}case"after":{let o=Pg(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(vt(s.rank,i?.rank))}}},be=e=>{let t=v();if(!kg()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return Ag(t.nodes,e)},Pg=(e,t)=>e.findIndex(n=>n.id===t),Lg=(e,t,n={at:"end"})=>wa(be(t).filter(r=>r.id!==e),n),Cn=(e,t,n,r,o)=>{let s=Lg(t,e,n);if(a(s))return s;if(!s.value.needsRebalance)return u("Resolved rank",s.value.rank);let i=id(e,r);if(a(i))return i;let c=B([i.value],o);if(a(c))return c;let d=Lg(t,e,n);return a(d)?d:d.value.needsRebalance?l("Rank rebalance failed to create space"):u("Resolved rank after rebalance",d.value.rank)},Wn=(e,t,n)=>{let r=Mg(e);if(a(r))return r;if(!r.value.needsRebalance)return u("Resolved rank",r.value.rank);let o=id(e,t);if(a(o))return o;let s=B([o.value],n);if(a(s))return s;let i=Mg(e);return a(i)?i:i.value.needsRebalance?l("Rank rebalance failed to create space"):u("Resolved rank after rebalance",i.value.rank)};var Us=5,$={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=le(t.id),o=r[n];o&&(t.context==="FIELD"&&r.length===0||o.context==="COMMENT"||o.context==="TEXT"||$.navigate({contextNode:o,selectedIndex:le(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=le(n.id),o=r.findIndex(({id:i})=>i===e.id),s=r.length===0?-1:o>=0?o:0;$.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Dg(1),navigateToPreviousItem:()=>Dg(-1),jumpToNextItem:()=>Bg(Us),jumpToPreviousItem:()=>Bg(-Us),navigateToNextContainer:()=>Og(1),navigateToPreviousContainer:()=>Og(-1),navigate:({contextNode:e,selectedIndex:t})=>{w({contextNodeId:e.id,selectedIndex:t})}},Dg=e=>{let{selectedIndex:t,contextNode:n}=v(),r=le(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;$.navigate({selectedIndex:s,contextNode:n})},Bg=e=>{let{selectedIndex:t,contextNode:n}=v(),r=le(n.id).length;if(r===0)return;let o=Math.max(0,t),s=Math.min(Math.max(o+e,0),r-1);$.navigate({selectedIndex:s,contextNode:n})},Og=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=le(o.id),i=s.findIndex(g=>g.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let d=le(c.id),p=Math.max(0,d.length-1),m=Math.min(Math.max(0,r),p),f=d.length?m:-1;$.navigate({contextNode:c,selectedIndex:f})};var _g=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),jg=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},aR=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&at(t)&&t.childRenderAxis==="vertical"},Ma=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=be(r.id);return $.navigate({contextNode:r,selectedIndex:_g(t,o.length)}),!0},$g=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Ma(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let i=be(o.id).findIndex(c=>c.id===n.id);return i>=0?($.navigate({contextNode:o,selectedIndex:i}),!0):$g(o.id)},Fg=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),$g(n))return!0;n=t[n]?.parentNodeId}return!1},lR=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},Ug=e=>{let{nodes:t,rootNodeId:n}=v();if(aR(e.contextNodeId)&&Ma(e.contextNodeId,e.selectedIndex))return u("Restored navigation inside text container",null);if(lR(e.selectedNodeId)&&e.selectedNodeId&&Fg(e.selectedNodeId))return u("Restored navigation to selected node or ancestor",null);if(Ma(e.contextNodeId,e.selectedIndex))return u("Restored navigation to previous container",null);if(e.parentNodeId&&Ma(e.parentNodeId,e.selectedIndex))return u("Restored navigation to previous parent",null);if(Fg(e.contextNodeId))return u("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return l("Unable to restore navigation");let o=be(r.id);return $.navigate({contextNode:r,selectedIndex:_g(e.selectedIndex,o.length)}),u("Restored navigation to root",null)};import{monotonicFactory as cR,ulid as Nn}from"ulid";var Hs=cR();function dR(){let e=de();if(a(e))return l("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return l("No workspace found in event log");let[r]=le(n.id),[o]=r?le(r.id):[];if(o){let s=t.renderedChildrenIndex?.[o.id]??[];return u("Resolved boot nav target",{contextNode:o,selectedIndex:s.length>0?0:-1})}else return r?u("Resolved boot nav target",{contextNode:r,selectedIndex:0}):u("Resolved boot nav target",{contextNode:n,selectedIndex:0})}function uR(){let e=dR();return a(e)?e:$.navigate(e.value)}function Hg({userId:e,userName:t}){let n=Hs(),r=Hs(),o=Hs(),s=Hs(),i=Hs(),c=vt(void 0,void 0);if(a(c))return c;let d=vt(void 0,void 0);if(a(d))return d;let p=vt(d.value,void 0);if(a(p))return p;let m=vt(void 0,void 0);if(a(m))return m;let f=vt(m.value,void 0);if(a(f))return f;let g=vt(f.value,void 0);if(a(g))return g;let h=vt(void 0,void 0);return a(h)?h:u("Created default events",[{id:Nn(),userId:e,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:Nn(),userId:e,action:"create.contributor",payload:{id:e,name:t}},{id:Nn(),userId:e,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:d.value}},{id:Nn(),userId:e,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:m.value}},{id:Nn(),userId:e,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:Nn(),userId:e,action:"add.swimlane",payload:{id:i,name:"Done",parent:r,rank:g.value}},{id:Nn(),userId:e,action:"add.board",payload:{id:sa,name:"Closed",parent:n,rank:p.value}},{id:Nn(),userId:e,action:"add.swimlane",payload:{id:he,name:"Closed",parent:sa,rank:h.value}},{id:Nn(),userId:e,action:"lock.node",payload:{id:sa}},{id:Nn(),userId:e,action:"lock.node",payload:{id:he}}])}var mR=()=>{let e=de();if(a(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},pR=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(", ");ee.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(", ");ee.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}};function on(e,t=[]){if(mR())return u("Skipped boot while checked out at a historical point",null);if(!e.length){let s=Re.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=js(s);return a(i)?i:(w({hasProjectDefinition:!1,mode:I.DEFAULT}),u("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return l("Initialized Epiq project has no workspace init event");let n=nn(e),{fatal:r,skipped:o}=Sn(n);return r.length>0?l(`Materializing failed:
|
|
35
|
-
${
|
|
36
|
-
`)}`):(Rn(
|
|
37
|
-
`,"utf8"),u("Wrote the state branch identity",void 0)}catch(n){return l(n instanceof Error?`Failed to write the state branch identity: ${n.message}`:"Failed to write the state branch identity")}},
|
|
38
|
-
`);var
|
|
39
|
-
`).filter(t=>t.trim().length>0),
|
|
14
|
+
`),o.stdin.end()}),gr=async({cwd:e,message:t,pathspec:n})=>{let o=await Ce.commit({cwd:e,message:t,pathspec:n});if(a(o))return l(`Failed to create commit
|
|
15
|
+
${o.message}`);let r=await U({args:["rev-parse","HEAD"],cwd:e});return a(r)?l(`Commit created, but failed to read HEAD SHA
|
|
16
|
+
${r.message}`):u("Created commit and resolved SHA",r.value.stdout.trim())},ls=async e=>{let t=await U({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return l(t.message);let n=t.value.stdout.trim();return u("Resolved git dir",It.isAbsolute(n)?n:It.resolve(e,n))},Sc=async e=>{let t=await ls(e);if(a(t))return l(t.message);let n=t.value,o={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(o))if(Lt.existsSync(It.join(n,s)))return u("Checked for in-progress Git operation",i);let r={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(r))if(Lt.existsSync(It.join(n,s)))return u("Checked for in-progress Git operation",i);return u("Checked for in-progress Git operation",null)},jm=async e=>{let t=await Sc(e);return a(t)?l(t.message):u("Checked for in-progress Git operation",t.value!==null)},On=async({repoRoot:e})=>{let n=(await Le({args:["remote","get-url",Pt],cwd:e})).exitCode===0;return u(`Checked remote ${n}`,n)},cs=async({repoRoot:e,branch:t})=>{let n=await Le({args:["ls-remote","--heads",Pt,t],cwd:e});return n.exitCode!==0?l(n.stderr.trim()||`Unable to inspect remote branch ${Pt}/${t}`):u("Checked remote branch",n.stdout.trim().length>0)},Gi=async({repoRoot:e,branch:t})=>{let n=await Le({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?u("Local branch exists",!0):n.exitCode===1?u("Local branch missing",!1):l(n.stderr.trim()||`Unable to inspect branch ${t}`)},fr=e=>{try{return Lt.realpathSync.native(e)}catch{return It.resolve(e)}},$m=async({repoRoot:e,worktreeRoot:t})=>{let n=await U({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return l(n.message);let o=fr(t),r=n.value.stdout.split(`
|
|
17
|
+
`).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(fr).includes(o);return u("Checked worktree registration",r)},Rc=async e=>{let t=await Le({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return u("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Vi=async e=>{let t=await U({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?l(t.message):u("Resolved current branch",t.value.stdout.trim())},Um=async e=>{let t=await U({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?l(t.message):u("Resolved short HEAD sha",t.value.stdout.trim())},Hm=e=>e.includes("fetch first")||e.includes("non-fast-forward"),Wm=async e=>{let t=await Le({cwd:e,args:["rev-parse","--absolute-git-dir"]});if(t.exitCode!==0)return!1;let n=t.stdout.trim();return n?Lt.existsSync(It.join(n,"rebase-merge"))||Lt.existsSync(It.join(n,"rebase-apply")):!1},DI=3,BI=120,OI=e=>new Promise(t=>setTimeout(t,e)),FI=async(e,t)=>{let n=await Ce.rebaseOnto({cwd:e,ref:t});for(let o=1;o<DI;o+=1){if(!a(n)||await Wm(e))return n;await OI(BI),n=await Ce.rebaseOnto({cwd:e,ref:t})}return n},Gm=async(e,{preserve:t=[]}={})=>{let n=await ls(e);if(a(n))return l(n.message);let o=n.value,r=[];for(let s of Lt.readdirSync(o))if(s.endsWith(".lock")&&!t.includes(s))try{Lt.rmSync(It.join(o,s),{force:!0}),r.push(s)}catch{}return u("Cleared stale git lock files",r)},Vm=async(e,t)=>{let n=await Le({cwd:e,args:["rev-parse","--git-common-dir"]});if(n.exitCode!==0)return l(`Unable to resolve the common git directory at ${e}`);let o=It.resolve(e,n.stdout.trim()),r=It.join(o,"refs","heads"),s=It.resolve(r,`${t}.lock`);if(!s.startsWith(`${r}${It.sep}`))return l(`Refusing to clear a ref lock outside ${r}`);if(!Lt.existsSync(s))return u("No ref lock to clear",!1);try{Lt.rmSync(s,{force:!0})}catch{return u("Ref lock could not be cleared",!1)}return u("Cleared a stale ref lock",!0)},Cc=async e=>{if(!await Wm(e))return u("No rebase to abort",!1);let t=await Le({cwd:e,args:["rebase","--abort"]});return t.exitCode!==0?l(`Failed to abort the rebase in progress at ${e}
|
|
18
|
+
${t.stderr.trim()}`):u("Aborted stale rebase",!0)},Dm=async e=>{let t=await Le({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},ds=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),_I=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),us=async({cwd:e,branch:t})=>{let n=await Cc(e);if(a(n))return l(n.message);let o=await Dm(e),r=await Ce.fetch({cwd:e,remote:Pt,branch:t});if(a(r))return _I(r.message)?u("Remote branch missing, skipped pull",!1):l(`Failed to fetch ${t}
|
|
19
|
+
${r.message}`);let s=await FI(e,`${Pt}/${t}`);if(a(s))return l(`Failed during rebase
|
|
20
|
+
${s.message}`);let i=await Dm(e),c=o!==null&&i!==null&&o!==i;return u(c?"Pulled with rebase":"Already up to date",c)},zm=async e=>{let t=await Le({args:["rev-list","--count","@{u}..HEAD"],cwd:e});return t.exitCode!==0?u("No upstream to compare against",!1):u("Compared against upstream",Number(t.stdout.trim())>0)},Km=async e=>{let t=await Le({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?l(t.stderr.trim()||"Unable to inspect the worktree for changes"):u("Inspected worktree for changes",t.stdout.trim().length>0)},qm=async(e,t)=>{let n=await Le({args:["diff","--cached","--quiet",...t?.length?["--",...t]:[]],cwd:e});return n.exitCode===0?u("No staged changes",!1):n.exitCode===1?u("Has staged changes",!0):l(n.stderr.trim()||"Unable to inspect staged changes")};var Ym=async e=>{let t=await Vi(e);return a(t)?l(t.message):u("Checked detached HEAD state",t.value==="HEAD")};var Qm="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Zm=e=>Et.join(gt,Fn,e),ep=()=>Et.join(gt,wc),tp=Bn,Lo=()=>Et.join(tp(),"worktrees"),me=({repoRoot:e})=>{let t=fn(e);return a(t)?l(t.message):u("Resolved state branch root",Et.join(Lo(),t.value))},jI=e=>Et.join(e,gt),Xm=e=>Et.join(jI(e),Fn);var ms=e=>{try{return eo.mkdirSync(e,{recursive:!0}),u("Ensured directory",void 0)}catch(t){return l(t instanceof Error?t.message:String(t))}},ps=()=>{let e=tp(),t=Lo(),n=!eo.existsSync(e)||!eo.existsSync(t),o=ms(e);if(a(o))return l(`Ensure epiq home failed.
|
|
21
|
+
`+o.message);let r=ms(t);return a(r)?l(`Ensure worktrees dir failed.
|
|
22
|
+
`+r.message):u("Ensured epiq storage",n)},np=e=>{eo.existsSync(e)&&(ee.debug("[sync] remove path",e),eo.rmSync(e,{recursive:!0,force:!0}))};var $I=`*.jsonl merge=union
|
|
23
|
+
`,UI=`*~pending*.jsonl
|
|
24
|
+
`,Nc=()=>Et.join(gt,Fn,".gitattributes"),Ac=()=>Et.join(gt,Fn,".gitignore"),Jm=(e,t)=>{try{eo.readFileSync(e,"utf8")!==t&&eo.writeFileSync(e,t)}catch{eo.writeFileSync(e,t)}},op=(e,t)=>{for(let n of[Xm(e),Xm(t)]){let o=ms(n);if(a(o))return l(o.message)}return Jm(Et.join(t,Nc()),$I),Jm(Et.join(t,Ac()),UI),u("Ensured state branch",void 0)},rp=async e=>{let t=await U({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return l(`ensure state branch is storage only failed
|
|
25
|
+
`+t.message);let o=t.value.stdout.trim().split(`
|
|
26
|
+
`).filter(Boolean).filter(i=>i!==gt);if(o.length===0)return u("State branch is storage-only",!1);let r=await U({args:["rm","-r","--ignore-unmatch","--",...o],cwd:e});if(a(r))return l(`Failed to clean storage branch
|
|
27
|
+
${r.message}`);let s=await gr({cwd:e,message:"[epiq:repair-storage-branch]",pathspec:o});return a(s)?l(s.message):u("Cleaned storage branch",!0)},Zt=gc(async(e=process.cwd())=>{let t=await U({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?l("Not inside a Git repository"):u("Resolved repo root",t.value.stdout.trim())},e=>Et.resolve(e)),vL=gc(async e=>{let t=await U({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return l(t.message);let n=t.value.stdout.trim(),o=Et.isAbsolute(n)?n:Et.join(e,n);return u("Resolved git dir",o)},e=>Et.resolve(e));var CL=process.env.IS_LOCAL==="true",gt=".epiq",Fn="events",wc="media",HI="project.json",Po=e=>gn.join(e,gt),pr=e=>gn.join(Po(e),HI),St=e=>gn.join(Po(e),Fn),gs=e=>gn.join(Po(e),wc),sp=e=>gn.join(e,gt),WI=e=>{let t=gn.join(e,gt);return fs.existsSync(t)&&fs.statSync(t).isDirectory()},hs=e=>{let t=pr(e);return fs.existsSync(t)&&fs.statSync(t).isFile()},Hi=e=>{let t=gn.resolve(e);for(;;){if(WI(t))return u("Resolved closest .epiq root",t);let n=gn.dirname(t);if(n===t)return l("No .epiq directory found in any parent");t=n}},Tc="No .epiq/project.json found in any parent",oe=e=>{let t=gn.resolve(e);for(;;){if(hs(t))return u("Resolved closest epiq project root",t);let n=gn.dirname(t);if(n===t)return l(Tc);t=n}},ip=e=>{let t=St(e);try{return fs.mkdirSync(t,{recursive:!0}),u("Resolved events dir",t)}catch(n){return l(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},Ie=async()=>{let e=await Zt(process.cwd());if(a(e))return e;let t=me({repoRoot:e.value});return a(t)?t:u("Resolved persist root",t.value)};import{accessSync as GI,copyFileSync as VI,existsSync as zi,mkdirSync as ap,readdirSync as lp,readFileSync as zI,renameSync as KI,rmSync as qI,statSync as cp,unlinkSync as YI,writeFileSync as XI}from"node:fs";import hr from"node:path";var Mc=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",rt={writeToFile:(e,t)=>{try{let n=hr.dirname(e);zi(n)||ap(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);XI(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return zI(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=rt.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 zi(e)&&cp(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await GI(e),!0}catch{return!1}},mkDir:e=>ap(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=hr.parse(t);for(;;){let o=hr.join(t,e);try{if(zi(o)&&cp(o).isDirectory())return o}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=hr.dirname(t)}return null},readFirstJSON(e){try{if(!rt.dirExists(e))return null;let t=lp(e).filter(o=>o.endsWith(".json")).sort()[0];if(!t)return null;let n=hr.join(e,t);return rt.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return rt.dirExists(e)?lp(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{YI(e)}catch(t){(!Mc(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{qI(e,{recursive:!0,force:!0})}catch(t){(!Mc(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(hr.dirname(t)),!n?.overwrite&&zi(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{KI(e,t)}catch(o){if(Mc(o)&&o.code==="EXDEV"){VI(e,t),this.rmFile(e);return}throw o}}};var QI={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},up=en.object({logLevel:en.enum(["info","error","debug"]),preferredEditor:en.string().optional(),userName:en.string().optional(),userId:en.string().optional(),autoSync:en.boolean().nullable().optional(),autoSyncDebounceMs:en.number().optional(),attachmentMaxKb:en.number().optional(),viewMode:en.enum(["dense","wide"]).optional(),declinedEmailBoards:en.array(en.string()).optional()}).partial(),ZI="config.json",mp=Bn,Pc=()=>JI.join(mp(),ZI),Lc=()=>{try{return rt.mkDir(mp()),u(`Ensured ~/${Jt} exists`,null)}catch{return l(`Unable to create ~/${Jt}`)}},eE=e=>{let t;try{t=JSON.parse(e)}catch{return l(`Invalid ~/${Jt}/config.json JSON`)}let n=up.safeParse(t??{});return n.success?u("Parsed config",n.data):l(`Invalid ~/${Jt}/config.json shape: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},hn=()=>{let e=Lc();if(a(e))return l(e.message);let t=Pc(),n=rt.readFile(t);return n==null||n.trim()===""?u("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):eE(n)},pp=e=>{let t=Lc();if(a(t))return l(t.message);let n=up.safeParse(e);if(!n.success)return l(`Invalid config: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`);let o=Pc();try{return rt.writeToFile(o,JSON.stringify(n.data,null,2)+`
|
|
28
|
+
`),u("Config written",null)}catch{return l(`Unable to write ~/${Jt}/config.json`)}},Ut=e=>{let t=hn();if(a(t))return l("Failed to read existing config");let n={...t.value,...e};return pp(n)},ht=()=>{let e=Pc(),t=Lc();if(a(t))return l(`Unable to create ~/${Jt}`);if(!(rt.readFile(e)!==null)){let b=pp(QI);if(a(b))throw new Error(`Unable to create ~/${Jt}/config.json`)}let o=hn();if(a(o))throw new Error(o.message||"Unable to load settings");let{preferredEditor:r,userName:s,userId:i,declinedEmailBoards:c,autoSync:d,autoSyncDebounceMs:p,attachmentMaxKb:m,logLevel:f,viewMode:g}=o.value,h=dr({userId:i,userName:s});if(a(h))return l(h.message);let x=h.value??{userId:i,userName:s};return!x.userName||!x.userId?l(`User name or ID not configured in ~/${Jt}/config.json`):(process.env.EPIQ_LOG_LEVEL=f,u("successfully loaded settings",{gitEmail:null,gitName:null,declinedEmailBoards:c??[],logLevel:f??"debug",preferredEditor:r??"",userName:x.userName,userId:x.userId,autoSync:d??!1,autoSyncIntervalMs:p??1e4,attachmentMaxKb:m??null,viewMode:g??"dense"}))};import{useSyncExternalStore as tE}from"react";var ys={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,gitEmail:null,gitName:null,declinedEmailBoards:[],viewMode:null},kc=new Set,nE=()=>{for(let e of kc)e()},V=()=>ys,fp=()=>tE(e=>(kc.add(e),()=>{kc.delete(e)}),()=>ys),je=e=>(ys={...ys,...e},nE(),ys);var kt="1.12.3";import aE from"node:os";import lE from"node:path";import vs from"chalk";var Ki=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ","\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557","\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551","\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D","\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2580\u2580\u255D "];var it={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},y={accent:it.cyan,accent2:it.magenta,primary:it.white,secondary:it.grayDark,secondary2:it.grayLight,gray:it.gray,green:it.green,yellow:it.yellow,red:it.red};import yr from"chalk";var L={red:it.red,yellow:it.yellow,green:it.green,blue:it.blue,magenta:it.magenta,cyan:it.cyan},qi={urgent:L.red,critical:L.red,important:L.red,blocker:L.red,asap:L.red,immediate:L.red,fail:L.red,failure:L.red,broken:L.red,bug:L.red,error:L.red,incident:L.red,outage:L.red,production:L.red,crash:L.red,security:L.red,warning:L.yellow,warn:L.yellow,risky:L.yellow,risk:L.yellow,attention:L.yellow,pending:L.yellow,review:L.yellow,"needs-review":L.yellow,qa:L.yellow,testing:L.yellow,test:L.yellow,validate:L.yellow,verification:L.yellow,staging:L.yellow,check:L.yellow,"follow-up":L.yellow,followup:L.yellow,waiting:L.yellow,blocked:L.yellow,hold:L.yellow,done:L.green,complete:L.green,completed:L.green,success:L.green,ok:L.green,stable:L.green,resolved:L.green,fixed:L.green,closed:L.green,merged:L.green,released:L.green,deployed:L.green,approved:L.green,verified:L.green,working:L.green,healthy:L.green,pass:L.green,passing:L.green,info:L.blue,information:L.blue,note:L.blue,docs:L.blue,documentation:L.blue,doc:L.blue,guide:L.blue,help:L.blue,explanation:L.blue,detail:L.blue,details:L.blue,context:L.blue,design:L.blue,discussion:L.blue,proposal:L.blue,idea:L.blue,feature:L.magenta,enhancement:L.magenta,improvement:L.magenta,refactor:L.magenta,refactoring:L.magenta,cleanup:L.magenta,optimize:L.magenta,optimization:L.magenta,perf:L.magenta,performance:L.magenta,upgrade:L.magenta,migration:L.magenta,modernize:L.magenta,debt:L.magenta,todo:L.cyan,next:L.cyan,planned:L.cyan,plan:L.cyan,future:L.cyan,backlog:L.cyan,investigate:L.cyan,explore:L.cyan,prototype:L.cyan};var Bc={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Oc=(e,t,n)=>Math.max(t,Math.min(n,e)),Dc=(e,t,n)=>e+(t-e)*n,hp=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},oE=e=>e.toLowerCase().trim(),rE=(e,t,n)=>{let o=t/100,r=n/100,s=(1-Math.abs(2*r-1))*o,i=e/60,c=s*(1-Math.abs(i%2-1)),d=0,p=0,m=0;i>=0&&i<1?(d=s,p=c):i>=1&&i<2?(d=c,p=s):i>=2&&i<3?(p=s,m=c):i>=3&&i<4?(p=c,m=s):i>=4&&i<5?(d=c,m=s):(d=s,m=c);let f=r-s/2;return[Math.round((d+f)*255),Math.round((p+f)*255),Math.round((m+f)*255)]},Fc=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,gp=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},yp=(e,t,n)=>{let o=Oc(n,0,1);return[Math.round(Dc(e[0],t[0],o)),Math.round(Dc(e[1],t[1],o)),Math.round(Dc(e[2],t[2],o))]};var sE=(e,t,n)=>yp(e,t,n),_c=e=>{let t=hp(e)%360,n=rE(t,Bc.stringColor.saturation,Bc.stringColor.lightness);return Fc(n)},ze=(e,t=qi)=>{let n=oE(e??"");return n&&t[n]?t[n]:_c(n)};var Yi=e=>{let t=Bc.gradient.stops,n=Oc(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let o=t.length-1,r=n*o,s=Math.min(Math.floor(r),o-1),i=r-s;return sE(t[s],t[s+1],i)},vp=(e,t)=>{if(e.length===0)return"#000000";if(e.length===1)return e[0];let n=e.length-1,o=Oc(t,0,1)*n,r=Math.min(Math.floor(o),n-1);return Fc(yp(gp(e[r]),gp(e[r+1]),o-r))},Xi=e=>Fc(Yi(e)),Ji=e=>hp(e.toLowerCase().trim())/4294967295,bp=e=>{let t=Ji(e);return Yi(t)},iE=e=>{let[t,n,o]=bp(e);return{normal:r=>yr.bgRgb(t,n,o).black(r),cursor:r=>yr.bgRgb(t,n,o).white.bold(r)}},jc=e=>{let[t,n,o]=bp(e);return{fg:r=>yr.rgb(t,n,o)(r),fgCursor:r=>yr.rgb(t,n,o).inverse(r),bg:r=>yr.bgRgb(t,n,o).black(r),bgCursor:r=>yr.bgRgb(t,n,o).white.bold(r)}},Qi=e=>iE(e).normal(` ${e} `);var Zi=" ",Ep=vs.hex(y.secondary2),xp=vs.hex(y.gray),cE=()=>{let t=Ki[0].length+Ki.length*2;return Ki.map((n,o)=>Array.from(n).map((r,s)=>{let[i,c,d]=Yi((s+o*2)/t);return vs.rgb(i,c,d)(r)}).join(""))},dE=e=>{let t=aE.homedir();return e===t||e.startsWith(t+lE.sep)?"~"+e.slice(t.length):e},Ip=(e,t)=>`${Zi}${vs.hex(y.accent)("\u279C")} ${Ep(e.padEnd(9))}${t}`,$c=({url:e,repoRoot:t,version:n,reused:o})=>["",...cE().map(r=>Zi+r),"",`${Zi}${Ep("gui")} ${xp(`\xB7 v${n}`)}`,"",Ip("Local",vs.hex(y.accent).bold(e)),Ip("Project",dE(t)),"",Zi+xp(o?"already running for this project \xB7 opened in your browser":"press ctrl+c to stop"),""].join(`
|
|
29
|
+
`);import{spawn as uE}from"node:child_process";import bs from"node:process";var Sp=(e=bs.platform,t=bs.env)=>e==="darwin"||e==="win32"||!!(t.DISPLAY||t.WAYLAND_DISPLAY||t.BROWSER),Rp=e=>{let t=bs.platform==="darwin"?"open":bs.platform==="win32"?"cmd":"xdg-open",n=bs.platform==="win32"?["/c","start","",e]:[e];try{let o=uE(t,n,{detached:!0,stdio:"ignore"});o.on("error",r=>{logger.info(`[gui] could not open a browser: ${r.message}`)}),o.unref()}catch(o){logger.info(`[gui] could not open a browser: ${String(o)}`)}};import{readFile as px,stat as WT}from"node:fs/promises";import{createHash as GT}from"node:crypto";import Ro from"chalk";import Vv from"string-width";import{decodeTime as Cp}from"ulid";var ea=1440*60*1e3,xs=(e,t=Date.now())=>e>t+ea?t:e,De=e=>xs(Cp(e)),vr=e=>{let t=Date.now()+ea,n=e.find(r=>r!==null&&r<=t)??null;if(n===null)return[...e];let o=null;return e.map(r=>{if(r===null)return null;let s=r<=t?r:o??n;return o=s,s})},br=e=>{try{return u("Decoded date",new Date(De(e)))}catch(t){return l("Decoding failed + "+t.message)}},to=e=>{if(!e?.id)return null;try{return Cp(e.id)}catch{return null}};var mE="Unknown",ta=(e,t)=>t?.length?t:e?.length?e:mE,Ke=(e,t)=>{let n=ta(e,t);return{id:e?.length?e:n,name:n,color:ze(n)}};var xr="removed",yt=(e,t)=>{let n=e.find(o=>o.context===t);return n!==void 0?u("Found node",n):l("Unable to find node in breadcrumb")},Np=["png","jpg","gif","webp"];var Ze=e=>e.trim().toLowerCase(),no=e=>{let t=Ze(e);return t.length>0&&t.length<=254&&/^[^\s@]+@[^\s@]+$/.test(t)},Is=(e,t)=>`${Ze(e)} ${t}`,Uc=e=>!e.tombstoned,Es=(e,t)=>{let n=Ze(t),o=new Set;for(let r of Object.values(e))Uc(r)&&r.email===n&&o.add(r.contributor);return[...o]},yn=(e,t)=>{let n=new Set;for(let o of Object.values(e))Uc(o)&&o.contributor===t&&n.add(o.email);return[...n]},Ap=e=>{let t=new Map;for(let o of Object.values(e)){if(!Uc(o))continue;let r=t.get(o.email)??new Set;r.add(o.contributor),t.set(o.email,r)}let n=new Map;for(let[o,r]of t){let[s]=[...r];r.size===1&&s&&n.set(o,s)}return n};var na=(e,t)=>e===t.authorId||e===t.contributor;var re={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};function Hc(e){return e.context===re.WORKSPACE}function _(e){return e.context===re.TICKET}function oo(e){return e.context===re.TEXT}function at(e){return e.context===re.FIELD}function Ss(e){return e.context===re.FIELD_LIST}var vn=e=>e.context===re.SWIMLANE,ro=e=>e.context===re.BOARD,Rs=e=>e.context===re.COMMENT;import{useSyncExternalStore as _A}from"react";var I={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette",IDENTITY:"identity"};var wp=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Tp=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Mp=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Pp=(e,t)=>{if(Tp(e,e.sequence))return E.MoveCursorLeftOfWord;if(Mp(e,e.sequence))return E.MoveCursorRightOfWord;if(wp(e,e.sequence))return E.EraseInputWord;switch(e.name){case"tab":return E.AutoCompleteCommand;case"up":return E.GetLastCommandFromHistory;case"down":return E.GetNextCommandFromHistory;case"left":return E.MoveCursorLeft;case"right":return E.MoveCursorRight;case"return":return E.Confirm;case"backspace":return t?E.EraseInput:E.ExitCommandLine;case"escape":return E.ExitCommandLine;default:return E.CaptureInput}},Lp=(e,t)=>{if(Tp(e,e.sequence))return E.MoveCursorLeftOfWord;if(Mp(e,e.sequence))return E.MoveCursorRightOfWord;if(wp(e,e.sequence))return E.EraseInputWord;switch(e.name){case"tab":return E.AutoCompleteCommand;case"up":return E.NavPreviousItem;case"down":return E.NavNextItem;case"left":return E.MoveCursorLeft;case"right":return E.MoveCursorRight;case"return":return E.Confirm;case"backspace":return t?E.EraseInput:E.ExitCommandLine;case"escape":return E.ExitCommandLine;default:return E.CaptureInput}};import kp from"string-width";function oa(e,t){let n=Math.min(e.length,t.length),o=0;for(;o<n&&e[o]===t[o];)o++;return o}var _n=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",pE=/\u001B\[[0-9;]*m/,Wc="\x1B[0m",fE=e=>[...new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)].map(({segment:t})=>t),jn=(e,t)=>{if(t<=0)return"";if(kp(e)<=t)return e;if(t<=3)return"...".slice(0,t);let o=t-3,r="",s=0,i=!1;for(let c of e.split(/(\u001B\[[0-9;]*m)/))if(c!==""){if(pE.test(c)){r+=c,i=c!==Wc&&c!=="\x1B[m";continue}for(let d of fE(c)){let p=kp(d);if(s+p>o)return`${r}...${i?Wc:""}`;r+=d,s+=p}}return`${r}...${i?Wc:""}`},Ee=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),Dp=e=>e.charAt(0).toUpperCase()+e.slice(1);var Bp=e=>{let t=new Map;for(let n of e){let o=n.toLowerCase();for(let r=1;r<=n.length;r++){let s=o.slice(0,r),i=t.get(s);i?i.push(n):t.set(s,[n])}}return t},Op=(e,t)=>t?e.get(t)??[]:[];var Fp=new WeakMap,gE=e=>{let t=Fp.get(e);return t||(t=Bp(e),Fp.set(e,t)),t};var _p=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let o=t.toLowerCase();return Op(gE(e),o).filter(s=>oa(o,s.toLowerCase())>=n)};var hE={hint:"",hints:[],overlap:0,remainder:""},$p=({inputToMatch:e,lastWord:t,isLastWordCompleted:n,inputString:o},r,s=[])=>{if(n||e===""){let[c]=s;return s.length===1&&c&&!o.trim()?jp("",[c]):hE}let i=_p({wordList:r,inputToMatch:e,overlapThreshold:1});return jp(t,i)},jp=(e,t)=>{let n=t[0]??"",o=oa(e.toLowerCase(),n.toLowerCase()),[r,s]=n.split(":"),i=o<(r??"").length,c=!!s,m=(c&&i?r:n)+(c&&i?":":" "),f=m.slice(o);return{hint:m,hints:t,overlap:o,remainder:f}};import Cs from"node:fs";import Ns from"node:path";import{z as Ir}from"zod";var ra="recent-projects.json",yE=20,vE=Ir.object({projectId:Ir.string().min(1),root:Ir.string().min(1),lastOpenedAt:Ir.number().finite()}),bE=Ir.object({projects:Ir.array(vE)}),Hp=()=>Ns.join(Bn(),ra),Er=e=>Ns.basename(e)||e,Up=e=>{let t=Ns.resolve(e);try{return Cs.realpathSync(t)}catch{return t}},Wp=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,Gp=e=>{if(!hs(e.root))return!1;let t=fn(e.root);return!a(t)&&t.value===e.projectId},Vp=()=>{let e=Hp();if(!Cs.existsSync(e))return u("No recent projects recorded",[]);let t;try{t=JSON.parse(Cs.readFileSync(e,"utf8"))}catch(o){return l(`Invalid ${ra}: ${o instanceof Error?o.message:String(o)}`)}let n=bE.safeParse(t);return n.success?u("Read recent projects",n.data.projects):l(`Invalid ${ra} shape: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},xE=e=>{let t=Hp();try{Cs.mkdirSync(Ns.dirname(t),{recursive:!0}),Cs.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
|
|
30
|
+
`,"utf8")}catch(n){return l(`Unable to write ${ra}: ${n instanceof Error?n.message:String(n)}`)}return u("Recorded recent project",e)},$n=({exclude:e}={})=>{let t=Vp();if(a(t))return t;let n=e===void 0?null:Up(e);return u("Listed recent projects",t.value.filter(o=>n===null||Up(o.root)!==n).filter(Gp).sort(Wp))},sa=({root:e,now:t=Date.now()})=>{let n=Ns.resolve(e),o=fn(n);if(a(o))return l(o.message);let r=o.value,s=Vp(),i=a(s)?[]:s.value,c=[{projectId:r,root:n,lastOpenedAt:t},...i.filter(d=>d.projectId!==r&&d.root!==n)].filter(Gp).sort(Wp).slice(0,yE);return xE(c)};var Gc=null,zp=e=>{Gc=e},Kp=e=>Gc?Gc(e):[];var qp=[],Sr=e=>{qp=e},Rr=()=>qp;var Un=()=>{let e=V(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),o=e.autoSync===!0||e.autoSync===!1,r=Yp(),s=r.length>0?null:Vc(),i=s!==null&&(e.declinedEmailBoards??[]).includes(s),c=r.length>0||i||s===null;return{isSetupDone:n&&t&&o&&c,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:o,isSetEmails:c,claimedEmails:r,emailSetupDeclined:i}},Vc=()=>{let e=oe(process.cwd());if(a(e))return null;let t=fn(e.value);return a(t)?null:t.value||null},Yp=()=>{let{userId:e}=V();return e?Kp(e):[]},Xp=()=>Yp().length>0;var zc=()=>{let e=oe(process.cwd());if(a(e))return!1;let t=Mt(e.value);return ve(t)},Jp=e=>e===!0?"on":e===!1?"off":null,Qp=e=>e==="on"?!0:e==="off"?!1:null,Zp=()=>{let e=Un();if(!e.isSetUserName)return"config username ";if(!e.isSetPreferredEditor)return"config editor ";if(!e.isSetAutoSync)return"config autoSync ";if(!zc())return"init";if(!e.isSetEmails){let{gitEmail:t}=V(),n=Rr()[0]??t;return n&&no(n)?`config emails ${n}`:"config emails "}return null};var IE=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[he,ia]=IE;var EE=e=>e.props.tags??[],SE=e=>e.props.assignees??[],bn=e=>EE(e).map(t=>N.getTag(t)).filter(t=>!!t),xn=e=>SE(e).map(t=>N.getContributor(t)).filter(t=>!!t),aa=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!_(n)?l("Invalid untag target"):u("Retrieved tags from ticket in breadcrumb",bn(n))},la=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!_(n)?l("Invalid unassign target"):u("Retrieved assignees from ticket in breadcrumb",xn(n))};var C={PALETTE:"?",EXIT:"exit",INIT:"init",OPEN:"open",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",REPLAY:"replay",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",YANK:"yank",SYNC:"sync",EXPORT:"export",NONE:""};var RE=/^(\d+)(h|d|w|mo|y)$/,CE=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,NE=({year:e,month:t,day:n,hour:o=0,minute:r=0})=>{let s=new Date(e,t-1,n,o,r);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===o&&s.getMinutes()===r},AE=(e,t=new Date)=>{let n=e.match(RE);if(!n)return null;let[,o,r]=n,s=Number(o);if(!Number.isInteger(s)||s<=0)return null;let i=new Date(t);switch(r){case"h":return i.setHours(i.getHours()-s),i;case"d":return i.setDate(i.getDate()-s),i;case"w":return i.setDate(i.getDate()-s*7),i;case"mo":return i.setMonth(i.getMonth()-s),i;case"y":return i.setFullYear(i.getFullYear()-s),i;default:return null}},wE=e=>{let t=e.match(CE);if(!t)return null;let[,n,o,r,s,i]=t,c=Number(n),d=Number(o),p=Number(r),m=s?Number(s):0,f=i?Number(i):0;return NE({year:c,month:d,day:p,hour:m,minute:f})?new Date(c,d-1,p,m,f):null},ko=e=>{let t=e.trim().toLowerCase();return AE(t)??wE(t)};var ef=/^(\d+)(s|m)?$/,ca=e=>{let t=e.trim().toLowerCase().match(ef);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},da=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),o=n.length>0&&ef.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:o}},tf=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,TE=[{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}],Kc=(e=TE)=>{let t=[];for(let{unit:n,from:o,to:r}of e)for(let s=o;s<=r;s++)t.push(`${s}${n}`);return t};var ME=["BOARD","TICKET","SWIMLANE","COMMENT"],ye={EDITOR:"editor",VIEW:"view",USERNAME:"username",EMAILS:"emails",EMAILS_UNCLAIM:"emails-unclaim",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},Dt={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},qe={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},PE=[ye.EDITOR,ye.VIEW,ye.USERNAME,ye.EMAILS,ye.EMAILS_UNCLAIM,ye.AUTOSYNC,ye.SYNC_DEBOUNCE_MS,ye.ATTACHMENT_MAX_KB,ye.LOG_LEVEL],LE=(e=v().selectedNode?.context)=>{switch(e){case"TICKET":return[Dt.TITLE,Dt.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Dt.TITLE];case"COMMENT":return[Dt.COMMENT];default:return[]}},Yc=[String(3e3),"5000","15000","30000","60000"],Xc=["250","500","1000"],rf=["10s","20s","30s","45s"],Do=[C.EXIT,C.SYNC,C.HELP,C.EXPORT,C.CONFIG,C.YANK],ua=[C.NEW,C.EDIT,C.DELETE,C.MOVE],qc=[C.TAG,C.UNTAG,C.ASSIGN,C.UNASSIGN,C.CLOSE_ISSUE,C.RE_OPEN_ISSUE,C.EDIT,C.COMMENT],nf=[C.FILTER,C.PEEK,C.REPLAY],kE={WORKSPACE:[...Do,...ua],BOARD:[...nf,...Do,...ua],SWIMLANE:[...nf,...Do,...ua],TICKET:[...Do,...ua,...qc],FIELD:[...Do,...qc],FIELD_LIST:[...Do,...qc],TEXT:[...Do],COMMENT:[C.EDIT,C.DELETE,C.YANK]},DE=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],As=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&_(n)),of=e=>e.parentNodeId===he,BE=({selectedNode:e,breadCrumb:t})=>{let n=LE(e?.context);return As({breadCrumb:t,selectedNode:e})?n.includes(Dt.DESCRIPTION)?n:[...n,Dt.DESCRIPTION]:n},OE=({selectedNode:e,breadCrumb:t})=>{let n=As({breadCrumb:t,selectedNode:e});return n?[qe.REF,qe.TITLE,...n.props?.description?.trim()?[qe.DESCRIPTION]:[],...bn(n).length>0?[qe.TAGS]:[],...xn(n).length>0?[qe.ASSIGNEES]:[]]:e?[qe.REF,qe.TITLE]:[]},Jc=()=>{let e=$n({exclude:process.cwd()});return a(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},FE=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:o}=Un();if(!o)return[C.HELP,C.CONFIG];if(!zc())return[C.HELP,C.INIT,C.OPEN];if(t)return[C.HELP,C.PEEK,C.REPLAY,C.EXPORT,C.CONFIG,C.YANK];let r=e?.context,s=r&&ME.includes(r),i=[...new Set([...n,e].map(d=>d?.context).flatMap(d=>d?kE[d]:[]))],c=As({breadCrumb:n,selectedNode:e});return i.filter(d=>d===C.MOVE?!1:d===C.YANK?!!(c??e):d===C.EDIT?s||!!c:d===C.DELETE?s:d===C.UNTAG?!!(c&&bn(c).length>0):d===C.UNASSIGN?!!(c&&xn(c).length>0):d===C.RE_OPEN_ISSUE?!!(c&&of(c)):d===C.CLOSE_ISSUE?!!(c&&!of(c)):!0)},Be=(e,{contextNode:t,selectedNode:n,readOnly:o,breadCrumb:r}=v())=>{let s=t.context??"WORKSPACE";return{[C.NONE]:FE({breadCrumb:r,readOnly:o,selectedNode:n}),[C.EXIT]:["confirm"],[C.EXPORT]:[],[C.SYNC]:[],[C.INIT]:[],[C.OPEN]:e===C.OPEN?Jc():[],[C.HELP]:[],[C.PEEK]:[...Kc(),"now","prev","next"],[C.REPLAY]:[...Kc()],[C.EDIT]:BE({selectedNode:n,breadCrumb:r}),[C.YANK]:OE({selectedNode:n,breadCrumb:r}),[C.COMMENT]:[],[C.DELETE]:["confirm"],[C.RE_OPEN_ISSUE]:["confirm"],[C.CLOSE_ISSUE]:["confirm"],[C.MOVE]:["start","confirm","next","previous","jump-next","jump-previous","to-next","to-previous","cancel"],[C.FILTER]:["tag","assignee","actor","description","title","ref","clear"],[C.TAG]:[...new Set([...Object.keys(qi),...N.getExistingTags()])],[C.UNTAG]:[...aa()?.value?.map(({name:c})=>c)??[]],[C.UNASSIGN]:[...la()?.value?.map(({name:c})=>c)??[]],[C.ASSIGN]:N.getExistingAssignees(),[C.NEW]:DE(s),[C.CONFIG]:[...PE]}[e]??[]};import bf from"chalk";var sf=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import HE from"zod";import _E from"node:crypto";import ws from"node:fs";import cf from"node:path";var af="/media/",lf=e=>`${af}${e}`,Qc=(e,t)=>`})`;var In=500,jE=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,Oo=(e,t)=>`${e}.${t}`,$E=e=>jE.test(e),df=e=>e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?u("Sniffed image type","png"):e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?u("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")))?u("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"))?u("Sniffed image type","webp"):l(`Unsupported image format. Allowed: ${Np.join(", ")}`),uf=e=>_E.createHash("sha256").update(e).digest("hex"),UE=(e,t=In)=>{if(e.length===0)return l("Attachment is empty");if(e.length>t*1024)return l(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=df(e);return a(n)?n:u("Validated attachment data",{hash:uf(e),ext:n.value,bytes:e.length})},mf=(e,t,n=In)=>{let o=UE(t,n);if(a(o))return o;let r=gs(e),s=cf.join(r,Oo(o.value.hash,o.value.ext));try{ws.existsSync(s)||(ws.mkdirSync(r,{recursive:!0}),ws.writeFileSync(s,t))}catch(i){return l(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return u("Wrote attachment blob",o.value)},pf=(e,t,n=In)=>{if(!$E(t))return l("Invalid attachment file name");let o=cf.join(gs(e),t);if(!ws.existsSync(o))return l("Attachment blob not found");let r;try{r=ws.readFileSync(o)}catch(d){return l(`Unable to read attachment blob: ${d instanceof Error?d.message:String(d)}`)}if(r.length>n*1024)return l(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(uf(r)!==s)return l("Attachment blob does not match its content hash");let c=df(r);return a(c)?c:c.value!==i?l("Attachment blob content does not match its extension"):u("Resolved attachment blob",{filePath:o,ext:i,bytes:r.length})};var Ts=50,Ms=5e3,ff=()=>{let e=se().commandMeta.inputString,t=HE.coerce.number().int().min(Ts).max(Ms).safeParse(e);if(!t.success)return l(`Attachment size cap must be ${Ts}-${Ms} KB (default ${In})`);let n=Ut({attachmentMaxKb:t.data});return a(n)?n:(je({attachmentMaxKb:t.data}),u(`Attachment size cap set to ${t.data} KB`,null))};var lt=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as WE}from"node:crypto";var GE="0123456789ABCDEFGHJKMNPQRSTVWXYZ",VE=e=>{let t=WE("sha256").update(e).digest(),n=0n;for(let r=0;r<16;r++)n=n<<8n|BigInt(t[r]);let o="";for(let r=0;r<26;r++){let s=BigInt((25-r)*5);o+=GE[Number(n>>s&31n)]}return o},gf=new Map,Me=(e,t)=>{let n=`${e}:virtual:${t}`,o=gf.get(n);if(o!==void 0)return o;let r=VE(n);return gf.set(n,r),r};import hf from"chalk";var Se=e=>hf.dim(e),$e=e=>hf.hex(y.primary)(e),Ue=({prefix:e="",wordList:t,postfix:n="",noOfHints:o=100,inputString:r,minLengthForHints:s=1})=>{let i=r.trim();if(i.length<s)return"";let m=[...t.filter(Boolean).filter(f=>f.startsWith(i))].sort((f,g)=>Ji(f)-Ji(g)).slice(0,o).map(f=>Qi(f)).join(" ");return m?`${Se(e)}${m}${Se(n)}`:""};var En={None:"none",Invalid:"invalid",Valid:"valid"};var zE=["BOARD","TICKET","SWIMLANE"],yf=()=>{let e=v().selectedNode;if(!e?.context)return z({message:Se("Missing target context")});if(zE.includes(e.context))return ie();if(e.parentNodeId){let t=v().nodes[e.parentNodeId];if(t?.id===Me(t?.parentNodeId??"","comments"))return ie()}return z({message:Se("Command not available in this context")})},fe="<ENTER> to confirm",KE=()=>{let{userId:e}=V(),t=de();return!e||a(t)?[]:yn(t.value.emailLinks,e)},ie=(e="",t=[],n=!0)=>({message:n?Se(e):e,validity:En.Valid,completionWordList:t}),z=({message:e,completionWordList:t=[]})=>({validity:En.Invalid,message:e,completionWordList:t}),Nr=e=>e.length===0,vf=(e,t)=>{let n=yt(v().breadCrumb,"BOARD");if(a(n))return z({message:$e("Command is not applicable in this context")});let o=br(n.value.id);return a(o)?z({message:$e(`Unable to ${t}: board id is not a valid ULID`)}):tf({date:e,horizonDate:o.value})?null:z({message:$e(`nothing to ${t} before ${o.value.toISOString().slice(0,16).replace("T"," ")}`)})},ma=e=>` ${bf.hex("#000").bgHex(ze(e))(` ${e} `)} `,Zc=({modifier:e})=>{let t="confirm";return e===t?ie(fe):z({message:Nr(e)?Se("if you are certain, enter ")+Qi(t):"",completionWordList:[t]})},qE=({list:e,hint:t,onValue:n})=>({modifier:o,inputString:r})=>e.includes(o)?r.trim().length<1?z({message:Se(n)}):ie():z({message:Nr(o)?t:"",completionWordList:[...e]}),Cr=({hint:e,onOk:t})=>({modifier:n,inputString:o})=>Nr(n)&&Nr(o)?z({message:e,completionWordList:[]}):ie(t??fe),YE=({modifier:e,inputString:t})=>{let n=Jc();return!Nr(e)||!Nr(t)?ie(fe):z({message:n.length?Se("number from the list, or a path"):Se("path to an epiq project"),completionWordList:n})},XE=({modifier:e,inputString:t})=>{let n=Be(C.CONFIG);if(!n.includes(e))return z({message:Ue({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ye.EDITOR:{let o=[...sf];return t.trim()?o.includes(t.trim())?ie(fe):z({message:Ue({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o}):z({message:Ue({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case ye.VIEW:{let o=["dense","wide"];return o.includes(t.trim())?ie(fe):z({message:Ue({prefix:"view... ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case ye.USERNAME:{let o=V().gitName,r=o?[o]:[],s=t.trim(),i=r.filter(p=>p.startsWith(s)),d=i.length===1&&i[0]===s?"":Ue({prefix:"name: ",wordList:r,inputString:s,minLengthForHints:0});return s?d?ie(`${d} ${Se(fe)}`,r,!1):ie(fe,r):z({message:d||$e("Enter a user name. Saved in ")+bf.bgBlack("~/.epiq-global/config.json"),completionWordList:r})}case ye.EMAILS:{let o=V().gitEmail,r=Rr(),s=r.length>0||!o?r:[o],i=[...s,"none"],c=t.trim(),d=(x,b)=>z({message:Ue({prefix:x,wordList:i,noOfHints:3,inputString:b,minLengthForHints:0}),completionWordList:i});if(!c)return ie(`${fe} to see your addresses, or name one`,i);let p=c.split(/[,\s]+/).filter(Boolean),m=p[p.length-1]??"",f=x=>x==="none"||s.includes(x.toLowerCase()),g=x=>i.some(b=>b.startsWith(x.toLowerCase())),h=p.filter(x=>!f(x)&&!g(x));return h.length>0?z({message:$e(`no address here matches ${h.join(", ")} \u2014 pick one from the list, or its number`),completionWordList:i}):f(m)?ie(fe):d("",m)}case ye.EMAILS_UNCLAIM:{let o=KE(),r=t.trim();return o.length===0?z({message:$e("you have not claimed any addresses"),completionWordList:[]}):r&&o.includes(r.toLowerCase())?ie(fe):z({message:Ue({prefix:"give an address back ",wordList:o,noOfHints:3,inputString:r,minLengthForHints:0}),completionWordList:o})}case ye.LOG_LEVEL:{let o=["debug","error","info"],r=t.trim();return o.includes(r)?ie(fe):z({message:Ue({prefix:"one of: ",wordList:[...o],inputString:r,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...o]})}case ye.AUTOSYNC:{let o=["on","off"],r=V().autoSync;if(!o.includes(t.trim())){let s=Jp(r);return z({message:Ue({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:o,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:o})}return ie(fe)}case ye.ATTACHMENT_MAX_KB:{let o=V().attachmentMaxKb,r=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(r)||r<Ts||r>Ms){let s=Ue({prefix:" examples: ",wordList:Xc,minLengthForHints:0,inputString:t});return z({message:$e(`provide a size cap in KB (${Ts}-${Ms}). current: ${o??In} KB.`)+s,completionWordList:Xc})}return ie(fe)}case ye.SYNC_DEBOUNCE_MS:{let o=V().autoSyncIntervalMs,r=ur(t);if(!t.trim()||r===null){let s=Ue({prefix:" examples: ",wordList:Yc,minLengthForHints:0,inputString:t});return z({message:$e(`provide a duration between ${3e3}ms and ${864e5}ms. current duration: ${o}ms.`)+s,completionWordList:Yc})}return ie(fe)}default:return z({message:$e("Unknown config option"),completionWordList:n})}},JE=({modifier:e,inputString:t})=>{let n=Be(C.EDIT);if(!n.length)return z({message:$e("Command not available in this context")});if(!n.includes(e)){let o=Ue({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return z({message:o||$e("Unknown edit option"),completionWordList:n})}switch(e){case Dt.COMMENT:return t.trim()?ie(fe):z({message:Se("write a comment...")});case Dt.TITLE:return ie(fe);case Dt.DESCRIPTION:{let{preferredEditor:o}=V();return o?ie(Se("<ENTER> to edit in ")+o):z({message:"No editor selected"})}default:return z({message:$e("Unknown edit option"),completionWordList:n})}},QE=({modifier:e})=>{let t=Be(C.YANK);return t.length?t.includes(e)?ie(fe+Se(" and copy to clipboard")):z({message:Ue({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):z({message:$e("Nothing selected to copy from")})},ZE={[C.EXPORT]:()=>ie(fe+Se(", and create export markdown file")),[C.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return ie(fe);let n={message:Se("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},o=t||e.inputString.trim(),r=ko(o);if(!o||!r)return z(n);let s=vf(r,"peek");return s||ie(fe)},[C.REPLAY]:e=>{let{dateInput:t,durationInput:n}=da(e.modifier,e.inputString),o={message:Se("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},r=ko(t);if(!t||!r)return z(o);let s=vf(r,"replay");return s||(n&&ca(n)===null?z({message:$e("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):ie("<ENTER> to replay board history",n?rf:[]))},[C.EXIT]:()=>ie(fe+Se(" and exit the application")),[C.INIT]:()=>ie(fe),[C.OPEN]:YE,[C.PALETTE]:()=>ie(fe),[C.FILTER]:e=>{if(e.modifier==="clear")return ie(fe);let t=s=>Be(C.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return z({message:Ue({wordList:Be(C.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Be(C.FILTER)});let n=Object.values(v().tags).map(s=>s.name),o=Object.values(v().contributors).map(s=>s.name),r=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?r.length&&!r.includes(e.inputString.trim())?z({message:Ue({prefix:`existing ${e.modifier}s... `,wordList:r,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:r}):ie():z({message:Ue({prefix:"one of... ",wordList:r,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:r})},[C.NONE]:e=>{let t=Be(C.NONE);return z({message:Ue({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[C.NEW]:e=>qE({list:Be(C.NEW),hint:Ue({wordList:Be(C.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[C.HELP]:()=>ie(fe),[C.EDIT]:JE,[C.COMMENT]:e=>{let t=Cr({hint:Se(`write a comment (max ${4e3} char)...`),onOk:Se(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===En.Invalid?t:e.inputString.length>4e3?ie($e("max input exceeded")):t},[C.CONFIG]:XE,[C.YANK]:QE,[C.DELETE]:e=>{let t=yf();return t.validity==="invalid"?t:Zc(e)},[C.CLOSE_ISSUE]:e=>Zc(e),[C.RE_OPEN_ISSUE]:e=>Zc(e),[C.MOVE]:e=>{let t=yf();return t.validity==="invalid"?t:Cr({hint:Ue({prefix:"hey hacker! These commands are blocked for you... ",wordList:Be(C.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[C.TAG]:e=>{let n=N.getExistingTags().slice(0,10).map(ma).join("");return Cr({hint:n.length?Se("create tag or reuse:")+n+Se(""):Se("create tag ...")})(e)},[C.UNTAG]:e=>{let t=aa();if(a(t))return z({message:$e("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(ma).slice(0,10);return n.length?Cr({hint:Se(" ... ")+n.join("")})(e):z({message:$e("Issue has no tags"),completionWordList:[]})},[C.ASSIGN]:e=>{let t=N.getExistingAssignees().map(ma).slice(0,10);return Cr({hint:Se("assignees... ")+t.join("")})(e)},[C.UNASSIGN]:e=>{let t=la();if(a(t))return z({message:$e("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(ma).slice(0,10);return n.length?Cr({hint:Se("remove assignee... ")+n.join("")})(e):z({message:$e("Issue has no assignees"),completionWordList:[]})},[C.SYNC]:()=>ie(fe)},xf=Object.fromEntries(Object.entries(ZE).map(([e,t])=>[e,{validate:(n,o,r)=>t({modifier:o,command:n,inputString:r})}]));var pa=["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 eS=3,tS=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"]),nS=e=>{let t=[];for(let n of Object.values(e.nodes)){n.title&&t.push(n.title);let o=n.props;typeof o.description=="string"&&t.push(o.description),typeof o.value=="string"&&t.push(o.value)}for(let n of Object.values(e.tags))t.push(n.name);for(let n of Object.values(e.contributors))t.push(n.name);for(let n of Object.values(e.comments))t.push(n.md);return t},oS=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=eS&&!tS.has(t)&&!/^\d+$/.test(t)),rS=e=>{let t=new Map;for(let s of nS(e))for(let i of oS(s))t.set(i,(t.get(i)??0)+1);let n=[...t.entries()].sort((s,i)=>i[1]-s[1]||s[0].localeCompare(i[0])).map(([s])=>s),o=new Set(n),r=pa.filter(s=>!o.has(s));return[...n,...r]},If=pa,Ef=-1,Sf=()=>{let e=de();if(a(e))return pa;let t=e.value,n=t.eventLog.length;return n!==Ef&&(If=rS(t),Ef=n),If};var Rf=e=>Object.values(C).includes(e),Cf=(e,t)=>{let n=e.command??"",{modifier:o,target:r,inputString:s}=e,{message:i,validity:c,completionWordList:d}=xf[n].validate(n,o,s),p=n!==C.PEEK&&n!==C.REPLAY,m=r==="command"||r==="modifier"?Be(n):p?Sf():[],{mode:f}=v(),g=f===I.COMMAND_LINE?i??"":"",h=[...d,...m];return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?$p(e,h,d):{hint:"",hints:[],remainder:"",overlap:0}}};var Nf=e=>{let t=e.trimStart(),n=iS(t),o=n[0]??"",r=n[1]??"",s=/\s$/.test(e),i=aS(e),c=Rf(o)?o:null,d=c!==null,p=o!=="",m=c?Be(c)??[]:[],f=c&&m.includes(r)?r:"",g="word";n.length===0||n.length===1&&!s?g="command":(n.length===1&&s||n.length===2&&!s)&&(g="modifier");let h=s?"":i,x=sS(t,c,f);return{raw:e,trimmedStart:t,words:n,firstWord:o,lastWord:i,hasCommand:p,command:c,isCommandKeyword:d,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:h,inputString:x}},sS=(e,t,n)=>{let o=e;return t&&o.startsWith(t)&&(o=o.slice(t.length)),o=o.replace(/^\s+/,""),n&&o.startsWith(n)&&(o=o.slice(n.length),o=o.replace(/^\s+/,"")),o},iS=e=>e.trim()?e.trim().split(/\s+/):[],aS=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as lS}from"react";var Ar=e=>e===ed||e===":",ed=" ",Ls=40,ct={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:En.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},td=new Set,Af=()=>{for(let e of td)e()},nd=e=>(td.add(e),()=>td.delete(e)),Wt=e=>{let n=e(ct),o=Nf(n.value),r=n.cursorPosition===n.value.length;ct={...n,commandMeta:Cf(o,r)},Af()},ks=({message:e,status:t})=>{let n=structuredClone(ct);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,ct=n,Af(),u(e,null)},od=e=>{Wt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},rd=e=>{Wt(t=>{let{value:n,cursorPosition:o}=t,r=o;if(e==="left"){for(;r>0&&Ar(n[r-1]);)r--;for(;r>0&&!Ar(n[r-1]);)r--}else{for(;r<n.length&&!Ar(n[r]);)r++;for(;r<n.length&&Ar(n[r]);)r++}return{...t,cursorPosition:r}})},wf=()=>{Wt(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}})},Tf=()=>{Wt(e=>{let{value:t,cursorPosition:n}=e,o=n;for(;o>0&&Ar(t[o-1]);)o--;for(;o>0&&!Ar(t[o-1]);)o--;let r=t.slice(n);return{...e,value:t.slice(0,o)+r,cursorPosition:o,commandIsPending:!1}})},fa=e=>{Wt(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),o=t.value.slice(0,n),r=t.value.slice(n),s=e(o,t.commandMeta.autoCompletion),i=s+r,c=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:c,commandIsPending:!1}})},Mf=()=>{Wt(e=>({...e,commandIsPending:!0}))},J=e=>{Wt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Pf=({addToHistory:e=!0,line:t})=>{Wt(n=>{let o=t??n.value;return{...n,commandHistory:e&&o.trim()?[o,...n.commandHistory].slice(0,Ls):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}})},Lf=e=>{Wt(t=>({...t,commandHistory:e.slice(0,Ls),commandHistoryIndex:-1}))},kf=()=>{Wt(e=>e.commandHistoryIndex===-1?e:{...e,commandHistoryIndex:-1})},Df=()=>{Wt(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}})},Bf=()=>{Wt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},se=()=>ct,Of=()=>lS(nd,se,se),ga=()=>{let[e,...t]=ct.value.split(ed);return t.join(ed).trim()};var E={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavPreviousItemJump:"navPreviousItemJump",NavNextItemJump:"navNextItemJump",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MovePreviousItemJump:"movePreviousItemJump",MoveNextItemJump:"moveNextItemJump",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",OpenInEditor:"openInEditor",MarkDiffLine:"markDiffLine",CommentOnDiffLine:"commentOnDiffLine",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"},cS=e=>e.shift===!0,dS={[E.NavPreviousItem]:E.NavPreviousItemJump,[E.NavNextItem]:E.NavNextItemJump,[E.MovePreviousItem]:E.MovePreviousItemJump,[E.MoveNextItem]:E.MoveNextItemJump};function uS(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function mS(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function pS(e,t,n){let o=v().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:o?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:o?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:o?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:o?n.nextContainer:null}}function Ff(e,t){let n=se();if(e.sequence==="?"&&t!==I.PALETTE)return E.InitCommandPalette;if(e.sequence===":"&&t!==I.COMMAND_LINE)return E.InitCommandLine;if(t===I.MOVE)switch(e.name){case"m":case"return":return E.ConfirmMove}if(t===I.COMMAND_LINE)return Pp(e,n.value);if(t===I.PALETTE)return Lp(e,n.value);let o=uS(e)||mS(e);if(o)return fS(o,t,cS(e));if(e.ctrl&&e.name==="c")return E.Exit;switch(e.name){case"r":return E.EditTitle;case"e":return E.EditDescription;case"n":return E.AddItem;case"m":return E.InitMove;case"d":return E.Delete;case"y":return E.Yank;case"o":return E.OpenInEditor;case"s":return E.MarkDiffLine;case"c":return E.CommentOnDiffLine;case"return":return E.Confirm;case"space":return E.Confirm;case"v":return V().viewMode==="wide"?E.SetViewDense:E.SetViewWide;case"q":case"escape":return E.Exit;default:return null}}function fS(e,t,n=!1){let o=t===I.MOVE?{prevItem:E.MovePreviousItem,nextItem:E.MoveNextItem,prevContainer:E.MoveToPreviousContainer,nextContainer:E.MoveToNextContainer}:{prevItem:E.NavPreviousItem,nextItem:E.NavNextItem,prevContainer:E.NavToPreviousContainer,nextContainer:E.NavToNextContainer},r=pS(v().contextNode.childRenderAxis,e,o);return!r||!n?r:dS[r]??r}import{ulid as yS}from"ulid";var Ds=24n,gS=Ds*4n,tn=(1n<<gS)-1n,hS=/^[0-9a-f]+$/;function _f(e){return!e||!hS.test(e)?l(`Invalid hex rank: ${e}`):u("Converted rank to bigint",BigInt("0x"+e))}function Bt(e,t=Ds){if(e<0n)return l("Negative rank not allowed");let n=e.toString(16);return u("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function vt(e,t){if(!e&&!t)return Bt(tn/2n,Ds);let n=e?_f(e):u("Resolved lower bound",0n);if(a(n))return n;let o=t?_f(t):u("Resolved upper bound",tn);if(a(o))return o;let r=n.value,s=o.value;if(s<=r)return l("Neighbouring ranks leave no space between them");let i=(r+s)/2n;return i===r||i===s?l("No rank space available between neighbors"):Bt(i,Ds)}function jf(e){if(e<=0)return u("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let o=0;o<e;o++){let r=tn*BigInt(o+1)/(t+1n),s=Bt(r,Ds);if(a(s))return s;n.push(s.value)}return u("Resolved evenly spaced ranks",n)}var D=({userId:e})=>({userId:e}),$f=e=>({action:e.action,payload:e.payload});var sd=["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","link.contributor.email","unlink.contributor.email"];var dB=new Set(sd);var id=(e,t)=>{let n=be(e),o=jf(n.length);if(a(o))return o;let r={};for(let s=0;s<n.length;s++){let i=n[s],c=o.value[s];if(!i||!c)return l("Unable to assign rebalance rank");r[i.id]=c}return u("Created rebalance event",{id:yS(),action:"rebalance.children",payload:{parent:e,ranks:r},...D(t)})};import{z as Fo}from"zod";var Uf=1,Hf=Fo.tuple([Fo.string().min(1),Fo.string().min(1).nullable()]),vS=Fo.looseObject({v:Fo.literal(Uf),id:Hf}),RB=Fo.looseObject({v:Fo.number().int().positive(),id:Hf}),bS=e=>Object.prototype.hasOwnProperty.call(e,"__proto__"),xS=e=>{let t={};for(let n of Object.keys(e))n!=="__proto__"&&(t[n]=e[n]);return t},Wf=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return l("Invalid persisted event envelope: expected an object");let{v:t,id:n}=e;if(typeof t!="number"||!Number.isSafeInteger(t)||t<=0)return l("Invalid persisted event envelope: v");if(!Array.isArray(n)||n.length!==2)return l("Invalid persisted event envelope: id");let[o,r]=n;return typeof o!="string"||o.length===0?l("Invalid persisted event envelope: id.0"):r!==null&&(typeof r!="string"||r.length===0)?l("Invalid persisted event envelope: id.1"):u("Parsed persisted event envelope",bS(e)?xS(e):e)};var IS=[1];var ES=new Set(IS),ad=e=>ES.has(e),Gf=e=>{let t=vS.safeParse(e);return t.success?u("Parsed persisted event",t.data):l(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ld=(e,t)=>{let n={[e.action]:e.payload,v:Uf,id:t};return Gf(n)};import _s from"node:fs";import Ea from"node:path";import{decodeTime as PS}from"ulid";import{z as gd}from"zod";import cd from"node:fs";import SS from"node:path";var Bs=e=>e?.code==="ENOENT",dd=3,ud=e=>cd.readdirSync(e).filter(t=>t.endsWith(".jsonl")).sort(),et=e=>{let t=St(e);for(let n=1;;n++){if(!cd.existsSync(t))return"none";let o=[],r=!1;for(let s of ud(t))try{let{size:i,mtimeMs:c}=cd.statSync(SS.join(t,s));o.push(`${s}:${i}:${c}`)}catch(i){if(!Bs(i))throw i;if(n<dd){r=!0;break}}if(!r)return o.join("|")}},Vf=e=>new Map(e.split("|").filter(Boolean).map(t=>{let n=t.indexOf(":");return[t.slice(0,n),t.slice(n+1)]})),md=(e,t,n)=>{let o=Vf(t),r=et(e),s=Vf(r);for(let[i,c]of s)if(i!==n&&o.get(i)!==c)return null;for(let i of o.keys())if(i!==n&&!s.has(i))return null;return r},so=null,ha=e=>so&&so.root===e?so.signature:null,wr=(e,t)=>{so={root:e,signature:t}},zf=(e,t)=>{if(!so||so.root!==e)return;let n=md(e,so.signature,t);so=n===null?null:{root:e,signature:n}};import He from"node:fs";import _o from"node:path";import{ulid as RS}from"ulid";var va="~pending",pd=/~pending(-[0-9a-z]+)*$/i,qf=/-f(\d+)$/,Yf=e=>{let t=e.indexOf(".");return t===-1?`${e}${va}`:e.slice(0,t)+va+e.slice(t)},ba=e=>{let t=e.indexOf(".");return t===-1?[e,""]:[e.slice(0,t),e.slice(t)]},CS=e=>{let[t,n]=ba(e);return pd.test(t)?t.replace(pd,"")+n:null},fd=e=>e.replace(pd,""),jo=e=>e.endsWith(".jsonl")&&CS(e)!==null,Os=e=>fd(ba(e)[0]),Xf=e=>{let[t]=ba(e),n=qf.exec(t);return n&&jo(e)?Number(n[1]):null},NS=e=>Yf(e).replace(va,`${va}-${RS().toLowerCase()}`),AS=(e,t)=>{let[n,o]=ba(e);return`${n.replace(qf,"")}-f${t}${o}`},Jf=(e,t)=>_o.join(St(e),Yf(t)),wS=(e,t)=>Math.max(0,He.statSync(e).size-(Xf(t)??0)),Qf=e=>{let t=St(e);try{return He.existsSync(t)?He.readdirSync(t).filter(jo).some(n=>wS(_o.join(t,n),n)>0):!1}catch{return!0}},TS=3,Zf=(e,t)=>{for(let n=1;;n++){let o=He.openSync(e,"a"),r;try{He.writeSync(o,t),r=He.fstatSync(o).ino}finally{He.closeSync(o)}let s;try{s=He.statSync(e).ino}catch{s=null}if(s===r||n>=TS)return}},MS=e=>{let t;try{t=He.openSync(e,"r")}catch{return!0}try{let{size:n}=He.fstatSync(t);if(n===0)return!0;let o=Buffer.alloc(1);return He.readSync(t,o,0,1,n-1),o[0]===10}finally{He.closeSync(t)}},ya=10,Kf=(e,t,n=!1)=>{let o=n?t.length:t.lastIndexOf(ya)+1;if(o===0)return{bytes:0,lines:0};let r=t.subarray(0,o);if(r.toString("utf8").trim().length===0)return{bytes:o,lines:0};He.appendFileSync(e,Buffer.concat([Buffer.from(MS(e)?"":`
|
|
31
|
+
`),r,Buffer.from(r[r.length-1]===ya?"":`
|
|
32
|
+
`)]));let s=0;for(let i of r)i===ya&&s++;return r[r.length-1]!==ya&&s++,{bytes:o,lines:s}},xa=(e,t)=>{let n=St(e);if(!He.existsSync(n))return u("No events directory",0);try{let o=Os(t),r=He.readdirSync(n).filter(c=>jo(c)&&Os(c)===o),s=_o.join(n,t),i=0;for(let c of r){let d=Xf(c);if(d!==null){let g=_o.join(n,c),h=He.readFileSync(g).subarray(d);i+=Kf(s,h,!0).lines,He.rmSync(g,{force:!0});continue}let p=/~pending-/i.test(c)?c:NS(t),m=_o.join(n,p);p!==c&&He.renameSync(_o.join(n,c),m);let f=Kf(s,He.readFileSync(m));i+=f.lines,He.renameSync(m,_o.join(n,AS(p,f.bytes)))}return u("Folded pending logs",i)}catch(o){return l(`Unable to fold pending event logs in ${n}: ${o instanceof Error?o.message:String(o)}`)}};var Sa="unknown",LS=gd.object({userId:gd.string().min(1).default(Sa),userName:gd.string().min(1).default(Sa)}),og=new Set(["id","v","userId","userName"]),Ia=e=>{let t=Object.entries(e).filter(([r])=>!og.has(r));if(t.length!==1)return null;let n=t[0]?.[1];if(typeof n!="object"||n===null)return null;let o=n.id;return typeof o=="string"&&o.length>0?o:null},kS=/^[0-9a-hjkmnp-tv-z]{26}$/i,DS=e=>kS.test(e)?e.toUpperCase():e,rg=e=>{let t=Ea.basename(e,".jsonl"),n=t.indexOf("."),o=fd(n===-1?t:t.slice(0,n)),r=n===-1?void 0:t.slice(n+1),s=LS.safeParse({userId:DS(o),userName:r});return s.success?u("Parsed event file actor",s.data):l(`Invalid event file name ${Ea.basename(e)}: ${s.error.issues.map(i=>i.path.join(".")||i.message).join(", ")}`)},BS=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?l(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?l("Invalid persisted event: action key is missing or invalid"):u("Resolved persisted action",t[0])},OS=(e,t)=>t in e,io=new Map,FS=3e5,_S=512,Fs=0,hd=e=>e.entries.length+e.quarantined.length,jS=(e,t,n,o)=>{let r=io.get(e);r&&(Fs-=hd(r));let s={stamp:t,entries:n,quarantined:o};io.delete(e),io.set(e,s),Fs+=hd(s);for(let[i,c]of io){if(Fs<=FS&&io.size<=_S)break;i!==e&&(io.delete(i),Fs-=hd(c))}},$S=()=>{io.clear(),Fs=0},US=2n,eg=1000000n,HS=e=>{try{let{size:t,mtimeNs:n}=_s.statSync(e,{bigint:!0});return{value:`${t}:${n}`,settled:BigInt(Date.now())*eg-n>US*eg}}catch{return null}},sg=(e,t)=>{let n=rg(e);if(a(n))return l(n.message);let o=HS(e),r=o?io.get(e):void 0;if(o&&r&&r.stamp===o.value){if(t)for(let m of r.quarantined)t.push(m);return u("Parsed persisted events file",[...r.entries])}let s;try{s=_s.readFileSync(e,"utf8")}catch(m){if(Bs(m))return u("Event file missing",null);throw m}let i=[],c=Ea.basename(e),d=[],p=(m,f)=>{d.push({eventId:null,reason:"corrupt-line",detail:`${c}:${m} (${f})`,targetNodeId:null})};for(let[m,f]of s.split(`
|
|
33
|
+
`).entries()){let g=f.trim();if(!g)continue;let h;try{h=JSON.parse(g)}catch{p(m+1,"invalid JSON");continue}let x=Wf(h);if(a(x)){p(m+1,x.message);continue}i.push({...x.value,userId:n.value.userId,userName:n.value.userName})}if(t)for(let m of d)t.push(m);return o?.settled&&jS(e,o.value,i,d),u("Parsed persisted events file",[...i])},tg=(e,t)=>e<t?-1:e>t?1:0,yd=(e,t)=>{let n=tg(e.id[0],t.id[0]);return n!==0?n:tg(JSON.stringify(e),JSON.stringify(t))},ng=(e,t)=>{let n=new Map,o=new Map;for(let m of e){let f=m.id[0],g=m.id[1]??null;n.set(f,m);let h=o.get(g)??[];h.push(m),o.set(g,h)}for(let m of o.values())m.sort(yd);let r=[],s=new Set,i=m=>{let f=[m];for(;f.length>0;){let g=f.pop(),h=g.id[0];if(s.has(h))continue;r.push(g),s.add(h);let x=o.get(h)??[];for(let b=x.length-1;b>=0;b--)f.push(x[b])}},c=(o.get(null)??[]).filter(m=>{let f=Object.keys(m).filter(g=>!og.has(g));return f.length===1&&f[0]===t});for(let m of c)i(m);let d=e.filter(m=>{let f=m.id[0],g=m.id[1]??null;return s.has(f)?!1:g===null||!n.has(g)}).sort(yd);for(let m of d)i(m);let p=e.filter(m=>!s.has(m.id[0])).sort(yd);for(let m of p)i(m);return r},vd=e=>vr(e.map(t=>{try{return PS(t.id[0])}catch{return null}})),ig=(e,t)=>{let n=new Set,o=[],r=[],s=vd(e);for(let i=0;i<e.length;i++){let c=e[i],d=c.id[0],p=c.id[1],m=s[i]??null;!(m!==null&&m<t)||p&&n.has(p)?(n.add(d),r.push(c)):o.push(c)}return{appliedEvents:o,unappliedEvents:r}},ag=e=>{let t=new Set(e.actions),n=S=>t.has(S),o=S=>{let{userId:A,userName:w,...P}=S,M=BS(P);if(a(M))return l(M.message);let O=M.value,W=S.id?.[0];return W?OS(P,O)?u("Decoded persisted event",{id:W,action:O,payload:P[O],userId:A}):l(`Persisted event is missing payload for action: ${O}`):l("Persisted event is missing id")},r=(S,A)=>{let w=[],P=new Map,M=new Map;for(let O of S){if(!ad(O.v)){M.set(O.v,(M.get(O.v)??0)+1),A?.push({eventId:O.id[0],reason:"unsupported-schema-version",detail:`v${O.v}`,targetNodeId:Ia(O)});continue}let W=o(O);if(a(W)){A?.push({eventId:O.id[0],reason:"invalid-payload",detail:W.message,targetNodeId:Ia(O)});continue}let Y=W.value.action;if(!n(Y)){P.set(Y,(P.get(Y)??0)+1),A?.push({eventId:O.id[0],reason:"unknown-action",detail:Y,targetNodeId:Ia(O)});continue}let xe=e.readPayload(Y,W.value.payload);if(a(xe)){A?.push({eventId:O.id[0],reason:"invalid-payload",detail:xe.message,targetNodeId:Ia(O)});continue}w.push(W.value)}if(P.size>0){let O=[...P.entries()].map(([W,Y])=>`${W} (x${Y})`).join(", ");ee.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${O}. Upgrade to apply them.`)}if(M.size>0){let O=[...M.entries()].map(([W,Y])=>`v${W} (x${Y})`).join(", ");ee.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${O}. Upgrade to apply them.`)}return u("Decoded reconstructed events",w)},s=null;function i(S,A){let w=St(S),P=et(S);if(!_s.existsSync(w))return u("No events found",[]);let M=[],O=[];for(let Y=1;;Y++){M=[],O=[];let xe=!1;for(let F of ud(w)){let X=sg(Ea.join(w,F),O);if(a(X))return l(X.message);if(X.value===null){if(Y<dd){xe=!0;break}continue}for(let Ve of X.value)M.push(Ve)}if(!xe)break}if(A)for(let Y of O)A.push(Y);let W=ng(M,e.genesis);return s={root:S,signature:P,edge:W.at(-1)?.id?.[0]??null},u("All events loaded",W)}function c(S){let A=[],w=i(S,A);if(a(w))return l(w.message);let P=r(w.value,A);return a(P)?l(P.message):u("Loaded merged events",{events:P.value,unreadable:A})}function d(S){let A=i(S);return a(A)?l(A.message):u("Loaded event actors",A.value.map(({userId:w,userName:P})=>({userId:w,userName:P})))}function p(S){let A=new Map,w=St(S),P;try{if(!_s.existsSync(w))return A;P=_s.readdirSync(w)}catch{return A}let M=new Set;for(let W of P){if(!W.endsWith(".jsonl"))continue;let Y=rg(W);if(a(Y))continue;let{userId:xe,userName:F}=Y.value;if(!xe||!F||F===Sa)continue;let X=A.get(xe);X!==void 0&&X!==F&&M.add(xe),A.set(xe,F)}if(M.size===0)return A;let O=d(S);if(a(O))return A;for(let{userId:W,userName:Y}of O.value)M.has(W)&&(!Y||Y===Sa||A.set(W,Y));return A}function m(S){let A=c(S);return a(A)?l(A.message):u("Loaded merged events",A.value.events)}function f(S,A){let w=i(S);if(a(w))return l(w.message);let{appliedEvents:P,unappliedEvents:M}=ig(w.value,A),O=r(P);if(a(O))return l(O.message);let W=r(M);return a(W)?l(W.message):u("Loaded merged events before time",{appliedEvents:O.value,unappliedEvents:W.value})}function g(S=process.cwd()){let A=et(S);if(s&&s.root===S&&s.signature===A)return u("Loaded edge reference, unchanged",s.edge);let w=i(S);return a(w)?l(w.message):u("Loaded edge reference",w.value.at(-1)?.id?.[0]??null)}function h(S,A,w){if(!s||s.root!==S)return;let P=md(S,s.signature,A);s=P===null?null:{root:S,signature:P,edge:w}}function x(){s=null,$S()}let b=S=>ng(S,e.genesis);function R(S){let A=i(S);if(a(A))return l(A.message);let w=vd(A.value);return u("Loaded effective event times",new Map(A.value.map((P,M)=>[P.id[0],w[M]??null])))}return{fromPersistedEvent:o,decodeReconstructedEvents:r,loadMergedEventsWithUnreadable:c,loadEventActors:d,loadActorNames:p,loadMergedEvents:m,loadMergedEventsBefore:f,getEdgeRef:g,advanceEdgeRef:h,clearEdgeCache:x,getSortedEvents:b,loadEffectiveEventTimes:R}};var Ra=(e,t)=>l(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),j=(e,t)=>({...Ra(e,t),convergence:!0}),Tr=e=>a(e)&&e.convergence===!0,Sn=e=>{let t=e.filter(a);return{fatal:t.filter(n=>!Tr(n)),skipped:t.filter(Tr)}},Rn=e=>{e.length!==0&&ee.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},WS=e=>e.userId?.length?null:Ra("Invalid user ID format",e),lg=e=>{let t=null;function n(r,s=!1){let i=e.apply[r.action];if(!i)return l(`Unknown event action "${r.action}", likely created by a newer epiq version. Evt id: ${r.id}`);if(!e.replay.isInitialized()&&r.action!==e.genesis)return j(`${r.action} arrived before the state was initialized`,r);if(r.action===e.genesis&&t){if(t.genesisApplied)return j("the state is already initialized",r);t.genesisApplied=!0}let c;try{c=i(r)}catch(m){return j(`threw while materializing (${m instanceof Error?m.message:String(m)})`,r)}if(a(c))return c;let d=WS(r);if(d)return d;let p=e.replay.afterApply(r,{batched:t!==null,bypassLogging:s});return p||c}return{materialize:n,materializeAll:r=>{let s=e.replay.batch(()=>{let i=t===null;i&&(t={genesisApplied:!1});let c=!1;try{let d=r.map(p=>n(p));if(i){c=!0;let p=e.replay.flush();if(p)return r.map(()=>p)}return d}finally{i&&(t=null,c||e.replay.flush())}});return a(s)?r.map(()=>l(s.message)):s.value}}};import dg from"node:fs";import bd from"node:path";import{decodeTime as GS,monotonicFactory as VS}from"ulid";var cg=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";var zS=0xffffffffffff,KS=ea,qS=e=>{let t=Date.now(),n;try{n=GS(e)}catch{return t}return n>=zS?t:n>t+KS?(ee.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)},ao=({userId:e})=>`${cg(e)}.jsonl`,ug=(e,t)=>{let n;try{if(!dg.existsSync(e))return[t];n=dg.readdirSync(e)}catch{return[t]}let o=Os(t);return[...n.filter(s=>!s.endsWith(".jsonl")||s===t||jo(s)?!1:Os(s)===o).sort(),t]},mg=(e,{userId:t})=>{let n=ao({userId:t});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n))return l(`Invalid event log file name: ${n}`);let r=bd.join(St(e),n);return u("Successfully resolved event log path",r)},pg=e=>{let t=VS();function n(r,s){let i;if(s&&s.current!==void 0)i=s.current;else{let d=e.getEdgeRef(r);if(a(d))return l(d.message);i=d.value}let c=i?t(qS(i)):t();return u("Minted event id",[c,i])}function o({event:r,rootDir:s,edge:i,id:c}){try{let d=ip(s);if(a(d))return d;let p=mg(s,{userId:r.userId});if(a(p))return p;let m=Jf(s,bd.basename(p.value)),f=c?u("Minted event id",c):n(s,i);if(a(f))return l(f.message);let[g,h]=f.value,x=ld($f(r),[g,h]);if(a(x))return l(x.message);Zf(m,`${JSON.stringify(x.value)}
|
|
34
|
+
`),i&&(i.current=g);let b=bd.basename(m);return e.advanceEdgeRef(s,b,g),zf(s,b),u("Event persisted",{path:m,entry:x.value})}catch(d){let p=d instanceof Error?d.message:"Unknown persist error";return l(`Failed to persist event: ${p}`)}}return{mintEventId:n,persist:o}};var fg=(e,t,n)=>{function o(s,i,c){let d=n.mintEventId(i,c);if(a(d))return l(d.message);let p={...s,id:d.value[0]},m=t.materialize(p);if(m.status!==Zn.Success)return m;let f=n.persist({event:p,rootDir:i,edge:c,id:d.value});return a(f)?f:m}function r(s,i){if(s.length===0||!s[0])return l("No events provided");let c=e.write.readOnlyReason();if(c)return l(c);let d=e.replay.batch(()=>{let p={},m=e.write.beforeWrite(s[0],h=>o(h,i,p));if(a(m))return l(m.message);let f=s.map(h=>o(h,i,p)),g=f.filter(a);return g.length>0?l("Materialize and persist failed: "+g.map(h=>h.message).join(", ")):u("Materialization succeeded",f.map(h=>h.value))});return a(d)?l(d.message):d.value??l("Materialize and persist produced nothing")}return{materializeAndPersist:o,materializeAndPersistAll:r}};var gg=e=>{let t=lg(e),n=ag(e),o=pg(n),r=fg(e,t,o);return{...t,...n,...o,...r}};import{z as Q}from"zod";var K=Q.string().min(1),nn=Q.string(),lo=Q.string(),Ca=Q.looseObject({id:K}),xd=Q.looseObject({id:K,name:nn,parent:K,rank:lo}),YS={"init.workspace":Q.looseObject({id:K,name:nn,rank:lo}),"add.workspace":Q.looseObject({id:K,name:nn,rank:lo}),"add.board":xd,"add.swimlane":xd,"add.issue":xd,"add.field":Q.looseObject({id:K,name:nn,parent:K,rank:lo}),"edit.title":Q.looseObject({id:K,name:nn}),"delete.node":Ca,"lock.node":Ca,"move.node":Q.looseObject({id:K,parent:K,rank:lo}),"edit.description":Q.looseObject({id:K,md:Q.string()}),"close.issue":Q.looseObject({id:K,parent:K,rank:lo}),"reopen.issue":Q.looseObject({id:K,parent:K,rank:lo}),"create.tag":Q.looseObject({id:K,name:nn}),"tombstone.tag":Ca,"restore.tag":Q.looseObject({id:K,name:nn}),"create.contributor":Q.looseObject({id:K,name:nn}),"rename.contributor":Q.looseObject({id:K,name:nn}),"tombstone.contributor":Ca,"restore.contributor":Q.looseObject({id:K,name:nn}),"link.contributor.user":Q.looseObject({contributor:K}),"link.contributor.email":Q.looseObject({contributor:K,email:K}),"unlink.contributor.email":Q.looseObject({contributor:K,email:K}),"add.issue.assignee":Q.looseObject({id:K,assignee:K}),"remove.issue.assignee":Q.looseObject({id:K,assignee:K}),"add.issue.tag":Q.looseObject({id:K,tag:K}),"remove.issue.tag":Q.looseObject({id:K,tag:K}),"add.issue.comment":Q.looseObject({id:K,issue:K,md:Q.string()}),"edit.issue.comment":Q.looseObject({id:K,issue:K,md:Q.string()}),"delete.issue.comment":Q.looseObject({id:K,issue:K}),"add.issue.attachment":Q.looseObject({id:K,issue:K,hash:Q.string().min(1),ext:Q.string().min(1),name:nn,bytes:Q.number()}),"delete.issue.attachment":Q.looseObject({id:K,issue:K}),"rebalance.children":Q.looseObject({parent:K,ranks:Q.record(Q.string(),lo)})},hg=(e,t)=>{let o=YS[e].safeParse(t);return o.success?u("Payload is readable",void 0):l(`${e}: ${o.error.issues.map(r=>`${r.path.join(".")||"payload"} ${r.message}`).join(", ")}`)};import{ulid as XS}from"ulid";var yg=(e,t)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return u("Contributor write already in flight",void 0);let{userId:n,userName:o}=V();if(!o||n!==e.userId)return u("Not this actor own write",void 0);let r=N.getContributor(e.userId),s={id:XS(),action:r?"rename.contributor":"create.contributor",payload:{id:e.userId,name:o},userId:e.userId};if(r&&(r.tombstoned||r.name===o))return u("Contributor name is current",void 0);let i=t(s);return a(i)?l(i.message):u("Contributor name recorded",void 0)};var Ne={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",DIFF:"Diff",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var H=e=>e.slice(-7).toUpperCase(),Na=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?H(e).includes(n):!0};var Re={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:re.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,o,r=!1)=>({id:e,title:t,rank:o,isDeleted:!1,props:{ref:H(e)},context:re.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:re.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:o,props:r={},childRenderAxis:s="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:re.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),fieldList:({id:e,name:t,parentNodeId:n,rank:o,childRenderAxis:r="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:re.FIELD_LIST,childRenderAxis:r,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{ref:H(e)},context:re.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!0,isVirtual:s=!0,disabled:i=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:i?{disabled:!0}:{},context:re.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:r,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:o,props:r={},readonly:s=!0,isVirtual:i=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:re.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};var js=(e,t,n)=>N.getNode(e)?j(`a node with id ${e} already exists`,n):t===e?j("a node cannot be its own parent",n):null,vg={"init.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=Re.workspace(t,n,o),s=$s(r);if(a(s))return Ra(s.message,e);let i=N.createNode(r);return a(i)?j(i.message??"Failed to initialize workspace",e):Hc(i.value)?u("Workspace initialized",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=js(t,void 0,e);if(r)return r;let s=N.createNode(Re.workspace(t,n,o));return a(s)?j(s.message??"Failed to add workspace",e):Hc(s.value)?u("Added workspace",{action:e.action,result:s.value}):l("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=js(t,o,e);if(s)return s;let i=N.createNode(Re.board(t,n,o,r));return a(i)?j(i.message??"Unable to create board",e):ro(i.value)?u("Added board",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=js(t,o,e);if(s)return s;let i=N.createNode(Re.swimlane(t,n,o,r));return a(i)?j(i.message??"Unable to create swimlane",e):vn(i.value)?u("Added swimlane",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=js(t,o,e);if(s)return s;let i=N.createNode(Re.ticket(t,n,o,r));return a(i)?j(i.message??"Unable to create issue",e):_(i.value)?u("Added issue",{action:e.action,result:i.value}):l("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:o,val:r,rank:s}=e.payload,i=js(t,o,e);if(i)return i;let c=N.createNode(Re.field({id:t,name:n,parentNodeId:o,rank:s,props:{value:r},childRenderAxis:n.includes(Ne.DESCRIPTION)?"vertical":"horizontal"}));return a(c)?j(c.message??`Unable to create field: ${n}`,e):at(c.value)?u("Added field",{action:e.action,result:c.value}):l("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!N.getNode(t))return j(`Unable to locate node with id ${t}`,e);let r=N.renameNode(t,n);return a(r)?j(r.message??"Unable to edit title",e):u("Edited title",{action:e.action,result:r.value})},"delete.node":e=>{let{id:t}=e.payload,n=N.tombstoneNode(t);return a(n)?j(n.message??"Unable to delete node",e):u("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,o=N.createTag({id:t,name:n});return a(o)?j(o.message??"Unable to create tag",e):u("Tag added",{action:e.action,result:o.value})},"tombstone.tag":e=>{let{id:t}=e.payload,n=N.tombstoneTag(t);return a(n)?j(n.message??"Unable to delete tag",e):u("Tag tombstoned",{action:e.action,result:n.value})},"restore.tag":e=>{let{id:t,name:n}=e.payload,o=N.restoreTag(t,n);return a(o)?j(o.message??"Unable to restore tag",e):u("Tag restored",{action:e.action,result:o.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,o=N.createContributor({id:t,name:n});return a(o)?j(o.message??"Unable to create contributor",e):u("Contributor created",{action:e.action,result:o.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,o=N.renameContributor(t,n);return a(o)?j(o.message??"Unable to rename contributor",e):u("Contributor renamed",{action:e.action,result:o.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=N.tombstoneContributor(t);return a(n)?j(n.message??"Unable to remove contributor",e):u("Contributor tombstoned",{action:e.action,result:n.value})},"restore.contributor":e=>{let{id:t,name:n}=e.payload,o=N.restoreContributor(t,n);return a(o)?j(o.message??"Unable to restore contributor",e):u("Contributor restored",{action:e.action,result:o.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=N.tag(t,n);return a(o)?j(o.message??"Unable to tag issue",e):u("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=N.untag(t,n);return a(o)?j(o.message??"Unable to untag issue",e):u("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,o=N.assign(t,n);return a(o)?j(o.message??"Unable to assign issue",e):u("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,o=N.unassign(t,n);return a(o)?j(o.message??"Unable to unassign issue",e):u("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:o}=e.payload,r=N.moveNodeToRank({id:t,parentId:n,rank:o});return a(r)?j(r.message??"Failed to move node",e):u("Moved node",{action:e.action,result:r.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,o=N.editValue(t,n);return a(o)?j(o.message??"Unable to edit description",e):u("Set node value",{action:e.action,result:o.value})},"close.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=N.getNode(t);if(!r)return j("Unable to locate issue",e);if(!_(r))return j("Can only close issues",e);let s=N.getNode(he);if(!s)return j("Unable to locate target swimlane",e);if(n!==s.id)return j("Close target must be closed swimlane",e);let i=N.moveNodeToRank({id:t,parentId:n,rank:o});return a(i)?j(i.message??"Unable to close issue",e):u("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=N.getNode(t);if(!r)return j("Unable to locate issue",e);if(!_(r))return j("Can only reopen issues",e);let s=N.getNode(he);if(!s)return j("Unable to locate closed swimlane",e);if(n===s.id)return j("Cannot reopen issue into closed swimlane",e);if(!N.getNode(n))return j("Reopen parent no longer exists",e);let c=N.moveNodeToRank({id:t,parentId:n,rank:o});return a(c)?j(c.message??"Unable to reopen issue",e):u("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=N.lockNode(t);return a(n)?j(n.message??"Unable to lock node",e):u("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[o,r]of Object.entries(n)){let s=N.getNode(o);if(!s)return j(`Unable to locate node ${o}`,e);if(s.parentNodeId!==t)return j(`Node ${o} is not child of ${t}`,e);let i=N.updateNode({...s,rank:r});if(a(i))return j(i.message??"Unable to rebalance child",e)}return u("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:o,md:r}=e.payload,s=N.createComment({id:t,issue:n,authorId:o,md:r,deleted:!1});return a(s)?j(s.message??"Unable to add comment",e):u("Comment added",{action:e.action,result:{id:t,issue:n,author:o,md:r}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:o}=e.payload,r=N.getComment(t);if(!r)return j("Unable to locate comment",e);if(r.issue!==n)return j("Comment does not belong to issue",e);let s=N.editComment(t,o);return a(s)?j(s.message??"Unable to edit comment",e):u("Comment edited",{action:e.action,result:{id:t,issue:n,md:o}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,o=N.getComment(t);if(!o)return j("Unable to locate comment",e);if(o.issue!==n)return j("Comment does not belong to issue",e);let r=N.deleteComment(t);return a(r)?j(r.message??"Unable to delete comment",e):u("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"add.issue.attachment":e=>{let{id:t,issue:n,hash:o,ext:r,name:s,bytes:i}=e.payload,c=N.createAttachment({id:t,issue:n,hash:o,ext:r,name:s,bytes:i,deleted:!1});return a(c)?j(c.message??"Unable to add attachment",e):u("Attachment added",{action:e.action,result:{id:t,issue:n,hash:o}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,o=N.getAttachment(t);if(!o)return j("Unable to locate attachment",e);if(o.issue!==n)return j("Attachment does not belong to issue",e);let r=N.deleteAttachment(t);return a(r)?j(r.message??"Unable to delete attachment",e):u("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.email":e=>{let{contributor:t,email:n}=e.payload;if(!no(n))return j(`not an email address: ${n}`,e);let o=N.linkContributorEmail({email:n,contributor:t,authorId:e.userId});return a(o)?j(o.message??"Unable to link email",e):u("Email linked to contributor",{action:e.action,result:o.value})},"unlink.contributor.email":e=>{let{contributor:t,email:n}=e.payload,o=N.unlinkContributorEmail(n,t,e.userId);return a(o)?j(o.message??"Unable to unlink email",e):u("Email unlinked from contributor",{action:e.action,result:o.value})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=N.linkUserId({contributorId:t,userId:e.userId});return a(n)?j(n.message??"Unable to link contributor",e):u("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};var bg=e=>{let t=N.getNode(e);if(!t||!_(t)||t.isDeleted)return null;let n=Eg(t);return a(n)?n:null},xg=e=>{if(!Ed())return null;for(let t of e){let n=bg(t);if(n)return n;let o=v().nodes[t]?.parentNodeId;if(!o)continue;let r=bg(o);if(r)return r}return null},JS=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},QS=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},Id=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 QS(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":case"link.contributor.email":case"unlink.contributor.email":default:return[]}},ZS=e=>{Oe(t=>({...t,eventLog:[...t.eventLog,e]}))},Hn=null,eR=e=>{for(let[t,n]of e.nodeLog){let o=N.getNode(t);o&&N.updateNode({...o,log:[...o.log??[],...n]})}return e.appLog.length>0&&Oe(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),xg([...e.virtualNodeIds])},Ig={isInitialized:()=>Rt(),batch:e=>Aa(e),afterApply(e,{batched:t,bypassLogging:n}){let o=[...new Set(Id(e))];if(t){Hn??={appLog:[],nodeLog:new Map,virtualNodeIds:new Set};for(let r of o){if(!n){let s=Hn.nodeLog.get(r);s?s.push(e):Hn.nodeLog.set(r,[e])}if(Ed()){Hn.virtualNodeIds.add(r);let s=v().nodes[r]?.parentNodeId;s&&Hn.virtualNodeIds.add(s)}}return n||Hn.appLog.push(e),null}return n||(o.forEach(r=>JS(r,e)),ZS(e)),xg(o)},flush(){if(!Hn)return null;let e=Hn;return Hn=null,eR(e)}};var pe=()=>{let{userName:e,userId:t}=V();return e?t?mc(t)?ji(e)?u("Successfully resolved actor ID",{userId:t,userName:e}):l("Invalid user name in config"):l("Invalid user ID in config"):l("User ID not configured"):l("User name not configured")};var tR={genesis:"init.workspace",actions:sd,readPayload:hg,apply:vg,replay:Ig,write:{readOnlyReason:()=>{let e=v();return e.readOnly?e.readOnlyReason??"Cannot change the board while time travelling":null},beforeWrite:yg}},nR=gg(tR),{materialize:Us,materializeAll:on,fromPersistedEvent:MF,decodeReconstructedEvents:PF,loadMergedEventsWithUnreadable:rn,loadEventActors:Sg,loadActorNames:co,loadMergedEvents:uo,loadMergedEventsBefore:wa,getEdgeRef:LF,advanceEdgeRef:kF,clearEdgeCache:DF,getSortedEvents:BF,loadEffectiveEventTimes:Ta,mintEventId:OF,persist:Rg,materializeAndPersist:FF,materializeAndPersistAll:B}=nR;var $o=e=>e.trim().toLocaleLowerCase(),Sd=(e,t)=>$o(e).includes($o(t));var oR=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},rR=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>{let o=t[n];return o?o.name:void 0}).filter(n=>!!n)},Cg=null,Ng=new Map,sR=()=>{let e=v().eventLog??[];if(e===Cg)return Ng;let t=new Map;for(let n of e){if(!n.userId)continue;let o=n.payload;for(let r of[o.id,o.issue]){if(typeof r!="string")continue;let s=t.get(r)??new Set;s.add(n.userId),t.set(r,s)}}return Cg=e,Ng=t,t},iR=e=>{let{contributors:t}=v(),n=sR().get(e.id);return n?[...n].map(o=>t[o]?.name).filter(o=>!!o):[]},Ag=(e,t)=>{let n=$o(t.value);if(!n)return!0;switch(t.target){case"title":return Sd(e.title??"",n);case"description":return Sd(e.props.description??"",n);case"tag":return oR(e).map($o).some(r=>r.includes(n));case"assignee":return rR(e).map($o).some(r=>r.includes(n));case"actor":return iR(e).map($o).some(r=>r.includes(n));case"ref":return Na(e.id,t.value);default:return!0}};var Rd=(e,t)=>e.rank<t.rank?-1:e.rank>t.rank?1:0,aR=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,wg=(e,t)=>Object.values(e).filter(n=>aR(n,t)).sort(Rd),Tg=(e,t)=>{let n={};for(let o of Object.values(e)){if(_(o)&&t.length>0&&!t.every(s=>Ag(o,s))||!o.parentNodeId||o.isDeleted)continue;let r=n[o.parentNodeId];r?r.push(o):n[o.parentNodeId]=[o]}for(let o of Object.keys(n))n[o].sort(Rd);return n},Mg=(e,t)=>{let n={};for(let o of Object.values(e)){if(!o.parentNodeId||o.isDeleted||!t.has(o.parentNodeId))continue;let r=n[o.parentNodeId];r?r.push(o):n[o.parentNodeId]=[o]}for(let o of Object.keys(n))n[o].sort(Rd);return n};var Pg=e=>Ma(be(e),{at:"end"}),Ma=(e,t={at:"end"})=>{let n=r=>a(r)?u("Rank space exhausted",{rank:"",needsRebalance:!0}):u("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(vt(void 0,void 0));let o=()=>n(vt(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let r=e[0];return r?n(vt(void 0,r.rank)):l("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(vt(r.rank,void 0)):l("Unable to resolve last sibling")}case"before":{let r=Lg(e,t.sibling),s=r<0?void 0:e[r];if(!s)return o();let i=r>0?e[r-1]:void 0;return n(vt(i?.rank,s.rank))}case"after":{let r=Lg(e,t.sibling),s=r<0?void 0:e[r];if(!s)return o();let i=r<e.length-1?e[r+1]:void 0;return n(vt(s.rank,i?.rank))}}},be=e=>{let t=v();if(!Dg()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return wg(t.nodes,e)},Lg=(e,t)=>e.findIndex(n=>n.id===t),kg=(e,t,n={at:"end"})=>Ma(be(t).filter(o=>o.id!==e),n),Cn=(e,t,n,o,r)=>{let s=kg(t,e,n);if(a(s))return s;if(!s.value.needsRebalance)return u("Resolved rank",s.value.rank);let i=id(e,o);if(a(i))return i;let c=B([i.value],r);if(a(c))return c;let d=kg(t,e,n);return a(d)?d:d.value.needsRebalance?l("Rank rebalance failed to create space"):u("Resolved rank after rebalance",d.value.rank)},Wn=(e,t,n)=>{let o=Pg(e);if(a(o))return o;if(!o.value.needsRebalance)return u("Resolved rank",o.value.rank);let r=id(e,t);if(a(r))return r;let s=B([r.value],n);if(a(s))return s;let i=Pg(e);return a(i)?i:i.value.needsRebalance?l("Rank rebalance failed to create space"):u("Resolved rank after rebalance",i.value.rank)};var Hs=5,$={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.contextNode,n=Math.max(0,e.selectedIndex),o=le(t.id),r=o[n];r&&(t.context==="FIELD"&&o.length===0||r.context==="COMMENT"||r.context==="TEXT"||$.navigate({contextNode:r,selectedIndex:le(r.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let o=le(n.id),r=o.findIndex(({id:i})=>i===e.id),s=o.length===0?-1:r>=0?r:0;$.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Bg(1),navigateToPreviousItem:()=>Bg(-1),jumpToNextItem:()=>Og(Hs),jumpToPreviousItem:()=>Og(-Hs),navigateToNextContainer:()=>Fg(1),navigateToPreviousContainer:()=>Fg(-1),navigate:({contextNode:e,selectedIndex:t})=>{T({contextNodeId:e.id,selectedIndex:t})}},Bg=e=>{let{selectedIndex:t,contextNode:n}=v(),o=le(n.id).length;if(o===0)return;let s=(Math.max(0,t)+e+o)%o;$.navigate({selectedIndex:s,contextNode:n})},Og=e=>{let{selectedIndex:t,contextNode:n}=v(),o=le(n.id).length;if(o===0)return;let r=Math.max(0,t),s=Math.min(Math.max(r+e,0),o-1);$.navigate({selectedIndex:s,contextNode:n})},Fg=e=>{let{contextNode:t,nodes:n,selectedIndex:o}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let r=n[t.parentNodeId];if(!r)return;let s=le(r.id),i=s.findIndex(g=>g.id===t.id);if(i<0)return;let c=s.at(i+e)??s.at(0);if(!c)return;let d=le(c.id),p=Math.max(0,d.length-1),m=Math.min(Math.max(0,o),p),f=d.length?m:-1;$.navigate({contextNode:c,selectedIndex:f})};var jg=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),$g=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},lR=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&at(t)&&t.childRenderAxis==="vertical"},Pa=(e,t)=>{let{nodes:n}=v(),o=n[e];if(!o||o.isDeleted)return!1;let r=be(o.id);return $.navigate({contextNode:o,selectedIndex:jg(t,r.length)}),!0},Ug=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let o=n.parentNodeId;if(!o)return Pa(n.id,0);let r=t[o];if(!r||r.isDeleted)return!1;let i=be(r.id).findIndex(c=>c.id===n.id);return i>=0?($.navigate({contextNode:r,selectedIndex:i}),!0):Ug(r.id)},_g=e=>{let{nodes:t}=v(),n=e,o=new Set;for(;n&&!o.has(n);){if(o.add(n),Ug(n))return!0;n=t[n]?.parentNodeId}return!1},cR=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},Hg=e=>{let{nodes:t,rootNodeId:n}=v();if(lR(e.contextNodeId)&&Pa(e.contextNodeId,e.selectedIndex))return u("Restored navigation inside text container",null);if(cR(e.selectedNodeId)&&e.selectedNodeId&&_g(e.selectedNodeId))return u("Restored navigation to selected node or ancestor",null);if(Pa(e.contextNodeId,e.selectedIndex))return u("Restored navigation to previous container",null);if(e.parentNodeId&&Pa(e.parentNodeId,e.selectedIndex))return u("Restored navigation to previous parent",null);if(_g(e.contextNodeId))return u("Restored navigation to previous container or ancestor",null);let o=t[n];if(!o||o.isDeleted)return l("Unable to restore navigation");let r=be(o.id);return $.navigate({contextNode:o,selectedIndex:jg(e.selectedIndex,r.length)}),u("Restored navigation to root",null)};import{monotonicFactory as dR,ulid as Nn}from"ulid";var Ws=dR();function uR(){let e=de();if(a(e))return l("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return l("No workspace found in event log");let[o]=le(n.id),[r]=o?le(o.id):[];if(r){let s=t.renderedChildrenIndex?.[r.id]??[];return u("Resolved boot nav target",{contextNode:r,selectedIndex:s.length>0?0:-1})}else return o?u("Resolved boot nav target",{contextNode:o,selectedIndex:0}):u("Resolved boot nav target",{contextNode:n,selectedIndex:0})}function mR(){let e=uR();return a(e)?e:$.navigate(e.value)}function Wg({userId:e,userName:t}){let n=Ws(),o=Ws(),r=Ws(),s=Ws(),i=Ws(),c=vt(void 0,void 0);if(a(c))return c;let d=vt(void 0,void 0);if(a(d))return d;let p=vt(d.value,void 0);if(a(p))return p;let m=vt(void 0,void 0);if(a(m))return m;let f=vt(m.value,void 0);if(a(f))return f;let g=vt(f.value,void 0);if(a(g))return g;let h=vt(void 0,void 0);return a(h)?h:u("Created default events",[{id:Nn(),userId:e,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:Nn(),userId:e,action:"create.contributor",payload:{id:e,name:t}},{id:Nn(),userId:e,action:"add.board",payload:{id:o,name:"Default",parent:n,rank:d.value}},{id:Nn(),userId:e,action:"add.swimlane",payload:{id:r,name:"Todo",parent:o,rank:m.value}},{id:Nn(),userId:e,action:"add.swimlane",payload:{id:s,name:"In progress",parent:o,rank:f.value}},{id:Nn(),userId:e,action:"add.swimlane",payload:{id:i,name:"Done",parent:o,rank:g.value}},{id:Nn(),userId:e,action:"add.board",payload:{id:ia,name:"Closed",parent:n,rank:p.value}},{id:Nn(),userId:e,action:"add.swimlane",payload:{id:he,name:"Closed",parent:ia,rank:h.value}},{id:Nn(),userId:e,action:"lock.node",payload:{id:ia}},{id:Nn(),userId:e,action:"lock.node",payload:{id:he}}])}var pR=()=>{let e=de();if(a(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},fR=e=>{if(e.length===0)return;let t=e.filter(o=>o.reason==="corrupt-line"||o.reason==="invalid-payload"),n=e.filter(o=>o.reason==="unsupported-schema-version"||o.reason==="unknown-action");if(n.length>0){let o=[...new Set(n.map(r=>r.detail))].join(", ");ee.info(`This build cannot read ${n.length} event(s) in the log (${o}). They are skipped, so anything they changed may be out of date until you upgrade.`)}if(t.length>0){let o=[...new Set(t.map(r=>r.detail))].join(", ");ee.info(`Skipped ${t.length} corrupt line(s) in the event log (${o}). The rest of the board loaded normally; those events are unrecoverable.`)}};function sn(e,t=[]){if(pR())return u("Skipped boot while checked out at a historical point",null);if(!e.length){let s=Re.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=$s(s);return a(i)?i:(T({hasProjectDefinition:!1,mode:I.DEFAULT}),u("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return l("Initialized Epiq project has no workspace init event");let n=on(e),{fatal:o,skipped:r}=Sn(n);return o.length>0?l(`Materializing failed:
|
|
35
|
+
${o.map(s=>s.message).join(`
|
|
36
|
+
`)}`):(Rn(r),mR(),T({hasProjectDefinition:!0}),fR(t),u("State booted successfully",null))}import{WebSocket as gR}from"ws";var La=new Set,Gg=e=>{La.add(e),e.on("close",()=>{La.delete(e)}),e.on("error",()=>{La.delete(e)})},Uo=e=>{let t=JSON.stringify(e);for(let n of La)n.readyState===gR.OPEN&&n.send(t)};var ka=e=>{Rt()&&(T({syncStatus:e}),Uo({type:"sync-status",payload:e}))},Mr=(e="Syncing...")=>{ka({status:"syncing",msg:e})},Ho=(e="Synced")=>{ka({status:"synced",msg:e})},Cd=e=>{ka({status:"failed",msg:e})},Da=e=>{ka({status:"offline",msg:e})},We=e=>(Cd(e),l(e));var an=(e,t)=>(logger.error(`[boot:${e}] ${t}`),l(`[boot:${e}] ${t}`)),Pr=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)}},ge=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t);import uh from"node:fs";import Gn from"node:fs";import Vn from"node:path";import Ba from"node:fs";import Vg from"node:path";var dt=".epiq/project.json",zg=e=>Vg.join(e,dt),hR=e=>{if(!Ba.existsSync(zg(e)))return u("State branch carries no identity yet",null);let t=Mt(e);return a(t)?l(`On the state branch: ${t.message}`):u("Read the state branch identity",t.value)},Nd=(e,t)=>{try{let n=zg(e);return Ba.mkdirSync(Vg.dirname(n),{recursive:!0}),Ba.writeFileSync(n,JSON.stringify(t,null,2)+`
|
|
37
|
+
`,"utf8"),u("Wrote the state branch identity",void 0)}catch(n){return l(n instanceof Error?`Failed to write the state branch identity: ${n.message}`:"Failed to write the state branch identity")}},yR=({checkout:e,branch:t,stateBranch:n})=>[`This checkout's ${dt} names project ${e.projectId}`,`(created ${e.createdAt}), but the state branch ${n}`,`belongs to project ${t.projectId} (created ${t.createdAt}).`,"","The branch holds the board, so its id is the one that counts. Point the","checkout at it and commit the change:","",` git show ${n}:${dt} > ${dt}`,"","A second id is minted when init runs in a checkout that has no","project file while the state branch already exists; nothing on the","board is lost by it, but every checkout has to agree on one."].join(`
|
|
38
|
+
`);var Kg=({repoRoot:e,stateBranchRoot:t,stateBranch:n})=>{if(!Ba.existsSync(pr(e)))return u("No project file to compare","no-checkout-file");let o=Mt(e);if(a(o))return l(o.message);let r=hR(t);if(a(r))return l(r.message);if(r.value===null){let s=Nd(t,o.value);return a(s)?l(s.message):u("Stamped the state branch with this project","stamped")}return r.value.projectId!==o.value.projectId?l(yR({checkout:o.value,branch:r.value,stateBranch:n})):u("The checkout and the state branch agree","matched")};import An from"node:fs";import Gs from"node:path";var Lr=e=>e.split(`
|
|
39
|
+
`).filter(t=>t.trim().length>0),qg=e=>{let t=Gs.join(e,gt,Fn);try{if(!An.existsSync(t))return u("No events directory",[]);let n=An.readdirSync(t).filter(o=>o.endsWith(".jsonl")).filter(o=>Lr(An.readFileSync(Gs.join(t,o),"utf8")).length>0);return u("Looked for stranded event logs",n)}catch(n){return l(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},Yg=e=>Gs.join(e,gt,Fn),Xg=e=>{let t=Yg(e),n=new Map;try{if(!An.existsSync(t))return n;for(let o of An.readdirSync(t))if(o.endsWith(".jsonl")&&!jo(o))try{n.set(o,Lr(An.readFileSync(Gs.join(t,o),"utf8")))}catch(r){if(!Bs(r))throw r}}catch{return n}return n},vR=e=>{try{let t=JSON.parse(e);return typeof t=="object"&&t!==null}catch{return!1}},Jg=(e,t)=>{if(t.size===0)return[];let n=Yg(e),o=[];for(let[r,s]of t){if(s.length===0)continue;let i=Gs.join(n,r);try{let c=An.existsSync(i)?An.readFileSync(i,"utf8"):null,d=new Set(c===null?[]:Lr(c)),p=s.filter(f=>!d.has(f)).filter(vR);if(p.length===0)continue;An.mkdirSync(n,{recursive:!0});let m=c!==null&&c.length>0&&!c.endsWith(`
|
|
40
40
|
`);An.appendFileSync(i,`${m?`
|
|
41
41
|
`:""}${p.join(`
|
|
42
42
|
`)}
|
|
43
|
-
`,"utf8"),
|
|
44
|
-
`),
|
|
45
|
-
`));ee.info("Creating initial commit");let
|
|
46
|
-
${n.message}`);let
|
|
47
|
-
${
|
|
48
|
-
`+n.message);if(n.value)return u("Local state branch already exists",!1);let
|
|
49
|
-
`+
|
|
50
|
-
`+s.message);let i=s.value;if(
|
|
43
|
+
`,"utf8"),o.push(`${r} (${p.length})`)}catch{continue}}return o},bR=(e,t)=>{let n=new Set(Lr(t));return Lr(e).filter(o=>!n.has(o))},xR=(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(`
|
|
44
|
+
`),Qg=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let o=await Le({args:["show",`HEAD:${t}`],cwd:e});if(o.exitCode!==0)return u("No committed log to compare against",void 0);let r=bR(o.stdout,n);return r.length>0?l(xR(t,r,Lr(o.stdout).length)):u("Event log only grew",void 0)};var IR="[epiq:init-repo]",eh=async e=>{let t=await Le({args:["rev-parse","--verify","--quiet","HEAD"],cwd:e});if(t.exitCode===0)return u("Initial commit already exists",!1);if(!(t.exitCode===1&&t.stdout.trim()===""&&t.stderr.trim()===""))return l(["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(`
|
|
45
|
+
`));ee.info("Creating initial commit");let o=await U({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(a(o))return l(o.message);let r=await U({args:["commit-tree",o.value.stdout.trim(),"-m",IR],cwd:e});if(a(r))return l(r.message);let s=await U({args:["update-ref","HEAD",r.value.stdout.trim()],cwd:e});return a(s)?l(s.message):u("Created initial commit",!0)},Zg=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",ER=async e=>{let t=await Vi(e);if(a(t))return l(t.message);let n=await Um(e);return a(n)?l(n.message):u("Built sync commit message",`[sync|branch:${Zg(t.value)}:sha:${Zg(n.value)}]`)},Ad=async({repoRoot:e,stateBranchName:t})=>{ee.info(`Creating ${t}`);let n=await U({args:["commit-tree",Qm,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return l(`Failed to create state branch commit
|
|
46
|
+
${n.message}`);let o=n.value.stdout.trim(),r=await U({args:["update-ref",`refs/heads/${t}`,o],cwd:e});return a(r)?l(`Failed to create ${t}
|
|
47
|
+
${r.message}`):u("Created state branch",!0)},Vs=async({repoRoot:e,stateBranchName:t})=>{let n=await Gi({repoRoot:e,branch:t});if(a(n))return l(`Ensure local state branch failed
|
|
48
|
+
`+n.message);if(n.value)return u("Local state branch already exists",!1);let o=await On({repoRoot:e});if(a(o))return l(`Ensure local state branch failed
|
|
49
|
+
`+o.message);let r=o.value,s=r?await cs({repoRoot:e,branch:t}):u("No remote, no remote state branch",!1);if(a(s))return l(`Ensure local state branch failed
|
|
50
|
+
`+s.message);let i=s.value;if(r&&i){let c=await Ce.fetch({cwd:e,remote:Pt,branch:t});if(a(c))return l(`Failed to fetch ${t} from remote
|
|
51
51
|
${c.message}`)}if(i){let c=await U({args:["branch","--track",t,`${Pt}/${t}`],cwd:e});return a(c)?l(`Failed to create local ${t} from remote
|
|
52
|
-
${c.message}`):u("Created local state branch from remote",!0)}return Ad({repoRoot:e,stateBranchName:t})},
|
|
53
|
-
`),
|
|
54
|
-
`+
|
|
55
|
-
`));ee.info("Removing broken state branch worktree path"),
|
|
56
|
-
${
|
|
57
|
-
`));if(s&&s!==
|
|
52
|
+
${c.message}`):u("Created local state branch from remote",!0)}return Ad({repoRoot:e,stateBranchName:t})},SR=async({repoRoot:e,branch:t})=>{let n=await U({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return l(n.message);let o=n.value.stdout.split(`
|
|
53
|
+
`),r=null;for(let s of o){if(s.startsWith("worktree ")){r=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&r)return u("Found worktree for branch",r)}return u("No worktree found for branch",null)},RR=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=ms(Vn.dirname(t));if(a(o))return l(`Failed to create state branch worktree
|
|
54
|
+
`+o.message);if(Gn.existsSync(t)&&!Gn.existsSync(Vn.join(t,".git"))){let s=qg(t);if(a(s))return l(s.message);if(s.value.length>0)return l([`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(`
|
|
55
|
+
`));ee.info("Removing broken state branch worktree path"),np(t)}ee.info("Creating state branch worktree");let r=await Ce.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(r)?l(`Failed to create state branch worktree
|
|
56
|
+
${r.message}`):u("Created state branch worktree",!0)},mo=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await NR({repoRoot:e,stateBranchRoot:t,stateBranchName:n});if(a(o))return o;let r=Kg({repoRoot:e,stateBranchRoot:t,stateBranch:n});return a(r)?l(r.message):(r.value==="stamped"&&ee.info("Stamped the state branch with this project\u2019s identity"),o)},CR=(e,t)=>{let n=fr(Lo());return Vn.dirname(e)===n&&Vn.dirname(t)===n},NR=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await SR({repoRoot:e,branch:n});if(a(o))return l(o.message);let r=fr(t),s=o.value?fr(o.value):null;if(s&&s===r&&Gn.existsSync(s))return u("State branch already checked out in expected worktree",!1);if(s&&s!==r&&CR(s,r))return l([`The state branch ${n} is checked out under project ${Vn.basename(s)}, but this checkout names project ${Vn.basename(r)}.`,"","Two ids for one branch means a checkout minted a second identity for","a board that already existed. Nothing on the board is lost by it, but",`every checkout has to agree on one: compare ${dt} here`,`with \`git show ${n}:${dt}\`, and keep the branch's.`].join(`
|
|
57
|
+
`));if(s&&s!==r){let d=await Km(s);if(a(d))return l(d.message);if(d.value||Qf(s))return l([`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 ${r}, 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(`
|
|
58
58
|
`));ee.info("Moving state branch worktree to expected location");let p=await Ce.worktreeRemove({cwd:e,worktreeRoot:s});if(a(p))return l(`Failed to remove existing state branch worktree
|
|
59
59
|
${p.message}`)}if(s&&!Gn.existsSync(s)){ee.info("Pruning stale state branch worktree");let d=await Ce.worktreePrune({cwd:e});if(a(d))return l(`Failed to prune stale worktrees
|
|
60
|
-
${d.message}`)}let i=await
|
|
61
|
-
${d.message}`)}return
|
|
62
|
-
${
|
|
60
|
+
${d.message}`)}let i=await $m({repoRoot:e,worktreeRoot:t});if(a(i))return l(i.message);let c=Gn.existsSync(t);if(i.value&&c)return u("State branch worktree already exists",!1);if(i.value&&!c){ee.info("Pruning missing registered state branch worktree");let d=await Ce.worktreePrune({cwd:e});if(a(d))return l(`Failed to prune stale worktrees
|
|
61
|
+
${d.message}`)}return RR({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},AR=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Vi(e);if(a(n))return l(n.message);if(n.value===t)return u("State branch already checked out",!1);(await Le({cwd:e,args:["rebase","--abort"]})).exitCode===0&&ee.info("Aborted stale state branch rebase");let r=await Ce.checkout({cwd:e,branch:t});return a(r)?l(`Failed to checkout ${t}
|
|
62
|
+
${r.message}`):u("Checked out state branch",!0)},wR=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Rc(t);if(a(n))return l(n.message);if(n.value)return u("State branch upstream already configured",!1);let o=await On({repoRoot:t});if(a(o))return l(o.message);if(!o.value)return u("No remote available for state branch upstream",!1);let r=ke(e);if(a(r))return r;let s=r.value,i=await cs({repoRoot:t,branch:s});if(a(i))return l(i.message);if(!i.value)return u("Remote state branch missing; upstream will be configured on first push",!1);ee.info(`Configuring ${s} upstream`);let c=await Ce.fetch({cwd:t,remote:Pt,branch:s});if(a(c))return l(`Failed to fetch ${s}
|
|
63
63
|
${c.message}`);let d=await Ce.setUpstream({cwd:t,branch:s,upstream:`${Pt}/${s}`});return a(d)?l(`Failed to set state branch upstream
|
|
64
|
-
${d.message}`):u("Configured state branch upstream",!0)},
|
|
65
|
-
${s.message}`):u("Staged state branch event file",n)},
|
|
66
|
-
${
|
|
67
|
-
${n.message}`):u("Staged event log config",t)},
|
|
68
|
-
`+
|
|
69
|
-
${s.message}`);let i=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return u(i?"Pushed state branch":"Remote already up to date",i)},rh=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=ke(e);if(a(o))return o;let s=o.value,i=[ps(),await Gs({repoRoot:e,stateBranchName:s}),await ur({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await NR({stateBranchRoot:t,stateBranchName:s}),await sp(t),n?await AR({stateBranchRoot:t,repoRoot:e}):u("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(a(c))return l(c.message);r=r||!!c.value}return u(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import Hr from"node:fs";import Td from"node:os";import ih from"node:path";var _a="epiq-sync.lock",oh=600*1e3,TR=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}},wR=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},ah=e=>e?e.hostname!==Td.hostname()||wR(e.pid)?Date.now()-e.startedAt>oh?"stale":null:"dead":"stale",MR=e=>{let t=ih.join(e,_a);return Hr.existsSync(t)?ah(Fa(t))===null:!1},Oa=new Map,PR=e=>{let t=Oa.get(e);if(t)return t;let n=ls(e).then(r=>a(r)?null:r.value,()=>null);return Oa.set(e,n),n.then(r=>{r===null&&Oa.get(e)===n&&Oa.delete(e)}),n},ja=async e=>{let t=await PR(e);return t!==null&&MR(t)},lh=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Fa=e=>{try{return TR(Hr.readFileSync(e,"utf8"))}catch{return null}},sh=(e,t)=>{let n={pid:process.pid,hostname:Td.hostname(),startedAt:Date.now(),operation:t},r=`${e}.${process.pid}.pending.lock`;try{return Hr.writeFileSync(r,JSON.stringify(n)),Hr.linkSync(r,e),!0}catch{return!1}finally{try{Hr.rmSync(r,{force:!0})}catch{}}},LR=async({worktreeRoot:e,operation:t})=>{let n=await ls(e);if(a(n))return l(n.message);let r=ih.join(n.value,_a),o=()=>{try{let d=Fa(r);d&&d.pid===process.pid&&Hr.rmSync(r)}catch{}};if(sh(r,t))return u("Acquired sync lock",{acquired:!0,claim:"clean",release:o});let s=Fa(r),i=ah(s);if(i===null)return u("Sync lock is held",{acquired:!1,heldBy:s});ee.info(`Breaking an abandoned sync lock: ${s?lh(s):"unreadable lock file"}`);try{Hr.rmSync(r,{force:!0})}catch{}if(sh(r,t))return u("Acquired sync lock after breaking a stale one",{acquired:!0,claim:i,release:o});let c=Fa(r);return u("Sync lock taken by another process",{acquired:!1,heldBy:c??{pid:-1,hostname:Td.hostname(),startedAt:Date.now(),operation:"unknown"}})},zs=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await LR({worktreeRoot:e,operation:t});if(a(r))return l(r.message);if(!r.value.acquired)return ee.info(`Skipping ${t}: the state worktree is held by ${lh(r.value.heldBy)}`),u("State worktree is held by another process",null);let{claim:o,release:s}=r.value;try{return u("Ran under the sync lock",await n(o))}finally{s()}};var kR=async({claim:e,cwd:t,ensureUpstream:n})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:t,ensureUpstream:n});let r=ge("getRepoRootDir",await Qt(t));if(a(r))return l(r.message);let o=r.value;logger.debug("[sync] repo root",o);let s=ge("getStateBranchRoot",me({repoRoot:o}));if(a(s))return l(s.message);let i=s.value;if(logger.debug("[sync] state branch root",i),e!=="stale"&&dh.existsSync(i)){let m=await Vm(i,{preserve:[_a]});if(a(m))return l(m.message);m.value.length>0&&logger.info("[sync] cleared git lock files left by a dead process",{removed:m.value,stateBranchRoot:i});let f=ke(o);if(a(f))return l(f.message);let g=await zm(i,f.value);if(a(g))return l(g.message);g.value&&logger.info("[sync] cleared a ref lock left by a dead process",{branch:f.value,stateBranchRoot:i});let h=ge("abortRebaseIfPresent(stateBranchRoot)",await Sc(i));if(a(h))return l(h.message)}logger.debug("[sync] bootstrapping state branch storage",{repoRoot:o,stateBranchRoot:i,ensureUpstream:n});let c=ge("bootstrapStateBranchStorage",await rh({repoRoot:o,stateBranchRoot:i,ensureUpstream:n}));if(a(c))return l(c.message);logger.debug("[sync] bootstrap result",{bootstrapped:c.value,stateBranchRoot:i}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:i});let d=ge("getInProgressGitOperation(stateBranchRoot)",await Ic(i));if(a(d))return l(d.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:d.value}),d.value!==null)return logger.info("[sync] state branch git operation in progress",{claim:e}),l(`Cannot sync while there is a ${d.value} in the state branch at ${i}`);logger.debug("[sync] ensuring state branch layout",{repoRoot:o,stateBranchRoot:i});let p=ge("ensureStateBranchLayout",op(o,i));return a(p)?l(p.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:o,stateBranchRoot:i,bootstrapped:c.value}),u("Sync preconditions satisfied",{repoRoot:o,stateBranchRoot:i,bootstrapped:c.value}))},DR=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=[];for(let p of dg(St(t),n)){let m=ge("stageStateBranchOwnEventFile",await Ba({stateBranchRoot:t,eventFileName:p}));if(a(m))return l(m.message);r.push(m.value)}let o=ge("stageStateBranchMediaFiles",await eh({stateBranchRoot:t}));if(a(o))return l(o.message);let s=ge("stageStateBranchEventConfig",await th({stateBranchRoot:t}));if(a(s))return l(s.message);let i=[...r,o.value,...s.value].filter(p=>p!==null);if(i.length===0)return u("Nothing to stage",{createdCommit:!1});let c=ge("hasStagedChanges(after stage)",await Ym(t,i));if(a(c))return l(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"),u("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let d=ge("createStateBranchSyncCommit",await nh({repoRoot:e,stateBranchRoot:t,pathspec:i}));return a(d)?l(d.message):(logger.debug("[sync] created sync commit",d.value),u("Committed own event file",{createdCommit:!0,commitSha:d.value}))},wd=(e,t="offline")=>{let n=e.createdCommit?`Committed locally, ${t}`:t==="offline"?"Offline":"No remote";return ka(n),u(n,{...e,pulled:!1,pushed:!1,offline:!0})},ch=async({cwd:e=process.cwd(),ownEventFileName:t},n)=>{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}),l("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}),l("Own event file must end with .jsonl");Mo();let r=ge("ensureSyncReady",await kR({claim:n,cwd:e,ensureUpstream:!0}));if(a(r))return We(r.message);let{repoRoot:o,stateBranchRoot:s,bootstrapped:i}=r.value,c=ge("isDetachedHead(stateBranchRoot)",await Xm(s));if(a(c))return We(c.message);if(logger.debug("[sync] detached state branch check result",{detached:c.value}),c.value)return We("Cannot run :sync while the state branch is in detached HEAD state");let d=!1,p,m=!1,f=!1,g=ge("getStateBranch",ke(o));if(a(g))return We(g.message);let h=g.value;logger.debug("[sync] resolved state branch",{stateBranch:h,stateBranchRoot:s});let x=ge("flushPendingLogs",ba(s,t));a(x)&&logger.error(`[sync] ${x.message}`);let b=ge("commitOwnEventFileToStateBranch",await DR({repoRoot:o,stateBranchRoot:s,ownEventFileName:t}));if(a(b))return We(b.message);d=b.value.createdCommit,p=b.value.commitSha;let R=ge("hasRemote",await On({repoRoot:s}));if(a(R))return We(R.message);if(!R.value)return wd({repoRoot:o,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i},"no remote");let S=ge("pullBranchRebaseIfPresent",await us({cwd:s,branch:h}));if(a(S))return ds(S.message)?wd({repoRoot:o,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i}):We(S.message);m=S.value;let A=ge("isAheadOfUpstream",await Km(s));if(a(A))return We(A.message);if(d||i||A.value){logger.info("[sync] pushing state branch",{createdCommit:d,bootstrapped:i,stateBranchRoot:s});let T=ge("pushStateBranch",await Vs({stateBranchRoot:s,repoRoot:o}));if(a(T)&&Wm(T.message)){let P=ge("pullBranchRebaseIfPresent(retry)",await us({cwd:s,branch:h}));if(a(P))return We(P.message);m=m||P.value,T=ge("pushStateBranch(retry)",await Vs({stateBranchRoot:s,repoRoot:o}))}if(a(T))return ds(T.message)?wd({repoRoot:o,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i}):We(T.message);f=T.value}if(d){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:s});let T=ge("git rev-parse HEAD",await U({args:["rev-parse","HEAD"],cwd:s}));if(a(T))return We(T.message);p=T.value.stdout.trim(),logger.debug("[sync] final sync commit sha",p)}return Ur(f?"Synced and pushed":m||d?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),u("Synced event logs with state branch",{repoRoot:o,stateBranchRoot:s,createdCommit:d,commitSha:p,pulled:m,pushed:f,bootstrapped:i,offline:!1})},$a=async(e,t)=>{let n=Yg(e);try{return await t()}finally{let r=Xg(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},Ua=async e=>{let t=e.cwd??process.cwd(),n=await Qt(t);if(a(n))return We(n.message);let r=me({repoRoot:n.value});if(a(r))return We(r.message);let o=r.value;if(!dh.existsSync(o))return ch(e,"clean");let s=await zs({worktreeRoot:o,operation:"sync",fn:i=>$a(o,()=>ch(e,i))});return a(s)?We(s.message):s.value===null?u("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 ko=null,Ha=async()=>(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!ko,currentStatus:v().syncStatus?.status,currentMessage:v().syncStatus?.msg}),ko?(logger.debug("[sync] syncAndReloadState joining existing promise"),ko):(logger.debug("[sync] syncAndReloadState creating promise"),ko=BR().finally(()=>{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:v().syncStatus?.status,statusMessageBeforeClear:v().syncStatus?.msg}),ko=null}),ko)),BR=async()=>{let e;try{e=await OR(),logger.debug("[sync] syncAndReloadState promise resolved",{success:!a(e),message:e.message,statusAfterResolve:v().syncStatus?.status,statusMessageAfterResolve:v().syncStatus?.msg})}catch(n){let r=n instanceof Error?n.message:String(n);logger.error("[sync] syncAndReloadState promise threw",{message:r,error:n}),e=l(r)}let t=de();return a(e)&&!a(t)&&t.value.syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),w({syncStatus:{msg:e.message,status:"failed"}})),e},OR=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:v().mode,syncStatus:v().syncStatus});let e=uh();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:v().mode,message:e.message,syncStatus:v().syncStatus}),e;logger.debug("[sync] syncAndReloadState:start");let t=ge("resolveActorId",pe());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:a(t)?t.message:"Missing actor id"}),l("Unable to resolve event log path");w({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:v().syncStatus});let n=ar(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let r=ge("syncEpiqWithRemote",await Ua({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!a(r),message:(a(r),r.message)}),a(r))return logger.error("[sync] syncAndReloadState:sync failed",r.message),w({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:v().syncStatus}),We(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o,offline:s}=r.value,i=Ks(o);return a(i)?i:(w({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:v().syncStatus}),u("Synced",!0))},Ks=e=>{logger.debug("[sync] loading merged events after sync",{stateBranchRoot:e});let t=et(e),n=ge("loadMergedEvents",rn(e));if(logger.debug("[sync] loadMergedEvents:result",{success:!a(n),message:(a(n),n.message),count:a(n)?void 0:n.value.events.length}),a(n))return w({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:v().syncStatus}),l(`Unable to load events. ${n.message}`);logger.debug("[sync] loaded merged events after sync",{count:n.value.events.length});let r=uh();if(r)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:v().mode,message:r.message,syncStatus:v().syncStatus}),r;let o=jg(),s=v().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:o,selectedNodeId:v().selectedNode?.id,contextNodeId:v().contextNode?.id,selectedNodeIsVirtual:v().selectedNode?.isVirtual,contextNodeIsVirtual:v().contextNode?.isVirtual}),!v().selectedNode?.isVirtual&&!v().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:n.value.events.length});let c=de(),d=!a(c)&&c.value.timeMode==="live",p=ge("bootStateFromEventLog",on(n.value.events,n.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!a(p),message:(a(p),p.message)}),a(p))return w({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:v().syncStatus}),l(`Unable to boot synced state. ${p.message}`);d&&To(e,t)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:v().selectedNode?.isVirtual,contextNodeIsVirtual:v().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),w({filters:s}),logger.debug("[sync] restoreNavigationAnchor:start");let i=ge("restoreNavigationAnchor",Ug(o));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!a(i),message:a(i)?i.message:"Navigation restored",selectedNodeId:v().selectedNode?.id,contextNodeId:v().contextNode?.id}),a(i)?(w({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:v().syncStatus}),i):u("Reloaded state from event log",null)},uh=()=>v().mode===I.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:v().mode,syncStatus:v().syncStatus}),w({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),l("Will not re-materialize if not in default mode, to not lose edit data"));var mh=0,Md,Pd=!1,qs=!1,Ld=()=>{if(Pd)return!0;let e=de();return a(e)?!1:e.value.syncStatus.status==="syncing"},FR=()=>{let e=mo(V().autoSyncIntervalMs),t=Date.now()-mh;return Math.max(0,e-t)},ph=()=>{Md||(Md=setTimeout(async()=>{if(Md=void 0,!!Rt()){if(Ld()){qs=!0;return}qs=!1,await _R()}},FR()))},_R=async()=>{if(v().readOnly||v().timeMode==="peek"||v().timeMode==="replay")return l("Cannot auto-sync while peeking");if(!Rt())return l("Cannot auto-sync before state is initialized");if(Ld())return qs=!0,l("Sync already in progress");Pd=!0,mh=Date.now(),w({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Ha()}finally{Pd=!1,qs&&ph()}},Wa=()=>{Rt()&&(qs=!0,!Ld()&&ph())};var Ga=e=>{let{context:t}=v().contextNode;if(!t)return G.None;switch(e){case C.EXIT:return G.Exit;case C.EXPORT:return G.Export;case C.INIT:return G.Init;case C.OPEN:return G.OpenProject;case C.DELETE:return G.Delete;case C.EDIT:return G.Edit;case C.COMMENT:return G.Comment;case C.HELP:return G.ViewHelp;case C.RE_OPEN_ISSUE:return G.ReopenIssue;case C.CLOSE_ISSUE:return G.CloseIssue;case C.TAG:return G.TagTicket;case C.UNTAG:return G.UntagTicket;case C.ASSIGN:return G.AssignUserToTicket;case C.UNASSIGN:return G.UnassignUserFromTicket;case C.NEW:return G.NewItem;case C.FILTER:return G.Filter;case C.MOVE:return G.Move;case C.PEEK:return G.Peek;case C.REPLAY:return G.Replay;case C.CONFIG:return G.Config;case C.YANK:return G.Yank;case C.SYNC:return G.Sync;default:return G.None}},G={Exit:"exit",Init:"init",OpenProject:"open-project",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Replay:"replay",Yank:"yank",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export"};import Ny from"node:fs";import wN from"node:path";import MN from"react";import{Box as AN}from"ink";import al from"react";import nC from"chalk";import{Box as Bd,Text as rC}from"ink";import Tn from"react";import{Text as fh}from"ink";import gh,{useEffect as hh,useState as jR}from"react";var yh={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "],identity:["\u276F "]},Ct=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=ne(),r=yh[n]??yh.default,[o,s]=jR(0);if(hh(()=>{s(0)},[r]),hh(()=>{if(!e)return;let c=setInterval(()=>{s(d=>(d+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return gh.createElement(fh,null,t);let i=r[o]??r[0]??t;return gh.createElement(fh,{color:y.accent,dimColor:o===1},i)};import{Box as kd,Text as $R}from"ink";import Va from"react";var UR=(e,t,n,r)=>{let o=d=>Math.max(1,e[d]??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}},ut=({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)),d=Math.max(0,Math.min(n,e.length-1)),p=Math.max(1,Math.floor(i/c)),m=Math.max(0,e.length-p),{start:f,end:g}=o?UR(o,e.length,d,i):s?{start:Math.min(m,Math.max(0,d-p+1)),end:Math.min(m,Math.max(0,d-p+1))+p}:{start:Math.min(m,Math.floor(d/p)*p),end:Math.min(m,Math.floor(d/p)*p)+p},h=Math.max(1,g-f),x=e.slice(f,g),b=e.length>h,R=i,S=b?Math.max(1,Math.floor(h/e.length*R)):R,A=Math.max(0,R-S),T=Math.max(1,e.length-h),P=b?Math.floor(f/T*A):0;return Va.createElement(kd,{flexDirection:"row",height:i,width:"100%"},Va.createElement(kd,{flexDirection:"column",flexGrow:1,height:i},x),Va.createElement(kd,{flexDirection:"column",width:1,height:R},Array.from({length:R}).map((M,O)=>Va.createElement($R,{key:O,color:b&&O>=P&&O<P+S?y.accent:y.secondary},b?"\u2502":" "))))};import{Box as Oo,Text as Fo}from"ink";import Nt from"react";var vh,Dd,HR=()=>{let{eventLog:e=[]}=v();if(Dd&&vh===e)return Dd;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return vh=e,Dd=t,t},za=e=>HR().has(e);import{Text as WR}from"ink";import GR from"react";var mr=({id:e,isSelected:t,maxWidth:n})=>{let r=N.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:_n(o,n);return GR.createElement(WR,{underline:t,color:ze(o)},"@"+s,za(e)?"":"\u2197")};import{Text as VR}from"ink";import zR from"react";var Do=({id:e,isSelected:t,maxWidth:n})=>{let r=N.getTag(e);if(!r)return;let o=n===void 0?r.name:_n(r.name,n);return zR.createElement(VR,{underline:t,backgroundColor:ze(r.name),color:y.secondary}," "+o+" ")};import{useEffect as KR,useState as qR}from"react";var YR=80,bh=1400,Ka=new Set,Ys=null,XR=e=>(Ka.add(e),Ys||(Ys=setInterval(()=>{for(let t of Ka)t()},YR)),()=>{Ka.delete(e),Ka.size===0&&Ys&&(clearInterval(Ys),Ys=null)}),JR=()=>{let e=Date.now()%bh/bh;return e<.5?e*2:(1-e)*2},Bo=e=>{let[,t]=qR(0);return KR(()=>{if(e)return XR(()=>t(n=>n+1))},[e]),Yi(JR())};var QR=(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),_n(e.slice(o).trim(),n)]},xh=3,ZR=2,eC=(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}},Ih=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=Bo(r),s=e-4,i=s-7-1,[c,d]=QR(Ee(t.title),i,s),p=d?null:_n(Ee(t.props.description),s)||null,m=bn(t),f=xn(t).map(S=>({...S,name:S.name})),g=Math.max(1,s-xh),h=N.getCommentsByIssue(t.id),x=h.length?String(h.length).length+2+1:0,{shown:b,hidden:R}=eC([...m.map(S=>({id:S.id,isTag:!0,width:Math.min(S.name.length,g)+xh})),...f.map(S=>({id:S.id,isTag:!1,width:Math.min(S.name.length,g)+ZR+(za(S.id)?0:1)}))],s-x);return Nt.createElement(Oo,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?y.accent:y.secondary,justifyContent:"space-between"},Nt.createElement(Oo,{paddingLeft:1,paddingRight:1,flexDirection:"column"},Nt.createElement(Oo,{justifyContent:"space-between"},Nt.createElement(Fo,{color:y.primary},c),Nt.createElement(Fo,{color:y.secondary2,dimColor:!0},H(t.id))),d&&Nt.createElement(Fo,{color:y.primary},d),p&&Nt.createElement(Fo,{color:y.secondary2,dimColor:!0},p)),Nt.createElement(Oo,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},Nt.createElement(Oo,{flexDirection:"row"},b.map(S=>Nt.createElement(Oo,{paddingRight:1,key:S.id},S.isTag?Nt.createElement(Do,{id:S.id,maxWidth:g}):Nt.createElement(mr,{id:S.id,maxWidth:g}))),R>0&&Nt.createElement(Fo,{color:y.secondary2,dimColor:!0},"+",R)),h.length>0&&Nt.createElement(Fo,{color:y.accent},"[",h.length,"]")))};import{Box as Wr,Text as Xs}from"ink";import Ot from"react";var tC=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Eh=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:i})=>{let c=Bo(s),d=(r.props.tags??[]).map(M=>N.getTag(M)).filter(M=>!!M),p=(r.props.assignees??[]).map(M=>N.getContributor(M)).map(M=>M&&{...M,name:M.name}).filter(M=>!!M),m=1,f=d.length*(1+m),g=p.length*(2+m),h=d.map(M=>Ot.createElement(Wr,{key:M.id,paddingRight:m},Ot.createElement(Xs,{color:ze(M.name)},"\u25A0"))),x=p.map(M=>Ot.createElement(Wr,{key:M.id,paddingRight:m},Ot.createElement(Xs,{color:Oc(M.name)},"@"+M.name.at(0)))),b=s?c:o?y.accent:i===I.MOVE?y.secondary:y.primary,R=N.getCommentsByIssue(r.id),S=R.length?String(R.length).length+2+m:0,A=R.length?Ot.createElement(Wr,{paddingRight:m},Ot.createElement(Xs,{color:y.accent},"[",R.length,"]")):null,T=f+g+S,P=Math.max(1,n-t-T-(T>0?1:0));return Ot.createElement(Wr,{justifyContent:"space-between"},Ot.createElement(Wr,null,Ot.createElement(Wr,{width:t},o?Ot.createElement(Ct,{isSelected:!0}):Ot.createElement(Xs,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),Ot.createElement(Xs,{wrap:"truncate",color:b},tC(r.title,P))),Ot.createElement(Wr,null,h,x,A))};var oC=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:d,replay:p}=ne(),m=d[e.id]??[],f=p?new Set(p.flashNodeIds):null,g=f?.has(e.id)??!1,h=Bo(g),x=`${e.title} ${nC.hex(y.secondary2).dim("("+m.length+")")}`,b=3,R=o?1:5,S=s&&i===-1,A=n-3-(o?1:0)-(S?2:0),T=Math.max(2,String(m.length).length+1),P=r-b-1,M=Tn.createElement(Bd,{borderStyle:"round",borderColor:y.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},Tn.createElement(Ct,{isSelected:t}),Tn.createElement(rC,{bold:!0,color:g?h:t?y.accent:y.primary},x," ",e.readonly?"\u{1F512}":"")),O=(W,Y)=>{let xe=s&&i===Y;if(!_(W))return null;let F=f?.has(W.id)??!1;return o?Tn.createElement(Eh,{key:W.id,index:Y,labelWidth:T,width:A,ticket:W,isSelected:xe,isFlashing:F,mode:c}):Tn.createElement(Ih,{key:W.id,width:A,ticket:W,isSelected:xe,isFlashing:F})};return Tn.createElement(Bd,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?y.accent:y.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},M,Tn.createElement(Bd,null,m.length>0&&Tn.createElement(ut,{selectedIndex:i,height:P,itemHeight:R},m.map(O)),S&&Tn.createElement(Ct,{isSelected:!0})))},Sh=Tn.memo(oC);import{Box as Vo,Text as IN}from"ink";import At,{useMemo as zo}from"react";var Rh=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},Ch=(e,t,n)=>Re.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});var Nh=e=>e.action==="add.issue.comment";import{Box as _o,Text as zn}from"ink";import mt,{useEffect as sC,useMemo as iC,useRef as aC}from"react";import{decodeTime as Ah}from"ulid";var fr=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"},qa=e=>String(e).padStart(2,"0"),Ya=e=>`${e.getFullYear()}-${qa(e.getMonth()+1)}-${qa(e.getDate())} ${qa(e.getHours())}:${qa(e.getMinutes())}`;var lC=e=>Me(e,"attachments"),cC=e=>N.getAttachmentsByIssue(e.id).sort((t,n)=>Ah(t.id)-Ah(n.id)),Th=e=>{for(let t of e)N.deleteNode(t.id)},dC=(e,t,n)=>Re.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),uC=(e,t)=>{let n=N.getNode(lC(e.id));if(!n||!at(n))return[];let r=t.map((o,s)=>dC(o,s,n.id)).map(o=>N.createNode(o)).filter(ve).map(({value:o})=>o).filter(at);return t.length>0&&v().selectedIndex<0&&$.navigate({contextNode:n,selectedIndex:0}),r},mC=e=>`${Math.max(1,Math.round(e/1024))} KB`;function wh({ticket:e,width:t,height:n}){let r=iC(()=>cC(e),[e]),o=aC([]);sC(()=>(Th(o.current),o.current=uC(e,r),()=>{Th(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=ne(),c=Math.max(1,n-4),d=Math.max(12,t-32);return r.length===0?mt.createElement(_o,{flexDirection:"column",width:t,height:n,padding:1},mt.createElement(zn,{color:y.primary},"No attachments yet."),mt.createElement(_o,{paddingTop:1},mt.createElement(zn,{color:y.primary},"Attach images from the browser GUI"),mt.createElement(zn,{color:y.accent}," epiq gui "),mt.createElement(zn,{color:y.primary},"by dropping or pasting them."))):mt.createElement(_o,{flexDirection:"column",width:t,height:n},mt.createElement(_o,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},mt.createElement(zn,{color:y.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),mt.createElement(ut,{height:c,itemHeight:2,selectedIndex:s},r.map((p,m)=>{let f=m===s,g=p.name.length>d?p.name.slice(0,d-1)+"\u2026":p.name;return mt.createElement(_o,{key:p.id,flexDirection:"row",paddingX:1,paddingBottom:1},mt.createElement(zn,{color:y.accent},f?"\u276F ":" "),mt.createElement(_o,{paddingLeft:1},mt.createElement(zn,{color:y.secondary2},`#${m+1} `),mt.createElement(zn,{color:f?y.accent:y.primary},g),mt.createElement(zn,{color:y.secondary2}," "+mC(p.bytes)+" "+fr(De(p.id)))))})))}import{Box as gr,Text as hr}from"ink";import Ye,{useEffect as IC,useMemo as Wh,useRef as EC}from"react";import{decodeTime as Gh}from"ulid";var Ph=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,Od=e=>e.replace(Ph,""),pC=e=>`<!-- epiq-diff-comment:${JSON.stringify(e).replaceAll(">","\\u003e")} -->`,Mh=e=>e==="additions"||e==="deletions",Js=e=>{let t=Ph.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"||!Mh(r.side)||!Mh(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var Lh=/```\n([\s\S]*?)\n?```\s*$/,kh=e=>Lh.exec(e)?.[1]??null,fC=/`[^`\n]+`[^\n]*\n?$/,Dh=e=>Od(e).replace(Lh,"").replace(fC,"").trim(),Bh=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})`},Fd=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${Bh(e)}`;var gC=e=>{let t=e.split(`
|
|
70
|
-
`),n=t.filter(
|
|
71
|
-
`):e},
|
|
72
|
-
`)};var
|
|
73
|
-
`),t);let
|
|
74
|
-
`).map(
|
|
75
|
-
`),t),{kind:"blank"}]:[],{kind:"caption",text:Fd(n)},...s.flatMap((d,p)=>
|
|
76
|
-
`),[p,m,f,g,...h]=(c??"").split($
|
|
77
|
-
`).filter(p=>p!==""),i=s.filter(p=>!
|
|
78
|
-
`)){if(
|
|
79
|
-
`;else if(
|
|
80
|
-
`)){if(i.startsWith("diff --git ")){n=s();let m=i.slice(11),f=m.lastIndexOf(" b/");f!==-1&&(n.path=
|
|
81
|
-
`)}}};import{existsSync as Jd}from"node:fs";import{chmod as Qd}from"node:fs/promises";import
|
|
82
|
-
`).map(o=>o.trim()).filter(Boolean);return r.length===0?l("No changed files found for this commit"):u("Listed changed files",r)},rN=async(e,t,n)=>{let r=await nN(e,t);if(a(r))return l(r.message);let o=r.value;if(o.length>eN)return l(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=ei("commit-diffs",t);if(a(s))return l(s.message);let i=s.value,c=await Promise.all(o.map(async(g,h)=>{let[x,b]=await Promise.all([uy(e,`${t}~1`,g),uy(e,t,g)]),R=tl.basename(g),S=tl.join(i,String(h),"before",R),A=tl.join(i,String(h),"after",R);return Jd(S)||(ot.writeToFile(S,x),await Qd(S,292)),Jd(A)||(ot.writeToFile(A,b),await Qd(A,292)),{beforePath:S,afterPath:A}})),[d,...p]=c;if(!d)return l("No changed files found for this commit");let m=await Xd(n,d.beforePath,d.afterPath,"new");if(a(m)||p.length===0)return m;await new Promise(g=>setTimeout(g,tN));let f=await Promise.all(p.map(({beforePath:g,afterPath:h})=>Xd(n,g,h,"reuse")));for(let g of f)a(g)&&logger.error(`Failed to open an additional diff tab for ${t}: ${g.message}`);return m},ti=async e=>{if(!jo(e.sha))return l("Invalid commit sha");let t=an(e.repoRoot);if(a(t))return l(t.message);let n=t.value,r=el()[0];if(r&&Yd(r)){let o=await rN(n,e.sha,r);if(!a(o))return o;logger.error(`Side-by-side diff failed for ${e.sha}, falling back to unified diff: ${o.message}`)}return ZC(n,e.sha)};import{Box as ln,Text as qn}from"ink";import Fe,{useEffect as nu,useMemo as gy,useRef as iN,useState as aN}from"react";var nl=(e,t,n)=>{let r=[],o=Na(()=>{for(let s=0;s<t;s++){let i=Bt(BigInt(s+1));if(!ve(i))continue;let c=N.createNode(Re.text({id:n(s),name:`Line ${s+1}`,parentNodeId:e,rank:i.value,readonly:!0,isVirtual:!0}));ve(c)&&r.push(c.value)}});return a(o)&&logger.error(`Line nodes: ${o.message}`),r},Wo=e=>{N.deleteNodes(e.map(t=>t.id))};import{useSyncExternalStore as oN}from"react";var ol=null,rl=null,Zd=new Set,my=()=>{for(let e of Zd)e()},eu=e=>{ol=e,my()},sl=()=>ol,py={mark:null},Vr=e=>{rl=e,py={mark:e},my()};var tu=e=>rl&&rl.sha===e?rl.row:null,fy=()=>oN(e=>(Zd.add(e),()=>{Zd.delete(e)}),()=>py),yr=()=>{let{contextNode:e}=v();return ol&&ol.sha===e.id?e.id:null};import lN from"string-width";var ru=(e,t)=>`${e}::patch::${t}`,cN=e=>{switch(e){case"added":return y.green;case"removed":return y.red;case"hunk":return y.accent;case"file":return y.primary;default:return y.secondary2}},hy=(e,t)=>{let n=lN(e);return n>=t?e:e+"\xA0".repeat(t-n)},dN=e=>e==="added"?"+":e==="removed"?"-":" ",yy=e=>e.kind==="file"||e.kind==="hunk"||e.kind==="note"||e.newLine===void 0?"":String(e.newLine);function vy({ticket:e,sha:t,subject:n,width:r,height:o}){let[s,i]=aN({state:"loading"});nu(()=>{let T=!0;return i({state:"loading"}),$d({sha:t}).then(P=>{T&&i(a(P)?{state:"failed",message:P.message}:{state:"loaded",rows:Vd(Gd(P.value))})}),()=>{T=!1}},[t]);let c=s.state==="loaded"?s.rows:null,d=c!==null&&c.length>4e3,p=iN([]);nu(()=>(Wo(p.current),p.current=c&&!d?nl(t,c.length,T=>ru(t,T)):[],()=>{Wo(p.current),p.current=[]}),[t,c,d]),nu(()=>(eu(c?{sha:t,rows:c}:null),Vr(null),()=>{eu(null),Vr(null)}),[t,c]);let{selectedIndex:m}=ne(),{mark:f}=fy(),g=gy(()=>c?zd(c,N.getCommentsByIssue(e.id),t):new Set,[c,t,e]),h=f&&f.sha===t?f.row:null,x=T=>h!==null&&T>=Math.min(h,m)&&T<=Math.max(h,m),b=gy(()=>c?Math.max(5,c.reduce((T,P)=>Math.max(T,yy(P).length),0)+2):5,[c]),R=Math.max(1,o-4),S=Math.max(8,r-b-6);if(s.state!=="loaded")return Fe.createElement(ln,{flexDirection:"column",width:r,height:o,padding:1},Fe.createElement(qn,{color:y.primary},s.state==="loading"?"Reading the diff\u2026":`Could not read the diff: ${s.message}`));let A=T=>Fe.createElement(ln,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},Fe.createElement(qn,{color:y.secondary2,wrap:"truncate-end"},jn(`${t.slice(0,7)} ${n} \u2014 ${T}`,Math.max(8,r-6))));return s.rows.length===0?Fe.createElement(ln,{flexDirection:"column",width:r,height:o},A("no changes"),Fe.createElement(ln,{paddingX:1},Fe.createElement(qn,{color:y.primary},"This commit changed no files."))):d?Fe.createElement(ln,{flexDirection:"column",width:r,height:o},A("too large to draw here"),Fe.createElement(ln,{paddingX:1,flexDirection:"column"},Fe.createElement(qn,{color:y.primary},`${s.rows.length.toLocaleString()} lines of diff.`),Fe.createElement(qn,{color:y.secondary2},"Press o to open it in your editor."))):Fe.createElement(ln,{flexDirection:"column",width:r,height:o},A(h===null?"enter to comment on a line, s to start a range, o editor, q back":"move to the other end, then enter to comment \u2014 s clears the mark"),Fe.createElement(ut,{scrollByOne:!0,height:R,selectedIndex:m,itemHeight:1},s.rows.map((T,P)=>{let M=P===m,O=cN(T.kind);if(T.kind==="file")return Fe.createElement(ln,{key:ru(t,P),paddingX:1},Fe.createElement(qn,{backgroundColor:y.secondary,color:M?y.accent:O,bold:!0,wrap:"truncate-end"},hy(` ${jn(Zs(T.text),S)}`,S+b+1)));let W=x(P),Y=`${dN(T.kind)}${jn(Zs(T.text),S)}`;return Fe.createElement(ln,{key:ru(t,P),paddingX:1},Fe.createElement(ln,{flexShrink:0},Fe.createElement(qn,{color:M||W?y.accent:y.secondary2,dimColor:!M&&!W,wrap:"truncate-end"},`${M?"\u276F":"\xA0"}${W?"\u258C":"\xA0"}${yy(T).padStart(b-2,"\xA0")}`)),Fe.createElement(ln,{flexShrink:0},Fe.createElement(qn,{color:y.yellow,wrap:"truncate-end"},g.has(P)?"\u2502":"\xA0")),Fe.createElement(qn,{color:M?y.accent:O,backgroundColor:M||W?y.secondary:void 0,wrap:"truncate-end"},M||W?hy(Y,S+1):Y))})))}var pN=e=>Me(e,"diff"),xy=e=>{for(let t of e)N.deleteNode(t.id)},fN=(e,t,n)=>Re.field({id:e.sha,name:e.subject,parentNodeId:n,rank:String(t).padStart(6,"0"),childRenderAxis:"vertical",isVirtual:!0}),gN=(e,t)=>{let n=N.getNode(pN(e.id));if(!n||!at(n))return[];let r=t.map((o,s)=>fN(o,s,n.id)).map(o=>N.createNode(o)).filter(ve).map(({value:o})=>o).filter(at);return t.length>0&&v().selectedIndex<0&&v().contextNode.id===n.id&&$.navigate({contextNode:n,selectedIndex:0}),r},hN=e=>`+${e.insertions} -${e.deletions}`;function Iy({ticket:e,width:t,height:n}){let[r,o]=mN({state:"loading"}),s=H(e.id);by(()=>{let x=!0;return o({state:"loading"}),Kn({ref:s}).then(b=>{x&&o(a(b)?{state:"failed",message:b.message}:{state:"loaded",commits:b.value})}),()=>{x=!1}},[s]);let i=uN([]),c=r.state==="loaded"?r.commits:null;by(()=>(xy(i.current),i.current=c?gN(e,c):[],()=>{xy(i.current),i.current=[]}),[e,c]);let{selectedIndex:d,contextNode:p}=ne(),m=c?.find(x=>x.sha===p.id)??null,g=Math.max(1,n-4),h=Math.max(12,t-34);return r.state!=="loaded"?Xe.createElement(zr,{flexDirection:"column",width:t,height:n,padding:1},Xe.createElement(wn,{color:y.primary},r.state==="loading"?"Reading commits\u2026":`Could not read commits: ${r.message}`)):m?Xe.createElement(vy,{ticket:e,sha:m.sha,subject:m.subject,width:t,height:n}):r.commits.length===0?Xe.createElement(zr,{flexDirection:"column",width:t,height:n,padding:1},Xe.createElement(wn,{color:y.primary},"No commits reference this ticket."),Xe.createElement(zr,{paddingTop:1},Xe.createElement(wn,{color:y.primary},"Commits are matched by the"),Xe.createElement(wn,{color:y.accent},` ${s} `),Xe.createElement(wn,{color:y.primary},"prefix on their subject line."))):Xe.createElement(zr,{flexDirection:"column",width:t,height:n},Xe.createElement(zr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},Xe.createElement(wn,{color:y.secondary2},`Diff (${r.commits.length}) \u2014 enter to read, o to open in your editor `)),Xe.createElement(ut,{height:g,itemHeight:2,selectedIndex:d},r.commits.map((x,b)=>{let R=b===d,S=x.subject.length>h?x.subject.slice(0,h-1)+"\u2026":x.subject;return Xe.createElement(zr,{key:x.sha,flexDirection:"row",paddingX:1,paddingBottom:1},Xe.createElement(wn,{color:y.accent},R?"\u276F ":" "),Xe.createElement(zr,{paddingLeft:1},Xe.createElement(wn,{color:y.secondary2},`${x.sha.slice(0,7)} `),Xe.createElement(wn,{color:R?y.accent:y.primary},S),Xe.createElement(wn,{color:y.secondary2},` ${hN(x)} ${fr(x.time)}`)))})))}import{Box as il,Text as yN}from"ink";import Yn from"react";var Ey=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=ne(),{title:o}=t,s=t.parentNodeId?N.getNode(t.parentNodeId):void 0,i=s&&_(s)?o===Ne.ASSIGNEES?s.props.assignees??[]:o===Ne.TAGS?(s.props.tags??[]).filter(c=>N.getTag(c)):[]:[];return Yn.createElement(il,{alignItems:"center",paddingTop:1},Yn.createElement(il,{minWidth:12},Yn.createElement(Ct,{isSelected:n}),Yn.createElement(yN,{color:n?y.accent:y.secondary2},o,":")),Yn.createElement(il,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,d)=>{let p=r.id===t.id&&d===e;return Yn.createElement(il,{key:`${o}-${c}`,paddingRight:2,minHeight:1},Yn.createElement(Ct,{isSelected:p}),o===Ne.ASSIGNEES?Yn.createElement(mr,{isSelected:p,id:c}):o===Ne.TAGS?Yn.createElement(Do,{isSelected:p,id:c}):null)})))};import{Box as Go,Text as iu}from"ink";import Gt,{useEffect as vN,useMemo as au,useRef as bN}from"react";var ou=e=>Math.max(5,String(Math.max(e,1)).length+3),Sy=(e,t)=>Math.max(0,e-6-ou(t));var su=(e,t=0,n=0)=>Math.max(1,e-5-2*t-(n>0?1+n:0));var xN="\u2029",Ry=(e,t)=>`${e}::inline-line::${t}`,lu=({id:e,label:t,text:n,rows:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=ne(),d=au(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),p=au(()=>d.join("\0"),[d]),m=bN([]);vN(()=>(Wo(m.current),m.current=nl(e,d.length,b=>Ry(e,b)),()=>{Wo(m.current),m.current=[]}),[e,p]);let f=ou(d.length),g=Sy(s,d.length),x=au(()=>_d(d).map(b=>{if(b.kind==="code"||b.kind==="caption")return{...b,text:jn(b.text,g)};if(b.kind==="text"||b.kind==="heading"){let R=b.spans.map(S=>S.code?`\`${S.text}\``:S.text).join("");return{...b,spans:Qs(jn(R,g))}}return b}),[d,g]).map((b,R)=>{let S=c.id===e&&i===R;return Gt.createElement(Go,{key:Ry(e,R)},Gt.createElement(Go,{flexShrink:0},Gt.createElement(iu,{color:S?y.primary:y.secondary2,dimColor:!S},`${R+1} `.padStart(f,"\xA0"))),b.kind==="blank"?Gt.createElement(iu,{backgroundColor:S?"gray":void 0},xN):Gt.createElement(Go,null,Gt.createElement(jd,{line:b,width:b.kind==="code"?g:0,wrap:"truncate-end"})))});return Gt.createElement(Go,{flexDirection:"column",paddingTop:1},Gt.createElement(Go,null,Gt.createElement(Ct,{isSelected:o}),Gt.createElement(iu,{color:o?y.accent:y.secondary2},t)),Gt.createElement(Go,{flexDirection:"row",borderStyle:"round",borderColor:y.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},Gt.createElement(ut,{scrollByOne:!0,height:r,selectedIndex:i,itemHeight:1},x)))};var EN=e=>Me(e,"description"),SN=e=>Me(e,"comments"),RN=e=>Me(e,"history"),CN=e=>Me(e,"diff"),NN=e=>Me(e,"attachments"),Cy=({ticket:e,height:t})=>{let n=zo(()=>Rh(e),[e]),{selectedIndex:r,contextNode:o}=ne(),s=process.stdout.columns||120,i=zo(()=>EN(e.id),[e.id]),c=zo(()=>SN(e.id),[e.id]),d=zo(()=>RN(e.id),[e.id]),p=zo(()=>CN(e.id),[e.id]),m=zo(()=>NN(e.id),[e.id]),f=N.getAttachmentsByIssue(e.id).length,g=o.id===e.id,h=o.id===c||o.parentNodeId===c,x=o.id===d||o.parentNodeId===d,b=o.id===m||o.parentNodeId===m,R=o.id===p||o.parentNodeId===p,S=le(e.id);if(h){let X=t-3;return At.createElement(Vo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},At.createElement(zh,{ticket:e,width:s,height:X}))}if(b){let X=t-3;return At.createElement(Vo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},At.createElement(wh,{ticket:e,width:s,height:X}))}if(R){let X=t-3;return At.createElement(Vo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},At.createElement(Iy,{ticket:e,width:s,height:X}))}if(x){let F=N.getNode(d),X=F&&at(F)?F.props.value??"":"",Ve=su(t);return At.createElement(Vo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},F?At.createElement(lu,{id:F.id,label:"Event log",text:X,selected:!1,maxWidth:s,rows:Ve}):null)}let A=[d,p,c,m],T=F=>A.includes(F),P=S.reduce((F,X)=>Es(X)?F+1:F,0),M=S.reduce((F,X)=>T(X.id)?F+1:F,0),O=S.findIndex(F=>T(F.id)),W=su(t,P,M),Y=(F,X,Ve,Qn)=>At.createElement(Vo,{key:F.id,paddingTop:X===O?1:0},At.createElement(Ct,{isSelected:Ve}),At.createElement(IN,{backgroundColor:y.secondary,color:Ve?y.accent:y.primary},Qn)),xe=(F,X,Ve)=>F.id===i?At.createElement(lu,{key:F.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:X,maxWidth:s,rows:W}):Es(F)?At.createElement(Ey,{key:F.id,parent:F,selected:X,selectedIndex:r}):F.id===c?Y(F,Ve,X,` Comments (${n}) \u203A\u203A `):F.id===m?Y(F,Ve,X,` Attachments (${f}) \u203A\u203A `):F.id===d?Y(F,Ve,X," History \u203A\u203A "):F.id===p?Y(F,Ve,X," Diff \u203A\u203A "):null;return At.createElement(Vo,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S.map((F,X)=>xe(F,g&&r===X,X)))};var TN=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:i,width:c})=>{let d=t.context,p=d===oe.TICKET||d===oe.FIELD_LIST||d===oe.FIELD,m=d===oe.BOARD||d===oe.SWIMLANE,f=d===oe.TICKET?t:r.find(R=>R.context===oe.TICKET),g=Math.floor(c/3),h=Math.floor(c/Math.max(e.length,1)),x=Math.min(h,g),b=s==="dense";return al.createElement(AN,{flexDirection:"row",height:i},m&&e.map((R,S)=>{let A=t.id===R.id,T=A?n:-1,P=t.context===oe.BOARD&&n===S;return al.createElement(Sh,{key:R.id,height:i,width:x,swimlane:R,isSelected:P,isDense:b,isFocused:A,listSelectedIndex:T,mode:o})}),p&&f&&al.createElement(Cy,{height:i,ticket:f}))},ll=al.memo(TN);import{render as PN}from"ink";import{Writable as LN}from"node:stream";var ni=e=>String(e).padStart(2,"0"),kN=e=>{let t=e.getUTCFullYear(),n=ni(e.getUTCMonth()+1),r=ni(e.getUTCDate()),o=ni(e.getUTCHours()),s=ni(e.getUTCMinutes()),i=ni(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},DN=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",BN=async(e,{width:t,height:n})=>{let r="",o=new LN({write(i,c,d){let p=ON(i.toString()).trimEnd();p.trim().length>0&&p.includes("\u256D")&&(r=p),d()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=PN(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},ON=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Ay=async()=>{let{viewMode:e}=V(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=v(),i=r.find(S=>S.context==="BOARD");if(!i)return l("No board found to export");let c=120,d=40,p=await BN(MN.createElement(ll,{height:d,width:c,swimlanes:(s[i.id]??[]).filter(S=>S!==void 0&&vn(S)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:d});if(!p)return l("Failed to render board export");let m=Ui(process.cwd());if(a(m))return l("Unable to export, epiq root not found");let f=new Date,g=kN(f),h=`board_${DN(i.title)}_${g}.md`,x=ip(m.value);Ny.mkdirSync(x,{recursive:!0});let b=wN.join(x,h),R=`# Board - ${i.title}
|
|
64
|
+
${d.message}`):u("Configured state branch upstream",!0)},Oa=async({stateBranchRoot:e,eventFileName:t})=>{let n=Zm(t),o=Vn.join(e,n);if(!Gn.existsSync(o))return u("No event file to stage",null);let r=await Qg({stateBranchRoot:e,relativePath:n,workingContent:Gn.readFileSync(o,"utf8")});if(a(r))return l(r.message);let s=await Ce.stage({cwd:e,pathspec:[n]});return a(s)?l(`Failed to stage state branch event file
|
|
65
|
+
${s.message}`):u("Staged state branch event file",n)},th=async({stateBranchRoot:e})=>{let t=ep(),n=Vn.join(e,t);if(!Gn.existsSync(n))return u("No media directory to stage",null);let o=await Ce.stage({cwd:e,pathspec:[t],ignoreRemoval:!0});return a(o)?l(`Failed to stage state branch media files
|
|
66
|
+
${o.message}`):u("Staged state branch media files",t)},nh=async({stateBranchRoot:e})=>{let t=[Nc(),Ac(),dt].filter(o=>Gn.existsSync(Vn.join(e,o)));if(t.length===0)return u("No event log config to stage",[]);let n=await Ce.stage({cwd:e,pathspec:t});return a(n)?l(`Failed to stage event log config
|
|
67
|
+
${n.message}`):u("Staged event log config",t)},oh=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let o=await ER(e);return a(o)?l(`Create state branch sync commit failed
|
|
68
|
+
`+o.message):gr({cwd:t,message:o.value,pathspec:n})},zs=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Rc(t);if(a(n))return l(n.message);let o=ke(e);if(a(o))return o;let r=o.value,s=n.value?await Ce.push({cwd:t}):await Ce.push({cwd:t,remote:Pt,branch:r,setUpstream:!0});if(a(s))return l(`Failed during state branch push
|
|
69
|
+
${s.message}`);let i=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return u(i?"Pushed state branch":"Remote already up to date",i)},rh=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let o=!1,r=ke(e);if(a(r))return r;let s=r.value,i=[ps(),await Vs({repoRoot:e,stateBranchName:s}),await mo({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await AR({stateBranchRoot:t,stateBranchName:s}),await rp(t),n?await wR({stateBranchRoot:t,repoRoot:e}):u("Skipped state branch upstream bootstrap",!1)];for(let c of i){if(a(c))return l(c.message);o=o||!!c.value}return u(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",o)};import Wo from"node:fs";import wd from"node:os";import ah from"node:path";var ja="epiq-sync.lock",sh=600*1e3,TR=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}},MR=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},lh=e=>e?e.hostname!==wd.hostname()||MR(e.pid)?Date.now()-e.startedAt>sh?"stale":null:"dead":"stale",PR=e=>{let t=ah.join(e,ja);return Wo.existsSync(t)?lh(_a(t))===null:!1},Fa=new Map,LR=e=>{let t=Fa.get(e);if(t)return t;let n=ls(e).then(o=>a(o)?null:o.value,()=>null);return Fa.set(e,n),n.then(o=>{o===null&&Fa.get(e)===n&&Fa.delete(e)}),n},$a=async e=>{let t=await LR(e);return t!==null&&PR(t)},ch=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,_a=e=>{try{return TR(Wo.readFileSync(e,"utf8"))}catch{return null}},ih=(e,t)=>{let n={pid:process.pid,hostname:wd.hostname(),startedAt:Date.now(),operation:t},o=`${e}.${process.pid}.pending.lock`;try{return Wo.writeFileSync(o,JSON.stringify(n)),Wo.linkSync(o,e),!0}catch{return!1}finally{try{Wo.rmSync(o,{force:!0})}catch{}}},kR=async({worktreeRoot:e,operation:t})=>{let n=await ls(e);if(a(n))return l(n.message);let o=ah.join(n.value,ja),r=()=>{try{let d=_a(o);d&&d.pid===process.pid&&Wo.rmSync(o)}catch{}};if(ih(o,t))return u("Acquired sync lock",{acquired:!0,claim:"clean",release:r});let s=_a(o),i=lh(s);if(i===null)return u("Sync lock is held",{acquired:!1,heldBy:s});ee.info(`Breaking an abandoned sync lock: ${s?ch(s):"unreadable lock file"}`);try{Wo.rmSync(o,{force:!0})}catch{}if(ih(o,t))return u("Acquired sync lock after breaking a stale one",{acquired:!0,claim:i,release:r});let c=_a(o);return u("Sync lock taken by another process",{acquired:!1,heldBy:c??{pid:-1,hostname:wd.hostname(),startedAt:Date.now(),operation:"unknown"}})},Ks=async({worktreeRoot:e,operation:t,fn:n})=>{let o=await kR({worktreeRoot:e,operation:t});if(a(o))return l(o.message);if(!o.value.acquired)return ee.info(`Skipping ${t}: the state worktree is held by ${ch(o.value.heldBy)}`),u("State worktree is held by another process",null);let{claim:r,release:s}=o.value;try{return u("Ran under the sync lock",await n(r))}finally{s()}};var DR=async({claim:e,cwd:t,ensureUpstream:n})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:t,ensureUpstream:n});let o=ge("getRepoRootDir",await Zt(t));if(a(o))return l(o.message);let r=o.value;logger.debug("[sync] repo root",r);let s=ge("getStateBranchRoot",me({repoRoot:r}));if(a(s))return l(s.message);let i=s.value;if(logger.debug("[sync] state branch root",i),e!=="stale"&&uh.existsSync(i)){let m=await Gm(i,{preserve:[ja]});if(a(m))return l(m.message);m.value.length>0&&logger.info("[sync] cleared git lock files left by a dead process",{removed:m.value,stateBranchRoot:i});let f=ke(r);if(a(f))return l(f.message);let g=await Vm(i,f.value);if(a(g))return l(g.message);g.value&&logger.info("[sync] cleared a ref lock left by a dead process",{branch:f.value,stateBranchRoot:i});let h=ge("abortRebaseIfPresent(stateBranchRoot)",await Cc(i));if(a(h))return l(h.message)}logger.debug("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:i,ensureUpstream:n});let c=ge("bootstrapStateBranchStorage",await rh({repoRoot:r,stateBranchRoot:i,ensureUpstream:n}));if(a(c))return l(c.message);logger.debug("[sync] bootstrap result",{bootstrapped:c.value,stateBranchRoot:i}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:i});let d=ge("getInProgressGitOperation(stateBranchRoot)",await Sc(i));if(a(d))return l(d.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:d.value}),d.value!==null)return logger.info("[sync] state branch git operation in progress",{claim:e}),l(`Cannot sync while there is a ${d.value} in the state branch at ${i}`);logger.debug("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:i});let p=ge("ensureStateBranchLayout",op(r,i));return a(p)?l(p.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:i,bootstrapped:c.value}),u("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:c.value}))},BR=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.debug("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.debug("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let o=[];for(let p of ug(St(t),n)){let m=ge("stageStateBranchOwnEventFile",await Oa({stateBranchRoot:t,eventFileName:p}));if(a(m))return l(m.message);o.push(m.value)}let r=ge("stageStateBranchMediaFiles",await th({stateBranchRoot:t}));if(a(r))return l(r.message);let s=ge("stageStateBranchEventConfig",await nh({stateBranchRoot:t}));if(a(s))return l(s.message);let i=[...o,r.value,...s.value].filter(p=>p!==null);if(i.length===0)return u("Nothing to stage",{createdCommit:!1});let c=ge("hasStagedChanges(after stage)",await qm(t,i));if(a(c))return l(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"),u("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let d=ge("createStateBranchSyncCommit",await oh({repoRoot:e,stateBranchRoot:t,pathspec:i}));return a(d)?l(d.message):(logger.debug("[sync] created sync commit",d.value),u("Committed own event file",{createdCommit:!0,commitSha:d.value}))},Td=(e,t="offline")=>{let n=e.createdCommit?`Committed locally, ${t}`:t==="offline"?"Offline":"No remote";return Da(n),u(n,{...e,pulled:!1,pushed:!1,offline:!0})},dh=async({cwd:e=process.cwd(),ownEventFileName:t},n)=>{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}),l("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}),l("Own event file must end with .jsonl");Mr();let o=ge("ensureSyncReady",await DR({claim:n,cwd:e,ensureUpstream:!0}));if(a(o))return We(o.message);let{repoRoot:r,stateBranchRoot:s,bootstrapped:i}=o.value,c=ge("isDetachedHead(stateBranchRoot)",await Ym(s));if(a(c))return We(c.message);if(logger.debug("[sync] detached state branch check result",{detached:c.value}),c.value)return We("Cannot run :sync while the state branch is in detached HEAD state");let d=!1,p,m=!1,f=!1,g=ge("getStateBranch",ke(r));if(a(g))return We(g.message);let h=g.value;logger.debug("[sync] resolved state branch",{stateBranch:h,stateBranchRoot:s});let x=ge("flushPendingLogs",xa(s,t));a(x)&&logger.error(`[sync] ${x.message}`);let b=ge("commitOwnEventFileToStateBranch",await BR({repoRoot:r,stateBranchRoot:s,ownEventFileName:t}));if(a(b))return We(b.message);d=b.value.createdCommit,p=b.value.commitSha;let R=ge("hasRemote",await On({repoRoot:s}));if(a(R))return We(R.message);if(!R.value)return Td({repoRoot:r,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i},"no remote");let S=ge("pullBranchRebaseIfPresent",await us({cwd:s,branch:h}));if(a(S))return ds(S.message)?Td({repoRoot:r,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i}):We(S.message);m=S.value;let A=ge("isAheadOfUpstream",await zm(s));if(a(A))return We(A.message);if(d||i||A.value){logger.info("[sync] pushing state branch",{createdCommit:d,bootstrapped:i,stateBranchRoot:s});let w=ge("pushStateBranch",await zs({stateBranchRoot:s,repoRoot:r}));if(a(w)&&Hm(w.message)){let P=ge("pullBranchRebaseIfPresent(retry)",await us({cwd:s,branch:h}));if(a(P))return We(P.message);m=m||P.value,w=ge("pushStateBranch(retry)",await zs({stateBranchRoot:s,repoRoot:r}))}if(a(w))return ds(w.message)?Td({repoRoot:r,stateBranchRoot:s,createdCommit:d,commitSha:p,bootstrapped:i}):We(w.message);f=w.value}if(d){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:s});let w=ge("git rev-parse HEAD",await U({args:["rev-parse","HEAD"],cwd:s}));if(a(w))return We(w.message);p=w.value.stdout.trim(),logger.debug("[sync] final sync commit sha",p)}return Ho(f?"Synced and pushed":m||d?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),u("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:s,createdCommit:d,commitSha:p,pulled:m,pushed:f,bootstrapped:i,offline:!1})},Ua=async(e,t)=>{let n=Xg(e);try{return await t()}finally{let o=Jg(e,n);o.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${o.join(", ")}`)}},Ha=async e=>{let t=e.cwd??process.cwd(),n=await Zt(t);if(a(n))return We(n.message);let o=me({repoRoot:n.value});if(a(o))return We(o.message);let r=o.value;if(!uh.existsSync(r))return dh(e,"clean");let s=await Ks({worktreeRoot:r,operation:"sync",fn:i=>Ua(r,()=>dh(e,i))});return a(s)?We(s.message):s.value===null?u("Another process is syncing this board",{repoRoot:n.value,stateBranchRoot:r,createdCommit:!1,pulled:!1,pushed:!1,bootstrapped:!1,offline:!1,skipped:!0}):s.value};var kr=null,Wa=async()=>(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!kr,currentStatus:v().syncStatus?.status,currentMessage:v().syncStatus?.msg}),kr?(logger.debug("[sync] syncAndReloadState joining existing promise"),kr):(logger.debug("[sync] syncAndReloadState creating promise"),kr=OR().finally(()=>{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:v().syncStatus?.status,statusMessageBeforeClear:v().syncStatus?.msg}),kr=null}),kr)),OR=async()=>{let e;try{e=await FR(),logger.debug("[sync] syncAndReloadState promise resolved",{success:!a(e),message:e.message,statusAfterResolve:v().syncStatus?.status,statusMessageAfterResolve:v().syncStatus?.msg})}catch(n){let o=n instanceof Error?n.message:String(n);logger.error("[sync] syncAndReloadState promise threw",{message:o,error:n}),e=l(o)}let t=de();return a(e)&&!a(t)&&t.value.syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),T({syncStatus:{msg:e.message,status:"failed"}})),e},FR=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:v().mode,syncStatus:v().syncStatus});let e=mh();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:v().mode,message:e.message,syncStatus:v().syncStatus}),e;logger.debug("[sync] syncAndReloadState:start");let t=ge("resolveActorId",pe());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:a(t)?t.message:"Missing actor id"}),l("Unable to resolve event log path");T({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:v().syncStatus});let n=ao(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let o=ge("syncEpiqWithRemote",await Ha({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!a(o),message:(a(o),o.message)}),a(o))return logger.error("[sync] syncAndReloadState:sync failed",o.message),T({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:v().syncStatus}),We(`Unable to sync state. ${o.message}`);let{stateBranchRoot:r,offline:s}=o.value,i=qs(r);return a(i)?i:(T({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:v().syncStatus}),u("Synced",!0))},qs=e=>{logger.debug("[sync] loading merged events after sync",{stateBranchRoot:e});let t=et(e),n=ge("loadMergedEvents",rn(e));if(logger.debug("[sync] loadMergedEvents:result",{success:!a(n),message:(a(n),n.message),count:a(n)?void 0:n.value.events.length}),a(n))return T({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:v().syncStatus}),l(`Unable to load events. ${n.message}`);logger.debug("[sync] loaded merged events after sync",{count:n.value.events.length});let o=mh();if(o)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:v().mode,message:o.message,syncStatus:v().syncStatus}),o;let r=$g(),s=v().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:r,selectedNodeId:v().selectedNode?.id,contextNodeId:v().contextNode?.id,selectedNodeIsVirtual:v().selectedNode?.isVirtual,contextNodeIsVirtual:v().contextNode?.isVirtual}),!v().selectedNode?.isVirtual&&!v().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:n.value.events.length});let c=de(),d=!a(c)&&c.value.timeMode==="live",p=ge("bootStateFromEventLog",sn(n.value.events,n.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!a(p),message:(a(p),p.message)}),a(p))return T({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:v().syncStatus}),l(`Unable to boot synced state. ${p.message}`);d&&wr(e,t)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:v().selectedNode?.isVirtual,contextNodeIsVirtual:v().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),T({filters:s}),logger.debug("[sync] restoreNavigationAnchor:start");let i=ge("restoreNavigationAnchor",Hg(r));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!a(i),message:a(i)?i.message:"Navigation restored",selectedNodeId:v().selectedNode?.id,contextNodeId:v().contextNode?.id}),a(i)?(T({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:v().syncStatus}),i):u("Reloaded state from event log",null)},mh=()=>v().mode===I.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:v().mode,syncStatus:v().syncStatus}),T({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),l("Will not re-materialize if not in default mode, to not lose edit data"));var ph=0,Md,Pd=!1,Ys=!1,Ld=()=>{if(Pd)return!0;let e=de();return a(e)?!1:e.value.syncStatus.status==="syncing"},_R=()=>{let e=mr(V().autoSyncIntervalMs),t=Date.now()-ph;return Math.max(0,e-t)},fh=()=>{Md||(Md=setTimeout(async()=>{if(Md=void 0,!!Rt()){if(Ld()){Ys=!0;return}Ys=!1,await jR()}},_R()))},jR=async()=>{if(v().readOnly||v().timeMode==="peek"||v().timeMode==="replay")return l("Cannot auto-sync while peeking");if(!Rt())return l("Cannot auto-sync before state is initialized");if(Ld())return Ys=!0,l("Sync already in progress");Pd=!0,ph=Date.now(),T({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Wa()}finally{Pd=!1,Ys&&fh()}},Ga=()=>{Rt()&&(Ys=!0,!Ld()&&fh())};var Va=e=>{let{context:t}=v().contextNode;if(!t)return G.None;switch(e){case C.EXIT:return G.Exit;case C.EXPORT:return G.Export;case C.INIT:return G.Init;case C.OPEN:return G.OpenProject;case C.DELETE:return G.Delete;case C.EDIT:return G.Edit;case C.COMMENT:return G.Comment;case C.HELP:return G.ViewHelp;case C.RE_OPEN_ISSUE:return G.ReopenIssue;case C.CLOSE_ISSUE:return G.CloseIssue;case C.TAG:return G.TagTicket;case C.UNTAG:return G.UntagTicket;case C.ASSIGN:return G.AssignUserToTicket;case C.UNASSIGN:return G.UnassignUserFromTicket;case C.NEW:return G.NewItem;case C.FILTER:return G.Filter;case C.MOVE:return G.Move;case C.PEEK:return G.Peek;case C.REPLAY:return G.Replay;case C.CONFIG:return G.Config;case C.YANK:return G.Yank;case C.SYNC:return G.Sync;default:return G.None}},G={Exit:"exit",Init:"init",OpenProject:"open-project",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Replay:"replay",Yank:"yank",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export"};import Ay from"node:fs";import MN from"node:path";import PN from"react";import{Box as wN}from"ink";import ll from"react";import oC from"chalk";import{Box as Bd,Text as rC}from"ink";import wn from"react";import{Text as gh}from"ink";import hh,{useEffect as yh,useState as $R}from"react";var vh={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "],identity:["\u276F "]},Ct=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=ne(),o=vh[n]??vh.default,[r,s]=$R(0);if(yh(()=>{s(0)},[o]),yh(()=>{if(!e)return;let c=setInterval(()=>{s(d=>(d+1)%o.length)},500);return()=>clearInterval(c)},[e,o]),!e)return hh.createElement(gh,null,t);let i=o[r]??o[0]??t;return hh.createElement(gh,{color:y.accent,dimColor:r===1},i)};import{Box as kd,Text as UR}from"ink";import za from"react";var HR=(e,t,n,o)=>{let r=d=>Math.max(1,e[d]??1),s=n,i=n+1,c=r(n);for(;i<t&&c+r(i)<=o;)c+=r(i),i++;for(;s>0&&c+r(s-1)<=o;)s--,c+=r(s);return{start:s,end:i}},ut=({children:e=[],height:t,selectedIndex:n,itemHeight:o=1,itemHeights:r,scrollByOne:s=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),c=Math.max(1,Math.ceil(o)),d=Math.max(0,Math.min(n,e.length-1)),p=Math.max(1,Math.floor(i/c)),m=Math.max(0,e.length-p),{start:f,end:g}=r?HR(r,e.length,d,i):s?{start:Math.min(m,Math.max(0,d-p+1)),end:Math.min(m,Math.max(0,d-p+1))+p}:{start:Math.min(m,Math.floor(d/p)*p),end:Math.min(m,Math.floor(d/p)*p)+p},h=Math.max(1,g-f),x=e.slice(f,g),b=e.length>h,R=i,S=b?Math.max(1,Math.floor(h/e.length*R)):R,A=Math.max(0,R-S),w=Math.max(1,e.length-h),P=b?Math.floor(f/w*A):0;return za.createElement(kd,{flexDirection:"row",height:i,width:"100%"},za.createElement(kd,{flexDirection:"column",flexGrow:1,height:i},x),za.createElement(kd,{flexDirection:"column",width:1,height:R},Array.from({length:R}).map((M,O)=>za.createElement(UR,{key:O,color:b&&O>=P&&O<P+S?y.accent:y.secondary},b?"\u2502":" "))))};import{Box as Or,Text as Fr}from"ink";import Nt from"react";var bh,Dd,WR=()=>{let{eventLog:e=[]}=v();if(Dd&&bh===e)return Dd;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return bh=e,Dd=t,t},Ka=e=>WR().has(e);import{Text as GR}from"ink";import VR from"react";var po=({id:e,isSelected:t,maxWidth:n})=>{let o=N.getContributor(e);if(!o)return;let r=o.name,s=n===void 0?r:_n(r,n);return VR.createElement(GR,{underline:t,color:ze(r)},"@"+s,Ka(e)?"":"\u2197")};import{Text as zR}from"ink";import KR from"react";var Dr=({id:e,isSelected:t,maxWidth:n})=>{let o=N.getTag(e);if(!o)return;let r=n===void 0?o.name:_n(o.name,n);return KR.createElement(zR,{underline:t,backgroundColor:ze(o.name),color:y.secondary}," "+r+" ")};import{useEffect as qR,useState as YR}from"react";var XR=80,xh=1400,qa=new Set,Xs=null,JR=e=>(qa.add(e),Xs||(Xs=setInterval(()=>{for(let t of qa)t()},XR)),()=>{qa.delete(e),qa.size===0&&Xs&&(clearInterval(Xs),Xs=null)}),QR=()=>{let e=Date.now()%xh/xh;return e<.5?e*2:(1-e)*2},Br=e=>{let[,t]=YR(0);return qR(()=>{if(e)return JR(()=>t(n=>n+1))},[e]),Xi(QR())};var ZR=(e,t,n)=>{if(e.length<=t)return[e,null];let o=e.lastIndexOf(" ",t),r=o>0?o:t;return[e.slice(0,r),_n(e.slice(r).trim(),n)]},Ih=3,eC=2,tC=(e,t)=>{let n=[],o=0;for(let[r,s]of e.entries()){let i=e.length-r-1,c=i>0?String(i).length+1:0;if(o+s.width+c>t)break;o+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},Eh=({width:e,ticket:t,isSelected:n,isFlashing:o=!1})=>{let r=Br(o),s=e-4,i=s-7-1,[c,d]=ZR(Ee(t.title),i,s),p=d?null:_n(Ee(t.props.description),s)||null,m=bn(t),f=xn(t).map(S=>({...S,name:S.name})),g=Math.max(1,s-Ih),h=N.getCommentsByIssue(t.id),x=h.length?String(h.length).length+2+1:0,{shown:b,hidden:R}=tC([...m.map(S=>({id:S.id,isTag:!0,width:Math.min(S.name.length,g)+Ih})),...f.map(S=>({id:S.id,isTag:!1,width:Math.min(S.name.length,g)+eC+(Ka(S.id)?0:1)}))],s-x);return Nt.createElement(Or,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:o?r:n?y.accent:y.secondary,justifyContent:"space-between"},Nt.createElement(Or,{paddingLeft:1,paddingRight:1,flexDirection:"column"},Nt.createElement(Or,{justifyContent:"space-between"},Nt.createElement(Fr,{color:y.primary},c),Nt.createElement(Fr,{color:y.secondary2,dimColor:!0},H(t.id))),d&&Nt.createElement(Fr,{color:y.primary},d),p&&Nt.createElement(Fr,{color:y.secondary2,dimColor:!0},p)),Nt.createElement(Or,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},Nt.createElement(Or,{flexDirection:"row"},b.map(S=>Nt.createElement(Or,{paddingRight:1,key:S.id},S.isTag?Nt.createElement(Dr,{id:S.id,maxWidth:g}):Nt.createElement(po,{id:S.id,maxWidth:g}))),R>0&&Nt.createElement(Fr,{color:y.secondary2,dimColor:!0},"+",R)),h.length>0&&Nt.createElement(Fr,{color:y.accent},"[",h.length,"]")))};import{Box as Go,Text as Js}from"ink";import Ot from"react";var nC=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Sh=({index:e,labelWidth:t,width:n,ticket:o,isSelected:r,isFlashing:s=!1,mode:i})=>{let c=Br(s),d=(o.props.tags??[]).map(M=>N.getTag(M)).filter(M=>!!M),p=(o.props.assignees??[]).map(M=>N.getContributor(M)).map(M=>M&&{...M,name:M.name}).filter(M=>!!M),m=1,f=d.length*(1+m),g=p.length*(2+m),h=d.map(M=>Ot.createElement(Go,{key:M.id,paddingRight:m},Ot.createElement(Js,{color:ze(M.name)},"\u25A0"))),x=p.map(M=>Ot.createElement(Go,{key:M.id,paddingRight:m},Ot.createElement(Js,{color:_c(M.name)},"@"+M.name.at(0)))),b=s?c:r?y.accent:i===I.MOVE?y.secondary:y.primary,R=N.getCommentsByIssue(o.id),S=R.length?String(R.length).length+2+m:0,A=R.length?Ot.createElement(Go,{paddingRight:m},Ot.createElement(Js,{color:y.accent},"[",R.length,"]")):null,w=f+g+S,P=Math.max(1,n-t-w-(w>0?1:0));return Ot.createElement(Go,{justifyContent:"space-between"},Ot.createElement(Go,null,Ot.createElement(Go,{width:t},r?Ot.createElement(Ct,{isSelected:!0}):Ot.createElement(Js,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),Ot.createElement(Js,{wrap:"truncate",color:b},nC(o.title,P))),Ot.createElement(Go,null,h,x,A))};var sC=({swimlane:e,isSelected:t,width:n,height:o,isDense:r,isFocused:s,listSelectedIndex:i,mode:c})=>{let{renderedChildrenIndex:d,replay:p}=ne(),m=d[e.id]??[],f=p?new Set(p.flashNodeIds):null,g=f?.has(e.id)??!1,h=Br(g),x=`${e.title} ${oC.hex(y.secondary2).dim("("+m.length+")")}`,b=3,R=r?1:5,S=s&&i===-1,A=n-3-(r?1:0)-(S?2:0),w=Math.max(2,String(m.length).length+1),P=o-b-1,M=wn.createElement(Bd,{borderStyle:"round",borderColor:y.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:r?1:0},wn.createElement(Ct,{isSelected:t}),wn.createElement(rC,{bold:!0,color:g?h:t?y.accent:y.primary},x," ",e.readonly?"\u{1F512}":"")),O=(W,Y)=>{let xe=s&&i===Y;if(!_(W))return null;let F=f?.has(W.id)??!1;return r?wn.createElement(Sh,{key:W.id,index:Y,labelWidth:w,width:A,ticket:W,isSelected:xe,isFlashing:F,mode:c}):wn.createElement(Eh,{key:W.id,width:A,ticket:W,isSelected:xe,isFlashing:F})};return wn.createElement(Bd,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?y.accent:y.secondary,paddingRight:0,paddingLeft:r?1:0,height:o},M,wn.createElement(Bd,null,m.length>0&&wn.createElement(ut,{selectedIndex:i,height:P,itemHeight:R},m.map(O)),S&&wn.createElement(Ct,{isSelected:!0})))},Rh=wn.memo(sC);import{Box as Vr,Text as EN}from"ink";import At,{useMemo as zr}from"react";var Ch=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},Nh=(e,t,n)=>Re.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});var Ah=e=>e.action==="add.issue.comment";import{Box as _r,Text as zn}from"ink";import mt,{useEffect as iC,useMemo as aC,useRef as lC}from"react";import{decodeTime as wh}from"ulid";var go=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:o,ms:r}of n){let s=Math.floor(t/r);if(s>=1)return`${s}${o} ago`}return"just now"},Ya=e=>String(e).padStart(2,"0"),Xa=e=>`${e.getFullYear()}-${Ya(e.getMonth()+1)}-${Ya(e.getDate())} ${Ya(e.getHours())}:${Ya(e.getMinutes())}`;var cC=e=>Me(e,"attachments"),dC=e=>N.getAttachmentsByIssue(e.id).sort((t,n)=>wh(t.id)-wh(n.id)),Th=e=>{for(let t of e)N.deleteNode(t.id)},uC=(e,t,n)=>Re.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),mC=(e,t)=>{let n=N.getNode(cC(e.id));if(!n||!at(n))return[];let o=t.map((r,s)=>uC(r,s,n.id)).map(r=>N.createNode(r)).filter(ve).map(({value:r})=>r).filter(at);return t.length>0&&v().selectedIndex<0&&$.navigate({contextNode:n,selectedIndex:0}),o},pC=e=>`${Math.max(1,Math.round(e/1024))} KB`;function Mh({ticket:e,width:t,height:n}){let o=aC(()=>dC(e),[e]),r=lC([]);iC(()=>(Th(r.current),r.current=mC(e,o),()=>{Th(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=ne(),c=Math.max(1,n-4),d=Math.max(12,t-32);return o.length===0?mt.createElement(_r,{flexDirection:"column",width:t,height:n,padding:1},mt.createElement(zn,{color:y.primary},"No attachments yet."),mt.createElement(_r,{paddingTop:1},mt.createElement(zn,{color:y.primary},"Attach images from the browser GUI"),mt.createElement(zn,{color:y.accent}," epiq gui "),mt.createElement(zn,{color:y.primary},"by dropping or pasting them."))):mt.createElement(_r,{flexDirection:"column",width:t,height:n},mt.createElement(_r,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},mt.createElement(zn,{color:y.secondary2},"Attachments (",o.length,") \u2014 enter to open"," ")),mt.createElement(ut,{height:c,itemHeight:2,selectedIndex:s},o.map((p,m)=>{let f=m===s,g=p.name.length>d?p.name.slice(0,d-1)+"\u2026":p.name;return mt.createElement(_r,{key:p.id,flexDirection:"row",paddingX:1,paddingBottom:1},mt.createElement(zn,{color:y.accent},f?"\u276F ":" "),mt.createElement(_r,{paddingLeft:1},mt.createElement(zn,{color:y.secondary2},`#${m+1} `),mt.createElement(zn,{color:f?y.accent:y.primary},g),mt.createElement(zn,{color:y.secondary2}," "+pC(p.bytes)+" "+go(De(p.id)))))})))}import{Box as ho,Text as yo}from"ink";import Ye,{useEffect as EC,useMemo as Gh,useRef as SC}from"react";import{decodeTime as Vh}from"ulid";var Lh=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,Od=e=>e.replace(Lh,""),fC=e=>`<!-- epiq-diff-comment:${JSON.stringify(e).replaceAll(">","\\u003e")} -->`,Ph=e=>e==="additions"||e==="deletions",Qs=e=>{let t=Lh.exec(e);if(!t?.[1])return null;let n;try{n=JSON.parse(t[1])}catch{return null}let o=n;return typeof o?.filePath!="string"||typeof o.start!="number"||typeof o.end!="number"||typeof o.note!="string"||!Ph(o.side)||!Ph(o.endSide)||o.sha!==void 0&&typeof o.sha!="string"||o.issueRef!==void 0&&typeof o.issueRef!="string"?null:o};var kh=/```\n([\s\S]*?)\n?```\s*$/,Dh=e=>kh.exec(e)?.[1]??null,gC=/`[^`\n]+`[^\n]*\n?$/,Bh=e=>Od(e).replace(kh,"").replace(gC,"").trim(),Oh=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})`},Fd=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${Oh(e)}`;var hC=e=>{let t=e.split(`
|
|
70
|
+
`),n=t.filter(o=>o.trim()!=="").reduce((o,r)=>{let s=/^[ \t]*/.exec(r)?.[0].length??0;return o===null?s:Math.min(o,s)},null);return n?t.map(o=>o.slice(n)).join(`
|
|
71
|
+
`):e},Fh=({snippet:e,...t})=>{let n=t.note.trim();return[...n?[n,""]:[],fC({...t,note:n}),`\`${t.filePath}\` ${Oh(t)}`,"```",hC(e),"```"].join(`
|
|
72
|
+
`)};var yC=(e,t)=>{let n=Math.max(1,Math.floor(t)),o=e.split(/\s+/).filter(Boolean);if(o.length===0)return[""];let r=[],s="";for(let i of o){let c=i;for(;c.length>n;)s&&(r.push(s),s=""),r.push(c.slice(0,n)),c=c.slice(n);s?s.length+1+c.length<=n?s=`${s} ${c}`:(r.push(s),s=c):s=c}return s&&r.push(s),r},Zs=e=>{let t=e.split("`");return t.length%2===0?[{text:e}]:t.map((n,o)=>o%2===1?{text:n,code:!0}:{text:n}).filter(n=>n.text.length>0)},vC=/!\[([^\]]*)\]\([^)]*\)/g,bC=e=>e.replace(vC,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),xC=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),IC=4,ei=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(IC)),_d=e=>{let t=!1;return e.map(ei).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let o=Qs(n);if(o)return{kind:"caption",text:Fd(o)};let r=bC(n);if(r.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(r);return s?{kind:"heading",spans:Zs(s[1]??"")}:{kind:"text",spans:Zs(r)}})},jh=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],_h=(e,t)=>{let n=[];for(let o of _d(e))if(o.kind!=="fence"){if(o.kind==="blank"){n.length>0&&n[n.length-1]?.kind!=="blank"&&n.push(o);continue}if(o.kind==="code"){for(let r of jh(o.text,t))n.push({kind:"code",text:r});continue}if(o.kind==="caption"){n.push(o);continue}for(let r of yC(xC(o.spans),t))n.push({kind:o.kind,spans:Zs(r)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},$h=(e,t)=>{let n=Qs(e),o=n?Dh(e):null;if(!n||o===null)return _h(Od(e).split(`
|
|
73
|
+
`),t);let r=Bh(e),s=o.split(`
|
|
74
|
+
`).map(ei),i=n.side===n.endSide?n.start:void 0,c=i===void 0?0:String(i+s.length-1).length+3;return[...r?[..._h(r.split(`
|
|
75
|
+
`),t),{kind:"blank"}]:[],{kind:"caption",text:Fd(n)},...s.flatMap((d,p)=>jh(d,Math.max(1,t-c)).map((m,f)=>({kind:"code",text:m,number:i===void 0||f>0?void 0:i+p})))]};import{Box as Uh,Text as Vo}from"ink";import Gt from"react";var Hh=({spans:e,bold:t,wrap:n})=>Gt.createElement(Vo,{color:y.primary,bold:t,wrap:n},e.map((o,r)=>o.code?Gt.createElement(Vo,{key:r,color:y.yellow},o.text):Gt.createElement(Vo,{key:r},o.text))),jd=({line:e,width:t,gutter:n=0,wrap:o})=>{switch(e.kind){case"blank":return Gt.createElement(Vo,null," ");case"fence":return Gt.createElement(Vo,{color:y.secondary2},"```");case"caption":return Gt.createElement(Vo,{color:y.accent,wrap:o},e.text);case"heading":return Gt.createElement(Hh,{spans:e.spans,bold:!0,wrap:o});case"text":return Gt.createElement(Hh,{spans:e.spans,wrap:o});case"code":{let r=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return Gt.createElement(Vo,{backgroundColor:y.secondary,color:y.primary,wrap:o},r,e.text.padEnd(Math.max(0,t-r.length)))}}},Wh=({lines:e,width:t})=>{let n=e.flatMap(r=>r.kind==="code"&&r.number!==void 0?[r.number]:[]),o=n.length>0?String(Math.max(...n)).length+3:0;return Gt.createElement(Uh,{flexDirection:"column"},e.map((r,s)=>Gt.createElement(Uh,{key:s},Gt.createElement(jd,{line:r,width:t,gutter:o}))))};var RC=4,CC=e=>Me(e,"comments"),NC=e=>N.getCommentsByIssue(e.id).sort((t,n)=>Vh(t.id)-Vh(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,md:t.md})),zh=e=>{for(let t of e)N.deleteNode(t.id)},AC=(e,t)=>{let n=N.getNode(CC(e.id));if(!n||!at(n))return[];let o=t.map((r,s)=>Nh(r,s,n.id)).map(N.createNode).filter(ve).map(({value:r})=>r).filter(Rs);return t.length>0&&v().selectedIndex<0&&$.navigate({contextNode:n,selectedIndex:0}),o};function Kh({ticket:e,width:t,height:n}){let o=Gh(()=>NC(e),[e]),r=SC([]);EC(()=>(zh(r.current),r.current=AC(e,o),()=>{zh(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=ne(),c=Math.max(1,n-4),d=Math.max(20,t-8),p=Gh(()=>o.map(f=>{let g=$h(f.md,d);return g.length>0?g:[{kind:"blank"}]}),[o,d]),m=p.map(f=>f.length+RC);return o.length===0?Ye.createElement(ho,{flexDirection:"column",width:t,height:n,padding:1},Ye.createElement(yo,{color:y.primary},"No comments yet."),Ye.createElement(ho,{paddingTop:1},Ye.createElement(yo,{color:y.primary},"Use"),Ye.createElement(yo,{color:y.accent}," :comment "),Ye.createElement(yo,{color:y.primary},"to add the first one."))):Ye.createElement(ho,{flexDirection:"column",width:t,height:n},Ye.createElement(ho,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},Ye.createElement(yo,{color:y.secondary2},"Comments (",o.length,") ")),Ye.createElement(ut,{height:c,itemHeights:m,selectedIndex:s},o.map((f,g)=>{let h=g===s;return Ye.createElement(ho,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},Ye.createElement(ho,{flexDirection:"row",paddingBottom:1},Ye.createElement(yo,{color:y.accent},h?"\u276F ":" "),Ye.createElement(ho,{paddingLeft:1},Ye.createElement(yo,{color:y.secondary2},`#${g+1} `),Ye.createElement(po,{id:f.authorId}),Ye.createElement(yo,{color:y.secondary2}," "+go(De(f.id))))),Ye.createElement(ho,{paddingLeft:3,paddingBottom:1},Ye.createElement(Wh,{lines:p[g]??[],width:d})))})))}import{Box as Ko,Text as Tn}from"ink";import Xe,{useEffect as xy,useRef as mN,useState as pN}from"react";var ln=e=>{let t=oe(e??process.cwd());return a(t)?l(t.message):u("Resolved Epiq repo root",t.value)},jr=e=>/^[0-9a-f]{7,40}$/i.test(e);var wC="EPIQ_CACHE_MS",Ja=e=>{let t=process.env[wC];if(t===void 0||t.trim()==="")return e;let n=Number(t);return Number.isFinite(n)&&n>=0?n:e};var $r="",qh="",Yh=5e3,Ur=null;var TC=(e,t,n)=>(t===void 0||e>=Math.floor(t/1e3)*1e3)&&(n===void 0||e<=n),Hr=async(e={})=>{let t=ln(e.repoRoot);if(a(t))return l(t.message);let n=Mt(t.value);if(a(n))return l(n.message);let o=e.start===void 0&&e.end===void 0;if(o&&Ur&&Ur.repoRoot===t.value&&Ur.stateBranch===n.value.stateBranch&&Date.now()-Ur.fetchedAt<Ja(Yh))return u("Computed commit timeline",Ur.result);let r=await U({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=${qh}%H${$r}%at${$r}%an${$r}%ae${$r}%s`]});if(a(r))return l(r.message);let s=r.value.stdout.split(qh).filter(i=>i.trim().length>0).map(i=>{let[c,...d]=i.split(`
|
|
76
|
+
`),[p,m,f,g,...h]=(c??"").split($r);if(!p||!m)return null;let x=d.join(" "),b=Number(/(\d+) insertion/.exec(x)?.[1]??0),R=Number(/(\d+) deletion/.exec(x)?.[1]??0);return{sha:p,time:Number(m)*1e3,author:f??"unknown",authorEmail:g??"",subject:h.join($r),linesChanged:b+R,insertions:b,deletions:R}}).filter(i=>i!==null).filter(i=>TC(i.time,e.start,e.end));return o&&(Ur={repoRoot:t.value,stateBranch:n.value.stateBranch,fetchedAt:Date.now(),result:s}),u("Computed commit timeline",s)},Kn=async e=>{let t=e.ref.trim();if(!t)return l("ref must not be empty");if(t.length!==7)return l(`"${t}" is ${t.length} characters; a ref is ${7}. Read it off the issue rather than slicing the id by hand.`);let n=await Hr({repoRoot:e.repoRoot});if(a(n))return l(n.message);let o=`${t.toUpperCase()} `,r=c=>c.subject.toUpperCase().startsWith(o),s=n.value,i=[];for(let[c,d]of s.entries()){if(!r(d))continue;let p=s[c+1];i.push({...d,precedingSha:p&&r(p)?p.sha:null})}return u("Matched commits by ref",i)};var $d=async e=>{if(!jr(e.sha))return l("Invalid commit sha");let t=ln(e.repoRoot);if(a(t))return l(t.message);let n=await U({cwd:t.value,args:["show","--no-ext-diff","--no-color","--patch","--find-renames","--format=",e.sha]});return a(n)?l(n.message):u("Read commit patch",n.value.stdout)},MC=200,Xh=e=>/^0+$/.test(e),Qa=/^:\d{6} \d{6} ([0-9a-f]{40}) ([0-9a-f]{40}) [A-Z]\d*\t(.+)$/,Jh=/^(\d+|-)\t(\d+|-)\t(.+)$/,Zh=async(e,t,n,o)=>{let r=await U({cwd:e,args:["diff","--raw","--numstat","--no-renames","--abbrev=40",t,n,...o&&o.length>0?["--",...o]:[]]});if(a(r))return l(r.message);let s=r.value.stdout.split(`
|
|
77
|
+
`).filter(p=>p!==""),i=s.filter(p=>!Qa.test(p)&&!Jh.test(p));if(i.length>0)return l(`Could not parse ${i.length} line(s) of "git diff --raw --numstat" output, e.g. "${i[0]}"`);let c=new Map;for(let p of s){let m=Jh.exec(p);m&&c.set(m[3]??"",{insertions:m[1]==="-"?0:Number(m[1]),deletions:m[2]==="-"?0:Number(m[2]),isBinary:m[1]==="-"&&m[2]==="-"})}let d=s.filter(p=>Qa.test(p)).map(p=>{let m=Qa.exec(p),f=m?.[1]??"",g=m?.[2]??"",h=m?.[3]??"";return{path:h,beforeBlob:Xh(f)?null:f,afterBlob:Xh(g)?null:g,...c.get(h)??{insertions:0,deletions:0,isBinary:!1}}});return u("Listed changed files with blob hashes",d)},ey=async(e,t)=>{if(t.length>MC)return l(`${t.length} files changed \u2014 too many to show as a diff`);let n=t.flatMap(s=>s.isBinary?[]:[s.beforeBlob,s.afterBlob].filter(i=>i!==null)),o=await Wi(n,e);if(a(o))return l(o.message);let r=o.value;return u("Read changed file contents",t.map(s=>({path:s.path,before:s.isBinary||!s.beforeBlob?"":r.get(s.beforeBlob)??"",after:s.isBinary||!s.afterBlob?"":r.get(s.afterBlob)??"",insertions:s.insertions,deletions:s.deletions,isBinary:s.isBinary})))},Ud=async e=>{if(!jr(e.sha))return l("Invalid commit sha");let t=ln(e.repoRoot);if(a(t))return l(t.message);let n=t.value,o=await Zh(n,`${e.sha}~1`,e.sha);if(a(o))return l(o.message);if(o.value.length===0)return l("No changed files found for this commit");let r=await ey(n,o.value);if(a(r))return l(r.message);let s=r.value;return u("Loaded commit diff",{sha:e.sha,files:s})},PC=/^[0-9a-f]{40}$/,LC=async(e,t,n)=>{let o=await U({cwd:e,args:["log","--raw","--no-renames","--abbrev=40","--format=%H",`${t}..${n}`]});if(a(o))return l(o.message);let r=new Map,s=null;for(let i of o.value.stdout.split(`
|
|
78
|
+
`)){if(PC.test(i)){s=new Set,r.set(i,s);continue}let c=Qa.exec(i);c&&s&&s.add(c[3]??"")}return u("Listed changed paths per commit",r)},Qh=e=>{let t=new Set;for(let n of e)for(let o of n)t.add(o);return t},kC=async(e,t,n)=>{if(t===n)return!0;let o=await U({cwd:e,args:["merge-base","--is-ancestor",t,n]});return!a(o)},DC="4b825dc642cb6eb9a060e54bf8d69288fbee4904",BC=async(e,t)=>{let n=await U({cwd:e,args:["rev-parse","--verify","--quiet",`${t}^1`]});return a(n)?DC:`${t}~1`},Hd=async e=>{let t=ln(e.repoRoot);if(a(t))return l(t.message);let n=t.value,o=await Kn({repoRoot:n,ref:e.ref});if(a(o))return l(o.message);let r=o.value;if(r.length===0)return l("No commits reference this ticket");let s=r[0].sha,i=s;for(let w=r.length-1;w>0;w--){let P=r[w].sha;if(await kC(n,P,s)){i=P;break}}let c=await BC(n,i),d=await LC(n,c,s);if(a(d))return l(d.message);let p=d.value,m=new Set(r.map(w=>w.sha)),f=[...p.keys()].filter(w=>m.has(w)),g=f.length===p.size,h=new Map;for(let w of f)for(let P of p.get(w)??[])h.has(P)||h.set(P,w);let x=(w,P)=>u("Loaded squashed diff",{ref:e.ref.trim().toUpperCase(),from:c,to:s,commits:f.length,files:w.map(M=>({...M,sha:h.get(M.path)??s})),contiguous:g,overlappingPaths:P}),b,R=[];if(!g){let w=Qh(f.map(M=>p.get(M)??new Set)),P=Qh([...p.entries()].filter(([M])=>!m.has(M)).map(([,M])=>M));if(w.size===0)return x([],[]);b=[...w],R=[...w].filter(M=>P.has(M)).sort()}let S=await Zh(n,c,s,b);if(a(S))return l(S.message);let A=await ey(n,S.value);return a(A)?l(A.message):x(A.value,R)};var OC=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/,Za=e=>{if(!e.startsWith('"')||!e.endsWith('"'))return e;let t=e.slice(1,-1),n="";for(let o=0;o<t.length;o++){if(t[o]!=="\\"){n+=t[o];continue}let r=t[++o];if(r==="n")n+=`
|
|
79
|
+
`;else if(r==="t")n+=" ";else if(r==='"'||r==="\\")n+=r;else if(r&&/[0-7]/.test(r)){let s=t.slice(o,o+3);n+=String.fromCharCode(parseInt(s,8)),o+=2}else r!==void 0&&(n+=r)}try{return decodeURIComponent(escape(n))}catch{return n}},ty=e=>{let t=Za(e.trim());return t==="/dev/null"?null:t.replace(/^[ab]\//,"")},Gd=e=>{let t=[],n=null,o=0,r=0,s=()=>{let i={path:"",oldPath:null,binary:!1,added:0,removed:0,lines:[]};return t.push(i),i};for(let i of e.split(`
|
|
80
|
+
`)){if(i.startsWith("diff --git ")){n=s();let m=i.slice(11),f=m.lastIndexOf(" b/");f!==-1&&(n.path=Za(m.slice(f+1)).replace(/^b\//,""));continue}if(!n){if(!i.trim())continue;n=s()}let c=n,d=c.lines.length===0;if(d&&i.startsWith("--- ")){let m=ty(i.slice(4));m&&(c.oldPath=m);continue}if(d&&i.startsWith("+++ ")){let m=ty(i.slice(4));m&&(c.path=m);continue}if(d&&i.startsWith("rename from ")){c.oldPath=Za(i.slice(12));continue}if(d&&i.startsWith("rename to ")){c.path=Za(i.slice(10));continue}if(d&&(i.startsWith("Binary files ")||i.startsWith("GIT binary patch"))){c.binary=!0,c.lines.push({kind:"note",text:"Binary file"});continue}let p=OC.exec(i);if(p){o=Number(p[1]),r=Number(p[3]),c.lines.push({kind:"hunk",text:i});continue}if(!d){if(i.startsWith("\\")){c.lines.push({kind:"note",text:i.slice(1).trim()});continue}if(i.startsWith("+")){c.added++,c.lines.push({kind:"added",text:i.slice(1),newLine:r++});continue}if(i.startsWith("-")){c.removed++,c.lines.push({kind:"removed",text:i.slice(1),oldLine:o++});continue}if(i.startsWith(" ")){c.lines.push({kind:"context",text:i.slice(1),oldLine:o++,newLine:r++});continue}i===""&&c.lines.push({kind:"context",text:"",oldLine:o++,newLine:r++})}}for(let i of t)!i.path&&i.oldPath&&(i.path=i.oldPath);return t.filter(i=>i.path!=="")},Wd=e=>e.oldPath&&e.oldPath!==e.path?e.oldPath:null;var Vd=e=>e.flatMap(t=>[{kind:"file",text:`${Wd(t)?`${Wd(t)} \u2192 `:""}${t.path}`,file:t},...t.lines]),el=e=>{let t="",n=-1;return e.map(o=>(o.kind==="file"&&(t=o.file.path),o.kind==="hunk"&&n++,{file:t,hunk:n}))},zd=(e,t,n)=>{let o=t.map(i=>Qs(i.md)).filter(i=>i!==null&&i.sha===n&&i.side==="additions");if(o.length===0)return new Set;let r=el(e),s=new Set;return e.forEach((i,c)=>{let d=i.newLine;if(d===void 0)return;let p=r[c]?.file;o.some(m=>m.filePath===p&&m.start<=d&&d<=m.end)&&s.add(c)}),s},ny=(e,t)=>e===t?`line:${e}`:`lines:${e}-${t}`,FC=/^lines?:(\d+)(?:-(\d+))?(?:\s+|$)/,oy=e=>{let t=FC.exec(e);if(!t)return null;let n=Number(t[1]),o=t[2]===void 0?n:Number(t[2]);return{start:Math.min(n,o),end:Math.max(n,o),note:e.slice(t[0].length)}},ry=(e,t)=>el(e)[t]?.file??null,sy=(e,t,n,o)=>{let r=el(e),s=d=>e.findIndex((p,m)=>r[m]?.file===t&&(p.kind==="added"||p.kind==="context")&&p.newLine===d),i=s(n),c=s(o);return i===-1||c===-1?{ok:!1,reason:`${t} has no line ${i===-1?n:o} on the new side`}:Kd(e,i,c)},Kd=(e,t,n)=>{let[o,r]=t<=n?[t,n]:[n,t],s=e[o],i=e[r];if(!s||!i)return{ok:!1,reason:"That line is not in the diff"};let c=g=>(g.kind==="added"||g.kind==="context")&&g.newLine!==void 0;if(!c(s)||!c(i))return{ok:!1,reason:"Comments anchor to the new side: pick an added or unchanged line"};let d=el(e),p=d[o],m=d[r];if(p.file!==m.file)return{ok:!1,reason:"A comment covers one file at a time"};if(p.hunk!==m.hunk)return{ok:!1,reason:"A comment covers one hunk at a time"};let f=e.slice(o,r+1).filter(c);return{ok:!0,value:{filePath:p.file,start:f[0].newLine,end:f[f.length-1].newLine,snippet:f.map(g=>g.text).join(`
|
|
81
|
+
`)}}};import{existsSync as Jd}from"node:fs";import{chmod as Qd}from"node:fs/promises";import nl from"node:path";import{spawn as _C,spawnSync as jC}from"node:child_process";import $C from"node:os";import iy from"node:path";import{ulid as UC}from"ulid";function qd(e){let t=[],n="",o=!1,r=null;for(let s of e.trim()){if(r){s===r?r=null:n+=s;continue}if(s==='"'||s==="'"){r=s,o=!0;continue}if(/\s/.test(s)){o&&t.push(n),n="",o=!1;continue}n+=s,o=!0}return o&&t.push(n),t}function HC(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function tl(){let{preferredEditor:e}=V(),t=[e?HC(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Yd(e){let[t=""]=qd(e);return/(^|\/)code(-insiders)?$/.test(t)}function ay(e,t){let[n="",...o]=qd(e);return{command:n,args:[...o,...t]}}function ly(e,t){return ay(e,Yd(e)?["--wait",t]:[t])}function WC(e,t,n,o="new"){return ay(e,[o==="new"?"--new-window":"--reuse-window","--diff",t,n])}function cy(e){let t=iy.join($C.tmpdir(),"epiq");rt.mkDir(t);let n=iy.join(t,UC());rt.writeToFile(n,e??"");let o=tl();for(let r of o){let{command:s,args:i}=ly(r,n);if(!s)continue;let c=jC(s,i,{stdio:"inherit"});if(!c.error&&c.status===0){let d=rt.readFile(n);if(d==null)return l("Unable to read edited file");let p=d.replace(/\r?\n$/,"");return u("Successfully edited",p)}}return l("Unable to open editor")}var GC=new Set(["vim","vi","nvim","nano","pico","ed"]);function VC(e){let[t=""]=qd(e),n=t.split("/").pop()??t;return GC.has(n)}var zC=600;function dy({command:e,args:t},n){return new Promise(o=>{if(!e){o(l(`"${n}" is not a usable editor command`));return}let r=_C(e,t,{stdio:"ignore",detached:!0}),s=!1,i=d=>{s||(s=!0,clearTimeout(c),o(d))};r.on("error",d=>i(l(d.message))),r.on("exit",d=>{i(d===0?u("Opened editor",!0):l(`"${n}" exited with code ${d}`))});let c=setTimeout(()=>{r.unref(),i(u("Opened editor",!0))},zC)})}function KC(e,t){return VC(e)?Promise.resolve(l(`"${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}`)):dy(ly(e,t),e)}function Xd(e,t,n,o="new"){return dy(WC(e,t,n,o),e)}async function uy(e){let t=tl();if(t.length===0)return l("No editor configured (preferredEditor, VISUAL, or EDITOR)");let n=l("Unable to open editor");for(let o of t){let r=await KC(o,e);if(!a(r))return r;n=r,logger.error(`Failed to open editor "${o}" for ${e}: ${r.message}`)}return n}import{chmodSync as qC,existsSync as YC,lstatSync as XC,mkdirSync as JC}from"node:fs";import QC from"node:os";import ZC from"node:path";var ti=(...e)=>{let t=ZC.join(QC.tmpdir(),"epiq",...e);try{return YC(t)&&XC(t).isSymbolicLink()?l(`Refusing to write through a symlink at ${t}`):(JC(t,{recursive:!0,mode:448}),qC(t,448),u("Prepared private temp dir",t))}catch(n){return l(`Unable to prepare ${t}: ${n instanceof Error?n.message:String(n)}`)}};var eN=async(e,t)=>{let n=await U({cwd:e,args:["show",t]});if(a(n))return l(n.message);let o=ti("commit-diffs");if(a(o))return l(o.message);let r=nl.join(o.value,`${t}.diff`);return Jd(r)||(rt.writeToFile(r,n.value.stdout),await Qd(r,292)),uy(r)},tN=12,nN=800,my=async(e,t,n)=>{let o=await U({cwd:e,args:["show",`${t}:${n}`]});return a(o)?"":o.value.stdout},oN=async(e,t)=>{let n=await U({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(a(n))return l(n.message);let o=n.value.stdout.split(`
|
|
82
|
+
`).map(r=>r.trim()).filter(Boolean);return o.length===0?l("No changed files found for this commit"):u("Listed changed files",o)},rN=async(e,t,n)=>{let o=await oN(e,t);if(a(o))return l(o.message);let r=o.value;if(r.length>tN)return l(`Commit touches ${r.length} files \u2014 too many for a side-by-side view`);let s=ti("commit-diffs",t);if(a(s))return l(s.message);let i=s.value,c=await Promise.all(r.map(async(g,h)=>{let[x,b]=await Promise.all([my(e,`${t}~1`,g),my(e,t,g)]),R=nl.basename(g),S=nl.join(i,String(h),"before",R),A=nl.join(i,String(h),"after",R);return Jd(S)||(rt.writeToFile(S,x),await Qd(S,292)),Jd(A)||(rt.writeToFile(A,b),await Qd(A,292)),{beforePath:S,afterPath:A}})),[d,...p]=c;if(!d)return l("No changed files found for this commit");let m=await Xd(n,d.beforePath,d.afterPath,"new");if(a(m)||p.length===0)return m;await new Promise(g=>setTimeout(g,nN));let f=await Promise.all(p.map(({beforePath:g,afterPath:h})=>Xd(n,g,h,"reuse")));for(let g of f)a(g)&&logger.error(`Failed to open an additional diff tab for ${t}: ${g.message}`);return m},ni=async e=>{if(!jr(e.sha))return l("Invalid commit sha");let t=ln(e.repoRoot);if(a(t))return l(t.message);let n=t.value,o=tl()[0];if(o&&Yd(o)){let r=await rN(n,e.sha,o);if(!a(r))return r;logger.error(`Side-by-side diff failed for ${e.sha}, falling back to unified diff: ${r.message}`)}return eN(n,e.sha)};import{Box as cn,Text as qn}from"ink";import Fe,{useEffect as nu,useMemo as hy,useRef as aN,useState as lN}from"react";var ol=(e,t,n)=>{let o=[],r=Aa(()=>{for(let s=0;s<t;s++){let i=Bt(BigInt(s+1));if(!ve(i))continue;let c=N.createNode(Re.text({id:n(s),name:`Line ${s+1}`,parentNodeId:e,rank:i.value,readonly:!0,isVirtual:!0}));ve(c)&&o.push(c.value)}});return a(r)&&logger.error(`Line nodes: ${r.message}`),o},Wr=e=>{N.deleteNodes(e.map(t=>t.id))};import{useSyncExternalStore as sN}from"react";var sl=null,rl=null,Zd=new Set,py=()=>{for(let e of Zd)e()},eu=e=>{sl=e,py()},il=()=>sl,fy={mark:null},zo=e=>{rl=e,fy={mark:e},py()};var tu=e=>rl&&rl.sha===e?rl.row:null,gy=()=>sN(e=>(Zd.add(e),()=>{Zd.delete(e)}),()=>fy),vo=()=>{let{contextNode:e}=v();return sl&&sl.sha===e.id?e.id:null};import cN from"string-width";var ou=(e,t)=>`${e}::patch::${t}`,dN=e=>{switch(e){case"added":return y.green;case"removed":return y.red;case"hunk":return y.accent;case"file":return y.primary;default:return y.secondary2}},yy=(e,t)=>{let n=cN(e);return n>=t?e:e+"\xA0".repeat(t-n)},uN=e=>e==="added"?"+":e==="removed"?"-":" ",vy=e=>e.kind==="file"||e.kind==="hunk"||e.kind==="note"||e.newLine===void 0?"":String(e.newLine);function by({ticket:e,sha:t,subject:n,width:o,height:r}){let[s,i]=lN({state:"loading"});nu(()=>{let w=!0;return i({state:"loading"}),$d({sha:t}).then(P=>{w&&i(a(P)?{state:"failed",message:P.message}:{state:"loaded",rows:Vd(Gd(P.value))})}),()=>{w=!1}},[t]);let c=s.state==="loaded"?s.rows:null,d=c!==null&&c.length>4e3,p=aN([]);nu(()=>(Wr(p.current),p.current=c&&!d?ol(t,c.length,w=>ou(t,w)):[],()=>{Wr(p.current),p.current=[]}),[t,c,d]),nu(()=>(eu(c?{sha:t,rows:c}:null),zo(null),()=>{eu(null),zo(null)}),[t,c]);let{selectedIndex:m}=ne(),{mark:f}=gy(),g=hy(()=>c?zd(c,N.getCommentsByIssue(e.id),t):new Set,[c,t,e]),h=f&&f.sha===t?f.row:null,x=w=>h!==null&&w>=Math.min(h,m)&&w<=Math.max(h,m),b=hy(()=>c?Math.max(5,c.reduce((w,P)=>Math.max(w,vy(P).length),0)+2):5,[c]),R=Math.max(1,r-4),S=Math.max(8,o-b-6);if(s.state!=="loaded")return Fe.createElement(cn,{flexDirection:"column",width:o,height:r,padding:1},Fe.createElement(qn,{color:y.primary},s.state==="loading"?"Reading the diff\u2026":`Could not read the diff: ${s.message}`));let A=w=>Fe.createElement(cn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},Fe.createElement(qn,{color:y.secondary2,wrap:"truncate-end"},jn(`${t.slice(0,7)} ${n} \u2014 ${w}`,Math.max(8,o-6))));return s.rows.length===0?Fe.createElement(cn,{flexDirection:"column",width:o,height:r},A("no changes"),Fe.createElement(cn,{paddingX:1},Fe.createElement(qn,{color:y.primary},"This commit changed no files."))):d?Fe.createElement(cn,{flexDirection:"column",width:o,height:r},A("too large to draw here"),Fe.createElement(cn,{paddingX:1,flexDirection:"column"},Fe.createElement(qn,{color:y.primary},`${s.rows.length.toLocaleString()} lines of diff.`),Fe.createElement(qn,{color:y.secondary2},"Press o to open it in your editor."))):Fe.createElement(cn,{flexDirection:"column",width:o,height:r},A(h===null?"enter to comment on a line, s to start a range, o editor, q back":"move to the other end, then enter to comment \u2014 s clears the mark"),Fe.createElement(ut,{scrollByOne:!0,height:R,selectedIndex:m,itemHeight:1},s.rows.map((w,P)=>{let M=P===m,O=dN(w.kind);if(w.kind==="file")return Fe.createElement(cn,{key:ou(t,P),paddingX:1},Fe.createElement(qn,{backgroundColor:y.secondary,color:M?y.accent:O,bold:!0,wrap:"truncate-end"},yy(` ${jn(ei(w.text),S)}`,S+b+1)));let W=x(P),Y=`${uN(w.kind)}${jn(ei(w.text),S)}`;return Fe.createElement(cn,{key:ou(t,P),paddingX:1},Fe.createElement(cn,{flexShrink:0},Fe.createElement(qn,{color:M||W?y.accent:y.secondary2,dimColor:!M&&!W,wrap:"truncate-end"},`${M?"\u276F":"\xA0"}${W?"\u258C":"\xA0"}${vy(w).padStart(b-2,"\xA0")}`)),Fe.createElement(cn,{flexShrink:0},Fe.createElement(qn,{color:y.yellow,wrap:"truncate-end"},g.has(P)?"\u2502":"\xA0")),Fe.createElement(qn,{color:M?y.accent:O,backgroundColor:M||W?y.secondary:void 0,wrap:"truncate-end"},M||W?yy(Y,S+1):Y))})))}var fN=e=>Me(e,"diff"),Iy=e=>{for(let t of e)N.deleteNode(t.id)},gN=(e,t,n)=>Re.field({id:e.sha,name:e.subject,parentNodeId:n,rank:String(t).padStart(6,"0"),childRenderAxis:"vertical",isVirtual:!0}),hN=(e,t)=>{let n=N.getNode(fN(e.id));if(!n||!at(n))return[];let o=t.map((r,s)=>gN(r,s,n.id)).map(r=>N.createNode(r)).filter(ve).map(({value:r})=>r).filter(at);return t.length>0&&v().selectedIndex<0&&v().contextNode.id===n.id&&$.navigate({contextNode:n,selectedIndex:0}),o},yN=e=>`+${e.insertions} -${e.deletions}`;function Ey({ticket:e,width:t,height:n}){let[o,r]=pN({state:"loading"}),s=H(e.id);xy(()=>{let x=!0;return r({state:"loading"}),Kn({ref:s}).then(b=>{x&&r(a(b)?{state:"failed",message:b.message}:{state:"loaded",commits:b.value})}),()=>{x=!1}},[s]);let i=mN([]),c=o.state==="loaded"?o.commits:null;xy(()=>(Iy(i.current),i.current=c?hN(e,c):[],()=>{Iy(i.current),i.current=[]}),[e,c]);let{selectedIndex:d,contextNode:p}=ne(),m=c?.find(x=>x.sha===p.id)??null,g=Math.max(1,n-4),h=Math.max(12,t-34);return o.state!=="loaded"?Xe.createElement(Ko,{flexDirection:"column",width:t,height:n,padding:1},Xe.createElement(Tn,{color:y.primary},o.state==="loading"?"Reading commits\u2026":`Could not read commits: ${o.message}`)):m?Xe.createElement(by,{ticket:e,sha:m.sha,subject:m.subject,width:t,height:n}):o.commits.length===0?Xe.createElement(Ko,{flexDirection:"column",width:t,height:n,padding:1},Xe.createElement(Tn,{color:y.primary},"No commits reference this ticket."),Xe.createElement(Ko,{paddingTop:1},Xe.createElement(Tn,{color:y.primary},"Commits are matched by the"),Xe.createElement(Tn,{color:y.accent},` ${s} `),Xe.createElement(Tn,{color:y.primary},"prefix on their subject line."))):Xe.createElement(Ko,{flexDirection:"column",width:t,height:n},Xe.createElement(Ko,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:y.secondary,borderStyle:"single",paddingBottom:1},Xe.createElement(Tn,{color:y.secondary2},`Diff (${o.commits.length}) \u2014 enter to read, o to open in your editor `)),Xe.createElement(ut,{height:g,itemHeight:2,selectedIndex:d},o.commits.map((x,b)=>{let R=b===d,S=x.subject.length>h?x.subject.slice(0,h-1)+"\u2026":x.subject;return Xe.createElement(Ko,{key:x.sha,flexDirection:"row",paddingX:1,paddingBottom:1},Xe.createElement(Tn,{color:y.accent},R?"\u276F ":" "),Xe.createElement(Ko,{paddingLeft:1},Xe.createElement(Tn,{color:y.secondary2},`${x.sha.slice(0,7)} `),Xe.createElement(Tn,{color:R?y.accent:y.primary},S),Xe.createElement(Tn,{color:y.secondary2},` ${yN(x)} ${go(x.time)}`)))})))}import{Box as al,Text as vN}from"ink";import Yn from"react";var Sy=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:o}=ne(),{title:r}=t,s=t.parentNodeId?N.getNode(t.parentNodeId):void 0,i=s&&_(s)?r===Ne.ASSIGNEES?s.props.assignees??[]:r===Ne.TAGS?(s.props.tags??[]).filter(c=>N.getTag(c)):[]:[];return Yn.createElement(al,{alignItems:"center",paddingTop:1},Yn.createElement(al,{minWidth:12},Yn.createElement(Ct,{isSelected:n}),Yn.createElement(vN,{color:n?y.accent:y.secondary2},r,":")),Yn.createElement(al,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((c,d)=>{let p=o.id===t.id&&d===e;return Yn.createElement(al,{key:`${r}-${c}`,paddingRight:2,minHeight:1},Yn.createElement(Ct,{isSelected:p}),r===Ne.ASSIGNEES?Yn.createElement(po,{isSelected:p,id:c}):r===Ne.TAGS?Yn.createElement(Dr,{isSelected:p,id:c}):null)})))};import{Box as Gr,Text as iu}from"ink";import Vt,{useEffect as bN,useMemo as au,useRef as xN}from"react";var ru=e=>Math.max(5,String(Math.max(e,1)).length+3),Ry=(e,t)=>Math.max(0,e-6-ru(t));var su=(e,t=0,n=0)=>Math.max(1,e-5-2*t-(n>0?1+n:0));var IN="\u2029",Cy=(e,t)=>`${e}::inline-line::${t}`,lu=({id:e,label:t,text:n,rows:o,selected:r,maxWidth:s})=>{let{selectedIndex:i,contextNode:c}=ne(),d=au(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),p=au(()=>d.join("\0"),[d]),m=xN([]);bN(()=>(Wr(m.current),m.current=ol(e,d.length,b=>Cy(e,b)),()=>{Wr(m.current),m.current=[]}),[e,p]);let f=ru(d.length),g=Ry(s,d.length),x=au(()=>_d(d).map(b=>{if(b.kind==="code"||b.kind==="caption")return{...b,text:jn(b.text,g)};if(b.kind==="text"||b.kind==="heading"){let R=b.spans.map(S=>S.code?`\`${S.text}\``:S.text).join("");return{...b,spans:Zs(jn(R,g))}}return b}),[d,g]).map((b,R)=>{let S=c.id===e&&i===R;return Vt.createElement(Gr,{key:Cy(e,R)},Vt.createElement(Gr,{flexShrink:0},Vt.createElement(iu,{color:S?y.primary:y.secondary2,dimColor:!S},`${R+1} `.padStart(f,"\xA0"))),b.kind==="blank"?Vt.createElement(iu,{backgroundColor:S?"gray":void 0},IN):Vt.createElement(Gr,null,Vt.createElement(jd,{line:b,width:b.kind==="code"?g:0,wrap:"truncate-end"})))});return Vt.createElement(Gr,{flexDirection:"column",paddingTop:1},Vt.createElement(Gr,null,Vt.createElement(Ct,{isSelected:r}),Vt.createElement(iu,{color:r?y.accent:y.secondary2},t)),Vt.createElement(Gr,{flexDirection:"row",borderStyle:"round",borderColor:y.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},Vt.createElement(ut,{scrollByOne:!0,height:o,selectedIndex:i,itemHeight:1},x)))};var SN=e=>Me(e,"description"),RN=e=>Me(e,"comments"),CN=e=>Me(e,"history"),NN=e=>Me(e,"diff"),AN=e=>Me(e,"attachments"),Ny=({ticket:e,height:t})=>{let n=zr(()=>Ch(e),[e]),{selectedIndex:o,contextNode:r}=ne(),s=process.stdout.columns||120,i=zr(()=>SN(e.id),[e.id]),c=zr(()=>RN(e.id),[e.id]),d=zr(()=>CN(e.id),[e.id]),p=zr(()=>NN(e.id),[e.id]),m=zr(()=>AN(e.id),[e.id]),f=N.getAttachmentsByIssue(e.id).length,g=r.id===e.id,h=r.id===c||r.parentNodeId===c,x=r.id===d||r.parentNodeId===d,b=r.id===m||r.parentNodeId===m,R=r.id===p||r.parentNodeId===p,S=le(e.id);if(h){let X=t-3;return At.createElement(Vr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},At.createElement(Kh,{ticket:e,width:s,height:X}))}if(b){let X=t-3;return At.createElement(Vr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},At.createElement(Mh,{ticket:e,width:s,height:X}))}if(R){let X=t-3;return At.createElement(Vr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},At.createElement(Ey,{ticket:e,width:s,height:X}))}if(x){let F=N.getNode(d),X=F&&at(F)?F.props.value??"":"",Ve=su(t);return At.createElement(Vr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},F?At.createElement(lu,{id:F.id,label:"Event log",text:X,selected:!1,maxWidth:s,rows:Ve}):null)}let A=[d,p,c,m],w=F=>A.includes(F),P=S.reduce((F,X)=>Ss(X)?F+1:F,0),M=S.reduce((F,X)=>w(X.id)?F+1:F,0),O=S.findIndex(F=>w(F.id)),W=su(t,P,M),Y=(F,X,Ve,Qn)=>At.createElement(Vr,{key:F.id,paddingTop:X===O?1:0},At.createElement(Ct,{isSelected:Ve}),At.createElement(EN,{backgroundColor:y.secondary,color:Ve?y.accent:y.primary},Qn)),xe=(F,X,Ve)=>F.id===i?At.createElement(lu,{key:F.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:X,maxWidth:s,rows:W}):Ss(F)?At.createElement(Sy,{key:F.id,parent:F,selected:X,selectedIndex:o}):F.id===c?Y(F,Ve,X,` Comments (${n}) \u203A\u203A `):F.id===m?Y(F,Ve,X,` Attachments (${f}) \u203A\u203A `):F.id===d?Y(F,Ve,X," History \u203A\u203A "):F.id===p?Y(F,Ve,X," Diff \u203A\u203A "):null;return At.createElement(Vr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S.map((F,X)=>xe(F,g&&o===X,X)))};var TN=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,viewMode:s,height:i,width:c})=>{let d=t.context,p=d===re.TICKET||d===re.FIELD_LIST||d===re.FIELD,m=d===re.BOARD||d===re.SWIMLANE,f=d===re.TICKET?t:o.find(R=>R.context===re.TICKET),g=Math.floor(c/3),h=Math.floor(c/Math.max(e.length,1)),x=Math.min(h,g),b=s==="dense";return ll.createElement(wN,{flexDirection:"row",height:i},m&&e.map((R,S)=>{let A=t.id===R.id,w=A?n:-1,P=t.context===re.BOARD&&n===S;return ll.createElement(Rh,{key:R.id,height:i,width:x,swimlane:R,isSelected:P,isDense:b,isFocused:A,listSelectedIndex:w,mode:r})}),p&&f&&ll.createElement(Ny,{height:i,ticket:f}))},cl=ll.memo(TN);import{render as LN}from"ink";import{Writable as kN}from"node:stream";var oi=e=>String(e).padStart(2,"0"),DN=e=>{let t=e.getUTCFullYear(),n=oi(e.getUTCMonth()+1),o=oi(e.getUTCDate()),r=oi(e.getUTCHours()),s=oi(e.getUTCMinutes()),i=oi(e.getUTCSeconds());return`${t}-${n}-${o}_${r}-${s}-${i}`},BN=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",ON=async(e,{width:t,height:n})=>{let o="",r=new kN({write(i,c,d){let p=FN(i.toString()).trimEnd();p.trim().length>0&&p.includes("\u256D")&&(o=p),d()}});r.columns=t,r.rows=n,r.isTTY=!0;let s=LN(e,{stdout:r,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),o},FN=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),wy=async()=>{let{viewMode:e}=V(),{contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,renderedChildrenIndex:s}=v(),i=o.find(S=>S.context==="BOARD");if(!i)return l("No board found to export");let c=120,d=40,p=await ON(PN.createElement(cl,{height:d,width:c,swimlanes:(s[i.id]??[]).filter(S=>S!==void 0&&vn(S)),contextNode:t,selectedIndex:n,breadCrumb:o,viewMode:e??"dense",mode:r}),{width:c,height:d});if(!p)return l("Failed to render board export");let m=Hi(process.cwd());if(a(m))return l("Unable to export, epiq root not found");let f=new Date,g=DN(f),h=`board_${BN(i.title)}_${g}.md`,x=sp(m.value);Ay.mkdirSync(x,{recursive:!0});let b=MN.join(x,h),R=`# Board - ${i.title}
|
|
83
83
|
Date: ${f.toISOString()}
|
|
84
84
|
|
|
85
85
|
\`\`\`text
|
|
86
86
|
${p}
|
|
87
87
|
\`\`\`
|
|
88
|
-
`;return
|
|
89
|
-
`).map(d=>d.trim()),s=
|
|
88
|
+
`;return Ay.writeFileSync(b,R,"utf8"),u("Exported board layout",b)};import{useSyncExternalStore as bG}from"react";var dl,_N=new Set,Ty=()=>{for(let e of _N)e()};var bo=()=>{if(!dl)throw new Error("Ui state not initialized. Call initUiState() first.");return dl};var My=(e={})=>(dl=e,Ty(),u("UX state initialized",null)),jN=e=>{let t=bo();return dl=e(t),Ty(),u("UX state updated",null)},xo=e=>jN(t=>({...t,...e}));import{ulid as cu}from"ulid";var Py=async e=>{let{contextNode:t,selectedIndex:n}=v(),o=le(t.id)[n];if(e.modifier===Dt.DESCRIPTION)return UN();if(o&&Rs(o))return $N(e);if(e.modifier===Dt.TITLE){let r=pe();if(a(r))return l("Unable to resolve user ID");let s=o;if(!s)return l("Missing node");if(s.readonly)return l("Cannot rename readonly node");let i=e.inputString.trim();if(!i)return l("Provide a title");let c=await Ie();return a(c)?c:B([{id:cu(),action:"edit.title",payload:{id:s.id,name:i},...D(r.value)}],c.value)}return l("Unknown edit command")},$N=async e=>{let t=pe();if(a(t))return l("Unable to resolve user ID");let{contextNode:n,selectedIndex:o}=v(),r=le(n.id)[o];if(!r||!Rs(r))return l("Select a comment first");if(r.readonly)return l("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return l("Unable to resolve comment issue");let i=v().nodes[s];if(!i||!_(i))return l("Unable to resolve comment issue");if(i.readonly)return l("Cannot edit readonly issue");let c=r.id.split(":").at(0)??"",d=N.getComment(c);if(!d||d.deleted)return l("Unable to resolve comment");if(d.issue!==i.id)return l("Comment does not belong to selected issue");if(d.authorId!==t.value.userId)return l("You can only edit your own comments"+d.authorId+"<->"+t.value.userId);let p=e.inputString.trim();if(!p)return l("Provide a comment");let m=await Ie();if(a(m))return m;let f=m.value;return B([{id:cu(),action:"edit.issue.comment",payload:{id:d.id,issue:i.id,md:p},...D(t.value)}],f)},UN=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let t=await Ie();if(a(t))return t;let n=t.value,{breadCrumb:o,selectedNode:r}=v(),s=yt([...o,r],"TICKET");if(a(s))return l("Edit target must be an issue");let i=s.value;if(!_(i))return l("Edit target must be an issue");if(i.readonly)return l("Cannot edit readonly issue");let c=le(i.id).find(f=>f.title===Ne.DESCRIPTION);if(!c)return l("No target found");if(c.readonly)return l("Cannot edit readonly field");let d=i.props.description??"";if(typeof d!="string")return l("Selected field is not editable text");let p=cy(d);if(a(p))return l("Failed to edit field");let m=p.value;return m===d?u("No changes made",null):B([{id:cu(),action:"edit.description",payload:{id:i.id,md:m},...D(e.value)}],n)};import WN from"node:fs";import uu from"node:path";import du from"node:fs";import HN from"node:path";var Ly=async e=>{let t=HN.join(e,".gitignore"),n=du.existsSync(t)?du.readFileSync(t,"utf8"):"",o=[".epiq/events/",".epiq/log/"],r=n.split(`
|
|
89
|
+
`).map(d=>d.trim()),s=o.filter(d=>!r.some(p=>p===d||p===d.replace(/\/$/,"")||p==="/"+d||p==="/"+d.replace(/\/$/,"")));if(s.length===0)return u("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...s].join(`
|
|
90
90
|
`);return n=n.trimEnd()+`
|
|
91
91
|
|
|
92
92
|
${c}
|
|
93
|
-
`,du.writeFileSync(t,n,"utf8"),ee.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),u("Local epiq paths ignored",!0)};var
|
|
94
|
-
`).filter(n=>n.trim().length>0).map(n=>n.slice(3)))},ce=(e,t)=>l(`[${e}] ${t}`),
|
|
95
|
-
`));let
|
|
96
|
-
`));let d=de();if(a(d))return ri(16,d.message);let{rootNodeId:p,nodes:m}=d.value,f=m[p];return f?($.navigate({contextNode:f,selectedIndex:0}),
|
|
97
|
-
`,"utf8"),ii.renameSync(m,s)}catch(f){try{ii.rmSync(m,{force:!0})}catch{}return l(`Unable to write ${ai}: ${f instanceof Error?f.message:String(f)}`)}return u("Stored command history",null)};var nA=e=>e.some(t=>t.action==="init.workspace"),Vy=async(e,t)=>{let n=ke(e);return a(n)?l(n.message):us({cwd:t,branch:n.value})},rA=e=>{let t=re(process.cwd());if(a(t))return!1;let n=me({repoRoot:t.value});return!a(n)&&n.value===e},fu=!1,zy=()=>fu,ml=async e=>{fu=!0;try{return await oA(e)}finally{fu=!1}},oA=async e=>{let t=me({repoRoot:e});if(a(t))return sn(3,t.message);let n=t.value,r=await ur({repoRoot:e,stateBranchRoot:n,stateBranchName:$i().stateBranch});if(a(r))return sn(3,r.message);let o=et(n),s=rn(n);if(a(s))return sn(3,s.message);if(!nA(s.value.events)){let f=await zs({worktreeRoot:n,operation:"boot pull",fn:()=>$a(n,()=>Vy(e,n))});if(a(f)?logger.info(3,f.message):f.value===null?logger.info(3,"Another process holds the state worktree, skipped pull"):a(f.value)&&logger.info(3,f.value.message),o=et(n),s=rn(n),a(s))return sn(3,s.message)}let{events:i,unreadable:c}=s.value,d=on(i,c);if(a(d))return sn(4,d.message);To(n,o),w({hasProjectDefinition:!0,hasInitializingEvents:!!i.length});let p=oa({root:e});a(p)&&logger.info(p.message);let m=Wy({root:e});return a(m)&&logger.info(m.message),Pf(a(m)?[]:m.value),u("Loaded project",void 0)},sA=async e=>{let t=me({repoRoot:e});if(a(t))return l(t.message);let n=t.value,r=await On({repoRoot:n});if(a(r))return l(r.message);if(!r.value)return u("No remote to pull",void 0);let o=await zs({worktreeRoot:n,operation:"boot pull",fn:()=>$a(n,()=>(Mo("Pulling"),Vy(e,n)))});if(a(o))return We(o.message);if(o.value===null)return u("Another process holds the state worktree",void 0);let s=o.value;if(a(s))return ds(s.message)?(ka("Offline"),u("Offline",void 0)):We(s.message);if(!s.value)return Ur("Already synced"),u("Already synced",void 0);if(!rA(n))return u("Project changed during the pull",void 0);let i=Ks(n);return a(i)?i:(Ur("Pulled"),u("Pulled and reloaded",void 0))},pl=e=>{sA(e).then(t=>{a(t)&&logger.info(3,t.message)}).catch(t=>{logger.error(`[boot] pull failed: ${Po(t)}`)})},Ky=()=>{let e=on([]);return a(e)?sn(4,e.message):(w({hasProjectDefinition:!1,hasInitializingEvents:!1}),u("Booted without a project",void 0))};var aA=e=>e==="~"||e.startsWith("~/")?qy.join(iA.homedir(),e.slice(1)):e,lA=(e,t)=>{let n=e.trim();if(!n)return l("Provide a number from the list or a path to a project");if(/^\d+$/.test(n)){let o=t[Number(n)-1];return o?u("Resolved recent project",o.root):l(`No recent project #${n}`)}let r=re(qy.resolve(aA(n)));return a(r)?l(`No epiq project at ${n}`):u("Resolved project path",r.value)},Yy=async()=>{let e=fa();if(J(""),v().hasProjectDefinition)return l("Already in a project; run epiq from another directory");let t=$n({exclude:process.cwd()}),n=a(t)?[]:t.value,r=lA(e,n);if(a(r))return l(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(c){return l(`Unable to enter ${o}: ${c instanceof Error?c.message:String(c)}`)}let i=await ml(o);return a(i)?(process.chdir(s),l(i.message)):(pl(o),u(`Opened ${Eo(o)}`,null))};var fl=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=v(),s=Aa(n,t);if(a(s))return l(s.message);let{appliedEvents:i,unappliedEvents:c}=s.value,d=dn();if(a(d))return d;let p=nn(i),{fatal:m,skipped:f}=Sn(p);if(m.length>0)return dn(),w(o),l(m.map(h=>h.message).join(", "));Rn(f);let g=v().nodes[e];return g?($.navigate({contextNode:g,selectedIndex:r}),u("",{unappliedEvents:c})):(dn(),w(o),l("Board did not exist at that date"))};var Xy=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 cA=20,dA=16,uA=150,gl=null,hl=null;var qr=()=>{gl!==null&&(clearInterval(gl),gl=null),hl!==null&&(clearTimeout(hl),hl=null)},Jy=()=>{qr(),w({mode:I.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Qy=({events:e,startTime:t,durationMs:n})=>{qr();let r=e.length,o=vo(e.map(f=>tr(f))).map(f=>f??t),s=o[r-1]??Date.now(),i=Xy(o),c=Math.max(1,Math.round(n*cA/1e3)),d=Math.max(Math.round(n/c),dA),p=0,m=0;w({mode:I.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),gl=setInterval(()=>{p++;let f=p/c,g=[],h,x;for(;m<r&&i[m]<=f;){let R=e[m],S=$s(R);if(a(S)){if(wo(S)){m++;continue}Jy();return}g.push(...Id(R)),h=R,x=o[m],m++}if(m>=r||p>=c){for(;m<r;m++){let S=$s(e[m]);if(a(S)&&!wo(S))break}let R=v().replay;w({unappliedEvents:[],replay:R&&{...R,progress:1,appliedCount:r}}),qr(),hl=setTimeout(Jy,uA);return}let b=v().replay;w({unappliedEvents:e.slice(m),replay:{progress:Math.min(1,f),appliedCount:m,totalCount:r,startTime:t,endTime:s,currentTime:h?x??b?.currentTime??t:b?.currentTime??t,currentLabel:h?yl(h):b?.currentLabel??"",flashNodeIds:h?[...new Set(g)]:b?.flashNodeIds??[]}})},d)};var Zy=async()=>{let e=yt(v().breadCrumb,"BOARD");if(a(e))return e;let t=await Qt(process.cwd());if(a(t))return l("Unable to locate repo root");let n=me({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=se().commandMeta;if(qr(),r==="now"){let c=dr(n.value);if(a(c))return l(c.message);let d=dn();if(a(d))return d;let p=nn(c.value),{fatal:m,skipped:f}=Sn(p);return m.length>0?l(m.map(g=>g.message).join(", ")):(Rn(f),w({mode:I.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let c=Ta(n.value);if(a(c))return c;let d=r==="prev"?v().eventLog.at(-1):v().unappliedEvents.at(0),p=d===void 0?null:tr(d),m=(d===void 0?null:c.value.get(d.id)??null)??(p===null?null:bs(p));if(m===null)return l(r==="prev"?"No previous event to peek":"No next event to peek");s=r==="prev"?m:m+1}else{let c=Lr(r||o.trim());if(!c)return l("Invalid peek date");s=c.getTime()}let i=fl({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return a(i)?i:(w({mode:I.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),u("Peeking",!0))};var ev=async()=>{let e=yt(v().breadCrumb,"BOARD");if(a(e))return e;let t=await Qt(process.cwd());if(a(t))return l("Unable to locate repo root");let n=me({repoRoot:t.value});if(a(n))return n;let{modifier:r,inputString:o}=se().commandMeta,{dateInput:s,durationInput:i}=ca(r,o);if(qr(),v().syncStatus.status==="syncing")return l("Cannot replay while syncing, try again in a moment");let c=Lr(s);if(!c)return l("Invalid replay date");let d=i?la(i):15e3;if(d===null)return l("Invalid replay duration (try e.g. 30s or 2m)");let p=c.getTime(),m=v(),f=fl({boardId:e.value.id,targetTime:p,stateBranchRoot:n.value,selectedIndex:-1});if(a(f))return f;let{unappliedEvents:g}=f.value;return g.length===0?(dn(),w(m),u("Nothing to replay from that point",!0)):(Qy({events:g,startTime:p,durationMs:d}),u("Replaying board history",!0))};import{spawn as pA}from"node:child_process";var fA=()=>{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"]}}},tv=async e=>new Promise(t=>{let{command:n,args:r}=fA();try{let o=pA(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(l(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?u("Copied to clipboard",null):l(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(l(`Clipboard tool not available (${n})`))}});var li=async(e,t)=>{if(!e.trim())return l(`Nothing to copy: ${t} is empty`);let n=await tv(e);return a(n)?n:u(`Copied ${t} to clipboard`,null)},nv=async e=>{let{breadCrumb:t,selectedNode:n}=v(),r=Ns({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return l("Nothing selected to copy from");switch(e.modifier){case qe.REF:return li(H(o.id),"ref");case qe.TITLE:return li(o.title,"title");case qe.DESCRIPTION:return r?li(r.props?.description??"","description"):l("No issue in scope");case qe.TAGS:{if(!r)return l("No issue in scope");let s=bn(r).map(({name:i})=>i);return li(s.join(", "),"tags")}case qe.ASSIGNEES:{if(!r)return l("No issue in scope");let s=xn(r).map(({name:i})=>i);return li(s.join(", "),"assignees")}default:return l("Yank one of: ref, title, description, tags, assignees")}};var rv=async()=>{J(""),w({mode:I.DEFAULT});let e=de();if(a(e))return l(e.message);if(e.value.syncStatus.status==="syncing")return l("Sync already in progress");w({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Ha();return a(t)?(w({syncStatus:{msg:t.message,status:"failed"}}),t):(w({mode:I.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{ulid as ov}from"ulid";var sv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=le(t.id)[n];if(!r)return l("Unable to resolve child to delete");let o=await Ie();if(a(o))return o;if(r.context==="COMMENT"){let s=r.id,i=_(t)?t.id:t.parentNodeId;if(!i)return l("Unable to resolve comment issue");let c=v().nodes[i];if(!c||!_(c))return l("Unable to resolve comment issue");let d=c.log?.filter(Nh).find(p=>p.payload.id===s);return d?d.payload.author!==e.value.userId?l("You can only delete your own comments"):B([{id:ov(),action:"delete.issue.comment",payload:{id:s,issue:i},...D(e.value)}],o.value):l("Unable to resolve comment")}return B([{id:ov(),action:"delete.node",payload:{id:r.id},...D(e.value)}],o.value)};import{ulid as gA}from"ulid";var iv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=le(t.id)[n];if(!r)return l("Unable to close issue, no target found");if(!_(r))return l("Cannot close in this context");let o=v().nodes[he];if(!o)return l("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return l("Issue is already closed");let s=await Ie();if(a(s))return s;let i=s.value,c=Cn(o.id,r.id,{at:"end"},e.value,i);if(a(c))return c;let d=B([{id:gA(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:c.value},...D(e.value)}],i);return a(d)?d:u("Issue closed",null)};import{ulid as hA}from"ulid";var vl=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};var av=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=le(t.id)[n];if(!r)return l("Unable to reopen issue, no target found");let o=r.context==="TICKET"?u("Resolved ticket",r):Tt(r.id,"TICKET");if(a(o))return l("Cannot reopen in this context");let s=o.value,i=v().nodes[he];if(!i)return l("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return l("Issue is not closed");if(!_(s))return l("Target node is not issue");let c=vl(s);if(!c)return l("Unable to resolve previous parent from issue history");if(c===i.id)return l("Previous parent resolves to closed swimlane");let d=v().nodes[c];if(!d)return l("Previous parent no longer exists");let p=await Ie();if(a(p))return p;let m=p.value,f=Cn(d.id,s.id,{at:"end"},e.value,m);if(a(f))return f;let g=B([{id:hA(),action:"reopen.issue",payload:{id:s.id,parent:d.id,rank:f.value},...D(e.value)}],m);return a(g)?g:u("Issue reopened",null)};import{ulid as yA}from"ulid";var lv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=le(t.id)[n];if(!r)return l("Missing node");if(r.readonly)return l("Cannot rename readonly node");let o=fa();if(!o)return l("Provide a title");let s=await Ie();return a(s)?s:B([{id:yA(),action:"edit.title",payload:{id:r.id,name:o},...D(e.value)}],s.value)};import{ulid as vA}from"ulid";var cv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,r=(t||n).trim();if(!r)return l("Provide a tag");let o=N.findTagByName(r);if(!o)return l(`Tag "${r}" does not exist`);let{selectedNode:s}=v();if(!s)return l("Invalid untag target");let i=Tt(s.id,"TICKET");if(a(i))return l("Unable to untag issue in this context");let c=i.value;if(!_(c))return l("Target node is not issue");if(!(c.props.tags??[]).includes(o.id))return l("Issue is not tagged with that tag");let p=await Ie();return a(p)?p:B([{id:vA(),action:"remove.issue.tag",payload:{id:c.id,tag:o.id},...D(e.value)}],p.value)};import{ulid as gu}from"ulid";var dv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,r=(t||n).trim();if(!r)return l("Provide a tag");let{selectedNode:o}=v();if(!o)return l("Invalid tag target");let s=Tt(o.id,"TICKET");if(a(s))return l("Unable to tag issue in this context");let i=s.value;if(!_(i))return l("Target node is not issue");let c=await Ie();if(a(c))return c;let d=N.findTagByName(r),p=d?.id??gu();return(i.props.tags??[]).includes(p)?l("Already tagged with that tag"):B([...d?[]:[{id:gu(),action:"create.tag",payload:{id:p,name:r},...D(e.value)}],{id:gu(),action:"add.issue.tag",payload:{id:i.id,tag:p},...D(e.value)}],c.value)};import{ulid as hu}from"ulid";var ci=({events:e,registry:t,logFileNames:n})=>{let r=new Map(n),o=new Set;for(let s of e)s.userId&&(r.has(s.userId)||r.set(s.userId,""),o.add(s.userId));for(let s of Object.values(t))r.set(s.id,s.name);return[...r.entries()].map(([s,i])=>({id:s,name:i,isExternal:!o.has(s)}))},uv=({authorName:e,authorEmail:t,owners:n,registry:r})=>{let o=Ze(t),s=n.get(o),i=s?r[s]:void 0;return s?{...Ke(s,i?.name),resolved:!0}:{...Ke(o||e,e),resolved:!1}};var bl=e=>{let{eventLog:t=[],contributors:n}=v();return ci({events:t,registry:n,logFileNames:cr(e)})};var mv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,r=(t||n).trim();if(!r)return l("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return l("Provide an assignee");let{selectedIndex:i,contextNode:c}=v(),d=le(c.id)[i];if(!d)return l("Invalid assign target");let p=Tt(d.id,"TICKET");if(a(p))return l("Unable to assign issue in this context");let m=p.value;if(!_(m))return l("Target node is not issue");let f=await Ie();if(a(f))return f;let g=bl(f.value),h=!o&&s.toLowerCase()==="me",x,b;if(h)x=e.value.userId,b=g.find(A=>A.id===x)?.name??e.value.userName;else{let A=g.filter(P=>P.name===s);if(A.length>1)return l(`"${s}" matches ${A.length} contributors (${A.map(P=>P.id).join(", ")}). Assign from the GUI to choose by id.`);let T=A[0];if(!T&&!o)return l(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);x=T?.id??hu(),b=T?.name??s}if((m.props.assignees??[]).includes(x))return l("Assignee already assigned");let S=!!v().contributors[x];return B([...S?[]:[{id:hu(),action:"create.contributor",payload:{id:x,name:b},...D(e.value)}],{id:hu(),action:"add.issue.assignee",payload:{id:m.id,assignee:x},...D(e.value)}],f.value)};import{ulid as bA}from"ulid";var pv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,r=(t||n).trim();if(!r)return l("Provide an assignee to remove");let{selectedNode:o}=v();if(!o)return l("Invalid unassign target");let s=Tt(o.id,"TICKET");if(a(s))return l("Unable to unassign in this context");let i=s.value;if(!_(i))return l("Target node is not issue");let c=i.props.assignees??[],d=r.toLowerCase()==="me",p=await Ie();if(a(p))return p;let m=d?c.filter(g=>g===e.value.userId):bl(p.value).filter(g=>g.name===r&&c.includes(g.id)).map(g=>g.id);if(m.length>1)return l(`"${r}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let f=m[0];return f?B([{id:bA(),action:"remove.issue.assignee",payload:{id:i.id,assignee:f},...D(e.value)}],p.value):l(d?"Issue is not assigned to you":`Issue is not assigned to "${r}"`)};import{ulid as fv}from"ulid";var xA=e=>{let t=e.trim(),n=yr(),r=n?ny(t):null;if(!n||!r)return{ok:!0,md:t,anchored:!1};let o=sl();if(!o||o.sha!==n)return{ok:!1,reason:"No diff is open"};let s=ry(o.rows,Math.max(0,v().selectedIndex));if(!s)return{ok:!1,reason:"That line is not in a file"};let i=oy(o.rows,s,r.start,r.end);return i.ok?{ok:!0,anchored:!0,md:Oh({filePath:i.value.filePath,start:i.value.start,end:i.value.end,side:"additions",endSide:"additions",note:r.note,sha:n,snippet:i.value.snippet})}:{ok:!1,reason:i.reason}},gv=async e=>{let t=xA(e.inputString);if(!t.ok)return l(t.reason);let{md:n,anchored:r}=t;if(!n)return l("Provide a comment");if(n.length>4e3)return l(r?`The note and the ${n.length} characters of quoted lines exceed ${4e3}; comment on fewer lines`:`Cannot exceed ${4e3} characters`);let o=pe();if(a(o))return l("Unable to resolve user ID");let{breadCrumb:s,selectedNode:i}=v(),c=yt([...s,i],"TICKET");if(a(c))return l("Edit target must be an issue");let d=c.value;if(!d)return l("Invalid comment target");let p=d.context==="TICKET"?u("Resolved ticket",d):Tt(d.id,"TICKET");if(a(p))return l("Unable to comment on issue in this context");let m=p.value;if(!_(m))return l("Target node is not issue");let f=await Ie();if(a(f))return f;let g=await B([{id:fv(),action:"add.issue.comment",payload:{id:fv(),issue:m.id,author:o.value.userId,md:n},...D(o.value)}],f.value);return r&&!a(g)&&Vr(null),g};import{ulid as NA}from"ulid";var xl=e=>e.userName?.trim()?e.preferredEditor?.trim()?null:"no editor configured":"no username configured",IA=e=>{let t=ht();return a(t)?xl({userName:e.userName,preferredEditor:e.preferredEditor})??t.message:xl(t.value)},di=()=>{let e=hn();return a(e)?l(e.message):u("Read auto sync settings",{enabled:e.value.autoSync===!0,intervalMs:mo(e.value.autoSyncDebounceMs),blockedReason:IA(e.value)})},qo=e=>{let t=e.intervalMs===void 0?void 0:uo(e.intervalMs);if(e.intervalMs!==void 0&&t===null)return l(`Auto sync interval must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=di();if(a(n))return n;let r=$t({...e.enabled===void 0?{}:{autoSync:e.enabled},...t==null?{}:{autoSyncDebounceMs:t}});if(a(r))return l(r.message);je({...e.enabled===void 0?{}:{autoSync:e.enabled},...t==null?{}:{autoSyncIntervalMs:t}});let o=di();return a(o)?u("Changed auto sync settings",{...n.value,...e.enabled===void 0?{}:{enabled:e.enabled},...t==null?{}:{intervalMs:t}}):o};var hv=()=>{let e=se().commandMeta.inputString,t=uo(e);if(t===null)return l(`Auto sync duration must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=qo({intervalMs:t});return a(n)?n:u(`Auto sync interval set to ${t}ms`,null)};var yv=()=>{let e=se().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return l("Invalid response");let t=Jp(e),n=qo({enabled:t===!0});return a(n)?n:u(`Auto sync set to "${e}"`,null)};import{ulid as RA}from"ulid";var yu=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=2),vv="",bv=new Map,EA=15e3;var SA=async(e,t)=>{let n=`${e} ${t??""}`,r=bv.get(n);if(r&&Date.now()-r.at<Xa(EA))return u("Cached author scan",r.authors);let o=await Le({cwd:e,args:["log","--branches",...t?["--not",t]:[],`--format=%an${vv}%ae`]});if(o.exitCode!==0)return l(`Could not read this repository's history: ${(o.stderr??"").trim()||`git exited ${o.exitCode}`}`);let s=new Map;for(let i of(o.stdout??"").split(`
|
|
98
|
-
`)){let c=i.lastIndexOf(vv);if(c===-1)continue;let d=i.slice(0,c),p=Ze(i.slice(c+1));if(!nr(p))continue;let m=s.get(p)??{names:new Set,commits:0};d&&m.names.add(d),m.commits+=1,s.set(p,m)}return bv.set(n,{at:Date.now(),authors:s}),u("Scanned repository authors",s)},Mn=async({repoRoot:e,stateBranch:t,names:n,links:r})=>{let o=await SA(e,t);if(a(o))return l(o.message);let s=o.value,i=new Map;for(let d of Object.values(r)){if(d.tombstoned)continue;let p=i.get(d.email)??new Set;p.add(d.contributor),i.set(d.email,p)}let c=new Set(n.flatMap(d=>yu(d??"")));return u("Found candidates",[...s.entries()].map(([d,p])=>({email:d,names:[...p.names],commits:p.commits,looksLikeYours:[...p.names].some(m=>yu(m).some(f=>c.has(f)))||yu(d.split("@")[0]??"").some(m=>c.has(m)),claimedBy:[...i.get(d)??[]]})).sort((d,p)=>d.looksLikeYours===p.looksLikeYours?p.commits-d.commits:Number(p.looksLikeYours)-Number(d.looksLikeYours)))},xr=e=>e.filter(t=>t.claimedBy.length===0);var xv=()=>{let e=Vc();if(!e)return u("Nothing here to decline",null);let t=hn(),n=a(t)?[]:t.value.declinedEmailBoards??[],r=[...new Set([...n,e])],o=$t({declinedEmailBoards:r});return a(o)?l(o.message):(je({declinedEmailBoards:[...new Set([...V().declinedEmailBoards??[],e])]}),u("Declined",null))},Iv=async()=>{let e=se().commandMeta.inputString.trim();if(e==="none"){let R=xv();return a(R)?R:u("Left unlinked. Your commits will show the name git signed them with. Run :config emails again to change that.",null)}let{userId:t,userName:n,gitName:r}=V();if(!t)return l("Set a username first with :config username");let o=de();if(a(o))return l("Board is not loaded");let s=re(process.cwd());if(a(s))return l(s.message);let i=ke(s.value),c=await Mn({repoRoot:s.value,stateBranch:a(i)?void 0:i.value,names:[n,r],links:o.value.emailLinks});if(a(c))return c;let p=xr(c.value);if(So(p.map(R=>R.email)),p.length===0){if(!Yp()){let R=xv();if(a(R))return R}return u("No unclaimed addresses in this history.",null)}if(!e)return w({mode:I.IDENTITY}),u("Opened identity",null);let m=e.split(/[,\s]+/).filter(Boolean),f=[],g=[];for(let R of m){let S=p.find(A=>A.email===Ze(R));if(!S){g.push(R);continue}f.includes(S)||f.push(S)}if(g.length>0)return l(`Not on the list: ${g.join(", ")}. Pick one of ${p.map(R=>R.email).join(", ")}.`);let h=me({repoRoot:s.value});if(a(h))return h;let x=f.map(R=>({id:RA(),action:"link.contributor.email",payload:{contributor:t,email:R.email},userId:t})),b=B(x,h.value);return a(b)?l(b.message):u(`Claimed ${f.map(R=>R.email).join(", ")}. Every commit by ${f.length===1?"that address":"those addresses"} is now yours.`,null)};import{ulid as CA}from"ulid";var Ev=()=>{let e=se().commandMeta.inputString.trim(),{userId:t}=V();if(!t)return l("Set a username first with :config username");let n=de();if(a(n))return l("Board is not loaded");let r=yn(n.value.emailLinks,t);if(r.length===0)return l("You have not claimed any addresses.");if(!e)return l(`Which one? ${r.join(", ")}.`);let o=r.find(d=>d===Ze(e));if(!o)return l(`You have not claimed ${e}. Yours: ${r.join(", ")}.`);let s=re(process.cwd());if(a(s))return s;let i=me({repoRoot:s.value});if(a(i))return i;let c=B([{id:CA(),action:"unlink.contributor.email",payload:{contributor:t,email:o},userId:t}],i.value);return a(c)?l(c.message):u(`Unclaimed ${o}`,null)};var Sv=()=>{let e=se().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return l("Invalid response");let n=$t({logLevel:e});return a(n)?n:(je({logLevel:e}),u(`Auto sync set to "${e}"`,null))};var Rv=e=>{let t=e.inputString.trim();switch(e.modifier){case ye.USERNAME:{if(process.env[Dn])return l(`Cannot change the configured user while ${Dn} names this process`);let n=hn();if(a(n))return n;let{userId:r,preferredEditor:o,userName:s}=n.value,i=t||s,c=r||NA();if(!i||!c)return l("Unable to resolve user name or id");let d=$t({userName:i,userId:c,preferredEditor:o??""});return a(d)?d:(je({userName:i,userId:c}),u(`Username set to "${i}"`,null))}case ye.EDITOR:{if(!t)return l("No editor provided");let n=$t({preferredEditor:t});return a(n)?n:(je({preferredEditor:t}),u(`Editor configuration set to "${t}"`,null))}case ye.VIEW:{if(t!=="wide"&&t!=="dense")return l("Invalid view mode");let n=$t({viewMode:t});return a(n)?n:(je({viewMode:t}),u(`View set to "${t}"`,null))}case ye.EMAILS:return Iv();case ye.EMAILS_UNCLAIM:return Ev();case ye.AUTOSYNC:return yv();case ye.LOG_LEVEL:return Sv();case ye.SYNC_DEBOUNCE_MS:return hv();case ye.ATTACHMENT_MAX_KB:return pf();default:return l("Unknown config command")}};var vu=()=>{let e=Qp(),t=v().mode;if(!(t!==I.COMMAND_LINE&&t!==I.DEFAULT)){if(!e){w({mode:I.DEFAULT});return}w({mode:I.COMMAND_LINE}),J(e)}};var Il=[{systemOnly:!0,intent:G.Move,description:"Internal move-state command",mode:I.COMMAND_LINE,action:jy},{intent:G.Delete,description:"Delete the currently selected node",mode:I.COMMAND_LINE,action:sv,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:I.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=se().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(i=>Be(C.FILTER).map(c=>c.split(n)[0]).includes(i))(r))return l("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return Oe(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:I.DEFAULT})),u("Filter updated",null)}},{intent:G.ViewHelp,description:"Open the help screen",mode:I.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return br({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),w({mode:I.HELP}),u("Viewing help",null)}},{intent:G.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:I.COMMAND_LINE,action:iv,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:I.COMMAND_LINE,action:av,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Init,description:"Initialize Epiq in the current git repository",mode:I.COMMAND_LINE,action:ky,onSuccess:vu},{intent:G.OpenProject,description:"Open a recently used epiq project, by number or path",mode:I.COMMAND_LINE,action:Yy,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.NewItem,description:"Create a new board, swimlane, or issue",mode:I.COMMAND_LINE,action:$y,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Rename,description:"Rename the currently selected node",mode:I.COMMAND_LINE,action:lv,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.UntagTicket,description:"Remove a tag from the selected issue",mode:I.COMMAND_LINE,action:cv,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.TagTicket,description:"Add or create a tag on the selected issue",mode:I.COMMAND_LINE,action:dv,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.AssignUserToTicket,description:"Assign a user to the selected issue",mode:I.COMMAND_LINE,action:mv,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:I.COMMAND_LINE,action:pv,onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Comment,description:"Add a comment to the selected issue",mode:I.COMMAND_LINE,action:async(e,t)=>gv(t),onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Sync,description:"Pull, commit, and push Epiq state",mode:I.COMMAND_LINE,action:rv},{intent:G.Peek,description:"View board state at another point in time",mode:I.COMMAND_LINE,action:Zy},{intent:G.Replay,description:"Replay board history forward from a point in time",mode:I.COMMAND_LINE,action:ev},{intent:G.Export,description:"Export the current board layout to markdown",mode:I.COMMAND_LINE,action:async()=>{let e=await Ay();return a(e)?e:(w({mode:I.DEFAULT}),u("Export successful",!0))}},{intent:G.Exit,description:"Exit the application",mode:I.COMMAND_LINE,action:async()=>($.exit(),u("Exit successful",!0))},{intent:G.Edit,description:"Edit title or description",mode:I.COMMAND_LINE,action:async(e,t)=>My(t),onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:I.COMMAND_LINE,action:async(e,t)=>nv(t),onSuccess:()=>w({mode:I.DEFAULT})},{intent:G.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:I.COMMAND_LINE,action:(e,t)=>Rv(t),onSuccess:vu}];var AA=new Set(["peek","replay","filter","view-help","yank"]),Vt=async({isForceExecutedBySystem:e=!1}={})=>{let{value:t,commandMeta:{command:n,validity:r,modifier:o,inputString:s}}=se();if(!n)return l("No command to confirm");if(!e&&r===En.Invalid)return l("Invalid command");let i=Ga(n);wf();let{readOnly:c}=v();if(c&&!AA.has(i))return Ls({status:Zn.Fail,message:"Command not available in readonly state",value:null});let d=Il.filter(f=>e||f.systemOnly!==!0).find(f=>f.intent===i);if(!d)return Ls({status:Zn.Fail,message:"Command not found",value:null});let p;try{p=await d.action(d,{command:n,inputString:s,modifier:o})}catch(f){return Ls({status:Zn.Fail,message:f instanceof Error?f.message:"Command failed",value:null})}if(a(p))return Ls(p);let m=!e;if(Mf({addToHistory:m,line:t}),m){let f=Gy({commands:se().commandHistory});a(f)&&logger.info(f.message)}return d.onSuccess?.(),V().autoSync&&Wa(),p};var El=[{intent:E.Exit,mode:I.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(w({mode:I.COMMAND_LINE}),J("move cancel"),Vt({isForceExecutedBySystem:!0}))},{intent:E.InitMove,mode:I.DEFAULT,description:"[m] move",action:()=>(w({mode:I.COMMAND_LINE}),J("move start"),Vt({isForceExecutedBySystem:!0}))},{intent:E.ConfirmMove,mode:I.MOVE,description:"[m] confirm move",action:()=>(w({mode:I.COMMAND_LINE}),J("move confirm"),Vt({isForceExecutedBySystem:!0}))}],Sl=[{intent:E.MovePreviousItem,mode:I.MOVE,action:()=>cn()?(w({mode:I.COMMAND_LINE}),J("move previous"),Vt({isForceExecutedBySystem:!0})):l("No pending move")},{intent:E.MoveNextItem,mode:I.MOVE,description:"[arrows/hjkl] move (shift x5)",action:()=>cn()?(w({mode:I.COMMAND_LINE}),J("move next"),Vt({isForceExecutedBySystem:!0})):l("No pending move")},{intent:E.MovePreviousItemJump,mode:I.MOVE,action:()=>cn()?(w({mode:I.COMMAND_LINE}),J("move jump-previous"),Vt({isForceExecutedBySystem:!0})):l("No pending move")},{intent:E.MoveNextItemJump,mode:I.MOVE,action:()=>cn()?(w({mode:I.COMMAND_LINE}),J("move jump-next"),Vt({isForceExecutedBySystem:!0})):l("No pending move")}],Cv=[{intent:E.MoveToNextContainer,mode:I.MOVE,action:()=>cn()?(w({mode:I.COMMAND_LINE}),J("move to-next"),Vt({isForceExecutedBySystem:!0})):l("No pending move")},{intent:E.MoveToPreviousContainer,mode:I.MOVE,action:()=>cn()?(w({mode:I.COMMAND_LINE}),J("move to-previous"),Vt({isForceExecutedBySystem:!0})):l("No pending move")}];var Nv={[oe.WORKSPACE]:[...El,...Sl],[oe.BOARD]:[...El,...Sl],[oe.SWIMLANE]:[...El,...Sl,...Cv],[oe.TICKET]:[],[oe.FIELD]:[],[oe.FIELD_LIST]:[],[oe.TEXT]:[],[oe.COMMENT]:[]};import wA from"node:fs";import MA from"node:path";import{spawn as TA}from"node:child_process";function Av(e){let t=process.platform,o=TA(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return o.unref(),o.on("error",()=>{}),!0}var Tv=e=>{let t=re(process.cwd());if(a(t))return l("Unable to resolve project root");let n=me({repoRoot:t.value});if(a(n))return l(n.message);let r=Br(e.hash,e.ext),o=MA.join(gs(n.value),r);return wA.existsSync(o)?(Av(o),u(`Opened ${e.name}`,null)):l("Attachment file not found \u2014 run :sync to fetch it")};var wv=()=>{J("");let{pendingNavTarget:e}=vr();w({mode:I.DEFAULT}),e&&$.navigate(e),br({pendingNavTarget:void 0})},Mv=[{intent:E.ExitCommandLine,mode:I.HELP,action:()=>(wv(),u("Exiting help",null))},{intent:E.Exit,mode:I.HELP,action:()=>(wv(),u("Closed help",null))},{intent:E.NavPreviousItem,mode:I.HELP,description:"[arrows/hjkl] navigate (shift x5)",action:()=>($.navigateToPreviousItem(),u("Navigating to previous help item",null))},{intent:E.NavNextItem,mode:I.HELP,action:()=>($.navigateToNextItem(),u("Navigating to next help item",null))},{intent:E.NavPreviousItemJump,mode:I.HELP,action:()=>($.jumpToPreviousItem(),u("Jumping to previous help item",null))},{intent:E.NavNextItemJump,mode:I.HELP,action:()=>($.jumpToNextItem(),u("Jumping to next help item",null))},{intent:E.NavToPreviousContainer,mode:I.HELP,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous help container",null))},{intent:E.NavToNextContainer,mode:I.HELP,action:()=>($.navigateToNextContainer(),u("Navigating to next help container",null))}];var Pv=()=>{J(""),w({mode:I.DEFAULT})},Lv=[{intent:E.Confirm,mode:I.IDENTITY,description:"[enter] claim the first",action:()=>{let[e]=Ro();return e?(w({mode:I.COMMAND_LINE}),J(`config emails ${e}`),u("Proposed claim",null)):u("Nothing left to claim",null)}},{intent:E.ExitCommandLine,mode:I.IDENTITY,action:()=>(Pv(),u("Closed identity",null))},{intent:E.Exit,mode:I.IDENTITY,description:"[esc] close",action:()=>(Pv(),u("Closed identity",null))}];var PA=e=>{w({mode:I.COMMAND_LINE});let{pendingNavTarget:t}=vr();t&&$.navigate(t),br({pendingNavTarget:void 0}),J(`${e} `)},kv=()=>{J("");let{pendingNavTarget:e}=vr();e&&$.navigate(e),br({pendingNavTarget:void 0}),w({mode:I.DEFAULT})},Dv=[{intent:E.InitCommandPalette,mode:I.DEFAULT,description:"[?] command palette",action:()=>{J("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return br({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),w({mode:I.PALETTE}),u("Opening command palette",null)}},{intent:E.Confirm,mode:I.PALETTE,action:()=>{let{selectedNode:e}=v();if(!e||!rr(e))return l("Command only applicable on text nodes");if(e.props.disabled)return l("Command is not available in this context");let t=e.title;return t?(PA(t),u("Selected command",t)):u("No command selected",null)}},{intent:E.ExitCommandLine,mode:I.PALETTE,action:()=>(kv(),u("Exiting palette",null))},{intent:E.Exit,mode:I.PALETTE,action:()=>(kv(),u("Closed command palette",null))},{intent:E.NavPreviousItem,mode:I.PALETTE,description:"[arrows/hjkl] navigate",action:()=>($.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:E.NavNextItem,mode:I.PALETTE,action:()=>($.navigateToNextItem(),u("Navigating to next item",null))},{intent:E.NavToPreviousContainer,mode:I.PALETTE,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:E.NavToNextContainer,mode:I.PALETTE,action:()=>($.navigateToNextContainer(),u("Navigating to next container",null))}];var Bv=()=>{let e=yr();if(!e)return u("Nothing to comment on here",null);let t=sl();if(!t||t.sha!==e)return l("The diff is still loading");let{selectedIndex:n}=v(),r=Math.max(0,n),o=Kd(t.rows,tu(e)??r,r);return o.ok?(w({mode:I.COMMAND_LINE}),J(`${C.COMMENT} ${ty(o.value.start,o.value.end)} `),u("Commenting on a diff line",null)):l(o.reason)},Ov=[{intent:E.InitCommandLine,mode:I.DEFAULT,description:"[:] write command",action:()=>(w({mode:I.COMMAND_LINE}),J(""),u("Entering command line mode",null))},...Mv,...Lv,...Dv,{intent:E.AddItem,mode:I.DEFAULT,description:"[n] new...",action:()=>(w({mode:I.COMMAND_LINE}),J(`${C.NEW} `),u("Adding new item",null))},{intent:E.Delete,mode:I.DEFAULT,description:"[d] delete",action:()=>(w({mode:I.COMMAND_LINE}),J(`${C.DELETE} `),u("Deleting item",null))},{intent:E.Confirm,mode:I.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!be(e?.id??"")?.length){let r=e?N.getAttachment(e.id):void 0;if(r)return Tv(r);if(yr())return Bv();if(e?.title===Ne.DESCRIPTION)return w({mode:I.COMMAND_LINE}),J(`${C.EDIT} description `),u("Propose command",!0);if(e?.title===Ne.ASSIGNEES)return w({mode:I.COMMAND_LINE}),J(`${C.ASSIGN} `),u("Propose command",!0);if(e?.title===Ne.TAGS)return w({mode:I.COMMAND_LINE}),J(`${C.TAG} `),u("Propose command",!0);if(t.title===Ne.DESCRIPTION&&e?.context==="TEXT")return w({mode:I.COMMAND_LINE}),J(`${C.EDIT} description `),u("Propose command",!0)}return $.enterChildNode(),u("Entering context",null)}},{intent:E.OpenInEditor,mode:I.DEFAULT,action:()=>{let{selectedNode:e,contextNode:t}=v(),n=t.parentNodeId,o=!!n&&t.id===Me(n,"diff")?e?.id:yr()??void 0;return o?ti({sha:o}):u("Nothing here opens in an editor",null)}},{intent:E.MarkDiffLine,mode:I.DEFAULT,action:()=>{let e=yr();if(!e)return u("Nothing to mark here",null);let{selectedIndex:t}=v(),n=tu(e);return Vr(n===t?null:{sha:e,row:Math.max(0,t)}),u("Marked diff line",null)}},{intent:E.CommentOnDiffLine,mode:I.DEFAULT,action:()=>yr()?Bv():u("Nothing to comment on here",null)},{intent:E.Yank,mode:I.DEFAULT,description:"[y] yank",action:()=>{let{selectedNode:e}=v(),t=e?.title===Ne.DESCRIPTION?qe.DESCRIPTION:e?.title===Ne.TAGS?qe.TAGS:e?.title===Ne.ASSIGNEES?qe.ASSIGNEES:qe.REF,r=Be(C.YANK).includes(t)?t:qe.REF;return w({mode:I.COMMAND_LINE}),J(`${C.YANK} ${r}`),u("Propose command",!0)}},{intent:E.EditTitle,mode:I.DEFAULT,description:"[r] rename title",action:()=>(w({mode:I.COMMAND_LINE}),J(`${C.EDIT} title ${v().selectedNode?.title}`),u("Exiting context",null))},{intent:E.EditDescription,mode:I.DEFAULT,description:"[e] edit desc",action:()=>(w({mode:I.COMMAND_LINE}),J(`${C.EDIT} description `),u("Exiting context",null))},{intent:E.Exit,mode:I.DEFAULT,description:"[q] exit context",action:()=>($.enterParentNode(),u("Exiting context",null))},{intent:E.NavPreviousItem,mode:I.DEFAULT,description:"[arrows/hjkl] navigate (shift x5)",action:()=>($.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:E.NavNextItem,mode:I.DEFAULT,action:()=>($.navigateToNextItem(),u("Navigating to next item",null))},{intent:E.NavPreviousItemJump,mode:I.DEFAULT,action:()=>($.jumpToPreviousItem(),u("Jumping to previous item",null))},{intent:E.NavNextItemJump,mode:I.DEFAULT,action:()=>($.jumpToNextItem(),u("Jumping to next item",null))},{intent:E.NavToPreviousContainer,mode:I.DEFAULT,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:E.NavToNextContainer,mode:I.DEFAULT,action:()=>($.navigateToNextContainer(),u("Navigating to next container",null))}];var LA=500,kA=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Fv=e=>{let t=kA(e);t&&pa(n=>(n+t).slice(0,LA))};var DA=[I.COMMAND_LINE,I.PALETTE],BA=e=>e==="edit title "?v().selectedNode?.title??"":"",OA=e=>[{intent:E.MoveCursorLeft,mode:e,action:()=>(rd(-1),u("Moving cursor left",null))},{intent:E.MoveCursorRight,mode:e,action:()=>(rd(1),u("Moving cursor right",null))},{intent:E.MoveCursorLeftOfWord,mode:e,action:()=>(od("left"),u("Moving cursor left of word",null))},{intent:E.MoveCursorRightOfWord,mode:e,action:()=>(od("right"),u("Moving cursor right of word",null))},{intent:E.AutoCompleteCommand,mode:e,action:()=>(pa((t,{remainder:n})=>{let r=n?t+n:t;return r+BA(r)}),u("Auto-completing command",null))},{intent:E.CaptureInput,mode:e,action:(t,{sequence:n})=>(Fv(n??""),u("Capturing input",null))},{intent:E.EraseInput,mode:e,action:()=>(Af(),u("Erasing input",null))},{intent:E.EraseInputWord,mode:e,action:()=>(Tf(),u("Erasing input word",null))}],_v=[{intent:E.Confirm,mode:I.COMMAND_LINE,action:()=>(Vt(),u("Executing command",null))},{intent:E.ViewHelp,mode:I.DEFAULT,action:()=>(w({mode:I.HELP}),u("Viewing help",null))},...DA.flatMap(OA),{intent:E.ExitCommandLine,mode:I.COMMAND_LINE,action:()=>(Lf(),w({mode:I.DEFAULT}),u("Exiting command line",null))},{intent:E.GetLastCommandFromHistory,mode:I.COMMAND_LINE,action:()=>(kf(),u("Getting last command from history",null))},{intent:E.GetNextCommandFromHistory,mode:I.COMMAND_LINE,action:()=>(Df(),u("Getting next command from history",null))}];var bu=e=>{let t=/^\[(.+?)\]\s*(.+)$/.exec(e);return t?{keys:t[1]??"",label:t[2]??""}:null},jv=({keys:e})=>e.length===1?0:1,$v=(e,t)=>{let n=new Set;for(let r of e)r.mode!==t||!r.description||n.add(r.description);return[...n].map(bu).filter(r=>r!==null).sort((r,o)=>jv(r)-jv(o))};function Uv(e,t,n){let r=t[e];if(!r)return l("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?l("buildBreadCrumb(): node is not connected to root"):(o.reverse(),u("Breadcrumb built",o))}var Hv=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,xu,Iu=new Set,Eu=()=>{for(let e of Iu)e()},_A=e=>(Iu.add(e),()=>Iu.delete(e));function Su(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return l("derive(): contextNodeId is missing");if(!r)return l("derive(): rootNode is missing");if(!o[r])return l("derive(): unable to find root node");let c=o[t];if(!c)return l("Unable to derive state, contextNode not found");let d=Uv(t,o,r);if(a(d))return logger.error(d.message),d;let p=d.value,{context:m}=c,f=[...Ov,...Nv[m]??[],..._v],g=$v(f,n),h=Hv(f),x=jA(o,s),b=x[t]?.[e.selectedIndex]??null;return u("Derived successfully",{...e,contextNode:c,breadCrumb:p,availableHints:g,availableActions:f,actionIndex:h,selectedNode:b,renderedChildrenIndex:x})}var v=()=>{if(!wt)throw new Error("State not initialized. Call initWorkspaceState() first.");return wt},de=()=>wt?u("Retrieved state",wt):l("State not initialized. Call initWorkspaceState() first.");Vp(e=>wt?yn(wt.emailLinks,e):[]);function js(e){xu=e;let t=re(process.cwd()),n=!1;if(!a(t)){let s=Mt(t.value);if(a(s))return l(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},emailLinks:{},mode:I.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=Su(r);return a(o)?o:(wt=o.value,Eu(),u("State initialized",null))}var Yr=!1,ui=null;function Oe(e){let t=v(),n=e(t);if(Yr)return n.nodes!==t.nodes&&(Ir=null),ui=n,wt={...t,...n},u("State updated",null);let r=Su(n);return a(r)?l(r.message??"Unable to update state"):(wt=r.value,Eu(),u("State updated",null))}function Na(e){if(Yr)return u("Joined batch",e());Yr=!0,ui=null,Ir=new Set;let t=()=>{let n=ui;if(Yr=!1,ui=null,n===null)return null;let r=Su(n);return a(r)?l(r.message??"Unable to update state"):(wt=r.value,Eu(),u("State updated",null))};try{let n=e(),r=t();return r&&a(r)?l(r.message):u("State updated",n)}finally{Yr&&t()}}var kg=()=>Yr,w=e=>Oe(t=>({...t,...e}));function Xr(e,t,n){if(!Yr)return Oe(i=>({...i,[e]:{...i[e]??{},[t]:n}}));let r=v(),o=r[e]??{};if(e==="nodes"){let i=o[t],c=n;i?.parentNodeId&&Ir?.add(i.parentNodeId),c.parentNodeId&&Ir?.add(c.parentNodeId)}o[t]=n;let s={...r,[e]:o};return ui=s,wt={...r,...s},u("State updated",null)}var ne=()=>FA(_A,v,v),Ir=null,Wv=null,jA=(e,t)=>{let n=wt?.renderedChildrenIndex,r=n!==void 0&&Ir!==null&&e===Wv&&t.length===0&&wt?.filters.length===0,o;if(r){o={...n};let s=wg(e,Ir);for(let i of Ir){let c=s[i];c?o[i]=c:delete o[i]}}else o=Tg(e,t);return Wv=e,Ir=new Set,o},le=e=>v()?.renderedChildrenIndex[e]??[],dn=()=>xu?js(xu):l("Cannot reset state: no initial workspace found"),Rt=()=>wt!==void 0;var Tt=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return l("Node not found");if(r.context===t)return u("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 u("Resolved ancestor node",s);o.add(s.id),s=s.parentNodeId?n[s.parentNodeId]:void 0}return l(`No ancestor found for context: ${t}`)},Ru=(e,t)=>{let{nodes:n}=v(),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},Er=(e,t)=>e?e.readonly?l({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:l("Node not found"),N={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return l("Contributor not found");if(n.userId&&n.userId!==t)return l("Contributor is already linked to another user");let r={...n,userId:t},o=Oe(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?l("Unable to link contributor to user"):u("Linked contributor to user",r)},deleteNode(e){N.deleteNodes([e])},deleteNodes(e){e.length!==0&&Oe(t=>{let n={...t.nodes};for(let r of e)delete n[r];return{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return l("Unable to create comment, missing issue");if(!_(t))return l("Can only comment on issues");let n=Xr("comments",e.id,{...e,deleted:!1});return a(n)?l("Unable to create comment"):u("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return l("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return l("Unable to edit comment, missing issue");if(!_(r))return l("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=Xr("comments",e,o);return a(s)?l("Unable to edit comment"):u("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return l("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=Xr("comments",e,n);return a(r)?l("Unable to delete comment"):u("Deleted comment",n)},getComment(e){return v().comments?.[e]},getCommentsByIssue(e){return Object.values(v().comments??{}).filter(t=>t.issue===e&&!t.deleted)},getCommentsGroupedByIssue(){let e=new Map;for(let t of Object.values(v().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 l("Unable to create attachment, missing issue");if(!_(t))return l("Can only attach to issues");let n=Oe(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?l("Unable to create attachment"):u("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return l("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=Oe(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return a(r)?l("Unable to delete attachment"):u("Deleted attachment",n)},getAttachment(e){return v().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(v().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},getAttachmentsGroupedByIssue(){let e=new Map;for(let t of Object.values(v().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}=v(),r=n[e];if(!r)return l("Edit target node not found");let o=Er(r,"edit");if(o)return o;let s={...r,props:{...r.props,description:t}};return this.updateNode(s),u("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return l("Rename target node not found");let r=Er(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),u("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return be(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),s=this.getNode(t);if(!o)return l("Node not found");if(!s)return l("Target parent not found");if(r===e)return l("Cannot move root node");if(e===t)return l("Cannot move node into itself");let i=Er(o,"move");if(i)return i;if(Ru(t,e))return l("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),u("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=v(),o=this.getNode(e);if(!o)return l("Node not found");if(r===e)return l("Cannot delete root node");let s=Er(o,"delete");if(s)return s;let i=new Set,c=p=>{let m=t[p];if(!(!m||i.has(p))){i.add(p);for(let f of be(m.id))c(f.id)}};c(e);let d={...structuredClone(t)};for(let p of i){if(!d[p])return l("Unable to locate node to delete");d[p]={...d[p],isDeleted:!0}}return n?(w({nodes:d}),u("Successfully tomb stoned",o)):l("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return l("Contributor not found");let n={...t,name:xo,tombstoned:!0},r=Oe(o=>({...o,contributors:{...o.contributors,[e]:n}}));return a(r)?l("Unable to remove contributor"):u("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return l("Contributor not found");if(n.tombstoned)return l("Cannot rename a removed contributor");let r={...n,name:t},o=Oe(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?l("Unable to rename contributor"):u("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return l("Contributor not found");let r={...n,name:t,tombstoned:!1},o=Oe(s=>({...s,contributors:{...s.contributors,[e]:r}}));return a(o)?l("Unable to restore contributor"):u("Restored contributor",r)},linkContributorEmail({email:e,contributor:t,authorId:n}){if(!this.getContributor(t))return l("Unable to link email, missing contributor");let r={email:Ze(e),contributor:t,authorId:n},o=xs(r.email,t),s=v().emailLinks[o];if(s&&!s.tombstoned)return u("Email already linked",s);let i=Oe(c=>({...c,emailLinks:{...c.emailLinks,[o]:r}}));return a(i)?l("Unable to link email"):u("Linked email to contributor",r)},unlinkContributorEmail(e,t,n){let r=xs(e,t),o=v().emailLinks[r];if(!o)return l("Unable to unlink, no such link");if(o.tombstoned)return u("Email already unlinked",o);if(!ta(n,o))return l("Only the author of a link or the contributor it names may remove it");let s={...o,tombstoned:!0},i=Oe(c=>({...c,emailLinks:{...c.emailLinks,[r]:s}}));return a(i)?l("Unable to unlink email"):u("Unlinked email from contributor",s)},getEmailLinks(){return v().emailLinks},createContributor(e){let t=Oe(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?l("Unable to create contributor"):u("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return l("Unable to assign contributor, missing contributor");if(!r)return l("Unable to assign contributor, missing target");let o=Er(r,"edit");if(o)return o;if(!_(r))return l("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return l("Contributor already assigned");let i={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(i),u("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return l("Unable to unassign, missing contributor");if(!r)return l("Unable to unassign, missing target");let o=Er(r,"edit");if(o)return o;if(!_(r))return l("Target is not an issue");let s=r.props.assignees??[];if(!s.includes(t))return u("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),u("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return l("Unable to add tag, missing tag");if(!r)return l("Unable to add tag, missing target");let o=Er(r,"edit");if(o)return o;if(!_(r))return l("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return l("Tag already assigned");let i={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(i),u("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),r=this.getNode(e);if(!n)return l("Unable to remove tag, missing tag");if(!r)return l("Unable to remove tag, missing target");let o=Er(r,"edit");if(o)return o;if(!_(r))return l("Target is not an issue");let s=r.props.tags??[];if(!s.includes(t))return u("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),u("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return l("Tag not found");let n={...t,tombstoned:!0},r=Oe(o=>({...o,tags:{...o.tags,[e]:n}}));return a(r)?l("Unable to delete tag"):u("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return l("Tag not found");let r={...n,name:t,tombstoned:!1},o=Oe(s=>({...s,tags:{...s.tags,[e]:r}}));return a(o)?l("Unable to restore tag"):u("Restored tag",r)},createTag(e){let t=Oe(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?l("Could not create tag"):u("Tag created",e)},createNode(e){let t=Xr("nodes",e.id,e);return a(t)?l("Unable to create node"):u("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return l("Failed to locate node");let n={...t,readonly:!0},r=Xr("nodes",e,n);return a(r)?l(r.message):u("Locked node",n)},updateNode(e){let t=Xr("nodes",e.id,e);return a(t)?t:u("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){let t=v().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return v().tags[e]},getTags(){return Object.values(v().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return v().nodes[e]},getSiblings(e){return be(e)}};var $A=(e,t)=>e+" ".repeat(Math.max(0,t-Gv(e))),UA=(e,t)=>" ".repeat(Math.max(0,t-Gv(e)))+e,Rl=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","link.contributor.email":"Claimed","unlink.contributor.email":"Unclaimed","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),HA=(e,t)=>t?e<t?"up":e>t?"down":null:null,WA=(e,t)=>{let n=N.getNode(e.payload.parent),r=n?Sr.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=HA(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},Vv=e=>`${Math.max(1,Math.round(e/1024))} KB`,zv=e=>N.getAttachment(e)?.name??"",GA=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?Sr.bgHex(ze(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?Sr.bgHex(ze(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=v().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?Sr.hex(ze(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?Sr.hex(ze(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"link.contributor.email":case"unlink.contributor.email":return e.payload.email;case"add.issue.attachment":return`"${e.payload.name}" ${Sr.dim(`(${Vv(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=zv(e.payload.id);return t?`"${t}"`:""}default:return""}},VA=e=>{let t=fr(De(e));return Sr.gray(UA(t,8))},zA=12,KA=e=>$A(`${e}`,zA),qA=e=>{let t=de();return a(t)?e:ea(e,t.value.contributors[e]?.name)},YA=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=v().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"link.contributor.email":case"unlink.contributor.email":return e.payload.email;case"move.node":{let t=N.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${Vv(e.payload.bytes)})`;case"delete.issue.attachment":{let t=zv(e.payload.id);return t?`"${t}"`:""}default:return""}},yl=e=>[Rl(e.action),YA(e)].filter(Boolean).join(" "),Kv=(e,t)=>{let n=VA(e.id),r=KA(qA(e.userId)),o=Sr.dim("\u203A"),s=e.action==="move.node"?WA(e,t):[Rl(e.action),GA(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var XA=e=>Me(e,"comments"),JA=e=>Me(e,"description"),QA=e=>Me(e,"assignees"),ZA=e=>Me(e,"tags"),eT=e=>Me(e,"history"),tT=e=>Me(e,"diff"),nT=e=>Me(e,"attachments"),mi=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=N.getNode(e);if(!c){let m=N.createNode({...Re.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:i});return a(m)?m:u("Virtual field created",void 0)}if(!at(c))return l(`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 u("Virtual field unchanged",void 0);let p=N.updateNode({...c,title:t,parentNodeId:n,rank:r,props:{...c.props,value:o},readonly:s,childRenderAxis:i});return a(p)?p:u("Virtual field updated",void 0)},qv=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let i=N.getNode(e);if(!i){let p=N.createNode({...Re.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return a(p)?p:u("Virtual field list created",void 0)}if(!Es(i))return l(`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 u("Virtual field list unchanged",void 0);let d=N.updateNode({...i,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return a(d)?d:u("Virtual field list updated",void 0)},Cl=null,rT=()=>{if(Cl)return u("Virtual field ranks",Cl);let e=Bt(en/4n),t=Bt(en/2n),n=Bt(en*3n/4n),r=Bt(en*7n/8n),o=Bt(en*15n/16n),s=Bt(en*13n/16n),i=Bt(en*27n/32n);return a(e)?e:a(t)?t:a(n)?n:a(r)?r:a(o)?o:a(s)?s:a(i)?i:(Cl={description:e.value,assignees:t.value,tags:n.value,comments:r.value,attachments:o.value,log:s.value,diff:i.value},u("Virtual field ranks",Cl))},Ig=e=>{let t=rT();if(a(t))return t;let n=t.value,r=mi({id:JA(e.id),name:Ne.DESCRIPTION,parentNodeId:e.id,rank:n.description,value:e.props.description??"",childRenderAxis:"vertical"});if(a(r))return r;let o=qv({id:QA(e.id),name:Ne.ASSIGNEES,parentNodeId:e.id,rank:n.assignees,readonly:!0});if(a(o))return o;let s=qv({id:ZA(e.id),name:Ne.TAGS,parentNodeId:e.id,rank:n.tags,readonly:!0});if(a(s))return s;let i=mi({id:XA(e.id),name:Ne.COMMENTS,parentNodeId:e.id,rank:n.comments,value:"",readonly:!1,childRenderAxis:"vertical"});if(a(i))return i;let c=mi({id:nT(e.id),name:Ne.ATTACHMENTS,parentNodeId:e.id,rank:n.attachments,value:"",readonly:!0,childRenderAxis:"vertical"});if(a(c))return c;let d=mi({id:eT(e.id),name:Ne.HISTORY,parentNodeId:e.id,rank:n.log,value:oT(e),readonly:!0,childRenderAxis:"vertical"});if(a(d))return d;let p=mi({id:tT(e.id),name:Ne.DIFF,parentNodeId:e.id,rank:n.diff,value:"",readonly:!0,childRenderAxis:"vertical"});return a(p)?p:u("Ticket virtual nodes materialized",void 0)},oT=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=>Kv(r,n.get(r.action)??[])).join(`
|
|
99
|
-
`)},
|
|
100
|
-
`)[0]?.trim()??"";return t.length>
|
|
101
|
-
`)){let i=s.indexOf(" ");if(i===-1)continue;let c=s.slice(0,i),d=s.slice(i+1);c==="user.name"&&(r=d.trim()||null),c==="user.email"&&(o=Ze(d)||null)}return ub.set(e,{name:r,email:o,readAt:Date.now()}),{name:r,email:o}},wl=async e=>(await mb(e)).email,Rr=async e=>(await mb(e)).name;var Jr=e=>{let t=re(e??process.cwd());return a(t)?l(t.message):u("Resolved Epiq repo root",t.value)},Ml=null,NT=async(e,t)=>{let n=Jr(e);if(a(n))return n;let r=me({repoRoot:n.value});if(a(r))return l(r.message);let o=ke(n.value);if(a(o))return l(o.message);if(!(Ml!==null&&Ml.repoRoot===n.value&&Ml.stateBranchRoot===r.value&&CT.existsSync(Mr(r.value)))){let f=await Gs({repoRoot:n.value,stateBranchName:o.value});if(a(f))return l(f.message);let g=await ur({repoRoot:n.value,stateBranchRoot:r.value,stateBranchName:o.value});if(a(g))return l(g.message);Ml={repoRoot:n.value,stateBranchRoot:r.value}}if(t?.pull??!1){let f=await U({cwd:r.value,args:["pull","--ff-only"]});a(f)&&ee.info(3,f.message)}let i={repoRoot:n.value,stateBranchRoot:r.value},c=ht();a(c)||je(c.value),je({gitEmail:await wl(n.value),gitName:await Rr(n.value)});let d=et(r.value);if(ga(r.value)===d&&Rt()&&Je().mode==="live")return u("Booted Epiq state, unchanged",i);let p=rn(r.value);if(a(p))return l(p.message);let m=on(p.value.events,p.value.unreadable);return a(m)?l(m.message):(To(r.value,d),u("Booted Epiq state",i))},zt=()=>{let e=ht();return a(e)?l(e.message):e.value.userId?e.value.userName?u("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):l("Unable to retrieve user name"):l("Unable to retrieve user id")},pt=()=>{let e=de();return a(e)?l(e.message):e},Ft=e=>NT(e,{pull:!1}),ue=async e=>{let t=await Ft(e);if(a(t))return t;let n=zt();if(a(n))return n;let r=pt();return a(r)?r:u("Booted",{boot:t.value,actor:n.value,state:r.value})};var AT=e=>{let t=N.getNode(e);if(!t)return[];let n=new Set;t.parentNodeId&&n.add(t.parentNodeId);for(let r of t.log??[]){let o=r.payload;o.id===e&&o.parent&&n.add(o.parent)}return[...n]},Pl=e=>{let t=new Set;e.parentNodeId&&t.add(e.parentNodeId);for(let r of e.log??[]){let o=r.payload;o.id===e.id&&o.parent&&t.add(o.parent)}let n=new Set;for(let r of t)for(let o of AT(r))n.add(o);return[...n]},Yo=e=>bn(e).map(t=>Ke(t.id,t.name));var Xo=e=>xn(e).map(({id:t,name:n})=>Ke(t,n));import TT from"node:fs";import wT from"node:path";import{ulid as Mu}from"ulid";var tt=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Issue not found"):_(n)?n.readonly?l("Issue is readonly"):u("Found issue",n):l("Target must be an issue")},Cr=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Swimlane not found"):vn(n)?n.readonly?l("Swimlane is readonly"):u("Found swimlane",n):l("Target must be a swimlane")},wu=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Board not found"):or(n)?n.readonly?l("Board is readonly"):u("Found board",n):l("Target must be a board")};var MT=e=>{if(e.filePath)try{return u("Read attachment file",{data:TT.readFileSync(e.filePath),name:e.name??wT.basename(e.filePath)})}catch(t){return l(`Unable to read ${e.filePath}: ${t instanceof Error?t.message:String(t)}`)}return e.dataBase64?u("Decoded attachment data",{data:Buffer.from(e.dataBase64,"base64"),name:e.name??"image"}):l("Provide either filePath or dataBase64")},Ll=()=>{let e=ht();return a(e)?In:e.value.attachmentMaxKb??In},Pu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let r=MT(e);if(a(r))return r;let o=uf(t.value.boot.stateBranchRoot,r.value.data,Ll());if(a(o))return o;let s=Ee(r.value.name).trim()||"image",i=Mu(),c={id:Mu(),...D(t.value.actor),action:"add.issue.attachment",payload:{id:i,issue:e.issueId,author:t.value.actor.userId,hash:o.value.hash,ext:o.value.ext,name:s,bytes:o.value.bytes}},d=B([c],t.value.boot.stateBranchRoot);if(a(d))return l(d.message);let p=Br(o.value.hash,o.value.ext);return u("Added issue attachment",{id:i,issueId:e.issueId,fileName:p,bytes:o.value.bytes,markdown:Qc(s,p)})},Lu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(c=>c.action==="add.issue.attachment"&&c.payload.id===e.attachmentId);if(!n)return l("Unable to resolve attachment");if(n.payload.author!==t.value.actor.userId)return l("You can only delete your own attachments");let r=tt(n.payload.issue);if(a(r))return r;if(t.value.state.eventLog.some(c=>c.action==="delete.issue.attachment"&&c.payload.id===e.attachmentId))return u("Attachment already deleted",{id:e.attachmentId,issueId:n.payload.issue});let s={id:Mu(),...D(t.value.actor),action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:n.payload.issue}},i=B([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Deleted issue attachment",{id:e.attachmentId,issueId:n.payload.issue})},ku=async e=>{let t=await Ft(e.repoRoot);return a(t)?t:mf(t.value.stateBranchRoot,e.fileName,Ll())};var PT=365*24*60*60*1e3,Du=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return u("Issue description",n&&_(n)&&!n.isDeleted?n.props.description??"":"")},Qr=()=>{let e=pt();if(a(e))return e;let t=Je(),n=t.mode!=="live",r=Object.values(e.value.nodes),o=r.filter(b=>or(b)&&!b.isDeleted),s=Date.now()-PT,i=new Map,c=new Map;for(let b of r)if(!b.isDeleted){if(vn(b)&&b.parentNodeId){let R=i.get(b.parentNodeId)??[];R.push(b),i.set(b.parentNodeId,R)}if(_(b)&&b.parentNodeId){if(b.parentNodeId===he&&De(b.id)<s)continue;let R=c.get(b.parentNodeId)??[];R.push(b),c.set(b.parentNodeId,R)}}let d=new Set;for(let b of c.values())for(let R of b)d.add(R.id);let p=ht();if(a(p))return p;let m={},f=N.getCommentsGroupedByIssue();for(let b of r.filter(_))b.isDeleted||!d.has(b.id)||(m[b.id]=(f.get(b.id)??[]).map(R=>{let S=N.getContributor(R.authorId);return{id:R.id,issueId:R.issue,body:R.md,author:Ke(R.authorId,S?.name),createdAt:De(R.id)}}));let g=new Map;for(let b of e.value.eventLog)b.action==="add.issue.attachment"&&g.set(b.payload.id,b.payload.author);let h={},x=N.getAttachmentsGroupedByIssue();for(let b of r.filter(_))b.isDeleted||!d.has(b.id)||(h[b.id]=(x.get(b.id)??[]).map(R=>({id:R.id,issueId:R.issue,name:R.name,fileName:Br(R.hash,R.ext),bytes:R.bytes,createdAt:De(R.id),canDelete:g.get(R.id)===p.value.userId})));return u("Retrieved Epiq GUI state",{boards:o.sort((b,R)=>b.rank.localeCompare(R.rank)).map(b=>({id:b.id,ref:H(b.id),title:b.title,readonly:!!b.readonly||n,swimlanes:(i.get(b.id)??[]).sort((R,S)=>R.rank.localeCompare(S.rank)).map(R=>({id:R.id,title:R.title,readonly:!!R.readonly||n,issues:(c.get(R.id)??[]).sort((S,A)=>S.rank.localeCompare(A.rank)).map(S=>({id:S.id,ref:H(S.id),title:Ee(S.title),description:S.props.description??"",createdAt:De(S.id),enteredLaneAt:Nl(S.log??[],De(S.id)),readonly:!!S.readonly||n,tags:Yo(S),assignees:Xo(S),parentNodeId:S.parentNodeId,isClosed:S.parentNodeId===he,boardIds:Pl(S)})),parentNodeId:R.parentNodeId}))})),tags:N.getTags().map(b=>({...b,...Ke(b.id,b.name)})),contributors:Object.values(e.value.contributors).map(b=>({...b,...Ke(b.id,b.name)})),user:{id:p.value.userId??"",name:p.value.userName??"",color:ze(p.value.userName??"")},commentsByIssueId:m,attachmentsByIssueId:h,attachmentMaxKb:Ll(),timeTravel:t})},pb=null,LT=e=>{if(e===pb)return;let t=oa({root:e});if(a(t)){ee.info(t.message);return}pb=e},Kt=async(e={})=>{if(Je().mode!=="live")return Qr();let t=await Ft(e.repoRoot);return a(t)?t:(LT(t.value.repoRoot),Qr())},fi=async(e={})=>{Mo();let t=Jr(e.repoRoot);if(a(t))return l("Sync failed");let n=zt();if(a(n))return n;let r=await Ua({cwd:t.value,ownEventFileName:ar(n.value)});return a(r)?(Cd(r.message),r):(Ur(),u("Synced",r.value))};import{ulid as qt}from"ulid";var gi=e=>{let t=[...new Set([...e.issueIds??[],...e.issueId?[e.issueId]:[]])];return t.length?u("Resolved targets",t):l("Provide issueId or issueIds")},Jo=(e,t)=>{let n=t.done.length,r=`${e} ${n} issue${n===1?"":"s"}`+(t.failed.length?`, ${t.failed.length} failed`:"");return n?u(r,t):l(`${r}: ${t.failed.map(o=>`${o.ref} ${o.reason}`).join("; ")}`)},hi=(e,t)=>{let n={done:[],failed:[]};for(let r of e){let o=t(r);a(o)?n.failed.push({id:r,ref:H(r),reason:o.message}):n.done.push({id:r,ref:H(r)})}return n};var hb=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase();async function Fu(e){let t=await Ft(e.repoRoot);if(a(t))return t;let n=pt();if(a(n))return n;let r=n.value.nodes,o=e.query?.trim().toLowerCase(),s=Object.values(r).filter(_).filter(c=>!c.isDeleted).filter(c=>e.includeClosed||c.parentNodeId!==he).filter(c=>e.boardId?(c.parentNodeId?r[c.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).filter(c=>!e.swimlaneId||c.parentNodeId===e.swimlaneId).filter(c=>!e.tag||Yo(c).some(d=>hb(d.name,e.tag))).filter(c=>!e.assignee||Xo(c).some(d=>hb(d.name,e.assignee))).filter(c=>!o||c.title.toLowerCase().includes(o)||(c.props.description??"").toLowerCase().includes(o)),i=c=>Ee((c.parentNodeId?r[c.parentNodeId]?.title:void 0)??"");return e.brief?u("Listed issues",s.map(c=>({id:c.id,ref:H(c.id),title:Ee(c.title),swimlane:i(c),tags:Yo(c).map(d=>d.name),assignees:Xo(c).map(d=>d.name)}))):u("Listed issues",s.map(c=>({id:c.id,ref:H(c.id),title:Ee(c.title),description:c.props.description??"",createdAt:De(c.id),enteredLaneAt:Nl(c.log??[],De(c.id)),parentNodeId:c.parentNodeId,isClosed:c.parentNodeId===he,boardIds:Pl(c),readonly:!!c.readonly,tags:Yo(c),assignees:Xo(c)})))}var _u=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Ee(e.title);if(!n)return l("Issue title cannot be empty");let r=e.description??"",o=lt("Issue title",n,300)??lt("Issue description",r,2e4);if(o)return l(o);if((e.tagNames?.length??0)>20)return l(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return l(`Cannot set more than ${20} assignees at once`);let s=Cr(e.parentId);if(a(s))return s;let i=Wn(e.parentId,t.value.actor,t.value.boot.stateBranchRoot);if(a(i))return i;let c=dl({name:n,parent:e.parentId,user:t.value.actor,rank:i.value});if(a(c))return c;let d=[...c.value],p=d.find(h=>h.action==="add.issue")?.payload.id;if(!p)return l("Unable to determine created issue id");r&&d.push({id:qt(),...D(t.value.actor),action:"edit.description",payload:{id:p,md:r}});let m=[];for(let h of e.tagNames??[]){let x=Ee(h).trim();if(!x||m.some(A=>A.name===x))continue;let b=lt("Tag name",x,60);if(b)return l(b);let R=N.findTagByName(x),S=R?.id??qt();R||d.push({id:qt(),...D(t.value.actor),action:"create.tag",payload:{id:S,name:x}}),d.push({id:qt(),...D(t.value.actor),action:"add.issue.tag",payload:{id:p,tag:S}}),m.push({id:S,name:x})}let f=[];for(let h of e.assigneeNames??[]){let x=Ee(h).trim();if(!x||f.some(A=>A.name===x))continue;let b=lt("Assignee name",x,80);if(b)return l(b);let R=Object.values(t.value.state.contributors).find(A=>A.name===x),S=R?.id??qt();R||d.push({id:qt(),...D(t.value.actor),action:"create.contributor",payload:{id:S,name:x}}),d.push({id:qt(),...D(t.value.actor),action:"add.issue.assignee",payload:{id:p,assignee:S}}),f.push({id:S,name:x})}let g=B(d,t.value.boot.stateBranchRoot);return a(g)?l(g.message):u("Created issue",{id:p,ref:H(p),title:n,parentId:e.parentId,description:r,tags:m,assignees:f})},kT=(e,t,n)=>{let r=tt(e);if(a(r))return r;let o=Cn(he,e,{at:"end"},t,n);if(a(o))return o;let s={id:qt(),...D(t),action:"close.issue",payload:{id:e,parent:he,rank:o.value}},i=B([s],n);return a(i)?l(i.message):u("Closed issue",{id:e,ref:H(e)})};async function ju(e){let t=await Ft(e.repoRoot);if(a(t))return t;let n=zt();if(a(n))return n;let r=gi(e);if(a(r))return r;let o=s=>kT(s,n.value,t.value.stateBranchRoot);return e.issueIds?Jo("Closed",hi(r.value,o)):o(r.value[0])}var $u=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[e.issueId];if(!n||n.isDeleted)return l("Issue not found");if(!_(n))return l("Target must be an issue");if(n.parentNodeId!==he)return l("Issue is not closed");let r=vl(n);if(!r)return l("Unable to resolve previous parent from issue history");if(r===he)return l("Previous parent resolves to closed swimlane");let o=Cr(r);if(a(o))return o;let s=o.value,i=Cn(s.id,n.id,{at:"end"},t.value.actor,t.value.boot.stateBranchRoot);if(a(i))return i;let c={id:qt(),...D(t.value.actor),action:"reopen.issue",payload:{id:n.id,parent:s.id,rank:i.value}},d=B([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Reopened issue",{id:n.id,ref:H(n.id),parentId:s.id})},DT=(e,t,n,r)=>{let o=tt(e);if(a(o))return o;let s=Cr(t.parentId);if(a(s))return s;let i=Cn(t.parentId,e,t.position??{at:"end"},n,r);if(a(i))return i;let c={id:qt(),...D(n),action:"move.node",payload:{id:e,parent:t.parentId,rank:i.value}},d=B([c],r);return a(d)?l(d.message):u("Moved issue",{id:e,ref:H(e),parentId:t.parentId})};async function Uu(e){let t=Jr(e.repoRoot);if(a(t))return t;let n=zt();if(a(n))return n;let r=me({repoRoot:t.value});if(a(r))return r;let o=rn(r.value);if(a(o))return o;let s=on(o.value.events,o.value.unreadable);if(a(s))return s;let i=gi(e);if(a(i))return i;let c=d=>DT(d,e,n.value,r.value);return e.issueIds?Jo("Moved",hi(i.value,c)):c(i.value[0])}var Hu=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return n?u("Read issue history",(n.log??[]).map(r=>({id:r.id,t:De(r.id),action:r.action,label:yl(r),...r.action==="move.node"?{parentId:r.payload.parent}:{},actor:Ke(r.userId,t.value.contributors[r.userId]?.name)}))):l("Issue not found")},Wu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let r=n.value,o=lt("Issue description",e.description,2e4);if(o)return l(o);let s=r.props.description??"";if(s===e.description)return u("No changes made",{id:e.issueId,ref:H(e.issueId),description:s});let i={id:qt(),...D(t.value.actor),action:"edit.description",payload:{id:e.issueId,md:e.description}},c=B([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue description",{id:e.issueId,ref:H(e.issueId),description:e.description})},Gu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let r=n.value,o=Ee(e.title);if(!o.trim())return l("Issue title cannot be empty");let s=lt("Issue title",o,300);if(s)return l(s);if(r.title===o)return u("No changes made",{id:e.issueId,ref:H(e.issueId),title:o});let i={id:qt(),...D(t.value.actor),action:"edit.title",payload:{id:e.issueId,name:o}},c=B([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue title",{id:e.issueId,ref:H(e.issueId),title:o})};import{ulid as Nr}from"ulid";var Vu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[t.value.state.rootNodeId];if(!n)return l("Workspace not found");if(Je().mode!=="live")return l("Cannot add a board while time travelling");let r=Ee(e.title);if(!r.trim())return l("Board title cannot be empty");let o=lt("Board title",r,300);if(o)return l(o);let s=Wn(n.id,t.value.actor,t.value.boot.stateBranchRoot);if(a(s))return s;let i=Nr(),c={id:Nr(),...D(t.value.actor),action:"add.board",payload:{id:i,name:r,parent:n.id,rank:s.value}},d=B([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Created board",{id:i,ref:H(i),title:r})},zu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[e.boardId];if(!n||n.isDeleted)return l("Board not found");if(!or(n))return l("Edit target must be a board");if(n.readonly)return l("Cannot edit readonly board");if(Je().mode!=="live")return l("Cannot rename a board while time travelling");let r=Ee(e.title);if(!r.trim())return l("Board title cannot be empty");let o=lt("Board title",r,300);if(o)return l(o);if(n.title===r)return u("No changes made",{id:e.boardId,ref:H(e.boardId),title:r});let s={id:Nr(),...D(t.value.actor),action:"edit.title",payload:{id:e.boardId,name:r}},i=B([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Edited board title",{id:e.boardId,ref:H(e.boardId),title:r})};var Ku=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=wu(e.boardId);if(a(n))return n;if(Je().mode!=="live")return l("Cannot add a swimlane while time travelling");let r=Ee(e.title);if(!r.trim())return l("Swimlane title cannot be empty");let o=lt("Swimlane title",r,300);if(o)return l(o);let s=Wn(e.boardId,t.value.actor,t.value.boot.stateBranchRoot);if(a(s))return s;let i=Nr(),c={id:Nr(),...D(t.value.actor),action:"add.swimlane",payload:{id:i,name:r,parent:e.boardId,rank:s.value}},d=B([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Created swimlane",{id:i,ref:H(i),title:r,boardId:e.boardId})},qu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Cr(e.swimlaneId);if(a(n))return n;let r=n.value,o=Ee(e.title);if(!o.trim())return l("Swimlane title cannot be empty");let s=lt("Swimlane title",o,300);if(s)return l(s);if(r.title===o)return u("No changes made",{id:e.swimlaneId,ref:H(e.swimlaneId),title:o});let i={id:Nr(),...D(t.value.actor),action:"edit.title",payload:{id:e.swimlaneId,name:o}},c=B([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited swimlane title",{id:e.swimlaneId,ref:H(e.swimlaneId),title:o})},Yu=async e=>{let t=Jr(e.repoRoot);if(a(t))return t;let n=zt();if(a(n))return n;let r=me({repoRoot:t.value});if(a(r))return r;let o=rn(r.value);if(a(o))return o;let s=on(o.value.events,o.value.unreadable);if(a(s))return s;let i=Cr(e.swimlaneId);if(a(i))return i;let c=wu(e.boardId);if(a(c))return c;let d=Cn(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,r.value);if(a(d))return d;let p={id:Nr(),...D(n.value),action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:d.value}},m=B([p],r.value);return a(m)?l(m.message):u("Moved swimlane",{id:e.swimlaneId,ref:H(e.swimlaneId),boardId:e.boardId})},Xu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Cr(e.swimlaneId);if(a(n))return n;let r={id:Nr(),...D(t.value.actor),action:"delete.node",payload:{id:e.swimlaneId}},o=B([r],t.value.boot.stateBranchRoot);return a(o)?l(o.message):u("Deleted swimlane",{id:e.swimlaneId,ref:H(e.swimlaneId)})};import{ulid as yi}from"ulid";async function Ju(e){let t=await Ft(e.repoRoot);if(a(t))return t;let n=zt();if(a(n))return n;let r=gi(e);if(a(r))return r;let o=Ee(e.tagName).trim();if(!o)return l("Tag name cannot be empty");let s=lt("Tag name",o,60);if(s)return l(s);let i=hi(r.value,tt);if(!e.issueIds&&i.failed[0])return l(i.failed[0].reason);if(i.done.length===0)return l(Jo("Tagged",i).message);let c=N.findTagByName(o),d=c?.id??yi(),p=[...c?[]:[{id:yi(),...D(n.value),action:"create.tag",payload:{id:d,name:o}}],...i.done.map(({id:h})=>({id:yi(),...D(n.value),action:"add.issue.tag",payload:{id:h,tag:d}}))],m=B(p,t.value.stateBranchRoot);if(a(m))return l(m.message);let f={id:d,name:o};if(!e.issueIds)return u("Added issue tag",{...i.done[0],tag:f});let g=Jo("Tagged",i);return a(g)?g:u(g.message,{...g.value,tag:f})}var Qu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.tags[e.tagId];if(!n)return l("Tag not found");if(n.tombstoned)return l("Tag is already deleted");let r=[{id:yi(),...D(t.value.actor),action:"tombstone.tag",payload:{id:e.tagId}}],o=B(r,t.value.boot.stateBranchRoot);return a(o)?l(o.message):u("Deleted tag",{id:n.id,name:n.name})};var Zu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;if(!t.value.state.tags[e.tagId])return l("Tag not found");let r={id:yi(),...D(t.value.actor),action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},o=B([r],t.value.boot.stateBranchRoot);return a(o)?l(o.message):u("Removed issue tag",{id:e.issueId,ref:H(e.issueId),tagId:e.tagId})};import{ulid as eo}from"ulid";var vb=async(e,t)=>{let n=cr(e).get(t);return n===void 0?void 0:{id:t,name:n}},em=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let r=e.self?t.value.actor.userId:e.assigneeId;if(r){let h=t.value.state.contributors[r],x=h?void 0:await vb(t.value.boot.stateBranchRoot,r);if(!h&&!x)return l("Unknown assignee id");let b=h??x,R=[...h?[]:[{id:eo(),...D(t.value.actor),action:"create.contributor",payload:{id:b.id,name:b.name}}],{id:eo(),...D(t.value.actor),action:"add.issue.assignee",payload:{id:e.issueId,assignee:b.id}}],S=B(R,t.value.boot.stateBranchRoot);return a(S)?l(S.message):u("Added issue assignee",{id:e.issueId,ref:H(e.issueId),assignee:{id:b.id,name:b.name}})}let o=Ee(e.assigneeName??"").trim();if(!o)return l("Provide assigneeId, self or assigneeName");let s=lt("Assignee name",o,80);if(s)return l(s);let i=ci({events:t.value.state.eventLog??[],registry:t.value.state.contributors,logFileNames:cr(t.value.boot.stateBranchRoot)}).filter(h=>h.name===o);if(i.length>1)return l(`"${o}" matches ${i.length} contributors (${i.map(({id:h})=>h).join(", ")}). Assign by assigneeId to choose.`);let c=i[0];if(!c&&!e.createUnlinked)return l(`No contributor named "${o}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let d=c?.id??eo(),p=c?.name??o,f=[...!!t.value.state.contributors[d]?[]:[{id:eo(),...D(t.value.actor),action:"create.contributor",payload:{id:d,name:p}}],{id:eo(),...D(t.value.actor),action:"add.issue.assignee",payload:{id:e.issueId,assignee:d}}],g=B(f,t.value.boot.stateBranchRoot);return a(g)?l(g.message):u("Added issue assignee",{id:e.issueId,ref:H(e.issueId),assignee:{id:d,name:p}})},tm=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;if(!t.value.state.contributors[e.contributorId])return l("Contributor not found");if(await vb(t.value.boot.stateBranchRoot,e.contributorId))return l("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let o=[{id:eo(),...D(t.value.actor),action:"tombstone.contributor",payload:{id:e.contributorId}}],s=B(o,t.value.boot.stateBranchRoot);return a(s)?l(s.message):u("Tombstoned contributor",{id:e.contributorId,name:xo})};var nm=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=dr(t.value.boot.stateBranchRoot);if(a(n))return l(n.message);let r=e.boardId?tb(n.value,e.boardId):n.value,o=new Set,s=Eg(t.value.boot.stateBranchRoot);if(a(s))return l(s.message);for(let d of s.value)d.userId&&o.add(d.userId);let i=t.value.state.contributors,c=ci({events:r,registry:i,logFileNames:cr(t.value.boot.stateBranchRoot)}).map(({id:d,name:p,isExternal:m})=>({...Ke(d,p),isSelf:d===t.value.actor.userId,isExternal:m,isRemoved:i[d]?.tombstoned===!0,hasAuthoredAnywhere:o.has(d)}));return u("Listed board contributors",c)},rm=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;if(!t.value.state.contributors[e.assigneeId])return l("Assignee not found");let r={id:eo(),...D(t.value.actor),action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},o=B([r],t.value.boot.stateBranchRoot);return a(o)?l(o.message):u("Removed issue assignee",{id:e.issueId,ref:H(e.issueId),assigneeId:e.assigneeId})};import{ulid as kl}from"ulid";var vi=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let r=e.body.trim();if(!r)return l("Comment cannot be empty");if(r.length>4e3)return l(`Comment cannot exceed ${4e3} characters (got ${r.length})`);let o=kl(),s={id:kl(),...D(t.value.actor),action:"add.issue.comment",payload:{id:o,issue:e.issueId,md:r,author:t.value.actor.userId}},i=B([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Added issue comment",{id:o,issueId:e.issueId,body:r})},bi=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(c=>c.action==="add.issue.comment"&&c.payload.id===e.commentId);if(!n)return l("Unable to resolve comment");if(n.payload.author!==t.value.actor.userId)return l("You can only delete your own comments");let r=tt(n.payload.issue);if(a(r))return r;if(t.value.state.eventLog.some(c=>c.action==="delete.issue.comment"&&c.payload.id===e.commentId))return u("Comment already deleted",{id:e.commentId,issueId:n.payload.issue});let s={id:kl(),...D(t.value.actor),action:"delete.issue.comment",payload:{id:e.commentId,issue:n.payload.issue}},i=B([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Deleted issue comment",{id:e.commentId,issueId:n.payload.issue})},om=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(d=>d.action==="add.issue.comment"&&d.payload.id===e.commentId);if(!n)return l("Unable to resolve comment");if(n.payload.author!==t.value.actor.userId)return l("You can only edit your own comments");let r=tt(n.payload.issue);if(a(r))return r;if(t.value.state.eventLog.some(d=>d.action==="delete.issue.comment"&&d.payload.id===e.commentId))return l("Comment was deleted");let s=e.body.trim();if(!s)return l("Comment cannot be empty");if(s.length>4e3)return l(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let i={id:kl(),...D(t.value.actor),action:"edit.issue.comment",payload:{id:e.commentId,issue:n.payload.issue,md:s}},c=B([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue comment",{id:e.commentId,issueId:n.payload.issue,body:s})};import{ulid as bb}from"ulid";var sm=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;if(!nr(e.email))return l(`Not an email address: ${e.email}`);let n=Ze(e.email),r=e.contributorId??t.value.actor.userId;if(!t.value.state.contributors[r])return l(`Unknown contributor: ${r}`);let o=Is(t.value.state.emailLinks,n);if(o.includes(r))return u(`${n} is already yours`,{contributor:r,email:n,contested:o.filter(i=>i!==r)});let s=B([{id:bb(),action:"link.contributor.email",payload:{contributor:r,email:n},userId:t.value.actor.userId}],t.value.boot.stateBranchRoot);return a(s)?l(s.message):u(o.length>0?`Claimed ${n}, but somebody else claims it too, so it now resolves to neither of you`:`Claimed ${n}`,{contributor:r,email:n,contested:o})},im=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Ze(e.email),r=e.contributorId??t.value.actor.userId,o=t.value.state.emailLinks[xs(n,r)];if(!o||o.tombstoned)return l(`No such link: ${n} to ${r}`);if(!ta(t.value.actor.userId,o))return l("Only whoever made a claim, or the contributor it names, may undo it");let s=B([{id:bb(),action:"unlink.contributor.email",payload:{contributor:r,email:n},userId:t.value.actor.userId}],t.value.boot.stateBranchRoot);return a(s)?l(s.message):u(`Unclaimed ${n}`,{contributor:r,email:n})},Dl=async(e={})=>{let t=await Ft(e.repoRoot);if(a(t))return t;let n=pt();if(a(n))return n;let{emailLinks:r,contributors:o}=n.value,s=new Map;for(let f of Object.values(r)){if(f.tombstoned)continue;let g=s.get(f.email)??new Set;g.add(f.contributor),s.set(f.email,g)}let i=[...s.entries()].map(([f,g])=>({email:f,contested:g.size>1,claimants:[...g].map(h=>Ke(h,o[h]?.name))})).sort((f,g)=>f.email.localeCompare(g.email)),c=zt(),d=a(c)?[]:yn(r,c.value.userId),p=V().gitEmail,m=p?Is(r,p).filter(f=>a(c)||f!==c.value.userId):[];return u("Listed contributor emails",{emails:i,mine:d,git:p?{email:p,linkedToMe:d.includes(p),heldByOthers:m.map(f=>Ke(f,o[f]?.name))}:null})},Bl=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let{userId:n,userName:r}=t.value.actor,o=ke(t.value.boot.repoRoot),s=await Mn({repoRoot:t.value.boot.repoRoot,stateBranch:a(o)?void 0:o.value,names:[r,await Rr(t.value.boot.repoRoot)],links:t.value.state.emailLinks});if(a(s))return s;let i=xr(s.value),c=i.filter(d=>d.looksLikeYours);return u(i.length===0?"No unclaimed addresses in this history":`${i.length} unclaimed address(es) in this history, ${c.length>0?`${c.length} of which look like yours`:"none obviously yours"}. Show them to the user and link only the ones they confirm; each is a permanent event that replicates to every clone.`,{contributor:n,candidates:i,likely:c.length})};var xb=(e,t)=>{let n=0,r=0,o=null;for(let s of e){if(s.userId!==t)continue;s.action==="add.issue"&&n++,s.action==="add.issue.comment"&&r++;let i=bo(s.id);if(a(i))continue;let c=i.value.getTime();(o===null||c<o)&&(o=c)}return{tickets:n,comments:r,joinedAt:o}};var am=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let{userId:n,userName:r}=t.value.actor,o=xb(t.value.state.eventLog,n),s=ke(t.value.boot.repoRoot),i=await Mn({repoRoot:t.value.boot.repoRoot,stateBranch:a(s)?void 0:s.value,names:[r,await Rr(t.value.boot.repoRoot)],links:t.value.state.emailLinks}),c=a(i)?[]:i.value.filter(d=>d.claimedBy.length===1&&d.claimedBy[0]===n);return u("Derived personal stats",{...o,scanned:!a(i),commits:c.reduce((d,p)=>d+p.commits,0),claimedEmails:c.length})};import BT from"node:fs";import Ib from"node:path";var xi=Number(process.env.EPIQ_GUI_PORT)||3710,lm="/api/instance",cm="epiq",Ol=e=>{try{return BT.realpathSync(Ib.resolve(e))}catch{return Ib.resolve(e)}},OT=e=>{let t=e;return typeof t=="object"&&t!==null&&t.app===cm&&typeof t.repoRoot=="string"&&typeof t.version=="string"&&typeof t.pid=="number"},Eb=async(e,t=500)=>{let n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let o=await fetch(`http://127.0.0.1:${e}${lm}`,{signal:n.signal});if(!o.ok)return null;let s=await o.json();return OT(s)?s:null}catch{return null}finally{clearTimeout(r)}};var Sb=e=>{let t,n=!1,r=!1,o=0,s=()=>{let m=hn();return a(m)?(ee.error(m.message),null):m.value},i=()=>{let m=s();if(!m)return!1;let f=ht();return a(f)?!1:!!m.autoSync&&xl(f.value)===null},c=()=>{let m=mo(s()?.autoSyncDebounceMs);return Math.max(0,m-(Date.now()-o))},d=async()=>{if(!(n||r)&&i()){r=!0,o=Date.now();try{await Pn(async()=>{Je().mode==="live"&&(await fi({repoRoot:e.project.repoRoot}),await e.publisher.publishIfLogMoved())})}finally{r=!1,p()}}};function p(){n||!i()||r||t||(t=setTimeout(()=>{t=void 0,d()},c()))}return p(),{queueSync:p,reschedule:()=>{t&&(clearTimeout(t),t=void 0),p()},dispose:()=>{n=!0,t&&clearTimeout(t)}}};var Fl=(e,t)=>{let n,r=!1,o=async()=>{let s=Date.now();try{await e()}catch(i){logger.error("[watch] check threw",i)}r||(n=setTimeout(o,Math.max(t,Date.now()-s)))};return n=setTimeout(o,t),()=>{r=!0,n&&clearTimeout(n)}};var FT=/^(```|~~~)[^\n]*\n[\s\S]*?\n\1[ \t]*$/gm,_T=/^(?:```|~~~)[\s\S]*$/m,jT=/^[ \t]*\|?[ \t]*:?-{2,}:?[ \t]*(?:\|[ \t]*:?-{2,}:?[ \t]*)*\|?[ \t]*$/gm,$T=/^[ \t]*\|.*$/gm,UT=/!\[[^\]]*\]\([^)]*\)/g,HT=/\[([^\]]*)\]\([^)]*\)/g,WT=/^[ \t]*(?:[#>]+[ \t]*|[-*+][ \t]+|\d+[.)][ \t]+)/gm,GT=/^[ \t]*(?:-{3,}|\*{3,}|_{3,})[ \t]*$/gm,VT=/[*`~]/g,zT=/(?<![0-9A-Za-z])_|_(?![0-9A-Za-z])/g,KT=e=>Ee(e.replace(FT," ").replace(_T," ").replace(UT," ").replace(HT,"$1").replace(GT," ").replace(jT," ").replace($T,t=>t.replaceAll("|"," ")).replace(WT,"").replace(VT,"").replace(zT,"")),qT=.5,Rb=(e,t)=>{if(t<=0)return"";let n=KT(e);if(n.length<=t)return n;let r="\u2026",o=t-r.length;if(o<=0)return r.slice(0,t);let s=n.slice(0,o),i=s.lastIndexOf(" ");return`${(i>=o*qT?s.slice(0,i):s).trimEnd()}${r}`};var YT=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))}),to=e=>a(e)?e:u(e.message,YT(e.value)),XT=(e,t)=>(e.boards??[]).flatMap(n=>n.swimlanes??[]).flatMap(n=>n.issues??[]).find(n=>n.id===t),Cb=(e,t)=>{let n=XT(e,t);return{issueId:t,description:n?.description??"",comments:e.commentsByIssueId?.[t]??[]}},JT=280,Nb=(e,t)=>({issueId:e,excerpt:Rb(t,JT)});var QT=1e3,Ab=e=>{let t=re(e.repoRoot);if(a(t))return null;let n=me({repoRoot:t.value});return a(n)?null:n.value},Tb=e=>{let n=(()=>{let o=Ab(e.project);return o===null?null:et(o)})();return{publishIfLogMoved:async()=>{let o=Ab(e.project);if(o===null||await ja(o))return;let s=et(o);if(s===n)return;n=s;let i=to(await Kt({repoRoot:e.project.repoRoot}));a(i)||$r({type:"state",payload:i})}}},wb=(e,t=QT)=>Fl(()=>Pn(async()=>{Je().mode==="live"&&await e.publishIfLogMoved()}),t);var ZT=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),dm=(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:!ZT.has(n.hostname)},Mb=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:dm(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 jw}from"ws";var Ln=e=>({path:e.path,sha:e.shas[e.shas.length-1]??""});var ew=e=>{let t=e.lastIndexOf("/");return t===-1?".":e.slice(0,t)},Pb=({commits:e,patch:t})=>{let n=e.map(i=>i.time),o=t.files.map(i=>({...Ln(i),changed:i.addedCount+i.removed})).reduce((i,c)=>i===null||c.changed>i.changed?c:i,null),s=t.insertions+t.deletions;return{commits:e.length,authors:[...new Set(e.map(i=>i.author))].sort(),firstCommitAt:n.length?Math.min(...n):null,lastCommitAt:n.length?Math.max(...n):null,files:t.files.length,filesAdded:t.files.filter(i=>i.status==="added").length,filesModified:t.files.filter(i=>i.status==="modified").length,filesDeleted:t.files.filter(i=>i.status==="deleted").length,binaryFiles:t.files.filter(i=>i.binary).length,directories:new Set(t.files.map(i=>ew(i.path))).size,insertions:t.insertions,deletions:t.deletions,net:t.insertions-t.deletions,largestFile:o,concentration:o&&s>0?o.changed/s:0,selfChurn:t.selfChurn,truncated:t.truncated}};var nt={line:["//"],block:[["/*","*/"]]},Yt={line:["#"],block:[]},um={line:["--"],block:[]},Qo={line:[],block:[["<!--","-->"]]},tw={line:[],block:[]},q=(e,t)=>({name:e,comment:t}),_l=q("TypeScript",nt),jl=q("JavaScript",nt),Lb={ts:_l,tsx:_l,mts:_l,cts:_l,js:jl,jsx:jl,mjs:jl,cjs:jl,py:q("Python",{line:["#"],block:[['"""','"""']]}),rb:q("Ruby",{line:["#"],block:[["=begin","=end"]]}),go:q("Go",nt),rs:q("Rust",nt),java:q("Java",nt),kt:q("Kotlin",nt),swift:q("Swift",nt),c:q("C",nt),h:q("C",nt),cc:q("C++",nt),cpp:q("C++",nt),hpp:q("C++",nt),cs:q("C#",nt),php:q("PHP",nt),scala:q("Scala",nt),dart:q("Dart",nt),lua:q("Lua",um),hs:q("Haskell",um),sql:q("SQL",um),ex:q("Elixir",Yt),exs:q("Elixir",Yt),pl:q("Perl",Yt),r:q("R",Yt),jl:q("Julia",Yt),sh:q("Shell",Yt),bash:q("Shell",Yt),zsh:q("Shell",Yt),vue:q("Vue",Qo),svelte:q("Svelte",Qo),html:q("HTML",Qo),xml:q("XML",Qo),md:q("Markdown",Qo),mdx:q("Markdown",Qo),css:q("CSS",{line:[],block:[["/*","*/"]]}),scss:q("CSS",nt),less:q("CSS",nt),yml:q("YAML",Yt),yaml:q("YAML",Yt),toml:q("TOML",Yt),ini:q("INI",Yt),json:q("JSON",tw)},nw="Other",kb=e=>{let t=e.slice(e.lastIndexOf("/")+1),n=t.lastIndexOf(".");return n<=0?"":t.slice(n+1).toLowerCase()},no=e=>Lb[kb(e)]?.name??nw,Ii=e=>Lb[kb(e)]?.comment??null,rw=[/\.(test|spec)\.[a-z0-9]+$/i,/(^|\/)test_[^/]+\.py$/,/_test\.[a-z0-9]+$/i,/(^|\/)conftest\.py$/,/Tests?\.(java|kt|cs|scala)$/],ow=/(^|\/)(tests?|__tests__|spec|specs|e2e|src\/test|features)\//i,Zo=e=>ow.test(e)||rw.some(t=>t.test(e)),sw=/(^|\/)(package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|Cargo\.lock|go\.sum|poetry\.lock|Gemfile\.lock|composer\.lock)$/,iw=/(^|\/)(node_modules|dist|build|out|target|vendor|coverage|\.next|__snapshots__)\//,aw=/(\.min\.(js|css)|\.map|\.snap|\.pb\.go|_pb2\.py)$/,un=e=>sw.test(e)||iw.test(e)||aw.test(e),Db=e=>/(^|\/)(package\.json|go\.mod|Cargo\.toml|requirements[^/]*\.txt|pyproject\.toml|Gemfile|composer\.json|pom\.xml|build\.gradle(\.kts)?)$/.test(e),Bb=e=>/(^|\/)\.github\/workflows\//.test(e)||/(^|\/)(Dockerfile|docker-compose[^/]*\.ya?ml|Makefile|Jenkinsfile|\.gitlab-ci\.yml)$/.test(e)||/\.tf$/.test(e),Ob=e=>/\.(md|mdx|rst|txt)$/i.test(e)||/(^|\/)docs?\//i.test(e),lw=/\b(it|test|describe|context|suite)\.skip\b|\bx(it|describe|test)\s*\(|@pytest\.mark\.skip|@unittest\.skip|\bt\.Skip\s*\(|@(Ignore|Disabled)\b/,cw=/\b(it|test|describe|context|suite)\.only\b|\bf(it|describe|test)\s*\(/,Fb=e=>lw.test(e),_b=e=>cw.test(e);var jb=/\b(TODO|FIXME|HACK|XXX)\b/,dw=/[;{}]\s*$|^\s*(const|let|var|function|def|class|if|for|while|return|import|export|await|print)\b.*[=(]/,mm=(e,t)=>{let n=e.trim();return n===""?"blank":t&&(t.line.some(r=>n.startsWith(r))||t.block.some(([r])=>n.startsWith(r))||t.block.some(([r])=>r==="/*")&&(n.startsWith("*")||n.startsWith("*/")))?"comment":"code"},uw=(e,t)=>{let n=e.trim();for(let r of[...t.line,...t.block.flat(),"*"])if(n.startsWith(r)){n=n.slice(r.length).trim();break}return n},$b=({patch:e,repoShareByLanguage:t})=>{let n=new Map,r=0,o=0,s=0,i=0,c=0,d=0;for(let m of e.files){if(m.binary||un(m.path))continue;let f=Ii(m.path);if(!f||f.line.length===0&&f.block.length===0)continue;let g=no(m.path),h=n.get(g)??{comment:0,code:0};for(let{text:x}of m.added){let b=mm(x,f);if(jb.test(x)&&i++,b==="blank"){s++;continue}if(b==="comment"){r++,h.comment++,f&&dw.test(uw(x,f))&&d++;continue}o++,h.code++}for(let{text:x}of m.removedLines)jb.test(x)&&c++;n.set(g,h)}let p=r+o;return{byLanguage:[...n.entries()].map(([m,f])=>({name:m,commentLines:f.comment,codeLines:f.code,share:f.comment+f.code===0?0:f.comment/(f.comment+f.code),repoShare:t?.get(m)??null})).sort((m,f)=>f.commentLines+f.codeLines-(m.commentLines+m.codeLines)),commentLines:r,codeLines:o,blankLines:s,share:p===0?0:r/p,todoLinesAdded:i,todoLinesRemoved:c,commentedOutCodeLines:d}};var mw=/\bconsole\.(log|debug|dir)\s*\(|\bdebugger\b|^\s*print\s*\(|\bfmt\.Print(ln|f)?\s*\(|\bSystem\.out\.print|\bdbg!\s*\(/,$l=6,pm=10,pw=e=>{let t=0;for(let n of e){if(n.trim()===""||n.startsWith(" "))continue;let r=n.length-n.trimStart().length;r>0&&(t===0||r<t)&&(t=r)}return Math.min(Math.max(t,2),8)},fw=(e,t)=>{let n=e.length-e.trimStart().length;if(n===0)return 0;let r=e.slice(0,n).split(" ").length-1;return r>0?r:Math.floor(n/t)},gw=e=>{if(e.length<$l*2)return 0;let t=new Map,n=new Array(e.length).fill(!1);for(let r=0;r+$l<=e.length;r++){let o=e.slice(r,r+$l);if(o.some(c=>c.text.length<3))continue;let s=o.map(c=>c.text).join(`
|
|
102
|
-
`),i=t.get(s);if(i===void 0){t.set(s,{...
|
|
103
|
-
`)){if(f.startsWith(gm)){
|
|
104
|
-
`)){let f=
|
|
105
|
-
`)){let S=mm(R,h);S==="comment"&&b.comment++,S==="code"&&b.code++}d.set(x,b)}let p=new Map;for(let[m,f]of d){let g=f.comment+f.code;g>0&&p.set(m,f.comment/g)}return{languages:r,commentShareByLanguage:p}};var qb=({patch:e})=>{let t=0,n=0,r=[],o=[],s=0,i=0;for(let c of e.files)if(!(c.binary||un(c.path))&&Zo(c.path)){t+=c.addedCount,n+=c.removed,c.status==="added"&&r.push(Ln(c)),c.status==="deleted"&&o.push(Ln(c));for(let{text:d}of c.added)Fb(d)&&s++,_b(d)&&i++}return{testLinesAdded:t,testLinesRemoved:n,addedTestFiles:r,deletedTestFiles:o,skippedTestLinesAdded:s,focusedTestLinesAdded:i}};var Nw=e=>e.reduce((t,n)=>t===null||n.time<t.time?n:t,null)?.sha??null,Yb=async({repoRoot:e,ref:t,commits:n})=>{let r=await zb({repoRoot:e,shas:n.map(c=>c.sha)});if(a(r))return l(r.message);let o=r.value,s=Nw(n),i=s?await Kb({repoRoot:e,sha:s}):null;return u("Derived issue stats",{ref:t,shape:Pb({commits:n,patch:o}),languages:Hb({patch:o,languagesBefore:i?.languages??null}),tests:qb({patch:o}),comments:$b({patch:o,repoShareByLanguage:i?.commentShareByLanguage??null}),flags:Ub({patch:o})})};var Ei=e=>{if(a(e))return e;let t=de(),n=a(t)?{}:t.value.emailLinks,r=a(t)?{}:t.value.contributors,o=Np(n),s=e.value.map(i=>({...i,authorIdentity:uv({authorName:i.author,authorEmail:i.authorEmail,owners:o,registry:r})}));return u(e.message,s)};var Aw=32,Si=new Map;var Tw=(e,t)=>{if(Si.set(e,t),Si.size>Aw){let n=Si.keys().next();n.done||Si.delete(n.value)}return t},Ul=async(e={idOrRef:""})=>{let t=e.idOrRef.trim();if(!t)return l("idOrRef must not be empty");let n=t.length>7?H(t):t.toUpperCase(),r=re(e.repoRoot??process.cwd());if(a(r))return l(r.message);let o=r.value,s=Ei(await Kn({repoRoot:o,ref:n}));if(a(s))return l(s.message);let i=s.value.map(m=>({sha:m.sha,time:m.time,author:m.authorIdentity?.resolved?m.authorIdentity.name:m.author,subject:m.subject})),c=[o,n,i.map(m=>`${m.sha}:${m.author}`).join(",")].join(" "),d=Si.get(c);if(d)return u("Derived issue stats",d);let p=await Yb({repoRoot:o,ref:n,commits:i});return a(p)?l(p.message):u("Derived issue stats",Tw(c,p.value))};var ww=new RegExp(`^[0-9A-Z]{${7}}$`),Mw=e=>{let t=e.indexOf(" ");if(t===-1)return null;let n=e.slice(0,t).toUpperCase();return ww.test(n)?n:null},Pw=e=>{let t={};for(let n of e){let r=Mw(n.subject);if(!r)continue;let o=t[r]??={commits:0,insertions:0,deletions:0};o.commits++,o.insertions+=n.insertions,o.deletions+=n.deletions}return t},Xb=async(e={})=>{let t=await Ho({repoRoot:e.repoRoot});return a(t)?t:u("Collected diff stats by ref",Pw(t.value))};var Lw="Filed here",Jb=(e,t)=>e.set(t,(e.get(t)??0)+1),Qb=(e,t,n)=>[...e.entries()].map(([r,o])=>({laneId:r,title:r===null?Lw:n(r),count:o,share:t===0?0:o/t})).sort((r,o)=>o.count-r.count||r.title.localeCompare(o.title)),Zb=(e,t,n)=>{let r=new Map,o=new Map,s=0,i=0;for(let c of t)for(let[d,p]of c.entries()){if(p!==e)continue;s++,Jb(r,c[d-1]??null);let m=c[d+1];m!==void 0&&(i++,Jb(o,m))}return{arrived:s,departed:i,arrivesFrom:Qb(r,s,n),movesOnTo:Qb(o,i,n)}};var ex=e=>{if(e.length===0)return null;let t=Math.floor(e.length/2);return e.length%2===0?(e[t-1]+e[t])/2:e[t]};var Ri=1440*60*1e3,kw=({laneIds:e,journeys:t,now:n,days:r})=>{let o=n-(r-1)*Ri,s=new Map(e.map(i=>[i,Array.from({length:r},()=>[])]));for(let i of t)for(let[c,d]of i.entries()){let p=s.get(d.laneId);if(!p)continue;let m=i[c+1]?.enteredAt,f=Math.max(0,Math.ceil((d.enteredAt-o)/Ri)),g=m===void 0?r-1:Math.min(r-1,Math.ceil((m-o)/Ri)-1);for(let h=f;h<=g;h++)p[h].push(o+h*Ri-d.enteredAt)}return Object.fromEntries([...s].map(([i,c])=>[i,c.map((d,p)=>({t:o+p*Ri,median:ex(d.sort((m,f)=>m-f)),count:d.length}))]))},tx=({laneId:e,journeys:t,now:n,days:r})=>kw({laneIds:[e],journeys:t,now:n,days:r})[e];var Dw=40,Bw=30,Ow=()=>({tickets:0,commits:0,insertions:0,deletions:0}),Fw=async(e,t)=>{let n=Ow();for(let r of t.slice(0,Dw)){let o=await Ul({repoRoot:e,idOrRef:H(r)});a(o)||o.value.shape.commits===0||(n.tickets++,n.commits+=o.value.shape.commits,n.insertions+=o.value.shape.insertions,n.deletions+=o.value.shape.deletions)}return n},nx=async e=>{let t=pt();if(a(t))return t;let{nodes:n}=t.value;if(!n[e.swimlaneId])return l("Swimlane not found");let o=Object.values(n).filter(_),s=o.map(d=>Cu(d.log??[],De(d.id))),i=Zb(e.swimlaneId,s.map(d=>d.map(p=>p.laneId)),d=>n[d]?.title??"Elsewhere"),c=o.filter(d=>d.parentNodeId===e.swimlaneId).map(d=>d.id);return u("Derived swimlane stats",{swimlaneId:e.swimlaneId,createdAt:De(e.swimlaneId),...i,stayTrend:tx({laneId:e.swimlaneId,journeys:s,now:Date.now(),days:Bw}),code:await Fw(e.repoRoot,c)})};var rx=new Set(["sync","email:link","email:unlink","issues:create","board:create","board:edit:title","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 ox=e=>{let t=$n({exclude:e});return a(t)?[]:t.value.map(n=>({projectId:n.projectId,name:Eo(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},sx=e=>{let t=$n();if(a(t))return l(t.message);let n=t.value.find(r=>r.root===e);return n?u("Resolved recent project",n.root):l(`Not a recent project: ${e}`)};import{z as k}from"zod";var te=k.string().min(1),ix=k.discriminatedUnion("at",[k.object({at:k.literal("start")}),k.object({at:k.literal("end")}),k.object({at:k.literal("before"),sibling:te}),k.object({at:k.literal("after"),sibling:te})]),Ci=k.number().finite(),ae=(e,t)=>k.object({type:k.literal(e),payload:t}),ro=e=>k.object({type:k.literal(e)}),_w=k.discriminatedUnion("type",[ro("state:get"),ro("issues:list"),ro("sync"),ro("time-travel:live"),ro("diff-stats:get"),ae("project:open",k.object({root:k.string().min(1)})),ae("issues:create",k.object({title:k.string(),parentId:te,description:k.string().optional(),tagNames:k.array(k.string()).optional()})),ae("board:create",k.object({title:k.string()})),ae("board:edit:title",k.object({boardId:te,title:k.string()})),ae("swimlane:create",k.object({title:k.string(),boardId:te})),ae("swimlane:edit:title",k.object({swimlaneId:te,title:k.string()})),ae("swimlane:delete",k.object({swimlaneId:te})),ae("swimlane:move",k.object({swimlaneId:te,boardId:te,position:ix.optional()})),ae("issues:move",k.object({issueId:te,parentId:te,position:ix.optional()})),ae("issue:edit:title",k.object({issueId:te,title:k.string()})),ae("issue:edit:description",k.object({issueId:te,description:k.string()})),ae("issue:tag:add",k.object({issueId:te,tagName:k.string()})),ae("issue:tag:remove",k.object({issueId:te,tagId:te})),ae("contributor:remove",k.object({contributorId:te})),ae("tag:remove",k.object({tagId:te})),k.object({type:k.literal("contributors:get"),payload:k.object({boardId:te.optional()}).optional()}),ae("issue:assignee:add",k.object({issueId:te,assigneeId:te.optional(),assigneeName:k.string().optional(),createUnlinked:k.boolean().optional()})),ae("issue:assignee:remove",k.object({issueId:te,assigneeId:te})),ae("issue:close",k.object({issueId:te})),ae("issue:reopen",k.object({issueId:te})),ae("issue:comment:add",k.object({issueId:te,body:k.string()})),ae("issue:comment:delete",k.object({issueId:te,commentId:te})),ae("issue:comment:edit",k.object({issueId:te,commentId:te,body:k.string()})),ae("issue:get",k.object({issueId:te})),ae("issue:preview:get",k.object({issueId:te})),k.object({type:k.literal("timeline:get"),payload:k.object({start:Ci.optional(),end:Ci.optional(),boardId:te.optional(),requestId:k.number().finite().optional()}).optional()}),k.object({type:k.literal("commits:get"),payload:k.object({start:Ci.optional(),end:Ci.optional(),requestId:k.number().finite().optional()}).optional()}),ae("time-travel:scrub",k.object({targetTime:Ci})),ae("time-travel:checkout-event",k.object({eventId:k.string().min(1)})),ae("commit:inspect",k.object({sha:k.string()})),k.object({type:k.literal("emails:get")}),ae("email:link",k.object({email:k.string().min(1).max(254),contributorId:k.string().min(1).optional()})),ae("email:unlink",k.object({email:k.string().min(1).max(254),contributorId:k.string().min(1).optional()})),ae("commit:diff:get",k.object({sha:k.string()})),ae("issue:commits:get",k.object({issueId:te})),ae("issue:squashed-diff:get",k.object({issueId:te})),ae("issue:stats:get",k.object({issueId:te})),ae("swimlane:stats:get",k.object({swimlaneId:te})),ro("me:stats:get"),ro("settings:get"),ae("settings:set",k.object({autoSync:k.boolean().optional(),autoSyncIntervalMs:k.number().finite().optional()}))]);var ax=e=>{let t=_w.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 $w=1024*1024,hm=()=>{$r({type:"state",payload:to(Qr())})},Z=(e,t)=>{e.send(JSON.stringify(t))},Ni=async(e,t)=>{let n=to(await Kt({repoRoot:t}));return a(n)&&n.message===Ac?Z(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:ox(t)}}):Z(e,{type:"state",payload:n})},Uw=async(e,t)=>{let n=()=>Z(e,{type:"state",payload:to(Qr())});if(Je().mode!=="live")return n();let r=await Kt({repoRoot:t});return Je().mode!=="live"?n():Z(e,{type:"state",payload:to(r)})},Ge=async(e,t,n,r,o)=>{if(Z(e,{type:r,payload:o}),a(o))return Z(e,{type:"failed",payload:o.message});n(),Uw(e,t)},lx=(e,t,{onStateChanged:n,onSyncSettingsChanged:r,getPort:o})=>{new jw({server:e,path:"/ws",maxPayload:$w,verifyClient:i=>!dm(i.origin,o())}).on("connection",i=>{Wg(i),i.on("message",async c=>{let d=async p=>{let{type:m}=p,f=t.repoRoot;if(m==="project:open"){let g=sx(p.payload.root);return Z(i,{type:"project:open:result",payload:g}),a(g)?void 0:(t.repoRoot=g.value,Ni(i,g.value))}if(m==="timeline:get"){let{requestId:g,...h}=p.payload??{};return Z(i,{type:"timeline",requestId:g,payload:await ab({repoRoot:f,...h})})}if(m==="issue:get"){let g=p.payload?.issueId,h=Qr(),x=Hu(g);return Z(i,{type:"issue",payload:a(h)?h:u("Issue detail",{...Cb(h.value,g),history:a(x)?[]:x.value})})}if(m==="issue:preview:get"){let{issueId:g}=p.payload,h=Du(g);return Z(i,{type:"issue:preview:result",payload:{issueId:g,result:a(h)?h:u("Issue preview",Nb(g,h.value))}})}if(m==="commits:get"){let{requestId:g,...h}=p.payload??{};return Z(i,{type:"commits",requestId:g,payload:Ei(await Ho({repoRoot:f,...h}))})}if(m==="emails:get")return Z(i,{type:"emails",payload:await Dl({repoRoot:f}),suggestions:await Bl({repoRoot:f})});if(m==="email:link"||m==="email:unlink"){let h=await(m==="email:link"?sm:im)({repoRoot:f,...p.payload});return Z(i,{type:"emails",payload:await Dl({repoRoot:f}),suggestions:await Bl({repoRoot:f}),lastAction:a(h)?{ok:!1,message:h.message}:{ok:!0,message:h.message}}),Ge(i,f,n,`${m}:result`,h)}if(m==="me:stats:get")return Z(i,{type:"me:stats",payload:await am({repoRoot:f})});if(m==="settings:get")return Z(i,{type:"settings",payload:di()});if(m==="settings:set"){let g=qo({enabled:p.payload.autoSync,intervalMs:p.payload.autoSyncIntervalMs});return a(g)||r(),Z(i,{type:"settings",payload:a(g)?di():g,lastAction:a(g)?{ok:!1,message:g.message}:{ok:!0,message:g.message}})}if(m==="commit:inspect")return Z(i,{type:"commit:inspect:result",payload:await ti({repoRoot:f,sha:p.payload.sha})});if(m==="commit:diff:get"){let{sha:g}=p.payload;return Z(i,{type:"commit:diff:result",payload:{sha:g,result:await Ud({repoRoot:f,sha:g})}})}if(m==="issue:commits:get"){let{issueId:g}=p.payload;return Z(i,{type:"issue:commits:result",payload:{issueId:g,result:Ei(await Kn({repoRoot:f,ref:H(g)}))}})}if(m==="issue:squashed-diff:get"){let{issueId:g}=p.payload;return Z(i,{type:"issue:squashed-diff:result",payload:{issueId:g,result:await Hd({repoRoot:f,ref:H(g)})}})}if(m==="issue:stats:get"){let{issueId:g}=p.payload;return Z(i,{type:"issue:stats:result",payload:{issueId:g,result:await Ul({repoRoot:f,idOrRef:H(g)})}})}if(m==="diff-stats:get")return Z(i,{type:"diff-stats",payload:await Xb({repoRoot:f})});if(m==="swimlane:stats:get"){let{swimlaneId:g}=p.payload;return Z(i,{type:"swimlane:stats:result",payload:{swimlaneId:g,result:await nx({repoRoot:f,swimlaneId:g})}})}if(m==="time-travel:scrub"){let g=await Tu({repoRoot:f,targetTime:p.payload.targetTime});return Z(i,{type:"time-travel:result",payload:g}),a(g)?void 0:hm()}if(m==="time-travel:checkout-event"){let g=await cb({repoRoot:f,eventId:p.payload.eventId});return Z(i,{type:"time-travel:result",payload:g}),a(g)?void 0:hm()}if(m==="time-travel:live"){let g=await db({repoRoot:f});return Z(i,{type:"time-travel:result",payload:g}),a(g)?void 0:hm()}if(m==="state:get")return Ni(i,f);if(m==="sync"){let g=await fi({repoRoot:f});return Z(i,{type:"sync:result",payload:g}),n(),Ni(i,f)}if(m==="issue:comment:add"){let g=await vi({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:comment:add:result",g)}if(m==="issue:comment:edit"){let g=await om({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:comment:edit:result",g)}if(m==="issue:comment:delete"){let g=await bi({repoRoot:f,...p.payload});return Z(i,{type:"issue:comment:delete:result",payload:g}),a(g)?Z(i,{type:"failed",payload:g.message}):(n(),Ni(i,f))}if(m==="issue:edit:description"){let g=await Wu({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:edit:description:result",g)}if(m==="issue:edit:title"){let g=await Gu({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:edit:title:result",g)}if(m==="issue:tag:add"){let g=await Ju({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:tag:add:result",g)}if(m==="issue:tag:remove"){let g=await Zu({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:tag:remove:result",g)}if(m==="contributor:remove"){let g=await tm({repoRoot:f,...p.payload});return Ge(i,f,n,"contributor:remove:result",g)}if(m==="tag:remove"){let g=await Qu({repoRoot:f,...p.payload});return Ge(i,f,n,"tag:remove:result",g)}if(m==="contributors:get")return Z(i,{type:"contributors",boardId:p.payload?.boardId,payload:await nm({repoRoot:f,...p.payload})});if(m==="issue:assignee:add"){let g=await em({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:assignee:add:result",g)}if(m==="issue:assignee:remove"){let g=await rm({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:assignee:remove:result",g)}if(m==="issues:list")return Z(i,{type:"issues",payload:await Fu({repoRoot:f})});if(m==="issues:create"){let g=await _u({...p.payload,repoRoot:f});return Z(i,{type:"issues:create:result",payload:g}),a(g)?$r({type:"failed",payload:g.message}):(n(),Ni(i,f))}if(m==="board:create"){let g=await Vu({...p.payload,repoRoot:f});return Ge(i,f,n,"board:create:result",g)}if(m==="board:edit:title"){let g=await zu({...p.payload,repoRoot:f});return Ge(i,f,n,"board:edit:title:result",g)}if(m==="swimlane:create"){let g=await Ku({...p.payload,repoRoot:f});return Ge(i,f,n,"swimlane:create:result",g)}if(m==="swimlane:edit:title"){let g=await qu({...p.payload,repoRoot:f});return Ge(i,f,n,"swimlane:edit:title:result",g)}if(m==="swimlane:delete"){let g=await Xu({...p.payload,repoRoot:f});return Ge(i,f,n,"swimlane:delete:result",g)}if(m==="swimlane:move"){if(!p.payload.position)return Z(i,{type:"error",message:"Missing move position"});let g=await Yu({...p.payload,repoRoot:f});return Ge(i,f,n,"swimlane:move:result",g)}if(m==="issues:move"){if(!p.payload.position)return Z(i,{type:"error",message:"Missing move position"});let g=await Uu({...p.payload,repoRoot:f});return Ge(i,f,n,"issues:move:result",g)}if(m==="issue:close"){let g=await ju({repoRoot:f,issueId:p.payload.issueId});return Ge(i,f,n,"issue:close:result",g)}if(m==="issue:reopen"){let g=await $u({repoRoot:f,issueId:p.payload.issueId});return Ge(i,f,n,"issue:reopen:result",g)}return Z(i,{type:"error",message:"Unknown message type"})};try{let p=ax(JSON.parse(c.toString()));if(!p.ok)return Z(i,{type:"error",message:p.error});let m=p.message;return rx.has(m.type)?await Pn(async()=>Je().mode!=="live"?Z(i,{type:"failed",payload:"Read-only while viewing history"}):d(m)):await d(m)}catch(p){return Z(i,{type:"error",message:p instanceof Error?p.message:String(p)})}})})};var zw=oo.dirname(Vw(import.meta.url)),Kw=process.env.IS_LOCAL==="true"?oo.resolve(process.cwd(),"dist/gui"):oo.join(zw,"gui"),Hl,qw=async()=>(Hl===void 0&&(Hl=await import("node:sea").catch(()=>null)),Hl?.isSea()?Hl:null),Pe=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},Yw=e=>Pe(e,409,{isError:!0,message:"Read-only while viewing history"}),Wl=(e,t)=>Pn(async()=>Je().mode!=="live"?Yw(e):t()),cx=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)}),Xw=2*1024*1024,Jw={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},Qw=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",dx=new Map,Zw=e=>`"${Ww("sha1").update(e).digest("base64url")}"`,eM=async e=>{try{let{size:t,mtimeMs:n}=await Hw(e);return`${t}:${n}`}catch{return null}},tM=e=>{try{return decodeURIComponent(e)}catch{return null}},ux=async(e,t,n)=>{let r=e==="/"?"/index.html":tM(e);if(r===null)return Pe(n,404,{isError:!0,message:"Not found"});let o=r.replace(/^\/+/,""),s=oo.resolve(Kw),i=oo.resolve(s,o),c=oo.relative(s,i);if(c.startsWith("..")||oo.isAbsolute(c))return Pe(n,403,{isError:!0,message:"Forbidden"});let d=await qw(),p=d?"sea":await eM(i),m=p===null?void 0:dx.get(c),f=m&&m.stamp===p?m.etag:null;if(f&&t.headers["if-none-match"]===f)return n.writeHead(304,{etag:f,"cache-control":"no-cache"}),n.end();try{let g=d?Buffer.from(d.getAsset(`gui/${c}`)):await mx(i),h=f??Zw(g);return p!==null&&dx.set(c,{stamp:p,etag:h}),n.writeHead(200,{"content-type":Qw(i),etag:h,"cache-control":"no-cache"}),n.end(g)}catch{return Pe(n,404,{isError:!0,message:`Not found: ${o}`})}},nM=async(e,t=xi)=>new Promise((n,r)=>{let o=s=>{let i=d=>{if(e.off("listening",c),d.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),o(0);return}r(d)},c=()=>{e.off("error",i);let d=e.address();if(!d||typeof d=="string"){r(new Error("Unable to resolve address"));return}n(d.port)};e.once("error",i),e.once("listening",c),e.listen(s,"127.0.0.1")};o(t)}),px=async e=>{Xv(!1);let t=0,n={repoRoot:e.repoRoot},r=Gw.createServer((p,m)=>{o(p,m).catch(f=>(logger.error(`[gui] ${p.method} ${p.url}: ${f instanceof Error?f.message:String(f)}`),m.headersSent?m.end():Pe(m,500,{isError:!0,message:"Internal error"})))});async function o(p,m){let f=new URL(p.url??"/","http://127.0.0.1"),g=Mb({method:p.method,origin:p.headers.origin,contentType:p.headers["content-type"]},t);if(g)return Pe(m,g.status,{isError:!0,message:g.message});if(p.method==="GET"&&f.pathname===lm)return Pe(m,200,{app:cm,repoRoot:Ol(n.repoRoot),version:kt,pid:process.pid});if(f.pathname==="/api/state")return Pe(m,200,await Kt({repoRoot:n.repoRoot}));if(p.method==="POST"&&f.pathname==="/api/comments")try{let h=await cx(p);if(!h.issueId||!h.body?.trim())return Pe(m,400,{isError:!0,message:"Missing issueId or body"});let x=h.issueId,b=h.body;return await Wl(m,async()=>{let R=await vi({repoRoot:n.repoRoot,issueId:x,body:b});return a(R)?Pe(m,400,{isError:!0,message:R.message}):Pe(m,200,await Kt({repoRoot:n.repoRoot}))})}catch(h){return Pe(m,400,{isError:!0,message:h instanceof Error?h.message:"Unable to add comment"})}if(p.method==="POST"&&f.pathname==="/api/attachments")try{let h=await cx(p,Xw);if(!h.issueId||!h.dataBase64)return Pe(m,400,{isError:!0,message:"Missing issueId or dataBase64"});let x=h.issueId,b=h.dataBase64,R=h.name??"";return await Wl(m,async()=>{let S=await Pu({repoRoot:n.repoRoot,issueId:x,name:R,dataBase64:b});return a(S)?Pe(m,400,{isError:!0,message:S.message}):Pe(m,200,{...await Kt({repoRoot:n.repoRoot}),attachment:S.value})})}catch(h){return Pe(m,400,{isError:!0,message:h instanceof Error?h.message:"Unable to add attachment"})}if(p.method==="DELETE"&&f.pathname.startsWith("/api/attachments/")){let h=decodeURIComponent(f.pathname.replace("/api/attachments/",""));return h?Wl(m,async()=>{let x=await Lu({repoRoot:n.repoRoot,attachmentId:h});return a(x)?Pe(m,400,{isError:!0,message:x.message}):Pe(m,200,await Kt({repoRoot:n.repoRoot}))}):Pe(m,400,{isError:!0,message:"Missing attachment id"})}if(p.method==="GET"&&f.pathname.startsWith("/media/")){let h=decodeURIComponent(f.pathname.replace("/media/","")),x=await ku({repoRoot:n.repoRoot,fileName:h});if(a(x))return Pe(m,404,{isError:!0,message:x.message});try{let b=await mx(x.value.filePath);return m.writeHead(200,{"content-type":Jw[x.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),m.end(b)}catch{return Pe(m,404,{isError:!0,message:"Attachment blob not found"})}}if(p.method==="DELETE"&&f.pathname.startsWith("/api/comments/")){let h=decodeURIComponent(f.pathname.replace("/api/comments/",""));return h?Wl(m,async()=>{let x=await bi({repoRoot:n.repoRoot,commentId:h});return a(x)?Pe(m,400,{isError:!0,message:x.message}):Pe(m,200,await Kt({repoRoot:n.repoRoot}))}):Pe(m,400,{isError:!0,message:"Missing comment id"})}return f.pathname.startsWith("/board/")||f.pathname==="/log"?ux("/",p,m):ux(f.pathname,p,m)}try{t=await nM(r)}catch(p){return l(p instanceof Error?`Unable to start GUI server: ${p.message}`:`Unable to start GUI server: ${String(p)}`)}let s=Tb({project:n}),i=Sb({project:n,publisher:s}),c=wb(s);lx(r,n,{onStateChanged:()=>i.queueSync(),onSyncSettingsChanged:()=>i.reschedule(),getPort:()=>t}),r.on("close",()=>{i.dispose(),c()});let d=r.address();return!d||typeof d=="string"?(r.close(),l("Unable to resolve GUI server address")):u("Started GUI server",{url:`http://epiq.localhost:${d.port}${e.boardId?`/board/${e.boardId}`:""}`,server:r})};var fx=async e=>{let t=co({});if(a(t))return l(t.message);let n=ht();ve(n)&&je(n.value);let r=await Eb(xi);if(r&&r.repoRoot===Ol(e.repoRoot)){let i=`http://127.0.0.1:${xi}`;return console.log(_c({url:i,repoRoot:e.repoRoot,version:kt,reused:!0})),$c(i),u("Reused running GUI",{url:i})}let o=await px({...e,boardId:""});if(a(o))return o;let{url:s}=o.value;return console.log(_c({url:s,repoRoot:e.repoRoot,version:kt,reused:!1})),$c(s),u("Started GUI",{url:s})};import{Box as Jn}from"ink";import we from"react";import{Box as ym,Text as Ai}from"ink";import mn,{useEffect as rM,useMemo as oM}from"react";import{ulid as sM}from"ulid";var gx=({text:e,match:t,color:n,highlightColor:r=y.secondary,dimColor:o=!1})=>{if(!t)return mn.createElement(Ai,{color:n,dimColor:o},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?mn.createElement(Ai,{color:n,dimColor:o},e):mn.createElement(Ai,{color:n,dimColor:o},e.slice(0,c),mn.createElement(Ai,{backgroundColor:r,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},hx=sM(),iM=e=>`${e}`,aM=e=>{let{pendingNavTarget:t}=vr();if(!t)return[];let{breadCrumb:n,contextNode:r,selectedNode:o}=t,s=new Set(Be(C.NONE,{breadCrumb:n,contextNode:r,readOnly:v().readOnly,selectedNode:o}));return[...new Set(Object.values(C))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==C.PALETTE).map(i=>{let c=Ga(i),d=Il.find(p=>p.intent===c);return{command:i,description:d?.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))},lM=e=>Re.text({id:hx,parentNodeId:e,rank:"000000",name:"Command Palette",readonly:!0,isVirtual:!0}),cM=(e,t,n)=>Re.text({id:iM(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,disabled:!e.isAvailable,readonly:!0,isVirtual:!0}),vm=[],dM=e=>{yx();let t=N.createNode(lM(v().rootNodeId));a(t)||!rr(t.value)||(vm=[t.value,...e.map((n,r)=>cM(n,r,hx)).map(N.createNode).filter(ve).map(({value:n})=>n).filter(rr)],$.navigate({contextNode:t.value,selectedIndex:0}))},yx=()=>{let e=vm.map(t=>t.id);vm=[];for(let t of e)N.deleteNode(t)};function vx({width:e,height:t}){let r=Bf().value.trim().toLowerCase(),o=oM(()=>aM(r),[r]);rM(()=>(dM(o),()=>{yx()}),[o]);let s=v().selectedIndex;return mn.createElement(ym,{flexDirection:"column",width:e,height:t-2},mn.createElement(ut,{height:t-4,itemHeight:3,selectedIndex:s},o.map((i,c)=>{let d=c===s,p=i.isAvailable?y.accent:y.secondary2,m=i.isAvailable?"":"[unavailable] ";return mn.createElement(ym,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},mn.createElement(Ai,{color:p,dimColor:!i.isAvailable},d?"\u276F ":" ",mn.createElement(gx,{text:kp(i.command),match:r,color:p,dimColor:!i.isAvailable})),mn.createElement(ym,{paddingLeft:2},mn.createElement(gx,{text:m+i.description,match:r.length>=2?r:"",color:d&&i.isAvailable?y.primary:y.secondary2,dimColor:!i.isAvailable})))})))}import{Box as CM}from"ink";import zl from"react";import wi from"chalk";import{Box as Ti,Text as Ex}from"ink";import so,{useEffect as Sx,useMemo as uM,useState as Rx}from"react";var es=["\u2803","\u2806","\u2830","\u2818"],bx=120,xx=({isPalette:e,isPending:t,frame:n})=>{if(t){let r=(n%es.length+es.length)%es.length;return es[r]}return e?"?":":"},Ix=({infoMessage:e,isPending:t})=>t&&e.includes(fe)?"":e;var Cx=wi.hex(y.secondary),mM=wi.inverse,pM=wi.inverse.hex(y.secondary2),fM={hint:"",hints:[],overlap:0,remainder:""},Ax=({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}},gM=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ze(t);return{bg:r=>wi.bgHex(n).black(r),bgCursor:r=>wi.bgHex(n).inverse.black(r)}}return Fc(t)},hM=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Ax({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}},Nx=()=>({value:ct.value,cursorPosition:ct.cursorPosition,commandIsPending:ct.commandIsPending,autoCompletion:ct.commandMeta.autoCompletion??fM,infoMessage:ct.commandMeta.infoMessage,validationStatus:ct.commandMeta.validity,command:ct.commandMeta.command,inputString:ct.commandMeta.inputString,modifier:ct.commandMeta.modifier}),yM=(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,Tx=({width:e,mode:t})=>{let[n,r]=Rx(Nx());Sx(()=>{let A=()=>{let P=Nx();r(M=>yM(M,P)?M:P)},T=nd(A);return A(),()=>{T()}},[]);let{value:o,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:d,command:p,modifier:m,validationStatus:f}=n,g=c&&f===En.Invalid,h=Ix({infoMessage:i,isPending:c}),[x,b]=Rx(0);Sx(()=>{if(!c){b(0);return}let A=setInterval(()=>{b(T=>(T+1)%es.length)},bx);return()=>{clearInterval(A)}},[c]);let R=xx({isPalette:t===I.PALETTE,isPending:c,frame:x}),S=uM(()=>{let A=Math.max(0,Math.min(s,o.length)),T=Ax({value:o,command:p}),P=hM({value:o,command:p,modifier:m}),M=p?Fc(p):null,O=gM({command:p,modifier:m}),W=(st,ft)=>{let ao=T&&ft>=T.start&&ft<T.end,lc=P&&ft>=P.start&&ft<P.end;return ao&&M?M.fg(st):lc&&O?O.bg(st):st},Y=(st,ft)=>{let ao=T&&ft>=T.start&&ft<T.end,lc=P&&ft>=P.start&&ft<P.end;return ao&&M?M.fgCursor(st):lc&&O?O.bgCursor(st):mM(st)},xe=o.slice(0,A),F=o[A]??" ",X=A<o.length?o.slice(A+1):"",Ve=Array.from(xe).map((st,ft)=>W(st,ft)).join(""),Qn=Y(F,A),is=Array.from(X).map((st,ft)=>W(st,A+1+ft)).join("");if(d.hint){let st=d.hint[d.overlap]??F;Qn=pM(st),is=Cx(d.remainder.slice(1)+X)}return Ve+Qn+is},[o,s,d,p,m]);return so.createElement(Ti,{flexDirection:"column",justifyContent:"flex-start"},so.createElement(Ti,{flexDirection:"column",paddingX:1,borderColor:y.secondary,borderStyle:"round",width:e},so.createElement(Ti,{height:1,flexWrap:"nowrap"},so.createElement(Ti,{flexShrink:0},so.createElement(Ex,{wrap:"truncate-start"},Cx(R),S)),h&&so.createElement(Ti,{flexShrink:1,minWidth:0},so.createElement(Ex,{wrap:"truncate",color:g?y.red:y.secondary2},` ${h} `)))))};import{Box as vM,Text as Mi}from"ink";import ts from"react";var wx=" ",bM=({keys:e,label:t})=>e.length+1+t.length,xM=(e,t)=>{let n=[],r=0;for(let o of e){let i=(n.length>0?wx.length:0)+bM(o);if(r+i>t-4)break;n.push(o),r+=i}return n},Mx=({width:e,availableHints:t})=>{let n=xM(t,e);return ts.createElement(vM,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},n.length?ts.createElement(Mi,{wrap:"truncate"},n.map(({keys:o,label:s},i)=>ts.createElement(Mi,{key:`${o}-${s}`},i>0?wx:"",ts.createElement(Mi,{color:y.accent},o),ts.createElement(Mi,{color:y.secondary2}," ",s)))):ts.createElement(Mi,{color:y.secondary2},"\xA0"))};import{Box as IM,Text as Gl}from"ink";import Pi,{useEffect as EM,useRef as ns,useState as SM}from"react";var RM=40,Vl=.3,bm="\u2500",Px=1,Lx=16,kx=({width:e})=>{let{replay:t}=ne(),n=t!==null,r=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),i=s*Px,[c,d]=SM(0),p=ns(r);p.current=r;let m=ns(0),f=ns(0),g=ns(0),h=ns(0),x=ns(0);if(EM(()=>{if(!n){m.current=0,g.current=0,h.current=0,x.current=0,d(0);return}m.current=p.current,f.current=Date.now(),g.current=p.current;let T=setInterval(()=>{let P=Date.now(),M=p.current;if(M!==g.current){let F=M-g.current,X=P-f.current;if(F<0)h.current=0,x.current=0;else if(F>0&&X>0){let Ve=F/X;h.current=h.current===0?Ve:h.current*(1-Vl)+Ve*Vl,x.current=x.current===0?F:x.current*(1-Vl)+F*Vl}m.current=M,f.current=P,g.current=M}let O=P-f.current,W=Math.min(x.current,h.current*O),Y=Math.min(1,m.current+W),xe=Math.round(Y*i);d(F=>F===xe?F:xe)},RM);return()=>clearInterval(T)},[n,i]),!t)return null;let b=T=>{let P=s>1?T/(s-1):0,M=Math.round(P*(Lx-1))/(Lx-1);return Yi(M)},R=Math.min(s,Math.floor(c/Px)),S=[];for(let T=0;T<R;T++){let P=b(T),M=S[S.length-1];M&&M.color===P?M.text+=bm:S.push({text:bm,color:P})}let A=bm.repeat(Math.max(0,s-R));return Pi.createElement(IM,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1,columnGap:1},Pi.createElement(Gl,{color:y.secondary2},"\u25B6"),Pi.createElement(Gl,null,S.map((T,P)=>Pi.createElement(Gl,{key:P,color:T.color},T.text)),Pi.createElement(Gl,{color:y.secondary,dimColor:!0},A)))};var Li=({width:e,mode:t,availableHints:n})=>{let{timeMode:r}=ne(),o=t===I.COMMAND_LINE||t===I.PALETTE;return zl.createElement(CM,null,o?zl.createElement(Tx,{width:e,mode:t}):r==="replay"?zl.createElement(kx,{width:e}):zl.createElement(Mx,{width:e,mode:t,availableHints:n}))};import{Box as Ar,Text as rs}from"ink";import bt,{useEffect as NM,useMemo as AM}from"react";import{ulid as Dx}from"ulid";var ql=Dx(),TM=()=>[...new Set([...v().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(bu).filter(e=>e!==null).sort(({keys:e},{keys:t})=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(({keys:e,label:t})=>({keys:e,action:t})),wM=e=>Re.text({id:ql,parentNodeId:e,rank:"000000",name:"Help",isVirtual:!0,readonly:!0}),MM=(e,t,n)=>Re.text({id:Dx(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,readonly:!0,isVirtual:!0}),Kl=[],Bx=()=>{let e=Kl.filter(n=>n.id!==ql).map(n=>n.id),t=Kl.filter(n=>n.id===ql).map(n=>n.id);Kl=[];for(let n of[...e,...t])N.deleteNode(n)},PM=e=>{Bx();let t=N.createNode(wM(v().rootNodeId));if(a(t)||!rr(t.value))return logger.error("Could not attach help nodes");Kl=[t.value,...e.map((n,r)=>MM(n,r,ql)).map(N.createNode).filter(ve).map(({value:n})=>n).filter(rr)],$.navigate({contextNode:t.value,selectedIndex:0})},Ox=({width:e,height:t})=>{let n=AM(()=>TM(),[]);NM(()=>(PM(n),()=>{Bx()}),[n]);let r=v().selectedIndex;return bt.createElement(Ar,{flexDirection:"column",marginTop:3,borderColor:y.secondary,borderStyle:"round",width:e,height:t-2},bt.createElement(Ar,{paddingX:1,justifyContent:"center"},bt.createElement(rs,{color:y.accent},"Help"),bt.createElement(rs,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),bt.createElement(Ar,{paddingX:1,marginTop:1},bt.createElement(Ar,{width:20,justifyContent:"flex-end"},bt.createElement(rs,{color:y.secondary},"Key(s)")),bt.createElement(Ar,{flexGrow:1,width:40,paddingLeft:2},bt.createElement(rs,{color:y.secondary},"Action"))),bt.createElement(ut,{height:t-7,itemHeight:1,selectedIndex:r},n.map(({keys:o,action:s},i)=>{let c=i===r;return bt.createElement(Ar,{paddingX:1,key:`${o}-${s}-${i}`,flexDirection:"row"},bt.createElement(Ar,{width:20,justifyContent:"flex-end"},bt.createElement(rs,{color:y.accent},o)),bt.createElement(Ar,{flexGrow:1,width:40,paddingLeft:2},bt.createElement(rs,{color:c?y.primary:y.secondary2},s)))})))};import{Box as os,Text as xt}from"ink";import Ae,{useEffect as LM,useState as xm}from"react";var Yl=({index:e,email:t,note:n,noteColor:r})=>Ae.createElement(os,null,Ae.createElement(xt,{color:y.accent},e===void 0?" ":` ${e}.`),Ae.createElement(xt,null," ",t),n&&Ae.createElement(xt,{color:r??y.secondary2},` ${n}`)),Fx=({height:e})=>{let[t,n]=xm([]),[r,o]=xm([]),[s,i]=xm(null),{userName:c,gitEmail:d,gitName:p,userId:m}=V();return LM(()=>{let f=!0;return(async()=>{let h=de(),x=re(process.cwd());if(a(h)||a(x)||!m)return;let b=h.value.emailLinks,R=yn(b,m);n(R.map(P=>({email:P,others:Is(b,P).filter(M=>M!==m).map(M=>h.value.contributors[M]?.name??M)})));let S=ke(x.value),A=await Mn({repoRoot:x.value,stateBranch:a(S)?void 0:S.value,names:[c,p],links:b});if(!f)return;if(a(A)){i(A.message);return}let T=xr(A.value);So(T.map(P=>P.email)),o(T)})(),()=>{f=!1}},[m,c,p,d]),Ae.createElement(os,{height:e-4,flexDirection:"column",paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Ae.createElement(os,null,Ae.createElement(xt,{color:y.accent,bold:!0},c??"Not configured"),Ae.createElement(xt,{color:y.secondary2}," on this board")),s&&Ae.createElement(xt,{color:y.red},s),Ae.createElement(os,{flexDirection:"column"},Ae.createElement(xt,{color:y.secondary2},"CLAIMED"),t.length===0?Ae.createElement(Yl,{email:"Nothing claimed \u2014 your commits show the name git signed them with.",note:""}):t.map(f=>Ae.createElement(Yl,{key:f.email,email:f.email,note:f.others.length>0?`CONTESTED: also ${f.others.join(", ")}, resolves to nobody`:f.email===d?"your git identity here":void 0,noteColor:f.others.length>0?y.yellow:void 0}))),Ae.createElement(os,{flexDirection:"column"},Ae.createElement(xt,{color:y.secondary2},"UNCLAIMED IN THIS HISTORY"),r.length===0?Ae.createElement(Yl,{email:"Nothing left to claim here."}):r.map(f=>Ae.createElement(Yl,{key:f.email,email:f.email,note:`${f.commits} commit${f.commits===1?"":"s"} as ${f.names.join(", ")||"unknown"}`}))),Ae.createElement(os,{flexDirection:"column"},Ae.createElement(xt,{color:y.secondary2},Ae.createElement(xt,{color:y.accent},"[enter]")," writes a claim for the first into the command line, to confirm or change."),Ae.createElement(xt,{color:y.secondary2},Ae.createElement(xt,{color:y.accent},":config emails")," claims by address,",Ae.createElement(xt,{color:y.accent}," :config emails-unclaim "),"gives one back."),Ae.createElement(xt,{color:y.secondary2},Ae.createElement(xt,{color:y.accent},"[esc]")," to close")))};import kM from"chalk";import{Box as io,Text as rt}from"ink";import Te from"react";var DM=8,BM=()=>{let e=$n({exclude:process.cwd()});return a(e)?[]:e.value.slice(0,DM)},_x=({width:e,height:t})=>{let n=BM();return Te.createElement(io,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Te.createElement(rt,{color:y.accent,bold:!0},"Initialize project"),Te.createElement(rt,null,`This folder is not an ${kM.hex(y.accent)("epiq")} project yet.`),Te.createElement(rt,{color:y.primary},"To start tracking issues here, we need to initialize a new",Te.createElement(rt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),Te.createElement(io,{marginTop:1,flexDirection:"column"},Te.createElement(io,null,Te.createElement(rt,{color:y.accent}," "),Te.createElement(rt,{color:y.primary},"Type "),Te.createElement(rt,{backgroundColor:y.secondary}," :init "))),Te.createElement(io,{marginTop:1},Te.createElement(rt,{color:y.secondary2},"This will create, commit and push "),Te.createElement(rt,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json ")),n.length>0&&Te.createElement(io,{marginTop:1,flexDirection:"column"},Te.createElement(rt,{color:y.accent,bold:!0},"Or open a recent project"),n.map((r,o)=>Te.createElement(io,{key:r.projectId},Te.createElement(rt,{color:y.accent},` ${o+1} `),Te.createElement(rt,{color:y.primary},Eo(r.root)),Te.createElement(rt,{color:y.secondary2},` ${r.root}`))),Te.createElement(io,{marginTop:1},Te.createElement(rt,{color:y.accent}," "),Te.createElement(rt,{color:y.primary},"Type "),Te.createElement(rt,{backgroundColor:y.secondary}," :open 1 "),Te.createElement(rt,{color:y.secondary2}," or "),Te.createElement(rt,{backgroundColor:y.secondary}," :open <path> "))))};import{Box as Jl,Text as jt}from"ink";import _e from"react";import{Box as Xl,Text as Xn}from"ink";import _t,{useEffect as OM,useState as jx}from"react";var $x=()=>{let[e,t]=jx(null),[n,r]=jx(null);return OM(()=>{let o=!0;return(async()=>{let i=de(),c=re(process.cwd());if(a(i)||a(c))return;let d=ke(c.value),{userName:p,gitName:m}=V(),f=await Mn({repoRoot:c.value,stateBranch:a(d)?void 0:d.value,names:[p,m],links:i.value.emailLinks});if(!o)return;if(a(f)){r(f.message);return}let g=xr(f.value);So(g.map(h=>h.email)),t(g)})(),()=>{o=!1}},[]),n?_t.createElement(Xl,{marginTop:1},_t.createElement(Xn,{color:y.red},n)):e===null?null:e.length===0?_t.createElement(Xl,{marginTop:1},_t.createElement(Xn,{color:y.secondary2},"No unclaimed addresses in this history \u2014 type",_t.createElement(Xn,{color:y.accent}," :config emails none "),"to move on.")):_t.createElement(Xl,{flexDirection:"column",marginTop:1},e.map(o=>_t.createElement(Xn,{key:o.email},_t.createElement(Xn,{color:y.accent}," \xB7 "),_t.createElement(Xn,null,o.email),_t.createElement(Xn,{color:y.secondary2},` ${o.commits} commit${o.commits===1?"":"s"} as ${o.names.join(", ")||"unknown"}`))),_t.createElement(Xl,{marginTop:1},_t.createElement(Xn,{color:y.secondary2},"Claim yours by address, or",_t.createElement(Xn,{color:y.accent}," none "),"to skip.")))};var FM=({isDone:e,command:t,value:n,verb:r="Type",hint:o})=>_e.createElement(Jl,null,_e.createElement(jt,{color:y.accent,dimColor:e},e?" \u2714 ":" "),_e.createElement(jt,{dimColor:e},r," "),_e.createElement(jt,{backgroundColor:y.secondary,dimColor:e}," "+t+" "),n!==void 0&&_e.createElement(_e.Fragment,null,_e.createElement(jt,{dimColor:e}," "),_e.createElement(jt,{color:y.secondary,dimColor:e},"<"+n+">")),o),_M=(e,t)=>e.length===0?void 0:jn(e.join(", "),Math.max(12,t-34)),jM=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function Im({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:s,autoSync:i,isSetAutoSync:c,isSetEmails:d,claimedEmails:p,emailSetupDeclined:m}=Un(),f=[{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."},{key:"emails",done:d,command:":config emails",value:m?"declined":_M(p,e),message:"Last one. Claim the git addresses whose commits are yours, so the board calls them by your name."}],g=f.findIndex(x=>!x.done),h=g===-1?void 0:f[g];return _e.createElement(Jl,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},_e.createElement(jt,{color:y.accent,bold:!0},"Welcome! \u{1F539}"),_e.createElement(jt,null,"Let's get you started - it's a breeze."),_e.createElement(jt,{color:y.secondary2},"Remember - you can always search available commands by typing:",_e.createElement(jt,{color:y.accent}," ? ")),h&&_e.createElement(jt,{color:y.secondary2},h.message),_e.createElement(Jl,{flexDirection:"column"},f.map((x,b)=>{if(!(g===-1||b<=g))return null;let S=b===g,A=S&&g===0;return _e.createElement(Jl,{key:x.key,flexDirection:"column",marginBottom:1},_e.createElement(FM,{isDone:x.done,command:A?":config us":x.command,value:x.done?jM(x.value):void 0,verb:S&&!A?"Waiting:":"Type",hint:A?_e.createElement(jt,{color:y.secondary2}," then ",_e.createElement(jt,{color:y.accent},"tab")," to auto-complete ",_e.createElement(jt,{backgroundColor:y.secondary},` ${x.command.split(" ").pop()} `)):void 0}),x.key==="emails"&&!x.done&&_e.createElement($x,null))})))}import nc from"chalk";import{Box as Di,Text as ss}from"ink";import Qe from"react";import{Box as Ql,Text as Ux}from"ink";import Tr from"react";import $M from"chalk";var UM=e=>(N.getTag(e)?.name??"").length+3,HM=e=>{let t=N.getContributor(e);return(t?t.name:"").length+3},Hx=({width:e})=>{let{viewMode:t}=V(),n=ne(),{breadCrumb:r,contextNode:o,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[o.id]?.[s],d=Tt(c?.id??o.id,"TICKET"),p=ve(d)?d.value:void 0,m=(p?.props.tags??[]).filter(M=>N.getTag(M)),f=p?.props.assignees??[],g=p?.parentNodeId?!Ru(o.id,p.parentNodeId)&&t==="dense":!1,h=r.map((M,O)=>{let W=O===r.length-1,Y=be(M.id),xe=W?Y?.[s]?.title:void 0;return`${O?" / ":""}${M.title??""}${xe?` \u25B8 ${xe}`:""}`}).join(""),x=p?N.getCommentsByIssue(p.id):[],b=x.length?String(x.length).length+11:0,R=g?m.reduce((M,O)=>M+UM(O),0)+f.reduce((M,O)=>M+HM(O),0)+b:0,S=c?.id!=null&&!(t==="wide"&&_(c)),A=Math.max(0,e-R),T=h.substring(0,A)+(S?$M.hex(y.secondary2).dim(` ${H(c.id)}`):""),P=g?[...m.map(M=>Tr.createElement(Ql,{key:`tag-${M}`,paddingLeft:1},Tr.createElement(Do,{id:M}))),...f.map(M=>Tr.createElement(Ql,{key:`assignee-${M}`,paddingLeft:1},Tr.createElement(mr,{id:M}))),x.length?Tr.createElement(Ql,{key:"comments",paddingLeft:1},Tr.createElement(Ux,{color:y.accent},"[",x.length," comment",x.length===1?"":"s","]")):null]:[];return Tr.createElement(Ql,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},Tr.createElement(Ux,{color:y.secondary2},T),P)};import{Box as WM,Text as Wx}from"ink";import Zl from"react";var GM=({filters:e})=>Zl.createElement(WM,{columnGap:1},Zl.createElement(Wx,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Zl.createElement(Wx,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Gx=Zl.memo(GM);import{Box as VM,Text as ec}from"ink";import ki from"react";function Vx(){let{eventLog:e,unappliedEvents:t}=ne(),n=e.at(-1)?.id,r=bo(n??""),o=ve(r)?Ya(r.value):"INVALID DATE";return ki.createElement(VM,{paddingLeft:1},ki.createElement(ec,{backgroundColor:y.accent,color:y.secondary}," Readonly "),ki.createElement(ec,{color:y.accent}," "+t.length+" edits ago at "+o+"."),ki.createElement(ec,{color:y.accent}," Resume with "),ki.createElement(ec,{backgroundColor:y.accent,color:y.secondary}," ",":peek now"," "))}import{Box as zM,Text as Em}from"ink";import tc from"react";function zx(){let{replay:e}=ne();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:r}=e;return tc.createElement(zM,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},tc.createElement(Em,{backgroundColor:y.accent,color:y.secondary}," \u25B6 REPLAY "),tc.createElement(Em,{color:y.secondary2},Ya(new Date(r))),tc.createElement(Em,{color:y.accent},`${t}/${n} edits`))}import Sm from"chalk";import{Box as KM,Text as Kx}from"ink";import Rm,{useEffect as qM,useState as YM}from"react";var XM=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],JM=150,qx=12,QM=.36;function Yx({syncStatus:e,autoSync:t}){let[n,r]=YM(0);qM(()=>{if(e.status!=="syncing"){r(0);return}let c=0,d=setInterval(()=>{c+=1;let p=(Math.sin(c*QM)+1)/2,m=Math.round(p*(qx-1));r(f=>f===m?f:m)},JM);return()=>clearInterval(d)},[e.status]);let o={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,offline:y.secondary2,pending:y.secondary2,syncing:bp(XM,n/(qx-1))??""}[e.status];return Rm.createElement(KM,null,Rm.createElement(Kx,null,Sm.hex(y.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Rm.createElement(Kx,null,Sm.hex(i)("\u25CF")+Sm.hex(y.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}import eI from"chalk";import{Text as tI}from"ink";import nI,{useEffect as nP,useState as rP}from"react";import Cm from"chalk";var ZM="https://registry.npmjs.org/epiq/latest",Nm=null,Xx=0,eP=1e3*60*60*24,Jx=e=>e.replace(/^v/,""),tP=(e,t)=>{let n=Jx(e).split(".").map(Number),r=Jx(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},Qx=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Nm&&Date.now()-Xx<eP)return Nm;try{let t=await fetch(ZM);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?tP(r,e)>0:!1};return Nm=o,Xx=Date.now(),o}catch{return{current:e,latest:null,updateAvailable:!1}}},Zx=(e,t)=>{let n=e.split("."),r=t.split("."),o=r.findIndex((s,i)=>s!=n[i]);return r.map((s,i)=>i>=o?Cm.hex(y.accent).dim(s):Cm.hex(y.secondary).dim(s)).join(Cm.hex(y.secondary2).dim("."))};function rI(){let[e,t]=rP({current:kt,latest:null,updateAvailable:!1});return nP(()=>{let n=!0;return Qx(kt).then(r=>{n&&t(r)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?nI.createElement(tI,{dimColor:!0,color:y.secondary2},kt+" "):nI.createElement(tI,null,eI.hex(y.secondary2).dim(kt),eI.hex(y.accent).dim(" \u2197 "),Zx(kt,e.latest))}function Bi({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:r,mode:o,replay:s}=ne(),{userName:i,preferredEditor:c,autoSync:d}=V(),p=64,m=process.stdout.columns-p-8,f=t||n==="replay",g=s?_n(s.currentLabel,Math.max(0,m)):"";return Qe.createElement(Di,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?Qe.createElement(Di,{paddingLeft:1},Qe.createElement(ss,{color:y.secondary2},g)):f?Qe.createElement(ss,null," "):o===I.PALETTE?Qe.createElement(Di,null,Qe.createElement(ss,{color:y.accent},"Command Palette"),Qe.createElement(ss,{dimColor:!0,color:y.secondary2}," ","- search, select and press enter")):Qe.createElement(Di,{paddingLeft:1},e.length>0?Qe.createElement(Gx,{filters:e}):Qe.createElement(Hx,{width:m})),n==="live"?Qe.createElement(Di,{columnGap:1,paddingRight:2,"max-width":p,overflow:"hidden",justifyContent:"flex-end"},Qe.createElement(Yx,{autoSync:!!d,syncStatus:r}),Qe.createElement(ss,null,nc.hex(y.secondary2).dim("Mode: ")+nc.hex(y.secondary2).dim(o.padEnd(8," "))," "),Qe.createElement(oI,{icon:"@",value:i}),Qe.createElement(oI,{icon:"\u276F",value:c}),Qe.createElement(rI,null)):"",n==="peek"?Qe.createElement(Vx,null):"",n==="replay"?Qe.createElement(zx,null):"")}function oI({icon:e,value:t}){return Qe.createElement(ss,null,nc.dim(e)+nc.hex(y.accent)(` ${t??"-"} `))}import{Box as oP,Text as sP}from"ink";import Oi from"react";import{Box as rc,Text as Am}from"ink";import wr from"react";function Tm(){let e=ne(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?le(t?.id):[];return wr.createElement(rc,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},wr.createElement(rc,{padding:1,paddingTop:0,paddingBottom:0},wr.createElement(Am,null,"Select a board:")),wr.createElement(rc,{padding:1,flexDirection:"column"},i.map((c,d)=>{let p=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===d,f=le(c.id).flatMap(({id:g})=>be(g)).length;return wr.createElement(rc,{key:c.id??d},wr.createElement(Am,{color:p?y.accent:y.secondary2},wr.createElement(Ct,{isSelected:p})),wr.createElement(Am,{color:p?y.accent:y.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var iP=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:s,width:i})=>{let{renderedChildrenIndex:c}=ne(),d=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return Oi.createElement(oP,{flexDirection:"row"},e.context==="WORKSPACE"?Oi.createElement(Tm,null):d?Oi.createElement(ll,{height:f,width:i,swimlanes:(c[d.id]??[]).filter(g=>g!==void 0&&vn(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Oi.createElement(sP,null))},sI=Oi.memo(iP);import{useEffect as aP}from"react";var lP=e=>{aP(()=>{if(!e)return;let t,n=!1,r=()=>{if(n)return;let{autoSyncIntervalMs:o,userName:s,preferredEditor:i}=V();i&&s&&o&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:d}=v();d==="default"&&!c&&Wa(),r()},o))};return r(),()=>{n=!0,t&&clearTimeout(t)}},[e])},iI=({autoSync:e})=>(lP(e),null);import{useEffect as cP}from"react";var aI=()=>{let e=re(process.cwd());return a(e)?u("No project here",null):me({repoRoot:e.value})},lI=async()=>{let e=aI();if(a(e))return l(e.message);if(e.value===null)return u("No project here",null);let t=e.value,n=await ja(t);if(!Rt())return u("State not initialized",null);let r=de();if(a(r))return u("State not initialized",null);let{mode:o,readOnly:s,timeMode:i,syncStatus:c,selectedNode:d,contextNode:p}=r.value;if(zy())return u("Project loading",null);let m=aI();return a(m)||m.value!==t?u("Project changed",null):o!==I.DEFAULT||s||i!=="live"?u("Skipped while not on the live board",null):d?.isVirtual||p?.isVirtual?u("Skipped on a virtual node",null):c?.status==="syncing"?u("Sync in progress",null):n?u("Worktree held by a sync",null):et(t)===ga(t)?u("Log unchanged",null):(ee.debug("[watch] event log moved, reloading state"),Ks(t))};var dP=1e3,cI=()=>(cP(()=>Fl(lI,dP),[]),null);function wm({width:e,height:t}){let n=ne(),{autoSync:r,viewMode:o}=gp(),s=n.filters;if(n.mode===I.HELP)return we.createElement(Jn,{flexDirection:"column"},we.createElement(Ox,{width:e,height:t}));if(n.mode===I.IDENTITY)return we.createElement(Jn,{flexDirection:"column"},we.createElement(Fx,{width:e,height:t}));if(n.mode===I.PALETTE)return we.createElement(Jn,{flexDirection:"column"},we.createElement(Bi,{filters:s}),we.createElement(vx,{width:e,height:t-2}),we.createElement(Li,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=Un(),c=!i,d=i&&!n.hasProjectDefinition;if(c)return we.createElement(Jn,{flexDirection:"column"},we.createElement(Jn,{flexDirection:"column"},we.createElement(Bi,{hideBreadCrumb:!0,filters:s}),we.createElement(Im,{height:t,width:e})),we.createElement(Li,{width:e,mode:n.mode,availableHints:[]}));if(d)return we.createElement(Jn,{flexDirection:"column"},we.createElement(Jn,{flexDirection:"column"},we.createElement(Bi,{hideBreadCrumb:!0,filters:s}),we.createElement(_x,{height:t,width:e})),we.createElement(Li,{width:e,mode:n.mode,availableHints:[]}));let p=yt(n.breadCrumb??[],"BOARD");if(ve(p)){let m=p.value.id,f=le(m).length,g=3,h=Math.floor(e/g),x=Math.floor(e/Math.max(f,1));e=Math.min(x,h)*Math.max(f,g)}return we.createElement(Jn,{flexDirection:"column"},we.createElement(iI,{autoSync:r}),we.createElement(cI,null),we.createElement(Jn,{flexDirection:"column"},we.createElement(Bi,{filters:s}),we.createElement(sI,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:o??"dense",mode:n.mode})),we.createElement(Li,{width:e,mode:n.mode,availableHints:n.availableHints}))}import uP from"readline";var oc,sc,kn,mP=new Set([E.MoveCursorLeft,E.EraseInputWord,E.MoveCursorLeftOfWord,E.MoveCursorRight,E.MoveCursorRightOfWord,E.NavToPreviousContainer,E.NavToNextContainer,E.NavPreviousItem,E.NavNextItem,E.NavPreviousItemJump,E.NavNextItemJump,E.SetViewDense,E.SetViewWide,E.Confirm,E.Exit,E.Yank,E.InitCommandLine,E.InitCommandPalette,E.ExitCommandLine,E.CaptureInput,E.EraseInput,E.EraseInputWord,E.HideHelp,E.ViewHelp,E.SetViewDense,E.SetViewWide,E.GetLastCommandFromHistory,E.GetNextCommandFromHistory,E.AutoCompleteCommand]),pP=new Set([E.NavPreviousItem,E.NavNextItem,E.NavPreviousItemJump,E.NavNextItemJump,E.NavToPreviousContainer,E.NavToNextContainer,E.Confirm,E.Exit,E.InitCommandPalette,E.InitMove,E.MoveNextItem,E.MovePreviousItem,E.MoveNextItemJump,E.MovePreviousItemJump,E.MoveToNextContainer,E.MoveToPreviousContainer,E.Delete,E.AddItem,E.EditTitle,E.EditDescription,E.ConfirmMove,E.Edit,E.ViewHelp,E.Yank]),dI=async e=>{if(e.ctrl&&e.name==="c")return $.exit();let{actionIndex:t,mode:n,readOnly:r,timeMode:o}=v(),s=Of(e,n);if(!s||r&&!mP.has(s)||o==="replay"&&n===I.DEFAULT&&pP.has(s))return;let i=t[n]?.[s];if(i?.action)try{await i.action(i,e)}catch(c){logger.error(c)}},fP=()=>async function(t,n){n.name!=="escape"&&(kn&&(clearTimeout(kn),kn=void 0),await dI(n))},gP=()=>async function(t){if(t.length===1&&t[0]===27){kn&&clearTimeout(kn),kn=setTimeout(()=>{dI({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),kn=void 0},25);return}kn&&(clearTimeout(kn),kn=void 0)};function uI(){oc&&process.stdin.removeListener("keypress",oc),sc&&process.stdin.removeListener("data",sc),oc=fP(),sc=gP(),uP.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",sc),process.stdin.on("keypress",oc)}async function mI(){try{let e=co({});if(a(e))return sn(0,e.message);let t=ht();ve(t)&&je(t.value);let n=re(process.cwd());je({gitEmail:await wl(process.cwd()),gitName:await Rr(process.cwd())});let r=ve(n)?await ml(n.value):Ky();if(a(r))return r;let o=Mm();return a(o)?sn(6,o.message):(uI(),ve(n)&&pl(n.value),u("Booted Epiq",void 0))}catch(e){return sn(0,Po(e))}}wy();var bP=`${pn.bold("Epiq CLI")}
|
|
93
|
+
`,du.writeFileSync(t,n,"utf8"),ee.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),u("Local epiq paths ignored",!0)};var GN=async e=>{let t=await U({cwd:e,args:["status","--porcelain"]});return a(t)?t:u("Checked git diff",t.value.stdout.split(`
|
|
94
|
+
`).filter(n=>n.trim().length>0).map(n=>n.slice(3)))},ce=(e,t)=>l(`[${e}] ${t}`),ky=async({cwd:e,user:t})=>{let n=Ui(),o=await Zt(e);if(a(o))return ce(1,o.message);let r=o.value,s=await jm(r);if(a(s))return ce(2,s.message);if(s.value)return ce(2,`Cannot initialize Epiq while a git operation is in progress: ${s.value}`);let i=await GN(r);if(a(i))return ce(2.5,i.message);if(i.value.length>0)return ce(3,`Cannot initialize Epiq with uncommitted changes (${i.value.join(", ")}). Commit or stash your changes first.`);if(hs(r))return ce(4,"Epiq project already initialized");let{userId:c,userName:d}=t;if(!c||!d)return ce(5,"Missing Epiq user id");let p=await eh(r);if(a(p))return ce(6,p.message);let m=n.stateBranch,f=await Gi({repoRoot:r,branch:m});if(a(f))return ce(6,f.message);if(f.value)return ce(6,`State branch already exists: ${m}`);let g=await VN({repoRoot:r,stateBranch:m});if(a(g))return ce(6,g.message);if(g.value)return zN({repoRoot:r,stateBranch:m});let h=await Ad({repoRoot:r,stateBranchName:m});if(a(h))return ce(6,h.message);let x=ps();if(a(x))return ce(7,x.message);let b=uu.join(Lo(),n.projectId),R=await mo({repoRoot:r,stateBranchRoot:b,stateBranchName:m});if(a(R))return ce(8,R.message);let S=uu.join(b,".epiq");WN.mkdirSync(S,{recursive:!0});let A=Wg({userId:c,userName:d});if(a(A))return ce(9,A.message);for(let ft of A.value){let lr=Rg({event:ft,rootDir:b});if(a(lr))return ce(9,lr.message)}let w=ao({userId:c}),P=xa(b,w);if(a(P))return ce(9,P.message);let M=Nd(b,n);if(a(M))return ce(9,M.message);let O=await Oa({stateBranchRoot:b,eventFileName:w});if(a(O))return ce(10,O.message);let W=await Ce.stage({cwd:b,pathspec:[dt]});if(a(W))return ce(10,W.message);let Y=await gr({cwd:b,message:"[epiq:init]"});if(a(Y))return ce(10,Y.message);let xe=await Ly(r);if(a(xe))return ce(11,xe.message);let F=fc({repoRoot:r,fileContents:n});if(a(F))return ce(12,F.message);let X=await Ce.stage({cwd:r,pathspec:[".epiq/project.json",".gitignore"]});if(a(X))return ce(13,X.message);let Ve=await Ce.commit({cwd:r,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(a(Ve))return ce(13,Ve.message);let Qn=[],is=await U({cwd:r,args:["push","-u","origin","HEAD"]});a(is)&&Qn.push(`[init:14] ${is.message}`);let st=await zs({repoRoot:r,stateBranchRoot:b});return a(st)&&Qn.push(`[init:15] ${st.message}`),u("Project initialized",{repoRoot:r,projectId:n.projectId,stateBranch:m,stateBranchRoot:b,defaultEvents:A.value,warnings:Qn})},VN=async({repoRoot:e,stateBranch:t})=>{let n=await On({repoRoot:e});if(a(n))return l(n.message);if(!n.value)return u("No remote",!1);let o=await cs({repoRoot:e,branch:t});return a(o)?l(`Could not ask origin whether ${t} exists: ${o.message}`):o},zN=async({repoRoot:e,stateBranch:t})=>{let n=await U({cwd:e,args:["fetch","origin",t]});if(a(n))return ce(6,n.message);let o=await U({cwd:e,args:["show",`origin/${t}:${dt}`]});if(a(o))return ce(6,[`This repository is already an epiq project: origin has the state branch ${t}.`,"Initialising again would mint a second id for the same board.","","The branch was written before branches carried their identity, so restore",`${dt} from a checkout that has it, for example:`,"",` git show origin/main:${dt} > ${dt}`,"","and commit it; every later boot then stamps the branch, and the next clone adopts it."].join(`
|
|
95
|
+
`));let r;try{r=JSON.parse(o.value.stdout)}catch(x){return ce(6,`The identity on origin/${t} is not readable: ${x instanceof Error?x.message:String(x)}`)}let s=fc({repoRoot:e,fileContents:r});if(a(s))return ce(12,s.message);let i=await Ce.stage({cwd:e,pathspec:[dt]});if(a(i))return ce(13,i.message);let c=await Ce.commit({cwd:e,message:"[epiq:adopt-project]",pathspec:[dt]});if(a(c))return ce(13,c.message);let d=ps();if(a(d))return ce(7,d.message);let p=uu.join(Lo(),r.projectId),m=await Vs({repoRoot:e,stateBranchName:t});if(a(m))return ce(8,m.message);let f=await mo({repoRoot:e,stateBranchRoot:p,stateBranchName:t});if(a(f))return ce(8,f.message);let g=[],h=await U({cwd:e,args:["push","-u","origin","HEAD"]});return a(h)&&g.push(`[init:14] ${h.message}`),u("Adopted the project origin already holds",{repoRoot:e,projectId:r.projectId,stateBranch:r.stateBranch,stateBranchRoot:p,defaultEvents:[],warnings:g})};var ri=(e,t)=>l(`[${e}] ${t}`),Dy=async()=>{J("");let e=Un();if(!e.isSetupDone||!e.userName)return ri(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let t=V(),n=t.userName,o=t.userId;if(!o||!n)return ri(5,"Missing Epiq user id");let r=await ky({cwd:process.cwd(),user:{userId:o,userName:n}});if(a(r))return r;let s="Project initialized!";for(let g of r.value.warnings)s+=` Warn: ${g}`;let c=on(r.value.defaultEvents).filter(a);if(c.length>0)return ri(16,c.map(g=>g.message).join(`
|
|
96
|
+
`));let d=de();if(a(d))return ri(16,d.message);let{rootNodeId:p,nodes:m}=d.value,f=m[p];return f?($.navigate({contextNode:f,selectedIndex:0}),T({hasProjectDefinition:!0}),u(s,null)):ri(16,"Unable to resolve initialized root node")};import{ulid as qN}from"ulid";import{ulid as KN}from"ulid";var By=null,dn=()=>structuredClone(By),si=e=>{By=e},Oy=()=>{let{contextNode:e,selectedIndex:t}=v(),o=be(e.id)[t];return o?u("Resolved selected child",o):l("Target node not found")},mu=({id:e,parentId:t,position:n={at:"end"}})=>{let o=be(t).filter(r=>r.id!==e);return Ma(o,n)},Fy=({id:e,parentId:t,position:n={at:"end"}})=>{let o=pe();if(a(o))return l("Unable to resolve user ID");let r=mu({parentId:t,id:e,position:n});return a(r)?r:u("Created pending move state",{id:KN(),...o.value,action:"move.node",payload:{id:e,parent:t,rank:r.value.rank}})},_y=e=>{si(e);let t=Us(e,!0);return a(t)?t:u("Node moved successfully",t.value)};function pu(e){let t=Oy();if(a(t))return t;let{contextNode:n,nodes:o}=v();if(!n.parentNodeId)return l("Missing parent node id");let r=o[n.parentNodeId];if(!r)return l("Missing parent node");let s=be(r.id),i=s.findIndex(({id:p})=>p===n.id);if(i<0)return l("Current node not found among siblings");let c=s[i+e];if(!c)return l("Missing sibling node");let d=Fy({id:t.value.id,parentId:c.id,position:{at:"end"}});return a(d)?d:_y(d.value)}function ii(e,t=1){let n=Oy();if(a(n))return n;let{contextNode:o,selectedIndex:r}=v(),s=be(o.id),i=Math.min(Math.max(r+e*t,0),s.length-1),c=i===r?void 0:s[i];if(!c)return l("Missing sibling node");let d=Fy({id:n.value.id,parentId:o.id,position:{at:e===1?"after":"before",sibling:c.id}});return a(d)?d:_y(d.value)}var jy=()=>{let e=dn();if(!e)return l("No pending move state");let t=e.payload.id,n=e.payload.parent,o=v().nodes[n];if(!o)return l("Move parent not found");let r=be(n).findIndex(s=>s.id===t);return r===-1?l("Moved node not found among rendered children"):($.navigate({contextNode:o,selectedIndex:r}),u("Synchronized navigation to moved node",null))},Kr=(e,t="Moved preview")=>{if(a(e))return dn()&&T({mode:I.MOVE}),e;let n=jy();return a(n)?n:(T({mode:I.MOVE}),u(t,null))},$y=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t}=se().commandMeta,{contextNode:n,selectedIndex:o}=v(),r=be(n.id)[o];if(!r)return T({mode:I.DEFAULT}),l("No move target");if(t==="start"){if(r.readonly)return l("Target node is read-only");if(o===-1)return l("No item selected");if(!r.parentNodeId)return l("Target has no parent");let s=be(r.parentNodeId),i=s.findIndex(({id:f})=>f===r.id);if(i===-1)return l("Target not found among siblings");let c=s[i-1],d=s[i+1],p=d!=null?{at:"before",sibling:d.id}:c!=null?{at:"after",sibling:c.id}:{at:"start"},m=mu({parentId:r.parentNodeId,id:r.id,position:p});return a(m)?m:(si({id:qN(),action:"move.node",payload:{id:r.id,parent:r.parentNodeId,rank:m.value.rank},...D(e.value)}),T({mode:I.MOVE}),u("Move initialized",null))}if(t==="next")return Kr(ii(1));if(t==="previous")return Kr(ii(-1));if(t==="jump-next")return Kr(ii(1,Hs));if(t==="jump-previous")return Kr(ii(-1,Hs));if(t==="to-next")return Kr(pu(1));if(t==="to-previous")return Kr(pu(-1));if(t==="confirm"){let s=dn();if(!s)return l("No pending move to confirm");let i=await Ie();if(a(i))return i;let c=B([s],i.value);if(a(c))return c;let d=jy();return a(d)?d:(si(null),T({mode:I.DEFAULT}),u("Moved item",null))}return t==="cancel"?(si(null),T({mode:I.DEFAULT}),u("Cancelling move",null)):l("Invalid move modifier")};import{ulid as ml}from"ulid";import{monotonicFactory as YN,ulid as XN}from"ulid";var JN=YN(),ul=({name:e,parent:t,rank:n,user:{userId:o}})=>{let r=JN();return u("Created issue events",[{id:XN(),userId:o,action:"add.issue",payload:{id:r,parent:t,name:e,rank:n}}])};var Uy=async(e,t)=>{let n=pe();if(a(n))return l("Unable to resolve user ID");let o=await Ie();if(a(o))return o;let r=o.value;if(!t.inputString)return l(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:c}=v(),d=p=>{let m=B([p],r);if(a(m))return m;let f=N.getNode(m.value[0].result.id);if(!f)return l("Created node not found");if(!f.parentNodeId)return m;let g=N.getNode(f.parentNodeId);return g?($.navigate({contextNode:g,selectedIndex:N.getSiblings(f.parentNodeId).findIndex(({id:h})=>h===f.id)}),m):l("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:p}=v(),m=N.getNode(p);if(!m)return l("Workspace not found");let f=Wn(m.id,n.value,r);return a(f)?f:d({id:ml(),action:"add.board",payload:{id:ml(),name:t.inputString,parent:m.id,rank:f.value},...D(n.value)})}if(t.modifier==="swimlane"){let p=yt(s,"BOARD");if(a(p))return l("Unable to add swimlane in this context");let m=Wn(p.value.id,n.value,r);return a(m)?m:d({id:ml(),action:"add.swimlane",payload:{id:ml(),name:t.inputString,parent:p.value.id,rank:m.value},...D(n.value)})}if(t.modifier==="issue"){let p=le(i.id)[c],m=i.context==="SWIMLANE"?i:i.context==="BOARD"&&p?.context==="SWIMLANE"?p:(()=>{let A=yt(s,"SWIMLANE");return a(A)?null:A.value})();if(!m)return l("Unable to add issue in this context");let f=Wn(m.id,n.value,r);if(a(f))return f;let g=ul({name:t.inputString,parent:m.id,rank:f.value,user:n.value});if(a(g))return g;let h=g.value,x=B([...h],r);if(a(x))return x;if(!x.value[0])return l("Issue creation failed");let S=h.find(A=>A.action==="add.issue")?.payload.id;return S?($.navigate({contextNode:m,selectedIndex:N.getSiblings(m.id).findIndex(({id:A})=>A===S)}),u("Issue created",null)):l("Unable to determine ticket id")}return u("Success",null)};import aA from"node:os";import Yy from"node:path";import ai from"node:fs";import QN from"node:path";import{z as qo}from"zod";var li="command-history.json",ZN=20,eA=qo.object({projectId:qo.string().min(1),commands:qo.array(qo.string()),lastUsedAt:qo.number().finite()}),tA=qo.object({projects:qo.array(eA)}),Hy=()=>{let e=ti();return a(e)?e:u("Resolved command history path",QN.join(e.value,li))},nA=()=>{try{let e=oe(process.cwd());return a(e)?null:e.value}catch{return null}},Wy=e=>{if(!ai.existsSync(e))return u("No command history recorded",{state:"read",projects:[]});let t;try{t=ai.readFileSync(e,"utf8")}catch(r){return l(`Unable to read ${li}: ${r instanceof Error?r.message:String(r)}`)}let n;try{n=JSON.parse(t)}catch(r){return u("Unparsable command history",{state:"corrupt",reason:`Invalid ${li}: ${r instanceof Error?r.message:String(r)}`})}let o=tA.safeParse(n);return o.success?u("Read command history",{state:"read",projects:o.data.projects}):u("Command history in an unknown shape",{state:"corrupt",reason:`Invalid ${li} shape: ${o.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`})},Gy=({root:e})=>{let t=fn(e);if(a(t))return l(t.message);let n=Hy();if(a(n))return n;let o=Wy(n.value);if(a(o))return o;let r=o.value;if(r.state==="corrupt")return l(r.reason);let s=r.projects.find(i=>i.projectId===t.value);return u("Read command history",s?.commands.slice(0,Ls)??[])},Vy=({commands:e,root:t=nA(),now:n=Date.now()})=>{if(t===null)return u("No project; command history not stored",null);let o=fn(t);if(a(o))return l(o.message);let r=Hy();if(a(r))return r;let s=r.value,i=Wy(s);if(a(i))return i;let c=i.value,d=c.state==="read"?c.projects:[],p=[{projectId:o.value,commands:e.slice(0,Ls),lastUsedAt:n},...d.filter(f=>f.projectId!==o.value)].sort((f,g)=>g.lastUsedAt-f.lastUsedAt).slice(0,ZN),m=`${s}.${process.pid}.tmp`;try{ai.writeFileSync(m,JSON.stringify({projects:p},null,2)+`
|
|
97
|
+
`,"utf8"),ai.renameSync(m,s)}catch(f){try{ai.rmSync(m,{force:!0})}catch{}return l(`Unable to write ${li}: ${f instanceof Error?f.message:String(f)}`)}return u("Stored command history",null)};var oA=e=>e.some(t=>t.action==="init.workspace"),zy=async(e,t)=>{let n=ke(e);return a(n)?l(n.message):us({cwd:t,branch:n.value})},rA=e=>{let t=oe(process.cwd());if(a(t))return!1;let n=me({repoRoot:t.value});return!a(n)&&n.value===e},fu=!1,Ky=()=>fu,pl=async e=>{fu=!0;try{return await sA(e)}finally{fu=!1}},sA=async e=>{let t=me({repoRoot:e});if(a(t))return an(3,t.message);let n=t.value,o=await mo({repoRoot:e,stateBranchRoot:n,stateBranchName:Ui().stateBranch});if(a(o))return an(3,o.message);let r=et(n),s=rn(n);if(a(s))return an(3,s.message);if(!oA(s.value.events)){let f=await Ks({worktreeRoot:n,operation:"boot pull",fn:()=>Ua(n,()=>zy(e,n))});if(a(f)?logger.info(3,f.message):f.value===null?logger.info(3,"Another process holds the state worktree, skipped pull"):a(f.value)&&logger.info(3,f.value.message),r=et(n),s=rn(n),a(s))return an(3,s.message)}let{events:i,unreadable:c}=s.value,d=sn(i,c);if(a(d))return an(4,d.message);wr(n,r),T({hasProjectDefinition:!0,hasInitializingEvents:!!i.length});let p=sa({root:e});a(p)&&logger.info(p.message);let m=Gy({root:e});return a(m)&&logger.info(m.message),Lf(a(m)?[]:m.value),u("Loaded project",void 0)},iA=async e=>{let t=me({repoRoot:e});if(a(t))return l(t.message);let n=t.value,o=await On({repoRoot:n});if(a(o))return l(o.message);if(!o.value)return u("No remote to pull",void 0);let r=await Ks({worktreeRoot:n,operation:"boot pull",fn:()=>Ua(n,()=>(Mr("Pulling"),zy(e,n)))});if(a(r))return We(r.message);if(r.value===null)return u("Another process holds the state worktree",void 0);let s=r.value;if(a(s))return ds(s.message)?(Da("Offline"),u("Offline",void 0)):We(s.message);if(!s.value)return Ho("Already synced"),u("Already synced",void 0);if(!rA(n))return u("Project changed during the pull",void 0);let i=qs(n);return a(i)?i:(Ho("Pulled"),u("Pulled and reloaded",void 0))},fl=e=>{iA(e).then(t=>{a(t)&&logger.info(3,t.message)}).catch(t=>{logger.error(`[boot] pull failed: ${Pr(t)}`)})},qy=()=>{let e=sn([]);return a(e)?an(4,e.message):(T({hasProjectDefinition:!1,hasInitializingEvents:!1}),u("Booted without a project",void 0))};var lA=e=>e==="~"||e.startsWith("~/")?Yy.join(aA.homedir(),e.slice(1)):e,cA=(e,t)=>{let n=e.trim();if(!n)return l("Provide a number from the list or a path to a project");if(/^\d+$/.test(n)){let r=t[Number(n)-1];return r?u("Resolved recent project",r.root):l(`No recent project #${n}`)}let o=oe(Yy.resolve(lA(n)));return a(o)?l(`No epiq project at ${n}`):u("Resolved project path",o.value)},Xy=async()=>{let e=ga();if(J(""),v().hasProjectDefinition)return l("Already in a project; run epiq from another directory");let t=$n({exclude:process.cwd()}),n=a(t)?[]:t.value,o=cA(e,n);if(a(o))return l(o.message);let r=o.value,s=process.cwd();try{process.chdir(r)}catch(c){return l(`Unable to enter ${r}: ${c instanceof Error?c.message:String(c)}`)}let i=await pl(r);return a(i)?(process.chdir(s),l(i.message)):(fl(r),u(`Opened ${Er(r)}`,null))};var gl=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:o})=>{let r=v(),s=wa(n,t);if(a(s))return l(s.message);let{appliedEvents:i,unappliedEvents:c}=s.value,d=un();if(a(d))return d;let p=on(i),{fatal:m,skipped:f}=Sn(p);if(m.length>0)return un(),T(r),l(m.map(h=>h.message).join(", "));Rn(f);let g=v().nodes[e];return g?($.navigate({contextNode:g,selectedIndex:o}),u("",{unappliedEvents:c})):(un(),T(r),l("Board did not exist at that date"))};var Jy=e=>{let t=[],n=0;for(let r=0;r<e.length;r++){let s=r===0?0:Math.max(0,e[r]-e[r-1]);n+=Math.sqrt(s),t[r]=n}let o=n;return t.map((r,s)=>o>0?r/o:(s+1)/e.length)};var dA=20,uA=16,mA=150,hl=null,yl=null;var Yo=()=>{hl!==null&&(clearInterval(hl),hl=null),yl!==null&&(clearTimeout(yl),yl=null)},Qy=()=>{Yo(),T({mode:I.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Zy=({events:e,startTime:t,durationMs:n})=>{Yo();let o=e.length,r=vr(e.map(f=>to(f))).map(f=>f??t),s=r[o-1]??Date.now(),i=Jy(r),c=Math.max(1,Math.round(n*dA/1e3)),d=Math.max(Math.round(n/c),uA),p=0,m=0;T({mode:I.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:o,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),hl=setInterval(()=>{p++;let f=p/c,g=[],h,x;for(;m<o&&i[m]<=f;){let R=e[m],S=Us(R);if(a(S)){if(Tr(S)){m++;continue}Qy();return}g.push(...Id(R)),h=R,x=r[m],m++}if(m>=o||p>=c){for(;m<o;m++){let S=Us(e[m]);if(a(S)&&!Tr(S))break}let R=v().replay;T({unappliedEvents:[],replay:R&&{...R,progress:1,appliedCount:o}}),Yo(),yl=setTimeout(Qy,mA);return}let b=v().replay;T({unappliedEvents:e.slice(m),replay:{progress:Math.min(1,f),appliedCount:m,totalCount:o,startTime:t,endTime:s,currentTime:h?x??b?.currentTime??t:b?.currentTime??t,currentLabel:h?vl(h):b?.currentLabel??"",flashNodeIds:h?[...new Set(g)]:b?.flashNodeIds??[]}})},d)};var ev=async()=>{let e=yt(v().breadCrumb,"BOARD");if(a(e))return e;let t=await Zt(process.cwd());if(a(t))return l("Unable to locate repo root");let n=me({repoRoot:t.value});if(a(n))return n;let{modifier:o,inputString:r}=se().commandMeta;if(Yo(),o==="now"){let c=uo(n.value);if(a(c))return l(c.message);let d=un();if(a(d))return d;let p=on(c.value),{fatal:m,skipped:f}=Sn(p);return m.length>0?l(m.map(g=>g.message).join(", ")):(Rn(f),T({mode:I.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Peeking now",!0))}let s;if(o==="prev"||o==="next"){let c=Ta(n.value);if(a(c))return c;let d=o==="prev"?v().eventLog.at(-1):v().unappliedEvents.at(0),p=d===void 0?null:to(d),m=(d===void 0?null:c.value.get(d.id)??null)??(p===null?null:xs(p));if(m===null)return l(o==="prev"?"No previous event to peek":"No next event to peek");s=o==="prev"?m:m+1}else{let c=ko(o||r.trim());if(!c)return l("Invalid peek date");s=c.getTime()}let i=gl({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return a(i)?i:(T({mode:I.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),u("Peeking",!0))};var tv=async()=>{let e=yt(v().breadCrumb,"BOARD");if(a(e))return e;let t=await Zt(process.cwd());if(a(t))return l("Unable to locate repo root");let n=me({repoRoot:t.value});if(a(n))return n;let{modifier:o,inputString:r}=se().commandMeta,{dateInput:s,durationInput:i}=da(o,r);if(Yo(),v().syncStatus.status==="syncing")return l("Cannot replay while syncing, try again in a moment");let c=ko(s);if(!c)return l("Invalid replay date");let d=i?ca(i):15e3;if(d===null)return l("Invalid replay duration (try e.g. 30s or 2m)");let p=c.getTime(),m=v(),f=gl({boardId:e.value.id,targetTime:p,stateBranchRoot:n.value,selectedIndex:-1});if(a(f))return f;let{unappliedEvents:g}=f.value;return g.length===0?(un(),T(m),u("Nothing to replay from that point",!0)):(Zy({events:g,startTime:p,durationMs:d}),u("Replaying board history",!0))};import{spawn as fA}from"node:child_process";var gA=()=>{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"]}}},nv=async e=>new Promise(t=>{let{command:n,args:o}=gA();try{let r=fA(n,o,{stdio:["pipe","ignore","ignore"]});r.on("error",()=>t(l(`Clipboard tool not available (${n})`))),r.on("close",s=>t(s===0?u("Copied to clipboard",null):l(`Clipboard tool failed (${n})`))),r.stdin.on("error",()=>{}),r.stdin.write(e),r.stdin.end()}catch{t(l(`Clipboard tool not available (${n})`))}});var ci=async(e,t)=>{if(!e.trim())return l(`Nothing to copy: ${t} is empty`);let n=await nv(e);return a(n)?n:u(`Copied ${t} to clipboard`,null)},ov=async e=>{let{breadCrumb:t,selectedNode:n}=v(),o=As({breadCrumb:t,selectedNode:n}),r=o??n;if(!r)return l("Nothing selected to copy from");switch(e.modifier){case qe.REF:return ci(H(r.id),"ref");case qe.TITLE:return ci(r.title,"title");case qe.DESCRIPTION:return o?ci(o.props?.description??"","description"):l("No issue in scope");case qe.TAGS:{if(!o)return l("No issue in scope");let s=bn(o).map(({name:i})=>i);return ci(s.join(", "),"tags")}case qe.ASSIGNEES:{if(!o)return l("No issue in scope");let s=xn(o).map(({name:i})=>i);return ci(s.join(", "),"assignees")}default:return l("Yank one of: ref, title, description, tags, assignees")}};var rv=async()=>{J(""),T({mode:I.DEFAULT});let e=de();if(a(e))return l(e.message);if(e.value.syncStatus.status==="syncing")return l("Sync already in progress");T({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Wa();return a(t)?(T({syncStatus:{msg:t.message,status:"failed"}}),t):(T({mode:I.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{ulid as sv}from"ulid";var iv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),o=le(t.id)[n];if(!o)return l("Unable to resolve child to delete");let r=await Ie();if(a(r))return r;if(o.context==="COMMENT"){let s=o.id,i=_(t)?t.id:t.parentNodeId;if(!i)return l("Unable to resolve comment issue");let c=v().nodes[i];if(!c||!_(c))return l("Unable to resolve comment issue");let d=c.log?.filter(Ah).find(p=>p.payload.id===s);return d?d.payload.author!==e.value.userId?l("You can only delete your own comments"):B([{id:sv(),action:"delete.issue.comment",payload:{id:s,issue:i},...D(e.value)}],r.value):l("Unable to resolve comment")}return B([{id:sv(),action:"delete.node",payload:{id:o.id},...D(e.value)}],r.value)};import{ulid as hA}from"ulid";var av=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),o=le(t.id)[n];if(!o)return l("Unable to close issue, no target found");if(!_(o))return l("Cannot close in this context");let r=v().nodes[he];if(!r)return l("Unable to locate closed swimlane");if(o.parentNodeId===r.id)return l("Issue is already closed");let s=await Ie();if(a(s))return s;let i=s.value,c=Cn(r.id,o.id,{at:"end"},e.value,i);if(a(c))return c;let d=B([{id:hA(),action:"close.issue",payload:{id:o.id,parent:r.id,rank:c.value},...D(e.value)}],i);return a(d)?d:u("Issue closed",null)};import{ulid as yA}from"ulid";var bl=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o&&o.action==="close.issue"&&o.payload.id===e.id){for(let r=n-1;r>=0;r--){let s=t[r];if(s&&"id"in s.payload&&s.payload.id===e.id&&"parent"in s.payload&&s.payload.parent)return s.payload.parent}return null}}return null};var lv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),o=le(t.id)[n];if(!o)return l("Unable to reopen issue, no target found");let r=o.context==="TICKET"?u("Resolved ticket",o):wt(o.id,"TICKET");if(a(r))return l("Cannot reopen in this context");let s=r.value,i=v().nodes[he];if(!i)return l("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return l("Issue is not closed");if(!_(s))return l("Target node is not issue");let c=bl(s);if(!c)return l("Unable to resolve previous parent from issue history");if(c===i.id)return l("Previous parent resolves to closed swimlane");let d=v().nodes[c];if(!d)return l("Previous parent no longer exists");let p=await Ie();if(a(p))return p;let m=p.value,f=Cn(d.id,s.id,{at:"end"},e.value,m);if(a(f))return f;let g=B([{id:yA(),action:"reopen.issue",payload:{id:s.id,parent:d.id,rank:f.value},...D(e.value)}],m);return a(g)?g:u("Issue reopened",null)};import{ulid as vA}from"ulid";var cv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),o=le(t.id)[n];if(!o)return l("Missing node");if(o.readonly)return l("Cannot rename readonly node");let r=ga();if(!r)return l("Provide a title");let s=await Ie();return a(s)?s:B([{id:vA(),action:"edit.title",payload:{id:o.id,name:r},...D(e.value)}],s.value)};import{ulid as bA}from"ulid";var dv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,o=(t||n).trim();if(!o)return l("Provide a tag");let r=N.findTagByName(o);if(!r)return l(`Tag "${o}" does not exist`);let{selectedNode:s}=v();if(!s)return l("Invalid untag target");let i=wt(s.id,"TICKET");if(a(i))return l("Unable to untag issue in this context");let c=i.value;if(!_(c))return l("Target node is not issue");if(!(c.props.tags??[]).includes(r.id))return l("Issue is not tagged with that tag");let p=await Ie();return a(p)?p:B([{id:bA(),action:"remove.issue.tag",payload:{id:c.id,tag:r.id},...D(e.value)}],p.value)};import{ulid as gu}from"ulid";var uv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,o=(t||n).trim();if(!o)return l("Provide a tag");let{selectedNode:r}=v();if(!r)return l("Invalid tag target");let s=wt(r.id,"TICKET");if(a(s))return l("Unable to tag issue in this context");let i=s.value;if(!_(i))return l("Target node is not issue");let c=await Ie();if(a(c))return c;let d=N.findTagByName(o),p=d?.id??gu();return(i.props.tags??[]).includes(p)?l("Already tagged with that tag"):B([...d?[]:[{id:gu(),action:"create.tag",payload:{id:p,name:o},...D(e.value)}],{id:gu(),action:"add.issue.tag",payload:{id:i.id,tag:p},...D(e.value)}],c.value)};import{ulid as hu}from"ulid";var di=({events:e,registry:t,logFileNames:n})=>{let o=new Map(n),r=new Set;for(let s of e)s.userId&&(o.has(s.userId)||o.set(s.userId,""),r.add(s.userId));for(let s of Object.values(t))o.set(s.id,s.name);return[...o.entries()].map(([s,i])=>({id:s,name:i,isExternal:!r.has(s)}))},mv=({authorName:e,authorEmail:t,owners:n,registry:o})=>{let r=Ze(t),s=n.get(r),i=s?o[s]:void 0;return s?{...Ke(s,i?.name),resolved:!0}:{...Ke(r||e,e),resolved:!1}};var xl=e=>{let{eventLog:t=[],contributors:n}=v();return di({events:t,registry:n,logFileNames:co(e)})};var pv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,o=(t||n).trim();if(!o)return l("Provide an assignee");let r=o.startsWith("!"),s=(r?o.slice(1):o).trim();if(!s)return l("Provide an assignee");let{selectedIndex:i,contextNode:c}=v(),d=le(c.id)[i];if(!d)return l("Invalid assign target");let p=wt(d.id,"TICKET");if(a(p))return l("Unable to assign issue in this context");let m=p.value;if(!_(m))return l("Target node is not issue");let f=await Ie();if(a(f))return f;let g=xl(f.value),h=!r&&s.toLowerCase()==="me",x,b;if(h)x=e.value.userId,b=g.find(A=>A.id===x)?.name??e.value.userName;else{let A=g.filter(P=>P.name===s);if(A.length>1)return l(`"${s}" matches ${A.length} contributors (${A.map(P=>P.id).join(", ")}). Assign from the GUI to choose by id.`);let w=A[0];if(!w&&!r)return l(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);x=w?.id??hu(),b=w?.name??s}if((m.props.assignees??[]).includes(x))return l("Assignee already assigned");let S=!!v().contributors[x];return B([...S?[]:[{id:hu(),action:"create.contributor",payload:{id:x,name:b},...D(e.value)}],{id:hu(),action:"add.issue.assignee",payload:{id:m.id,assignee:x},...D(e.value)}],f.value)};import{ulid as xA}from"ulid";var fv=async()=>{let e=pe();if(a(e))return l("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,o=(t||n).trim();if(!o)return l("Provide an assignee to remove");let{selectedNode:r}=v();if(!r)return l("Invalid unassign target");let s=wt(r.id,"TICKET");if(a(s))return l("Unable to unassign in this context");let i=s.value;if(!_(i))return l("Target node is not issue");let c=i.props.assignees??[],d=o.toLowerCase()==="me",p=await Ie();if(a(p))return p;let m=d?c.filter(g=>g===e.value.userId):xl(p.value).filter(g=>g.name===o&&c.includes(g.id)).map(g=>g.id);if(m.length>1)return l(`"${o}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let f=m[0];return f?B([{id:xA(),action:"remove.issue.assignee",payload:{id:i.id,assignee:f},...D(e.value)}],p.value):l(d?"Issue is not assigned to you":`Issue is not assigned to "${o}"`)};import{ulid as gv}from"ulid";var IA=e=>{let t=e.trim(),n=vo(),o=n?oy(t):null;if(!n||!o)return{ok:!0,md:t,anchored:!1};let r=il();if(!r||r.sha!==n)return{ok:!1,reason:"No diff is open"};let s=ry(r.rows,Math.max(0,v().selectedIndex));if(!s)return{ok:!1,reason:"That line is not in a file"};let i=sy(r.rows,s,o.start,o.end);return i.ok?{ok:!0,anchored:!0,md:Fh({filePath:i.value.filePath,start:i.value.start,end:i.value.end,side:"additions",endSide:"additions",note:o.note,sha:n,snippet:i.value.snippet})}:{ok:!1,reason:i.reason}},hv=async e=>{let t=IA(e.inputString);if(!t.ok)return l(t.reason);let{md:n,anchored:o}=t;if(!n)return l("Provide a comment");if(n.length>4e3)return l(o?`The note and the ${n.length} characters of quoted lines exceed ${4e3}; comment on fewer lines`:`Cannot exceed ${4e3} characters`);let r=pe();if(a(r))return l("Unable to resolve user ID");let{breadCrumb:s,selectedNode:i}=v(),c=yt([...s,i],"TICKET");if(a(c))return l("Edit target must be an issue");let d=c.value;if(!d)return l("Invalid comment target");let p=d.context==="TICKET"?u("Resolved ticket",d):wt(d.id,"TICKET");if(a(p))return l("Unable to comment on issue in this context");let m=p.value;if(!_(m))return l("Target node is not issue");let f=await Ie();if(a(f))return f;let g=await B([{id:gv(),action:"add.issue.comment",payload:{id:gv(),issue:m.id,author:r.value.userId,md:n},...D(r.value)}],f.value);return o&&!a(g)&&zo(null),g};import{ulid as AA}from"ulid";var Il=e=>e.userName?.trim()?e.preferredEditor?.trim()?null:"no editor configured":"no username configured",EA=e=>{let t=ht();return a(t)?Il({userName:e.userName,preferredEditor:e.preferredEditor})??t.message:Il(t.value)},ui=()=>{let e=hn();return a(e)?l(e.message):u("Read auto sync settings",{enabled:e.value.autoSync===!0,intervalMs:mr(e.value.autoSyncDebounceMs),blockedReason:EA(e.value)})},qr=e=>{let t=e.intervalMs===void 0?void 0:ur(e.intervalMs);if(e.intervalMs!==void 0&&t===null)return l(`Auto sync interval must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=ui();if(a(n))return n;let o=Ut({...e.enabled===void 0?{}:{autoSync:e.enabled},...t==null?{}:{autoSyncDebounceMs:t}});if(a(o))return l(o.message);je({...e.enabled===void 0?{}:{autoSync:e.enabled},...t==null?{}:{autoSyncIntervalMs:t}});let r=ui();return a(r)?u("Changed auto sync settings",{...n.value,...e.enabled===void 0?{}:{enabled:e.enabled},...t==null?{}:{intervalMs:t}}):r};var yv=()=>{let e=se().commandMeta.inputString,t=ur(e);if(t===null)return l(`Auto sync duration must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=qr({intervalMs:t});return a(n)?n:u(`Auto sync interval set to ${t}ms`,null)};var vv=()=>{let e=se().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return l("Invalid response");let t=Qp(e),n=qr({enabled:t===!0});return a(n)?n:u(`Auto sync set to "${e}"`,null)};import{ulid as CA}from"ulid";var yu=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=2),bv="",xv=new Map,SA=15e3;var RA=async(e,t)=>{let n=`${e} ${t??""}`,o=xv.get(n);if(o&&Date.now()-o.at<Ja(SA))return u("Cached author scan",o.authors);let r=await Le({cwd:e,args:["log","--branches",...t?["--not",t]:[],`--format=%an${bv}%ae`]});if(r.exitCode!==0)return l(`Could not read this repository's history: ${(r.stderr??"").trim()||`git exited ${r.exitCode}`}`);let s=new Map;for(let i of(r.stdout??"").split(`
|
|
98
|
+
`)){let c=i.lastIndexOf(bv);if(c===-1)continue;let d=i.slice(0,c),p=Ze(i.slice(c+1));if(!no(p))continue;let m=s.get(p)??{names:new Set,commits:0};d&&m.names.add(d),m.commits+=1,s.set(p,m)}return xv.set(n,{at:Date.now(),authors:s}),u("Scanned repository authors",s)},Mn=async({repoRoot:e,stateBranch:t,names:n,links:o})=>{let r=await RA(e,t);if(a(r))return l(r.message);let s=r.value,i=new Map;for(let d of Object.values(o)){if(d.tombstoned)continue;let p=i.get(d.email)??new Set;p.add(d.contributor),i.set(d.email,p)}let c=new Set(n.flatMap(d=>yu(d??"")));return u("Found candidates",[...s.entries()].map(([d,p])=>({email:d,names:[...p.names],commits:p.commits,looksLikeYours:[...p.names].some(m=>yu(m).some(f=>c.has(f)))||yu(d.split("@")[0]??"").some(m=>c.has(m)),claimedBy:[...i.get(d)??[]]})).sort((d,p)=>d.looksLikeYours===p.looksLikeYours?p.commits-d.commits:Number(p.looksLikeYours)-Number(d.looksLikeYours)))},Io=e=>e.filter(t=>t.claimedBy.length===0);var Iv=()=>{let e=Vc();if(!e)return u("Nothing here to decline",null);let t=hn(),n=a(t)?[]:t.value.declinedEmailBoards??[],o=[...new Set([...n,e])],r=Ut({declinedEmailBoards:o});return a(r)?l(r.message):(je({declinedEmailBoards:[...new Set([...V().declinedEmailBoards??[],e])]}),u("Declined",null))},Ev=async()=>{let e=se().commandMeta.inputString.trim();if(e==="none"){let R=Iv();return a(R)?R:u("Left unlinked. Your commits will show the name git signed them with. Run :config emails again to change that.",null)}let{userId:t,userName:n,gitName:o}=V();if(!t)return l("Set a username first with :config username");let r=de();if(a(r))return l("Board is not loaded");let s=oe(process.cwd());if(a(s))return l(s.message);let i=ke(s.value),c=await Mn({repoRoot:s.value,stateBranch:a(i)?void 0:i.value,names:[n,o],links:r.value.emailLinks});if(a(c))return c;let p=Io(c.value);if(Sr(p.map(R=>R.email)),p.length===0){if(!Xp()){let R=Iv();if(a(R))return R}return u("No unclaimed addresses in this history.",null)}if(!e)return T({mode:I.IDENTITY}),u("Opened identity",null);let m=e.split(/[,\s]+/).filter(Boolean),f=[],g=[];for(let R of m){let S=p.find(A=>A.email===Ze(R));if(!S){g.push(R);continue}f.includes(S)||f.push(S)}if(g.length>0)return l(`Not on the list: ${g.join(", ")}. Pick one of ${p.map(R=>R.email).join(", ")}.`);let h=me({repoRoot:s.value});if(a(h))return h;let x=f.map(R=>({id:CA(),action:"link.contributor.email",payload:{contributor:t,email:R.email},userId:t})),b=B(x,h.value);return a(b)?l(b.message):u(`Claimed ${f.map(R=>R.email).join(", ")}. Every commit by ${f.length===1?"that address":"those addresses"} is now yours.`,null)};import{ulid as NA}from"ulid";var Sv=()=>{let e=se().commandMeta.inputString.trim(),{userId:t}=V();if(!t)return l("Set a username first with :config username");let n=de();if(a(n))return l("Board is not loaded");let o=yn(n.value.emailLinks,t);if(o.length===0)return l("You have not claimed any addresses.");if(!e)return l(`Which one? ${o.join(", ")}.`);let r=o.find(d=>d===Ze(e));if(!r)return l(`You have not claimed ${e}. Yours: ${o.join(", ")}.`);let s=oe(process.cwd());if(a(s))return s;let i=me({repoRoot:s.value});if(a(i))return i;let c=B([{id:NA(),action:"unlink.contributor.email",payload:{contributor:t,email:r},userId:t}],i.value);return a(c)?l(c.message):u(`Unclaimed ${r}`,null)};var Rv=()=>{let e=se().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return l("Invalid response");let n=Ut({logLevel:e});return a(n)?n:(je({logLevel:e}),u(`Auto sync set to "${e}"`,null))};var Cv=e=>{let t=e.inputString.trim();switch(e.modifier){case ye.USERNAME:{if(process.env[Dn])return l(`Cannot change the configured user while ${Dn} names this process`);let n=hn();if(a(n))return n;let{userId:o,preferredEditor:r,userName:s}=n.value,i=t||s,c=o||AA();if(!i||!c)return l("Unable to resolve user name or id");let d=Ut({userName:i,userId:c,preferredEditor:r??""});return a(d)?d:(je({userName:i,userId:c}),u(`Username set to "${i}"`,null))}case ye.EDITOR:{if(!t)return l("No editor provided");let n=Ut({preferredEditor:t});return a(n)?n:(je({preferredEditor:t}),u(`Editor configuration set to "${t}"`,null))}case ye.VIEW:{if(t!=="wide"&&t!=="dense")return l("Invalid view mode");let n=Ut({viewMode:t});return a(n)?n:(je({viewMode:t}),u(`View set to "${t}"`,null))}case ye.EMAILS:return Ev();case ye.EMAILS_UNCLAIM:return Sv();case ye.AUTOSYNC:return vv();case ye.LOG_LEVEL:return Rv();case ye.SYNC_DEBOUNCE_MS:return yv();case ye.ATTACHMENT_MAX_KB:return ff();default:return l("Unknown config command")}};var vu=()=>{let e=Zp(),t=v().mode;if(!(t!==I.COMMAND_LINE&&t!==I.DEFAULT)){if(!e){T({mode:I.DEFAULT});return}T({mode:I.COMMAND_LINE}),J(e)}};var El=[{systemOnly:!0,intent:G.Move,description:"Internal move-state command",mode:I.COMMAND_LINE,action:$y},{intent:G.Delete,description:"Delete the currently selected node",mode:I.COMMAND_LINE,action:iv,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:I.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=se().commandMeta,n=/(!=|=)/,[o]=e.split(n);if(!o||!(i=>Be(C.FILTER).map(c=>c.split(n)[0]).includes(i))(o))return l("Invalid filter modifier");let s={target:o,operator:"=",value:t.trim()};return Oe(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:I.DEFAULT})),u("Filter updated",null)}},{intent:G.ViewHelp,description:"Open the help screen",mode:I.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=v();return xo({pendingNavTarget:{contextNode:e,breadCrumb:o,selectedIndex:t,selectedNode:n}}),T({mode:I.HELP}),u("Viewing help",null)}},{intent:G.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:I.COMMAND_LINE,action:av,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:I.COMMAND_LINE,action:lv,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.Init,description:"Initialize Epiq in the current git repository",mode:I.COMMAND_LINE,action:Dy,onSuccess:vu},{intent:G.OpenProject,description:"Open a recently used epiq project, by number or path",mode:I.COMMAND_LINE,action:Xy,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.NewItem,description:"Create a new board, swimlane, or issue",mode:I.COMMAND_LINE,action:Uy,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.Rename,description:"Rename the currently selected node",mode:I.COMMAND_LINE,action:cv,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.UntagTicket,description:"Remove a tag from the selected issue",mode:I.COMMAND_LINE,action:dv,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.TagTicket,description:"Add or create a tag on the selected issue",mode:I.COMMAND_LINE,action:uv,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.AssignUserToTicket,description:"Assign a user to the selected issue",mode:I.COMMAND_LINE,action:pv,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:I.COMMAND_LINE,action:fv,onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.Comment,description:"Add a comment to the selected issue",mode:I.COMMAND_LINE,action:async(e,t)=>hv(t),onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.Sync,description:"Pull, commit, and push Epiq state",mode:I.COMMAND_LINE,action:rv},{intent:G.Peek,description:"View board state at another point in time",mode:I.COMMAND_LINE,action:ev},{intent:G.Replay,description:"Replay board history forward from a point in time",mode:I.COMMAND_LINE,action:tv},{intent:G.Export,description:"Export the current board layout to markdown",mode:I.COMMAND_LINE,action:async()=>{let e=await wy();return a(e)?e:(T({mode:I.DEFAULT}),u("Export successful",!0))}},{intent:G.Exit,description:"Exit the application",mode:I.COMMAND_LINE,action:async()=>($.exit(),u("Exit successful",!0))},{intent:G.Edit,description:"Edit title or description",mode:I.COMMAND_LINE,action:async(e,t)=>Py(t),onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:I.COMMAND_LINE,action:async(e,t)=>ov(t),onSuccess:()=>T({mode:I.DEFAULT})},{intent:G.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:I.COMMAND_LINE,action:(e,t)=>Cv(t),onSuccess:vu}];var wA=new Set(["peek","replay","filter","view-help","yank"]),zt=async({isForceExecutedBySystem:e=!1}={})=>{let{value:t,commandMeta:{command:n,validity:o,modifier:r,inputString:s}}=se();if(!n)return l("No command to confirm");if(!e&&o===En.Invalid)return l("Invalid command");let i=Va(n);Mf();let{readOnly:c}=v();if(c&&!wA.has(i))return ks({status:Zn.Fail,message:"Command not available in readonly state",value:null});let d=El.filter(f=>e||f.systemOnly!==!0).find(f=>f.intent===i);if(!d)return ks({status:Zn.Fail,message:"Command not found",value:null});let p;try{p=await d.action(d,{command:n,inputString:s,modifier:r})}catch(f){return ks({status:Zn.Fail,message:f instanceof Error?f.message:"Command failed",value:null})}if(a(p))return ks(p);let m=!e;if(Pf({addToHistory:m,line:t}),m){let f=Vy({commands:se().commandHistory});a(f)&&logger.info(f.message)}return d.onSuccess?.(),V().autoSync&&Ga(),p};var Sl=[{intent:E.Exit,mode:I.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(T({mode:I.COMMAND_LINE}),J("move cancel"),zt({isForceExecutedBySystem:!0}))},{intent:E.InitMove,mode:I.DEFAULT,description:"[m] move",action:()=>(T({mode:I.COMMAND_LINE}),J("move start"),zt({isForceExecutedBySystem:!0}))},{intent:E.ConfirmMove,mode:I.MOVE,description:"[m] confirm move",action:()=>(T({mode:I.COMMAND_LINE}),J("move confirm"),zt({isForceExecutedBySystem:!0}))}],Rl=[{intent:E.MovePreviousItem,mode:I.MOVE,action:()=>dn()?(T({mode:I.COMMAND_LINE}),J("move previous"),zt({isForceExecutedBySystem:!0})):l("No pending move")},{intent:E.MoveNextItem,mode:I.MOVE,description:"[arrows/hjkl] move (shift x5)",action:()=>dn()?(T({mode:I.COMMAND_LINE}),J("move next"),zt({isForceExecutedBySystem:!0})):l("No pending move")},{intent:E.MovePreviousItemJump,mode:I.MOVE,action:()=>dn()?(T({mode:I.COMMAND_LINE}),J("move jump-previous"),zt({isForceExecutedBySystem:!0})):l("No pending move")},{intent:E.MoveNextItemJump,mode:I.MOVE,action:()=>dn()?(T({mode:I.COMMAND_LINE}),J("move jump-next"),zt({isForceExecutedBySystem:!0})):l("No pending move")}],Nv=[{intent:E.MoveToNextContainer,mode:I.MOVE,action:()=>dn()?(T({mode:I.COMMAND_LINE}),J("move to-next"),zt({isForceExecutedBySystem:!0})):l("No pending move")},{intent:E.MoveToPreviousContainer,mode:I.MOVE,action:()=>dn()?(T({mode:I.COMMAND_LINE}),J("move to-previous"),zt({isForceExecutedBySystem:!0})):l("No pending move")}];var Av={[re.WORKSPACE]:[...Sl,...Rl],[re.BOARD]:[...Sl,...Rl],[re.SWIMLANE]:[...Sl,...Rl,...Nv],[re.TICKET]:[],[re.FIELD]:[],[re.FIELD_LIST]:[],[re.TEXT]:[],[re.COMMENT]:[]};import MA from"node:fs";import PA from"node:path";import{spawn as TA}from"node:child_process";function wv(e){let t=process.platform,r=TA(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return r.unref(),r.on("error",()=>{}),!0}var Tv=e=>{let t=oe(process.cwd());if(a(t))return l("Unable to resolve project root");let n=me({repoRoot:t.value});if(a(n))return l(n.message);let o=Oo(e.hash,e.ext),r=PA.join(gs(n.value),o);return MA.existsSync(r)?(wv(r),u(`Opened ${e.name}`,null)):l("Attachment file not found \u2014 run :sync to fetch it")};var Mv=()=>{J("");let{pendingNavTarget:e}=bo();T({mode:I.DEFAULT}),e&&$.navigate(e),xo({pendingNavTarget:void 0})},Pv=[{intent:E.ExitCommandLine,mode:I.HELP,action:()=>(Mv(),u("Exiting help",null))},{intent:E.Exit,mode:I.HELP,action:()=>(Mv(),u("Closed help",null))},{intent:E.NavPreviousItem,mode:I.HELP,description:"[arrows/hjkl] navigate (shift x5)",action:()=>($.navigateToPreviousItem(),u("Navigating to previous help item",null))},{intent:E.NavNextItem,mode:I.HELP,action:()=>($.navigateToNextItem(),u("Navigating to next help item",null))},{intent:E.NavPreviousItemJump,mode:I.HELP,action:()=>($.jumpToPreviousItem(),u("Jumping to previous help item",null))},{intent:E.NavNextItemJump,mode:I.HELP,action:()=>($.jumpToNextItem(),u("Jumping to next help item",null))},{intent:E.NavToPreviousContainer,mode:I.HELP,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous help container",null))},{intent:E.NavToNextContainer,mode:I.HELP,action:()=>($.navigateToNextContainer(),u("Navigating to next help container",null))}];var Lv=()=>{J(""),T({mode:I.DEFAULT})},kv=[{intent:E.Confirm,mode:I.IDENTITY,description:"[enter] claim the first",action:()=>{let[e]=Rr();return e?(T({mode:I.COMMAND_LINE}),J(`config emails ${e}`),u("Proposed claim",null)):u("Nothing left to claim",null)}},{intent:E.ExitCommandLine,mode:I.IDENTITY,action:()=>(Lv(),u("Closed identity",null))},{intent:E.Exit,mode:I.IDENTITY,description:"[esc] close",action:()=>(Lv(),u("Closed identity",null))}];var LA=e=>{T({mode:I.COMMAND_LINE});let{pendingNavTarget:t}=bo();t&&$.navigate(t),xo({pendingNavTarget:void 0}),J(`${e} `)},Dv=()=>{J("");let{pendingNavTarget:e}=bo();e&&$.navigate(e),xo({pendingNavTarget:void 0}),T({mode:I.DEFAULT})},Bv=[{intent:E.InitCommandPalette,mode:I.DEFAULT,description:"[?] command palette",action:()=>{J("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=v();return xo({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}}),T({mode:I.PALETTE}),u("Opening command palette",null)}},{intent:E.Confirm,mode:I.PALETTE,action:()=>{let{selectedNode:e}=v();if(!e||!oo(e))return l("Command only applicable on text nodes");if(e.props.disabled)return l("Command is not available in this context");let t=e.title;return t?(LA(t),u("Selected command",t)):u("No command selected",null)}},{intent:E.ExitCommandLine,mode:I.PALETTE,action:()=>(Dv(),u("Exiting palette",null))},{intent:E.Exit,mode:I.PALETTE,action:()=>(Dv(),u("Closed command palette",null))},{intent:E.NavPreviousItem,mode:I.PALETTE,description:"[arrows/hjkl] navigate",action:()=>($.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:E.NavNextItem,mode:I.PALETTE,action:()=>($.navigateToNextItem(),u("Navigating to next item",null))},{intent:E.NavToPreviousContainer,mode:I.PALETTE,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:E.NavToNextContainer,mode:I.PALETTE,action:()=>($.navigateToNextContainer(),u("Navigating to next container",null))}];var Ov=()=>{let e=vo();if(!e)return u("Nothing to comment on here",null);let t=il();if(!t||t.sha!==e)return l("The diff is still loading");let{selectedIndex:n}=v(),o=Math.max(0,n),r=Kd(t.rows,tu(e)??o,o);return r.ok?(T({mode:I.COMMAND_LINE}),J(`${C.COMMENT} ${ny(r.value.start,r.value.end)} `),u("Commenting on a diff line",null)):l(r.reason)},Fv=[{intent:E.InitCommandLine,mode:I.DEFAULT,description:"[:] write command",action:()=>(T({mode:I.COMMAND_LINE}),J(""),u("Entering command line mode",null))},...Pv,...kv,...Bv,{intent:E.AddItem,mode:I.DEFAULT,description:"[n] new...",action:()=>(T({mode:I.COMMAND_LINE}),J(`${C.NEW} `),u("Adding new item",null))},{intent:E.Delete,mode:I.DEFAULT,description:"[d] delete",action:()=>(T({mode:I.COMMAND_LINE}),J(`${C.DELETE} `),u("Deleting item",null))},{intent:E.Confirm,mode:I.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!be(e?.id??"")?.length){let o=e?N.getAttachment(e.id):void 0;if(o)return Tv(o);if(vo())return Ov();if(e?.title===Ne.DESCRIPTION)return T({mode:I.COMMAND_LINE}),J(`${C.EDIT} description `),u("Propose command",!0);if(e?.title===Ne.ASSIGNEES)return T({mode:I.COMMAND_LINE}),J(`${C.ASSIGN} `),u("Propose command",!0);if(e?.title===Ne.TAGS)return T({mode:I.COMMAND_LINE}),J(`${C.TAG} `),u("Propose command",!0);if(t.title===Ne.DESCRIPTION&&e?.context==="TEXT")return T({mode:I.COMMAND_LINE}),J(`${C.EDIT} description `),u("Propose command",!0)}return $.enterChildNode(),u("Entering context",null)}},{intent:E.OpenInEditor,mode:I.DEFAULT,action:()=>{let{selectedNode:e,contextNode:t}=v(),n=t.parentNodeId,r=!!n&&t.id===Me(n,"diff")?e?.id:vo()??void 0;return r?ni({sha:r}):u("Nothing here opens in an editor",null)}},{intent:E.MarkDiffLine,mode:I.DEFAULT,action:()=>{let e=vo();if(!e)return u("Nothing to mark here",null);let{selectedIndex:t}=v(),n=tu(e);return zo(n===t?null:{sha:e,row:Math.max(0,t)}),u("Marked diff line",null)}},{intent:E.CommentOnDiffLine,mode:I.DEFAULT,action:()=>vo()?Ov():u("Nothing to comment on here",null)},{intent:E.Yank,mode:I.DEFAULT,description:"[y] yank",action:()=>{let{selectedNode:e}=v(),t=e?.title===Ne.DESCRIPTION?qe.DESCRIPTION:e?.title===Ne.TAGS?qe.TAGS:e?.title===Ne.ASSIGNEES?qe.ASSIGNEES:qe.REF,o=Be(C.YANK).includes(t)?t:qe.REF;return T({mode:I.COMMAND_LINE}),J(`${C.YANK} ${o}`),u("Propose command",!0)}},{intent:E.EditTitle,mode:I.DEFAULT,description:"[r] rename title",action:()=>(T({mode:I.COMMAND_LINE}),J(`${C.EDIT} title ${v().selectedNode?.title}`),u("Exiting context",null))},{intent:E.EditDescription,mode:I.DEFAULT,description:"[e] edit desc",action:()=>(T({mode:I.COMMAND_LINE}),J(`${C.EDIT} description `),u("Exiting context",null))},{intent:E.Exit,mode:I.DEFAULT,description:"[q] exit context",action:()=>($.enterParentNode(),u("Exiting context",null))},{intent:E.NavPreviousItem,mode:I.DEFAULT,description:"[arrows/hjkl] navigate (shift x5)",action:()=>($.navigateToPreviousItem(),u("Navigating to previous item",null))},{intent:E.NavNextItem,mode:I.DEFAULT,action:()=>($.navigateToNextItem(),u("Navigating to next item",null))},{intent:E.NavPreviousItemJump,mode:I.DEFAULT,action:()=>($.jumpToPreviousItem(),u("Jumping to previous item",null))},{intent:E.NavNextItemJump,mode:I.DEFAULT,action:()=>($.jumpToNextItem(),u("Jumping to next item",null))},{intent:E.NavToPreviousContainer,mode:I.DEFAULT,action:()=>($.navigateToPreviousContainer(),u("Navigating to previous container",null))},{intent:E.NavToNextContainer,mode:I.DEFAULT,action:()=>($.navigateToNextContainer(),u("Navigating to next container",null))}];var kA=500,DA=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),_v=e=>{let t=DA(e);t&&fa(n=>(n+t).slice(0,kA))};var BA=[I.COMMAND_LINE,I.PALETTE],OA=e=>e==="edit title "?v().selectedNode?.title??"":"",FA=e=>[{intent:E.MoveCursorLeft,mode:e,action:()=>(od(-1),u("Moving cursor left",null))},{intent:E.MoveCursorRight,mode:e,action:()=>(od(1),u("Moving cursor right",null))},{intent:E.MoveCursorLeftOfWord,mode:e,action:()=>(rd("left"),u("Moving cursor left of word",null))},{intent:E.MoveCursorRightOfWord,mode:e,action:()=>(rd("right"),u("Moving cursor right of word",null))},{intent:E.AutoCompleteCommand,mode:e,action:()=>(fa((t,{remainder:n})=>{let o=n?t+n:t;return o+OA(o)}),u("Auto-completing command",null))},{intent:E.CaptureInput,mode:e,action:(t,{sequence:n})=>(_v(n??""),u("Capturing input",null))},{intent:E.EraseInput,mode:e,action:()=>(wf(),u("Erasing input",null))},{intent:E.EraseInputWord,mode:e,action:()=>(Tf(),u("Erasing input word",null))}],jv=[{intent:E.Confirm,mode:I.COMMAND_LINE,action:()=>(zt(),u("Executing command",null))},{intent:E.ViewHelp,mode:I.DEFAULT,action:()=>(T({mode:I.HELP}),u("Viewing help",null))},...BA.flatMap(FA),{intent:E.ExitCommandLine,mode:I.COMMAND_LINE,action:()=>(kf(),T({mode:I.DEFAULT}),u("Exiting command line",null))},{intent:E.GetLastCommandFromHistory,mode:I.COMMAND_LINE,action:()=>(Df(),u("Getting last command from history",null))},{intent:E.GetNextCommandFromHistory,mode:I.COMMAND_LINE,action:()=>(Bf(),u("Getting next command from history",null))}];var bu=e=>{let t=/^\[(.+?)\]\s*(.+)$/.exec(e);return t?{keys:t[1]??"",label:t[2]??""}:null},$v=({keys:e})=>e.length===1?0:1,Uv=(e,t)=>{let n=new Set;for(let o of e)o.mode!==t||!o.description||n.add(o.description);return[...n].map(bu).filter(o=>o!==null).sort((o,r)=>$v(o)-$v(r))};function Hv(e,t,n){let o=t[e];if(!o)return l("buildBreadCrumb(): current node not found");let r=[],s=new Set,i=o;for(;i&&!s.has(i.id)&&(r.push(i),s.add(i.id),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let c=r[r.length-1];return!c||c.id!==n?l("buildBreadCrumb(): node is not connected to root"):(r.reverse(),u("Breadcrumb built",r))}var Wv=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t};var Tt,xu,Iu=new Set,Eu=()=>{for(let e of Iu)e()},jA=e=>(Iu.add(e),()=>Iu.delete(e));function Su(e){let{contextNodeId:t,mode:n,rootNodeId:o,nodes:r,filters:s}=e;if(!t)return l("derive(): contextNodeId is missing");if(!o)return l("derive(): rootNode is missing");if(!r[o])return l("derive(): unable to find root node");let c=r[t];if(!c)return l("Unable to derive state, contextNode not found");let d=Hv(t,r,o);if(a(d))return logger.error(d.message),d;let p=d.value,{context:m}=c,f=[...Fv,...Av[m]??[],...jv],g=Uv(f,n),h=Wv(f),x=$A(r,s),b=x[t]?.[e.selectedIndex]??null;return u("Derived successfully",{...e,contextNode:c,breadCrumb:p,availableHints:g,availableActions:f,actionIndex:h,selectedNode:b,renderedChildrenIndex:x})}var v=()=>{if(!Tt)throw new Error("State not initialized. Call initWorkspaceState() first.");return Tt},de=()=>Tt?u("Retrieved state",Tt):l("State not initialized. Call initWorkspaceState() first.");zp(e=>Tt?yn(Tt.emailLinks,e):[]);function $s(e){xu=e;let t=oe(process.cwd()),n=!1;if(!a(t)){let s=Mt(t.value);if(a(s))return l(s.message);n=!0}let o={readOnly:!1,filters:[],tags:{},contributors:{},emailLinks:{},mode:I.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:{}},r=Su(o);return a(r)?r:(Tt=r.value,Eu(),u("State initialized",null))}var Xo=!1,mi=null;function Oe(e){let t=v(),n=e(t);if(Xo)return n.nodes!==t.nodes&&(Eo=null),mi=n,Tt={...t,...n},u("State updated",null);let o=Su(n);return a(o)?l(o.message??"Unable to update state"):(Tt=o.value,Eu(),u("State updated",null))}function Aa(e){if(Xo)return u("Joined batch",e());Xo=!0,mi=null,Eo=new Set;let t=()=>{let n=mi;if(Xo=!1,mi=null,n===null)return null;let o=Su(n);return a(o)?l(o.message??"Unable to update state"):(Tt=o.value,Eu(),u("State updated",null))};try{let n=e(),o=t();return o&&a(o)?l(o.message):u("State updated",n)}finally{Xo&&t()}}var Dg=()=>Xo,T=e=>Oe(t=>({...t,...e}));function Jo(e,t,n){if(!Xo)return Oe(i=>({...i,[e]:{...i[e]??{},[t]:n}}));let o=v(),r=o[e]??{};if(e==="nodes"){let i=r[t],c=n;i?.parentNodeId&&Eo?.add(i.parentNodeId),c.parentNodeId&&Eo?.add(c.parentNodeId)}r[t]=n;let s={...o,[e]:r};return mi=s,Tt={...o,...s},u("State updated",null)}var ne=()=>_A(jA,v,v),Eo=null,Gv=null,$A=(e,t)=>{let n=Tt?.renderedChildrenIndex,o=n!==void 0&&Eo!==null&&e===Gv&&t.length===0&&Tt?.filters.length===0,r;if(o){r={...n};let s=Mg(e,Eo);for(let i of Eo){let c=s[i];c?r[i]=c:delete r[i]}}else r=Tg(e,t);return Gv=e,Eo=new Set,r},le=e=>v()?.renderedChildrenIndex[e]??[],un=()=>xu?$s(xu):l("Cannot reset state: no initial workspace found"),Rt=()=>Tt!==void 0;var wt=(e,t)=>{let{nodes:n}=v(),o=n[e];if(!o)return l("Node not found");if(o.context===t)return u("Resolved ancestor node",o);let r=new Set([o.id]),s=o.parentNodeId?n[o.parentNodeId]:void 0;for(;s&&!r.has(s.id);){if(s.context===t)return u("Resolved ancestor node",s);r.add(s.id),s=s.parentNodeId?n[s.parentNodeId]:void 0}return l(`No ancestor found for context: ${t}`)},Ru=(e,t)=>{let{nodes:n}=v(),o=new Set,r=n[e];for(;r?.parentNodeId&&!o.has(r.id);){if(r.parentNodeId===t)return!0;o.add(r.id),r=n[r.parentNodeId]}return!1},So=(e,t)=>e?e.readonly?l({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:l("Node not found"),N={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return l("Contributor not found");if(n.userId&&n.userId!==t)return l("Contributor is already linked to another user");let o={...n,userId:t},r=Oe(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?l("Unable to link contributor to user"):u("Linked contributor to user",o)},deleteNode(e){N.deleteNodes([e])},deleteNodes(e){e.length!==0&&Oe(t=>{let n={...t.nodes};for(let o of e)delete n[o];return{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return l("Unable to create comment, missing issue");if(!_(t))return l("Can only comment on issues");let n=Jo("comments",e.id,{...e,deleted:!1});return a(n)?l("Unable to create comment"):u("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return l("Unable to edit comment, missing comment");let o=this.getNode(n.issue);if(!o)return l("Unable to edit comment, missing issue");if(!_(o))return l("Can only edit issue comments");let r={...n,md:t,deleted:!1},s=Jo("comments",e,r);return a(s)?l("Unable to edit comment"):u("Edited comment",r)},deleteComment(e){let t=this.getComment(e);if(!t)return l("Unable to delete comment, missing comment");let n={...t,deleted:!0},o=Jo("comments",e,n);return a(o)?l("Unable to delete comment"):u("Deleted comment",n)},getComment(e){return v().comments?.[e]},getCommentsByIssue(e){return Object.values(v().comments??{}).filter(t=>t.issue===e&&!t.deleted)},getCommentsGroupedByIssue(){let e=new Map;for(let t of Object.values(v().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 l("Unable to create attachment, missing issue");if(!_(t))return l("Can only attach to issues");let n=Oe(o=>({...o,attachments:{...o.attachments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?l("Unable to create attachment"):u("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return l("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},o=Oe(r=>({...r,attachments:{...r.attachments??{},[e]:n}}));return a(o)?l("Unable to delete attachment"):u("Deleted attachment",n)},getAttachment(e){return v().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(v().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},getAttachmentsGroupedByIssue(){let e=new Map;for(let t of Object.values(v().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}=v(),o=n[e];if(!o)return l("Edit target node not found");let r=So(o,"edit");if(r)return r;let s={...o,props:{...o.props,description:t}};return this.updateNode(s),u("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return l("Rename target node not found");let o=So(n,"rename");if(o)return o;let r={...n,title:t};return this.updateNode(r),u("Renamed node",r)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return be(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:o}=v(),r=this.getNode(e),s=this.getNode(t);if(!r)return l("Node not found");if(!s)return l("Target parent not found");if(o===e)return l("Cannot move root node");if(e===t)return l("Cannot move node into itself");let i=So(r,"move");if(i)return i;if(Ru(t,e))return l("Cannot move node into its own descendant");let c={...r,parentNodeId:t,rank:n};return this.updateNode(c),u("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:o}=v(),r=this.getNode(e);if(!r)return l("Node not found");if(o===e)return l("Cannot delete root node");let s=So(r,"delete");if(s)return s;let i=new Set,c=p=>{let m=t[p];if(!(!m||i.has(p))){i.add(p);for(let f of be(m.id))c(f.id)}};c(e);let d={...structuredClone(t)};for(let p of i){if(!d[p])return l("Unable to locate node to delete");d[p]={...d[p],isDeleted:!0}}return n?(T({nodes:d}),u("Successfully tomb stoned",r)):l("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return l("Contributor not found");let n={...t,name:xr,tombstoned:!0},o=Oe(r=>({...r,contributors:{...r.contributors,[e]:n}}));return a(o)?l("Unable to remove contributor"):u("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return l("Contributor not found");if(n.tombstoned)return l("Cannot rename a removed contributor");let o={...n,name:t},r=Oe(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?l("Unable to rename contributor"):u("Renamed contributor",o)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return l("Contributor not found");let o={...n,name:t,tombstoned:!1},r=Oe(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?l("Unable to restore contributor"):u("Restored contributor",o)},linkContributorEmail({email:e,contributor:t,authorId:n}){if(!this.getContributor(t))return l("Unable to link email, missing contributor");let o={email:Ze(e),contributor:t,authorId:n},r=Is(o.email,t),s=v().emailLinks[r];if(s&&!s.tombstoned)return u("Email already linked",s);let i=Oe(c=>({...c,emailLinks:{...c.emailLinks,[r]:o}}));return a(i)?l("Unable to link email"):u("Linked email to contributor",o)},unlinkContributorEmail(e,t,n){let o=Is(e,t),r=v().emailLinks[o];if(!r)return l("Unable to unlink, no such link");if(r.tombstoned)return u("Email already unlinked",r);if(!na(n,r))return l("Only the author of a link or the contributor it names may remove it");let s={...r,tombstoned:!0},i=Oe(c=>({...c,emailLinks:{...c.emailLinks,[o]:s}}));return a(i)?l("Unable to unlink email"):u("Unlinked email from contributor",s)},getEmailLinks(){return v().emailLinks},createContributor(e){let t=Oe(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?l("Unable to create contributor"):u("Created contributor",e)},assign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return l("Unable to assign contributor, missing contributor");if(!o)return l("Unable to assign contributor, missing target");let r=So(o,"edit");if(r)return r;if(!_(o))return l("Target is not an issue");let s=o.props.assignees??[];if(s.includes(t))return l("Contributor already assigned");let i={...o,props:{...o.props,assignees:[...s,t]}};return this.updateNode(i),u("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return l("Unable to unassign, missing contributor");if(!o)return l("Unable to unassign, missing target");let r=So(o,"edit");if(r)return r;if(!_(o))return l("Target is not an issue");let s=o.props.assignees??[];if(!s.includes(t))return u("Issue is not assigned to that contributor",{assignee:t});let i={...o,props:{...o.props,assignees:s.filter(c=>c!==t)}};return this.updateNode(i),u("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return l("Unable to add tag, missing tag");if(!o)return l("Unable to add tag, missing target");let r=So(o,"edit");if(r)return r;if(!_(o))return l("Target is not an issue");let s=o.props.tags??[];if(s.includes(t))return l("Tag already assigned");let i={...o,props:{...o.props,tags:[...s,t]}};return this.updateNode(i),u("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),o=this.getNode(e);if(!n)return l("Unable to remove tag, missing tag");if(!o)return l("Unable to remove tag, missing target");let r=So(o,"edit");if(r)return r;if(!_(o))return l("Target is not an issue");let s=o.props.tags??[];if(!s.includes(t))return u("Issue is not tagged with that tag",{tag:t});let i={...o,props:{...o.props,tags:s.filter(c=>c!==t)}};return this.updateNode(i),u("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return l("Tag not found");let n={...t,tombstoned:!0},o=Oe(r=>({...r,tags:{...r.tags,[e]:n}}));return a(o)?l("Unable to delete tag"):u("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return l("Tag not found");let o={...n,name:t,tombstoned:!1},r=Oe(s=>({...s,tags:{...s.tags,[e]:o}}));return a(r)?l("Unable to restore tag"):u("Restored tag",o)},createTag(e){let t=Oe(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?l("Could not create tag"):u("Tag created",e)},createNode(e){let t=Jo("nodes",e.id,e);return a(t)?l("Unable to create node"):u("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return l("Failed to locate node");let n={...t,readonly:!0},o=Jo("nodes",e,n);return a(o)?l(o.message):u("Locked node",n)},updateNode(e){let t=Jo("nodes",e.id,e);return a(t)?t:u("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){let t=v().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return v().tags[e]},getTags(){return Object.values(v().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return v().nodes[e]},getSiblings(e){return be(e)}};var UA=(e,t)=>e+" ".repeat(Math.max(0,t-Vv(e))),HA=(e,t)=>" ".repeat(Math.max(0,t-Vv(e)))+e,Cl=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","link.contributor.email":"Claimed","unlink.contributor.email":"Unclaimed","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),WA=(e,t)=>t?e<t?"up":e>t?"down":null:null,GA=(e,t)=>{let n=N.getNode(e.payload.parent),o=n?Ro.dim.bgBlack(` ${n.title} `):"unknown",r=t.at(-1);if(r&&"parent"in r&&"rank"in r&&r.parent===e.payload.parent){let s=WA(e.payload.rank,r.rank);if(s)return`Moved ${s} in ${o}`}return`Moved issue to ${o}`},zv=e=>`${Math.max(1,Math.round(e/1024))} KB`,Kv=e=>N.getAttachment(e)?.name??"",VA=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?Ro.bgHex(ze(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?Ro.bgHex(ze(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=v().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?Ro.hex(ze(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?Ro.hex(ze(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"link.contributor.email":case"unlink.contributor.email":return e.payload.email;case"add.issue.attachment":return`"${e.payload.name}" ${Ro.dim(`(${zv(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Kv(e.payload.id);return t?`"${t}"`:""}default:return""}},zA=e=>{let t=go(De(e));return Ro.gray(HA(t,8))},KA=12,qA=e=>UA(`${e}`,KA),YA=e=>{let t=de();return a(t)?e:ta(e,t.value.contributors[e]?.name)},XA=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=v().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"link.contributor.email":case"unlink.contributor.email":return e.payload.email;case"move.node":{let t=N.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${zv(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Kv(e.payload.id);return t?`"${t}"`:""}default:return""}},vl=e=>[Cl(e.action),XA(e)].filter(Boolean).join(" "),qv=(e,t)=>{let n=zA(e.id),o=qA(YA(e.userId)),r=Ro.dim("\u203A"),s=e.action==="move.node"?GA(e,t):[Cl(e.action),VA(e)].filter(Boolean).join(" ");return`${o} ${n} ${r} ${s}`};var JA=e=>Me(e,"comments"),QA=e=>Me(e,"description"),ZA=e=>Me(e,"assignees"),ew=e=>Me(e,"tags"),tw=e=>Me(e,"history"),nw=e=>Me(e,"diff"),ow=e=>Me(e,"attachments"),pi=({id:e,name:t,parentNodeId:n,rank:o,value:r,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let c=N.getNode(e);if(!c){let m=N.createNode({...Re.field({id:e,name:t,parentNodeId:n,rank:o,props:{value:r},isVirtual:!0}),readonly:s,childRenderAxis:i});return a(m)?m:u("Virtual field created",void 0)}if(!at(c))return l(`Existing virtual node ${e} is not a field`);if(!(c.title!==t||c.parentNodeId!==n||c.rank!==o||c.props.value!==r||c.readonly!==s||c.childRenderAxis!==i))return u("Virtual field unchanged",void 0);let p=N.updateNode({...c,title:t,parentNodeId:n,rank:o,props:{...c.props,value:r},readonly:s,childRenderAxis:i});return a(p)?p:u("Virtual field updated",void 0)},Yv=({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!1,childRenderAxis:s="horizontal"})=>{let i=N.getNode(e);if(!i){let p=N.createNode({...Re.fieldList({id:e,name:t,parentNodeId:n,rank:o,isVirtual:!0}),readonly:r,childRenderAxis:s});return a(p)?p:u("Virtual field list created",void 0)}if(!Ss(i))return l(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==o||i.readonly!==r||i.childRenderAxis!==s))return u("Virtual field list unchanged",void 0);let d=N.updateNode({...i,title:t,parentNodeId:n,rank:o,readonly:r,childRenderAxis:s});return a(d)?d:u("Virtual field list updated",void 0)},Nl=null,rw=()=>{if(Nl)return u("Virtual field ranks",Nl);let e=Bt(tn/4n),t=Bt(tn/2n),n=Bt(tn*3n/4n),o=Bt(tn*7n/8n),r=Bt(tn*15n/16n),s=Bt(tn*13n/16n),i=Bt(tn*27n/32n);return a(e)?e:a(t)?t:a(n)?n:a(o)?o:a(r)?r:a(s)?s:a(i)?i:(Nl={description:e.value,assignees:t.value,tags:n.value,comments:o.value,attachments:r.value,log:s.value,diff:i.value},u("Virtual field ranks",Nl))},Eg=e=>{let t=rw();if(a(t))return t;let n=t.value,o=pi({id:QA(e.id),name:Ne.DESCRIPTION,parentNodeId:e.id,rank:n.description,value:e.props.description??"",childRenderAxis:"vertical"});if(a(o))return o;let r=Yv({id:ZA(e.id),name:Ne.ASSIGNEES,parentNodeId:e.id,rank:n.assignees,readonly:!0});if(a(r))return r;let s=Yv({id:ew(e.id),name:Ne.TAGS,parentNodeId:e.id,rank:n.tags,readonly:!0});if(a(s))return s;let i=pi({id:JA(e.id),name:Ne.COMMENTS,parentNodeId:e.id,rank:n.comments,value:"",readonly:!1,childRenderAxis:"vertical"});if(a(i))return i;let c=pi({id:ow(e.id),name:Ne.ATTACHMENTS,parentNodeId:e.id,rank:n.attachments,value:"",readonly:!0,childRenderAxis:"vertical"});if(a(c))return c;let d=pi({id:tw(e.id),name:Ne.HISTORY,parentNodeId:e.id,rank:n.log,value:sw(e),readonly:!0,childRenderAxis:"vertical"});if(a(d))return d;let p=pi({id:nw(e.id),name:Ne.DIFF,parentNodeId:e.id,rank:n.diff,value:"",readonly:!0,childRenderAxis:"vertical"});return a(p)?p:u("Ticket virtual nodes materialized",void 0)},sw=e=>{let t=[...e.log].reverse(),n=new Map;for(let o of t){let r=n.get(o.action)??[];r.push(o.payload),n.set(o.action,r)}return t.map(o=>qv(o,n.get(o.action)??[])).join(`
|
|
99
|
+
`)},Xv=!0,Jv=e=>{Xv=e},Ed=()=>Xv;import VT from"node:http";import sr from"node:path";import{fileURLToPath as zT}from"node:url";var iw=e=>{switch(e.action){case"add.issue":case"move.node":case"close.issue":case"reopen.issue":return e.payload.parent;default:return null}},Cu=(e,t)=>{let n=[];for(let o of e){let r=iw(o);if(r===null||r===n.at(-1)?.laneId)continue;let s=to(o);n.push({laneId:r,enteredAt:s===null?t:xs(s)})}return n},Al=(e,t)=>Cu(e,t).at(-1)?.enteredAt??t;var aw=e=>e.payload??{},Nu=e=>{let t=new Map,n={},o=new Set,r=new Set,s=new Set;for(let i of e){let{id:c,name:d}=aw(i);if(c)switch(i.action){case"create.contributor":case"create.tag":t.set(c,d??""),o.add(c),r.delete(c);break;case"rename.contributor":d!==void 0&&o.has(c)&&!r.has(c)&&t.set(c,d);break;case"tombstone.contributor":o.has(c)&&(t.set(c,xr),r.add(c));break;case"restore.contributor":case"restore.tag":d!==void 0&&o.has(c)&&(t.set(c,d),r.delete(c));break;case"add.board":d!==void 0&&(t.set(c,d),s.add(c));break;case"add.swimlane":d!==void 0&&(t.set(c,d),s.add(c),n[c]=d);break;case"edit.title":d!==void 0&&s.has(c)&&(t.set(c,d),c in n&&(n[c]=d));break;default:break}}return{byId:t,lanes:n}};var lw=e=>{let t=new Map,n=new Map;for(let o of e){let r=o.payload;!r?.id||!r.parent||(o.action==="move.node"&&t.set(o.id,n.get(r.id)),n.set(r.id,r.parent))}return t},Zv=e=>{let t=e.payload;return e.action==="tombstone.tag"||e.action==="restore.tag"?t?.id:t?.tag},cw=e=>{let t=new Set,n=new Map;for(let o of e){let r=o.payload,s=r?.id;s&&(o.action==="add.issue"&&t.add(s),r.parent&&n.set(s,r.parent))}return{issueIds:t,parentById:n}},dw=(e,{issueIds:t,parentById:n})=>{let o=e.payload;if(o?.issue)return o.issue;let r=new Set,s=o?.id;for(;s!==void 0&&!r.has(s);){if(t.has(s))return s;r.add(s),s=n.get(s)}return null},uw=new Set(["add.issue.comment","edit.issue.comment","delete.issue.comment"]),mw=e=>uw.has(e.action)?e.payload?.id??null:null,pw=new Set(["add.issue","move.node","close.issue","reopen.issue"]),fw=(e,t)=>{let n=new Map;return e.map((o,r)=>{let s=t[r]??null;if(s===null)return{lane:null,laneBefore:null};let i=o.payload,c=null;if(pw.has(o.action)&&i?.id===s&&i.parent){let d=n.get(s);d!==void 0&&d!==i.parent&&(c=d),n.set(s,i.parent)}return{lane:n.get(s)??null,laneBefore:c}})},Qv=90,gw=e=>{let t=e.trim().split(`
|
|
100
|
+
`)[0]?.trim()??"";return t.length>Qv?`${t.slice(0,Qv).trimEnd()}\u2026`:t},hw=(e,t,n)=>{let o=e.payload,r=Zv(e),s=e.action?Cl(e.action):"";if(o?.md!==void 0){let c=gw(o.md);return c?`${s}: ${c}`:s}if(e.action==="move.node"&&o?.parent){let c=t.get(o.parent);return c?n.get(e.id)===o.parent?`Moved within ${c}`:`Moved to ${c}`:s}let i=r!==void 0?t.get(r)??"":o?.assignee!==void 0?t.get(o.assignee)??"":o?.email!==void 0?o.email:o?.name!==void 0?`"${o.name}"`:"";return[s,i].filter(Boolean).join(" ")},Au=(e,t)=>e?Ke(e,t.get(e)):null,yw=(e,t)=>{let n=e.payload;return{actor:Au(e.userId,t),tag:Au(Zv(e),t),assignee:Au(n?.assignee,t)}},eb=e=>{let t=new Map,n=new Set,o=r=>{let s=new Set,i=r;for(;i&&!s.has(i);){if(n.has(i))return i;s.add(i),i=t.get(i)}return null};return e.map(r=>{let s=r.payload,i=s?.id;if(!i)return null;r.action==="add.board"&&n.add(i);let c=r.action==="close.issue"?o(i):null,d=s.parent??s.issue;return d&&t.set(i,d),c!==null?c:n.has(i)?i:o(i)})},tb=e=>vw.has(e),vw=new Set(["create.contributor","rename.contributor","tombstone.contributor","restore.contributor","link.contributor.user","link.contributor.email","unlink.contributor.email"]),nb=(e,t)=>{let n=eb(e);return e.filter((o,r)=>n[r]===t)},bw=(e,t=new Map)=>{let n=new Map([...t,...Nu(e).byId]),o=lw(e),r=cw(e),s=e.map(m=>dw(m,r)),i=fw(e,s),c=eb(e),d=vr(e.map(m=>to(m)));return e.flatMap((m,f)=>{let g=d[f]??null;return g===null?[]:[{id:m.id,t:g,action:m.action,label:hw(m,n,o),issue:s[f]??null,target:mw(m),...i[f],board:c[f]??null,...yw(m,n)}]}).sort((m,f)=>m.t-f.t)},xw=e=>{let t=new Map;for(let o of e){if(o.issue===null||o.lane===null)continue;let r=t.get(o.issue)??[],s=r[r.length-1];(s===void 0||s.lane!==o.lane)&&(r.push({t:o.t,lane:o.lane,board:o.board}),t.set(o.issue,r))}let n=new Map;for(let[o,r]of t){let s=r[r.length-1];n.set(o,{changes:r,from:r[0].t,closedFrom:s.lane===he?s.t:null})}return n},Iw=(e,t)=>{let n=0,o=e.length;for(;n<o;){let r=n+o>>1;e[r].t<t?n=r+1:o=r}return e[n-1]},ob=(e,t,n)=>{let o={};for(let[r,s]of e){if(s.from>=t||s.closedFrom!==null&&s.closedFrom<t)continue;let i=Iw(s.changes,t);i===void 0||i.lane===he||n&&i.board!==n||(o[r]=i.lane)}return o},Ew=e=>Nu(e).lanes,fi=null,rb=e=>{let t=et(e);if(fi&&fi.root===e&&fi.signature===t)return u("Timeline entries, cached",fi.index);let n=uo(e);if(a(n))return l(n.message);let o=bw(n.value,co(e)),r={entries:o,lanes:xw(o),laneNames:Ew(n.value)};return fi={root:e,signature:t,index:r},u("Timeline entries, built",r)};var sb=1e5,Sw=2e4,wl=null,ib=Promise.resolve(),Pn=e=>{let t=ib.then(e,e);return ib=t.then(()=>{},()=>{}),t},Tl=e=>{let t=ln(e);return a(t)?t:me({repoRoot:t.value})},Je=()=>{if(!Rt())return{mode:"live",asOfTime:null};let{timeMode:e}=v();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:wl}},ab=(e,t)=>{let n=0,o=e.length;for(;n<o;){let r=n+o>>1;e[r].t<t?n=r+1:o=r}return n},lb=async(e={})=>{let t=Tl(e.repoRoot);if(a(t))return l(t.message);let n=rb(t.value);if(a(n))return l(n.message);let o=n.value.entries,r=Date.now(),s=e.end??r,i=e.start??o[0]?.t??s;if(s<=i)return u("Empty time window",{bucketMs:0,buckets:[],capped:!1,events:[],lanesAtStart:{},laneNames:n.value.laneNames,closedLane:he,earliest:i,latest:s});let c=ab(o,i),d=ab(o,s),p=o.slice(c,d).filter(b=>!e.boardId||b.board===e.boardId||tb(b.action)),m=p.map(b=>b.t),f=Math.max(1,Math.ceil((s-i)/sb)),g=new Map;for(let b of m){let R=Math.min(sb-1,Math.floor((b-i)/f)),S=i+R*f;g.set(S,(g.get(S)??0)+1)}let h=[...g.entries()].sort(([b],[R])=>b-R).map(([b,R])=>({t:b,count:R})),x=p.length>Sw;return u("Computed event timeline",{bucketMs:f,buckets:h,capped:x,events:x?[]:p,lanesAtStart:ob(n.value.lanes,i,e.boardId),laneNames:n.value.laneNames,closedLane:he,earliest:i,latest:s})},cb=e=>{let t=uo(e);if(a(t))return l(t.message);let n=un();if(a(n))return l(n.message);wl=null;let o=on(t.value),{fatal:r,skipped:s}=Sn(o);return r.length>0?l(r.map(i=>i.message).join(", ")):(Rn(s),T({readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),u("Restored live state",!0))},Rw=(e,t)=>{wl=null;let n=cb(e);return a(n)?l(`${t} (recovery to live also failed: ${n.message})`):l(t)},wu=e=>Pn(async()=>{let t=Tl(e.repoRoot);if(a(t))return l(t.message);let n=wa(t.value,e.targetTime);if(a(n))return l(n.message);let{appliedEvents:o,unappliedEvents:r}=n.value,s=un();if(a(s))return s;let i=on(o),{fatal:c,skipped:d}=Sn(i);return c.length>0?Rw(t.value,c.map(p=>p.message).join(", ")):(Rn(d),T({readOnly:!0,timeMode:"peek",unappliedEvents:r,replay:null}),wl=e.targetTime,u("Checked out historical state",{asOfTime:e.targetTime}))}),db=async e=>{let t=Tl(e.repoRoot);if(a(t))return l(t.message);let n=Ta(t.value);if(a(n))return l(n.message);let o=n.value.get(e.eventId)??null;return o===null?l("Event not found in the log"):wu({repoRoot:e.repoRoot,targetTime:o+1})},ub=(e={})=>Pn(async()=>{let t=Tl(e.repoRoot);if(a(t))return l(t.message);let n=cb(t.value);return a(n)?l(n.message):u("Returned to live state",!0)});import Nw from"node:fs";var mb=new Map,Cw=3e4,pb=async e=>{let t=mb.get(e);if(t&&Date.now()-t.readAt<Cw)return{name:t.name,email:t.email};let n=await Le({args:["config","--get-regexp","^user\\.(name|email)$"],cwd:e}),o=null,r=null;if(n.exitCode===0)for(let s of(n.stdout??"").split(`
|
|
101
|
+
`)){let i=s.indexOf(" ");if(i===-1)continue;let c=s.slice(0,i),d=s.slice(i+1);c==="user.name"&&(o=d.trim()||null),c==="user.email"&&(r=Ze(d)||null)}return mb.set(e,{name:o,email:r,readAt:Date.now()}),{name:o,email:r}},Ml=async e=>(await pb(e)).email,Co=async e=>(await pb(e)).name;var Qo=e=>{let t=oe(e??process.cwd());return a(t)?l(t.message):u("Resolved Epiq repo root",t.value)},Pl=null,Aw=async(e,t)=>{let n=Qo(e);if(a(n))return n;let o=me({repoRoot:n.value});if(a(o))return l(o.message);let r=ke(n.value);if(a(r))return l(r.message);if(!(Pl!==null&&Pl.repoRoot===n.value&&Pl.stateBranchRoot===o.value&&Nw.existsSync(Po(o.value)))){let f=await Vs({repoRoot:n.value,stateBranchName:r.value});if(a(f))return l(f.message);let g=await mo({repoRoot:n.value,stateBranchRoot:o.value,stateBranchName:r.value});if(a(g))return l(g.message);Pl={repoRoot:n.value,stateBranchRoot:o.value}}if(t?.pull??!1){let f=await U({cwd:o.value,args:["pull","--ff-only"]});a(f)&&ee.info(3,f.message)}let i={repoRoot:n.value,stateBranchRoot:o.value},c=ht();a(c)||je(c.value),je({gitEmail:await Ml(n.value),gitName:await Co(n.value)});let d=et(o.value);if(ha(o.value)===d&&Rt()&&Je().mode==="live")return u("Booted Epiq state, unchanged",i);let p=rn(o.value);if(a(p))return l(p.message);let m=sn(p.value.events,p.value.unreadable);return a(m)?l(m.message):(wr(o.value,d),u("Booted Epiq state",i))},Kt=()=>{let e=ht();return a(e)?l(e.message):e.value.userId?e.value.userName?u("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):l("Unable to retrieve user name"):l("Unable to retrieve user id")},pt=()=>{let e=de();return a(e)?l(e.message):e},Ft=e=>Aw(e,{pull:!1}),ue=async e=>{let t=await Ft(e);if(a(t))return t;let n=Kt();if(a(n))return n;let o=pt();return a(o)?o:u("Booted",{boot:t.value,actor:n.value,state:o.value})};var ww=e=>{let t=N.getNode(e);if(!t)return[];let n=new Set;t.parentNodeId&&n.add(t.parentNodeId);for(let o of t.log??[]){let r=o.payload;r.id===e&&r.parent&&n.add(r.parent)}return[...n]},Ll=e=>{let t=new Set;e.parentNodeId&&t.add(e.parentNodeId);for(let o of e.log??[]){let r=o.payload;r.id===e.id&&r.parent&&t.add(r.parent)}let n=new Set;for(let o of t)for(let r of ww(o))n.add(r);return[...n]},Yr=e=>bn(e).map(t=>Ke(t.id,t.name));var Xr=e=>xn(e).map(({id:t,name:n})=>Ke(t,n));import Tw from"node:fs";import Mw from"node:path";import{ulid as Mu}from"ulid";var tt=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Issue not found"):_(n)?n.readonly?l("Issue is readonly"):u("Found issue",n):l("Target must be an issue")},No=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Swimlane not found"):vn(n)?n.readonly?l("Swimlane is readonly"):u("Found swimlane",n):l("Target must be a swimlane")},Tu=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return!n||n.isDeleted?l("Board not found"):ro(n)?n.readonly?l("Board is readonly"):u("Found board",n):l("Target must be a board")};var Pw=e=>{if(e.filePath)try{return u("Read attachment file",{data:Tw.readFileSync(e.filePath),name:e.name??Mw.basename(e.filePath)})}catch(t){return l(`Unable to read ${e.filePath}: ${t instanceof Error?t.message:String(t)}`)}return e.dataBase64?u("Decoded attachment data",{data:Buffer.from(e.dataBase64,"base64"),name:e.name??"image"}):l("Provide either filePath or dataBase64")},kl=()=>{let e=ht();return a(e)?In:e.value.attachmentMaxKb??In},Pu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let o=Pw(e);if(a(o))return o;let r=mf(t.value.boot.stateBranchRoot,o.value.data,kl());if(a(r))return r;let s=Ee(o.value.name).trim()||"image",i=Mu(),c={id:Mu(),...D(t.value.actor),action:"add.issue.attachment",payload:{id:i,issue:e.issueId,author:t.value.actor.userId,hash:r.value.hash,ext:r.value.ext,name:s,bytes:r.value.bytes}},d=B([c],t.value.boot.stateBranchRoot);if(a(d))return l(d.message);let p=Oo(r.value.hash,r.value.ext);return u("Added issue attachment",{id:i,issueId:e.issueId,fileName:p,bytes:r.value.bytes,markdown:Qc(s,p)})},Lu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(c=>c.action==="add.issue.attachment"&&c.payload.id===e.attachmentId);if(!n)return l("Unable to resolve attachment");if(n.payload.author!==t.value.actor.userId)return l("You can only delete your own attachments");let o=tt(n.payload.issue);if(a(o))return o;if(t.value.state.eventLog.some(c=>c.action==="delete.issue.attachment"&&c.payload.id===e.attachmentId))return u("Attachment already deleted",{id:e.attachmentId,issueId:n.payload.issue});let s={id:Mu(),...D(t.value.actor),action:"delete.issue.attachment",payload:{id:e.attachmentId,issue:n.payload.issue}},i=B([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Deleted issue attachment",{id:e.attachmentId,issueId:n.payload.issue})},ku=async e=>{let t=await Ft(e.repoRoot);return a(t)?t:pf(t.value.stateBranchRoot,e.fileName,kl())};var Lw=365*24*60*60*1e3,Du=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return u("Issue description",n&&_(n)&&!n.isDeleted?n.props.description??"":"")},Zo=()=>{let e=pt();if(a(e))return e;let t=Je(),n=t.mode!=="live",o=Object.values(e.value.nodes),r=o.filter(b=>ro(b)&&!b.isDeleted),s=Date.now()-Lw,i=new Map,c=new Map;for(let b of o)if(!b.isDeleted){if(vn(b)&&b.parentNodeId){let R=i.get(b.parentNodeId)??[];R.push(b),i.set(b.parentNodeId,R)}if(_(b)&&b.parentNodeId){if(b.parentNodeId===he&&De(b.id)<s)continue;let R=c.get(b.parentNodeId)??[];R.push(b),c.set(b.parentNodeId,R)}}let d=new Set;for(let b of c.values())for(let R of b)d.add(R.id);let p=ht();if(a(p))return p;let m={},f=N.getCommentsGroupedByIssue();for(let b of o.filter(_))b.isDeleted||!d.has(b.id)||(m[b.id]=(f.get(b.id)??[]).map(R=>{let S=N.getContributor(R.authorId);return{id:R.id,issueId:R.issue,body:R.md,author:Ke(R.authorId,S?.name),createdAt:De(R.id)}}));let g=new Map;for(let b of e.value.eventLog)b.action==="add.issue.attachment"&&g.set(b.payload.id,b.payload.author);let h={},x=N.getAttachmentsGroupedByIssue();for(let b of o.filter(_))b.isDeleted||!d.has(b.id)||(h[b.id]=(x.get(b.id)??[]).map(R=>({id:R.id,issueId:R.issue,name:R.name,fileName:Oo(R.hash,R.ext),bytes:R.bytes,createdAt:De(R.id),canDelete:g.get(R.id)===p.value.userId})));return u("Retrieved Epiq GUI state",{boards:r.sort((b,R)=>b.rank.localeCompare(R.rank)).map(b=>({id:b.id,ref:H(b.id),title:b.title,readonly:!!b.readonly||n,swimlanes:(i.get(b.id)??[]).sort((R,S)=>R.rank.localeCompare(S.rank)).map(R=>({id:R.id,title:R.title,readonly:!!R.readonly||n,issues:(c.get(R.id)??[]).sort((S,A)=>S.rank.localeCompare(A.rank)).map(S=>({id:S.id,ref:H(S.id),title:Ee(S.title),description:S.props.description??"",createdAt:De(S.id),enteredLaneAt:Al(S.log??[],De(S.id)),readonly:!!S.readonly||n,tags:Yr(S),assignees:Xr(S),parentNodeId:S.parentNodeId,isClosed:S.parentNodeId===he,boardIds:Ll(S)})),parentNodeId:R.parentNodeId}))})),tags:N.getTags().map(b=>({...b,...Ke(b.id,b.name)})),contributors:Object.values(e.value.contributors).map(b=>({...b,...Ke(b.id,b.name)})),user:{id:p.value.userId??"",name:p.value.userName??"",color:ze(p.value.userName??"")},commentsByIssueId:m,attachmentsByIssueId:h,attachmentMaxKb:kl(),timeTravel:t})},fb=null,kw=e=>{if(e===fb)return;let t=sa({root:e});if(a(t)){ee.info(t.message);return}fb=e},qt=async(e={})=>{if(Je().mode!=="live")return Zo();let t=await Ft(e.repoRoot);return a(t)?t:(kw(t.value.repoRoot),Zo())},gi=async(e={})=>{Mr();let t=Qo(e.repoRoot);if(a(t))return l("Sync failed");let n=Kt();if(a(n))return n;let o=await Ha({cwd:t.value,ownEventFileName:ao(n.value)});return a(o)?(Cd(o.message),o):(Ho(),u("Synced",o.value))};import{ulid as Yt}from"ulid";var hi=e=>{let t=[...new Set([...e.issueIds??[],...e.issueId?[e.issueId]:[]])];return t.length?u("Resolved targets",t):l("Provide issueId or issueIds")},Jr=(e,t)=>{let n=t.done.length,o=`${e} ${n} issue${n===1?"":"s"}`+(t.failed.length?`, ${t.failed.length} failed`:"");return n?u(o,t):l(`${o}: ${t.failed.map(r=>`${r.ref} ${r.reason}`).join("; ")}`)},yi=(e,t)=>{let n={done:[],failed:[]};for(let o of e){let r=t(o);a(r)?n.failed.push({id:o,ref:H(o),reason:r.message}):n.done.push({id:o,ref:H(o)})}return n};var yb=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase();async function Fu(e){let t=await Ft(e.repoRoot);if(a(t))return t;let n=pt();if(a(n))return n;let o=n.value.nodes,r=e.query?.trim().toLowerCase(),s=Object.values(o).filter(_).filter(c=>!c.isDeleted).filter(c=>e.includeClosed||c.parentNodeId!==he).filter(c=>e.boardId?(c.parentNodeId?o[c.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).filter(c=>!e.swimlaneId||c.parentNodeId===e.swimlaneId).filter(c=>!e.tag||Yr(c).some(d=>yb(d.name,e.tag))).filter(c=>!e.assignee||Xr(c).some(d=>yb(d.name,e.assignee))).filter(c=>!r||c.title.toLowerCase().includes(r)||(c.props.description??"").toLowerCase().includes(r)),i=c=>Ee((c.parentNodeId?o[c.parentNodeId]?.title:void 0)??"");return e.brief?u("Listed issues",s.map(c=>({id:c.id,ref:H(c.id),title:Ee(c.title),swimlane:i(c),tags:Yr(c).map(d=>d.name),assignees:Xr(c).map(d=>d.name)}))):u("Listed issues",s.map(c=>({id:c.id,ref:H(c.id),title:Ee(c.title),description:c.props.description??"",createdAt:De(c.id),enteredLaneAt:Al(c.log??[],De(c.id)),parentNodeId:c.parentNodeId,isClosed:c.parentNodeId===he,boardIds:Ll(c),readonly:!!c.readonly,tags:Yr(c),assignees:Xr(c)})))}var _u=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Ee(e.title);if(!n)return l("Issue title cannot be empty");let o=e.description??"",r=lt("Issue title",n,300)??lt("Issue description",o,2e4);if(r)return l(r);if((e.tagNames?.length??0)>20)return l(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return l(`Cannot set more than ${20} assignees at once`);let s=No(e.parentId);if(a(s))return s;let i=Wn(e.parentId,t.value.actor,t.value.boot.stateBranchRoot);if(a(i))return i;let c=ul({name:n,parent:e.parentId,user:t.value.actor,rank:i.value});if(a(c))return c;let d=[...c.value],p=d.find(h=>h.action==="add.issue")?.payload.id;if(!p)return l("Unable to determine created issue id");o&&d.push({id:Yt(),...D(t.value.actor),action:"edit.description",payload:{id:p,md:o}});let m=[];for(let h of e.tagNames??[]){let x=Ee(h).trim();if(!x||m.some(A=>A.name===x))continue;let b=lt("Tag name",x,60);if(b)return l(b);let R=N.findTagByName(x),S=R?.id??Yt();R||d.push({id:Yt(),...D(t.value.actor),action:"create.tag",payload:{id:S,name:x}}),d.push({id:Yt(),...D(t.value.actor),action:"add.issue.tag",payload:{id:p,tag:S}}),m.push({id:S,name:x})}let f=[];for(let h of e.assigneeNames??[]){let x=Ee(h).trim();if(!x||f.some(A=>A.name===x))continue;let b=lt("Assignee name",x,80);if(b)return l(b);let R=Object.values(t.value.state.contributors).find(A=>A.name===x),S=R?.id??Yt();R||d.push({id:Yt(),...D(t.value.actor),action:"create.contributor",payload:{id:S,name:x}}),d.push({id:Yt(),...D(t.value.actor),action:"add.issue.assignee",payload:{id:p,assignee:S}}),f.push({id:S,name:x})}let g=B(d,t.value.boot.stateBranchRoot);return a(g)?l(g.message):u("Created issue",{id:p,ref:H(p),title:n,parentId:e.parentId,description:o,tags:m,assignees:f})},Dw=(e,t,n)=>{let o=tt(e);if(a(o))return o;let r=Cn(he,e,{at:"end"},t,n);if(a(r))return r;let s={id:Yt(),...D(t),action:"close.issue",payload:{id:e,parent:he,rank:r.value}},i=B([s],n);return a(i)?l(i.message):u("Closed issue",{id:e,ref:H(e)})};async function ju(e){let t=await Ft(e.repoRoot);if(a(t))return t;let n=Kt();if(a(n))return n;let o=hi(e);if(a(o))return o;let r=s=>Dw(s,n.value,t.value.stateBranchRoot);return e.issueIds?Jr("Closed",yi(o.value,r)):r(o.value[0])}var $u=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[e.issueId];if(!n||n.isDeleted)return l("Issue not found");if(!_(n))return l("Target must be an issue");if(n.parentNodeId!==he)return l("Issue is not closed");let o=bl(n);if(!o)return l("Unable to resolve previous parent from issue history");if(o===he)return l("Previous parent resolves to closed swimlane");let r=No(o);if(a(r))return r;let s=r.value,i=Cn(s.id,n.id,{at:"end"},t.value.actor,t.value.boot.stateBranchRoot);if(a(i))return i;let c={id:Yt(),...D(t.value.actor),action:"reopen.issue",payload:{id:n.id,parent:s.id,rank:i.value}},d=B([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Reopened issue",{id:n.id,ref:H(n.id),parentId:s.id})},Bw=(e,t,n,o)=>{let r=tt(e);if(a(r))return r;let s=No(t.parentId);if(a(s))return s;let i=Cn(t.parentId,e,t.position??{at:"end"},n,o);if(a(i))return i;let c={id:Yt(),...D(n),action:"move.node",payload:{id:e,parent:t.parentId,rank:i.value}},d=B([c],o);return a(d)?l(d.message):u("Moved issue",{id:e,ref:H(e),parentId:t.parentId})};async function Uu(e){let t=Qo(e.repoRoot);if(a(t))return t;let n=Kt();if(a(n))return n;let o=me({repoRoot:t.value});if(a(o))return o;let r=rn(o.value);if(a(r))return r;let s=sn(r.value.events,r.value.unreadable);if(a(s))return s;let i=hi(e);if(a(i))return i;let c=d=>Bw(d,e,n.value,o.value);return e.issueIds?Jr("Moved",yi(i.value,c)):c(i.value[0])}var Hu=e=>{let t=pt();if(a(t))return t;let n=t.value.nodes[e];return n?u("Read issue history",(n.log??[]).map(o=>({id:o.id,t:De(o.id),action:o.action,label:vl(o),...o.action==="move.node"?{parentId:o.payload.parent}:{},actor:Ke(o.userId,t.value.contributors[o.userId]?.name)}))):l("Issue not found")},Wu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let o=n.value,r=lt("Issue description",e.description,2e4);if(r)return l(r);let s=o.props.description??"";if(s===e.description)return u("No changes made",{id:e.issueId,ref:H(e.issueId),description:s});let i={id:Yt(),...D(t.value.actor),action:"edit.description",payload:{id:e.issueId,md:e.description}},c=B([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue description",{id:e.issueId,ref:H(e.issueId),description:e.description})},Gu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let o=n.value,r=Ee(e.title);if(!r.trim())return l("Issue title cannot be empty");let s=lt("Issue title",r,300);if(s)return l(s);if(o.title===r)return u("No changes made",{id:e.issueId,ref:H(e.issueId),title:r});let i={id:Yt(),...D(t.value.actor),action:"edit.title",payload:{id:e.issueId,name:r}},c=B([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue title",{id:e.issueId,ref:H(e.issueId),title:r})};import{ulid as Ao}from"ulid";var Vu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[t.value.state.rootNodeId];if(!n)return l("Workspace not found");if(Je().mode!=="live")return l("Cannot add a board while time travelling");let o=Ee(e.title);if(!o.trim())return l("Board title cannot be empty");let r=lt("Board title",o,300);if(r)return l(r);let s=Wn(n.id,t.value.actor,t.value.boot.stateBranchRoot);if(a(s))return s;let i=Ao(),c={id:Ao(),...D(t.value.actor),action:"add.board",payload:{id:i,name:o,parent:n.id,rank:s.value}},d=B([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Created board",{id:i,ref:H(i),title:o})},zu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.nodes[e.boardId];if(!n||n.isDeleted)return l("Board not found");if(!ro(n))return l("Edit target must be a board");if(n.readonly)return l("Cannot edit readonly board");if(Je().mode!=="live")return l("Cannot rename a board while time travelling");let o=Ee(e.title);if(!o.trim())return l("Board title cannot be empty");let r=lt("Board title",o,300);if(r)return l(r);if(n.title===o)return u("No changes made",{id:e.boardId,ref:H(e.boardId),title:o});let s={id:Ao(),...D(t.value.actor),action:"edit.title",payload:{id:e.boardId,name:o}},i=B([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Edited board title",{id:e.boardId,ref:H(e.boardId),title:o})};var Ku=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Tu(e.boardId);if(a(n))return n;if(Je().mode!=="live")return l("Cannot add a swimlane while time travelling");let o=Ee(e.title);if(!o.trim())return l("Swimlane title cannot be empty");let r=lt("Swimlane title",o,300);if(r)return l(r);let s=Wn(e.boardId,t.value.actor,t.value.boot.stateBranchRoot);if(a(s))return s;let i=Ao(),c={id:Ao(),...D(t.value.actor),action:"add.swimlane",payload:{id:i,name:o,parent:e.boardId,rank:s.value}},d=B([c],t.value.boot.stateBranchRoot);return a(d)?l(d.message):u("Created swimlane",{id:i,ref:H(i),title:o,boardId:e.boardId})},qu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=No(e.swimlaneId);if(a(n))return n;let o=n.value,r=Ee(e.title);if(!r.trim())return l("Swimlane title cannot be empty");let s=lt("Swimlane title",r,300);if(s)return l(s);if(o.title===r)return u("No changes made",{id:e.swimlaneId,ref:H(e.swimlaneId),title:r});let i={id:Ao(),...D(t.value.actor),action:"edit.title",payload:{id:e.swimlaneId,name:r}},c=B([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited swimlane title",{id:e.swimlaneId,ref:H(e.swimlaneId),title:r})},Yu=async e=>{let t=Qo(e.repoRoot);if(a(t))return t;let n=Kt();if(a(n))return n;let o=me({repoRoot:t.value});if(a(o))return o;let r=rn(o.value);if(a(r))return r;let s=sn(r.value.events,r.value.unreadable);if(a(s))return s;let i=No(e.swimlaneId);if(a(i))return i;let c=Tu(e.boardId);if(a(c))return c;let d=Cn(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,o.value);if(a(d))return d;let p={id:Ao(),...D(n.value),action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:d.value}},m=B([p],o.value);return a(m)?l(m.message):u("Moved swimlane",{id:e.swimlaneId,ref:H(e.swimlaneId),boardId:e.boardId})},Xu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=No(e.swimlaneId);if(a(n))return n;let o={id:Ao(),...D(t.value.actor),action:"delete.node",payload:{id:e.swimlaneId}},r=B([o],t.value.boot.stateBranchRoot);return a(r)?l(r.message):u("Deleted swimlane",{id:e.swimlaneId,ref:H(e.swimlaneId)})};import{ulid as vi}from"ulid";async function Ju(e){let t=await Ft(e.repoRoot);if(a(t))return t;let n=Kt();if(a(n))return n;let o=hi(e);if(a(o))return o;let r=Ee(e.tagName).trim();if(!r)return l("Tag name cannot be empty");let s=lt("Tag name",r,60);if(s)return l(s);let i=yi(o.value,tt);if(!e.issueIds&&i.failed[0])return l(i.failed[0].reason);if(i.done.length===0)return l(Jr("Tagged",i).message);let c=N.findTagByName(r),d=c?.id??vi(),p=[...c?[]:[{id:vi(),...D(n.value),action:"create.tag",payload:{id:d,name:r}}],...i.done.map(({id:h})=>({id:vi(),...D(n.value),action:"add.issue.tag",payload:{id:h,tag:d}}))],m=B(p,t.value.stateBranchRoot);if(a(m))return l(m.message);let f={id:d,name:r};if(!e.issueIds)return u("Added issue tag",{...i.done[0],tag:f});let g=Jr("Tagged",i);return a(g)?g:u(g.message,{...g.value,tag:f})}var Qu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.tags[e.tagId];if(!n)return l("Tag not found");if(n.tombstoned)return l("Tag is already deleted");let o=[{id:vi(),...D(t.value.actor),action:"tombstone.tag",payload:{id:e.tagId}}],r=B(o,t.value.boot.stateBranchRoot);return a(r)?l(r.message):u("Deleted tag",{id:n.id,name:n.name})};var Zu=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;if(!t.value.state.tags[e.tagId])return l("Tag not found");let o={id:vi(),...D(t.value.actor),action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},r=B([o],t.value.boot.stateBranchRoot);return a(r)?l(r.message):u("Removed issue tag",{id:e.issueId,ref:H(e.issueId),tagId:e.tagId})};import{ulid as tr}from"ulid";var bb=async(e,t)=>{let n=co(e).get(t);return n===void 0?void 0:{id:t,name:n}},em=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let o=e.self?t.value.actor.userId:e.assigneeId;if(o){let h=t.value.state.contributors[o],x=h?void 0:await bb(t.value.boot.stateBranchRoot,o);if(!h&&!x)return l("Unknown assignee id");let b=h??x,R=[...h?[]:[{id:tr(),...D(t.value.actor),action:"create.contributor",payload:{id:b.id,name:b.name}}],{id:tr(),...D(t.value.actor),action:"add.issue.assignee",payload:{id:e.issueId,assignee:b.id}}],S=B(R,t.value.boot.stateBranchRoot);return a(S)?l(S.message):u("Added issue assignee",{id:e.issueId,ref:H(e.issueId),assignee:{id:b.id,name:b.name}})}let r=Ee(e.assigneeName??"").trim();if(!r)return l("Provide assigneeId, self or assigneeName");let s=lt("Assignee name",r,80);if(s)return l(s);let i=di({events:t.value.state.eventLog??[],registry:t.value.state.contributors,logFileNames:co(t.value.boot.stateBranchRoot)}).filter(h=>h.name===r);if(i.length>1)return l(`"${r}" matches ${i.length} contributors (${i.map(({id:h})=>h).join(", ")}). Assign by assigneeId to choose.`);let c=i[0];if(!c&&!e.createUnlinked)return l(`No contributor named "${r}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let d=c?.id??tr(),p=c?.name??r,f=[...!!t.value.state.contributors[d]?[]:[{id:tr(),...D(t.value.actor),action:"create.contributor",payload:{id:d,name:p}}],{id:tr(),...D(t.value.actor),action:"add.issue.assignee",payload:{id:e.issueId,assignee:d}}],g=B(f,t.value.boot.stateBranchRoot);return a(g)?l(g.message):u("Added issue assignee",{id:e.issueId,ref:H(e.issueId),assignee:{id:d,name:p}})},tm=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;if(!t.value.state.contributors[e.contributorId])return l("Contributor not found");if(await bb(t.value.boot.stateBranchRoot,e.contributorId))return l("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let r=[{id:tr(),...D(t.value.actor),action:"tombstone.contributor",payload:{id:e.contributorId}}],s=B(r,t.value.boot.stateBranchRoot);return a(s)?l(s.message):u("Tombstoned contributor",{id:e.contributorId,name:xr})};var nm=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=uo(t.value.boot.stateBranchRoot);if(a(n))return l(n.message);let o=e.boardId?nb(n.value,e.boardId):n.value,r=new Set,s=Sg(t.value.boot.stateBranchRoot);if(a(s))return l(s.message);for(let d of s.value)d.userId&&r.add(d.userId);let i=t.value.state.contributors,c=di({events:o,registry:i,logFileNames:co(t.value.boot.stateBranchRoot)}).map(({id:d,name:p,isExternal:m})=>({...Ke(d,p),isSelf:d===t.value.actor.userId,isExternal:m,isRemoved:i[d]?.tombstoned===!0,hasAuthoredAnywhere:r.has(d)}));return u("Listed board contributors",c)},om=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;if(!t.value.state.contributors[e.assigneeId])return l("Assignee not found");let o={id:tr(),...D(t.value.actor),action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},r=B([o],t.value.boot.stateBranchRoot);return a(r)?l(r.message):u("Removed issue assignee",{id:e.issueId,ref:H(e.issueId),assigneeId:e.assigneeId})};import{ulid as Dl}from"ulid";var bi=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=tt(e.issueId);if(a(n))return n;let o=e.body.trim();if(!o)return l("Comment cannot be empty");if(o.length>4e3)return l(`Comment cannot exceed ${4e3} characters (got ${o.length})`);let r=Dl(),s={id:Dl(),...D(t.value.actor),action:"add.issue.comment",payload:{id:r,issue:e.issueId,md:o,author:t.value.actor.userId}},i=B([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Added issue comment",{id:r,issueId:e.issueId,body:o})},xi=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(c=>c.action==="add.issue.comment"&&c.payload.id===e.commentId);if(!n)return l("Unable to resolve comment");if(n.payload.author!==t.value.actor.userId)return l("You can only delete your own comments");let o=tt(n.payload.issue);if(a(o))return o;if(t.value.state.eventLog.some(c=>c.action==="delete.issue.comment"&&c.payload.id===e.commentId))return u("Comment already deleted",{id:e.commentId,issueId:n.payload.issue});let s={id:Dl(),...D(t.value.actor),action:"delete.issue.comment",payload:{id:e.commentId,issue:n.payload.issue}},i=B([s],t.value.boot.stateBranchRoot);return a(i)?l(i.message):u("Deleted issue comment",{id:e.commentId,issueId:n.payload.issue})},rm=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=t.value.state.eventLog.find(d=>d.action==="add.issue.comment"&&d.payload.id===e.commentId);if(!n)return l("Unable to resolve comment");if(n.payload.author!==t.value.actor.userId)return l("You can only edit your own comments");let o=tt(n.payload.issue);if(a(o))return o;if(t.value.state.eventLog.some(d=>d.action==="delete.issue.comment"&&d.payload.id===e.commentId))return l("Comment was deleted");let s=e.body.trim();if(!s)return l("Comment cannot be empty");if(s.length>4e3)return l(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let i={id:Dl(),...D(t.value.actor),action:"edit.issue.comment",payload:{id:e.commentId,issue:n.payload.issue,md:s}},c=B([i],t.value.boot.stateBranchRoot);return a(c)?l(c.message):u("Edited issue comment",{id:e.commentId,issueId:n.payload.issue,body:s})};import{ulid as xb}from"ulid";var sm=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;if(!no(e.email))return l(`Not an email address: ${e.email}`);let n=Ze(e.email),o=e.contributorId??t.value.actor.userId;if(!t.value.state.contributors[o])return l(`Unknown contributor: ${o}`);let r=Es(t.value.state.emailLinks,n);if(r.includes(o))return u(`${n} is already yours`,{contributor:o,email:n,contested:r.filter(i=>i!==o)});let s=B([{id:xb(),action:"link.contributor.email",payload:{contributor:o,email:n},userId:t.value.actor.userId}],t.value.boot.stateBranchRoot);return a(s)?l(s.message):u(r.length>0?`Claimed ${n}, but somebody else claims it too, so it now resolves to neither of you`:`Claimed ${n}`,{contributor:o,email:n,contested:r})},im=async e=>{let t=await ue(e.repoRoot);if(a(t))return t;let n=Ze(e.email),o=e.contributorId??t.value.actor.userId,r=t.value.state.emailLinks[Is(n,o)];if(!r||r.tombstoned)return l(`No such link: ${n} to ${o}`);if(!na(t.value.actor.userId,r))return l("Only whoever made a claim, or the contributor it names, may undo it");let s=B([{id:xb(),action:"unlink.contributor.email",payload:{contributor:o,email:n},userId:t.value.actor.userId}],t.value.boot.stateBranchRoot);return a(s)?l(s.message):u(`Unclaimed ${n}`,{contributor:o,email:n})},Bl=async(e={})=>{let t=await Ft(e.repoRoot);if(a(t))return t;let n=pt();if(a(n))return n;let{emailLinks:o,contributors:r}=n.value,s=new Map;for(let f of Object.values(o)){if(f.tombstoned)continue;let g=s.get(f.email)??new Set;g.add(f.contributor),s.set(f.email,g)}let i=[...s.entries()].map(([f,g])=>({email:f,contested:g.size>1,claimants:[...g].map(h=>Ke(h,r[h]?.name))})).sort((f,g)=>f.email.localeCompare(g.email)),c=Kt(),d=a(c)?[]:yn(o,c.value.userId),p=V().gitEmail,m=p?Es(o,p).filter(f=>a(c)||f!==c.value.userId):[];return u("Listed contributor emails",{emails:i,mine:d,git:p?{email:p,linkedToMe:d.includes(p),heldByOthers:m.map(f=>Ke(f,r[f]?.name))}:null})},Ol=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let{userId:n,userName:o}=t.value.actor,r=ke(t.value.boot.repoRoot),s=await Mn({repoRoot:t.value.boot.repoRoot,stateBranch:a(r)?void 0:r.value,names:[o,await Co(t.value.boot.repoRoot)],links:t.value.state.emailLinks});if(a(s))return s;let i=Io(s.value),c=i.filter(d=>d.looksLikeYours);return u(i.length===0?"No unclaimed addresses in this history":`${i.length} unclaimed address(es) in this history, ${c.length>0?`${c.length} of which look like yours`:"none obviously yours"}. Show them to the user and link only the ones they confirm; each is a permanent event that replicates to every clone.`,{contributor:n,candidates:i,likely:c.length})};var Ib=(e,t)=>{let n=0,o=0,r=null;for(let s of e){if(s.userId!==t)continue;s.action==="add.issue"&&n++,s.action==="add.issue.comment"&&o++;let i=br(s.id);if(a(i))continue;let c=i.value.getTime();(r===null||c<r)&&(r=c)}return{tickets:n,comments:o,joinedAt:r}};var am=async(e={})=>{let t=await ue(e.repoRoot);if(a(t))return t;let{userId:n,userName:o}=t.value.actor,r=Ib(t.value.state.eventLog,n),s=ke(t.value.boot.repoRoot),i=await Mn({repoRoot:t.value.boot.repoRoot,stateBranch:a(s)?void 0:s.value,names:[o,await Co(t.value.boot.repoRoot)],links:t.value.state.emailLinks}),c=a(i)?[]:i.value.filter(d=>d.claimedBy.length===1&&d.claimedBy[0]===n);return u("Derived personal stats",{...r,scanned:!a(i),commits:c.reduce((d,p)=>d+p.commits,0),claimedEmails:c.length})};import Ow from"node:fs";import Eb from"node:path";var Ii=Number(process.env.EPIQ_GUI_PORT)||3710,lm="/api/instance",cm="epiq",Fl=e=>{try{return Ow.realpathSync(Eb.resolve(e))}catch{return Eb.resolve(e)}},Fw=e=>{let t=e;return typeof t=="object"&&t!==null&&t.app===cm&&typeof t.repoRoot=="string"&&typeof t.version=="string"&&typeof t.pid=="number"},Sb=async(e,t=500)=>{let n=new AbortController,o=setTimeout(()=>n.abort(),t);try{let r=await fetch(`http://127.0.0.1:${e}${lm}`,{signal:n.signal});if(!r.ok)return null;let s=await r.json();return Fw(s)?s:null}catch{return null}finally{clearTimeout(o)}};var Rb=e=>{let t,n=!1,o=!1,r=0,s=()=>{let m=hn();return a(m)?(ee.error(m.message),null):m.value},i=()=>{let m=s();if(!m)return!1;let f=ht();return a(f)?!1:!!m.autoSync&&Il(f.value)===null},c=()=>{let m=mr(s()?.autoSyncDebounceMs);return Math.max(0,m-(Date.now()-r))},d=async()=>{if(!(n||o)&&i()){o=!0,r=Date.now();try{await Pn(async()=>{Je().mode==="live"&&(await gi({repoRoot:e.project.repoRoot}),await e.publisher.publishIfLogMoved())})}finally{o=!1,p()}}};function p(){n||!i()||o||t||(t=setTimeout(()=>{t=void 0,d()},c()))}return p(),{queueSync:p,reschedule:()=>{t&&(clearTimeout(t),t=void 0),p()},dispose:()=>{n=!0,t&&clearTimeout(t)}}};var _l=(e,t)=>{let n,o=!1,r=async()=>{let s=Date.now();try{await e()}catch(i){logger.error("[watch] check threw",i)}o||(n=setTimeout(r,Math.max(t,Date.now()-s)))};return n=setTimeout(r,t),()=>{o=!0,n&&clearTimeout(n)}};var _w=/^(```|~~~)[^\n]*\n[\s\S]*?\n\1[ \t]*$/gm,jw=/^(?:```|~~~)[\s\S]*$/m,$w=/^[ \t]*\|?[ \t]*:?-{2,}:?[ \t]*(?:\|[ \t]*:?-{2,}:?[ \t]*)*\|?[ \t]*$/gm,Uw=/^[ \t]*\|.*$/gm,Hw=/!\[[^\]]*\]\([^)]*\)/g,Ww=/\[([^\]]*)\]\([^)]*\)/g,Gw=/^[ \t]*(?:[#>]+[ \t]*|[-*+][ \t]+|\d+[.)][ \t]+)/gm,Vw=/^[ \t]*(?:-{3,}|\*{3,}|_{3,})[ \t]*$/gm,zw=/[*`~]/g,Kw=/(?<![0-9A-Za-z])_|_(?![0-9A-Za-z])/g,qw=e=>Ee(e.replace(_w," ").replace(jw," ").replace(Hw," ").replace(Ww,"$1").replace(Vw," ").replace($w," ").replace(Uw,t=>t.replaceAll("|"," ")).replace(Gw,"").replace(zw,"").replace(Kw,"")),Yw=.5,Cb=(e,t)=>{if(t<=0)return"";let n=qw(e);if(n.length<=t)return n;let o="\u2026",r=t-o.length;if(r<=0)return o.slice(0,t);let s=n.slice(0,r),i=s.lastIndexOf(" ");return`${(i>=r*Yw?s.slice(0,i):s).trimEnd()}${o}`};var Xw=e=>({...e,boards:(e.boards??[]).map(t=>({...t,swimlanes:(t.swimlanes??[]).map(n=>({...n,issues:(n.issues??[]).map(o=>({...o,description:""}))}))})),commentsByIssueId:Object.fromEntries(Object.entries(e.commentsByIssueId??{}).filter(([,t])=>t.length>0).map(([t,n])=>[t,n.map(o=>({...o,body:""}))])),attachmentsByIssueId:Object.fromEntries(Object.entries(e.attachmentsByIssueId??{}).filter(([,t])=>t.length>0))}),nr=e=>a(e)?e:u(e.message,Xw(e.value)),Jw=(e,t)=>(e.boards??[]).flatMap(n=>n.swimlanes??[]).flatMap(n=>n.issues??[]).find(n=>n.id===t),Nb=(e,t)=>{let n=Jw(e,t);return{issueId:t,description:n?.description??"",comments:e.commentsByIssueId?.[t]??[]}},Qw=280,Ab=(e,t)=>({issueId:e,excerpt:Cb(t,Qw)});var Zw=1e3,wb=e=>{let t=oe(e.repoRoot);if(a(t))return null;let n=me({repoRoot:t.value});return a(n)?null:n.value},Tb=e=>{let n=(()=>{let r=wb(e.project);return r===null?null:et(r)})();return{publishIfLogMoved:async()=>{let r=wb(e.project);if(r===null||await $a(r))return;let s=et(r);if(s===n)return;n=s;let i=nr(await qt({repoRoot:e.project.repoRoot}));a(i)||Uo({type:"state",payload:i})}}},Mb=(e,t=Zw)=>_l(()=>Pn(async()=>{Je().mode==="live"&&await e.publishIfLogMoved()}),t);var eT=new Set(["127.0.0.1","[::1]","localhost","epiq.localhost"]),dm=(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:!eT.has(n.hostname)},Pb=(e,t)=>e.method==="GET"||e.method==="HEAD"?null:dm(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 $T}from"ws";var Ln=e=>({path:e.path,sha:e.shas[e.shas.length-1]??""});var tT=e=>{let t=e.lastIndexOf("/");return t===-1?".":e.slice(0,t)},Lb=({commits:e,patch:t})=>{let n=e.map(i=>i.time),r=t.files.map(i=>({...Ln(i),changed:i.addedCount+i.removed})).reduce((i,c)=>i===null||c.changed>i.changed?c:i,null),s=t.insertions+t.deletions;return{commits:e.length,authors:[...new Set(e.map(i=>i.author))].sort(),firstCommitAt:n.length?Math.min(...n):null,lastCommitAt:n.length?Math.max(...n):null,files:t.files.length,filesAdded:t.files.filter(i=>i.status==="added").length,filesModified:t.files.filter(i=>i.status==="modified").length,filesDeleted:t.files.filter(i=>i.status==="deleted").length,binaryFiles:t.files.filter(i=>i.binary).length,directories:new Set(t.files.map(i=>tT(i.path))).size,insertions:t.insertions,deletions:t.deletions,net:t.insertions-t.deletions,largestFile:r,concentration:r&&s>0?r.changed/s:0,selfChurn:t.selfChurn,truncated:t.truncated}};var nt={line:["//"],block:[["/*","*/"]]},Xt={line:["#"],block:[]},um={line:["--"],block:[]},Qr={line:[],block:[["<!--","-->"]]},nT={line:[],block:[]},q=(e,t)=>({name:e,comment:t}),jl=q("TypeScript",nt),$l=q("JavaScript",nt),kb={ts:jl,tsx:jl,mts:jl,cts:jl,js:$l,jsx:$l,mjs:$l,cjs:$l,py:q("Python",{line:["#"],block:[['"""','"""']]}),rb:q("Ruby",{line:["#"],block:[["=begin","=end"]]}),go:q("Go",nt),rs:q("Rust",nt),java:q("Java",nt),kt:q("Kotlin",nt),swift:q("Swift",nt),c:q("C",nt),h:q("C",nt),cc:q("C++",nt),cpp:q("C++",nt),hpp:q("C++",nt),cs:q("C#",nt),php:q("PHP",nt),scala:q("Scala",nt),dart:q("Dart",nt),lua:q("Lua",um),hs:q("Haskell",um),sql:q("SQL",um),ex:q("Elixir",Xt),exs:q("Elixir",Xt),pl:q("Perl",Xt),r:q("R",Xt),jl:q("Julia",Xt),sh:q("Shell",Xt),bash:q("Shell",Xt),zsh:q("Shell",Xt),vue:q("Vue",Qr),svelte:q("Svelte",Qr),html:q("HTML",Qr),xml:q("XML",Qr),md:q("Markdown",Qr),mdx:q("Markdown",Qr),css:q("CSS",{line:[],block:[["/*","*/"]]}),scss:q("CSS",nt),less:q("CSS",nt),yml:q("YAML",Xt),yaml:q("YAML",Xt),toml:q("TOML",Xt),ini:q("INI",Xt),json:q("JSON",nT)},oT="Other",Db=e=>{let t=e.slice(e.lastIndexOf("/")+1),n=t.lastIndexOf(".");return n<=0?"":t.slice(n+1).toLowerCase()},or=e=>kb[Db(e)]?.name??oT,Ei=e=>kb[Db(e)]?.comment??null,rT=[/\.(test|spec)\.[a-z0-9]+$/i,/(^|\/)test_[^/]+\.py$/,/_test\.[a-z0-9]+$/i,/(^|\/)conftest\.py$/,/Tests?\.(java|kt|cs|scala)$/],sT=/(^|\/)(tests?|__tests__|spec|specs|e2e|src\/test|features)\//i,Zr=e=>sT.test(e)||rT.some(t=>t.test(e)),iT=/(^|\/)(package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|Cargo\.lock|go\.sum|poetry\.lock|Gemfile\.lock|composer\.lock)$/,aT=/(^|\/)(node_modules|dist|build|out|target|vendor|coverage|\.next|__snapshots__)\//,lT=/(\.min\.(js|css)|\.map|\.snap|\.pb\.go|_pb2\.py)$/,mn=e=>iT.test(e)||aT.test(e)||lT.test(e),Bb=e=>/(^|\/)(package\.json|go\.mod|Cargo\.toml|requirements[^/]*\.txt|pyproject\.toml|Gemfile|composer\.json|pom\.xml|build\.gradle(\.kts)?)$/.test(e),Ob=e=>/(^|\/)\.github\/workflows\//.test(e)||/(^|\/)(Dockerfile|docker-compose[^/]*\.ya?ml|Makefile|Jenkinsfile|\.gitlab-ci\.yml)$/.test(e)||/\.tf$/.test(e),Fb=e=>/\.(md|mdx|rst|txt)$/i.test(e)||/(^|\/)docs?\//i.test(e),cT=/\b(it|test|describe|context|suite)\.skip\b|\bx(it|describe|test)\s*\(|@pytest\.mark\.skip|@unittest\.skip|\bt\.Skip\s*\(|@(Ignore|Disabled)\b/,dT=/\b(it|test|describe|context|suite)\.only\b|\bf(it|describe|test)\s*\(/,_b=e=>cT.test(e),jb=e=>dT.test(e);var $b=/\b(TODO|FIXME|HACK|XXX)\b/,uT=/[;{}]\s*$|^\s*(const|let|var|function|def|class|if|for|while|return|import|export|await|print)\b.*[=(]/,mm=(e,t)=>{let n=e.trim();return n===""?"blank":t&&(t.line.some(o=>n.startsWith(o))||t.block.some(([o])=>n.startsWith(o))||t.block.some(([o])=>o==="/*")&&(n.startsWith("*")||n.startsWith("*/")))?"comment":"code"},mT=(e,t)=>{let n=e.trim();for(let o of[...t.line,...t.block.flat(),"*"])if(n.startsWith(o)){n=n.slice(o.length).trim();break}return n},Ub=({patch:e,repoShareByLanguage:t})=>{let n=new Map,o=0,r=0,s=0,i=0,c=0,d=0;for(let m of e.files){if(m.binary||mn(m.path))continue;let f=Ei(m.path);if(!f||f.line.length===0&&f.block.length===0)continue;let g=or(m.path),h=n.get(g)??{comment:0,code:0};for(let{text:x}of m.added){let b=mm(x,f);if($b.test(x)&&i++,b==="blank"){s++;continue}if(b==="comment"){o++,h.comment++,f&&uT.test(mT(x,f))&&d++;continue}r++,h.code++}for(let{text:x}of m.removedLines)$b.test(x)&&c++;n.set(g,h)}let p=o+r;return{byLanguage:[...n.entries()].map(([m,f])=>({name:m,commentLines:f.comment,codeLines:f.code,share:f.comment+f.code===0?0:f.comment/(f.comment+f.code),repoShare:t?.get(m)??null})).sort((m,f)=>f.commentLines+f.codeLines-(m.commentLines+m.codeLines)),commentLines:o,codeLines:r,blankLines:s,share:p===0?0:o/p,todoLinesAdded:i,todoLinesRemoved:c,commentedOutCodeLines:d}};var pT=/\bconsole\.(log|debug|dir)\s*\(|\bdebugger\b|^\s*print\s*\(|\bfmt\.Print(ln|f)?\s*\(|\bSystem\.out\.print|\bdbg!\s*\(/,Ul=6,pm=10,fT=e=>{let t=0;for(let n of e){if(n.trim()===""||n.startsWith(" "))continue;let o=n.length-n.trimStart().length;o>0&&(t===0||o<t)&&(t=o)}return Math.min(Math.max(t,2),8)},gT=(e,t)=>{let n=e.length-e.trimStart().length;if(n===0)return 0;let o=e.slice(0,n).split(" ").length-1;return o>0?o:Math.floor(n/t)},hT=e=>{if(e.length<Ul*2)return 0;let t=new Map,n=new Array(e.length).fill(!1);for(let o=0;o+Ul<=e.length;o++){let r=e.slice(o,o+Ul);if(r.some(c=>c.text.length<3))continue;let s=r.map(c=>c.text).join(`
|
|
102
|
+
`),i=t.get(s);if(i===void 0){t.set(s,{...r[0],at:o});continue}if(i.file!==r[0]?.file)for(let c=0;c<Ul;c++)n[i.at+c]=!0,n[o+c]=!0}return n.filter(Boolean).length},Hb=({patch:e})=>{let t=[],n=[],o=[],r=!1,s=0,i=0,c=null,d=[];for(let[p,m]of e.files.entries()){if(mn(m.path)&&t.push(Ln(m)),Bb(m.path)&&n.push(Ln(m)),Ob(m.path)&&o.push(Ln(m)),Fb(m.path)&&(r=!0),m.binary||mn(m.path))continue;let f=m.added.map(x=>x.text),g=fT(f),h=m.status!=="deleted";for(let x of f){pT.test(x)&&s++;let b=gT(x,g);b>i&&(i=b,c=Ln(m)),h&&d.push({text:x.trim(),file:p})}d.push({text:" ",file:p})}return{generatedPaths:t.slice(0,pm),dependencyManifests:n.slice(0,pm),buildOrCiPaths:o.slice(0,pm),docsTouched:r,debugPrintLinesAdded:s,maxIndentLevels:i,deepestFile:c,duplicatedLines:hT(d)}};var Wb=({patch:e,languagesBefore:t})=>{let n=new Map,o=0;for(let i of e.files){if(i.binary)continue;let c=i.addedCount+i.removed;if(mn(i.path)){o+=c;continue}let d=or(i.path),p=n.get(d)??{name:d,added:0,removed:0,addedInTests:0,share:0};p.added+=i.addedCount,p.removed+=i.removed,Zr(i.path)&&(p.addedInTests+=i.addedCount),n.set(d,p)}let r=[...n.values()].reduce((i,c)=>i+c.added+c.removed,0),s=[...n.values()].map(i=>({...i,share:r===0?0:(i.added+i.removed)/r})).sort((i,c)=>c.added+c.removed-(i.added+i.removed));return{languages:s,introduced:t===null?[]:s.filter(i=>!t.has(i.name)).map(i=>i.name),generatedLines:o}};var yT=200,fm=2e5,vT=5e4,Gb=25,bT=64*1024*1024,gm="",xT=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/,IT=/^diff --git a\/(.+) b\/\1$/,Vb=(e,t)=>e==="/dev/null"?null:e.startsWith(t)?e.slice(2):e,zb=(e,t)=>e===null?"added":t===null?"deleted":"modified",ET=()=>({byPath:new Map,insertions:0,deletions:0,selfChurn:0,retainedLines:0}),ST=(e,t)=>{let n=e.byPath,o="",r=null,s=null,i=null,c=!1,d=0,p=(f,g)=>g==="modified"&&f==="added"?"added":g,m=(f,g)=>{let h=n.get(f);if(h)return h.entry.status=p(h.entry.status,g),h.entry.shas.includes(o)||h.entry.shas.push(o),h;let b={entry:{path:f,status:g,binary:!1,added:[],addedCount:0,removed:0,removedLines:[],shas:[o]},pendingByText:new Map};return n.set(f,b),b};for(let f of t.split(`
|
|
103
|
+
`)){if(f.startsWith(gm)){o=f.slice(gm.length).trim(),r=null,s=null,i=null,c=!1;continue}if(f.startsWith("diff --git ")){r=null,i=null,c=!0,s=IT.exec(f)?.[1]??null;continue}if(c&&f.startsWith("Binary files ")&&s){let[,h=""]=/^Binary files (.*) differ$/.exec(f)??[],[x="",b=""]=h.split(" and ");r=m(s,zb(x==="/dev/null"?null:x,b==="/dev/null"?null:b)),r.entry.binary=!0;continue}if(c&&f.startsWith("--- ")){i=Vb(f.slice(4),"a/");continue}if(c&&f.startsWith("+++ ")){let h=Vb(f.slice(4),"b/"),x=h??i??s;x&&(r=m(x,zb(i,h)));continue}let g=xT.exec(f);if(g){d=Number(g[1]),c=!1;continue}if(r){if(f.startsWith("+")){let h=f.slice(1);e.insertions++,r.entry.addedCount++,e.retainedLines<fm&&(r.entry.added.push({sha:o,line:d,text:h}),e.retainedLines++),r.pendingByText.size<vT&&r.pendingByText.set(h,(r.pendingByText.get(h)??0)+1),d++;continue}if(f.startsWith("-")){let h=f.slice(1);e.deletions++,r.entry.removed++,e.retainedLines<fm&&(r.entry.removedLines.push({sha:o,line:0,text:h}),e.retainedLines++);let x=r.pendingByText.get(h)??0;x>0&&h.trim().length>2&&(e.selfChurn++,r.pendingByText.set(h,x-1))}}}},RT=e=>({files:[...e.byPath.values()].map(t=>t.entry),insertions:e.insertions,deletions:e.deletions,selfChurn:e.selfChurn,retainedLines:e.retainedLines});var Kb=async({repoRoot:e,shas:t})=>{if(t.length===0)return u("No commits to scan",{files:[],insertions:0,deletions:0,selfChurn:0,scannedCommits:0,truncated:!1});let n=t.slice(0,yT).reverse(),o=ET(),r=0,s=0,i=!1;for(let d=0;d<n.length;d+=Gb){let p=n.slice(d,d+Gb),m=await U({cwd:e,args:["-c","core.quotePath=false","show","--unified=0","--no-renames","--no-color",`--format=${gm}%H`,...p]});if(a(m))return l(m.message);if(ST(o,m.value.stdout),r+=m.value.stdout.length,s+=p.length,r>bT){i=!0;break}}let c=RT(o);return u("Scanned ticket patch",{files:c.files,insertions:c.insertions,deletions:c.deletions,selfChurn:c.selfChurn,scannedCommits:s,truncated:i||s<t.length||c.retainedLines>=fm})};var CT=40,NT=/^\d{6} blob ([0-9a-f]{40})\t(.+)$/,qb=async({repoRoot:e,sha:t})=>{let n=await Le({cwd:e,args:["-c","core.quotePath=false","ls-tree","-r",`${t}~1`]});if(n.exitCode!==0)return null;let o=new Set,r=new Map;for(let m of n.stdout.split(`
|
|
104
|
+
`)){let f=NT.exec(m);if(!f)continue;let[,g="",h=""]=f;if(mn(h))continue;let x=or(h);if(o.add(x),Zr(h)||!Ei(h))continue;let b=r.get(x)??[];b.length<CT&&(b.push({blob:g,path:h}),r.set(x,b))}let s=[...r.values()].flat(),i=await Wi(s.map(m=>m.blob),e);if(a(i))return{languages:o,commentShareByLanguage:new Map};let c=i.value,d=new Map;for(let{blob:m,path:f}of s){let g=c.get(m);if(g===void 0)continue;let h=Ei(f),x=or(f),b=d.get(x)??{comment:0,code:0};for(let R of g.split(`
|
|
105
|
+
`)){let S=mm(R,h);S==="comment"&&b.comment++,S==="code"&&b.code++}d.set(x,b)}let p=new Map;for(let[m,f]of d){let g=f.comment+f.code;g>0&&p.set(m,f.comment/g)}return{languages:o,commentShareByLanguage:p}};var Yb=({patch:e})=>{let t=0,n=0,o=[],r=[],s=0,i=0;for(let c of e.files)if(!(c.binary||mn(c.path))&&Zr(c.path)){t+=c.addedCount,n+=c.removed,c.status==="added"&&o.push(Ln(c)),c.status==="deleted"&&r.push(Ln(c));for(let{text:d}of c.added)_b(d)&&s++,jb(d)&&i++}return{testLinesAdded:t,testLinesRemoved:n,addedTestFiles:o,deletedTestFiles:r,skippedTestLinesAdded:s,focusedTestLinesAdded:i}};var AT=e=>e.reduce((t,n)=>t===null||n.time<t.time?n:t,null)?.sha??null,Xb=async({repoRoot:e,ref:t,commits:n})=>{let o=await Kb({repoRoot:e,shas:n.map(c=>c.sha)});if(a(o))return l(o.message);let r=o.value,s=AT(n),i=s?await qb({repoRoot:e,sha:s}):null;return u("Derived issue stats",{ref:t,shape:Lb({commits:n,patch:r}),languages:Wb({patch:r,languagesBefore:i?.languages??null}),tests:Yb({patch:r}),comments:Ub({patch:r,repoShareByLanguage:i?.commentShareByLanguage??null}),flags:Hb({patch:r})})};var Si=e=>{if(a(e))return e;let t=de(),n=a(t)?{}:t.value.emailLinks,o=a(t)?{}:t.value.contributors,r=Ap(n),s=e.value.map(i=>({...i,authorIdentity:mv({authorName:i.author,authorEmail:i.authorEmail,owners:r,registry:o})}));return u(e.message,s)};var wT=32,Ri=new Map;var TT=(e,t)=>{if(Ri.set(e,t),Ri.size>wT){let n=Ri.keys().next();n.done||Ri.delete(n.value)}return t},Hl=async(e={idOrRef:""})=>{let t=e.idOrRef.trim();if(!t)return l("idOrRef must not be empty");let n=t.length>7?H(t):t.toUpperCase(),o=oe(e.repoRoot??process.cwd());if(a(o))return l(o.message);let r=o.value,s=Si(await Kn({repoRoot:r,ref:n}));if(a(s))return l(s.message);let i=s.value.map(m=>({sha:m.sha,time:m.time,author:m.authorIdentity?.resolved?m.authorIdentity.name:m.author,subject:m.subject})),c=[r,n,i.map(m=>`${m.sha}:${m.author}`).join(",")].join(" "),d=Ri.get(c);if(d)return u("Derived issue stats",d);let p=await Xb({repoRoot:r,ref:n,commits:i});return a(p)?l(p.message):u("Derived issue stats",TT(c,p.value))};var MT=new RegExp(`^[0-9A-Z]{${7}}$`),PT=e=>{let t=e.indexOf(" ");if(t===-1)return null;let n=e.slice(0,t).toUpperCase();return MT.test(n)?n:null},LT=e=>{let t={};for(let n of e){let o=PT(n.subject);if(!o)continue;let r=t[o]??={commits:0,insertions:0,deletions:0};r.commits++,r.insertions+=n.insertions,r.deletions+=n.deletions}return t},Jb=async(e={})=>{let t=await Hr({repoRoot:e.repoRoot});return a(t)?t:u("Collected diff stats by ref",LT(t.value))};var kT="Filed here",Qb=(e,t)=>e.set(t,(e.get(t)??0)+1),Zb=(e,t,n)=>[...e.entries()].map(([o,r])=>({laneId:o,title:o===null?kT:n(o),count:r,share:t===0?0:r/t})).sort((o,r)=>r.count-o.count||o.title.localeCompare(r.title)),ex=(e,t,n)=>{let o=new Map,r=new Map,s=0,i=0;for(let c of t)for(let[d,p]of c.entries()){if(p!==e)continue;s++,Qb(o,c[d-1]??null);let m=c[d+1];m!==void 0&&(i++,Qb(r,m))}return{arrived:s,departed:i,arrivesFrom:Zb(o,s,n),movesOnTo:Zb(r,i,n)}};var tx=e=>{if(e.length===0)return null;let t=Math.floor(e.length/2);return e.length%2===0?(e[t-1]+e[t])/2:e[t]};var Ci=1440*60*1e3,DT=({laneIds:e,journeys:t,now:n,days:o})=>{let r=n-(o-1)*Ci,s=new Map(e.map(i=>[i,Array.from({length:o},()=>[])]));for(let i of t)for(let[c,d]of i.entries()){let p=s.get(d.laneId);if(!p)continue;let m=i[c+1]?.enteredAt,f=Math.max(0,Math.ceil((d.enteredAt-r)/Ci)),g=m===void 0?o-1:Math.min(o-1,Math.ceil((m-r)/Ci)-1);for(let h=f;h<=g;h++)p[h].push(r+h*Ci-d.enteredAt)}return Object.fromEntries([...s].map(([i,c])=>[i,c.map((d,p)=>({t:r+p*Ci,median:tx(d.sort((m,f)=>m-f)),count:d.length}))]))},nx=({laneId:e,journeys:t,now:n,days:o})=>DT({laneIds:[e],journeys:t,now:n,days:o})[e];var BT=40,OT=30,FT=()=>({tickets:0,commits:0,insertions:0,deletions:0}),_T=async(e,t)=>{let n=FT();for(let o of t.slice(0,BT)){let r=await Hl({repoRoot:e,idOrRef:H(o)});a(r)||r.value.shape.commits===0||(n.tickets++,n.commits+=r.value.shape.commits,n.insertions+=r.value.shape.insertions,n.deletions+=r.value.shape.deletions)}return n},ox=async e=>{let t=pt();if(a(t))return t;let{nodes:n}=t.value;if(!n[e.swimlaneId])return l("Swimlane not found");let r=Object.values(n).filter(_),s=r.map(d=>Cu(d.log??[],De(d.id))),i=ex(e.swimlaneId,s.map(d=>d.map(p=>p.laneId)),d=>n[d]?.title??"Elsewhere"),c=r.filter(d=>d.parentNodeId===e.swimlaneId).map(d=>d.id);return u("Derived swimlane stats",{swimlaneId:e.swimlaneId,createdAt:De(e.swimlaneId),...i,stayTrend:nx({laneId:e.swimlaneId,journeys:s,now:Date.now(),days:OT}),code:await _T(e.repoRoot,c)})};var rx=new Set(["sync","email:link","email:unlink","issues:create","board:create","board:edit:title","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 sx=e=>{let t=$n({exclude:e});return a(t)?[]:t.value.map(n=>({projectId:n.projectId,name:Er(n.root),root:n.root,lastOpenedAt:n.lastOpenedAt}))},ix=e=>{let t=$n();if(a(t))return l(t.message);let n=t.value.find(o=>o.root===e);return n?u("Resolved recent project",n.root):l(`Not a recent project: ${e}`)};import{z as k}from"zod";var te=k.string().min(1),ax=k.discriminatedUnion("at",[k.object({at:k.literal("start")}),k.object({at:k.literal("end")}),k.object({at:k.literal("before"),sibling:te}),k.object({at:k.literal("after"),sibling:te})]),Ni=k.number().finite(),ae=(e,t)=>k.object({type:k.literal(e),payload:t}),rr=e=>k.object({type:k.literal(e)}),jT=k.discriminatedUnion("type",[rr("state:get"),rr("issues:list"),rr("sync"),rr("time-travel:live"),rr("diff-stats:get"),ae("project:open",k.object({root:k.string().min(1)})),ae("issues:create",k.object({title:k.string(),parentId:te,description:k.string().optional(),tagNames:k.array(k.string()).optional()})),ae("board:create",k.object({title:k.string()})),ae("board:edit:title",k.object({boardId:te,title:k.string()})),ae("swimlane:create",k.object({title:k.string(),boardId:te})),ae("swimlane:edit:title",k.object({swimlaneId:te,title:k.string()})),ae("swimlane:delete",k.object({swimlaneId:te})),ae("swimlane:move",k.object({swimlaneId:te,boardId:te,position:ax.optional()})),ae("issues:move",k.object({issueId:te,parentId:te,position:ax.optional()})),ae("issue:edit:title",k.object({issueId:te,title:k.string()})),ae("issue:edit:description",k.object({issueId:te,description:k.string()})),ae("issue:tag:add",k.object({issueId:te,tagName:k.string()})),ae("issue:tag:remove",k.object({issueId:te,tagId:te})),ae("contributor:remove",k.object({contributorId:te})),ae("tag:remove",k.object({tagId:te})),k.object({type:k.literal("contributors:get"),payload:k.object({boardId:te.optional()}).optional()}),ae("issue:assignee:add",k.object({issueId:te,assigneeId:te.optional(),assigneeName:k.string().optional(),createUnlinked:k.boolean().optional()})),ae("issue:assignee:remove",k.object({issueId:te,assigneeId:te})),ae("issue:close",k.object({issueId:te})),ae("issue:reopen",k.object({issueId:te})),ae("issue:comment:add",k.object({issueId:te,body:k.string()})),ae("issue:comment:delete",k.object({issueId:te,commentId:te})),ae("issue:comment:edit",k.object({issueId:te,commentId:te,body:k.string()})),ae("issue:get",k.object({issueId:te})),ae("issue:preview:get",k.object({issueId:te})),k.object({type:k.literal("timeline:get"),payload:k.object({start:Ni.optional(),end:Ni.optional(),boardId:te.optional(),requestId:k.number().finite().optional()}).optional()}),k.object({type:k.literal("commits:get"),payload:k.object({start:Ni.optional(),end:Ni.optional(),requestId:k.number().finite().optional()}).optional()}),ae("time-travel:scrub",k.object({targetTime:Ni})),ae("time-travel:checkout-event",k.object({eventId:k.string().min(1)})),ae("commit:inspect",k.object({sha:k.string()})),k.object({type:k.literal("emails:get")}),ae("email:link",k.object({email:k.string().min(1).max(254),contributorId:k.string().min(1).optional()})),ae("email:unlink",k.object({email:k.string().min(1).max(254),contributorId:k.string().min(1).optional()})),ae("commit:diff:get",k.object({sha:k.string()})),ae("issue:commits:get",k.object({issueId:te})),ae("issue:squashed-diff:get",k.object({issueId:te})),ae("issue:stats:get",k.object({issueId:te})),ae("swimlane:stats:get",k.object({swimlaneId:te})),rr("me:stats:get"),rr("settings:get"),ae("settings:set",k.object({autoSync:k.boolean().optional(),autoSyncIntervalMs:k.number().finite().optional()}))]);var lx=e=>{let t=jT.safeParse(e);return t.success?{ok:!0,message:t.data}:{ok:!1,error:`Invalid message: ${t.error.issues.map(o=>`${o.path.join(".")||"<root>"}: ${o.message}`).join(", ")}`}};var UT=1024*1024,hm=()=>{Uo({type:"state",payload:nr(Zo())})},Z=(e,t)=>{e.send(JSON.stringify(t))},Ai=async(e,t)=>{let n=nr(await qt({repoRoot:t}));return a(n)&&n.message===Tc?Z(e,{type:"state:unavailable",payload:{message:n.message,repoRoot:t,recentProjects:sx(t)}}):Z(e,{type:"state",payload:n})},HT=async(e,t)=>{let n=()=>Z(e,{type:"state",payload:nr(Zo())});if(Je().mode!=="live")return n();let o=await qt({repoRoot:t});return Je().mode!=="live"?n():Z(e,{type:"state",payload:nr(o)})},Ge=async(e,t,n,o,r)=>{if(Z(e,{type:o,payload:r}),a(r))return Z(e,{type:"failed",payload:r.message});n(),HT(e,t)},cx=(e,t,{onStateChanged:n,onSyncSettingsChanged:o,getPort:r})=>{new $T({server:e,path:"/ws",maxPayload:UT,verifyClient:i=>!dm(i.origin,r())}).on("connection",i=>{Gg(i),i.on("message",async c=>{let d=async p=>{let{type:m}=p,f=t.repoRoot;if(m==="project:open"){let g=ix(p.payload.root);return Z(i,{type:"project:open:result",payload:g}),a(g)?void 0:(t.repoRoot=g.value,Ai(i,g.value))}if(m==="timeline:get"){let{requestId:g,...h}=p.payload??{};return Z(i,{type:"timeline",requestId:g,payload:await lb({repoRoot:f,...h})})}if(m==="issue:get"){let g=p.payload?.issueId,h=Zo(),x=Hu(g);return Z(i,{type:"issue",payload:a(h)?h:u("Issue detail",{...Nb(h.value,g),history:a(x)?[]:x.value})})}if(m==="issue:preview:get"){let{issueId:g}=p.payload,h=Du(g);return Z(i,{type:"issue:preview:result",payload:{issueId:g,result:a(h)?h:u("Issue preview",Ab(g,h.value))}})}if(m==="commits:get"){let{requestId:g,...h}=p.payload??{};return Z(i,{type:"commits",requestId:g,payload:Si(await Hr({repoRoot:f,...h}))})}if(m==="emails:get")return Z(i,{type:"emails",payload:await Bl({repoRoot:f}),suggestions:await Ol({repoRoot:f})});if(m==="email:link"||m==="email:unlink"){let h=await(m==="email:link"?sm:im)({repoRoot:f,...p.payload});return Z(i,{type:"emails",payload:await Bl({repoRoot:f}),suggestions:await Ol({repoRoot:f}),lastAction:a(h)?{ok:!1,message:h.message}:{ok:!0,message:h.message}}),Ge(i,f,n,`${m}:result`,h)}if(m==="me:stats:get")return Z(i,{type:"me:stats",payload:await am({repoRoot:f})});if(m==="settings:get")return Z(i,{type:"settings",payload:ui()});if(m==="settings:set"){let g=qr({enabled:p.payload.autoSync,intervalMs:p.payload.autoSyncIntervalMs});return a(g)||o(),Z(i,{type:"settings",payload:a(g)?ui():g,lastAction:a(g)?{ok:!1,message:g.message}:{ok:!0,message:g.message}})}if(m==="commit:inspect")return Z(i,{type:"commit:inspect:result",payload:await ni({repoRoot:f,sha:p.payload.sha})});if(m==="commit:diff:get"){let{sha:g}=p.payload;return Z(i,{type:"commit:diff:result",payload:{sha:g,result:await Ud({repoRoot:f,sha:g})}})}if(m==="issue:commits:get"){let{issueId:g}=p.payload;return Z(i,{type:"issue:commits:result",payload:{issueId:g,result:Si(await Kn({repoRoot:f,ref:H(g)}))}})}if(m==="issue:squashed-diff:get"){let{issueId:g}=p.payload;return Z(i,{type:"issue:squashed-diff:result",payload:{issueId:g,result:await Hd({repoRoot:f,ref:H(g)})}})}if(m==="issue:stats:get"){let{issueId:g}=p.payload;return Z(i,{type:"issue:stats:result",payload:{issueId:g,result:await Hl({repoRoot:f,idOrRef:H(g)})}})}if(m==="diff-stats:get")return Z(i,{type:"diff-stats",payload:await Jb({repoRoot:f})});if(m==="swimlane:stats:get"){let{swimlaneId:g}=p.payload;return Z(i,{type:"swimlane:stats:result",payload:{swimlaneId:g,result:await ox({repoRoot:f,swimlaneId:g})}})}if(m==="time-travel:scrub"){let g=await wu({repoRoot:f,targetTime:p.payload.targetTime});return Z(i,{type:"time-travel:result",payload:g}),a(g)?void 0:hm()}if(m==="time-travel:checkout-event"){let g=await db({repoRoot:f,eventId:p.payload.eventId});return Z(i,{type:"time-travel:result",payload:g}),a(g)?void 0:hm()}if(m==="time-travel:live"){let g=await ub({repoRoot:f});return Z(i,{type:"time-travel:result",payload:g}),a(g)?void 0:hm()}if(m==="state:get")return Ai(i,f);if(m==="sync"){let g=await gi({repoRoot:f});return Z(i,{type:"sync:result",payload:g}),n(),Ai(i,f)}if(m==="issue:comment:add"){let g=await bi({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:comment:add:result",g)}if(m==="issue:comment:edit"){let g=await rm({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:comment:edit:result",g)}if(m==="issue:comment:delete"){let g=await xi({repoRoot:f,...p.payload});return Z(i,{type:"issue:comment:delete:result",payload:g}),a(g)?Z(i,{type:"failed",payload:g.message}):(n(),Ai(i,f))}if(m==="issue:edit:description"){let g=await Wu({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:edit:description:result",g)}if(m==="issue:edit:title"){let g=await Gu({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:edit:title:result",g)}if(m==="issue:tag:add"){let g=await Ju({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:tag:add:result",g)}if(m==="issue:tag:remove"){let g=await Zu({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:tag:remove:result",g)}if(m==="contributor:remove"){let g=await tm({repoRoot:f,...p.payload});return Ge(i,f,n,"contributor:remove:result",g)}if(m==="tag:remove"){let g=await Qu({repoRoot:f,...p.payload});return Ge(i,f,n,"tag:remove:result",g)}if(m==="contributors:get")return Z(i,{type:"contributors",boardId:p.payload?.boardId,payload:await nm({repoRoot:f,...p.payload})});if(m==="issue:assignee:add"){let g=await em({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:assignee:add:result",g)}if(m==="issue:assignee:remove"){let g=await om({repoRoot:f,...p.payload});return Ge(i,f,n,"issue:assignee:remove:result",g)}if(m==="issues:list")return Z(i,{type:"issues",payload:await Fu({repoRoot:f})});if(m==="issues:create"){let g=await _u({...p.payload,repoRoot:f});return Z(i,{type:"issues:create:result",payload:g}),a(g)?Uo({type:"failed",payload:g.message}):(n(),Ai(i,f))}if(m==="board:create"){let g=await Vu({...p.payload,repoRoot:f});return Ge(i,f,n,"board:create:result",g)}if(m==="board:edit:title"){let g=await zu({...p.payload,repoRoot:f});return Ge(i,f,n,"board:edit:title:result",g)}if(m==="swimlane:create"){let g=await Ku({...p.payload,repoRoot:f});return Ge(i,f,n,"swimlane:create:result",g)}if(m==="swimlane:edit:title"){let g=await qu({...p.payload,repoRoot:f});return Ge(i,f,n,"swimlane:edit:title:result",g)}if(m==="swimlane:delete"){let g=await Xu({...p.payload,repoRoot:f});return Ge(i,f,n,"swimlane:delete:result",g)}if(m==="swimlane:move"){if(!p.payload.position)return Z(i,{type:"error",message:"Missing move position"});let g=await Yu({...p.payload,repoRoot:f});return Ge(i,f,n,"swimlane:move:result",g)}if(m==="issues:move"){if(!p.payload.position)return Z(i,{type:"error",message:"Missing move position"});let g=await Uu({...p.payload,repoRoot:f});return Ge(i,f,n,"issues:move:result",g)}if(m==="issue:close"){let g=await ju({repoRoot:f,issueId:p.payload.issueId});return Ge(i,f,n,"issue:close:result",g)}if(m==="issue:reopen"){let g=await $u({repoRoot:f,issueId:p.payload.issueId});return Ge(i,f,n,"issue:reopen:result",g)}return Z(i,{type:"error",message:"Unknown message type"})};try{let p=lx(JSON.parse(c.toString()));if(!p.ok)return Z(i,{type:"error",message:p.error});let m=p.message;return rx.has(m.type)?await Pn(async()=>Je().mode!=="live"?Z(i,{type:"failed",payload:"Read-only while viewing history"}):d(m)):await d(m)}catch(p){return Z(i,{type:"error",message:p instanceof Error?p.message:String(p)})}})})};var KT=sr.dirname(zT(import.meta.url)),qT=process.env.IS_LOCAL==="true"?sr.resolve(process.cwd(),"dist/gui"):sr.join(KT,"gui"),Wl,YT=async()=>(Wl===void 0&&(Wl=await import("node:sea").catch(()=>null)),Wl?.isSea()?Wl:null),Pe=(e,t,n)=>{e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))},XT=e=>Pe(e,409,{isError:!0,message:"Read-only while viewing history"}),Gl=(e,t)=>Pn(async()=>Je().mode!=="live"?XT(e):t()),dx=async(e,t=1024*1024)=>new Promise((n,o)=>{let r=[],s=0;e.on("data",i=>{if(s+=i.length,s>t){e.destroy(),o(new Error("Request body too large"));return}r.push(i)}),e.on("end",()=>{let i=Buffer.concat(r).toString("utf8");try{n(i?JSON.parse(i):{})}catch{o(new Error("Invalid JSON body"))}}),e.on("error",o)}),JT=2*1024*1024,QT={png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp"},ZT=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",ux=new Map,eM=e=>`"${GT("sha1").update(e).digest("base64url")}"`,tM=async e=>{try{let{size:t,mtimeMs:n}=await WT(e);return`${t}:${n}`}catch{return null}},nM=e=>{try{return decodeURIComponent(e)}catch{return null}},mx=async(e,t,n)=>{let o=e==="/"?"/index.html":nM(e);if(o===null)return Pe(n,404,{isError:!0,message:"Not found"});let r=o.replace(/^\/+/,""),s=sr.resolve(qT),i=sr.resolve(s,r),c=sr.relative(s,i);if(c.startsWith("..")||sr.isAbsolute(c))return Pe(n,403,{isError:!0,message:"Forbidden"});let d=await YT(),p=d?"sea":await tM(i),m=p===null?void 0:ux.get(c),f=m&&m.stamp===p?m.etag:null;if(f&&t.headers["if-none-match"]===f)return n.writeHead(304,{etag:f,"cache-control":"no-cache"}),n.end();try{let g=d?Buffer.from(d.getAsset(`gui/${c}`)):await px(i),h=f??eM(g);return p!==null&&ux.set(c,{stamp:p,etag:h}),n.writeHead(200,{"content-type":ZT(i),etag:h,"cache-control":"no-cache"}),n.end(g)}catch{return Pe(n,404,{isError:!0,message:`Not found: ${r}`})}},oM=async(e,t=Ii)=>new Promise((n,o)=>{let r=s=>{let i=d=>{if(e.off("listening",c),d.code==="EADDRINUSE"&&s===t){e.removeListener("error",i),r(0);return}o(d)},c=()=>{e.off("error",i);let d=e.address();if(!d||typeof d=="string"){o(new Error("Unable to resolve address"));return}n(d.port)};e.once("error",i),e.once("listening",c),e.listen(s,"127.0.0.1")};r(t)}),fx=async e=>{Jv(!1);let t=0,n={repoRoot:e.repoRoot},o=VT.createServer((p,m)=>{r(p,m).catch(f=>(logger.error(`[gui] ${p.method} ${p.url}: ${f instanceof Error?f.message:String(f)}`),m.headersSent?m.end():Pe(m,500,{isError:!0,message:"Internal error"})))});async function r(p,m){let f=new URL(p.url??"/","http://127.0.0.1"),g=Pb({method:p.method,origin:p.headers.origin,contentType:p.headers["content-type"]},t);if(g)return Pe(m,g.status,{isError:!0,message:g.message});if(p.method==="GET"&&f.pathname===lm)return Pe(m,200,{app:cm,repoRoot:Fl(n.repoRoot),version:kt,pid:process.pid});if(f.pathname==="/api/state")return Pe(m,200,await qt({repoRoot:n.repoRoot}));if(p.method==="POST"&&f.pathname==="/api/comments")try{let h=await dx(p);if(!h.issueId||!h.body?.trim())return Pe(m,400,{isError:!0,message:"Missing issueId or body"});let x=h.issueId,b=h.body;return await Gl(m,async()=>{let R=await bi({repoRoot:n.repoRoot,issueId:x,body:b});return a(R)?Pe(m,400,{isError:!0,message:R.message}):Pe(m,200,await qt({repoRoot:n.repoRoot}))})}catch(h){return Pe(m,400,{isError:!0,message:h instanceof Error?h.message:"Unable to add comment"})}if(p.method==="POST"&&f.pathname==="/api/attachments")try{let h=await dx(p,JT);if(!h.issueId||!h.dataBase64)return Pe(m,400,{isError:!0,message:"Missing issueId or dataBase64"});let x=h.issueId,b=h.dataBase64,R=h.name??"";return await Gl(m,async()=>{let S=await Pu({repoRoot:n.repoRoot,issueId:x,name:R,dataBase64:b});return a(S)?Pe(m,400,{isError:!0,message:S.message}):Pe(m,200,{...await qt({repoRoot:n.repoRoot}),attachment:S.value})})}catch(h){return Pe(m,400,{isError:!0,message:h instanceof Error?h.message:"Unable to add attachment"})}if(p.method==="DELETE"&&f.pathname.startsWith("/api/attachments/")){let h=decodeURIComponent(f.pathname.replace("/api/attachments/",""));return h?Gl(m,async()=>{let x=await Lu({repoRoot:n.repoRoot,attachmentId:h});return a(x)?Pe(m,400,{isError:!0,message:x.message}):Pe(m,200,await qt({repoRoot:n.repoRoot}))}):Pe(m,400,{isError:!0,message:"Missing attachment id"})}if(p.method==="GET"&&f.pathname.startsWith("/media/")){let h=decodeURIComponent(f.pathname.replace("/media/","")),x=await ku({repoRoot:n.repoRoot,fileName:h});if(a(x))return Pe(m,404,{isError:!0,message:x.message});try{let b=await px(x.value.filePath);return m.writeHead(200,{"content-type":QT[x.value.ext]??"application/octet-stream","cache-control":"public, max-age=31536000, immutable"}),m.end(b)}catch{return Pe(m,404,{isError:!0,message:"Attachment blob not found"})}}if(p.method==="DELETE"&&f.pathname.startsWith("/api/comments/")){let h=decodeURIComponent(f.pathname.replace("/api/comments/",""));return h?Gl(m,async()=>{let x=await xi({repoRoot:n.repoRoot,commentId:h});return a(x)?Pe(m,400,{isError:!0,message:x.message}):Pe(m,200,await qt({repoRoot:n.repoRoot}))}):Pe(m,400,{isError:!0,message:"Missing comment id"})}return f.pathname.startsWith("/board/")||f.pathname==="/log"?mx("/",p,m):mx(f.pathname,p,m)}try{t=await oM(o)}catch(p){return l(p instanceof Error?`Unable to start GUI server: ${p.message}`:`Unable to start GUI server: ${String(p)}`)}let s=Tb({project:n}),i=Rb({project:n,publisher:s}),c=Mb(s);cx(o,n,{onStateChanged:()=>i.queueSync(),onSyncSettingsChanged:()=>i.reschedule(),getPort:()=>t}),o.on("close",()=>{i.dispose(),c()});let d=o.address();return!d||typeof d=="string"?(o.close(),l("Unable to resolve GUI server address")):u("Started GUI server",{url:`http://epiq.localhost:${d.port}${e.boardId?`/board/${e.boardId}`:""}`,server:o})};var gx=async e=>{let t=c=>{e.open!==!1&&Sp()&&Rp(c)},n=dr({});if(a(n))return l(n.message);let o=ht();ve(o)&&je(o.value);let r=await Sb(Ii);if(r&&r.repoRoot===Fl(e.repoRoot)){let c=`http://127.0.0.1:${Ii}`;return console.log($c({url:c,repoRoot:e.repoRoot,version:kt,reused:!0})),t(c),u("Reused running GUI",{url:c})}let s=await fx({repoRoot:e.repoRoot,boardId:""});if(a(s))return s;let{url:i}=s.value;return console.log($c({url:i,repoRoot:e.repoRoot,version:kt,reused:!1})),t(i),u("Started GUI",{url:i})};import{Box as Jn}from"ink";import Te from"react";import{Box as ym,Text as wi}from"ink";import pn,{useEffect as rM,useMemo as sM}from"react";import{ulid as iM}from"ulid";var hx=({text:e,match:t,color:n,highlightColor:o=y.secondary,dimColor:r=!1})=>{if(!t)return pn.createElement(wi,{color:n,dimColor:r},e);let s=e.toLowerCase(),i=t.toLowerCase(),c=s.indexOf(i);return c===-1?pn.createElement(wi,{color:n,dimColor:r},e):pn.createElement(wi,{color:n,dimColor:r},e.slice(0,c),pn.createElement(wi,{backgroundColor:o,bold:!0},e.slice(c,c+t.length)),e.slice(c+t.length))},yx=iM(),aM=e=>`${e}`,lM=e=>{let{pendingNavTarget:t}=bo();if(!t)return[];let{breadCrumb:n,contextNode:o,selectedNode:r}=t,s=new Set(Be(C.NONE,{breadCrumb:n,contextNode:o,readOnly:v().readOnly,selectedNode:r}));return[...new Set(Object.values(C))].filter(i=>i!=="move").filter(i=>i.length>0).filter(i=>i!==C.PALETTE).map(i=>{let c=Va(i),d=El.find(p=>p.intent===c);return{command:i,description:d?.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))},cM=e=>Re.text({id:yx,parentNodeId:e,rank:"000000",name:"Command Palette",readonly:!0,isVirtual:!0}),dM=(e,t,n)=>Re.text({id:aM(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,disabled:!e.isAvailable,readonly:!0,isVirtual:!0}),vm=[],uM=e=>{vx();let t=N.createNode(cM(v().rootNodeId));a(t)||!oo(t.value)||(vm=[t.value,...e.map((n,o)=>dM(n,o,yx)).map(N.createNode).filter(ve).map(({value:n})=>n).filter(oo)],$.navigate({contextNode:t.value,selectedIndex:0}))},vx=()=>{let e=vm.map(t=>t.id);vm=[];for(let t of e)N.deleteNode(t)};function bx({width:e,height:t}){let o=Of().value.trim().toLowerCase(),r=sM(()=>lM(o),[o]);rM(()=>(uM(r),()=>{vx()}),[r]);let s=v().selectedIndex;return pn.createElement(ym,{flexDirection:"column",width:e,height:t-2},pn.createElement(ut,{height:t-4,itemHeight:3,selectedIndex:s},r.map((i,c)=>{let d=c===s,p=i.isAvailable?y.accent:y.secondary2,m=i.isAvailable?"":"[unavailable] ";return pn.createElement(ym,{key:i.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:y.secondary,borderStyle:"single"},pn.createElement(wi,{color:p,dimColor:!i.isAvailable},d?"\u276F ":" ",pn.createElement(hx,{text:Dp(i.command),match:o,color:p,dimColor:!i.isAvailable})),pn.createElement(ym,{paddingLeft:2},pn.createElement(hx,{text:m+i.description,match:o.length>=2?o:"",color:d&&i.isAvailable?y.primary:y.secondary2,dimColor:!i.isAvailable})))})))}import{Box as NM}from"ink";import Kl from"react";import Mi from"chalk";import{Box as Ti,Text as Sx}from"ink";import ir,{useEffect as Rx,useMemo as mM,useState as Cx}from"react";var es=["\u2803","\u2806","\u2830","\u2818"],xx=120,Ix=({isPalette:e,isPending:t,frame:n})=>{if(t){let o=(n%es.length+es.length)%es.length;return es[o]}return e?"?":":"},Ex=({infoMessage:e,isPending:t})=>t&&e.includes(fe)?"":e;var Nx=Mi.hex(y.secondary),pM=Mi.inverse,fM=Mi.inverse.hex(y.secondary2),gM={hint:"",hints:[],overlap:0,remainder:""},wx=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),r=e.length-n.length;return e.slice(r,r+t.length)!==t?null:{start:r,end:r+t.length}},hM=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ze(t);return{bg:o=>Mi.bgHex(n).black(o),bgCursor:o=>Mi.bgHex(n).inverse.black(o)}}return jc(t)},yM=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let o=wx({value:e,command:t});if(!o)return null;let s=e.slice(o.end).match(/^\s*/)?.[0].length??0,i=o.end+s;return e.slice(i,i+n.length)!==n?null:{start:i,end:i+n.length}},Ax=()=>({value:ct.value,cursorPosition:ct.cursorPosition,commandIsPending:ct.commandIsPending,autoCompletion:ct.commandMeta.autoCompletion??gM,infoMessage:ct.commandMeta.infoMessage,validationStatus:ct.commandMeta.validity,command:ct.commandMeta.command,inputString:ct.commandMeta.inputString,modifier:ct.commandMeta.modifier}),vM=(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,Tx=({width:e,mode:t})=>{let[n,o]=Cx(Ax());Rx(()=>{let A=()=>{let P=Ax();o(M=>vM(M,P)?M:P)},w=nd(A);return A(),()=>{w()}},[]);let{value:r,cursorPosition:s,infoMessage:i,commandIsPending:c,autoCompletion:d,command:p,modifier:m,validationStatus:f}=n,g=c&&f===En.Invalid,h=Ex({infoMessage:i,isPending:c}),[x,b]=Cx(0);Rx(()=>{if(!c){b(0);return}let A=setInterval(()=>{b(w=>(w+1)%es.length)},xx);return()=>{clearInterval(A)}},[c]);let R=Ix({isPalette:t===I.PALETTE,isPending:c,frame:x}),S=mM(()=>{let A=Math.max(0,Math.min(s,r.length)),w=wx({value:r,command:p}),P=yM({value:r,command:p,modifier:m}),M=p?jc(p):null,O=hM({command:p,modifier:m}),W=(st,ft)=>{let lr=w&&ft>=w.start&&ft<w.end,dc=P&&ft>=P.start&&ft<P.end;return lr&&M?M.fg(st):dc&&O?O.bg(st):st},Y=(st,ft)=>{let lr=w&&ft>=w.start&&ft<w.end,dc=P&&ft>=P.start&&ft<P.end;return lr&&M?M.fgCursor(st):dc&&O?O.bgCursor(st):pM(st)},xe=r.slice(0,A),F=r[A]??" ",X=A<r.length?r.slice(A+1):"",Ve=Array.from(xe).map((st,ft)=>W(st,ft)).join(""),Qn=Y(F,A),is=Array.from(X).map((st,ft)=>W(st,A+1+ft)).join("");if(d.hint){let st=d.hint[d.overlap]??F;Qn=fM(st),is=Nx(d.remainder.slice(1)+X)}return Ve+Qn+is},[r,s,d,p,m]);return ir.createElement(Ti,{flexDirection:"column",justifyContent:"flex-start"},ir.createElement(Ti,{flexDirection:"column",paddingX:1,borderColor:y.secondary,borderStyle:"round",width:e},ir.createElement(Ti,{height:1,flexWrap:"nowrap"},ir.createElement(Ti,{flexShrink:0},ir.createElement(Sx,{wrap:"truncate-start"},Nx(R),S)),h&&ir.createElement(Ti,{flexShrink:1,minWidth:0},ir.createElement(Sx,{wrap:"truncate",color:g?y.red:y.secondary2},` ${h} `)))))};import{Box as bM,Text as Pi}from"ink";import ts from"react";var Mx=" ",xM=({keys:e,label:t})=>e.length+1+t.length,IM=(e,t)=>{let n=[],o=0;for(let r of e){let i=(n.length>0?Mx.length:0)+xM(r);if(o+i>t-4)break;n.push(r),o+=i}return n},Px=({width:e,availableHints:t})=>{let n=IM(t,e);return ts.createElement(bM,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1},n.length?ts.createElement(Pi,{wrap:"truncate"},n.map(({keys:r,label:s},i)=>ts.createElement(Pi,{key:`${r}-${s}`},i>0?Mx:"",ts.createElement(Pi,{color:y.accent},r),ts.createElement(Pi,{color:y.secondary2}," ",s)))):ts.createElement(Pi,{color:y.secondary2},"\xA0"))};import{Box as EM,Text as Vl}from"ink";import Li,{useEffect as SM,useRef as ns,useState as RM}from"react";var CM=40,zl=.3,bm="\u2500",Lx=1,kx=16,Dx=({width:e})=>{let{replay:t}=ne(),n=t!==null,o=t?Math.min(1,Math.max(0,t.progress)):0,s=Math.max(4,e-6),i=s*Lx,[c,d]=RM(0),p=ns(o);p.current=o;let m=ns(0),f=ns(0),g=ns(0),h=ns(0),x=ns(0);if(SM(()=>{if(!n){m.current=0,g.current=0,h.current=0,x.current=0,d(0);return}m.current=p.current,f.current=Date.now(),g.current=p.current;let w=setInterval(()=>{let P=Date.now(),M=p.current;if(M!==g.current){let F=M-g.current,X=P-f.current;if(F<0)h.current=0,x.current=0;else if(F>0&&X>0){let Ve=F/X;h.current=h.current===0?Ve:h.current*(1-zl)+Ve*zl,x.current=x.current===0?F:x.current*(1-zl)+F*zl}m.current=M,f.current=P,g.current=M}let O=P-f.current,W=Math.min(x.current,h.current*O),Y=Math.min(1,m.current+W),xe=Math.round(Y*i);d(F=>F===xe?F:xe)},CM);return()=>clearInterval(w)},[n,i]),!t)return null;let b=w=>{let P=s>1?w/(s-1):0,M=Math.round(P*(kx-1))/(kx-1);return Xi(M)},R=Math.min(s,Math.floor(c/Lx)),S=[];for(let w=0;w<R;w++){let P=b(w),M=S[S.length-1];M&&M.color===P?M.text+=bm:S.push({text:bm,color:P})}let A=bm.repeat(Math.max(0,s-R));return Li.createElement(EM,{width:e,borderStyle:"round",borderColor:y.secondary,paddingX:1,columnGap:1},Li.createElement(Vl,{color:y.secondary2},"\u25B6"),Li.createElement(Vl,null,S.map((w,P)=>Li.createElement(Vl,{key:P,color:w.color},w.text)),Li.createElement(Vl,{color:y.secondary,dimColor:!0},A)))};var ki=({width:e,mode:t,availableHints:n})=>{let{timeMode:o}=ne(),r=t===I.COMMAND_LINE||t===I.PALETTE;return Kl.createElement(NM,null,r?Kl.createElement(Tx,{width:e,mode:t}):o==="replay"?Kl.createElement(Dx,{width:e}):Kl.createElement(Px,{width:e,mode:t,availableHints:n}))};import{Box as wo,Text as os}from"ink";import bt,{useEffect as AM,useMemo as wM}from"react";import{ulid as Bx}from"ulid";var Yl=Bx(),TM=()=>[...new Set([...v().availableActions].map(e=>e.description).filter(e=>e!==void 0))].map(bu).filter(e=>e!==null).sort(({keys:e},{keys:t})=>e.length===1&&t.length!==1?-1:e.length!==1&&t.length===1?1:e.localeCompare(t,void 0,{sensitivity:"base"})).map(({keys:e,label:t})=>({keys:e,action:t})),MM=e=>Re.text({id:Yl,parentNodeId:e,rank:"000000",name:"Help",isVirtual:!0,readonly:!0}),PM=(e,t,n)=>Re.text({id:Bx(),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.keys,readonly:!0,isVirtual:!0}),ql=[],Ox=()=>{let e=ql.filter(n=>n.id!==Yl).map(n=>n.id),t=ql.filter(n=>n.id===Yl).map(n=>n.id);ql=[];for(let n of[...e,...t])N.deleteNode(n)},LM=e=>{Ox();let t=N.createNode(MM(v().rootNodeId));if(a(t)||!oo(t.value))return logger.error("Could not attach help nodes");ql=[t.value,...e.map((n,o)=>PM(n,o,Yl)).map(N.createNode).filter(ve).map(({value:n})=>n).filter(oo)],$.navigate({contextNode:t.value,selectedIndex:0})},Fx=({width:e,height:t})=>{let n=wM(()=>TM(),[]);AM(()=>(LM(n),()=>{Ox()}),[n]);let o=v().selectedIndex;return bt.createElement(wo,{flexDirection:"column",marginTop:3,borderColor:y.secondary,borderStyle:"round",width:e,height:t-2},bt.createElement(wo,{paddingX:1,justifyContent:"center"},bt.createElement(os,{color:y.accent},"Help"),bt.createElement(os,{dimColor:!0}," \u2014 navigate with arrows/hjkl, press q to close")),bt.createElement(wo,{paddingX:1,marginTop:1},bt.createElement(wo,{width:20,justifyContent:"flex-end"},bt.createElement(os,{color:y.secondary},"Key(s)")),bt.createElement(wo,{flexGrow:1,width:40,paddingLeft:2},bt.createElement(os,{color:y.secondary},"Action"))),bt.createElement(ut,{height:t-7,itemHeight:1,selectedIndex:o},n.map(({keys:r,action:s},i)=>{let c=i===o;return bt.createElement(wo,{paddingX:1,key:`${r}-${s}-${i}`,flexDirection:"row"},bt.createElement(wo,{width:20,justifyContent:"flex-end"},bt.createElement(os,{color:y.accent},r)),bt.createElement(wo,{flexGrow:1,width:40,paddingLeft:2},bt.createElement(os,{color:c?y.primary:y.secondary2},s)))})))};import{Box as rs,Text as xt}from"ink";import Ae,{useEffect as kM,useState as xm}from"react";var Xl=({index:e,email:t,note:n,noteColor:o})=>Ae.createElement(rs,null,Ae.createElement(xt,{color:y.accent},e===void 0?" ":` ${e}.`),Ae.createElement(xt,null," ",t),n&&Ae.createElement(xt,{color:o??y.secondary2},` ${n}`)),_x=({height:e})=>{let[t,n]=xm([]),[o,r]=xm([]),[s,i]=xm(null),{userName:c,gitEmail:d,gitName:p,userId:m}=V();return kM(()=>{let f=!0;return(async()=>{let h=de(),x=oe(process.cwd());if(a(h)||a(x)||!m)return;let b=h.value.emailLinks,R=yn(b,m);n(R.map(P=>({email:P,others:Es(b,P).filter(M=>M!==m).map(M=>h.value.contributors[M]?.name??M)})));let S=ke(x.value),A=await Mn({repoRoot:x.value,stateBranch:a(S)?void 0:S.value,names:[c,p],links:b});if(!f)return;if(a(A)){i(A.message);return}let w=Io(A.value);Sr(w.map(P=>P.email)),r(w)})(),()=>{f=!1}},[m,c,p,d]),Ae.createElement(rs,{height:e-4,flexDirection:"column",paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},Ae.createElement(rs,null,Ae.createElement(xt,{color:y.accent,bold:!0},c??"Not configured"),Ae.createElement(xt,{color:y.secondary2}," on this board")),s&&Ae.createElement(xt,{color:y.red},s),Ae.createElement(rs,{flexDirection:"column"},Ae.createElement(xt,{color:y.secondary2},"CLAIMED"),t.length===0?Ae.createElement(Xl,{email:"Nothing claimed \u2014 your commits show the name git signed them with.",note:""}):t.map(f=>Ae.createElement(Xl,{key:f.email,email:f.email,note:f.others.length>0?`CONTESTED: also ${f.others.join(", ")}, resolves to nobody`:f.email===d?"your git identity here":void 0,noteColor:f.others.length>0?y.yellow:void 0}))),Ae.createElement(rs,{flexDirection:"column"},Ae.createElement(xt,{color:y.secondary2},"UNCLAIMED IN THIS HISTORY"),o.length===0?Ae.createElement(Xl,{email:"Nothing left to claim here."}):o.map(f=>Ae.createElement(Xl,{key:f.email,email:f.email,note:`${f.commits} commit${f.commits===1?"":"s"} as ${f.names.join(", ")||"unknown"}`}))),Ae.createElement(rs,{flexDirection:"column"},Ae.createElement(xt,{color:y.secondary2},Ae.createElement(xt,{color:y.accent},"[enter]")," writes a claim for the first into the command line, to confirm or change."),Ae.createElement(xt,{color:y.secondary2},Ae.createElement(xt,{color:y.accent},":config emails")," claims by address,",Ae.createElement(xt,{color:y.accent}," :config emails-unclaim "),"gives one back."),Ae.createElement(xt,{color:y.secondary2},Ae.createElement(xt,{color:y.accent},"[esc]")," to close")))};import DM from"chalk";import{Box as ar,Text as ot}from"ink";import we from"react";var BM=8,OM=()=>{let e=$n({exclude:process.cwd()});return a(e)?[]:e.value.slice(0,BM)},jx=({width:e,height:t})=>{let n=OM();return we.createElement(ar,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},we.createElement(ot,{color:y.accent,bold:!0},"Initialize project"),we.createElement(ot,null,`This folder is not an ${DM.hex(y.accent)("epiq")} project yet.`),we.createElement(ot,{color:y.primary},"To start tracking issues here, we need to initialize a new",we.createElement(ot,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json "),"file in this repository."),we.createElement(ar,{marginTop:1,flexDirection:"column"},we.createElement(ar,null,we.createElement(ot,{color:y.accent}," "),we.createElement(ot,{color:y.primary},"Type "),we.createElement(ot,{backgroundColor:y.secondary}," :init "))),we.createElement(ar,{marginTop:1},we.createElement(ot,{color:y.secondary2},"This will create, commit and push "),we.createElement(ot,{color:y.primary,backgroundColor:y.secondary}," .epiq/project.json ")),n.length>0&&we.createElement(ar,{marginTop:1,flexDirection:"column"},we.createElement(ot,{color:y.accent,bold:!0},"Or open a recent project"),n.map((o,r)=>we.createElement(ar,{key:o.projectId},we.createElement(ot,{color:y.accent},` ${r+1} `),we.createElement(ot,{color:y.primary},Er(o.root)),we.createElement(ot,{color:y.secondary2},` ${o.root}`))),we.createElement(ar,{marginTop:1},we.createElement(ot,{color:y.accent}," "),we.createElement(ot,{color:y.primary},"Type "),we.createElement(ot,{backgroundColor:y.secondary}," :open 1 "),we.createElement(ot,{color:y.secondary2}," or "),we.createElement(ot,{backgroundColor:y.secondary}," :open <path> "))))};import{Box as Ql,Text as jt}from"ink";import _e from"react";import{Box as Jl,Text as Xn}from"ink";import _t,{useEffect as FM,useState as $x}from"react";var Ux=()=>{let[e,t]=$x(null),[n,o]=$x(null);return FM(()=>{let r=!0;return(async()=>{let i=de(),c=oe(process.cwd());if(a(i)||a(c))return;let d=ke(c.value),{userName:p,gitName:m}=V(),f=await Mn({repoRoot:c.value,stateBranch:a(d)?void 0:d.value,names:[p,m],links:i.value.emailLinks});if(!r)return;if(a(f)){o(f.message);return}let g=Io(f.value);Sr(g.map(h=>h.email)),t(g)})(),()=>{r=!1}},[]),n?_t.createElement(Jl,{marginTop:1},_t.createElement(Xn,{color:y.red},n)):e===null?null:e.length===0?_t.createElement(Jl,{marginTop:1},_t.createElement(Xn,{color:y.secondary2},"No unclaimed addresses in this history \u2014 type",_t.createElement(Xn,{color:y.accent}," :config emails none "),"to move on.")):_t.createElement(Jl,{flexDirection:"column",marginTop:1},e.map(r=>_t.createElement(Xn,{key:r.email},_t.createElement(Xn,{color:y.accent}," \xB7 "),_t.createElement(Xn,null,r.email),_t.createElement(Xn,{color:y.secondary2},` ${r.commits} commit${r.commits===1?"":"s"} as ${r.names.join(", ")||"unknown"}`))),_t.createElement(Jl,{marginTop:1},_t.createElement(Xn,{color:y.secondary2},"Claim yours by address, or",_t.createElement(Xn,{color:y.accent}," none "),"to skip.")))};var _M=({isDone:e,command:t,value:n,verb:o="Type",hint:r})=>_e.createElement(Ql,null,_e.createElement(jt,{color:y.accent,dimColor:e},e?" \u2714 ":" "),_e.createElement(jt,{dimColor:e},o," "),_e.createElement(jt,{backgroundColor:y.secondary,dimColor:e}," "+t+" "),n!==void 0&&_e.createElement(_e.Fragment,null,_e.createElement(jt,{dimColor:e}," "),_e.createElement(jt,{color:y.secondary,dimColor:e},"<"+n+">")),r),jM=(e,t)=>e.length===0?void 0:jn(e.join(", "),Math.max(12,t-34)),$M=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"on":"off"};function Im({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:o,userName:r,preferredEditor:s,autoSync:i,isSetAutoSync:c,isSetEmails:d,claimedEmails:p,emailSetupDeclined:m}=Un(),f=[{key:"username",done:o,command:":config username",value:r,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:s,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:i,message:"Almost there. Configure auto sync."},{key:"emails",done:d,command:":config emails",value:m?"declined":jM(p,e),message:"Last one. Claim the git addresses whose commits are yours, so the board calls them by your name."}],g=f.findIndex(x=>!x.done),h=g===-1?void 0:f[g];return _e.createElement(Ql,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:y.secondary,rowGap:1},_e.createElement(jt,{color:y.accent,bold:!0},"Welcome! \u{1F539}"),_e.createElement(jt,null,"Let's get you started - it's a breeze."),_e.createElement(jt,{color:y.secondary2},"Remember - you can always search available commands by typing:",_e.createElement(jt,{color:y.accent}," ? ")),h&&_e.createElement(jt,{color:y.secondary2},h.message),_e.createElement(Ql,{flexDirection:"column"},f.map((x,b)=>{if(!(g===-1||b<=g))return null;let S=b===g,A=S&&g===0;return _e.createElement(Ql,{key:x.key,flexDirection:"column",marginBottom:1},_e.createElement(_M,{isDone:x.done,command:A?":config us":x.command,value:x.done?$M(x.value):void 0,verb:S&&!A?"Waiting:":"Type",hint:A?_e.createElement(jt,{color:y.secondary2}," then ",_e.createElement(jt,{color:y.accent},"tab")," to auto-complete ",_e.createElement(jt,{backgroundColor:y.secondary},` ${x.command.split(" ").pop()} `)):void 0}),x.key==="emails"&&!x.done&&_e.createElement(Ux,null))})))}import oc from"chalk";import{Box as Bi,Text as ss}from"ink";import Qe from"react";import{Box as Zl,Text as Hx}from"ink";import To from"react";import UM from"chalk";var HM=e=>(N.getTag(e)?.name??"").length+3,WM=e=>{let t=N.getContributor(e);return(t?t.name:"").length+3},Wx=({width:e})=>{let{viewMode:t}=V(),n=ne(),{breadCrumb:o,contextNode:r,selectedIndex:s,renderedChildrenIndex:i}=n,c=i[r.id]?.[s],d=wt(c?.id??r.id,"TICKET"),p=ve(d)?d.value:void 0,m=(p?.props.tags??[]).filter(M=>N.getTag(M)),f=p?.props.assignees??[],g=p?.parentNodeId?!Ru(r.id,p.parentNodeId)&&t==="dense":!1,h=o.map((M,O)=>{let W=O===o.length-1,Y=be(M.id),xe=W?Y?.[s]?.title:void 0;return`${O?" / ":""}${M.title??""}${xe?` \u25B8 ${xe}`:""}`}).join(""),x=p?N.getCommentsByIssue(p.id):[],b=x.length?String(x.length).length+11:0,R=g?m.reduce((M,O)=>M+HM(O),0)+f.reduce((M,O)=>M+WM(O),0)+b:0,S=c?.id!=null&&!(t==="wide"&&_(c)),A=Math.max(0,e-R),w=h.substring(0,A)+(S?UM.hex(y.secondary2).dim(` ${H(c.id)}`):""),P=g?[...m.map(M=>To.createElement(Zl,{key:`tag-${M}`,paddingLeft:1},To.createElement(Dr,{id:M}))),...f.map(M=>To.createElement(Zl,{key:`assignee-${M}`,paddingLeft:1},To.createElement(po,{id:M}))),x.length?To.createElement(Zl,{key:"comments",paddingLeft:1},To.createElement(Hx,{color:y.accent},"[",x.length," comment",x.length===1?"":"s","]")):null]:[];return To.createElement(Zl,{overflow:"hidden",justifyContent:"flex-start",alignItems:"flex-start"},To.createElement(Hx,{color:y.secondary2},w),P)};import{Box as GM,Text as Gx}from"ink";import ec from"react";var VM=({filters:e})=>ec.createElement(GM,{columnGap:1},ec.createElement(Gx,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:o})=>ec.createElement(Gx,{backgroundColor:"black",color:"white"},` ${n}${o}"${t}" `))),Vx=ec.memo(VM);import{Box as zM,Text as tc}from"ink";import Di from"react";function zx(){let{eventLog:e,unappliedEvents:t}=ne(),n=e.at(-1)?.id,o=br(n??""),r=ve(o)?Xa(o.value):"INVALID DATE";return Di.createElement(zM,{paddingLeft:1},Di.createElement(tc,{backgroundColor:y.accent,color:y.secondary}," Readonly "),Di.createElement(tc,{color:y.accent}," "+t.length+" edits ago at "+r+"."),Di.createElement(tc,{color:y.accent}," Resume with "),Di.createElement(tc,{backgroundColor:y.accent,color:y.secondary}," ",":peek now"," "))}import{Box as KM,Text as Em}from"ink";import nc from"react";function Kx(){let{replay:e}=ne();if(!e)return null;let{appliedCount:t,totalCount:n,currentTime:o}=e;return nc.createElement(KM,{paddingRight:2,columnGap:1,justifyContent:"flex-end"},nc.createElement(Em,{backgroundColor:y.accent,color:y.secondary}," \u25B6 REPLAY "),nc.createElement(Em,{color:y.secondary2},Xa(new Date(o))),nc.createElement(Em,{color:y.accent},`${t}/${n} edits`))}import Sm from"chalk";import{Box as qM,Text as qx}from"ink";import Rm,{useEffect as YM,useState as XM}from"react";var JM=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],QM=150,Yx=12,ZM=.36;function Xx({syncStatus:e,autoSync:t}){let[n,o]=XM(0);YM(()=>{if(e.status!=="syncing"){o(0);return}let c=0,d=setInterval(()=>{c+=1;let p=(Math.sin(c*ZM)+1)/2,m=Math.round(p*(Yx-1));o(f=>f===m?f:m)},QM);return()=>clearInterval(d)},[e.status]);let r={synced:" ",failed:"---",offline:"off",syncing:"...",pending:"idle"},i={synced:y.secondary2,failed:y.yellow,offline:y.secondary2,pending:y.secondary2,syncing:vp(JM,n/(Yx-1))??""}[e.status];return Rm.createElement(qM,null,Rm.createElement(qx,null,Sm.hex(y.secondary2).dim(t?"Sync (auto): ":"Sync: ")),Rm.createElement(qx,null,Sm.hex(i)("\u25CF")+Sm.hex(y.secondary2).dim(` ${r[e.status].padEnd(4)} `)))}import tI from"chalk";import{Text as nI}from"ink";import oI,{useEffect as oP,useState as rP}from"react";import Cm from"chalk";var eP="https://registry.npmjs.org/epiq/latest",Nm=null,Jx=0,tP=1e3*60*60*24,Qx=e=>e.replace(/^v/,""),nP=(e,t)=>{let n=Qx(e).split(".").map(Number),o=Qx(t).split(".").map(Number);for(let r=0;r<Math.max(n.length,o.length);r++){let s=n[r]??0,i=o[r]??0;if(s>i)return 1;if(s<i)return-1}return 0},Zx=async e=>{if(process.env.IS_CI==="true")return{current:"1.2.3",latest:"1.2.3",updateAvailable:!1};if(Nm&&Date.now()-Jx<tP)return Nm;try{let t=await fetch(eP);if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.status}`);let o=(await t.json()).version??null,r={current:e,latest:o,updateAvailable:o?nP(o,e)>0:!1};return Nm=r,Jx=Date.now(),r}catch{return{current:e,latest:null,updateAvailable:!1}}},eI=(e,t)=>{let n=e.split("."),o=t.split("."),r=o.findIndex((s,i)=>s!=n[i]);return o.map((s,i)=>i>=r?Cm.hex(y.accent).dim(s):Cm.hex(y.secondary).dim(s)).join(Cm.hex(y.secondary2).dim("."))};function rI(){let[e,t]=rP({current:kt,latest:null,updateAvailable:!1});return oP(()=>{let n=!0;return Zx(kt).then(o=>{n&&t(o)}),()=>{n=!1}},[]),!e.updateAvailable||!e.latest?oI.createElement(nI,{dimColor:!0,color:y.secondary2},kt+" "):oI.createElement(nI,null,tI.hex(y.secondary2).dim(kt),tI.hex(y.accent).dim(" \u2197 "),eI(kt,e.latest))}function Oi({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,syncStatus:o,mode:r,replay:s}=ne(),{userName:i,preferredEditor:c,autoSync:d}=V(),p=64,m=process.stdout.columns-p-8,f=t||n==="replay",g=s?_n(s.currentLabel,Math.max(0,m)):"";return Qe.createElement(Bi,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},n==="replay"?Qe.createElement(Bi,{paddingLeft:1},Qe.createElement(ss,{color:y.secondary2},g)):f?Qe.createElement(ss,null," "):r===I.PALETTE?Qe.createElement(Bi,null,Qe.createElement(ss,{color:y.accent},"Command Palette"),Qe.createElement(ss,{dimColor:!0,color:y.secondary2}," ","- search, select and press enter")):Qe.createElement(Bi,{paddingLeft:1},e.length>0?Qe.createElement(Vx,{filters:e}):Qe.createElement(Wx,{width:m})),n==="live"?Qe.createElement(Bi,{columnGap:1,paddingRight:2,"max-width":p,overflow:"hidden",justifyContent:"flex-end"},Qe.createElement(Xx,{autoSync:!!d,syncStatus:o}),Qe.createElement(ss,null,oc.hex(y.secondary2).dim("Mode: ")+oc.hex(y.secondary2).dim(r.padEnd(8," "))," "),Qe.createElement(sI,{icon:"@",value:i}),Qe.createElement(sI,{icon:"\u276F",value:c}),Qe.createElement(rI,null)):"",n==="peek"?Qe.createElement(zx,null):"",n==="replay"?Qe.createElement(Kx,null):"")}function sI({icon:e,value:t}){return Qe.createElement(ss,null,oc.dim(e)+oc.hex(y.accent)(` ${t??"-"} `))}import{Box as sP,Text as iP}from"ink";import Fi from"react";import{Box as rc,Text as Am}from"ink";import Mo from"react";function wm(){let e=ne(),t=e.nodes[e.rootNodeId],r=process.stdout.rows-1-3,s=process.stdout.columns||120,i=t?.id?le(t?.id):[];return Mo.createElement(rc,{flexDirection:"column",height:r,padding:1,borderStyle:"round",borderColor:y.secondary,width:s},Mo.createElement(rc,{padding:1,paddingTop:0,paddingBottom:0},Mo.createElement(Am,null,"Select a board:")),Mo.createElement(rc,{padding:1,flexDirection:"column"},i.map((c,d)=>{let p=e.contextNode.context==="WORKSPACE"&&e.selectedIndex===d,f=le(c.id).flatMap(({id:g})=>be(g)).length;return Mo.createElement(rc,{key:c.id??d},Mo.createElement(Am,{color:p?y.accent:y.secondary2},Mo.createElement(Ct,{isSelected:p})),Mo.createElement(Am,{color:p?y.accent:y.secondary2},c.title," (",f," issues)",c.readonly?" \u{1F512}":""))})))}var aP=({contextNode:e,selectedIndex:t,breadCrumb:n,mode:o,viewMode:r,height:s,width:i})=>{let{renderedChildrenIndex:c}=ne(),d=n.find(({context:g})=>g==="BOARD"),f=s-1-3;return Fi.createElement(sP,{flexDirection:"row"},e.context==="WORKSPACE"?Fi.createElement(wm,null):d?Fi.createElement(cl,{height:f,width:i,swimlanes:(c[d.id]??[]).filter(g=>g!==void 0&&vn(g)),contextNode:e,selectedIndex:t,breadCrumb:n,viewMode:r,mode:o}):Fi.createElement(iP,null))},iI=Fi.memo(aP);import{useEffect as lP}from"react";var cP=e=>{lP(()=>{if(!e)return;let t,n=!1,o=()=>{if(n)return;let{autoSyncIntervalMs:r,userName:s,preferredEditor:i}=V();i&&s&&r&&(t=setTimeout(()=>{if(n)return;let{readOnly:c,mode:d}=v();d==="default"&&!c&&Ga(),o()},r))};return o(),()=>{n=!0,t&&clearTimeout(t)}},[e])},aI=({autoSync:e})=>(cP(e),null);import{useEffect as dP}from"react";var lI=()=>{let e=oe(process.cwd());return a(e)?u("No project here",null):me({repoRoot:e.value})},cI=async()=>{let e=lI();if(a(e))return l(e.message);if(e.value===null)return u("No project here",null);let t=e.value,n=await $a(t);if(!Rt())return u("State not initialized",null);let o=de();if(a(o))return u("State not initialized",null);let{mode:r,readOnly:s,timeMode:i,syncStatus:c,selectedNode:d,contextNode:p}=o.value;if(Ky())return u("Project loading",null);let m=lI();return a(m)||m.value!==t?u("Project changed",null):r!==I.DEFAULT||s||i!=="live"?u("Skipped while not on the live board",null):d?.isVirtual||p?.isVirtual?u("Skipped on a virtual node",null):c?.status==="syncing"?u("Sync in progress",null):n?u("Worktree held by a sync",null):et(t)===ha(t)?u("Log unchanged",null):(ee.debug("[watch] event log moved, reloading state"),qs(t))};var uP=1e3,dI=()=>(dP(()=>_l(cI,uP),[]),null);function Tm({width:e,height:t}){let n=ne(),{autoSync:o,viewMode:r}=fp(),s=n.filters;if(n.mode===I.HELP)return Te.createElement(Jn,{flexDirection:"column"},Te.createElement(Fx,{width:e,height:t}));if(n.mode===I.IDENTITY)return Te.createElement(Jn,{flexDirection:"column"},Te.createElement(_x,{width:e,height:t}));if(n.mode===I.PALETTE)return Te.createElement(Jn,{flexDirection:"column"},Te.createElement(Oi,{filters:s}),Te.createElement(bx,{width:e,height:t-2}),Te.createElement(ki,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:i}=Un(),c=!i,d=i&&!n.hasProjectDefinition;if(c)return Te.createElement(Jn,{flexDirection:"column"},Te.createElement(Jn,{flexDirection:"column"},Te.createElement(Oi,{hideBreadCrumb:!0,filters:s}),Te.createElement(Im,{height:t,width:e})),Te.createElement(ki,{width:e,mode:n.mode,availableHints:[]}));if(d)return Te.createElement(Jn,{flexDirection:"column"},Te.createElement(Jn,{flexDirection:"column"},Te.createElement(Oi,{hideBreadCrumb:!0,filters:s}),Te.createElement(jx,{height:t,width:e})),Te.createElement(ki,{width:e,mode:n.mode,availableHints:[]}));let p=yt(n.breadCrumb??[],"BOARD");if(ve(p)){let m=p.value.id,f=le(m).length,g=3,h=Math.floor(e/g),x=Math.floor(e/Math.max(f,1));e=Math.min(x,h)*Math.max(f,g)}return Te.createElement(Jn,{flexDirection:"column"},Te.createElement(aI,{autoSync:o}),Te.createElement(dI,null),Te.createElement(Jn,{flexDirection:"column"},Te.createElement(Oi,{filters:s}),Te.createElement(iI,{width:e,height:t,contextNode:n.contextNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:r??"dense",mode:n.mode})),Te.createElement(ki,{width:e,mode:n.mode,availableHints:n.availableHints}))}import mP from"readline";var sc,ic,kn,pP=new Set([E.MoveCursorLeft,E.EraseInputWord,E.MoveCursorLeftOfWord,E.MoveCursorRight,E.MoveCursorRightOfWord,E.NavToPreviousContainer,E.NavToNextContainer,E.NavPreviousItem,E.NavNextItem,E.NavPreviousItemJump,E.NavNextItemJump,E.SetViewDense,E.SetViewWide,E.Confirm,E.Exit,E.Yank,E.InitCommandLine,E.InitCommandPalette,E.ExitCommandLine,E.CaptureInput,E.EraseInput,E.EraseInputWord,E.HideHelp,E.ViewHelp,E.SetViewDense,E.SetViewWide,E.GetLastCommandFromHistory,E.GetNextCommandFromHistory,E.AutoCompleteCommand]),fP=new Set([E.NavPreviousItem,E.NavNextItem,E.NavPreviousItemJump,E.NavNextItemJump,E.NavToPreviousContainer,E.NavToNextContainer,E.Confirm,E.Exit,E.InitCommandPalette,E.InitMove,E.MoveNextItem,E.MovePreviousItem,E.MoveNextItemJump,E.MovePreviousItemJump,E.MoveToNextContainer,E.MoveToPreviousContainer,E.Delete,E.AddItem,E.EditTitle,E.EditDescription,E.ConfirmMove,E.Edit,E.ViewHelp,E.Yank]),uI=async e=>{if(e.ctrl&&e.name==="c")return $.exit();let{actionIndex:t,mode:n,readOnly:o,timeMode:r}=v(),s=Ff(e,n);if(!s||o&&!pP.has(s)||r==="replay"&&n===I.DEFAULT&&fP.has(s))return;let i=t[n]?.[s];if(i?.action)try{await i.action(i,e)}catch(c){logger.error(c)}},gP=()=>async function(t,n){n.name!=="escape"&&(kn&&(clearTimeout(kn),kn=void 0),await uI(n))},hP=()=>async function(t){if(t.length===1&&t[0]===27){kn&&clearTimeout(kn),kn=setTimeout(()=>{uI({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),kn=void 0},25);return}kn&&(clearTimeout(kn),kn=void 0)};function mI(){sc&&process.stdin.removeListener("keypress",sc),ic&&process.stdin.removeListener("data",ic),sc=gP(),ic=hP(),mP.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",ic),process.stdin.on("keypress",sc)}async function pI(){try{let e=dr({});if(a(e))return an(0,e.message);let t=ht();ve(t)&&je(t.value);let n=oe(process.cwd());je({gitEmail:await Ml(process.cwd()),gitName:await Co(process.cwd())});let o=ve(n)?await pl(n.value):qy();if(a(o))return o;let r=Mm();return a(r)?an(6,r.message):(mI(),ve(n)&&fl(n.value),u("Booted Epiq",void 0))}catch(e){return an(0,Pr(e))}}My();var xP=`${$t.bold("Epiq CLI")}
|
|
106
106
|
|
|
107
|
-
${
|
|
108
|
-
${
|
|
107
|
+
${$t.dim("Boot in directory:")}
|
|
108
|
+
${$t.cyan("$ epiq")}
|
|
109
109
|
|
|
110
|
-
${
|
|
111
|
-
${
|
|
110
|
+
${$t.dim("Launch GUI:")}
|
|
111
|
+
${$t.cyan("$ epiq gui")}
|
|
112
|
+
${$t.cyan("$ epiq gui --no-open")} ${$t.dim("no browser")}
|
|
112
113
|
|
|
113
|
-
${
|
|
114
|
-
${
|
|
115
|
-
`,
|
|
116
|
-
${e.message}`)),process.exitCode=1)}else{console.clear();let e=await
|
|
114
|
+
${$t.dim("Act as somebody other than the configured user:")}
|
|
115
|
+
${$t.cyan("$ epiq --as claude")}
|
|
116
|
+
`,cc=vP(xP,{importMeta:import.meta,version:kt,flags:{init:{type:"boolean",default:!1},as:{type:"string"},open:{type:"boolean",default:!0}}}),ac=cc.input[0];ac&&ac!=="gui"&&(console.error($t.red(`Unknown command: ${ac}`)),process.exit(1));if(cc.flags.as!==void 0){let e=pc(cc.flags.as,"--as");a(e)&&(console.error($t.red(e.message)),process.exit(1))}var fI=process.stdout.columns||120,gI=process.stdout.rows||20,lc=null,IP=e=>{try{return lc?(lc.rerender(e),u("Rerendered app",void 0)):(lc=yP(e),u("Rendered app",void 0))}catch(t){return l(`Unable to render app: ${Pr(t)}`)}},Mm=()=>IP(bP.createElement(Tm,{width:fI,height:gI}));process.stdout.on("resize",()=>{if(fI=process.stdout.columns||120,gI=process.stdout.rows||20,!lc)return;let e=Mm();a(e)&&logger.info(`[boot:resize] ${e.message}`)});if(ac==="gui"){let e=await gx({repoRoot:process.cwd(),open:cc.flags.open});a(e)&&(console.error($t.red(`Failed to start Epiq GUI:
|
|
117
|
+
${e.message}`)),process.exitCode=1)}else{console.clear();let e=await pI();a(e)&&(logger.info(e.message),console.error($t.red(`Failed to boot Epiq:
|
|
117
118
|
${e.message}`)),process.exitCode=1)}export{Mm as renderApp};
|